From eea784aea82efca6882d423e65c54b92058e32f6 Mon Sep 17 00:00:00 2001 From: Andreas Agvard Date: Tue, 16 May 2023 01:23:52 +0200 Subject: [PATCH] Adds an flag guarded extension point for long press nav handle behavior Bug: 282993230 Flag: ENABLE_LONG_PRESS_NAV_HANDLE disabled Test: Manual Change-Id: I541886cc13af1db46bc38d4e18556be99bef7713 --- quickstep/res/values/dimens.xml | 3 + quickstep/res/values/override.xml | 2 + .../com/android/quickstep/InputConsumer.java | 2 + .../quickstep/TouchInteractionService.java | 3 + .../NavHandleLongPressHandler.java | 44 +++++++++++ .../NavHandleLongPressInputConsumer.java | 78 +++++++++++++++++++ .../launcher3/config/FeatureFlags.java | 4 + 7 files changed, 136 insertions(+) create mode 100644 quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java create mode 100644 quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index c9f84c7159..0926b19b70 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -269,6 +269,9 @@ 20dp 10dp + + 108dp + @*android:dimen/taskbar_frame_height 48dp diff --git a/quickstep/res/values/override.xml b/quickstep/res/values/override.xml index 4f472f0625..73c4201a55 100644 --- a/quickstep/res/values/override.xml +++ b/quickstep/res/values/override.xml @@ -25,6 +25,8 @@ com.android.launcher3.model.QuickstepModelDelegate + + com.android.launcher3.secondarydisplay.SecondaryDisplayPredictionsImpl diff --git a/quickstep/src/com/android/quickstep/InputConsumer.java b/quickstep/src/com/android/quickstep/InputConsumer.java index 6b189cf4d6..207110328d 100644 --- a/quickstep/src/com/android/quickstep/InputConsumer.java +++ b/quickstep/src/com/android/quickstep/InputConsumer.java @@ -42,6 +42,7 @@ public interface InputConsumer { int TYPE_TASKBAR_STASH = 1 << 12; int TYPE_STATUS_BAR = 1 << 13; int TYPE_CURSOR_HOVER = 1 << 14; + int TYPE_NAV_HANDLE_LONG_PRESS = 1 << 15; String[] NAMES = new String[] { "TYPE_NO_OP", // 0 @@ -59,6 +60,7 @@ public interface InputConsumer { "TYPE_TASKBAR_STASH", // 12 "TYPE_STATUS_BAR", // 13 "TYPE_CURSOR_HOVER", // 14 + "TYPE_NAV_HANDLE_LONG_PRESS", // 15 }; InputConsumer NO_OP = () -> TYPE_NO_OP; diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 1ec1d2002b..bb679232a5 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -105,6 +105,7 @@ import com.android.launcher3.util.TraceHelper; import com.android.quickstep.inputconsumers.AccessibilityInputConsumer; import com.android.quickstep.inputconsumers.AssistantInputConsumer; import com.android.quickstep.inputconsumers.DeviceLockedInputConsumer; +import com.android.quickstep.inputconsumers.NavHandleLongPressInputConsumer; import com.android.quickstep.inputconsumers.OneHandedModeInputConsumer; import com.android.quickstep.inputconsumers.OtherActivityInputConsumer; import com.android.quickstep.inputconsumers.OverviewInputConsumer; @@ -884,6 +885,8 @@ public class TouchInteractionService extends Service + "using TaskbarUnstashInputConsumer"); base = new TaskbarUnstashInputConsumer(this, base, mInputMonitorCompat, tac); } + } else if (canStartSystemGesture && FeatureFlags.ENABLE_LONG_PRESS_NAV_HANDLE.get()) { + base = new NavHandleLongPressInputConsumer(this, base, mInputMonitorCompat); } if (mDeviceState.isBubblesExpanded()) { diff --git a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java new file mode 100644 index 0000000000..5c5b9ca785 --- /dev/null +++ b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.quickstep.inputconsumers; + +import android.content.Context; + +import com.android.launcher3.R; +import com.android.launcher3.util.ResourceBasedOverride; + +/** + * Class for extending nav handle long press behavior + */ +public class NavHandleLongPressHandler implements ResourceBasedOverride { + + /** Creates NavHandleLongPressHandler as specified by overrides */ + public static NavHandleLongPressHandler newInstance(Context context) { + return Overrides.getObject(NavHandleLongPressHandler.class, context, + R.string.nav_handle_long_press_handler_class); + } + + /** + * Called when nav handle is long pressed. + * + * @return if the long press was consumed, meaning other input consumers should receive a + * cancel event + */ + public boolean onLongPress() { + return false; + } +} diff --git a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java new file mode 100644 index 0000000000..542dea1699 --- /dev/null +++ b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.inputconsumers; + +import android.content.Context; +import android.view.GestureDetector; +import android.view.GestureDetector.SimpleOnGestureListener; +import android.view.MotionEvent; + +import com.android.launcher3.R; +import com.android.launcher3.util.DisplayController; +import com.android.quickstep.InputConsumer; +import com.android.systemui.shared.system.InputMonitorCompat; + +/** + * Listens for a long press + */ +public class NavHandleLongPressInputConsumer extends DelegateInputConsumer { + + private final GestureDetector mLongPressDetector; + private final NavHandleLongPressHandler mNavHandleLongPressHandler; + private final float mNavHandleWidth; + private final float mScreenWidth; + + public NavHandleLongPressInputConsumer(Context context, InputConsumer delegate, + InputMonitorCompat inputMonitor) { + super(delegate, inputMonitor); + mNavHandleWidth = context.getResources() + .getDimensionPixelSize(R.dimen.navigation_home_handle_width); + mScreenWidth = DisplayController.INSTANCE.get(context).getInfo().currentSize.x; + + mNavHandleLongPressHandler = NavHandleLongPressHandler.newInstance(context); + + mLongPressDetector = new GestureDetector(context, new SimpleOnGestureListener() { + @Override + public void onLongPress(MotionEvent motionEvent) { + if (isInArea(motionEvent.getRawX())) { + if (mNavHandleLongPressHandler.onLongPress()) { + setActive(motionEvent); + } + } + } + }); + } + + @Override + public int getType() { + return TYPE_NAV_HANDLE_LONG_PRESS | mDelegate.getType(); + } + + @Override + public void onMotionEvent(MotionEvent ev) { + mLongPressDetector.onTouchEvent(ev); + if (mState != STATE_ACTIVE) { + mDelegate.onMotionEvent(ev); + } + } + + protected boolean isInArea(float x) { + float areaFromMiddle = mNavHandleWidth / 2.0f; + float distFromMiddle = Math.abs(mScreenWidth / 2.0f - x); + + return distFromMiddle < areaFromMiddle; + } +} diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index dcc34ba5ad..265e5f1747 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -253,6 +253,10 @@ public final class FeatureFlags { "INJECT_FALLBACK_APP_CORPUS_RESULTS", DISABLED, "Inject fallback app corpus result when AiAi fails to return it."); + public static final BooleanFlag ENABLE_LONG_PRESS_NAV_HANDLE = + getDebugFlag(282993230, "ENABLE_LONG_PRESS_NAV_HANDLE", DISABLED, + "Enables long pressing on the bottom bar nav handle to trigger events."); + // TODO(Block 17): Clean up flags public static final BooleanFlag ENABLE_TASKBAR_PINNING = getDebugFlag(270396583, "ENABLE_TASKBAR_PINNING", DISABLED,