Add Split button in OverviewActions

Shows up only for large screen devices, not phones.
Tested for NexusLauncher, general 3P launcher support
needed for staged split (TODO b/195607777)

Bug: 195423591
Change-Id: I4d455769b17637174b590c640516b9fbb6352c3d
diff --git a/quickstep/res/layout/overview_actions_container.xml b/quickstep/res/layout/overview_actions_container.xml
index 0c2a28c..acbb5b9 100644
--- a/quickstep/res/layout/overview_actions_container.xml
+++ b/quickstep/res/layout/overview_actions_container.xml
@@ -47,6 +47,23 @@
             android:layout_weight="1" />
 
         <Button
+            android:id="@+id/action_split"
+            style="@style/OverviewActionButton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:drawableStart="@drawable/ic_split_screen"
+            android:text="@string/action_split"
+            android:theme="@style/ThemeControlHighlightWorkspaceColor"
+            android:visibility="gone" />
+
+        <Space
+            android:id="@+id/action_split_space"
+            android:layout_width="0dp"
+            android:layout_height="1dp"
+            android:layout_weight="1"
+            android:visibility="gone" />
+
+        <Button
             android:id="@+id/action_share"
             style="@style/OverviewActionButton"
             android:layout_width="wrap_content"
diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml
index 2916121..a7ec2ea 100644
--- a/quickstep/res/values/strings.xml
+++ b/quickstep/res/values/strings.xml
@@ -191,6 +191,8 @@
     <string name="action_share">Share</string>
     <!-- Label for a button that causes a screen shot of the current app to be taken. [CHAR_LIMIT=40] -->
     <string name="action_screenshot">Screenshot</string>
+    <!-- Label for a button that enters split screen selection mode. [CHAR_LIMIT=20] -->
+    <string name="action_split">Split</string>
     <!-- Message shown when an action is blocked by a policy enforced by the app or the organization managing the device. [CHAR_LIMIT=NONE] -->
     <string name="blocked_by_policy">This action isn\'t allowed by the app or your organization</string>
 
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java b/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java
index cbb4081..9fc0450 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java
@@ -43,8 +43,12 @@
     @Override
     public float getSplitSelectTranslation(Launcher launcher) {
         RecentsView recentsView = launcher.getOverviewPanel();
-        int splitPosition = recentsView.getSplitPlaceholder()
-                .getActiveSplitPositionOption().stagePosition;
+//<<<<<<< HEAD
+//        int splitPosition = recentsView.getSplitPlaceholder()
+//                .getActiveSplitPositionOption().stagePosition;
+//=======
+        int splitPosition = recentsView.getSplitPlaceholder().getActiveSplitStagePosition();
+//>>>>>>> f6769c8532 (Add Split button in OverviewActions)
         if (!recentsView.shouldShiftThumbnailsForSplitSelect(splitPosition)) {
             return 0f;
         }
diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
index f49c9b0..eb5c43f 100644
--- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
@@ -218,6 +218,11 @@
             }
         }
 
+        private void enterSplitSelect() {
+            RecentsView overviewPanel = mThumbnailView.getTaskView().getRecentsView();
+            overviewPanel.initiateSplitSelect(mThumbnailView.getTaskView());
+        }
+
         /**
          * Called when the overlay is no longer used.
          */
@@ -323,6 +328,10 @@
             public void onScreenshot() {
                 endLiveTileMode(() -> saveScreenshot(mTask));
             }
+
+            public void onSplit() {
+                endLiveTileMode(TaskOverlay.this::enterSplitSelect);
+            }
         }
     }
 
@@ -336,5 +345,8 @@
 
         /** User has indicated they want to screenshot the current task. */
         void onScreenshot();
+
+        /** User wants to start split screen with current app. */
+        void onSplit();
     }
 }
diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
index 6dff857..eb77ac0 100644
--- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
+++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
@@ -32,12 +32,11 @@
 import android.view.SurfaceControl;
 import android.window.TransitionInfo;
 
