OSDN Git Service

Clean stale entries when deleting files.
authorJeff Sharkey <jsharkey@android.com>
Fri, 25 Sep 2015 01:15:13 +0000 (18:15 -0700)
committerJeff Sharkey <jsharkey@android.com>
Fri, 25 Sep 2015 17:30:07 +0000 (10:30 -0700)
When deleting files directly from external storage devices, remove
any matching entries from MediaStore so we don't end up showing
stale entries to clients, such as MTP/PTP.

Also handles the case where an entire directory is deleted.

Bug: 24045921
Change-Id: I802470fa1aa03e0bec147ea113f1a49e26a0f3f9

packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java

index 393771a..18335b6 100644 (file)
@@ -38,6 +38,7 @@ import android.provider.DocumentsContract;
 import android.provider.DocumentsContract.Document;
 import android.provider.DocumentsContract.Root;
 import android.provider.DocumentsProvider;
+import android.provider.MediaStore;
 import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.DebugUtils;
@@ -380,12 +381,31 @@ public class ExternalStorageProvider extends DocumentsProvider {
     @Override
     public void deleteDocument(String docId) throws FileNotFoundException {
         final File file = getFileForDocId(docId);
-        if (file.isDirectory()) {
+        final boolean isDirectory = file.isDirectory();
+        if (isDirectory) {
             FileUtils.deleteContents(file);
         }
         if (!file.delete()) {
             throw new IllegalStateException("Failed to delete " + file);
         }
+
+        final ContentResolver resolver = getContext().getContentResolver();
+        final Uri externalUri = MediaStore.Files.getContentUri("external");
+
+        // Remove media store entries for any files inside this directory, using
+        // path prefix match. Logic borrowed from MtpDatabase.
+        if (isDirectory) {
+            final String path = file.getAbsolutePath() + "/";
+            resolver.delete(externalUri,
+                    "_data LIKE ?1 AND lower(substr(_data,1,?2))=lower(?3)",
+                    new String[] { path + "%", Integer.toString(path.length()), path });
+        }
+
+        // Remove media store entry for this exact file.
+        final String path = file.getAbsolutePath();
+        resolver.delete(externalUri,
+                "_data LIKE ?1 AND lower(_data)=lower(?2)",
+                new String[] { path, path });
     }
 
     @Override