diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2018-03-08 14:20:32 -0800 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2018-03-12 10:48:51 -0700 |
commit | 773bf8fbd0e2383f232a43c35115e1df59e1317d (patch) | |
tree | ac0eddc0c24b1e2da65560760c2e69486afdf67b /quickstep | |
parent | 446aa8c1229b56872aceccb66109dcfbe214e6c0 (diff) | |
download | android_packages_apps_Trebuchet-773bf8fbd0e2383f232a43c35115e1df59e1317d.tar.gz android_packages_apps_Trebuchet-773bf8fbd0e2383f232a43c35115e1df59e1317d.tar.bz2 android_packages_apps_Trebuchet-773bf8fbd0e2383f232a43c35115e1df59e1317d.zip |
Initial changes for handling overview button in Launcher
Adding a debug flag to show the overview button and placeholder methods
for handling the callbacks
Change-Id: I35055e768d96b43b835bac2eb146e47850a7f4b1
Diffstat (limited to 'quickstep')
-rw-r--r-- | quickstep/libs/sysui_shared.jar | bin | 117015 -> 117505 bytes | |||
-rw-r--r-- | quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java | 13 | ||||
-rw-r--r-- | quickstep/src/com/android/quickstep/OverviewCommandHelper.java | 111 | ||||
-rw-r--r-- | quickstep/src/com/android/quickstep/OverviewInteractionState.java | 4 | ||||
-rw-r--r-- | quickstep/src/com/android/quickstep/RecentsModel.java | 1 | ||||
-rw-r--r-- | quickstep/src/com/android/quickstep/TouchInteractionService.java | 43 |
6 files changed, 144 insertions, 28 deletions
diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar Binary files differindex 6e62add8e..dbc2763cd 100644 --- a/quickstep/libs/sysui_shared.jar +++ b/quickstep/libs/sysui_shared.jar diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index 73cd50308..9b2e82264 100644 --- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java +++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java @@ -23,8 +23,10 @@ import static android.view.MotionEvent.ACTION_UP; import static android.view.MotionEvent.INVALID_POINTER_ID; import static com.android.quickstep.RemoteRunnable.executeSafely; +import static com.android.quickstep.TouchInteractionService.DEBUG_SHOW_OVERVIEW_BUTTON; import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK; import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_NONE; +import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_OVERVIEW; import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityOptions; @@ -61,6 +63,7 @@ import com.android.systemui.shared.system.RecentsAnimationListener; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.WindowManagerWrapper; +import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -71,6 +74,8 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC private static final String TAG = "ActivityTouchConsumer"; private static final long LAUNCHER_DRAW_TIMEOUT_MS = 150; + private static final int[] DEFERRED_HIT_TARGETS = DEBUG_SHOW_OVERVIEW_BUTTON + ? new int[] {HIT_TARGET_BACK, HIT_TARGET_OVERVIEW} : new int[] {HIT_TARGET_BACK}; private final RunningTaskInfo mRunningTask; private final RecentsModel mRecentsModel; @@ -79,6 +84,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC private final MainThreadExecutor mMainThreadExecutor; private final Choreographer mBackgroundThreadChoreographer; + private final boolean mIsDeferredDownTarget; private final PointF mDownPos = new PointF(); private final PointF mLastPos = new PointF(); private int mActivePointerId = INVALID_POINTER_ID; @@ -88,7 +94,6 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC private BaseSwipeInteractionHandler mInteractionHandler; private int mDisplayRotation; private Rect mStableInsets = new Rect(); - private @HitTarget int mDownHitTarget = HIT_TARGET_NONE; private VelocityTracker mVelocityTracker; private MotionEventQueue mEventQueue; @@ -105,7 +110,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC mISystemUiProxy = systemUiProxy; mMainThreadExecutor = mainThreadExecutor; mBackgroundThreadChoreographer = backgroundThreadChoreographer; - mDownHitTarget = downHitTarget; + mIsDeferredDownTarget = Arrays.binarySearch(DEFERRED_HIT_TARGETS, downHitTarget) >= 0; } @Override @@ -124,7 +129,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC // Start the window animation on down to give more time for launcher to draw if the // user didn't start the gesture over the back button - if (!isUsingScreenShot() && mDownHitTarget != HIT_TARGET_BACK) { + if (!isUsingScreenShot() && !mIsDeferredDownTarget) { startTouchTrackingForWindowAnimation(ev.getEventTime()); } @@ -166,7 +171,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC if (isUsingScreenShot()) { startTouchTrackingForScreenshotAnimation(); - } else if (mDownHitTarget == HIT_TARGET_BACK) { + } else if (mIsDeferredDownTarget) { // If we deferred starting the window animation on touch down, then // start tracking now startTouchTrackingForWindowAnimation(ev.getEventTime()); diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java new file mode 100644 index 000000000..b60d1e2dd --- /dev/null +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2018 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 com.android.launcher3.LauncherState.OVERVIEW; + +import android.annotation.TargetApi; +import android.app.ActivityManager.RecentTaskInfo; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ResolveInfo; +import android.os.Build; +import android.os.SystemClock; +import android.os.UserHandle; +import android.view.ViewConfiguration; + +import com.android.launcher3.AbstractFloatingView; +import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.states.InternalStateHandler; +import com.android.systemui.shared.system.ActivityManagerWrapper; + +/** + * Helper class to handle various atomic commands for switching between Overview. + */ +@TargetApi(Build.VERSION_CODES.P) +public class OverviewCommandHelper extends InternalStateHandler { + + private final Context mContext; + private final ActivityManagerWrapper mAM; + + public final Intent homeIntent; + public final ComponentName launcher; + + private long mLastToggleTime; + + public OverviewCommandHelper(Context context) { + mContext = context; + mAM = ActivityManagerWrapper.getInstance(); + + homeIntent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_HOME) + .setPackage(context.getPackageName()) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ResolveInfo info = context.getPackageManager().resolveActivity(homeIntent, 0); + launcher = new ComponentName(context.getPackageName(), info.activityInfo.name); + // Clear the packageName as system can fail to dedupe it b/64108432 + homeIntent.setComponent(launcher).setPackage(null); + } + + public void onOverviewToggle() { + long elapsedTime = SystemClock.elapsedRealtime() - mLastToggleTime; + mLastToggleTime = SystemClock.elapsedRealtime(); + + if (isOverviewAlmostVisible()) { + boolean isQuickTap = elapsedTime < ViewConfiguration.getDoubleTapTimeout(); + startNonLauncherTask(isQuickTap ? 2 : 1); + } else { + Intent intent = addToIntent(new Intent(homeIntent)); + mContext.startActivity(intent); + initWhenReady(); + } + } + + private void startNonLauncherTask(int backStackCount) { + for (RecentTaskInfo rti : mAM.getRecentTasks(backStackCount, UserHandle.myUserId())) { + backStackCount--; + if (backStackCount == 0) { + mAM.startActivityFromRecents(rti.id, null); + } + } + } + + private boolean isOverviewAlmostVisible() { + if (clearReference()) { + return true; + } + if (!mAM.getRunningTask().topActivity.equals(launcher)) { + return false; + } + Launcher launcher = getLauncher(); + return launcher != null && launcher.isStarted() && launcher.isInState(OVERVIEW); + } + + private Launcher getLauncher() { + return (Launcher) LauncherAppState.getInstance(mContext).getModel().getCallback(); + } + + @Override + protected boolean init(Launcher launcher, boolean alreadyOnHome) { + AbstractFloatingView.closeAllOpenViews(launcher, alreadyOnHome); + launcher.getStateManager().goToState(OVERVIEW, alreadyOnHome); + clearReference(); + return false; + } + +} diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index 3c68281a8..4af89bf46 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -15,7 +15,9 @@ */ package com.android.quickstep; +import static com.android.quickstep.TouchInteractionService.DEBUG_SHOW_OVERVIEW_BUTTON; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_HIDE_BACK_BUTTON; +import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON; import android.content.Context; import android.os.Handler; @@ -60,7 +62,7 @@ public class OverviewInteractionState { } }; - private static int sFlags; + private static int sFlags = DEBUG_SHOW_OVERVIEW_BUTTON ? FLAG_SHOW_OVERVIEW_BUTTON : 0; public static void setBackButtonVisible(Context context, boolean visible) { updateFlagOnUi(context, FLAG_HIDE_BACK_BUTTON, !visible); diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index 3e3b3b245..b4ce64666 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -31,7 +31,6 @@ import android.support.annotation.WorkerThread; import android.util.LruCache; import android.util.SparseArray; -import com.android.launcher3.Launcher; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.R; import com.android.launcher3.util.Preconditions; diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index e5af3e51b..12c21701c 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -23,15 +23,12 @@ import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; import static com.android.launcher3.LauncherState.FAST_OVERVIEW; -import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.quickstep.QuickScrubController.QUICK_SWITCH_START_DURATION; import android.annotation.TargetApi; import android.app.ActivityManager.RunningTaskInfo; import android.app.Service; -import android.content.ComponentName; import android.content.Intent; -import android.content.pm.ResolveInfo; import android.graphics.PointF; import android.os.Build; import android.os.Handler; @@ -62,6 +59,8 @@ import com.android.systemui.shared.system.NavigationBarCompat.HitTarget; @TargetApi(Build.VERSION_CODES.O) public class TouchInteractionService extends Service { + public static final boolean DEBUG_SHOW_OVERVIEW_BUTTON = false; + private static final SparseArray<String> sMotionEventNames; static { @@ -132,6 +131,17 @@ public class TouchInteractionService extends Service { mEventQueue.onQuickScrubEnd(); TraceHelper.endSection("SysUiBinder", "onQuickScrubEnd"); } + + @Override + public void onOverviewToggle() { + mOverviewCommandHelper.onOverviewToggle(); + } + + @Override + public void onOverviewShown(boolean triggeredFromAltTab) { } + + @Override + public void onOverviewHidden(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { } }; private final TouchConsumer mNoOpTouchConsumer = (ev) -> {}; @@ -143,13 +153,11 @@ public class TouchInteractionService extends Service { } private ActivityManagerWrapper mAM; - private RunningTaskInfo mRunningTask; private RecentsModel mRecentsModel; - private Intent mHomeIntent; - private ComponentName mLauncher; private MotionEventQueue mEventQueue; private MainThreadExecutor mMainThreadExecutor; private ISystemUiProxy mISystemUiProxy; + private OverviewCommandHelper mOverviewCommandHelper; private Choreographer mMainThreadChoreographer; private Choreographer mBackgroundThreadChoreographer; @@ -161,16 +169,7 @@ public class TouchInteractionService extends Service { mAM = ActivityManagerWrapper.getInstance(); mRecentsModel = RecentsModel.getInstance(this); mMainThreadExecutor = new MainThreadExecutor(); - - mHomeIntent = new Intent(Intent.ACTION_MAIN) - .addCategory(Intent.CATEGORY_HOME) - .setPackage(getPackageName()) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - ResolveInfo info = getPackageManager().resolveActivity(mHomeIntent, 0); - mLauncher = new ComponentName(getPackageName(), info.activityInfo.name); - // Clear the packageName as system can fail to dedupe it b/64108432 - mHomeIntent.setComponent(mLauncher).setPackage(null); - + mOverviewCommandHelper = new OverviewCommandHelper(this); mMainThreadChoreographer = Choreographer.getInstance(); mNoOpEventQueue = new MotionEventQueue(mMainThreadChoreographer, mNoOpTouchConsumer); mEventQueue = mNoOpEventQueue; @@ -195,19 +194,19 @@ public class TouchInteractionService extends Service { } private void onBinderPreMotionEvent(@HitTarget int downHitTarget) { - mRunningTask = mAM.getRunningTask(); + RunningTaskInfo runningTaskInfo = mAM.getRunningTask(); mEventQueue.reset(); - if (mRunningTask == null) { + if (runningTaskInfo == null) { mEventQueue = mNoOpEventQueue; - } else if (mRunningTask.topActivity.equals(mLauncher)) { + } else if (runningTaskInfo.topActivity.equals(mOverviewCommandHelper.launcher)) { mEventQueue = getLauncherEventQueue(); } else { mEventQueue = new MotionEventQueue(mMainThreadChoreographer, - new OtherActivityTouchConsumer(this, mRunningTask, mRecentsModel, - mHomeIntent, mISystemUiProxy, mMainThreadExecutor, - mBackgroundThreadChoreographer, downHitTarget)); + new OtherActivityTouchConsumer(this, runningTaskInfo, mRecentsModel, + mOverviewCommandHelper.homeIntent, mISystemUiProxy, mMainThreadExecutor, + mBackgroundThreadChoreographer, downHitTarget)); } } |