From 87a2f9f03c51fc513e079bb3eac03973d8d9d55e Mon Sep 17 00:00:00 2001 From: k3b <1374583+k3b@users.noreply.github.com> Date: Mon, 26 Apr 2021 19:55:50 +0200 Subject: [PATCH] #169: FileCache automatically Disabled, if there are saf-Write operations; Enabled on listFiles or listDirs --- .../k3b/android/androFotoFinder/Global.java | 6 +++-- .../de/k3b/android/io/AndroidFileFacade.java | 23 +++++++++++++++---- .../android/io/DocumentFileTranslator.java | 2 ++ .../java/de/k3b/io/filefacade/FileFacade.java | 3 ++- .../de/k3b/io/filefacade/FileWrapper.java | 3 ++- .../main/java/de/k3b/io/filefacade/IFile.java | 2 +- .../k3b/io/filefacade/StringFileFacade.java | 4 ++-- 7 files changed, 32 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/de/k3b/android/androFotoFinder/Global.java b/app/src/main/java/de/k3b/android/androFotoFinder/Global.java index d03ad17a..ef3d0c11 100644 --- a/app/src/main/java/de/k3b/android/androFotoFinder/Global.java +++ b/app/src/main/java/de/k3b/android/androFotoFinder/Global.java @@ -149,8 +149,10 @@ public static class Media { // Build.VERSION_CODES.??ANDROID10?? = 29 public static boolean useAo10MediaImageDbReplacement = isAndroid10OrAbove(); - // #169 Android SAF DocumentFile performance improvements fast but disabled because it is still error-prone - public final static boolean android_DocumentFile_find_cache = true; + // #169 Android SAF DocumentFile performance improvements fast find. + // automatically Disabled, if there are saf-Write operations + // automatically Enabled, if there are listFiles or listDirs + public static boolean android_DocumentFile_find_cache = true; /** * map with blue selection markers: how much to area to increase diff --git a/app/src/main/java/de/k3b/android/io/AndroidFileFacade.java b/app/src/main/java/de/k3b/android/io/AndroidFileFacade.java index c5ebbec6..e6a6b0d3 100644 --- a/app/src/main/java/de/k3b/android/io/AndroidFileFacade.java +++ b/app/src/main/java/de/k3b/android/io/AndroidFileFacade.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.List; +import de.k3b.android.androFotoFinder.Global; import de.k3b.android.widget.FilePermissionActivity; import de.k3b.io.Converter; import de.k3b.io.FileUtils; @@ -258,6 +259,7 @@ public boolean mkdirs() { @Override public IFile[] listFiles() { + reEnableCache(); final DocumentFile androidFile = getAndroidFile(false); if (androidFile != null) { return get(androidFile.listFiles()); @@ -265,7 +267,15 @@ public IFile[] listFiles() { return new IFile[0]; } + private void reEnableCache() { + if (!Global.android_DocumentFile_find_cache) { + Global.android_DocumentFile_find_cache = true; + invalidateParentDirCache(); + } + } + public IFile[] listDirs() { + reEnableCache(); List found = new ArrayList<>(); final DocumentFile androidFile = getAndroidFile(false); if (androidFile != null) { @@ -303,12 +313,15 @@ public OutputStream openOutputStream() throws FileNotFoundException { final DocumentFile documentFileParent = documentFileTranslator.getOrCreateDirectory(getFile().getParentFile()); androidFile = this.androidFile = documentFileParent.createFile(null, getFile().getName()); context = "openOutputStream create new "; - invalidateParentDirCache(); + } if (FileFacade.debugLogFacade) { Log.i(LOG_TAG, context + this); } - return documentFileTranslator.createOutputStream(androidFile); + OutputStream result = documentFileTranslator.createOutputStream(androidFile); + Global.android_DocumentFile_find_cache = false; + invalidateParentDirCache(); + return result; } @Override @@ -336,9 +349,11 @@ public InputStream openInputStream() throws FileNotFoundException { //------- file cache support for android @Override - public void invalidateParentDirCache() { - if (documentFileTranslator != null) + public IFile invalidateParentDirCache() { + if (documentFileTranslator != null) { documentFileTranslator.documentFileCache.invalidateParentDirCache(); + } + return this; } diff --git a/app/src/main/java/de/k3b/android/io/DocumentFileTranslator.java b/app/src/main/java/de/k3b/android/io/DocumentFileTranslator.java index b62ccd16..2b537f04 100644 --- a/app/src/main/java/de/k3b/android/io/DocumentFileTranslator.java +++ b/app/src/main/java/de/k3b/android/io/DocumentFileTranslator.java @@ -36,6 +36,7 @@ import java.util.HashMap; import java.util.Map; +import de.k3b.android.androFotoFinder.Global; import de.k3b.io.filefacade.FileFacade; /** @@ -231,6 +232,7 @@ public DocumentFile getOrCreateDirectory(File directory) { result = findFile(parent, directory, true); if (result == null) { + Global.android_DocumentFile_find_cache = false; result = parent.createDirectory(directory.getName()); add(directory, result); } diff --git a/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/FileFacade.java b/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/FileFacade.java index 954a06db..4bed03b3 100644 --- a/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/FileFacade.java +++ b/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/FileFacade.java @@ -330,6 +330,7 @@ protected void setFile(File file) { @Override - public void invalidateParentDirCache() { + public IFile invalidateParentDirCache() { + return this; } } diff --git a/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/FileWrapper.java b/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/FileWrapper.java index ca21ff92..f7e62476 100644 --- a/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/FileWrapper.java +++ b/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/FileWrapper.java @@ -178,8 +178,9 @@ public long length() { } @Override - public void invalidateParentDirCache() { + public IFile invalidateParentDirCache() { child.invalidateParentDirCache(); + return this; } @Override diff --git a/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/IFile.java b/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/IFile.java index 923340cc..f3a6fbef 100644 --- a/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/IFile.java +++ b/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/IFile.java @@ -95,5 +95,5 @@ public interface IFile { //------- file cache support // may be called after delete, renameTo, openOutputStream, mkdirs - void invalidateParentDirCache(); + IFile invalidateParentDirCache(); } diff --git a/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/StringFileFacade.java b/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/StringFileFacade.java index 503d9346..bb788c2d 100644 --- a/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/StringFileFacade.java +++ b/libK3bFilefacade/src/main/java/de/k3b/io/filefacade/StringFileFacade.java @@ -229,7 +229,7 @@ public long length() { } @Override - public void invalidateParentDirCache() { - + public IFile invalidateParentDirCache() { + return this; } }