diff options
author | Haamed Gheibi <haamed@google.com> | 2022-02-17 16:39:34 -0800 |
---|---|---|
committer | Haamed Gheibi <haamed@google.com> | 2022-03-09 12:19:41 -0800 |
commit | c9d2a0773a94b88af0cea18de6088b339f657aa1 (patch) | |
tree | de48396f91999d4e8300baa33bf4bd91fb7c2cc4 /quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java | |
parent | 6ecf1ab0470bc03accf565ee0955e78f487a32ab (diff) | |
parent | af3034c3ce25f268fb8279dc3eb611418ee57f42 (diff) |
Merge SP2A.220305.013
Bug: 220074017
Change-Id: I629588f9ba870d5920d6f2477ed657975a7c4d9e
Diffstat (limited to 'quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java')
-rw-r--r-- | quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java | 141 |
1 files changed, 123 insertions, 18 deletions
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java index 3b5afad691..d23336505a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java @@ -16,13 +16,18 @@ package com.android.launcher3.taskbar; -import static android.view.Display.DEFAULT_DISPLAY; -import android.content.Intent; -import android.view.inputmethod.InputMethodManager; +import static com.android.internal.app.AssistUtils.INVOCATION_TYPE_HOME_BUTTON_LONG_PRESS; +import static com.android.internal.app.AssistUtils.INVOCATION_TYPE_KEY; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; + +import android.os.Bundle; +import android.os.Handler; import androidx.annotation.IntDef; +import com.android.launcher3.testing.TestLogging; +import com.android.launcher3.testing.TestProtocol; import com.android.quickstep.OverviewCommandHelper; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TouchInteractionService; @@ -34,17 +39,23 @@ import java.lang.annotation.RetentionPolicy; * Controller for 3 button mode in the taskbar. * Handles all the functionality of the various buttons, making/routing the right calls into * launcher or sysui/system. - * - * TODO: Create callbacks to hook into UI layer since state will change for more context buttons/ - * assistant invocation. */ public class TaskbarNavButtonController { + + /** Allow some time in between the long press for back and recents. */ + static final int SCREEN_PIN_LONG_PRESS_THRESHOLD = 200; + static final int SCREEN_PIN_LONG_PRESS_RESET = SCREEN_PIN_LONG_PRESS_THRESHOLD + 100; + + private long mLastScreenPinLongPress; + private boolean mScreenPinned; + @Retention(RetentionPolicy.SOURCE) @IntDef(value = { BUTTON_BACK, BUTTON_HOME, BUTTON_RECENTS, - BUTTON_IME_SWITCH + BUTTON_IME_SWITCH, + BUTTON_A11Y, }) public @interface TaskbarButton {} @@ -53,11 +64,22 @@ public class TaskbarNavButtonController { static final int BUTTON_HOME = BUTTON_BACK << 1; static final int BUTTON_RECENTS = BUTTON_HOME << 1; static final int BUTTON_IME_SWITCH = BUTTON_RECENTS << 1; + static final int BUTTON_A11Y = BUTTON_IME_SWITCH << 1; + + private static final int SCREEN_UNPIN_COMBO = BUTTON_BACK | BUTTON_RECENTS; + private int mLongPressedButtons = 0; private final TouchInteractionService mService; + private final SystemUiProxy mSystemUiProxy; + private final Handler mHandler; + + private final Runnable mResetLongPress = this::resetScreenUnpin; - public TaskbarNavButtonController(TouchInteractionService service) { + public TaskbarNavButtonController(TouchInteractionService service, + SystemUiProxy systemUiProxy, Handler handler) { mService = service; + mSystemUiProxy = systemUiProxy; + mHandler = handler; } public void onButtonClick(@TaskbarButton int buttonType) { @@ -69,32 +91,115 @@ public class TaskbarNavButtonController { navigateHome(); break; case BUTTON_RECENTS: - navigateToOverview();; + navigateToOverview(); break; case BUTTON_IME_SWITCH: showIMESwitcher(); break; + case BUTTON_A11Y: + notifyA11yClick(false /* longClick */); + break; + } + } + + public boolean onButtonLongClick(@TaskbarButton int buttonType) { + switch (buttonType) { + case BUTTON_HOME: + startAssistant(); + return true; + case BUTTON_A11Y: + notifyA11yClick(true /* longClick */); + return true; + case BUTTON_BACK: + case BUTTON_RECENTS: + mLongPressedButtons |= buttonType; + return determineScreenUnpin(); + case BUTTON_IME_SWITCH: + default: + return false; + } + } + + /** + * Checks if the user has long pressed back and recents buttons + * "together" (within {@link #SCREEN_PIN_LONG_PRESS_THRESHOLD})ms + * If so, then requests the system to turn off screen pinning. + * + * @return true if the long press is a valid user action in attempting to unpin an app + * Will always return {@code false} when screen pinning is not active. + * NOTE: Returning true does not mean that screen pinning has stopped + */ + private boolean determineScreenUnpin() { + long timeNow = System.currentTimeMillis(); + if (!mScreenPinned) { + return false; + } + + if (mLastScreenPinLongPress == 0) { + // First button long press registered, just mark time and wait for second button press + mLastScreenPinLongPress = System.currentTimeMillis(); + mHandler.postDelayed(mResetLongPress, SCREEN_PIN_LONG_PRESS_RESET); + return true; + } + + if ((timeNow - mLastScreenPinLongPress) > SCREEN_PIN_LONG_PRESS_THRESHOLD) { + // Too long in-between presses, reset the clock + resetScreenUnpin(); + return false; } + + if ((mLongPressedButtons & SCREEN_UNPIN_COMBO) == SCREEN_UNPIN_COMBO) { + // Hooray! They did it (finally...) + mSystemUiProxy.stopScreenPinning(); + mHandler.removeCallbacks(mResetLongPress); + resetScreenUnpin(); + } + return true; + } + + private void resetScreenUnpin() { + mLongPressedButtons = 0; + mLastScreenPinLongPress = 0; + } + + public void updateSysuiFlags(int sysuiFlags) { + mScreenPinned = (sysuiFlags & SYSUI_STATE_SCREEN_PINNING) != 0; } private void navigateHome() { - mService.startActivity(new Intent(Intent.ACTION_MAIN) - .addCategory(Intent.CATEGORY_HOME) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + mService.getOverviewCommandHelper().addCommand(OverviewCommandHelper.TYPE_HOME); } private void navigateToOverview() { - mService.getOverviewCommandHelper() - .addCommand(OverviewCommandHelper.TYPE_SHOW); + if (mScreenPinned) { + return; + } + TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "onOverviewToggle"); + mService.getOverviewCommandHelper().addCommand(OverviewCommandHelper.TYPE_TOGGLE); } private void executeBack() { - SystemUiProxy.INSTANCE.getNoCreate().onBackPressed(); + mSystemUiProxy.onBackPressed(); } private void showIMESwitcher() { - mService.getSystemService(InputMethodManager.class) - .showInputMethodPickerFromSystem(true /* showAuxiliarySubtypes */, - DEFAULT_DISPLAY); + mSystemUiProxy.onImeSwitcherPressed(); + } + + private void notifyA11yClick(boolean longClick) { + if (longClick) { + mSystemUiProxy.notifyAccessibilityButtonLongClicked(); + } else { + mSystemUiProxy.notifyAccessibilityButtonClicked(mService.getDisplayId()); + } + } + + private void startAssistant() { + if (mScreenPinned) { + return; + } + Bundle args = new Bundle(); + args.putInt(INVOCATION_TYPE_KEY, INVOCATION_TYPE_HOME_BUTTON_LONG_PRESS); + mSystemUiProxy.startAssistant(args); } } |