diff options
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/com/android/internal/content/FileSystemProvider.java | 64 |
1 files changed, 21 insertions, 43 deletions
diff --git a/core/java/com/android/internal/content/FileSystemProvider.java b/core/java/com/android/internal/content/FileSystemProvider.java index 3b5fecfc600a..0ede1b86b524 100644 --- a/core/java/com/android/internal/content/FileSystemProvider.java +++ b/core/java/com/android/internal/content/FileSystemProvider.java @@ -20,15 +20,14 @@ import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ContentResolver; +import android.content.Context; import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.database.Cursor; -import android.database.DatabaseUtils; import android.database.MatrixCursor; import android.database.MatrixCursor.RowBuilder; import android.graphics.Point; import android.net.Uri; -import android.os.Binder; import android.os.Bundle; import android.os.CancellationSignal; import android.os.FileObserver; @@ -39,7 +38,6 @@ import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; import android.provider.DocumentsProvider; import android.provider.MediaStore; -import android.provider.MediaStore.Files.FileColumns; import android.provider.MetadataReader; import android.system.Int64Ref; import android.text.TextUtils; @@ -66,6 +64,7 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Predicate; @@ -271,8 +270,7 @@ public abstract class FileSystemProvider extends DocumentsProvider { throw new IllegalStateException("Failed to touch " + file + ": " + e); } } - MediaStore.scanFile(getContext().getContentResolver(), file); - + updateMediaStore(getContext(), file); return childId; } @@ -295,7 +293,9 @@ public abstract class FileSystemProvider extends DocumentsProvider { onDocIdChanged(afterDocId); final File afterVisibleFile = getFileForDocId(afterDocId, true); - moveInMediaStore(beforeVisibleFile, afterVisibleFile); + + updateMediaStore(getContext(), beforeVisibleFile); + updateMediaStore(getContext(), afterVisibleFile); if (!TextUtils.equals(docId, afterDocId)) { return afterDocId; @@ -323,17 +323,23 @@ public abstract class FileSystemProvider extends DocumentsProvider { onDocIdChanged(sourceDocumentId); onDocIdDeleted(sourceDocumentId); onDocIdChanged(docId); - moveInMediaStore(visibleFileBefore, getFileForDocId(docId, true)); - + // update the database + updateMediaStore(getContext(), visibleFileBefore); + updateMediaStore(getContext(), getFileForDocId(docId, true)); return docId; } - private void moveInMediaStore(@Nullable File oldVisibleFile, @Nullable File newVisibleFile) { - if (oldVisibleFile != null) { - MediaStore.scanFile(getContext().getContentResolver(), oldVisibleFile); - } - if (newVisibleFile != null) { - MediaStore.scanFile(getContext().getContentResolver(), newVisibleFile); + private static void updateMediaStore(@NonNull Context context, File file) { + if (file != null) { + final ContentResolver resolver = context.getContentResolver(); + final String noMedia = ".nomedia"; + // For file, check whether the file name is .nomedia or not. + // If yes, scan the parent directory to update all files in the directory. + if (!file.isDirectory() && file.getName().toLowerCase(Locale.ROOT).endsWith(noMedia)) { + MediaStore.scanFile(resolver, file.getParentFile()); + } else { + MediaStore.scanFile(resolver, file); + } } } @@ -354,35 +360,7 @@ public abstract class FileSystemProvider extends DocumentsProvider { onDocIdChanged(docId); onDocIdDeleted(docId); - removeFromMediaStore(visibleFile); - } - - private void removeFromMediaStore(@Nullable File visibleFile) - throws FileNotFoundException { - // visibleFolder is null if we're removing a document from external thumb drive or SD card. - if (visibleFile != null) { - final long token = Binder.clearCallingIdentity(); - - try { - final ContentResolver resolver = getContext().getContentResolver(); - final Uri externalUri = MediaStore.Files.getContentUri("external"); - final Bundle queryArgs = new Bundle(); - queryArgs.putInt(MediaStore.QUERY_ARG_MATCH_PENDING, MediaStore.MATCH_INCLUDE); - - // Remove the media store entry corresponding to visibleFile and if it is a - // directory, also remove media store entries for any files inside this directory. - // Logic borrowed from com.android.providers.media.scan.ModernMediaScanner. - final String pathEscapedForLike = DatabaseUtils.escapeForLike( - visibleFile.getAbsolutePath()); - ContentResolver.includeSqlSelectionArgs(queryArgs, - FileColumns.DATA + " LIKE ? ESCAPE '\\' OR " - + FileColumns.DATA + " LIKE ? ESCAPE '\\'", - new String[] {pathEscapedForLike + "/%", pathEscapedForLike}); - resolver.delete(externalUri, queryArgs); - } finally { - Binder.restoreCallingIdentity(token); - } - } + updateMediaStore(getContext(), visibleFile); } @Override |
