Browse Source

Refs #40 trash files instead of deleting them

isundil 7 years ago
parent
commit
64ff43b63c

+ 4 - 0
app/src/main/java/info/knacki/pass/io/FileInterfaceFactory.java

@@ -57,6 +57,10 @@ public class FileInterfaceFactory {
     }
 
     protected static EncryptionMethodItem GetEncryptionMethod(File f) {
+        final String fName = f.getName();
+        if (PathUtils.IsHidden(f.getAbsolutePath())) {
+            PathUtils.UnHiddenPath(fName);
+        }
         for (EncryptionMethodItem i: fEncryptionMethods)
             if (f.getName().endsWith(i.fFileSuffix))
                 return i;

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

@@ -6,8 +6,11 @@ import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.logging.Logger;
 
 public class FileUtils {
+    private static final Logger log = Logger.getLogger(FileUtils.class.getName());
+
     public static void rmdir(File f) {
         if (!f.isDirectory()) {
             f.delete();
@@ -50,4 +53,24 @@ public class FileUtils {
             return in.substring(0, lastIndex);
         return in;
     }
+
+    public static void TrashFile(File f) {
+        if (PathUtils.IsHidden(f.getAbsolutePath())) {
+            if (!f.delete())
+                log.severe("Cannot remove file " +f.getAbsolutePath());
+        } else {
+            final String dest = PathUtils.HiddenPath(f.getAbsolutePath());
+
+            if (!f.renameTo(new File(dest)))
+                log.severe("Cannot rename file " +f.getAbsolutePath() +" to " +dest);
+        }
+    }
+
+    public static void RestoreFile(File f) {
+        if (PathUtils.IsHidden(f.getAbsolutePath())) {
+            final String dest = PathUtils.UnHiddenPath(f.getAbsolutePath());
+            if (!f.renameTo(new File(dest)))
+                log.severe("Cannot rename file " + f.getAbsolutePath() + " to " + dest);
+        }
+    }
 }

+ 14 - 0
app/src/main/java/info/knacki/pass/io/PathUtils.java

@@ -23,4 +23,18 @@ public class PathUtils {
     public static String GetFingerprintFile(Context ctx) {
         return GetAppRootDir(ctx) +"/" +DATA_FINGER_LOCAL;
     }
+
+    public static final String TRASH_SUFFIX = ".trash";
+
+    public static boolean IsHidden(String path) {
+        return path.endsWith(TRASH_SUFFIX);
+    }
+
+    public static String UnHiddenPath(String path) {
+        return IsHidden(path) ? path.substring(path.length() -TRASH_SUFFIX.length()) : path;
+    }
+
+    public static String HiddenPath(String path) {
+        return IsHidden(path) ? path : path +TRASH_SUFFIX;
+    }
 }

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

@@ -84,7 +84,7 @@ public class EncryptionInformationActivity extends AppCompatActivity {
                     .setTitle(R.string.are_you_sure)
                     .setView(new TextView(this).SetText(String.format(getString(R.string.about_to_rm_file), fEncrypted.getName())))
                     .setPositiveButton(R.string.ok, (dialogInterface, v) -> {
-                        fEncrypted.delete();
+                        FileUtils.TrashFile(fEncrypted);
                         EncryptionInformationActivity.this.finish();
                     })
                     .setNegativeButton(R.string.cancel, null)

+ 5 - 2
app/src/main/java/info/knacki/pass/ui/GitPullActivity.java

@@ -24,6 +24,7 @@ import info.knacki.pass.git.GitLocal;
 import info.knacki.pass.git.GitSha1;
 import info.knacki.pass.git.entities.GitCommit;
 import info.knacki.pass.git.entities.GitObject;
+import info.knacki.pass.io.FileUtils;
 import info.knacki.pass.io.OnResponseListener;
 import info.knacki.pass.io.OnStreamResponseListener;
 import info.knacki.pass.io.PathUtils;
@@ -141,7 +142,9 @@ public class GitPullActivity extends AppCompatActivity {
     int CheckNewFiles(GitLocal localVersion, File root, String rootPath, Set<String> filesToPull, Set<String> filesToPush, Set<String> conflicts) {
         int newFiles = 0;
         for (final File i: root.listFiles()) {
-            if (i.isDirectory()) {
+            if (PathUtils.IsHidden(i.getAbsolutePath())) {
+                continue;
+            } else if (i.isDirectory()) {
                 newFiles += CheckNewFiles(localVersion, i, rootPath +"/" +i.getName(), filesToPull, filesToPush, conflicts);
             } else if (i.isFile()){
                 String path = rootPath +"/" +i.getName();
@@ -298,7 +301,7 @@ public class GitPullActivity extends AppCompatActivity {
             if (files.peek().getValue() == null) {
                 // remove file
                 String filename = files.pop().getKey();
-                new File(PathUtils.GetPassDir(this) +filename).delete();
+                FileUtils.TrashFile(new File(PathUtils.GetPassDir(this) +filename));
                 localCache.remove(filename);
                 DownloadNext(files, localCache, downloader, resp);
                 log.info("Removed file " +filename);

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

@@ -120,7 +120,7 @@ public class MainActivity extends AppCompatActivity implements PasswordEditListe
         setContentView(R.layout.activity_pass_list);
 
         setTitle(R.string.title);
-        fPasswordListView = new EditablePasswordListView<>(this, PathUtils.GetPassDir(this));
+        fPasswordListView = new EditablePasswordListView<>(this, PathUtils.GetPassDir(this), false);
         ((ScrollView)findViewById(R.id.passwordListContainer)).addView(fPasswordListView);
 
         requestPermissions();
@@ -219,7 +219,7 @@ public class MainActivity extends AppCompatActivity implements PasswordEditListe
                 .setTitle(R.string.are_you_sure)
                 .setView(new TextView(this).SetText(String.format(getString(R.string.about_to_rm_file), f.getName())))
                 .setPositiveButton(R.string.ok, (dialogInterface, view) -> {
-                    f.delete();
+                    FileUtils.TrashFile(f);
                     fPasswordListView.refresh();
                 })
                 .setNegativeButton(R.string.cancel, null)

+ 14 - 1
app/src/main/java/info/knacki/pass/ui/passwordList/EditablePasswordListView.java

@@ -7,12 +7,25 @@ import android.widget.PopupMenu;
 import java.io.File;
 
 import info.knacki.pass.R;
+import info.knacki.pass.io.PathUtils;
 
 public class EditablePasswordListView<T extends Activity & PasswordEditListener> extends PasswordListView<T> implements PopupMenu.OnMenuItemClickListener  {
     private PasswordView fSelectedPassword;
+    private boolean fDisplayHiddenFiles;
 
-    public EditablePasswordListView(T ctx, String rootPath) {
+    public EditablePasswordListView(T ctx, String rootPath, boolean displayHidden) {
         super(ctx, rootPath);
+        fDisplayHiddenFiles = displayHidden;
+    }
+
+    public void SetDisplayHiddenFiles(boolean displayHidden) {
+        fDisplayHiddenFiles = displayHidden;
+        refresh();
+    }
+
+    @Override
+    protected boolean IsHidden(File f) {
+        return (PathUtils.IsHidden(f.getAbsolutePath()) != fDisplayHiddenFiles);
     }
 
     protected void AddContextMenu(final FileIdentity file, final PasswordView pv) {

+ 8 - 0
app/src/main/java/info/knacki/pass/ui/passwordList/PasswordListView.java

@@ -8,6 +8,8 @@ import java.io.File;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
+import info.knacki.pass.io.PathUtils;
+
 public class PasswordListView<T extends Context & PasswordClickListener> extends LinearLayout {
     public final String fRootPath;
     public String fCurrentDir;
@@ -75,11 +77,17 @@ public class PasswordListView<T extends Context & PasswordClickListener> extends
         DisplayDir(rootDir);
     }
 
+    protected boolean IsHidden(File f) {
+        return PathUtils.IsHidden(f.getAbsolutePath());
+    }
+
     protected Boolean IsAccessGranted(File f) {
         if ((f.getName().charAt(0) == '.') && !f.getName().equals("..")) {
             return false;
         } else if (fRootPath.equals(f.getAbsolutePath())) {
             return false;
+        } else if (IsHidden(f)) {
+            return false;
         }
         return f.getAbsolutePath().startsWith(fRootPath);
     }