From 560d28e3a195caf68f16c8042e7f82afa3c81cff Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Fri, 4 Jun 2021 15:35:46 -0700 Subject: [PATCH] Initial commit of TaskBar on keyguard Bug: 180046394 Test: Tested with pin + keyboard + pattern Change-Id: I951d9508b1325c157a9c0d92fa8e77fe8df9c460 --- .../taskbar/LauncherTaskbarUIController.java | 11 ++ .../taskbar/NavbarButtonsViewController.java | 32 +++++- .../taskbar/TaskbarActivityContext.java | 11 +- .../launcher3/taskbar/TaskbarControllers.java | 7 +- .../taskbar/TaskbarKeyguardController.java | 104 ++++++++++++++++++ .../launcher3/taskbar/TaskbarManager.java | 8 +- .../taskbar/TaskbarViewController.java | 3 +- .../quickstep/TouchInteractionService.java | 2 +- 8 files changed, 163 insertions(+), 15 deletions(-) create mode 100644 quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index 9a836aa255..f4168d9f80 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -55,6 +55,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController { private AlphaProperty mIconAlphaForHome; private @Nullable Animator mAnimator; private boolean mIsAnimatingToLauncher; + private TaskbarKeyguardController mKeyguardController; public LauncherTaskbarUIController( BaseQuickstepLauncher launcher, TaskbarActivityContext context) { @@ -81,6 +82,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController { mHotseatController.init(); setTaskbarViewVisible(!mLauncher.hasBeenResumed()); mLauncher.setTaskbarUIController(this); + mKeyguardController = taskbarControllers.taskbarKeyguardController; } @Override @@ -117,6 +119,15 @@ public class LauncherTaskbarUIController extends TaskbarUIController { * Should be called from onResume() and onPause(), and animates the Taskbar accordingly. */ public void onLauncherResumedOrPaused(boolean isResumed) { + if (mKeyguardController.isScreenOff()) { + if (!isResumed) { + return; + } else { + // Resuming implicitly means device unlocked + mKeyguardController.setScreenOn(); + } + } + long duration = QuickstepTransitionManager.CONTENT_ALPHA_DURATION; if (mAnimator != null) { mAnimator.cancel(); diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index 2ae7d108ed..d40242c42c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -22,6 +22,7 @@ import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_HO import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_IME_SWITCH; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_RECENTS; import static com.android.launcher3.taskbar.TaskbarViewController.ALPHA_INDEX_IME; +import static com.android.launcher3.taskbar.TaskbarViewController.ALPHA_INDEX_KEYGUARD; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_CLICKABLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING; @@ -65,6 +66,8 @@ public class NavbarButtonsViewController { private static final int FLAG_IME_VISIBLE = 1 << 1; private static final int FLAG_ROTATION_BUTTON_VISIBLE = 1 << 2; private static final int FLAG_A11Y_VISIBLE = 1 << 3; + private static final int FLAG_ONLY_BACK_FOR_BOUNCER_VISIBLE = 1 << 4; + private static final int FLAG_KEYGUARD_VISIBLE = 1 << 5; private static final int MASK_IME_SWITCHER_VISIBLE = FLAG_SWITCHER_SUPPORTED | FLAG_IME_VISIBLE; @@ -114,6 +117,10 @@ public class NavbarButtonsViewController { mControllers.taskbarViewController.getTaskbarIconAlpha() .getProperty(ALPHA_INDEX_IME), flags -> (flags & FLAG_IME_VISIBLE) == 0, MultiValueAlpha.VALUE, 1, 0)); + mPropertyHolders.add(new StatePropertyHolder( + mControllers.taskbarViewController.getTaskbarIconAlpha() + .getProperty(ALPHA_INDEX_KEYGUARD), + flags -> (flags & FLAG_KEYGUARD_VISIBLE) == 0, MultiValueAlpha.VALUE, 1, 0)); // Rotation button RotationButton rotationButton = new RotationButtonImpl(addButton(mEndContainer)); @@ -136,16 +143,21 @@ public class NavbarButtonsViewController { mPropertyHolders.add(new StatePropertyHolder(backButton, flags -> (flags & FLAG_IME_VISIBLE) == 0, View.ROTATION, 0, Utilities.isRtl(mContext.getResources()) ? 90 : -90)); + mPropertyHolders.add(new StatePropertyHolder(backButton, + flags -> (flags & FLAG_KEYGUARD_VISIBLE) == 0 || + (flags & FLAG_ONLY_BACK_FOR_BOUNCER_VISIBLE) != 0)); // home and recents buttons View homeButton = addButton(R.drawable.ic_sysbar_home, BUTTON_HOME, startContainer, navButtonController); mPropertyHolders.add(new StatePropertyHolder(homeButton, - flags -> (flags & FLAG_IME_VISIBLE) == 0)); + flags -> (flags & FLAG_IME_VISIBLE) == 0 && + (flags & FLAG_KEYGUARD_VISIBLE) == 0)); View recentsButton = addButton(R.drawable.ic_sysbar_recent, BUTTON_RECENTS, startContainer, navButtonController); mPropertyHolders.add(new StatePropertyHolder(recentsButton, - flags -> (flags & FLAG_IME_VISIBLE) == 0)); + flags -> (flags & FLAG_IME_VISIBLE) == 0 && + (flags & FLAG_KEYGUARD_VISIBLE) == 0)); // IME switcher View imeSwitcherButton = addButton(R.drawable.ic_ime_switcher, BUTTON_IME_SWITCH, @@ -183,6 +195,22 @@ public class NavbarButtonsViewController { applyState(); } + /** + * Should be called when we need to show back button for bouncer + */ + public void setBackForBouncer(boolean isBouncerVisible) { + updateStateForFlag(FLAG_ONLY_BACK_FOR_BOUNCER_VISIBLE, isBouncerVisible); + applyState(); + } + + /** + * Slightly misnamed, but should be called when only keyguard OR AOD is showing + */ + public void setKeyguardVisible(boolean isKeyguardVisible) { + updateStateForFlag(FLAG_KEYGUARD_VISIBLE, isKeyguardVisible); + applyState(); + } + /** * Returns true if IME bar is visible */ diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 6e477000dd..2a0fbbb1bc 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -18,6 +18,7 @@ package com.android.launcher3.taskbar; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; +import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; import static com.android.systemui.shared.system.WindowManagerWrapper.ITYPE_BOTTOM_TAPPABLE_ELEMENT; import static com.android.systemui.shared.system.WindowManagerWrapper.ITYPE_EXTRA_NAVIGATION_BAR; @@ -121,7 +122,8 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ new RotationButtonController(this, R.color.popup_color_primary_light, R.color.popup_color_primary_light), new TaskbarDragLayerController(this, mDragLayer), - new TaskbarViewController(this, taskbarView)); + new TaskbarViewController(this, taskbarView), + new TaskbarKeyguardController(this)); Display display = windowContext.getDisplay(); Context c = display.getDisplayId() == Display.DEFAULT_DISPLAY @@ -135,7 +137,7 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ mWindowLayoutParams = new WindowManager.LayoutParams( MATCH_PARENT, mLastRequestedNonFullscreenHeight, - TYPE_APPLICATION_OVERLAY, + TYPE_NAVIGATION_BAR_PANEL, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); mWindowLayoutParams.setTitle(WINDOW_TITLE); @@ -144,7 +146,6 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ mWindowLayoutParams.setFitInsetsTypes(0); mWindowLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; mWindowLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; - mWindowLayoutParams.setSystemApplicationOverlay(true); WindowManagerWrapper wmWrapper = WindowManagerWrapper.getInstance(); wmWrapper.setProvidesInsetsTypes( @@ -213,17 +214,19 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ systemUiStateFlags, forceUpdate); mControllers.taskbarViewController.setImeIsVisible( mControllers.navbarButtonsViewController.isImeVisible()); + mControllers.taskbarKeyguardController.updateStateForSysuiFlags(systemUiStateFlags); } public void onRotationProposal(int rotation, boolean isValid) { mControllers.rotationButtonController.onRotationProposal(rotation, isValid); } - public void disable(int displayId, int state1, int state2, boolean animate) { + public void disableNavBarElements(int displayId, int state1, int state2, boolean animate) { if (displayId != getDisplayId()) { return; } mControllers.rotationButtonController.onDisable2FlagChanged(state2); + mControllers.taskbarKeyguardController.disableNavbarElements(state1, state2); } public void onSystemBarAttributesChanged(int displayId, int behavior) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java index 7712ffef55..157053efdd 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java @@ -31,6 +31,7 @@ public class TaskbarControllers { public final RotationButtonController rotationButtonController; public final TaskbarDragLayerController taskbarDragLayerController; public final TaskbarViewController taskbarViewController; + public final TaskbarKeyguardController taskbarKeyguardController; /** Do not store this controller, as it may change at runtime. */ @NonNull public TaskbarUIController uiController = TaskbarUIController.DEFAULT; @@ -41,7 +42,8 @@ public class TaskbarControllers { NavbarButtonsViewController navbarButtonsViewController, RotationButtonController rotationButtonController, TaskbarDragLayerController taskbarDragLayerController, - TaskbarViewController taskbarViewController) { + TaskbarViewController taskbarViewController, + TaskbarKeyguardController taskbarKeyguardController) { this.taskbarActivityContext = taskbarActivityContext; this.taskbarDragController = taskbarDragController; this.navButtonController = navButtonController; @@ -49,6 +51,7 @@ public class TaskbarControllers { this.rotationButtonController = rotationButtonController; this.taskbarDragLayerController = taskbarDragLayerController; this.taskbarViewController = taskbarViewController; + this.taskbarKeyguardController = taskbarKeyguardController; } /** @@ -63,6 +66,7 @@ public class TaskbarControllers { } taskbarDragLayerController.init(this); taskbarViewController.init(this); + taskbarKeyguardController.init(navbarButtonsViewController); } /** @@ -72,5 +76,6 @@ public class TaskbarControllers { uiController.onDestroy(); rotationButtonController.onDestroy(); taskbarDragLayerController.onDestroy(); + taskbarKeyguardController.onDestroy(); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java new file mode 100644 index 0000000000..b7799d8149 --- /dev/null +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java @@ -0,0 +1,104 @@ +package com.android.launcher3.taskbar; + +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DOZING; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING; + +import android.app.KeyguardManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.view.View; + +/** + * Controller for managing keyguard state for taskbar + */ +public class TaskbarKeyguardController { + + private static final int KEYGUARD_SYSUI_FLAGS = SYSUI_STATE_BOUNCER_SHOWING | + SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING | SYSUI_STATE_DEVICE_DOZING; + + private final TaskbarActivityContext mContext; + private int mDisabledNavIcons; + private int mKeyguardSysuiFlags; + private boolean mBouncerShowing; + private NavbarButtonsViewController mNavbarButtonsViewController; + private final KeyguardManager mKeyguardManager; + private boolean mIsScreenOff; + + private final BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + mIsScreenOff = true; + } + }; + + public TaskbarKeyguardController(TaskbarActivityContext context) { + mContext = context; + mKeyguardManager = mContext.getSystemService(KeyguardManager.class); + } + + public void init(NavbarButtonsViewController navbarButtonUIController) { + mNavbarButtonsViewController = navbarButtonUIController; + mContext.registerReceiver(mScreenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); + } + + public void updateStateForSysuiFlags(int systemUiStateFlags) { + boolean bouncerShowing = (systemUiStateFlags & SYSUI_STATE_BOUNCER_SHOWING) != 0; + boolean keyguardShowing = (systemUiStateFlags & SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING) + != 0; + boolean dozing = (systemUiStateFlags & SYSUI_STATE_DEVICE_DOZING) != 0; + + int interestingKeyguardFlags = systemUiStateFlags & KEYGUARD_SYSUI_FLAGS; + if (interestingKeyguardFlags == mKeyguardSysuiFlags) { + return; + } + mKeyguardSysuiFlags = interestingKeyguardFlags; + + mBouncerShowing = bouncerShowing; + if (!mContext.canShowNavButtons()) { + // For gesture nav we don't need to deal with bouncer or showing taskbar when locked + return; + } + + mNavbarButtonsViewController.setKeyguardVisible(keyguardShowing || dozing); + updateIconsForBouncer(); + } + + public boolean isScreenOff() { + return mIsScreenOff; + } + + public void setScreenOn() { + mIsScreenOff = false; + } + + public void disableNavbarElements(int state1, int state2) { + if (mDisabledNavIcons == state1) { + // no change + return; + } + mDisabledNavIcons = state1; + updateIconsForBouncer(); + } + + /** + * Hides/shows taskbar when keyguard is up + */ + private void updateIconsForBouncer() { + boolean disableBack = (mDisabledNavIcons & View.STATUS_BAR_DISABLE_BACK) != 0; + boolean disableRecent = (mDisabledNavIcons & View.STATUS_BAR_DISABLE_RECENT) != 0; + boolean disableHome = (mDisabledNavIcons & View.STATUS_BAR_DISABLE_HOME) != 0; + boolean onlyBackEnabled = !disableBack && disableRecent && disableHome; + + boolean showBackForBouncer = onlyBackEnabled && + mKeyguardManager.isDeviceSecure() && + mBouncerShowing; + mNavbarButtonsViewController.setBackForBouncer(showBackForBouncer); + } + + public void onDestroy() { + mContext.unregisterReceiver(mScreenOffReceiver); + } +} diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java index 3563d09573..9f5ea50480 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java @@ -136,10 +136,6 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen onSysuiFlagsChangedInternal(mSysuiStateFlags, true /* forceUpdate */); } - /** - * See {@link com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags} - * @param systemUiStateFlags The latest SystemUiStateFlags - */ public void onSystemUiFlagsChanged(int systemUiStateFlags) { onSysuiFlagsChangedInternal(systemUiStateFlags, false /* forceUpdate */); } @@ -157,9 +153,9 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen } } - public void disable(int displayId, int state1, int state2, boolean animate) { + public void disableNavBarElements(int displayId, int state1, int state2, boolean animate) { if (mTaskbarActivityContext != null) { - mTaskbarActivityContext.disable(displayId, state1, state2, animate); + mTaskbarActivityContext.disableNavBarElements(displayId, state1, state2, animate); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index b6184c962b..10cc926759 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -27,6 +27,7 @@ public class TaskbarViewController { public static final int ALPHA_INDEX_HOME = 0; public static final int ALPHA_INDEX_LAUNCHER_STATE = 1; public static final int ALPHA_INDEX_IME = 2; + public static final int ALPHA_INDEX_KEYGUARD = 3; private final TaskbarActivityContext mActivity; private final TaskbarView mTaskbarView; @@ -38,7 +39,7 @@ public class TaskbarViewController { public TaskbarViewController(TaskbarActivityContext activity, TaskbarView taskbarView) { mActivity = activity; mTaskbarView = taskbarView; - mTaskbarIconAlpha = new MultiValueAlpha(mTaskbarView, 3); + mTaskbarIconAlpha = new MultiValueAlpha(mTaskbarView, 4); mTaskbarIconAlpha.setUpdateVisibility(true); } diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index a3136c7dd8..47ca3d2024 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -274,7 +274,7 @@ public class TouchInteractionService extends Service implements PluginListener mTaskbarManager - .disable(displayId, state1, state2, animate)); + .disableNavBarElements(displayId, state1, state2, animate)); } @Override