From d3c63a66f26d2e4682eca12101c58077f6264b70 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Thu, 9 Jun 2016 12:36:16 -0700 Subject: [PATCH] Make Activity.getReferrer tolerate custom Parcelables in intents Referrer information is passed as an intent extra to each Activity, therefore if that intent contains a custom parcelable unmarshaling the intent extras will fail in a call to getReferrer. Insulate apps from this concern and log a warning when it happens. Bug 28972438 Change-Id: I37dbc033bfcfe816e4b58b382c012854fbed943b --- core/java/android/app/Activity.java | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index a5fcec6229569..13cf46d115199 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -57,6 +57,7 @@ import android.hardware.input.InputManager; import android.media.AudioManager; import android.media.session.MediaController; import android.net.Uri; +import android.os.BadParcelableException; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -5006,13 +5007,18 @@ public class Activity extends ContextThemeWrapper @Nullable public Uri getReferrer() { Intent intent = getIntent(); - Uri referrer = intent.getParcelableExtra(Intent.EXTRA_REFERRER); - if (referrer != null) { - return referrer; - } - String referrerName = intent.getStringExtra(Intent.EXTRA_REFERRER_NAME); - if (referrerName != null) { - return Uri.parse(referrerName); + try { + Uri referrer = intent.getParcelableExtra(Intent.EXTRA_REFERRER); + if (referrer != null) { + return referrer; + } + String referrerName = intent.getStringExtra(Intent.EXTRA_REFERRER_NAME); + if (referrerName != null) { + return Uri.parse(referrerName); + } + } catch (BadParcelableException e) { + Log.w(TAG, "Cannot read referrer from intent;" + + " intent extras contain unknown custom Parcelable objects"); } if (mReferrer != null) { return new Uri.Builder().scheme("android-app").authority(mReferrer).build();