From 2c0b485dd056da2d41841bb58488942ea413739d Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 15 Feb 2019 15:53:47 -0700 Subject: Replace ContentInterface with wrapping. After much discussion, we can't safely introduce ContentInterface, so instead offer ContentResolver.wrap() methods. Bug: 120974438 Test: manual Exempted-From-Owner-Approval: mechanical API refactoring Change-Id: I71c7c997383dfaff6752e2a83967d456ab3a2aa1 --- src/com/android/documentsui/CreateDirectoryFragment.java | 4 +++- src/com/android/documentsui/DocumentsAccess.java | 7 +++++-- src/com/android/documentsui/Metrics.java | 4 +++- src/com/android/documentsui/ThumbnailLoader.java | 5 ++++- src/com/android/documentsui/files/ActionHandler.java | 4 +++- src/com/android/documentsui/services/CopyJob.java | 7 ++++--- src/com/android/documentsui/services/Job.java | 7 +++++-- src/com/android/documentsui/services/MoveJob.java | 4 +++- src/com/android/documentsui/sidebar/EjectRootTask.java | 4 +++- tests/common/com/android/documentsui/DocumentsProviderHelper.java | 3 ++- .../com/android/documentsui/archives/ArchivesProviderTest.java | 4 +++- 11 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/com/android/documentsui/CreateDirectoryFragment.java b/src/com/android/documentsui/CreateDirectoryFragment.java index 606678d89..0c28f543d 100644 --- a/src/com/android/documentsui/CreateDirectoryFragment.java +++ b/src/com/android/documentsui/CreateDirectoryFragment.java @@ -16,6 +16,8 @@ package com.android.documentsui; +import static android.content.ContentResolver.wrap; + import static com.android.documentsui.base.SharedMinimal.TAG; import android.app.Dialog; @@ -147,7 +149,7 @@ public class CreateDirectoryFragment extends DialogFragment { client = DocumentsApplication.acquireUnstableProviderOrThrow( resolver, mCwd.derivedUri.getAuthority()); final Uri childUri = DocumentsContract.createDocument( - client, mCwd.derivedUri, Document.MIME_TYPE_DIR, mDisplayName); + wrap(client), mCwd.derivedUri, Document.MIME_TYPE_DIR, mDisplayName); DocumentInfo doc = DocumentInfo.fromUri(resolver, childUri); return doc.isDirectory() ? doc : null; } catch (Exception e) { diff --git a/src/com/android/documentsui/DocumentsAccess.java b/src/com/android/documentsui/DocumentsAccess.java index a0f3b2ddd..3028f1b67 100644 --- a/src/com/android/documentsui/DocumentsAccess.java +++ b/src/com/android/documentsui/DocumentsAccess.java @@ -17,6 +17,9 @@ package com.android.documentsui; import androidx.annotation.Nullable; + +import static android.content.ContentResolver.wrap; + import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.Context; @@ -124,7 +127,7 @@ public interface DocumentsAccess { final ContentResolver resolver = mContext.getContentResolver(); try (final ContentProviderClient client = DocumentsApplication .acquireUnstableProviderOrThrow(resolver, docUri.getAuthority())) { - return DocumentsContract.findDocumentPath(client, docUri); + return DocumentsContract.findDocumentPath(wrap(client), docUri); } } @@ -134,7 +137,7 @@ public interface DocumentsAccess { try (ContentProviderClient client = DocumentsApplication.acquireUnstableProviderOrThrow( resolver, parentDoc.derivedUri.getAuthority())) { return DocumentsContract.createDocument( - client, parentDoc.derivedUri, mimeType, displayName); + wrap(client), parentDoc.derivedUri, mimeType, displayName); } catch (Exception e) { Log.w(TAG, "Failed to create document", e); return null; diff --git a/src/com/android/documentsui/Metrics.java b/src/com/android/documentsui/Metrics.java index d3a766375..5737fcbfc 100644 --- a/src/com/android/documentsui/Metrics.java +++ b/src/com/android/documentsui/Metrics.java @@ -16,6 +16,8 @@ package com.android.documentsui; +import static android.content.ContentResolver.wrap; + import static com.android.documentsui.DocumentsApplication.acquireUnstableProviderOrThrow; import androidx.annotation.Nullable; @@ -291,7 +293,7 @@ public final class Metrics { boolean isInternal; try (ContentProviderClient client = acquireUnstableProviderOrThrow( context.getContentResolver(), Providers.AUTHORITY_STORAGE)) { - final Path path = DocumentsContract.findDocumentPath(client, docUri); + final Path path = DocumentsContract.findDocumentPath(wrap(client), docUri); final ProvidersAccess providers = DocumentsApplication.getProvidersCache(context); final RootInfo root = providers.getRootOneshot( Providers.AUTHORITY_STORAGE, path.getRootId()); diff --git a/src/com/android/documentsui/ThumbnailLoader.java b/src/com/android/documentsui/ThumbnailLoader.java index 4a50bf1e4..4b9351377 100644 --- a/src/com/android/documentsui/ThumbnailLoader.java +++ b/src/com/android/documentsui/ThumbnailLoader.java @@ -15,6 +15,8 @@ */ package com.android.documentsui; +import static android.content.ContentResolver.wrap; + import static com.android.documentsui.base.SharedMinimal.VERBOSE; import android.content.ContentProviderClient; @@ -104,7 +106,8 @@ public final class ThumbnailLoader extends AsyncTask implemen try { client = DocumentsApplication.acquireUnstableProviderOrThrow( resolver, mUri.getAuthority()); - result = DocumentsContract.getDocumentThumbnail(client, mUri, mThumbSize, mSignal); + result = DocumentsContract.getDocumentThumbnail(wrap(client), + mUri, mThumbSize, mSignal); if (result != null && mAddToCache) { final ThumbnailCache cache = DocumentsApplication.getThumbnailCache(context); cache.putThumbnail(mUri, mThumbSize, result, mLastModified); diff --git a/src/com/android/documentsui/files/ActionHandler.java b/src/com/android/documentsui/files/ActionHandler.java index dc6837b26..3a94d4bc1 100644 --- a/src/com/android/documentsui/files/ActionHandler.java +++ b/src/com/android/documentsui/files/ActionHandler.java @@ -16,6 +16,8 @@ package com.android.documentsui.files; +import static android.content.ContentResolver.wrap; + import static com.android.documentsui.base.SharedMinimal.DEBUG; import android.content.ActivityNotFoundException; @@ -174,7 +176,7 @@ public class ActionHandler extends Abstract client = DocumentsApplication.acquireUnstableProviderOrThrow( resolver, document.derivedUri.getAuthority()); Uri newUri = DocumentsContract.renameDocument( - client, document.derivedUri, name); + wrap(client), document.derivedUri, name); return DocumentInfo.fromUri(resolver, newUri); } catch (Exception e) { Log.w(TAG, "Failed to rename file", e); diff --git a/src/com/android/documentsui/services/CopyJob.java b/src/com/android/documentsui/services/CopyJob.java index 605380085..47f926278 100644 --- a/src/com/android/documentsui/services/CopyJob.java +++ b/src/com/android/documentsui/services/CopyJob.java @@ -16,6 +16,7 @@ package com.android.documentsui.services; +import static android.content.ContentResolver.wrap; import static android.provider.DocumentsContract.buildChildDocumentsUri; import static android.provider.DocumentsContract.buildDocumentUri; import static android.provider.DocumentsContract.getDocumentId; @@ -322,7 +323,7 @@ class CopyJob extends ResolvedResourcesJob { if (src.authority.equals(dstDirInfo.authority)) { if ((src.flags & Document.FLAG_SUPPORTS_COPY) != 0) { try { - if (DocumentsContract.copyDocument(getClient(src), src.derivedUri, + if (DocumentsContract.copyDocument(wrap(getClient(src)), src.derivedUri, dstDirInfo.derivedUri) != null) { Metrics.logFileOperated(operationType, MetricConsts.OPMODE_PROVIDER); return; @@ -389,7 +390,7 @@ class CopyJob extends ResolvedResourcesJob { Uri dstUri = null; try { dstUri = DocumentsContract.createDocument( - getClient(dest), dest.derivedUri, dstMimeType, dstDisplayName); + wrap(getClient(dest)), dest.derivedUri, dstMimeType, dstDisplayName); } catch (FileNotFoundException | RemoteException | RuntimeException e) { Metrics.logFileOperationFailure( appContext, MetricConsts.SUBFILEOP_CREATE_DOCUMENT, dest.derivedUri); @@ -780,7 +781,7 @@ class CopyJob extends ResolvedResourcesJob { throws ResourceException { if (parent.isDirectory() && doc.authority.equals(parent.authority)) { try { - return isChildDocument(getClient(doc), doc.derivedUri, parent.derivedUri); + return isChildDocument(wrap(getClient(doc)), doc.derivedUri, parent.derivedUri); } catch (FileNotFoundException | RemoteException | RuntimeException e) { throw new ResourceException( "Failed to check if %s is a child of %s due to an exception.", diff --git a/src/com/android/documentsui/services/Job.java b/src/com/android/documentsui/services/Job.java index 1e01410fc..92a6aff69 100644 --- a/src/com/android/documentsui/services/Job.java +++ b/src/com/android/documentsui/services/Job.java @@ -16,6 +16,8 @@ package com.android.documentsui.services; +import static android.content.ContentResolver.wrap; + import static com.android.documentsui.DocumentsApplication.acquireUnstableProviderOrThrow; import static com.android.documentsui.services.FileOperationService.EXTRA_CANCEL; import static com.android.documentsui.services.FileOperationService.EXTRA_DIALOG_TYPE; @@ -258,9 +260,10 @@ abstract public class Job implements Runnable { throws ResourceException { try { if (parent != null && doc.isRemoveSupported()) { - DocumentsContract.removeDocument(getClient(doc), doc.derivedUri, parent.derivedUri); + DocumentsContract.removeDocument(wrap(getClient(doc)), doc.derivedUri, + parent.derivedUri); } else if (doc.isDeleteSupported()) { - DocumentsContract.deleteDocument(getClient(doc), doc.derivedUri); + DocumentsContract.deleteDocument(wrap(getClient(doc)), doc.derivedUri); } else { throw new ResourceException("Unable to delete source document. " + "File is not deletable or removable: %s.", doc.derivedUri); diff --git a/src/com/android/documentsui/services/MoveJob.java b/src/com/android/documentsui/services/MoveJob.java index 585cfe0ce..36887e02c 100644 --- a/src/com/android/documentsui/services/MoveJob.java +++ b/src/com/android/documentsui/services/MoveJob.java @@ -16,6 +16,8 @@ package com.android.documentsui.services; +import static android.content.ContentResolver.wrap; + import static com.android.documentsui.base.SharedMinimal.DEBUG; import static com.android.documentsui.services.FileOperationService.OPERATION_MOVE; @@ -147,7 +149,7 @@ final class MoveJob extends CopyJob { if (src.authority.equals(dest.authority) && (srcParent != null || mSrcParent != null)) { if ((src.flags & Document.FLAG_SUPPORTS_MOVE) != 0) { try { - if (DocumentsContract.moveDocument(getClient(src), src.derivedUri, + if (DocumentsContract.moveDocument(wrap(getClient(src)), src.derivedUri, srcParent != null ? srcParent.derivedUri : mSrcParent.derivedUri, dest.derivedUri) != null) { Metrics.logFileOperated(operationType, MetricConsts.OPMODE_PROVIDER); diff --git a/src/com/android/documentsui/sidebar/EjectRootTask.java b/src/com/android/documentsui/sidebar/EjectRootTask.java index f7aecf5b5..209fc44af 100644 --- a/src/com/android/documentsui/sidebar/EjectRootTask.java +++ b/src/com/android/documentsui/sidebar/EjectRootTask.java @@ -16,6 +16,8 @@ package com.android.documentsui.sidebar; +import static android.content.ContentResolver.wrap; + import android.content.ContentProviderClient; import android.content.ContentResolver; import android.net.Uri; @@ -57,7 +59,7 @@ public final class EjectRootTask extends AsyncTask { try { client = DocumentsApplication.acquireUnstableProviderOrThrow( mResolver, mAuthority); - DocumentsContract.ejectRoot(client, rootUri); + DocumentsContract.ejectRoot(wrap(client), rootUri); return true; } catch (IllegalStateException e) { Log.w(TAG, "Failed to eject root.", e); diff --git a/tests/common/com/android/documentsui/DocumentsProviderHelper.java b/tests/common/com/android/documentsui/DocumentsProviderHelper.java index fdc71888c..e7a590e95 100644 --- a/tests/common/com/android/documentsui/DocumentsProviderHelper.java +++ b/tests/common/com/android/documentsui/DocumentsProviderHelper.java @@ -16,6 +16,7 @@ package com.android.documentsui; +import static android.content.ContentResolver.wrap; import static android.provider.DocumentsContract.buildChildDocumentsUri; import static android.provider.DocumentsContract.buildDocumentUri; import static android.provider.DocumentsContract.buildRootsUri; @@ -92,7 +93,7 @@ public class DocumentsProviderHelper { throw new IllegalArgumentException("Name and mimetype probably interposed."); } try { - Uri uri = DocumentsContract.createDocument(mClient, parentUri, mimeType, name); + Uri uri = DocumentsContract.createDocument(wrap(mClient), parentUri, mimeType, name); return uri; } catch (FileNotFoundException e) { throw new RuntimeException("Couldn't create document: " + name + " with mimetype " diff --git a/tests/unit/com/android/documentsui/archives/ArchivesProviderTest.java b/tests/unit/com/android/documentsui/archives/ArchivesProviderTest.java index ae3079c3e..484342525 100644 --- a/tests/unit/com/android/documentsui/archives/ArchivesProviderTest.java +++ b/tests/unit/com/android/documentsui/archives/ArchivesProviderTest.java @@ -16,6 +16,8 @@ package com.android.documentsui.archives; +import static android.content.ContentResolver.wrap; + import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertEquals; @@ -288,7 +290,7 @@ public class ArchivesProviderTest { + "com.android.documentsui.archives.resourcesprovider%2F" + "document%2F" + documentId + "%23268435456%23%2Ffreddy.jpg"); - Bundle metadata = DocumentsContract.getDocumentMetadata(client, archivedImageUri); + Bundle metadata = DocumentsContract.getDocumentMetadata(wrap(client), archivedImageUri); assertNotNull(metadata); Bundle exif = metadata.getBundle(DocumentsContract.METADATA_EXIF); assertNotNull(exif); -- cgit v1.2.3-59-g8ed1b