From 107f7b7becdb5fe6d735a4f1355eb3421f068fb0 Mon Sep 17 00:00:00 2001 From: Nicolas Prevot Date: Wed, 1 Jul 2015 16:31:48 +0100 Subject: [PATCH] Fix the case where an intent bounces several times between users. An intent may bounce several times between users. In this case, we want mContentUserHint to refer to the original user. BUG:19656340 Change-Id: I22a35fab0c228140dcb223899f5e38ff33ee5aed --- core/java/android/content/Intent.java | 8 ++++++-- .../com/android/internal/app/IntentForwarderActivity.java | 4 ++-- .../core/java/com/android/server/am/ActivityStack.java | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index b1d80f021b504..c9f9b565751ac 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -6181,8 +6181,12 @@ public class Intent implements Parcelable, Cloneable { * who sent the intent. * @hide */ - public void setContentUserHint(int contentUserHint) { - mContentUserHint = contentUserHint; + public void prepareToLeaveUser(int userId) { + // If mContentUserHint is not UserHandle.USER_CURRENT, the intent has already left a user. + // We want mContentUserHint to refer to the original user, so don't do anything. + if (mContentUserHint == UserHandle.USER_CURRENT) { + mContentUserHint = userId; + } } /** diff --git a/core/java/com/android/internal/app/IntentForwarderActivity.java b/core/java/com/android/internal/app/IntentForwarderActivity.java index f598828d712f5..233bee3b5bc07 100644 --- a/core/java/com/android/internal/app/IntentForwarderActivity.java +++ b/core/java/com/android/internal/app/IntentForwarderActivity.java @@ -87,9 +87,9 @@ public class IntentForwarderActivity extends Activity { if (canForward(newIntent, targetUserId)) { if (newIntent.getAction().equals(Intent.ACTION_CHOOSER)) { Intent innerIntent = (Intent) newIntent.getParcelableExtra(Intent.EXTRA_INTENT); - innerIntent.setContentUserHint(callingUserId); + innerIntent.prepareToLeaveUser(callingUserId); } else { - newIntent.setContentUserHint(callingUserId); + newIntent.prepareToLeaveUser(callingUserId); } final android.content.pm.ResolveInfo ri = getPackageManager().resolveActivityAsUser( diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 0714d36eb5ed0..8c3a9508922dc 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2829,7 +2829,7 @@ final class ActivityStack { + " res=" + resultCode + " data=" + resultData); if (resultTo.userId != r.userId) { if (resultData != null) { - resultData.setContentUserHint(r.userId); + resultData.prepareToLeaveUser(r.userId); } } if (r.info.applicationInfo.uid > 0) {