From faa443308ef4de1be482d7d033209d8d6d8cff7b Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Mon, 1 Oct 2018 16:37:15 -0700 Subject: [PATCH 1/3] Rounded corners on app transitions Test: Manualy launch an app Test: Press home when activity is on top of the stack Test: Quick scrub Test: Swipe up on the home button, swipe down Bug: 111514493 Fixes: 116745318 Change-Id: I66d25bc433061ede46107ea9651c198614306692 --- quickstep/res/values/dimens.xml | 2 +- .../LauncherAppTransitionManagerImpl.java | 27 +++++++++++++++---- .../quickstep/ActivityControlHelper.java | 2 +- .../quickstep/OverviewCommandHelper.java | 2 +- .../android/quickstep/RecentsActivity.java | 2 +- .../com/android/quickstep/RecentsModel.java | 26 ++++++++++++++++++ .../WindowTransformSwipeHandler.java | 3 ++- .../quickstep/util/ClipAnimationHelper.java | 22 ++++++++++++--- .../quickstep/util/TaskViewDrawable.java | 2 +- 9 files changed, 73 insertions(+), 15 deletions(-) diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index 49c4492b60..e0c4e4baa1 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -19,7 +19,7 @@ 24dp 12dp 48dp - 2dp + 8dp 10dp 70dp 20dp diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 5680a67090..675c9d67db 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -67,6 +67,7 @@ import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.util.MultiValueAlpha; import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; +import com.android.quickstep.RecentsModel; import com.android.quickstep.util.ClipAnimationHelper; import com.android.quickstep.util.MultiValueUpdateListener; import com.android.quickstep.util.RemoteAnimationProvider; @@ -286,7 +287,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag ? RECENTS_QUICKSCRUB_LAUNCH_DURATION : RECENTS_LAUNCH_DURATION; - ClipAnimationHelper helper = new ClipAnimationHelper(); + ClipAnimationHelper helper = new ClipAnimationHelper(mLauncher); target.play(getRecentsWindowAnimator(taskView, skipLauncherChanges, targets, helper) .setDuration(duration)); @@ -605,6 +606,13 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag float transX0 = floatingViewBounds[0] - offsetX; float transY0 = floatingViewBounds[1] - offsetY; + // Animate window corner radius from 100% to windowCornerRadius. + float windowCornerRadius = RecentsModel.INSTANCE.get(mLauncher) + .getWindowCornerRadius(); + float circleRadius = scaledWindowWidth / 2f; + float windowRadius = Utilities.mapRange(easePercent, circleRadius, + windowCornerRadius); + // Animate the window crop so that it starts off as a square, and then reveals // horizontally. float cropHeight = windowHeight * easePercent + windowWidth * (1 - easePercent); @@ -619,20 +627,24 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag RemoteAnimationTargetCompat target = targets[i]; Rect targetCrop; - float alpha; + final float alpha; + final float cornerRadius; if (target.mode == MODE_OPENING) { matrix.setScale(scale, scale); matrix.postTranslate(transX0, transY0); targetCrop = crop; alpha = mAlpha.value; + cornerRadius = windowRadius; } else { matrix.setTranslate(target.position.x, target.position.y); alpha = 1f; targetCrop = target.sourceContainerBounds; + cornerRadius = 0; } params[i] = new SurfaceParams(target.leash, alpha, matrix, targetCrop, - RemoteAnimationProvider.getLayer(target, MODE_OPENING)); + RemoteAnimationProvider.getLayer(target, MODE_OPENING), + cornerRadius); } surfaceApplier.scheduleApply(params); } @@ -724,6 +736,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag Matrix matrix = new Matrix(); ValueAnimator closingAnimator = ValueAnimator.ofFloat(0, 1); int duration = CLOSING_TRANSITION_DURATION_MS; + float windowCornerRadius = RecentsModel.INSTANCE.get(mLauncher).getWindowCornerRadius(); closingAnimator.setDuration(duration); closingAnimator.addUpdateListener(new MultiValueUpdateListener() { FloatProp mDy = new FloatProp(0, mClosingWindowTransY, 0, duration, DEACCEL_1_7); @@ -735,7 +748,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag SurfaceParams[] params = new SurfaceParams[targets.length]; for (int i = targets.length - 1; i >= 0; i--) { RemoteAnimationTargetCompat target = targets[i]; - float alpha; + final float alpha; + final float cornerRadius; if (target.mode == MODE_CLOSING) { matrix.setScale(mScale.value, mScale.value, target.sourceContainerBounds.centerX(), @@ -743,13 +757,16 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag matrix.postTranslate(0, mDy.value); matrix.postTranslate(target.position.x, target.position.y); alpha = mAlpha.value; + cornerRadius = windowCornerRadius; } else { matrix.setTranslate(target.position.x, target.position.y); alpha = 1f; + cornerRadius = 0f; } params[i] = new SurfaceParams(target.leash, alpha, matrix, target.sourceContainerBounds, - RemoteAnimationProvider.getLayer(target, MODE_CLOSING)); + RemoteAnimationProvider.getLayer(target, MODE_CLOSING), + cornerRadius); } surfaceApplier.scheduleApply(params); } diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index c809e28320..41ef70d064 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -319,7 +319,7 @@ public interface ActivityControlHelper { float prevRvScale = recentsView.getScaleX(); float targetRvScale = endState.getOverviewScaleAndTranslationYFactor(launcher)[0]; SCALE_PROPERTY.set(recentsView, targetRvScale); - ClipAnimationHelper clipHelper = new ClipAnimationHelper(); + ClipAnimationHelper clipHelper = new ClipAnimationHelper(launcher); clipHelper.fromTaskThumbnailView(v.getThumbnail(), (RecentsView) v.getParent(), null); SCALE_PROPERTY.set(recentsView, prevRvScale); diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index f8f09055f0..61bb75f857 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -326,7 +326,7 @@ public class OverviewCommandHelper { return anim; } - final ClipAnimationHelper clipHelper = new ClipAnimationHelper(); + final ClipAnimationHelper clipHelper = new ClipAnimationHelper(mActivity); // At this point, the activity is already started and laid-out. Get the home-bounds // relative to the screen using the rootView of the activity. diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index ef735e1ce2..6ee405198b 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -189,7 +189,7 @@ public class RecentsActivity extends BaseDraggingActivity { RemoteAnimationTargetCompat[] targets) { AnimatorSet target = new AnimatorSet(); boolean activityClosing = taskIsATargetWithMode(targets, getTaskId(), MODE_CLOSING); - ClipAnimationHelper helper = new ClipAnimationHelper(); + ClipAnimationHelper helper = new ClipAnimationHelper(this); target.play(getRecentsWindowAnimator(taskView, !activityClosing, targets, helper) .setDuration(RECENTS_LAUNCH_DURATION)); diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index 2e4d4d2b83..a62e6adfae 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -45,6 +45,9 @@ import androidx.annotation.WorkerThread; */ @TargetApi(Build.VERSION_CODES.O) public class RecentsModel extends TaskStackChangeListener { + + private static final String TAG = "RecentsModel"; + // We do not need any synchronization for this variable as its only written on UI thread. public static final MainThreadInitializedObject INSTANCE = new MainThreadInitializedObject<>(c -> new RecentsModel(c)); @@ -62,6 +65,9 @@ public class RecentsModel extends TaskStackChangeListener { private final TaskIconCache mIconCache; private final TaskThumbnailCache mThumbnailCache; + private float mWindowCornerRadius = -1; + + private RecentsModel(Context context) { mContext = context; @@ -174,6 +180,26 @@ public class RecentsModel extends TaskStackChangeListener { return mSystemUiProxy; } + public float getWindowCornerRadius() { + // The window corner radius is expressed in pixels and won't change if the + // display density changes. It's safe to cache the value. + if (mWindowCornerRadius == -1) { + if (mSystemUiProxy != null) { + try { + mWindowCornerRadius = mSystemUiProxy.getWindowCornerRadius(); + } catch (RemoteException e) { + Log.w(TAG, "Connection to ISystemUIProxy was lost, ignoring window corner " + + "radius"); + return 0; + } + } else { + Log.w(TAG, "ISystemUIProxy is null, ignoring window corner radius"); + return 0; + } + } + return mWindowCornerRadius; + } + public void onTrimMemory(int level) { if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { mThumbnailCache.getHighResLoadingState().setVisible(false); diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 9ea88842d7..5567c15f56 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -173,7 +173,7 @@ public class WindowTransformSwipeHandler { private static final float SWIPE_DURATION_MULTIPLIER = Math.min(1 / MIN_PROGRESS_FOR_OVERVIEW, 1 / (1 - MIN_PROGRESS_FOR_OVERVIEW)); - private final ClipAnimationHelper mClipAnimationHelper = new ClipAnimationHelper(); + private final ClipAnimationHelper mClipAnimationHelper; protected Runnable mGestureEndCallback; protected boolean mIsGoingToHome; @@ -253,6 +253,7 @@ public class WindowTransformSwipeHandler { mTouchInteractionLog = touchInteractionLog; mRecentsAnimationWrapper = new RecentsAnimationWrapper(inputConsumer, this::createNewTouchProxyHandler); + mClipAnimationHelper = new ClipAnimationHelper(context); initStateCallbacks(); } diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index 57a0e8f8f7..f254244944 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -21,6 +21,7 @@ import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MOD import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING; import android.annotation.TargetApi; +import android.content.Context; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Matrix.ScaleToFit; @@ -31,6 +32,8 @@ import android.os.Build; import android.os.RemoteException; import android.view.animation.Interpolator; +import androidx.annotation.Nullable; + import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; @@ -50,8 +53,6 @@ import com.android.systemui.shared.system.WindowManagerWrapper; import java.util.function.BiFunction; -import androidx.annotation.Nullable; - /** * Utility class to handle window clip animation */ @@ -82,6 +83,10 @@ public class ClipAnimationHelper { private final Matrix mTmpMatrix = new Matrix(); private final RectF mTmpRectF = new RectF(); private final RectF mCurrentRectWithInsets = new RectF(); + // Corner radius of windows, in pixels + private final float mWindowCornerRadius; + // Corner radius of windows when they're in overview mode. + private final float mTaskCornerRadius; private float mTargetScale = 1f; private float mOffsetScale = 1f; @@ -95,6 +100,11 @@ public class ClipAnimationHelper { private BiFunction mTaskAlphaCallback = (t, a1) -> a1; + public ClipAnimationHelper(Context context) { + mTaskCornerRadius = context.getResources().getDimension(R.dimen.task_corner_radius); + mWindowCornerRadius = RecentsModel.INSTANCE.get(context).getWindowCornerRadius(); + } + private void updateSourceStack(RemoteAnimationTargetCompat target) { mSourceInsets.set(target.contentInsets); mSourceStackBounds.set(target.sourceContainerBounds); @@ -168,11 +178,15 @@ public class ClipAnimationHelper { Rect crop = app.sourceContainerBounds; float alpha = 1f; int layer; + float cornerRadius = 0f; if (app.mode == targetSet.targetMode) { if (app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { mTmpMatrix.setRectToRect(mSourceRect, currentRect, ScaleToFit.FILL); mTmpMatrix.postTranslate(app.position.x, app.position.y); mClipRectF.roundOut(crop); + float scale = crop.width() / currentRect.width(); + cornerRadius = Utilities.mapRange(progress, mWindowCornerRadius, + mTaskCornerRadius * scale); } if (app.isNotInRecents @@ -186,7 +200,7 @@ public class ClipAnimationHelper { crop = null; layer = Integer.MAX_VALUE; } - params[i] = new SurfaceParams(app.leash, alpha, mTmpMatrix, crop, layer); + params[i] = new SurfaceParams(app.leash, alpha, mTmpMatrix, crop, layer, cornerRadius); } applyParams(syncTransactionApplier, params); return currentRect; @@ -315,7 +329,7 @@ public class ClipAnimationHelper { -mSourceWindowClipInsets.top * insetProgress, ttv.getMeasuredWidth() + mSourceWindowClipInsets.right * insetProgress, ttv.getMeasuredHeight() + mSourceWindowClipInsets.bottom * insetProgress, - ttv.getCornerRadius() * progress); + Utilities.mapRange(progress, mWindowCornerRadius, ttv.getCornerRadius())); } public RectF getTargetRect() { diff --git a/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java b/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java index 48b07a7144..6ee305f802 100644 --- a/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java +++ b/quickstep/src/com/android/quickstep/util/TaskViewDrawable.java @@ -71,7 +71,7 @@ public class TaskViewDrawable extends Drawable { Utilities.getDescendantCoordRelativeToAncestor(mIconView, parent, mIconPos, true); mThumbnailView = tv.getThumbnail(); - mClipAnimationHelper = new ClipAnimationHelper(); + mClipAnimationHelper = new ClipAnimationHelper(parent.getContext()); mClipAnimationHelper.fromTaskThumbnailView(mThumbnailView, parent); } From aa1b1c9a48d090d57f116b23cbf9f87534d1a5cb Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Mon, 1 Oct 2018 16:37:15 -0700 Subject: [PATCH 2/3] =?UTF-8?q?Correct=20=E2=AD=95=20=E2=9B=B6=20=20?= =?UTF-8?q?=F0=9F=95=B3=EF=B8=8F=20=F0=9F=91=8A=F0=9F=91=8A=F0=9F=91=8A?= =?UTF-8?q?=F0=9F=91=8A=F0=9F=91=8A=F0=9F=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🕳️ 👊👊👊👊 Bug: 111514493 Change-Id: Ie770de06dabe42e5e620ac9c7ec9da256f3d58f5 Fixes: 116745318 --- .../quickstep/ActivityControlHelper.java | 6 ++++-- .../quickstep/WindowTransformSwipeHandler.java | 3 ++- .../quickstep/util/ClipAnimationHelper.java | 17 ++++++++++++++--- .../quickstep/views/LauncherLayoutListener.java | 7 +++++-- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 41ef70d064..82d791bdbc 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -540,7 +540,8 @@ public interface ActivityControlHelper { public void finish() { } @Override - public void update(boolean shouldFinish, boolean isLongSwipe, RectF currentRect) { } + public void update(boolean shouldFinish, boolean isLongSwipe, RectF currentRect, + float cornerRadius) { } }; } @@ -618,7 +619,8 @@ public interface ActivityControlHelper { void finish(); - void update(boolean shouldFinish, boolean isLongSwipe, RectF currentRect); + void update(boolean shouldFinish, boolean isLongSwipe, RectF currentRect, + float cornerRadius); } interface ActivityInitListener { diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 5567c15f56..af51e4d8d3 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -600,7 +600,8 @@ public class WindowTransformSwipeHandler { private void updateFinalShiftUi() { if (mRecentsAnimationWrapper.getController() != null && mLayoutListener != null) { mLayoutListener.update(mCurrentShift.value > 1, mUiLongSwipeMode, - mClipAnimationHelper.getCurrentRectWithInsets()); + mClipAnimationHelper.getCurrentRectWithInsets(), + mClipAnimationHelper.getCurrentCornerRadius()); } final boolean passed = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW; diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index f254244944..8c9ceadafb 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -88,6 +88,8 @@ public class ClipAnimationHelper { // Corner radius of windows when they're in overview mode. private final float mTaskCornerRadius; + // Corner radius currently applied to transformed window. + private float mCurrentCornerRadius; private float mTargetScale = 1f; private float mOffsetScale = 1f; private Interpolator mInterpolator = LINEAR; @@ -179,14 +181,15 @@ public class ClipAnimationHelper { float alpha = 1f; int layer; float cornerRadius = 0f; + float scale = currentRect.width() / crop.width(); if (app.mode == targetSet.targetMode) { if (app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { mTmpMatrix.setRectToRect(mSourceRect, currentRect, ScaleToFit.FILL); mTmpMatrix.postTranslate(app.position.x, app.position.y); mClipRectF.roundOut(crop); - float scale = crop.width() / currentRect.width(); cornerRadius = Utilities.mapRange(progress, mWindowCornerRadius, - mTaskCornerRadius * scale); + mTaskCornerRadius); + mCurrentCornerRadius = cornerRadius; } if (app.isNotInRecents @@ -200,7 +203,11 @@ public class ClipAnimationHelper { crop = null; layer = Integer.MAX_VALUE; } - params[i] = new SurfaceParams(app.leash, alpha, mTmpMatrix, crop, layer, cornerRadius); + + // Since radius is in Surface space, but we draw the rounded corners in screen space, we + // have to undo the scale. + params[i] = new SurfaceParams(app.leash, alpha, mTmpMatrix, crop, layer, + cornerRadius / scale); } applyParams(syncTransactionApplier, params); return currentRect; @@ -339,4 +346,8 @@ public class ClipAnimationHelper { public RectF getSourceRect() { return mSourceRect; } + + public float getCurrentCornerRadius() { + return mCurrentCornerRadius; + } } diff --git a/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java b/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java index c12a579686..8ec5361bb4 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java +++ b/quickstep/src/com/android/quickstep/views/LauncherLayoutListener.java @@ -43,6 +43,7 @@ public class LauncherLayoutListener extends AbstractFloatingView private final Paint mPaint = new Paint(); private WindowTransformSwipeHandler mHandler; private RectF mCurrentRect; + private float mCornerRadius; public LauncherLayoutListener(Launcher launcher) { super(launcher, null); @@ -52,13 +53,15 @@ public class LauncherLayoutListener extends AbstractFloatingView } @Override - public void update(boolean shouldFinish, boolean isLongSwipe, RectF currentRect) { + public void update(boolean shouldFinish, boolean isLongSwipe, RectF currentRect, + float cornerRadius) { if (shouldFinish) { finish(); return; } mCurrentRect = currentRect; + mCornerRadius = cornerRadius; setWillNotDraw(mCurrentRect == null || isLongSwipe); invalidate(); @@ -121,6 +124,6 @@ public class LauncherLayoutListener extends AbstractFloatingView @Override protected void onDraw(Canvas canvas) { - canvas.drawRect(mCurrentRect, mPaint); + canvas.drawRoundRect(mCurrentRect, mCornerRadius, mCornerRadius, mPaint); } } From f1bb3a4d4c9a1c6ba5cff5550b6d6b2b84ff272f Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Thu, 29 Nov 2018 20:27:17 +0800 Subject: [PATCH 3/3] Specify display ID while calling getNavBarPosition() Navigation bar can show on non-default display now. So the caller should specify which display the desired navigation bar is on. Bug: 117474929 Test: atest Launcher3Tests Change-Id: Ibb22e51730ab145a42a129b4d964299acd4efd56 --- .../com/android/quickstep/TaskSystemShortcut.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java index c81f04403b..7d97e7c648 100644 --- a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java +++ b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java @@ -18,6 +18,7 @@ package com.android.quickstep; import static com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch.TAP; +import android.app.Activity; import android.app.ActivityOptions; import android.content.ComponentName; import android.content.Intent; @@ -115,7 +116,7 @@ public class TaskSystemShortcut extends SystemShortcut } protected abstract boolean isAvailable(BaseDraggingActivity activity); - protected abstract ActivityOptions makeLaunchOptions(); + protected abstract ActivityOptions makeLaunchOptions(Activity activity); protected abstract boolean onActivityStarted(BaseDraggingActivity activity); @Override @@ -160,7 +161,7 @@ public class TaskSystemShortcut extends SystemShortcut dismissTaskMenuView(activity); - ActivityOptions options = makeLaunchOptions(); + ActivityOptions options = makeLaunchOptions(activity); if (options != null && ActivityManagerWrapper.getInstance().startActivityFromRecents(taskId, options)) { @@ -222,8 +223,9 @@ public class TaskSystemShortcut extends SystemShortcut } @Override - protected ActivityOptions makeLaunchOptions() { - final int navBarPosition = WindowManagerWrapper.getInstance().getNavBarPosition(); + protected ActivityOptions makeLaunchOptions(Activity activity) { + final int navBarPosition = WindowManagerWrapper.getInstance().getNavBarPosition( + activity.getDisplayId()); if (navBarPosition == WindowManagerWrapper.NAV_BAR_POS_INVALID) { return null; } @@ -257,7 +259,7 @@ public class TaskSystemShortcut extends SystemShortcut } @Override - protected ActivityOptions makeLaunchOptions() { + protected ActivityOptions makeLaunchOptions(Activity activity) { return ActivityOptionsCompat.makeFreeformOptions(); }