diff options
| author | 2023-05-05 12:06:26 -0700 | |
|---|---|---|
| committer | 2023-05-05 12:13:01 -0700 | |
| commit | 7e34b05b23683d154f8743fd1b4e64c3c165d46b (patch) | |
| tree | b412985fc7e38aacbb053dd823d286ef18a11cd4 | |
| parent | d572ef6c2ba73880edecd66c86835e78763d9400 (diff) | |
Add test content provider to mock uri mime types
Add a content provider that returns getType and getStreamTypes based on
the URI query parameters. That allows us not to rely on the debug hook
to override URI mime types, mock files with previes, and makes our
integration tests more integral.
Bug: 280237072
Test: tests themselves
Change-Id: I70835439e8b8b41f4dc633f218d662c2bc42c3ae
6 files changed, 89 insertions, 46 deletions
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index 7f55f78f..ecfaf0e2 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -713,8 +713,7 @@ public class ChooserActivity extends ResolverActivity implements return resolver.query(uri, null, null, null, null); } - @VisibleForTesting - protected boolean isImageType(@Nullable String mimeType) { + private boolean isImageType(@Nullable String mimeType) { return mimeType != null && mimeType.startsWith("image/"); } diff --git a/java/tests/AndroidManifest.xml b/java/tests/AndroidManifest.xml index 306eccb9..05830c4c 100644 --- a/java/tests/AndroidManifest.xml +++ b/java/tests/AndroidManifest.xml @@ -29,6 +29,10 @@ <uses-library android:name="android.test.runner" /> <activity android:name="com.android.intentresolver.ChooserWrapperActivity" /> <activity android:name="com.android.intentresolver.ResolverWrapperActivity" /> + <provider + android:authorities="com.android.intentresolver.tests" + android:name="com.android.intentresolver.TestContentProvider" + android:grantUriPermissions="true" /> </application> <instrumentation android:name="android.testing.TestableInstrumentation" diff --git a/java/tests/src/com/android/intentresolver/ChooserActivityOverrideData.java b/java/tests/src/com/android/intentresolver/ChooserActivityOverrideData.java index 9ebeb79d..ce96ef63 100644 --- a/java/tests/src/com/android/intentresolver/ChooserActivityOverrideData.java +++ b/java/tests/src/com/android/intentresolver/ChooserActivityOverrideData.java @@ -61,7 +61,6 @@ public class ChooserActivityOverrideData { public ChooserActivity.ChooserListController resolverListController; public ChooserActivity.ChooserListController workResolverListController; public Boolean isVoiceInteraction; - public boolean isImageType; public Cursor resolverCursor; public boolean resolverForceException; public ImageLoader imageLoader; @@ -84,7 +83,6 @@ public class ChooserActivityOverrideData { isVoiceInteraction = null; createPackageManager = null; imageLoader = null; - isImageType = false; resolverCursor = null; resolverForceException = false; resolverListController = mock(ChooserActivity.ChooserListController.class); diff --git a/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java b/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java index d23e4a66..82ba8d4d 100644 --- a/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java +++ b/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java @@ -201,11 +201,6 @@ public class ChooserWrapperActivity } @Override - protected boolean isImageType(String mimeType) { - return sOverrides.isImageType; - } - - @Override public ChooserActivityLogger getChooserActivityLogger() { return sOverrides.chooserActivityLogger; } diff --git a/java/tests/src/com/android/intentresolver/TestContentProvider.kt b/java/tests/src/com/android/intentresolver/TestContentProvider.kt new file mode 100644 index 00000000..b3b53baa --- /dev/null +++ b/java/tests/src/com/android/intentresolver/TestContentProvider.kt @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.intentresolver + +import android.content.ContentProvider +import android.content.ContentValues +import android.database.Cursor +import android.net.Uri + +class TestContentProvider : ContentProvider() { + override fun query( + uri: Uri, + projection: Array<out String>?, + selection: String?, + selectionArgs: Array<out String>?, + sortOrder: String? + ): Cursor? = null + + override fun getType(uri: Uri): String? + = runCatching { + uri.getQueryParameter("mimeType") + }.getOrNull() + + override fun getStreamTypes(uri: Uri, mimeTypeFilter: String): Array<String>? + = runCatching { + uri.getQueryParameter("streamType")?.let { arrayOf(it) } + }.getOrNull() + + override fun insert(uri: Uri, values: ContentValues?): Uri? = null + + override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int = 0 + + override fun update( + uri: Uri, + values: ContentValues?, + selection: String?, + selectionArgs: Array<out String>? + ): Int = 0 + + override fun onCreate(): Boolean = true +}
\ No newline at end of file diff --git a/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java b/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java index 7c4838a2..5ea0b47d 100644 --- a/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java +++ b/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java @@ -97,6 +97,7 @@ import android.view.WindowManager; import androidx.annotation.CallSuper; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.test.espresso.contrib.RecyclerViewActions; @@ -695,9 +696,7 @@ public class UnbundledChooserActivityTest { @Test public void testFilePlusTextSharing_ExcludeText() { - Uri uri = Uri.parse( - "android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + Uri uri = createTestContentProviderUri(null, "image/png"); Intent sendIntent = createSendImageIntent(uri); ChooserActivityOverrideData.getInstance().imageLoader = createImageLoader(uri, createBitmap()); @@ -738,9 +737,7 @@ public class UnbundledChooserActivityTest { @Test public void testFilePlusTextSharing_RemoveAndAddBackText() { - Uri uri = Uri.parse( - "android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + Uri uri = createTestContentProviderUri("application/pdf", "image/png"); Intent sendIntent = createSendImageIntent(uri); ChooserActivityOverrideData.getInstance().imageLoader = createImageLoader(uri, createBitmap()); @@ -787,9 +784,7 @@ public class UnbundledChooserActivityTest { @Test public void testFilePlusTextSharing_TextExclusionDoesNotAffectAlternativeIntent() { - Uri uri = Uri.parse( - "android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + Uri uri = createTestContentProviderUri("image/png", null); Intent sendIntent = createSendImageIntent(uri); ChooserActivityOverrideData.getInstance().imageLoader = createImageLoader(uri, createBitmap()); @@ -832,13 +827,10 @@ public class UnbundledChooserActivityTest { @Test public void testImagePlusTextSharing_failedThumbnailAndExcludedText_textChanges() { - Uri uri = Uri.parse( - "android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + Uri uri = createTestContentProviderUri("image/png", null); Intent sendIntent = createSendImageIntent(uri); ChooserActivityOverrideData.getInstance().imageLoader = new TestPreviewImageLoader(Collections.emptyMap()); - ChooserActivityOverrideData.getInstance().isImageType = true; sendIntent.putExtra(Intent.EXTRA_TEXT, "https://google.com/search?q=google"); List<ResolvedComponentInfo> resolvedComponentInfos = Arrays.asList( @@ -863,7 +855,7 @@ public class UnbundledChooserActivityTest { onView(withId(R.id.image_view)) .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))); onView(withId(R.id.content_preview_text)) - .check(matches(allOf(isDisplayed(), not(isEnabled()), withText("File only")))); + .check(matches(allOf(isDisplayed(), not(isEnabled()), withText("Image only")))); } @Test @@ -930,14 +922,11 @@ public class UnbundledChooserActivityTest { @Test @Ignore - public void testEditImageLogs() throws Exception { - Uri uri = Uri.parse( - "android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + public void testEditImageLogs() { + Uri uri = createTestContentProviderUri("image/png", null); Intent sendIntent = createSendImageIntent(uri); ChooserActivityOverrideData.getInstance().imageLoader = createImageLoader(uri, createBitmap()); - ChooserActivityOverrideData.getInstance().isImageType = true; List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); @@ -956,8 +945,7 @@ public class UnbundledChooserActivityTest { @Test public void oneVisibleImagePreview() { - Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + Uri uri = createTestContentProviderUri("image/png", null); ArrayList<Uri> uris = new ArrayList<>(); uris.add(uri); @@ -965,7 +953,6 @@ public class UnbundledChooserActivityTest { Intent sendIntent = createSendUriIntentWithPreview(uris); ChooserActivityOverrideData.getInstance().imageLoader = createImageLoader(uri, createWideBitmap()); - ChooserActivityOverrideData.getInstance().isImageType = true; List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); @@ -993,8 +980,7 @@ public class UnbundledChooserActivityTest { @Test public void allThumbnailsFailedToLoad_hidePreview() { - Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + Uri uri = createTestContentProviderUri("image/jpg", null); ArrayList<Uri> uris = new ArrayList<>(); uris.add(uri); @@ -1003,7 +989,6 @@ public class UnbundledChooserActivityTest { Intent sendIntent = createSendUriIntentWithPreview(uris); ChooserActivityOverrideData.getInstance().imageLoader = new TestPreviewImageLoader(Collections.emptyMap()); - ChooserActivityOverrideData.getInstance().isImageType = true; List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); @@ -1016,8 +1001,7 @@ public class UnbundledChooserActivityTest { @Test public void testManyVisibleImagePreview_ScrollableImagePreview() { - Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + Uri uri = createTestContentProviderUri("image/png", null); ArrayList<Uri> uris = new ArrayList<>(); uris.add(uri); @@ -1034,7 +1018,6 @@ public class UnbundledChooserActivityTest { Intent sendIntent = createSendUriIntentWithPreview(uris); ChooserActivityOverrideData.getInstance().imageLoader = createImageLoader(uri, createBitmap()); - ChooserActivityOverrideData.getInstance().isImageType = true; List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); @@ -1054,8 +1037,7 @@ public class UnbundledChooserActivityTest { @Test public void testImageAndTextPreview() { - final Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + final Uri uri = createTestContentProviderUri("image/png", null); final String sharedText = "text-" + System.currentTimeMillis(); ArrayList<Uri> uris = new ArrayList<>(); @@ -1065,7 +1047,6 @@ public class UnbundledChooserActivityTest { sendIntent.putExtra(Intent.EXTRA_TEXT, sharedText); ChooserActivityOverrideData.getInstance().imageLoader = createImageLoader(uri, createBitmap()); - ChooserActivityOverrideData.getInstance().isImageType = true; List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); @@ -1078,8 +1059,7 @@ public class UnbundledChooserActivityTest { @Test public void testTextPreviewWhenTextIsSharedWithMultipleImages() { - final Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + final Uri uri = createTestContentProviderUri("image/png", null); final String sharedText = "text-" + System.currentTimeMillis(); ArrayList<Uri> uris = new ArrayList<>(); @@ -1090,7 +1070,6 @@ public class UnbundledChooserActivityTest { sendIntent.putExtra(Intent.EXTRA_TEXT, sharedText); ChooserActivityOverrideData.getInstance().imageLoader = createImageLoader(uri, createBitmap()); - ChooserActivityOverrideData.getInstance().isImageType = true; List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); @@ -1170,8 +1149,7 @@ public class UnbundledChooserActivityTest { @Test public void testImagePreviewLogging() { - Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/" - + R.drawable.test320x240); + Uri uri = createTestContentProviderUri("image/png", null); ArrayList<Uri> uris = new ArrayList<>(); uris.add(uri); @@ -1179,7 +1157,6 @@ public class UnbundledChooserActivityTest { Intent sendIntent = createSendUriIntentWithPreview(uris); ChooserActivityOverrideData.getInstance().imageLoader = createImageLoader(uri, createBitmap()); - ChooserActivityOverrideData.getInstance().isImageType = true; List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); @@ -2660,6 +2637,21 @@ public class UnbundledChooserActivityTest { return sendIntent; } + private Uri createTestContentProviderUri( + @Nullable String mimeType, @Nullable String streamType) { + String packageName = + InstrumentationRegistry.getInstrumentation().getContext().getPackageName(); + Uri.Builder builder = Uri.parse("content://" + packageName + "/image.png") + .buildUpon(); + if (mimeType != null) { + builder.appendQueryParameter("mimeType", mimeType); + } + if (streamType != null) { + builder.appendQueryParameter("streamType", streamType); + } + return builder.build(); + } + private Intent createSendTextIntentWithPreview(String title, Uri imageThumbnail) { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); |