Propagate exception thrown by ContentProvider.getType

Test: atest FrameworksCoreTests:android.content.ContentResolverTest
Fixes: 149184281
Change-Id: If3c33e58b1d0f3b88148eb3d2085c9d23cf12fc2
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index d8e8b27..5340d00 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -47,6 +47,7 @@
 import android.os.CancellationSignal;
 import android.os.IBinder;
 import android.os.ICancellationSignal;
+import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
 import android.os.Process;
 import android.os.RemoteCallback;
@@ -303,7 +304,23 @@
         @Override
         public void getTypeAsync(Uri uri, RemoteCallback callback) {
             final Bundle result = new Bundle();
-            result.putString(ContentResolver.REMOTE_CALLBACK_RESULT, getType(uri));
+            try {
+                result.putString(ContentResolver.REMOTE_CALLBACK_RESULT, getType(uri));
+            } catch (Exception e) {
+                Parcel parcel = Parcel.obtain();
+                try {
+                    try {
+                        parcel.writeException(e);
+                    } catch (Exception ex) {
+                        // getType threw an unparcelable exception. Wrap the message into
+                        // a parcelable exception type
+                        parcel.writeException(new IllegalStateException(e.getMessage()));
+                    }
+                    result.putByteArray(ContentResolver.REMOTE_CALLBACK_ERROR, parcel.marshall());
+                } finally {
+                    parcel.recycle();
+                }
+            }
             callback.sendResult(result);
         }