Merge "Add ActivityOption to remove insecure keyguard when activity is launched." into tm-dev

This commit is contained in:
Issei Suzuki
2022-03-24 13:42:34 +00:00
committed by Android (Google) Code Review
4 changed files with 76 additions and 9 deletions

View File

@@ -361,6 +361,10 @@ public class ActivityOptions extends ComponentOptions {
private static final String KEY_LAUNCH_INTO_PIP_PARAMS =
"android.activity.launchIntoPipParams";
/** See {@link #setDismissKeyguardIfInsecure()}. */
private static final String KEY_DISMISS_KEYGUARD_IF_INSECURE =
"android.activity.dismissKeyguardIfInsecure";
/**
* @see #setLaunchCookie
* @hide
@@ -457,6 +461,7 @@ public class ActivityOptions extends ComponentOptions {
private boolean mLaunchedFromBubble;
private boolean mTransientLaunch;
private PictureInPictureParams mLaunchIntoPipParams;
private boolean mDismissKeyguardIfInsecure;
/**
* Create an ActivityOptions specifying a custom animation to run when
@@ -1254,6 +1259,7 @@ public class ActivityOptions extends ComponentOptions {
mLaunchIntoPipParams = opts.getParcelable(KEY_LAUNCH_INTO_PIP_PARAMS);
mIsEligibleForLegacyPermissionPrompt =
opts.getBoolean(KEY_LEGACY_PERMISSION_PROMPT_ELIGIBLE);
mDismissKeyguardIfInsecure = opts.getBoolean(KEY_DISMISS_KEYGUARD_IF_INSECURE);
}
/**
@@ -1849,6 +1855,27 @@ public class ActivityOptions extends ComponentOptions {
return mTransientLaunch;
}
/**
* Sets whether the insecure keyguard should go away when this activity launches. In case the
* keyguard is secure, this option will be ignored.
*
* @see Activity#setShowWhenLocked(boolean)
* @see android.R.attr#showWhenLocked
* @hide
*/
public void setDismissKeyguardIfInsecure() {
mDismissKeyguardIfInsecure = true;
}
/**
* @see #setDismissKeyguardIfInsecure()
* @return whether the insecure keyguard should go away when the activity launches.
* @hide
*/
public boolean getDismissKeyguardIfInsecure() {
return mDismissKeyguardIfInsecure;
}
/**
* Update the current values in this ActivityOptions from those supplied
* in <var>otherOptions</var>. Any values
@@ -2110,6 +2137,9 @@ public class ActivityOptions extends ComponentOptions {
b.putBoolean(KEY_LEGACY_PERMISSION_PROMPT_ELIGIBLE,
mIsEligibleForLegacyPermissionPrompt);
}
if (mDismissKeyguardIfInsecure) {
b.putBoolean(KEY_DISMISS_KEYGUARD_IF_INSECURE, mDismissKeyguardIfInsecure);
}
return b;
}

View File

@@ -183,6 +183,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
private boolean mAsync;
private BroadcastOptions mBroadcastOptions;
private boolean mShowSplashScreen;
private boolean mDismissKeyguardIfInsecure;
final boolean mDumping;
@@ -439,6 +440,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
mAsync = true;
} else if (opt.equals("--splashscreen-show-icon")) {
mShowSplashScreen = true;
} else if (opt.equals("--dismiss-keyguard-if-insecure")) {
mDismissKeyguardIfInsecure = true;
} else {
return false;
}
@@ -583,6 +586,12 @@ final class ActivityManagerShellCommand extends ShellCommand {
}
options.setSplashScreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_ICON);
}
if (mDismissKeyguardIfInsecure) {
if (options == null) {
options = ActivityOptions.makeBasic();
}
options.setDismissKeyguardIfInsecure();
}
if (mWaitOption) {
result = mInternal.startActivityAndWait(null, SHELL_PACKAGE_NAME, null, intent,
mimeType, null, null, 0, mStartFlags, profilerInfo,

View File

@@ -856,6 +856,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
boolean mEnteringAnimation;
boolean mOverrideTaskTransition;
boolean mDismissKeyguardIfInsecure;
boolean mAppStopped;
// A hint to override the window specified rotation animation, or -1 to use the window specified
@@ -1953,6 +1954,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
mOverrideTaskTransition = options.getOverrideTaskTransition();
mDismissKeyguardIfInsecure = options.getDismissKeyguardIfInsecure();
}
ColorDisplayService.ColorDisplayServiceInternal cds = LocalServices.getService(

View File

@@ -28,6 +28,7 @@ import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_W
import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS;
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_SUBTLE_WINDOW_ANIMATIONS;
@@ -407,6 +408,25 @@ class KeyguardController {
? topActivity.getRootTask() : null);
}
/**
* Called when keyguard going away state changed.
*/
private void handleKeyguardGoingAwayChanged(DisplayContent dc) {
mService.deferWindowLayout();
try {
dc.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY, 0 /* transitFlags */);
// We are deprecating TRANSIT_KEYGUARD_GOING_AWAY for Shell transition and use
// TRANSIT_FLAG_KEYGUARD_GOING_AWAY to indicate that it should animate keyguard going
// away.
dc.mAtmService.getTransitionController().requestTransitionIfNeeded(
TRANSIT_OPEN, TRANSIT_FLAG_KEYGUARD_GOING_AWAY, null /* trigger */, dc);
updateKeyguardSleepToken();
mWindowManager.executeAppTransition();
} finally {
mService.continueWindowLayout();
}
}
/**
* Called when somebody wants to dismiss the Keyguard via the flag.
*/
@@ -533,11 +553,13 @@ class KeyguardController {
}
/**
* Updates {@link #mOccluded}, {@link #mTopTurnScreenOnActivity} and
* {@link #mDismissingKeyguardActivity} if the top task could be visible.
* Updates keyguard status if the top task could be visible. The top task may occlude
* keyguard, request to dismiss keyguard or make insecure keyguard go away based on its
* properties.
*/
void updateVisibility(KeyguardController controller, DisplayContent display) {
final boolean lastOccluded = mOccluded;
final boolean lastKeyguardGoingAway = mKeyguardGoingAway;
final ActivityRecord lastDismissKeyguardActivity = mDismissingKeyguardActivity;
final ActivityRecord lastTurnScreenOnActivity = mTopTurnScreenOnActivity;
@@ -561,14 +583,18 @@ class KeyguardController {
mTopTurnScreenOnActivity = top;
}
final boolean showWhenLocked = top.canShowWhenLocked();
if (showWhenLocked) {
final boolean isKeyguardSecure = controller.mWindowManager.isKeyguardSecure(
controller.mService.getCurrentUserId());
if (top.mDismissKeyguardIfInsecure && mKeyguardShowing && !isKeyguardSecure) {
mKeyguardGoingAway = true;
} else if (top.canShowWhenLocked()) {
mTopOccludesActivity = top;
}
// Only the top activity may control occluded, as we can't occlude the Keyguard
// if the top app doesn't want to occlude it.
occludedByActivity = showWhenLocked || (mDismissingKeyguardActivity != null
occludedByActivity = mTopOccludesActivity != null
|| (mDismissingKeyguardActivity != null
&& task.topRunningActivity() == mDismissingKeyguardActivity
&& controller.canShowWhileOccluded(
true /* dismissKeyguard */, false /* showWhenLocked */));
@@ -583,10 +609,8 @@ class KeyguardController {
&& top.getActivityType() == ACTIVITY_TYPE_DREAM);
mOccluded = mShowingDream || occludedByActivity;
mRequestDismissKeyguard = lastDismissKeyguardActivity != mDismissingKeyguardActivity
&& !mOccluded
&& mDismissingKeyguardActivity != null
&& controller.mWindowManager.isKeyguardSecure(
controller.mService.getCurrentUserId());
&& !mOccluded && !mKeyguardGoingAway
&& mDismissingKeyguardActivity != null;
if (mTopTurnScreenOnActivity != lastTurnScreenOnActivity
&& mTopTurnScreenOnActivity != null
@@ -598,6 +622,8 @@ class KeyguardController {
if (lastOccluded != mOccluded) {
controller.handleOccludedChanged(mDisplayId, mTopOccludesActivity);
} else if (!lastKeyguardGoingAway && mKeyguardGoingAway) {
controller.handleKeyguardGoingAwayChanged(display);
}
}