diff options
author | Jeff Sharkey <jsharkey@android.com> | 2019-12-16 14:10:53 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2019-12-16 14:10:56 -0700 |
commit | 8f5cdbb49b834ac2c4e3e34e70e38d419170b35c (patch) | |
tree | f07ffa1ee0637ad1788fd6447ed180580968a768 /media/java/android/mtp/MtpDatabase.java | |
parent | 7ba8ed19df18db3be70aaba9f7c085fc8ce4b9ea (diff) |
Disable support for object references.
MediaProvider has standardized on being an indexed view of files that
we discover on disk, so that we can always recover that indexed
information in case of user data wipe or corruption. This means
that MediaProvider no longer supports abstract "object references".
This doesn't prevent future MTP implementations from bringing back
object reference support, and the recommended path forward would
be to have MtpDatabase convert object references into playlist files
that are written to disk. MediaProvider will then gladly scan those
playlist files to be visible to users.
Shift to directly using the existing Files.getContentUri() API for
all MediaProvider interactions.
Bug: 137890034
Test: atest --test-mapping packages/providers/MediaProvider
Change-Id: I829027bb9fbcf5991c1ddee0aec04ad7e7b240cd
Diffstat (limited to 'media/java/android/mtp/MtpDatabase.java')
-rwxr-xr-x | media/java/android/mtp/MtpDatabase.java | 69 |
1 files changed, 5 insertions, 64 deletions
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 16ba63bf031b..0f402eb0bf42 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -577,7 +577,7 @@ public class MtpDatabase implements AutoCloseable { try { // note - we are relying on a special case in MediaProvider.update() to update // the paths for all children in the case where this is a directory. - final Uri objectsUri = MediaStore.Files.getMtpObjectsUri(obj.getVolumeName()); + final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName()); mMediaProvider.update(objectsUri, values, PATH_WHERE, whereArgs); } catch (RemoteException e) { Log.e(TAG, "RemoteException in mMediaProvider.update", e); @@ -658,7 +658,7 @@ public class MtpDatabase implements AutoCloseable { // Old parent exists in MediaProvider - perform a move // note - we are relying on a special case in MediaProvider.update() to update // the paths for all children in the case where this is a directory. - final Uri objectsUri = MediaStore.Files.getMtpObjectsUri(obj.getVolumeName()); + final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName()); mMediaProvider.update(objectsUri, values, PATH_WHERE, whereArgs); } else { // Old parent doesn't exist - add the object @@ -873,7 +873,7 @@ public class MtpDatabase implements AutoCloseable { } private int findInMedia(MtpStorageManager.MtpObject obj, Path path) { - final Uri objectsUri = MediaStore.Files.getMtpObjectsUri(obj.getVolumeName()); + final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName()); int ret = -1; Cursor c = null; @@ -893,7 +893,7 @@ public class MtpDatabase implements AutoCloseable { } private void deleteFromMedia(MtpStorageManager.MtpObject obj, Path path, boolean isDir) { - final Uri objectsUri = MediaStore.Files.getMtpObjectsUri(obj.getVolumeName()); + final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName()); try { // Delete the object(s) from MediaProvider, but ignore errors. if (isDir) { @@ -921,71 +921,12 @@ public class MtpDatabase implements AutoCloseable { @VisibleForNative private int[] getObjectReferences(int handle) { - MtpStorageManager.MtpObject obj = mManager.getObject(handle); - if (obj == null) - return null; - // Translate this handle to the MediaProvider Handle - handle = findInMedia(obj, obj.getPath()); - if (handle == -1) - return null; - Uri uri = Files.getMtpReferencesUri(obj.getVolumeName(), handle); - Cursor c = null; - try { - c = mMediaProvider.query(uri, PATH_PROJECTION, null, null, null, null); - if (c == null) { - return null; - } - ArrayList<Integer> result = new ArrayList<>(); - while (c.moveToNext()) { - // Translate result handles back into handles for this session. - String refPath = c.getString(0); - MtpStorageManager.MtpObject refObj = mManager.getByPath(refPath); - if (refObj != null) { - result.add(refObj.getId()); - } - } - return result.stream().mapToInt(Integer::intValue).toArray(); - } catch (RemoteException e) { - Log.e(TAG, "RemoteException in getObjectList", e); - } finally { - if (c != null) { - c.close(); - } - } return null; } @VisibleForNative private int setObjectReferences(int handle, int[] references) { - MtpStorageManager.MtpObject obj = mManager.getObject(handle); - if (obj == null) - return MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE; - // Translate this handle to the MediaProvider Handle - handle = findInMedia(obj, obj.getPath()); - if (handle == -1) - return MtpConstants.RESPONSE_GENERAL_ERROR; - Uri uri = Files.getMtpReferencesUri(obj.getVolumeName(), handle); - ArrayList<ContentValues> valuesList = new ArrayList<>(); - for (int id : references) { - // Translate each reference id to the MediaProvider Id - MtpStorageManager.MtpObject refObj = mManager.getObject(id); - if (refObj == null) - continue; - int refHandle = findInMedia(refObj, refObj.getPath()); - if (refHandle == -1) - continue; - ContentValues values = new ContentValues(); - values.put(Files.FileColumns._ID, refHandle); - valuesList.add(values); - } - try { - if (mMediaProvider.bulkInsert(uri, valuesList.toArray(new ContentValues[0])) > 0) { - return MtpConstants.RESPONSE_OK; - } - } catch (RemoteException e) { - Log.e(TAG, "RemoteException in setObjectReferences", e); - } - return MtpConstants.RESPONSE_GENERAL_ERROR; + return MtpConstants.RESPONSE_OPERATION_NOT_SUPPORTED; } @VisibleForNative |