diff options
| author | 2023-03-21 10:56:58 -0700 | |
|---|---|---|
| committer | 2023-03-21 14:11:13 -0700 | |
| commit | 4fc75124fe90daff88f213ba204a157e40ba2b96 (patch) | |
| tree | ba8f344f2cf2c1eb1b58d6c426cfad2e7c6bbfc5 /java | |
| parent | 3c3755b4ea535df1b5f2a9f3e57b235b660e1fcd (diff) | |
Do not crash on reading URI metadata
Do not crash if content resolver throws an exception while trying to
read an URI metadata.
Bug: 273890881
Test: check that the Chooser is not failing
Change-Id: I161e29246bfcb1081a500b90c88c8c06c1d0df72
Diffstat (limited to 'java')
| -rw-r--r-- | java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java | 11 | ||||
| -rw-r--r-- | java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt | 50 |
2 files changed, 57 insertions, 4 deletions
diff --git a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java index 08cebf68..de454cfd 100644 --- a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java @@ -28,11 +28,11 @@ import android.content.res.Resources; import android.database.Cursor; import android.media.MediaMetadata; import android.net.Uri; -import android.os.RemoteException; import android.provider.DocumentsContract; import android.provider.Downloads; import android.provider.OpenableColumns; import android.text.TextUtils; +import android.util.Log; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -351,7 +351,8 @@ public final class ChooserContentPreviewUi { private static String getType(ContentInterface resolver, Uri uri) { try { return resolver.getType(uri); - } catch (RemoteException e) { + } catch (Throwable t) { + Log.e(ContentPreviewUi.TAG, "Failed to read content type, uri: " + uri, t); return null; } } @@ -360,7 +361,8 @@ public final class ChooserContentPreviewUi { private static Cursor query(ContentInterface resolver, Uri uri) { try { return resolver.query(uri, null, null, null); - } catch (RemoteException e) { + } catch (Throwable t) { + Log.e(ContentPreviewUi.TAG, "Failed to read metadata, uri: " + uri, t); return null; } } @@ -369,7 +371,8 @@ public final class ChooserContentPreviewUi { private static String[] getStreamTypes(ContentInterface resolver, Uri uri) { try { return resolver.getStreamTypes(uri, "*/*"); - } catch (RemoteException e) { + } catch (Throwable t) { + Log.e(ContentPreviewUi.TAG, "Failed to read stream types, uri: " + uri, t); return null; } } diff --git a/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt b/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt index 04a136b4..58b8a21d 100644 --- a/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt +++ b/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt @@ -23,6 +23,8 @@ import android.graphics.Bitmap import android.net.Uri import com.android.intentresolver.ImageLoader import com.android.intentresolver.TestFeatureFlagRepository +import com.android.intentresolver.any +import com.android.intentresolver.anyOrNull import com.android.intentresolver.contentpreview.ChooserContentPreviewUi.ActionFactory import com.android.intentresolver.flags.Flags import com.android.intentresolver.mock @@ -144,6 +146,53 @@ class ChooserContentPreviewUiTest { } @Test + fun test_ChooserContentPreview_single_uri_crashing_getType_to_file_preview() { + val uri = Uri.parse("content://$PROVIDER_NAME/test.pdf") + val targetIntent = Intent(Intent.ACTION_SEND).apply { + putExtra(Intent.EXTRA_STREAM, uri) + } + whenever(contentResolver.getType(any())) + .thenThrow(SecurityException("Test getType() exception")) + val testSubject = ChooserContentPreviewUi( + targetIntent, + contentResolver, + imageClassifier, + imageLoader, + actionFactory, + transitionCallback, + featureFlagRepository + ) + assertThat(testSubject.preferredContentPreview) + .isEqualTo(ContentPreviewType.CONTENT_PREVIEW_FILE) + verify(transitionCallback, times(1)).onAllTransitionElementsReady() + } + + @Test + fun test_ChooserContentPreview_single_uri_crashing_metadata_to_file_preview() { + val uri = Uri.parse("content://$PROVIDER_NAME/test.pdf") + val targetIntent = Intent(Intent.ACTION_SEND).apply { + putExtra(Intent.EXTRA_STREAM, uri) + } + whenever(contentResolver.getType(any())).thenReturn("application/pdf") + whenever(contentResolver.query(any(), anyOrNull(), anyOrNull(), anyOrNull())) + .thenThrow(SecurityException("Test query() exception")) + whenever(contentResolver.getStreamTypes(any(), any())) + .thenThrow(SecurityException("Test getStreamType() exception")) + val testSubject = ChooserContentPreviewUi( + targetIntent, + contentResolver, + imageClassifier, + imageLoader, + actionFactory, + transitionCallback, + featureFlagRepository + ) + assertThat(testSubject.preferredContentPreview) + .isEqualTo(ContentPreviewType.CONTENT_PREVIEW_FILE) + verify(transitionCallback, times(1)).onAllTransitionElementsReady() + } + + @Test fun test_ChooserContentPreview_single_uri_with_preview_to_image_preview() { val uri = Uri.parse("content://$PROVIDER_NAME/test.pdf") val targetIntent = Intent(Intent.ACTION_SEND).apply { @@ -283,4 +332,5 @@ class ChooserContentPreviewUiTest { .isEqualTo(ContentPreviewType.CONTENT_PREVIEW_FILE) verify(transitionCallback, times(1)).onAllTransitionElementsReady() } + } |