From c0fe0a00ec999f4b41e552ec1018c4c7c04e3ddd Mon Sep 17 00:00:00 2001 From: Pavel Grafov Date: Mon, 13 May 2019 18:19:33 +0100 Subject: [PATCH] Stop putting credential confirmation activity to the home task. Previously when the user tapped "back" on the credential confirmation screen, the phone would show home screen automatically. Now this is handled explicitly in WorkLockActivity to prevent from showing credential confirmation screens in a loop. Test: manual, making home and back gesture on work challenge screen Test: manual, starting work challenge in split-screen mode Test: manual, invoking work challenge via notification/recents/launcher Bug: 129045018 Change-Id: Iffd14396e3888416b11d2e7dd2408cab683d4506 --- .../systemui/keyguard/WorkLockActivity.java | 42 +++++++++---------- .../server/wm/ActivityStartInterceptor.java | 7 ---- .../server/wm/ActivityTaskManagerService.java | 11 +---- 3 files changed, 22 insertions(+), 38 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java index af2b7677dcad2..a9fe54bae19d3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java @@ -21,7 +21,6 @@ import static android.app.ActivityManager.TaskDescription; import android.annotation.ColorInt; import android.annotation.UserIdInt; import android.app.Activity; -import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.KeyguardManager; import android.app.PendingIntent; @@ -32,9 +31,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.os.Bundle; -import android.os.RemoteException; import android.os.UserHandle; -import android.util.Log; import android.view.View; import com.android.internal.annotations.VisibleForTesting; @@ -56,7 +53,9 @@ public class WorkLockActivity extends Activity { */ static final String EXTRA_TASK_DESCRIPTION = "com.android.systemui.keyguard.extra.TASK_DESCRIPTION"; - + + private static final int REQUEST_CODE_CONFIRM_CREDENTIALS = 1; + /** * Cached keyguard manager instance populated by {@link #getKeyguardManager}. * @see KeyguardManager @@ -111,7 +110,6 @@ public class WorkLockActivity extends Activity { @Override public void onBackPressed() { // Ignore back presses. - return; } @Override @@ -151,26 +149,26 @@ public class WorkLockActivity extends Activity { PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE, options.toBundle()); - credential.putExtra(Intent.EXTRA_INTENT, target.getIntentSender()); - try { - ActivityManager.getService().startConfirmDeviceCredentialIntent(credential, - getChallengeOptions().toBundle()); - } catch (RemoteException e) { - Log.e(TAG, "Failed to start confirm credential intent", e); + if (target != null) { + credential.putExtra(Intent.EXTRA_INTENT, target.getIntentSender()); + } + + startActivityForResult(credential, REQUEST_CODE_CONFIRM_CREDENTIALS); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_CODE_CONFIRM_CREDENTIALS && resultCode != RESULT_OK) { + // The user dismissed the challenge, don't show it again. + goToHomeScreen(); } } - private ActivityOptions getChallengeOptions() { - // If we are taking up the whole screen, just use the default animation of clipping the - // credentials activity into the entire foreground. - if (!isInMultiWindowMode()) { - return ActivityOptions.makeBasic(); - } - - // Otherwise, animate the transition from this part of the screen to fullscreen - // using our own decor as the starting position. - final View view = getWindow().getDecorView(); - return ActivityOptions.makeScaleUpAnimation(view, 0, 0, view.getWidth(), view.getHeight()); + private void goToHomeScreen() { + final Intent homeIntent = new Intent(Intent.ACTION_MAIN); + homeIntent.addCategory(Intent.CATEGORY_HOME); + homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(homeIntent); } private KeyguardManager getKeyguardManager() { diff --git a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java index b8442a887dac4..fea0793726c29 100644 --- a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java @@ -281,13 +281,6 @@ class ActivityStartInterceptor { mActivityOptions = ActivityOptions.makeBasic(); } - ActivityRecord homeActivityRecord = mRootActivityContainer.getDefaultDisplayHomeActivity(); - if (homeActivityRecord != null && homeActivityRecord.getTaskRecord() != null) { - // Showing credential confirmation activity in home task to avoid stopping - // multi-windowed mode after showing the full-screen credential confirmation activity. - mActivityOptions.setLaunchTaskId(homeActivityRecord.getTaskRecord().taskId); - } - final UserInfo parent = mUserManager.getProfileParent(mUserId); mRInfo = mSupervisor.resolveIntent(mIntent, mResolvedType, parent.id, 0, mRealCallingUid); mAInfo = mSupervisor.resolveActivity(mIntent, mRInfo, mStartFlags, null /*profilerInfo*/); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 89962a5418c11..772e5e646825e 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -39,7 +39,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; -import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME; import static android.content.pm.ApplicationInfo.FLAG_FACTORY_TEST; import static android.content.pm.ConfigurationInfo.GL_ES_VERSION_UNDEFINED; import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS; @@ -6892,15 +6891,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { synchronized (mGlobalLock) { final long ident = Binder.clearCallingIdentity(); try { - intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | - FLAG_ACTIVITY_TASK_ON_HOME); - ActivityOptions activityOptions = options != null + intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + final ActivityOptions activityOptions = options != null ? new ActivityOptions(options) : ActivityOptions.makeBasic(); - final ActivityRecord homeActivity = - mRootActivityContainer.getDefaultDisplayHomeActivity(); - if (homeActivity != null) { - activityOptions.setLaunchTaskId(homeActivity.getTaskRecord().taskId); - } mContext.startActivityAsUser(intent, activityOptions.toBundle(), UserHandle.CURRENT); } finally {