Merge "Send a regular ResultReceiver instead of a subclass." into tm-qpr-dev
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java
index 6f6baa2..7fa715c 100644
--- a/java/src/com/android/intentresolver/ChooserActivity.java
+++ b/java/src/com/android/intentresolver/ChooserActivity.java
@@ -61,6 +61,7 @@
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.Handler;
+import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.PatternMatcher;
 import android.os.ResultReceiver;
@@ -1177,7 +1178,7 @@
                 }
                 mRefinementResultReceiver = new RefinementResultReceiver(this, target, null);
                 fillIn.putExtra(Intent.EXTRA_RESULT_RECEIVER,
-                        mRefinementResultReceiver);
+                        mRefinementResultReceiver.copyForSending());
                 try {
                     mChooserRequest.getRefinementIntentSender().sendIntent(
                             this, 0, fillIn, null, null);
@@ -2223,6 +2224,19 @@
             mChooserActivity = null;
             mSelectedTarget = null;
         }
+
+        /**
+         * Apps can't load this class directly, so we need a regular ResultReceiver copy for
+         * sending. Obtain this by parceling and unparceling (one weird trick).
+         */
+        ResultReceiver copyForSending() {
+            Parcel parcel = Parcel.obtain();
+            writeToParcel(parcel, 0);
+            parcel.setDataPosition(0);
+            ResultReceiver receiverForSending = ResultReceiver.CREATOR.createFromParcel(parcel);
+            parcel.recycle();
+            return receiverForSending;
+        }
     }
 
     /**