summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
author Andrey Epin <ayepin@google.com> 2023-03-21 10:56:58 -0700
committer Andrey Epin <ayepin@google.com> 2023-03-21 14:11:13 -0700
commit4fc75124fe90daff88f213ba204a157e40ba2b96 (patch)
treeba8f344f2cf2c1eb1b58d6c426cfad2e7c6bbfc5 /java
parent3c3755b4ea535df1b5f2a9f3e57b235b660e1fcd (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.java11
-rw-r--r--java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt50
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()
}
+
}