Browse Source

Fixes #6 reviewed contextual menu

isundil 7 years ago
parent
commit
d4eb0d9319

+ 16 - 0
app/src/main/java/info/knacki/pass/io/FileUtils.java

@@ -0,0 +1,16 @@
+package info.knacki.pass.io;
+
+import java.io.File;
+
+public class FileUtils {
+    public static void rmdir(File f) {
+        if (!f.isDirectory()) {
+            f.delete();
+        }
+        else {
+            for (File i : f.listFiles())
+                rmdir(i);
+            f.delete();
+        }
+    }
+}

+ 2 - 12
app/src/main/java/info/knacki/pass/settings/ui/SettingsActivity.java

@@ -29,6 +29,7 @@ import info.knacki.pass.R;
 import info.knacki.pass.git.GitInterface;
 import info.knacki.pass.git.GitInterfaceFactory;
 import info.knacki.pass.git.entities.GitRef;
+import info.knacki.pass.io.FileUtils;
 import info.knacki.pass.io.PathUtils;
 import info.knacki.pass.settings.SettingsManager;
 import info.knacki.pass.ui.alertPrompt.AlertPrompt;
@@ -116,17 +117,6 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
                 || GPGPreferenceFragment.class.getName().equals(fragmentName);
     }
 
-    static void rmdir(File f) {
-        if (!f.isDirectory()) {
-            f.delete();
-        }
-        else {
-            for (File i : f.listFiles())
-                rmdir(i);
-            f.delete();
-        }
-    }
-
     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
     public static class GeneralPreferenceFragment extends PreferenceFragment {
         @Override
@@ -155,7 +145,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
                                 public void onClick(DialogInterface dialogInterface, View view) {
                                     new File(PathUtils.GetGitFile(getActivity())).delete();
                                     File f = new File(PathUtils.GetPassDir(getActivity()));
-                                    rmdir(f);
+                                    FileUtils.rmdir(f);
                                     f.mkdir();
                                 }
                             })

+ 32 - 0
app/src/main/java/info/knacki/pass/ui/MainActivity.java

@@ -24,6 +24,7 @@ import info.knacki.pass.generator.PasswordGenerator;
 import info.knacki.pass.generator.ui.PasswordGeneratorWizard;
 import info.knacki.pass.git.GitInterface;
 import info.knacki.pass.io.FileInterfaceFactory;
+import info.knacki.pass.io.FileUtils;
 import info.knacki.pass.io.IFileInterface;
 import info.knacki.pass.io.PathUtils;
 import info.knacki.pass.settings.SettingsManager;
@@ -31,6 +32,7 @@ import info.knacki.pass.settings.ui.SettingsActivity;
 import info.knacki.pass.ui.alertPrompt.AlertPrompt;
 import info.knacki.pass.ui.alertPrompt.views.SimpleTextEdit;
 import info.knacki.pass.ui.alertPrompt.views.TextEditAndCheckbox;
+import info.knacki.pass.ui.alertPrompt.views.TextView;
 import info.knacki.pass.ui.passwordList.EditablePasswordListView;
 import info.knacki.pass.ui.passwordList.PasswordEditListener;
 
@@ -228,6 +230,36 @@ public class MainActivity extends AppCompatActivity implements PasswordEditListe
         vPasswordListView.refresh();
     }
 
