Loading core/java/android/provider/MediaStore.java +8 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,14 @@ public final class MediaStore { */ public static final String ACTION_MTP_SESSION_END = "android.provider.action.MTP_SESSION_END"; /** * The method name used by the media scanner and mtp to tell the media provider to * rescan and reclassify that have become unhidden because of renaming folders or * removing nomedia files * @hide */ public static final String UNHIDE_CALL = "unhide"; /** * Activity Action: Launch a music player. * The activity should be able to play, browse, or manipulate music files stored on the device. Loading media/java/android/media/MediaScanner.java +22 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.SystemProperties; import android.provider.MediaStore; import android.provider.MediaStore.Files.FileColumns; import android.provider.Settings; import android.provider.MediaStore.Audio; import android.provider.MediaStore.Files; Loading @@ -58,6 +59,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Locale; /** * Internal service helper that no-one should use directly. Loading Loading @@ -946,6 +948,22 @@ public class MediaScanner // path should never change, and we want to avoid replacing mixed cased paths // with squashed lower case paths values.remove(MediaStore.MediaColumns.DATA); int mediaType = 0; if (!MediaScanner.isNoMediaPath(entry.mPath)) { int fileType = MediaFile.getFileTypeForMimeType(mMimeType); if (MediaFile.isAudioFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_AUDIO; } else if (MediaFile.isVideoFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_VIDEO; } else if (MediaFile.isImageFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_IMAGE; } else if (MediaFile.isPlayListFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_PLAYLIST; } values.put(FileColumns.MEDIA_TYPE, mediaType); } mMediaProvider.update(result, values, null, null); } Loading Loading @@ -1180,6 +1198,10 @@ public class MediaScanner mMediaProvider.delete(ContentUris.withAppendedId(mFilesUri, entry.mRowId), null, null); iterator.remove(); if (entry.mPath.toLowerCase(Locale.US).endsWith("/.nomedia")) { File f = new File(path); mMediaProvider.call(MediaStore.UNHIDE_CALL, f.getParent(), null); } } } } Loading media/java/android/mtp/MtpDatabase.java +32 −0 Original line number Diff line number Diff line Loading @@ -752,6 +752,29 @@ public class MtpDatabase { return MtpConstants.RESPONSE_GENERAL_ERROR; } // check if nomedia status changed if (newFile.isDirectory()) { // for directories, check if renamed from something hidden to something non-hidden if (oldFile.getName().startsWith(".") && !newPath.startsWith(".")) { // directory was unhidden try { mMediaProvider.call(MediaStore.UNHIDE_CALL, newPath, null); } catch (RemoteException e) { Log.e(TAG, "failed to unhide/rescan for " + newPath); } } } else { // for files, check if renamed from .nomedia to something else if (oldFile.getName().toLowerCase(Locale.US).equals(".nomedia") && !newPath.toLowerCase(Locale.US).equals(".nomedia")) { try { mMediaProvider.call(MediaStore.UNHIDE_CALL, oldFile.getParent(), null); } catch (RemoteException e) { Log.e(TAG, "failed to unhide/rescan for " + newPath); } } } return MtpConstants.RESPONSE_OK; } Loading Loading @@ -915,6 +938,15 @@ public class MtpDatabase { Uri uri = Files.getMtpObjectsUri(mVolumeName, handle); if (mMediaProvider.delete(uri, null, null) > 0) { if (format != MtpConstants.FORMAT_ASSOCIATION && path.toLowerCase(Locale.US).endsWith("/.nomedia")) { try { String parentPath = path.substring(0, path.lastIndexOf("/")); mMediaProvider.call(MediaStore.UNHIDE_CALL, parentPath, null); } catch (RemoteException e) { Log.e(TAG, "failed to unhide/rescan for " + path); } } return MtpConstants.RESPONSE_OK; } else { return MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE; Loading Loading
core/java/android/provider/MediaStore.java +8 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,14 @@ public final class MediaStore { */ public static final String ACTION_MTP_SESSION_END = "android.provider.action.MTP_SESSION_END"; /** * The method name used by the media scanner and mtp to tell the media provider to * rescan and reclassify that have become unhidden because of renaming folders or * removing nomedia files * @hide */ public static final String UNHIDE_CALL = "unhide"; /** * Activity Action: Launch a music player. * The activity should be able to play, browse, or manipulate music files stored on the device. Loading
media/java/android/media/MediaScanner.java +22 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.SystemProperties; import android.provider.MediaStore; import android.provider.MediaStore.Files.FileColumns; import android.provider.Settings; import android.provider.MediaStore.Audio; import android.provider.MediaStore.Files; Loading @@ -58,6 +59,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Locale; /** * Internal service helper that no-one should use directly. Loading Loading @@ -946,6 +948,22 @@ public class MediaScanner // path should never change, and we want to avoid replacing mixed cased paths // with squashed lower case paths values.remove(MediaStore.MediaColumns.DATA); int mediaType = 0; if (!MediaScanner.isNoMediaPath(entry.mPath)) { int fileType = MediaFile.getFileTypeForMimeType(mMimeType); if (MediaFile.isAudioFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_AUDIO; } else if (MediaFile.isVideoFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_VIDEO; } else if (MediaFile.isImageFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_IMAGE; } else if (MediaFile.isPlayListFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_PLAYLIST; } values.put(FileColumns.MEDIA_TYPE, mediaType); } mMediaProvider.update(result, values, null, null); } Loading Loading @@ -1180,6 +1198,10 @@ public class MediaScanner mMediaProvider.delete(ContentUris.withAppendedId(mFilesUri, entry.mRowId), null, null); iterator.remove(); if (entry.mPath.toLowerCase(Locale.US).endsWith("/.nomedia")) { File f = new File(path); mMediaProvider.call(MediaStore.UNHIDE_CALL, f.getParent(), null); } } } } Loading
media/java/android/mtp/MtpDatabase.java +32 −0 Original line number Diff line number Diff line Loading @@ -752,6 +752,29 @@ public class MtpDatabase { return MtpConstants.RESPONSE_GENERAL_ERROR; } // check if nomedia status changed if (newFile.isDirectory()) { // for directories, check if renamed from something hidden to something non-hidden if (oldFile.getName().startsWith(".") && !newPath.startsWith(".")) { // directory was unhidden try { mMediaProvider.call(MediaStore.UNHIDE_CALL, newPath, null); } catch (RemoteException e) { Log.e(TAG, "failed to unhide/rescan for " + newPath); } } } else { // for files, check if renamed from .nomedia to something else if (oldFile.getName().toLowerCase(Locale.US).equals(".nomedia") && !newPath.toLowerCase(Locale.US).equals(".nomedia")) { try { mMediaProvider.call(MediaStore.UNHIDE_CALL, oldFile.getParent(), null); } catch (RemoteException e) { Log.e(TAG, "failed to unhide/rescan for " + newPath); } } } return MtpConstants.RESPONSE_OK; } Loading Loading @@ -915,6 +938,15 @@ public class MtpDatabase { Uri uri = Files.getMtpObjectsUri(mVolumeName, handle); if (mMediaProvider.delete(uri, null, null) > 0) { if (format != MtpConstants.FORMAT_ASSOCIATION && path.toLowerCase(Locale.US).endsWith("/.nomedia")) { try { String parentPath = path.substring(0, path.lastIndexOf("/")); mMediaProvider.call(MediaStore.UNHIDE_CALL, parentPath, null); } catch (RemoteException e) { Log.e(TAG, "failed to unhide/rescan for " + path); } } return MtpConstants.RESPONSE_OK; } else { return MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE; Loading