diff --git a/src/com/android/settings/ChooseLockSettingsHelper.java b/src/com/android/settings/ChooseLockSettingsHelper.java index ab814558053..53fbb7fb46d 100644 --- a/src/com/android/settings/ChooseLockSettingsHelper.java +++ b/src/com/android/settings/ChooseLockSettingsHelper.java @@ -197,18 +197,10 @@ public final class ChooseLockSettingsHelper { if (external) { intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); if (mFragment != null) { - IntentSender intentSender = mFragment.getActivity().getIntent() - .getParcelableExtra(Intent.EXTRA_INTENT); - if (intentSender != null) { - intent.putExtra(Intent.EXTRA_INTENT, intentSender); - } + copyOptionalExtras(mFragment.getActivity().getIntent(), intent); mFragment.startActivity(intent); } else { - IntentSender intentSender = mActivity.getIntent() - .getParcelableExtra(Intent.EXTRA_INTENT); - if (intentSender != null) { - intent.putExtra(Intent.EXTRA_INTENT, intentSender); - } + copyOptionalExtras(mActivity.getIntent(), intent); mActivity.startActivity(intent); } } else { @@ -220,4 +212,22 @@ public final class ChooseLockSettingsHelper { } return true; } + + private void copyOptionalExtras(Intent inIntent, Intent outIntent) { + IntentSender intentSender = inIntent.getParcelableExtra(Intent.EXTRA_INTENT); + if (intentSender != null) { + outIntent.putExtra(Intent.EXTRA_INTENT, intentSender); + } + int taskId = inIntent.getIntExtra(Intent.EXTRA_TASK_ID, -1); + if (taskId != -1) { + outIntent.putExtra(Intent.EXTRA_TASK_ID, taskId); + } + // If we will launch another activity once credentials are confirmed, exclude from recents. + // This is a workaround to a framework bug where affinity is incorrect for activities + // that are started from a no display activity, as is ConfirmDeviceCredentialActivity. + // TODO: Remove once that bug is fixed. + if (intentSender != null || taskId != -1) { + outIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + } + } } diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java index e04f86fe17a..0a22d45d0e7 100644 --- a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java +++ b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java @@ -17,9 +17,15 @@ package com.android.settings; import android.annotation.Nullable; +import android.app.ActivityManager; +import android.app.ActivityManagerNative; +import android.app.ActivityOptions; +import android.app.IActivityManager; +import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.os.Bundle; +import android.os.RemoteException; import android.view.View; import android.widget.Button; import android.widget.ImageView; @@ -127,6 +133,18 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr } protected void checkForPendingIntent() { + int taskId = getActivity().getIntent().getIntExtra(Intent.EXTRA_TASK_ID, -1); + if (taskId != -1) { + try { + IActivityManager activityManager = ActivityManagerNative.getDefault(); + final ActivityOptions options = ActivityOptions.makeBasic(); + options.setLaunchStackId(ActivityManager.StackId.INVALID_STACK_ID); + activityManager.startActivityFromRecents(taskId, options.toBundle()); + return; + } catch (RemoteException e) { + // Do nothing. + } + } IntentSender intentSender = getActivity().getIntent() .getParcelableExtra(Intent.EXTRA_INTENT); if (intentSender != null) {