From 077c29e091eda63771bea79359f739e94b586870 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Wed, 20 Feb 2019 16:43:12 -0800 Subject: [PATCH] Added assistant gesture swipe up right side region on nav bar Bug: 112934365 Test: manual Change-Id: I467e71f13da4afba3a556fafb0bfdf01650ab4bf --- quickstep/libs/sysui_shared.jar | Bin 155367 -> 156127 bytes .../quickstep/AssistantTouchConsumer.java | 195 ++++++++++++++++++ .../quickstep/TouchInteractionService.java | 5 + quickstep/res/values/dimens.xml | 4 + .../android/launcher3/config/BaseFlags.java | 4 + 5 files changed, 208 insertions(+) create mode 100644 quickstep/recents_ui_overrides/src/com/android/quickstep/AssistantTouchConsumer.java diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 8c58e3ed5970f5fdd0bef90599f4b837c8272be6..2b76924ca67b9e62ceb2e873dd268332764dcbe4 100644 GIT binary patch delta 9250 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 E1C4^DuK)l5 delta 8413 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 E2U!>(ng9R* diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/AssistantTouchConsumer.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/AssistantTouchConsumer.java new file mode 100644 index 0000000000..e02c6960a4 --- /dev/null +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/AssistantTouchConsumer.java @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2019 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; + +import static android.view.MotionEvent.ACTION_CANCEL; +import static android.view.MotionEvent.ACTION_DOWN; +import static android.view.MotionEvent.ACTION_MOVE; +import static android.view.MotionEvent.ACTION_POINTER_UP; +import static android.view.MotionEvent.ACTION_UP; + +import android.content.Context; +import android.graphics.PointF; +import android.graphics.Rect; +import android.os.Bundle; +import android.os.RemoteException; +import android.os.SystemClock; +import android.util.Log; +import android.view.Display; +import android.view.MotionEvent; +import android.view.Surface; +import android.view.ViewConfiguration; +import android.view.WindowManager; +import com.android.systemui.shared.recents.ISystemUiProxy; +import com.android.systemui.shared.system.NavigationBarCompat; +import com.android.systemui.shared.system.WindowManagerWrapper; +import com.android.launcher3.R; + +/** + * Touch consumer for handling events to launch assistant from launcher + */ +public class AssistantTouchConsumer implements InputConsumer { + private static final String TAG = "AssistantTouchConsumer"; + + private final PointF mDownPos = new PointF(); + private final PointF mLastPos = new PointF(); + private int mActivePointerId = -1; + + private final int mDisplayRotation; + private final Rect mStableInsets = new Rect(); + + private final float mDragSlop; + private final float mTouchSlop; + private final float mThreshold; + + private float mStartDisplacement; + private boolean mPassedDragSlop; + private boolean mPassedTouchSlop; + private long mPassedTouchSlopTime; + private boolean mLaunchedAssistant; + private float mLastProgress; + + private final ISystemUiProxy mSysUiProxy; + + public AssistantTouchConsumer(Context context, ISystemUiProxy systemUiProxy) { + mSysUiProxy = systemUiProxy; + + mDragSlop = NavigationBarCompat.getQuickStepDragSlopPx(); + mTouchSlop = NavigationBarCompat.getQuickStepTouchSlopPx(); + mThreshold = context.getResources().getDimension(R.dimen.gestures_assistant_threshold); + + Display display = context.getSystemService(WindowManager.class).getDefaultDisplay(); + mDisplayRotation = display.getRotation(); + WindowManagerWrapper.getInstance().getStableInsets(mStableInsets); + } + + @Override + public void onMotionEvent(MotionEvent ev) { + // TODO add logging + switch (ev.getActionMasked()) { + case ACTION_DOWN: { + mActivePointerId = ev.getPointerId(0); + mDownPos.set(ev.getX(), ev.getY()); + mLastPos.set(mDownPos); + mLastProgress = -1; + break; + } + case ACTION_POINTER_UP: { + int ptrIdx = ev.getActionIndex(); + int ptrId = ev.getPointerId(ptrIdx); + if (ptrId == mActivePointerId) { + final int newPointerIdx = ptrIdx == 0 ? 1 : 0; + mDownPos.set( + ev.getX(newPointerIdx) - (mLastPos.x - mDownPos.x), + ev.getY(newPointerIdx) - (mLastPos.y - mDownPos.y)); + mLastPos.set(ev.getX(newPointerIdx), ev.getY(newPointerIdx)); + mActivePointerId = ev.getPointerId(newPointerIdx); + } + break; + } + case ACTION_MOVE: { + int pointerIndex = ev.findPointerIndex(mActivePointerId); + if (pointerIndex == -1) { + break; + } + mLastPos.set(ev.getX(pointerIndex), ev.getY(pointerIndex)); + float displacement = getDisplacement(ev); + + if (!mPassedDragSlop) { + // Normal gesture, ensure we pass the drag slop before we start tracking + // the gesture + if (Math.abs(displacement) > mDragSlop) { + mPassedDragSlop = true; + mStartDisplacement = displacement; + mPassedTouchSlopTime = SystemClock.uptimeMillis(); + } + } + + if (!mPassedTouchSlop) { + if (Math.hypot(mLastPos.x - mDownPos.x, mLastPos.y - mDownPos.y) >= + mTouchSlop) { + mPassedTouchSlop = true; + if (!mPassedDragSlop) { + mPassedDragSlop = true; + mStartDisplacement = displacement; + mPassedTouchSlopTime = SystemClock.uptimeMillis(); + } + } + } + + if (mPassedDragSlop) { + // Move + float distance = mStartDisplacement - displacement; + if (distance >= 0) { + onAssistantProgress(distance / mThreshold); + } + } + break; + } + case ACTION_CANCEL: + break; + case ACTION_UP: { + if (ev.getEventTime() - mPassedTouchSlopTime < ViewConfiguration.getTapTimeout()) { + onAssistantProgress(1); + } + + break; + } + } + } + + private void onAssistantProgress(float progress) { + if (mLastProgress == progress) { + return; + } + try { + mSysUiProxy.onAssistantProgress(Math.max(0, Math.min(1, progress))); + if (progress >= 1 && !mLaunchedAssistant) { + mSysUiProxy.startAssistant(new Bundle()); + mLaunchedAssistant = true; + } + mLastProgress = progress; + } catch (RemoteException e) { + Log.w(TAG, "Failed to notify SysUI to start/send assistant progress: " + progress, e); + } + } + + private boolean isNavBarOnRight() { + return mDisplayRotation == Surface.ROTATION_90 && mStableInsets.right > 0; + } + + private boolean isNavBarOnLeft() { + return mDisplayRotation == Surface.ROTATION_270 && mStableInsets.left > 0; + } + + private float getDisplacement(MotionEvent ev) { + float eventX = ev.getX(); + float eventY = ev.getY(); + float displacement = eventY - mDownPos.y; + if (isNavBarOnRight()) { + displacement = eventX - mDownPos.x; + } else if (isNavBarOnLeft()) { + displacement = mDownPos.x - eventX; + } + return displacement; + } + + static boolean withinTouchRegion(Context context, float x) { + return x > context.getResources().getDisplayMetrics().widthPixels + - context.getResources().getDimension(R.dimen.gestures_assistant_width); + } +} diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java index cf50fc152f..d1d0e864df 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java @@ -44,6 +44,7 @@ import android.view.MotionEvent; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.Utilities; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.UiThreadHelper; import com.android.systemui.shared.recents.IOverviewProxy; @@ -307,6 +308,10 @@ public class TouchInteractionService extends Service { if (runningTaskInfo == null && !mSwipeSharedState.goingToLauncher) { return InputConsumer.NO_OP; + } else if (mOverviewInteractionState.isSwipeUpGestureEnabled() + && FeatureFlags.ENABLE_ASSISTANT_GESTURE.get() + && AssistantTouchConsumer.withinTouchRegion(this, event.getX())) { + return new AssistantTouchConsumer(this, mRecentsModel.getSystemUiProxy()); } else if (mSwipeSharedState.goingToLauncher || mOverviewComponentObserver.getActivityControlHelper().isResumed()) { return OverviewInputConsumer.newInstance( diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index 2626481c3d..f7126d0431 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -65,4 +65,8 @@ 16dp 24dp + + + 70dp + 200dp diff --git a/src/com/android/launcher3/config/BaseFlags.java b/src/com/android/launcher3/config/BaseFlags.java index 882529dc3c..1e19685bb0 100644 --- a/src/com/android/launcher3/config/BaseFlags.java +++ b/src/com/android/launcher3/config/BaseFlags.java @@ -112,6 +112,10 @@ abstract class BaseFlags { "ENABLE_HINTS_IN_OVERVIEW", false, "Show chip hints and gleams on the overview screen"); + public static final TogglableFlag ENABLE_ASSISTANT_GESTURE = new TogglableFlag( + "ENABLE_ASSISTANT_GESTURE", false, + "Enable swipe up from the bottom right corner to start assistant"); + public static void initialize(Context context) { // Avoid the disk read for user builds if (Utilities.IS_DEBUG_DEVICE) {