From 2a93bc5b306f988c33ad16f5d0109d6db05189e7 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Tue, 7 Dec 2021 16:54:38 -0800 Subject: [PATCH] Add split support for 3P launcher * Copied logic mostly from Base/RecentsViewStateController * There's one KI crash specific to 3P (b/209694087) * Swipe to home animation is TODO, but then again it also seems incorrect for full-screen app. 3P has many cosmetic issues throughout. Bug: 195607777 Test: Tested w/ Nova launcher with grid and non-grid, able to invoke split screen with same animations as 1P launcher Change-Id: I35a1bc92a51caccac4214289e614000cd47bb503 --- quickstep/res/layout/overview_panel.xml | 7 ---- .../FallbackRecentsStateController.java | 34 +++++++++++++++++++ .../fallback/FallbackRecentsView.java | 18 +++++----- .../quickstep/fallback/RecentsState.java | 2 ++ .../quickstep/views/FloatingTaskView.java | 13 +++---- .../quickstep/views/LauncherRecentsView.java | 11 ------ .../android/quickstep/views/RecentsView.java | 8 ++++- .../com/android/quickstep/views/TaskView.java | 2 +- .../launcher3/anim/PropertySetter.java | 6 ++++ 9 files changed, 66 insertions(+), 35 deletions(-) diff --git a/quickstep/res/layout/overview_panel.xml b/quickstep/res/layout/overview_panel.xml index f303f31199..01d675f371 100644 --- a/quickstep/res/layout/overview_panel.xml +++ b/quickstep/res/layout/overview_panel.xml @@ -25,13 +25,6 @@ android:clipToPadding="false" android:visibility="invisible" /> - - diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java index 50b69dcff4..ff175f18f2 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java @@ -24,14 +24,22 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TR import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_Y; import static com.android.launcher3.states.StateAnimationConfig.ANIM_SCRIM_FADE; import static com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW; +import static com.android.quickstep.fallback.RecentsState.OVERVIEW_SPLIT_SELECT; import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET; import static com.android.quickstep.views.RecentsView.FULLSCREEN_PROGRESS; import static com.android.quickstep.views.RecentsView.RECENTS_GRID_PROGRESS; import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY; import static com.android.quickstep.views.RecentsView.TASK_MODALNESS; +import static com.android.quickstep.views.RecentsView.TASK_PRIMARY_SPLIT_TRANSLATION; +import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_SPLIT_TRANSLATION; import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION; import static com.android.quickstep.views.TaskView.FLAG_UPDATE_ALL; +import android.util.FloatProperty; +import android.util.Pair; + +import androidx.annotation.NonNull; + import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.statemanager.StateManager.StateHandler; @@ -100,5 +108,31 @@ public class FallbackRecentsStateController implements StateHandler taskViewsFloat = + mRecentsView.getPagedOrientationHandler().getSplitSelectTaskOffset( + TASK_PRIMARY_SPLIT_TRANSLATION, TASK_SECONDARY_SPLIT_TRANSLATION, + mActivity.getDeviceProfile()); + setter.setFloat(mRecentsView, taskViewsFloat.second, 0, LINEAR); + if (isSplitSelectionState(state)) { + mRecentsView.applySplitPrimaryScrollOffset(); + setter.setFloat(mRecentsView, taskViewsFloat.first, + mRecentsView.getSplitSelectTranslation(), LINEAR); + } else { + mRecentsView.resetSplitPrimaryScrollOffset(); + setter.setFloat(mRecentsView, taskViewsFloat.first, 0, LINEAR); + } + } + + /** + * @return true if {@param toState} is {@link RecentsState#OVERVIEW_SPLIT_SELECT} + */ + private boolean isSplitSelectionState(@NonNull RecentsState toState) { + return toState == OVERVIEW_SPLIT_SELECT; } } diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 169b20854f..6d22b17bfb 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -19,12 +19,12 @@ import static com.android.quickstep.GestureState.GestureEndTarget.RECENTS; import static com.android.quickstep.fallback.RecentsState.DEFAULT; import static com.android.quickstep.fallback.RecentsState.HOME; import static com.android.quickstep.fallback.RecentsState.MODAL_TASK; +import static com.android.quickstep.fallback.RecentsState.OVERVIEW_SPLIT_SELECT; import android.animation.AnimatorSet; import android.annotation.TargetApi; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; -import android.content.res.Configuration; import android.os.Build; import android.util.AttributeSet; import android.view.MotionEvent; @@ -35,6 +35,7 @@ import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.statemanager.StateManager.StateListener; +import com.android.launcher3.util.SplitConfigurationOptions; import com.android.quickstep.FallbackActivityInterface; import com.android.quickstep.GestureState; import com.android.quickstep.RecentsActivity; @@ -206,6 +207,13 @@ public class FallbackRecentsView extends RecentsView { FLAG_DISABLE_RESTORE | FLAG_NON_INTERACTIVE | FLAG_FULL_SCREEN | FLAG_OVERVIEW_UI); public static final RecentsState HOME = new RecentsState(3, 0); public static final RecentsState BG_LAUNCHER = new LauncherState(4, 0); + public static final RecentsState OVERVIEW_SPLIT_SELECT = new RecentsState(5, + FLAG_SHOW_AS_GRID | FLAG_SCRIM | FLAG_OVERVIEW_UI); public final int ordinal; private final int mFlags; diff --git a/quickstep/src/com/android/quickstep/views/FloatingTaskView.java b/quickstep/src/com/android/quickstep/views/FloatingTaskView.java index 0cea45e41d..18ab3bb2e9 100644 --- a/quickstep/src/com/android/quickstep/views/FloatingTaskView.java +++ b/quickstep/src/com/android/quickstep/views/FloatingTaskView.java @@ -17,8 +17,9 @@ import android.widget.ImageView; import androidx.annotation.Nullable; +import com.android.launcher3.BaseActivity; +import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.InsettableFrameLayout; -import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.R; import com.android.launcher3.Utilities; @@ -43,7 +44,7 @@ public class FloatingTaskView extends FrameLayout { private SplitPlaceholderView mSplitPlaceholderView; private RectF mStartingPosition; - private final Launcher mLauncher; + private final BaseDraggingActivity mActivity; private final boolean mIsRtl; private final Rect mOutline = new Rect(); private PagedOrientationHandler mOrientationHandler; @@ -59,7 +60,7 @@ public class FloatingTaskView extends FrameLayout { public FloatingTaskView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - mLauncher = Launcher.getLauncher(context); + mActivity = BaseActivity.fromContext(context); mIsRtl = Utilities.isRtl(getResources()); } @@ -114,7 +115,7 @@ public class FloatingTaskView extends FrameLayout { public void updateInitialPositionForView(TaskView originalView) { View thumbnail = originalView.getThumbnail(); Rect viewBounds = new Rect(0, 0, thumbnail.getWidth(), thumbnail.getHeight()); - Utilities.getBoundsForViewInDragLayer(mLauncher.getDragLayer(), thumbnail, viewBounds, + Utilities.getBoundsForViewInDragLayer(mActivity.getDragLayer(), thumbnail, viewBounds, true /* ignoreTransform */, null /* recycle */, mStartingPosition); mStartingPosition.offset(originalView.getTranslationX(), originalView.getTranslationY()); @@ -161,7 +162,7 @@ public class FloatingTaskView extends FrameLayout { // Position the floating view exactly on top of the original lp.topMargin = Math.round(pos.top); if (mIsRtl) { - lp.setMarginStart(mLauncher.getDeviceProfile().widthPx - Math.round(pos.right)); + lp.setMarginStart(mActivity.getDeviceProfile().widthPx - Math.round(pos.right)); } else { lp.setMarginStart(Math.round(pos.left)); } @@ -174,7 +175,7 @@ public class FloatingTaskView extends FrameLayout { public void addAnimation(PendingAnimation animation, RectF startingBounds, Rect endBounds, View viewToCover, boolean fadeWithThumbnail) { - final BaseDragLayer dragLayer = mLauncher.getDragLayer(); + final BaseDragLayer dragLayer = mActivity.getDragLayer(); int[] dragLayerBounds = new int[2]; dragLayer.getLocationOnScreen(dragLayerBounds); SplitOverlayProperties prop = new SplitOverlayProperties(endBounds, diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 6b7d8a557f..e0395ea5aa 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -168,15 +168,4 @@ public class LauncherRecentsView extends RecentsView