-import androidx.annotation.Nullable;
-
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.InsettableFrameLayout;
 import com.android.launcher3.R;
-import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
+import com.android.launcher3.util.SplitConfigurationOptions;
+import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
 import com.android.quickstep.SystemUiProxy;
 import com.android.quickstep.TaskAnimationManager;
 import com.android.quickstep.TaskViewUtils;
@@ -57,7 +56,7 @@
     private final SystemUiProxy mSystemUiProxy;
     private TaskView mInitialTaskView;
     private TaskView mSecondTaskView;
-    private SplitPositionOption mInitialPosition;
+    private @StagePosition int mStagePosition;
     private Rect mInitialBounds;
     private final Handler mHandler;
 
@@ -69,10 +68,10 @@
     /**
      * To be called after first task selected
      */
-    public void setInitialTaskSelect(TaskView taskView, SplitPositionOption positionOption,
+    public void setInitialTaskSelect(TaskView taskView, @StagePosition int stagePosition,
             Rect initialBounds) {
         mInitialTaskView = taskView;
-        mInitialPosition = positionOption;
+        mStagePosition = stagePosition;
         mInitialBounds = initialBounds;
     }
 
@@ -83,7 +82,11 @@
         mSecondTaskView = taskView;
         // Assume initial task is for top/left part of screen
 
-        final int[] taskIds = mInitialPosition.stagePosition == STAGE_POSITION_TOP_OR_LEFT
+//<<<<<<< HEAD
+//        final int[] taskIds = mInitialPosition.stagePosition == STAGE_POSITION_TOP_OR_LEFT
+//=======
+        final int[] taskIds = mStagePosition == STAGE_POSITION_TOP_OR_LEFT
+//>>>>>>> f6769c8532 (Add Split button in OverviewActions)
                 ? new int[]{mInitialTaskView.getTask().key.id, taskView.getTask().key.id}
                 : new int[]{taskView.getTask().key.id, mInitialTaskView.getTask().key.id};
         if (TaskAnimationManager.ENABLE_SHELL_TRANSITIONS) {
@@ -113,7 +116,11 @@
             DeviceProfile deviceProfile) {
         InsettableFrameLayout.LayoutParams params =
                 new InsettableFrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT);
-        boolean topLeftPosition = mInitialPosition.stagePosition == STAGE_POSITION_TOP_OR_LEFT;
+//<<<<<<< HEAD
+//        boolean topLeftPosition = mInitialPosition.stagePosition == STAGE_POSITION_TOP_OR_LEFT;
+//=======
+        boolean topLeftPosition = mStagePosition == STAGE_POSITION_TOP_OR_LEFT;
+//>>>>>>> f6769c8532 (Add Split button in OverviewActions)
         if (deviceProfile.isLandscape) {
             params.width = (int) resources.getDimension(R.dimen.split_placeholder_size);
             params.gravity = topLeftPosition ? Gravity.START : Gravity.END;
@@ -125,9 +132,8 @@
         return params;
     }
 
-    @Nullable
-    public SplitPositionOption getActiveSplitPositionOption() {
-        return mInitialPosition;
+    public @StagePosition int getActiveSplitStagePosition() {
+        return mStagePosition;
     }
 
     /**
@@ -189,7 +195,7 @@
     public void resetState() {
         mInitialTaskView = null;
         mSecondTaskView = null;
-        mInitialPosition = null;
+        mStagePosition = SplitConfigurationOptions.STAGE_POSITION_UNDEFINED;
         mInitialBounds = null;
     }
 
diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
index 6b2d19c..ddb1fca 100644
--- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -245,8 +245,8 @@
 
     @Override
     public void initiateSplitSelect(TaskView taskView,
-            SplitConfigurationOptions.SplitPositionOption splitPositionOption) {
-        super.initiateSplitSelect(taskView, splitPositionOption);
+            @SplitConfigurationOptions.StagePosition int stagePosition) {
+        super.initiateSplitSelect(taskView, stagePosition);
         mActivity.getStateManager().goToState(LauncherState.OVERVIEW_SPLIT_SELECT);
     }
 
diff --git a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
index a2d2179..5d1c202 100644
--- a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
+++ b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
@@ -79,6 +79,7 @@
     private static final int INDEX_SCROLL_ALPHA = 4;
 
     private final MultiValueAlpha mMultiValueAlpha;
+    private View mSplitButton;
 
     @ActionsHiddenFlags
     private int mHiddenFlags;
@@ -110,6 +111,8 @@
         View share = findViewById(R.id.action_share);
         share.setOnClickListener(this);
         findViewById(R.id.action_screenshot).setOnClickListener(this);
+        mSplitButton = findViewById(R.id.action_split);
+        mSplitButton.setOnClickListener(this);
         if (ENABLE_OVERVIEW_SHARE.get()) {
             share.setVisibility(VISIBLE);
             findViewById(R.id.oav_three_button_space).setVisibility(VISIBLE);
@@ -135,6 +138,8 @@
             mCallbacks.onShare();
         } else if (id == R.id.action_screenshot) {
             mCallbacks.onScreenshot();
+        } else if (id == R.id.action_split) {
+            mCallbacks.onSplit();
         }
     }
 
@@ -218,6 +223,16 @@
         mDp = dp;
         updateVerticalMargin(SysUINavigationMode.getMode(getContext()));
         requestLayout();
+        setSplitButtonVisible(mDp.isTablet);
+    }
+
+    public void setSplitButtonVisible(boolean visible) {
+        if (mSplitButton == null) {
+            return;
+        }
+
+        mSplitButton.setVisibility(visible ? VISIBLE : GONE);
+        findViewById(R.id.action_split_space).setVisibility(visible ? VISIBLE : GONE);
     }
 
     /** Get the top margin associated with the action buttons in Overview. */
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 5974677..646312e 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -133,7 +133,7 @@
 import com.android.launcher3.util.ResourceBasedOverride.Overrides;
 import com.android.launcher3.util.RunnableList;
 import com.android.launcher3.util.SplitConfigurationOptions;
-import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
+import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
 import com.android.launcher3.util.Themes;
 import com.android.launcher3.util.TranslateEdgeEffect;
 import com.android.launcher3.util.ViewPool;
@@ -2572,8 +2572,8 @@
     private void createInitialSplitSelectAnimation(PendingAnimation anim) {
         float placeholderHeight = getResources().getDimension(R.dimen.split_placeholder_size);
         mOrientationHandler.getInitialSplitPlaceholderBounds((int) placeholderHeight,
-                        mActivity.getDeviceProfile(),
-                mSplitSelectStateController.getActiveSplitPositionOption(), mTempRect);
+                mActivity.getDeviceProfile(),
+                mSplitSelectStateController.getActiveSplitStagePosition(), mTempRect);
 
         RectF startingTaskRect = new RectF();
         mSplitHiddenTaskView.setVisibility(INVISIBLE);
@@ -2582,6 +2582,7 @@
         mFirstFloatingTaskView.setAlpha(1);
         mFirstFloatingTaskView.addAnimation(anim, startingTaskRect,
                 mTempRect, mSplitHiddenTaskView, true /*fadeWithThumbnail*/);
+        anim.addEndListener(aBoolean -> mActionsView.setSplitButtonVisible(false));
     }
 
     /**
@@ -3014,8 +3015,7 @@
      * @return {@code true} if one of the task thumbnails would intersect/overlap with the
      *         {@link #mFirstFloatingTaskView}
      */
-    public boolean shouldShiftThumbnailsForSplitSelect(@SplitConfigurationOptions.StagePosition
-            int stagePosition) {
+    public boolean shouldShiftThumbnailsForSplitSelect(@StagePosition int stagePosition) {
         if (!mActivity.getDeviceProfile().isTablet) {
             // Never enough space on phones
             return true;
@@ -3547,12 +3547,17 @@
         }
     }
 
-    public void initiateSplitSelect(TaskView taskView, SplitPositionOption splitPositionOption) {
+    public void initiateSplitSelect(TaskView taskView) {
+        int defaultSplitPosition = mOrientationHandler
+                .getDefaultSplitPosition(mActivity.getDeviceProfile());
+        initiateSplitSelect(taskView, defaultSplitPosition);
+    }
+
+    public void initiateSplitSelect(TaskView taskView, @StagePosition int stagePosition) {
         mSplitHiddenTaskView = taskView;
         Rect initialBounds = new Rect(taskView.getLeft(), taskView.getTop(), taskView.getRight(),
                 taskView.getBottom());
-        mSplitSelectStateController.setInitialTaskSelect(taskView,
-                splitPositionOption, initialBounds);
+        mSplitSelectStateController.setInitialTaskSelect(taskView, stagePosition, initialBounds);
         mSplitHiddenTaskViewIndex = indexOfChild(taskView);
         if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
             finishRecentsAnimation(true, null);
@@ -3578,7 +3583,7 @@
                 .getDimensionPixelSize(R.dimen.multi_window_task_divider_size) / 2;
         mOrientationHandler.getFinalSplitPlaceholderBounds(halfDividerSize,
                 mActivity.getDeviceProfile(),
-                mSplitSelectStateController.getActiveSplitPositionOption(), firstTaskEndingBounds,
+                mSplitSelectStateController.getActiveSplitStagePosition(), firstTaskEndingBounds,
                 secondTaskEndingBounds);
 
         mFirstFloatingTaskView.getBoundsOnScreen(firstTaskStartingBounds);
@@ -3603,7 +3608,7 @@
 
     public PendingAnimation cancelSplitSelect(boolean animate) {
         SplitSelectStateController splitController = mSplitSelectStateController;
-        SplitPositionOption splitOption = splitController.getActiveSplitPositionOption();
+        @StagePosition int stagePosition = splitController.getActiveSplitStagePosition();
         Rect initialBounds = splitController.getInitialBounds();
         splitController.resetState();
         int duration = mActivity.getStateManager().getState().getTransitionDuration(getContext());
@@ -3629,7 +3634,7 @@
             if (child == mSplitHiddenTaskView) {
                 TaskView taskView = (TaskView) child;
 
-                int dir = mOrientationHandler.getSplitTaskViewDismissDirection(splitOption,
+                int dir = mOrientationHandler.getSplitTaskViewDismissDirection(stagePosition,
                         mActivity.getDeviceProfile());
                 FloatProperty<TaskView> dismissingTaskViewTranslate;
                 Rect hiddenBounds = new Rect(taskView.getLeft(), taskView.getTop(),
@@ -3701,10 +3706,10 @@
         return pendingAnim;
     }
 
+    /** TODO(b/181707736) More gracefully handle exiting split selection state */
     private void resetFromSplitSelectionState() {
         mSplitHiddenTaskView.setTranslationY(0);
         if (!showAsGrid()) {
-            // TODO(b/186800707)
             int pageToSnapTo = mCurrentPage;
             if (mSplitHiddenTaskViewIndex <= pageToSnapTo) {
                 pageToSnapTo += 1;
@@ -3728,6 +3733,7 @@
             mSecondSplitHiddenTaskView.setVisibility(VISIBLE);
             mSecondSplitHiddenTaskView = null;
         }
+        mActionsView.setSplitButtonVisible(true);
     }
 
     private void updateDeadZoneRects() {
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java
index 5986649..bfe6ca4 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskView.java
@@ -1514,7 +1514,7 @@
 
     public void initiateSplitSelect(SplitPositionOption splitPositionOption) {
         AbstractFloatingView.closeOpenViews(mActivity, false, TYPE_TASK_MENU);
-        getRecentsView().initiateSplitSelect(this, splitPositionOption);
+        getRecentsView().initiateSplitSelect(this, splitPositionOption.stagePosition);
     }
 
     /**
diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
index 29e5446..17a00e2 100644
--- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
+++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
@@ -45,6 +45,7 @@
 import com.android.launcher3.Utilities;
 import com.android.launcher3.util.SplitConfigurationOptions;
 import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
+import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
 import com.android.launcher3.views.BaseDragLayer;
 
 import java.util.Collections;
@@ -165,16 +166,24 @@
     }
 
     @Override
-    public int getSplitTaskViewDismissDirection(SplitPositionOption splitPosition,
+    public int getSplitTaskViewDismissDirection(@StagePosition int stagePosition,
             DeviceProfile dp) {
         // Don't use device profile here because we know we're in fake landscape, only split option
         // available is top/left
-        if (splitPosition.stagePosition == STAGE_POSITION_TOP_OR_LEFT) {
+//<<<<<<< HEAD
+//        if (splitPosition.stagePosition == STAGE_POSITION_TOP_OR_LEFT) {
+//            // Top (visually left) side
+//            return SPLIT_TRANSLATE_PRIMARY_NEGATIVE;
+//        }
+//        throw new IllegalStateException("Invalid split stage position: " +
+//                splitPosition.stagePosition);
+//=======
+        if (stagePosition == STAGE_POSITION_TOP_OR_LEFT) {
             // Top (visually left) side
             return SPLIT_TRANSLATE_PRIMARY_NEGATIVE;
         }
-        throw new IllegalStateException("Invalid split stage position: " +
-                splitPosition.stagePosition);
+        throw new IllegalStateException("Invalid split stage position: " + stagePosition);
+//>>>>>>> f6769c8532 (Add Split button in OverviewActions)
     }
 
     @Override
@@ -367,7 +376,7 @@
 
     @Override
     public void getInitialSplitPlaceholderBounds(int placeholderHeight, DeviceProfile dp,
-            SplitPositionOption splitPositionOption, Rect out) {
+            @StagePosition int stagePosition, Rect out) {
         // In fake land/seascape, the placeholder always needs to go to the "top" of the device,
         // which is the same bounds as 0 rotation.
         int width = dp.widthPx;
@@ -376,7 +385,7 @@
 
     @Override
     public void getFinalSplitPlaceholderBounds(int splitDividerSize, DeviceProfile dp,
-            SplitPositionOption initialSplitOption, Rect out1, Rect out2) {
+            @StagePosition int stagePosition, Rect out1, Rect out2) {
         // In fake land/seascape, the window bounds are always top and bottom half
         int screenHeight = dp.heightPx;
         int screenWidth = dp.widthPx;
@@ -385,6 +394,7 @@
     }
 
     @Override
+//<<<<<<< HEAD
     public void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect,
             SplitConfigurationOptions.StagedSplitBounds splitInfo, int desiredStagePosition) {
         float diff;
@@ -418,13 +428,20 @@
         ViewGroup.LayoutParams secondaryLp = mSnapshotView2.getLayoutParams();
 
         primaryLp.width = totalThumbnailWidth;
-        primaryLp.height = (int)(totalThumbnailHeight * splitBoundsConfig.leftTaskPercent);
+        primaryLp.height = (int) (totalThumbnailHeight * splitBoundsConfig.leftTaskPercent);
 
         secondaryLp.width = totalThumbnailWidth;
         secondaryLp.height = totalThumbnailHeight - primaryLp.height - dividerBar;
         mSnapshotView2.setTranslationY(primaryLp.height + spaceAboveSnapshot + dividerBar);
     }
 
+//=======
+    @Override
+    public int getDefaultSplitPosition(DeviceProfile deviceProfile) {
+        throw new IllegalStateException("Default position not available in fake landscape");
+//>>>>>>> f6769c8532 (Add Split button in OverviewActions)
+    }
+
     @Override
     public FloatProperty getSplitSelectTaskOffset(FloatProperty primary, FloatProperty secondary,
             DeviceProfile deviceProfile) {
diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java
index 5ef6950..b34a81e 100644
--- a/src/com/android/launcher3/touch/PagedOrientationHandler.java
+++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java
@@ -80,11 +80,11 @@
     FloatProperty<View> getSecondaryViewTranslate();
 
     /**
-     * @param splitPosition The position where the view to be split will go
+     * @param stagePosition The position where the view to be split will go
      * @return {@link #SPLIT_TRANSLATE_*} constants to indicate which direction the
      * dismissal should happen
      */
-    int getSplitTaskViewDismissDirection(SplitPositionOption splitPosition, DeviceProfile dp);
+    int getSplitTaskViewDismissDirection(@StagePosition int stagePosition, DeviceProfile dp);
     int getPrimaryScroll(View view);
     float getPrimaryScale(View view);
     int getChildStart(View view);
@@ -122,18 +122,20 @@
      * @param splitholderSize height of placeholder view in portrait, width in landscape
      */
     void getInitialSplitPlaceholderBounds(int splitholderSize, DeviceProfile dp,
-            SplitPositionOption splitPositionOption, Rect out);
+            @StagePosition int stagePosition, Rect out);
 
     /**
      * @param splitDividerSize height of split screen drag handle in portrait, width in landscape
-     * @param initialSplitOption the split position option (top/left, bottom/right) of the first
+     * @param stagePosition the split position option (top/left, bottom/right) of the first
      *                           task selected for entering split
      * @param out1 the bounds for where the first selected app will be
      * @param out2 the bounds for where the second selected app will be, complimentary to
      *             {@param out1} based on {@param initialSplitOption}
      */
     void getFinalSplitPlaceholderBounds(int splitDividerSize, DeviceProfile dp,
-            SplitPositionOption initialSplitOption, Rect out1, Rect out2);
+            @StagePosition int stagePosition, Rect out1, Rect out2);
+
+    int getDefaultSplitPosition(DeviceProfile deviceProfile);
 
     /**
      * @param outRect This is expected to be the rect that has the dimensions for a non-split,
diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
index 737162f..640e6cc 100644
--- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
+++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
@@ -44,6 +44,7 @@
 import com.android.launcher3.Utilities;
 import com.android.launcher3.util.SplitConfigurationOptions;
 import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
+import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
 import com.android.launcher3.views.BaseDragLayer;
 
 import java.util.ArrayList;
@@ -165,9 +166,13 @@
     }
 
     @Override
-    public int getSplitTaskViewDismissDirection(SplitPositionOption splitPosition,
+    public int getSplitTaskViewDismissDirection(@StagePosition int stagePosition,
             DeviceProfile dp) {
-        if (splitPosition.stagePosition == STAGE_POSITION_TOP_OR_LEFT) {
+//<<<<<<< HEAD
+//        if (splitPosition.stagePosition == STAGE_POSITION_TOP_OR_LEFT) {
+//=======
+        if (stagePosition == STAGE_POSITION_TOP_OR_LEFT) {
+//>>>>>>> f6769c8532 (Add Split button in OverviewActions)
             if (dp.isLandscape) {
                 // Left side
                 return SPLIT_TRANSLATE_PRIMARY_NEGATIVE;
@@ -175,12 +180,20 @@
                 // Top side
                 return SPLIT_TRANSLATE_SECONDARY_NEGATIVE;
             }
-        } else if (splitPosition.stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT) {
+//<<<<<<< HEAD
+//        } else if (splitPosition.stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT) {
+             // We don't have a bottom option, so should be right
+//            return SPLIT_TRANSLATE_PRIMARY_POSITIVE;
+//        }
+//        throw new IllegalStateException("Invalid split stage position: " +
+//                splitPosition.stagePosition);
+//=======
+        } else if (stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT) {
             // We don't have a bottom option, so should be right
             return SPLIT_TRANSLATE_PRIMARY_POSITIVE;
         }
-        throw new IllegalStateException("Invalid split stage position: " +
-                splitPosition.stagePosition);
+        throw new IllegalStateException("Invalid split stage position: " + stagePosition);
+//>>>>>>> f6769c8532 (Add Split button in OverviewActions)
     }
 
     @Override
@@ -416,7 +429,7 @@
 
     @Override
     public void getInitialSplitPlaceholderBounds(int placeholderHeight, DeviceProfile dp,
-            SplitPositionOption splitPositionOption, Rect out) {
+            @StagePosition int stagePosition, Rect out) {
         int width = dp.widthPx;
         out.set(0, 0, width, placeholderHeight);
         if (!dp.isLandscape) {
@@ -425,7 +438,11 @@
         }
 
         // Now we rotate the portrait rect depending on what side we want pinned
-        boolean pinToRight = splitPositionOption.stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT;
+//<<<<<<< HEAD
+//        boolean pinToRight = splitPositionOption.stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT;
+//=======
+        boolean pinToRight = stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT;
+//>>>>>>> f6769c8532 (Add Split button in OverviewActions)
 
         int screenHeight = dp.heightPx;
         float postRotateScale = (float) screenHeight / width;
@@ -442,7 +459,7 @@
 
     @Override
     public void getFinalSplitPlaceholderBounds(int splitDividerSize, DeviceProfile dp,
-            SplitPositionOption initialSplitOption, Rect out1, Rect out2) {
+            @StagePosition int stagePosition, Rect out1, Rect out2) {
         int screenHeight = dp.heightPx;
         int screenWidth = dp.widthPx;
         out1.set(0, 0, screenWidth, screenHeight / 2 - splitDividerSize);
@@ -453,7 +470,11 @@
         }
 
         // Now we rotate the portrait rect depending on what side we want pinned
-        boolean pinToRight = initialSplitOption.stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT;
+//<<<<<<< HEAD
+//        boolean pinToRight = initialSplitOption.stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT;
+//=======
+        boolean pinToRight = stagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT;
+//>>>>>>> f6769c8532 (Add Split button in OverviewActions)
         float postRotateScale = (float) screenHeight / screenWidth;
 
         mTmpMatrix.reset();
@@ -471,6 +492,7 @@
     }
 
     @Override
+//<<<<<<< HEAD
     public void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect,
             SplitConfigurationOptions.StagedSplitBounds splitInfo, int desiredStagePosition) {
         boolean isLandscape = dp.isLandscape;
@@ -524,7 +546,7 @@
 
         if (dp.isLandscape) {
             primaryLp.height = totalThumbnailHeight;
-            primaryLp.width = (int)(totalThumbnailWidth * splitBoundsConfig.leftTaskPercent);
+            primaryLp.width = (int) (totalThumbnailWidth * splitBoundsConfig.leftTaskPercent);
 
             secondaryLp.height = totalThumbnailHeight;
             secondaryLp.width = totalThumbnailWidth - primaryLp.width - dividerBar;
@@ -532,7 +554,7 @@
             mSnapshotView2.setTranslationY(spaceAboveSnapshot);
         } else {
             primaryLp.width = totalThumbnailWidth;
-            primaryLp.height = (int)(totalThumbnailHeight * splitBoundsConfig.topTaskPercent);
+            primaryLp.height = (int) (totalThumbnailHeight * splitBoundsConfig.topTaskPercent);
 
             secondaryLp.width = totalThumbnailWidth;
             secondaryLp.height = totalThumbnailHeight - primaryLp.height - dividerBar;
@@ -541,6 +563,20 @@
         }
     }
 
+//=======
+    @Override
+    public int getDefaultSplitPosition(DeviceProfile deviceProfile) {
+        if (!deviceProfile.isTablet) {
+            throw new IllegalStateException("Default position available only for large screens");
+        }
+        if (deviceProfile.isLandscape) {
+            return STAGE_POSITION_BOTTOM_OR_RIGHT;
+        } else {
+            return STAGE_POSITION_TOP_OR_LEFT;
+//>>>>>>> f6769c8532 (Add Split button in OverviewActions)
+        }
+    }
+
     @Override
     public FloatProperty getSplitSelectTaskOffset(FloatProperty primary, FloatProperty secondary,
             DeviceProfile dp) {