aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoremancebo <emancebo@cyngn.com>2015-10-23 18:15:54 -0700
committerZhao Wei Liew <zhaoweiliew@gmail.com>2016-10-26 00:55:33 -0700
commit7fd6ba8abd16832cad15343199b0e53c68d39091 (patch)
treea6fc9f0058071f964e54013295d45e11d42b749b
parentbd70b8a02c25c9721bc6f70486b51b8d78187101 (diff)
downloadandroid_packages_apps_CMFileManager-7fd6ba8abd16832cad15343199b0e53c68d39091.tar.gz
android_packages_apps_CMFileManager-7fd6ba8abd16832cad15343199b0e53c68d39091.tar.bz2
android_packages_apps_CMFileManager-7fd6ba8abd16832cad15343199b0e53c68d39091.zip
Fix rename of files ending with . on sdcard
If sdcard is formatted as VFAT, then file names named as "foo." will be silently saved as "foo". This causes us to report the wrong target file to media scanner, which can cause an extra file to be shown in MTP mode on Windows. The workaround is to rescan the parent dir to discover the correct filename to report to media scanner. Change-Id: Ia58a341ef6190efe3dca8b13bbc081b6e2d4e9c1 Issue-Id: QRDL-983
-rw-r--r--src/com/cyanogenmod/filemanager/util/CommandHelper.java40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/com/cyanogenmod/filemanager/util/CommandHelper.java b/src/com/cyanogenmod/filemanager/util/CommandHelper.java
index 85808daf..abb45ce8 100644
--- a/src/com/cyanogenmod/filemanager/util/CommandHelper.java
+++ b/src/com/cyanogenmod/filemanager/util/CommandHelper.java
@@ -792,6 +792,22 @@ public final class CommandHelper {
return result;
}
+ private static void recursiveScan(@NonNull final Context context,
+ @Nullable String srcPath,
+ @NonNull String destPath) {
+ recursiveScan(context, srcPath, destPath, -1);
+ }
+
+ private static class FileSystemObjectWithDepth {
+ public FileSystemObject fso;
+ public int depth;
+
+ public FileSystemObjectWithDepth(FileSystemObject fso, int depth) {
+ this.fso = fso;
+ this.depth = depth;
+ }
+ }
+
/**
*
* @param context
@@ -800,17 +816,19 @@ public final class CommandHelper {
*/
private static void recursiveScan(@NonNull final Context context,
@Nullable String srcPath,
- @NonNull String destPath) {
+ @NonNull String destPath,
+ int maxDepth) {
ArrayList<String> paths = new ArrayList<>();
- Stack<FileSystemObject> pathsToScan = new Stack<>();
+ Stack<FileSystemObjectWithDepth> pathsToScan = new Stack<>();
try {
FileSystemObject fso = getFileInfo(context, destPath, null);
if (fso == null) {
return;
}
- pathsToScan.push(fso);
+ pathsToScan.push(new FileSystemObjectWithDepth(fso, 0));
while (!pathsToScan.isEmpty()) {
- fso = pathsToScan.pop();
+ FileSystemObjectWithDepth fsowd = pathsToScan.pop();
+ fso = fsowd.fso;
if (srcPath != null) {
String src = fso.getFullPath().replace(destPath, srcPath);
// Add the path to be deleted
@@ -818,7 +836,7 @@ public final class CommandHelper {
}
// Add the path to be added
paths.add(MediaHelper.normalizeMediaPath(fso.getFullPath()));
- if (fso instanceof Directory) {
+ if (fso instanceof Directory && (maxDepth == -1 || fsowd.depth < maxDepth)) {
try {
List<FileSystemObject> files =
CommandHelper.listFiles(context, fso.getFullPath(), null);
@@ -830,7 +848,7 @@ public final class CommandHelper {
if (file instanceof ParentDirectory) {
continue;
}
- pathsToScan.push(file);
+ pathsToScan.push(new FileSystemObjectWithDepth(file, fsowd.depth + 1));
}
} catch (IOException
| ConsoleAllocException
@@ -939,7 +957,15 @@ public final class CommandHelper {
File parent = new File(dst).getParentFile();
if ((parent != null && !VirtualMountPointConsole.isVirtualStorageResource(parent
.getAbsolutePath()))) {
- recursiveScan(context, src, dst);
+ // Scan source
+ MediaScannerConnection.scanFile(context, new String[] {
+ MediaHelper.normalizeMediaPath(src) }, null, null);
+
+ // Recursive scan of the parent dir of the dest. This mitigates a VFAT
+ // issue where a file named "foo." will silently be renamed as "foo".
+ // This ensures that we report the correct filename to the media scanner
+ // by re-reading the filename from the file system.
+ recursiveScan(context, null, parent.getAbsolutePath(), 1);
}
}