From e420c550ee98aefab92bae4017c46c7a969bf132 Mon Sep 17 00:00:00 2001 From: Rubin Xu Date: Wed, 6 Apr 2016 19:04:30 +0100 Subject: [PATCH] Relaunch previous activity after turning work profile on When work profile is turned off, attempts to start work app activity is intercepted and redirected to an information dialog, which gives the option to turn work profile back on. When the user does turn it back on, the original activity should be relaunched. Bug: 27740167 Change-Id: I4c9d5bc949499bdb5d9f2394e13e670a48d43629 --- .../internal/app/UnlaunchableAppActivity.java | 17 +++++++++++++++++ .../server/am/ActivityStartInterceptor.java | 8 +++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/app/UnlaunchableAppActivity.java b/core/java/com/android/internal/app/UnlaunchableAppActivity.java index f6fbaab8f8f35..27588e98dcafe 100644 --- a/core/java/com/android/internal/app/UnlaunchableAppActivity.java +++ b/core/java/com/android/internal/app/UnlaunchableAppActivity.java @@ -26,6 +26,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.IntentSender; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -53,6 +54,7 @@ public class UnlaunchableAppActivity extends Activity private int mUserId; private int mReason; + private IntentSender mTarget; @Override protected void onCreate(Bundle savedInstanceState) { @@ -60,6 +62,7 @@ public class UnlaunchableAppActivity extends Activity Intent intent = getIntent(); mReason = intent.getIntExtra(EXTRA_UNLAUNCHABLE_REASON, -1); mUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); + mTarget = intent.getParcelableExtra(Intent.EXTRA_INTENT); if (mUserId == UserHandle.USER_NULL) { Log.wtf(TAG, "Invalid user id: " + mUserId + ". Stopping."); @@ -105,6 +108,14 @@ public class UnlaunchableAppActivity extends Activity public void onClick(DialogInterface dialog, int which) { if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE && which == DialogInterface.BUTTON_POSITIVE) { UserManager.get(this).setQuietModeEnabled(mUserId, false); + + if (mTarget != null) { + try { + startIntentSenderForResult(mTarget, -1, null, 0, 0, 0); + } catch (IntentSender.SendIntentException e) { + /* ignore */ + } + } } } @@ -121,4 +132,10 @@ public class UnlaunchableAppActivity extends Activity intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); return intent; } + + public static Intent createInQuietModeDialogIntent(int userId, IntentSender target) { + Intent intent = createInQuietModeDialogIntent(userId); + intent.putExtra(Intent.EXTRA_INTENT, target); + return intent; + } } diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java index 76dfd015ee0b8..785dd471c0cd0 100644 --- a/services/core/java/com/android/server/am/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java @@ -119,7 +119,13 @@ class ActivityStartInterceptor { if (!mUserManager.isQuietModeEnabled(UserHandle.of(mUserId))) { return false; } - mIntent = UnlaunchableAppActivity.createInQuietModeDialogIntent(mUserId); + IIntentSender target = mService.getIntentSenderLocked( + INTENT_SENDER_ACTIVITY, mCallingPackage, mCallingUid, mUserId, null, null, 0, + new Intent[] {mIntent}, new String[] {mResolvedType}, + FLAG_CANCEL_CURRENT | FLAG_ONE_SHOT, null); + + mIntent = UnlaunchableAppActivity.createInQuietModeDialogIntent(mUserId, + new IntentSender(target)); mCallingPid = mRealCallingPid; mCallingUid = mRealCallingUid; mResolvedType = null;