+    private void DoRemoveDir(File f) {
+        FileUtils.rmdir(f);
+        vPasswordListView.refresh();
+    }
+
+    @Override
+    public void OnRemoveDirectory(final File f) {
+        if (f.listFiles().length > 0) {
+            new AlertPrompt(this)
+                    .setTitle(R.string.are_you_sure)
+                    .setView(new TextView(this)
+                            .SetText(R.string.about_to_rm_directory))
+                    .setPositiveButton(R.string.ok, new AlertPrompt.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialogInterface, View view) {
+                            DoRemoveDir(f);
+                        }
+                    })
+                    .setNegativeButton(R.string.cancel, new AlertPrompt.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialogInterface, View view) {
+                        }
+                    })
+                    .show();
+
+        } else {
+            DoRemoveDir(f);
+        }
+    }
+
     @Override
     public void OnCopyToClipboard(File f) {
         FileInterfaceFactory.GetFileInterface(this, new PasswordPicker(this), f).ReadFile(new GitInterface.OnResponseListener<String>() {

+ 1 - 1
app/src/main/java/info/knacki/pass/ui/alertPrompt/AlertPrompt.java

@@ -22,7 +22,7 @@ public class AlertPrompt {
         public void onClick(DialogInterface dialog, int which) {
             fListener.onClick(dialog, fView);
         }
-        
+
         @Override
         public void onCancel(DialogInterface dialog) {
             fListener.onClick(dialog, fView);

+ 15 - 5
app/src/main/java/info/knacki/pass/ui/passwordList/EditablePasswordListView.java

@@ -16,20 +16,26 @@ public class EditablePasswordListView<T extends Activity & PasswordEditListener>
         super(ctx, rootPath);
     }
 
-    @Override
-    protected PasswordView CreateView(PasswordListView<T>.FileIdent file) {
-        final PasswordView pv = super.CreateView(file);
+    protected void AddContextMenu(final FileIdent file, final PasswordView pv) {
+        if (file.isParent())
+            return;
         pv.setOnLongClickListener(new OnLongClickListener() {
             @Override
             public boolean onLongClick(View v) {
                 fSelectedPassword = pv;
                 PopupMenu menu = new PopupMenu(fClickListener, pv);
-                menu.getMenuInflater().inflate(R.menu.context_menu, menu.getMenu());
+                menu.getMenuInflater().inflate(file.fIsDir ? R.menu.context_dir_menu : R.menu.context_file_menu, menu.getMenu());
                 menu.setOnMenuItemClickListener(EditablePasswordListView.this);
                 menu.show();
                 return true;
             }
         });
+    }
+
+    @Override
+    protected PasswordView CreateView(PasswordListView<T>.FileIdent file) {
+        final PasswordView pv = super.CreateView(file);
+        AddContextMenu(file, pv);
         return pv;
     }
 
@@ -39,7 +45,11 @@ public class EditablePasswordListView<T extends Activity & PasswordEditListener>
 
         switch (item.getItemId()) {
             case R.id.remove:
-                fClickListener.OnRemovePassword(new File(fCurrentDir +"/" +fSelectedPassword.fFullname));
+                if (fSelectedPassword.IsDir()) {
+                    fClickListener.OnRemoveDirectory(new File(fCurrentDir + "/" + fSelectedPassword.fFullname));
+                } else {
+                    fClickListener.OnRemovePassword(new File(fCurrentDir + "/" + fSelectedPassword.fFullname));
+                }
                 found = true;
                 break;
 

+ 1 - 0
app/src/main/java/info/knacki/pass/ui/passwordList/PasswordEditListener.java

@@ -4,5 +4,6 @@ import java.io.File;
 
 public interface PasswordEditListener extends PasswordClickListener {
     void OnRemovePassword(File f);
+    void OnRemoveDirectory(File f);
     void OnCopyToClipboard(File f);
 }

+ 6 - 0
app/src/main/java/info/knacki/pass/ui/passwordList/PasswordView.java

@@ -12,6 +12,7 @@ public class PasswordView extends LinearLayout {
     public final static int ICON_SIZE = 128;
     protected final ImageView vIcon;
     protected final TextView vName;
+    protected final int fType;
     protected final String fFullname;
 
     public static final int TYPE_DIR = 1;
@@ -29,6 +30,7 @@ public class PasswordView extends LinearLayout {
         super(ctx);
         fFullname = name;
         vIcon = new ImageView(ctx);
+        fType = type;
         if ((type & TYPE_PARENT) != 0)
             vIcon.setImageResource(android.R.drawable.ic_media_previous);
         else if ((type & TYPE_DIR) != 0)
@@ -45,4 +47,8 @@ public class PasswordView extends LinearLayout {
         addView(vName);
         setClickable(true);
     }
+
+    public boolean IsDir() {
+        return (fType & TYPE_DIR) != 0;
+    }
 }

+ 0 - 1
app/src/main/res/menu/context_menu.xml → app/src/main/res/menu/context_dir_menu.xml

@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:id="@+id/remove" android:title="@string/remove"></item>
-    <item android:id="@+id/clipboard" android:title="@string/copy_clipboard"></item>
 </menu>

+ 5 - 0
app/src/main/res/menu/context_file_menu.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+<item android:id="@+id/remove" android:title="@string/remove"></item>
+<item android:id="@+id/clipboard" android:title="@string/copy_clipboard"></item>
+</menu>

+ 1 - 0
app/src/main/res/values-fr/lang.xml

@@ -60,6 +60,7 @@
     <string name="pref_title_remove_all">Supprimer toutes les données</string>
     <string name="are_you_sure">Êtes-vous sur.e ?</string>
     <string name="about_to_rm_root_star">Vous allez supprimer tout les mots de passes sauvegardés</string>
+    <string name="about_to_rm_directory">Vous allez supprimer tout les mots de passes dans le dossier</string>
     <string name="conflictingFiles">Résolution des conflits</string>
     <string name="useMine">Utiliser ma version</string>
     <string name="useTheir">Utiliser leur version</string>

+ 1 - 0
app/src/main/res/values/lang.xml

@@ -60,6 +60,7 @@
     <string name="pref_title_remove_all">Remove all data</string>
     <string name="are_you_sure">Are you sure ?</string>
     <string name="about_to_rm_root_star">You are about to remove all password from the password store</string>
+    <string name="about_to_rm_directory">You are about to remove all password from this folder</string>
     <string name="conflictingFiles">Solve conflicts</string>
     <string name="useMine">Use mine</string>
     <string name="useTheir">Use their</string>