From 4d57e7091f8b49153912acea2e3d393c0c12a10d Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Wed, 27 Oct 2021 12:39:21 -0700 Subject: [PATCH] Shows AppPairs in previous tasks Fixes: 203006080 Change-Id: I63912a61e7617ec41f229c19cc267dc5a1857bae --- .../android/quickstep/AbsSwipeUpHandler.java | 5 - .../android/quickstep/RecentTasksList.java | 17 ++- .../com/android/quickstep/RecentsModel.java | 2 +- .../android/quickstep/RemoteTargetGluer.java | 10 +- .../com/android/quickstep/SystemUiProxy.java | 47 -------- .../fallback/FallbackRecentsView.java | 4 +- .../com/android/quickstep/util/GroupTask.java | 56 +++++++++ .../util/LauncherSplitScreenListener.java | 1 - .../quickstep/util/TaskViewSimulator.java | 2 +- .../quickstep/views/GroupedTaskView.java | 1 + .../android/quickstep/views/RecentsView.java | 109 +++++------------- .../com/android/quickstep/views/TaskView.java | 5 - .../quickstep/RecentTasksListTest.java | 8 +- .../touch/LandscapePagedViewHandler.java | 13 ++- .../touch/PagedOrientationHandler.java | 5 +- .../touch/PortraitPagedViewHandler.java | 29 ++--- .../touch/SeascapePagedViewHandler.java | 20 ++++ .../util/SplitConfigurationOptions.java | 13 ++- 18 files changed, 173 insertions(+), 174 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/util/GroupTask.java diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index a0a940b6f7..972ce4deda 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -1809,13 +1809,8 @@ public abstract class AbsSwipeUpHandler, mGestureState.updateLastStartedTaskId(taskId); boolean hasTaskPreviouslyAppeared = mGestureState.getPreviouslyAppearedTaskIds() .contains(taskId); - boolean isOldTaskSplit = LauncherSplitScreenListener.INSTANCE.getNoCreate() - .getRunningSplitTaskIds().length > 0; nextTask.launchTask(success -> { resultCallback.accept(success); - if (isOldTaskSplit) { - SystemUiProxy.INSTANCE.getNoCreate().exitSplitScreen(taskId); - } if (success) { if (hasTaskPreviouslyAppeared) { onRestartPreviouslyAppearedTask(); diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java index 79dd633b21..c5f4a53877 100644 --- a/quickstep/src/com/android/quickstep/RecentTasksList.java +++ b/quickstep/src/com/android/quickstep/RecentTasksList.java @@ -27,12 +27,14 @@ import android.util.SparseBooleanArray; import androidx.annotation.VisibleForTesting; +import com.android.quickstep.util.GroupTask; import com.android.launcher3.util.LooperExecutor; -import com.android.systemui.shared.recents.model.GroupTask; +import com.android.launcher3.util.SplitConfigurationOptions; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.KeyguardManagerCompat; import com.android.wm.shell.recents.IRecentTasksListener; import com.android.wm.shell.util.GroupedRecentTaskInfo; +import com.android.wm.shell.util.StagedSplitBounds; import java.util.ArrayList; import java.util.Collections; @@ -192,12 +194,23 @@ public class RecentTasksList { tmpLockedUsers.get(task2Key.userId) /* isLocked */); task2.setLastSnapshotData(taskInfo2); } - allTasks.add(new GroupTask(task1, task2)); + final SplitConfigurationOptions.StagedSplitBounds launcherSplitBounds = + convertSplitBounds(rawTask.mStagedSplitBounds); + allTasks.add(new GroupTask(task1, task2, launcherSplitBounds)); } return allTasks; } + private SplitConfigurationOptions.StagedSplitBounds convertSplitBounds( + StagedSplitBounds shellSplitBounds) { + return shellSplitBounds == null ? + null : + new SplitConfigurationOptions.StagedSplitBounds( + shellSplitBounds.leftTopBounds, shellSplitBounds.rightBottomBounds, + shellSplitBounds.leftTopTaskId, shellSplitBounds.rightBottomTaskId); + } + private ArrayList copyOf(ArrayList tasks) { ArrayList newTasks = new ArrayList<>(); for (int i = 0; i < tasks.size(); i++) { diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index 71153c64fa..ac97dd6ae8 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -34,7 +34,7 @@ import com.android.launcher3.icons.IconProvider; import com.android.launcher3.icons.IconProvider.IconChangeListener; import com.android.launcher3.util.Executors.SimpleThreadFactory; import com.android.launcher3.util.MainThreadInitializedObject; -import com.android.systemui.shared.recents.model.GroupTask; +import com.android.quickstep.util.GroupTask; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java index 5f2b49d07f..0871a6d150 100644 --- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java +++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java @@ -20,7 +20,7 @@ import android.content.Context; import androidx.annotation.Nullable; -import com.android.launcher3.util.SplitConfigurationOptions; +import com.android.launcher3.util.SplitConfigurationOptions.StagedSplitBounds; import com.android.quickstep.util.AnimatorControllerWithResistance; import com.android.quickstep.util.LauncherSplitScreenListener; import com.android.quickstep.util.TaskViewSimulator; @@ -33,7 +33,7 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat; */ public class RemoteTargetGluer { private RemoteTargetHandle[] mRemoteTargetHandles; - private SplitConfigurationOptions.StagedSplitBounds mStagedSplitBounds; + private StagedSplitBounds mStagedSplitBounds; /** * Use this constructor if remote targets are split-screen independent @@ -108,9 +108,9 @@ public class RemoteTargetGluer { primaryTaskTarget = targets.findTask(splitIds[0]); secondaryTaskTarget = targets.findTask(splitIds[1]); - mStagedSplitBounds = new SplitConfigurationOptions.StagedSplitBounds( + mStagedSplitBounds = new StagedSplitBounds( primaryTaskTarget.screenSpaceBounds, - secondaryTaskTarget.screenSpaceBounds); + secondaryTaskTarget.screenSpaceBounds, splitIds[0], splitIds[1]); mRemoteTargetHandles[0].mTransformParams.setTargetSet( createRemoteAnimationTargetsForTarget(primaryTaskTarget, targets)); mRemoteTargetHandles[0].mTaskViewSimulator.setPreview(primaryTaskTarget, @@ -135,7 +135,7 @@ public class RemoteTargetGluer { return mRemoteTargetHandles; } - public SplitConfigurationOptions.StagedSplitBounds getStagedSplitBounds() { + public StagedSplitBounds getStagedSplitBounds() { return mStagedSplitBounds; } diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java index a875b698f5..42397391dd 100644 --- a/quickstep/src/com/android/quickstep/SystemUiProxy.java +++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java @@ -572,53 +572,6 @@ public class SystemUiProxy implements ISystemUiProxy, mPendingSplitScreenListener = null; } - public void setSideStageVisibility(boolean visible) { - if (mSplitScreen != null) { - try { - mSplitScreen.setSideStageVisibility(visible); - } catch (RemoteException e) { - Log.w(TAG, "Failed call setSideStageVisibility"); - } - } - } - - /** - * To be called whenever the user exits out of split screen apps (either by launching another - * app or by swiping home) - * @param topTaskId The taskId of the new app that was launched. System will then move this task - * to the front of what the user sees while removing all other split stages. - * If swiping to home (or there is no task to put at the top), can pass in -1. - */ - public void exitSplitScreen(int topTaskId) { - if (mSplitScreen != null) { - try { - mSplitScreen.exitSplitScreen(topTaskId); - } catch (RemoteException e) { - Log.w(TAG, "Failed call exitSplitScreen"); - } - } - } - - public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { - if (mSplitScreen != null) { - try { - mSplitScreen.exitSplitScreenOnHide(exitSplitScreenOnHide); - } catch (RemoteException e) { - Log.w(TAG, "Failed call exitSplitScreen"); - } - } - } - - public void startTask(int taskId, int stage, int position, Bundle options) { - if (mSplitScreen != null) { - try { - mSplitScreen.startTask(taskId, stage, position, options); - } catch (RemoteException e) { - Log.w(TAG, "Failed call startTask"); - } - } - } - /** Start multiple tasks in split-screen simultaneously. */ public void startTasks(int mainTaskId, Bundle mainOptions, int sideTaskId, Bundle sideOptions, @SplitConfigurationOptions.StagePosition int sidePosition, diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 48315d0c8f..f56b70bf85 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -42,7 +42,7 @@ import com.android.quickstep.util.TaskViewSimulator; import com.android.quickstep.views.OverviewActionsView; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; -import com.android.systemui.shared.recents.model.GroupTask; +import com.android.quickstep.util.GroupTask; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.Task.TaskKey; @@ -174,7 +174,7 @@ public class FallbackRecentsView extends RecentsView(context, this, R.layout.task, 20 /* max size */, 10 /* initial size */); - // There's only one pair of grouped tasks we can envision at the moment mGroupedTaskViewPool = new ViewPool<>(context, this, - R.layout.task_grouped, 2 /* max size */, 1 /* initial size */); + R.layout.task_grouped, 20 /* max size */, 10 /* initial size */); mIsRtl = mOrientationHandler.getRecentsRtlSetting(getResources()); setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR); @@ -1070,6 +1068,10 @@ public abstract class RecentsView requiredTaskViewCount) { - removeView(getChildAt(getChildCount() - 1)); - } - int groupedTaskViewCount = getGroupedTaskViewCount(); - while (requiredGroupTaskViews > groupedTaskViewCount) { - // Add to front of list - addView(getTaskViewFromPool(true), 0); - requiredGroupTaskViews--; - } - if (requiredTaskViewCount > 0) { - addView(mClearAllButton); - } - } - // Save running task ID if it exists before rebinding all taskViews, otherwise the task from // the runningTaskView currently bound could get assigned to another TaskView - // TODO set these type to array and check all taskIDs? Maybe we can get away w/ only one int runningTaskId = getTaskIdsForTaskViewId(mRunningTaskViewId)[0]; int focusedTaskId = getTaskIdsForTaskViewId(mFocusedTaskViewId)[0]; - Log.d(TASK_VIEW_ID_CRASH, "runningTaskId beforeBind: " + runningTaskId - + " runningTaskViewId: " + mRunningTaskViewId - + " forTaskView: " + getTaskViewFromTaskViewId(mRunningTaskViewId)); - for (int taskViewIndex = requiredTaskViewCount - 1, taskDataIndex = taskGroups.size() - 1; - taskViewIndex >= 0; - taskViewIndex--, taskDataIndex--) { - final int pageIndex = requiredTaskViewCount - taskViewIndex - 1; - // TODO(b/202740477): Temporary assumption, to be updated once groups are actually used - final Task task = taskGroups.get(taskDataIndex).task1; - final TaskView taskView = (TaskView) getChildAt(pageIndex); - if (taskView instanceof GroupedTaskView) { - Task leftTop; - Task rightBottom; - if (task.key.id == splitTaskIds[0]) { - leftTop = task; - taskDataIndex--; - rightBottom = taskGroups.get(taskDataIndex).task1; - } else { - rightBottom = task; - taskDataIndex--; - leftTop = taskGroups.get(taskDataIndex).task1; - } - ((GroupedTaskView) taskView).bind(leftTop, rightBottom, mOrientationState, - mSplitBoundsConfig); + // Removing views sets the currentPage to 0, so we save this and restore it after + // the new set of views are added + int previousPage = mCurrentPage; + removeAllViews(); + + // Add views as children based on whether it's grouped or single task + for (int i = taskGroups.size() - 1; i >= 0; i--) { + GroupTask groupTask = taskGroups.get(i); + boolean hasMultipleTasks = groupTask.hasMultipleTasks(); + TaskView taskView = getTaskViewFromPool(hasMultipleTasks); + addView(taskView); + + if (hasMultipleTasks) { + ((GroupedTaskView) taskView).bind(groupTask.task1, groupTask.task2, + mOrientationState, groupTask.mStagedSplitBounds); } else { - taskView.bind(task, mOrientationState); + taskView.bind(groupTask.task1, mOrientationState); } } + if (!taskGroups.isEmpty()) { + addView(mClearAllButton); + } + setCurrentPage(previousPage); // Keep same previous focused task TaskView newFocusedTaskView = getTaskViewByTaskId(focusedTaskId); @@ -1405,21 +1369,10 @@ public abstract class RecentsView= 0; i--) { - final int pageIndex = requiredTaskViewCount - i - 1; - final TaskView taskView = (TaskView) getChildAt(pageIndex); - int taskViewId = taskView.getTaskViewId(); - sb.append(" taskViewId: " + taskViewId - + " taskId: " + getTaskIdsForTaskViewId(taskViewId)[0] - + " for taskView: " + taskView + "\n"); - } - Log.d(TASK_VIEW_ID_CRASH, "taskViewCount: " + getTaskViewCount() - + " " + sb.toString()); - mRunningTaskViewId = -1; - } else { + if (newRunningTaskView != null) { mRunningTaskViewId = newRunningTaskView.getTaskViewId(); + } else { + mRunningTaskViewId = -1; } } diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 97c47481c6..d114aedb89 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -690,13 +690,8 @@ public class TaskView extends FrameLayout implements Reusable { TestProtocol.SEQUENCE_MAIN, "startActivityFromRecentsAsync", mTask); ActivityOptionsWrapper opts = mActivity.getActivityLaunchOptions(this, null); opts.options.setLaunchDisplayId(getRootViewDisplayId()); - boolean isOldTaskSplit = LauncherSplitScreenListener.INSTANCE.getNoCreate() - .getPersistentSplitIds().length > 0; if (ActivityManagerWrapper.getInstance() .startActivityFromRecents(mTask.key, opts.options)) { - if (isOldTaskSplit) { - SystemUiProxy.INSTANCE.getNoCreate().exitSplitScreen(mTask.key.id); - } RecentsView recentsView = getRecentsView(); if (ENABLE_QUICKSTEP_LIVE_TILE.get() && recentsView.getRunningTaskViewId() != -1) { recentsView.onTaskLaunchedInLiveTileMode(); diff --git a/quickstep/tests/src/com/android/quickstep/RecentTasksListTest.java b/quickstep/tests/src/com/android/quickstep/RecentTasksListTest.java index 6b2d5ed920..4e497163b5 100644 --- a/quickstep/tests/src/com/android/quickstep/RecentTasksListTest.java +++ b/quickstep/tests/src/com/android/quickstep/RecentTasksListTest.java @@ -30,9 +30,7 @@ import android.app.ActivityManager; import androidx.test.filters.SmallTest; import com.android.launcher3.util.LooperExecutor; -import com.android.systemui.shared.recents.model.GroupTask; -import com.android.systemui.shared.recents.model.Task; -import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.quickstep.util.GroupTask; import com.android.systemui.shared.system.KeyguardManagerCompat; import com.android.wm.shell.util.GroupedRecentTaskInfo; @@ -73,7 +71,7 @@ public class RecentTasksListTest { @Test public void loadTasksInBackground_onlyKeys_noValidTaskDescription() { GroupedRecentTaskInfo recentTaskInfos = new GroupedRecentTaskInfo( - new ActivityManager.RecentTaskInfo(), new ActivityManager.RecentTaskInfo()); + new ActivityManager.RecentTaskInfo(), new ActivityManager.RecentTaskInfo(), null); when(mockSystemUiProxy.getRecentTasks(anyInt(), anyInt())) .thenReturn(new ArrayList<>(Collections.singletonList(recentTaskInfos))); @@ -93,7 +91,7 @@ public class RecentTasksListTest { ActivityManager.RecentTaskInfo task2 = new ActivityManager.RecentTaskInfo(); task2.taskDescription = new ActivityManager.TaskDescription(); GroupedRecentTaskInfo recentTaskInfos = new GroupedRecentTaskInfo( - task1, task2); + task1, task2, null); when(mockSystemUiProxy.getRecentTasks(anyInt(), anyInt())) .thenReturn(new ArrayList<>(Collections.singletonList(recentTaskInfos))); diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java index a190f529b1..93e3ea7599 100644 --- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java @@ -390,7 +390,7 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { @Override public void measureGroupedTaskViewThumbnailBounds(View primarySnapshot, View secondarySnapshot, int parentWidth, int parentHeight, - SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig, DeviceProfile dp) { + StagedSplitBounds splitBoundsConfig, DeviceProfile dp) { int spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx; int totalThumbnailHeight = parentHeight - spaceAboveSnapshot; int dividerBar = splitBoundsConfig.visualDividerBounds.width(); @@ -435,15 +435,18 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { (FrameLayout.LayoutParams) primaryIconView.getLayoutParams(); FrameLayout.LayoutParams secondaryIconParams = new FrameLayout.LayoutParams(primaryIconParams); + int dividerBar = (splitConfig.appsStackedVertically ? + splitConfig.visualDividerBounds.height() : + splitConfig.visualDividerBounds.width()); int primaryHeight = primarySnapshotBounds.height(); - int secondaryHeight = secondarySnapshotBounds.height(); primaryIconParams.gravity = (isRtl ? START : END) | TOP; - primaryIconView.setTranslationY((primaryHeight + taskIconHeight) / 2f ); + primaryIconView.setTranslationY(primaryHeight - primaryIconView.getHeight() / 2f); + primaryIconView.setTranslationX(0); secondaryIconParams.gravity = (isRtl ? START : END) | TOP; - secondaryIconView.setTranslationY(primaryHeight - + ((secondaryHeight + taskIconHeight) / 2f)); + secondaryIconView.setTranslationY(primaryHeight + taskIconHeight + dividerBar); + secondaryIconView.setTranslationX(0); primaryIconView.setLayoutParams(primaryIconParams); secondaryIconView.setLayoutParams(secondaryIconParams); } diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java index 8112afd8c0..2ff2feb4c5 100644 --- a/src/com/android/launcher3/touch/PagedOrientationHandler.java +++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java @@ -141,13 +141,12 @@ public interface PagedOrientationHandler { * @param desiredStagePosition Which stage position (topLeft/rightBottom) we want to resize * outRect for */ - void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect, - StagedSplitBounds splitInfo, + void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect, StagedSplitBounds splitInfo, @SplitConfigurationOptions.StagePosition int desiredStagePosition); void measureGroupedTaskViewThumbnailBounds(View primarySnapshot, View secondarySnapshot, int parentWidth, int parentHeight, - SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig, DeviceProfile dp); + StagedSplitBounds splitBoundsConfig, DeviceProfile dp); // Overview TaskMenuView methods void setIconAndSnapshotParams(View iconView, int taskIconMargin, int taskIconHeight, diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java index 576c6f5615..8caf886904 100644 --- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java +++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java @@ -16,7 +16,6 @@ package com.android.launcher3.touch; -import static android.view.Gravity.BOTTOM; import static android.view.Gravity.CENTER_HORIZONTAL; import static android.view.Gravity.START; import static android.view.Gravity.TOP; @@ -477,7 +476,7 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { @Override public void measureGroupedTaskViewThumbnailBounds(View primarySnapshot, View secondarySnapshot, int parentWidth, int parentHeight, - SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig, DeviceProfile dp) { + StagedSplitBounds splitBoundsConfig, DeviceProfile dp) { int spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx; int totalThumbnailHeight = parentHeight - spaceAboveSnapshot; int dividerBar = (splitBoundsConfig.appsStackedVertically ? @@ -535,23 +534,27 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { (FrameLayout.LayoutParams) primaryIconView.getLayoutParams(); FrameLayout.LayoutParams secondaryIconParams = new FrameLayout.LayoutParams(primaryIconParams); + int dividerBar = (splitConfig.appsStackedVertically ? + splitConfig.visualDividerBounds.height() : + splitConfig.visualDividerBounds.width()); + int primaryWidth = primarySnapshotBounds.width(); if (deviceProfile.isLandscape) { - int primaryWidth = primarySnapshotBounds.width(); - int secondaryWidth = secondarySnapshotBounds.width(); primaryIconParams.gravity = TOP | START; - primaryIconView.setTranslationX((primaryWidth - taskIconHeight) / 2f ); + primaryIconView.setTranslationX(primaryWidth - primaryIconView.getWidth()); + primaryIconView.setTranslationY(0); secondaryIconParams.gravity = TOP | START; - secondaryIconView.setTranslationX(primaryWidth - + ((secondaryWidth - taskIconHeight) / 2f)); - } else { - primaryIconView.setTranslationX(0); - secondaryIconView.setTranslationX(0); - primaryIconView.setTranslationY(0); + secondaryIconView.setTranslationX(primaryWidth + dividerBar); + secondaryIconView.setTranslationY(0); + } else { + primaryIconParams.gravity = TOP | CENTER_HORIZONTAL; + primaryIconView.setTranslationX(-(primaryIconView.getWidth()) / 2f); + primaryIconView.setTranslationY(0); + + secondaryIconParams.gravity = TOP | CENTER_HORIZONTAL; + secondaryIconView.setTranslationX(secondaryIconView.getWidth() / 2f); secondaryIconView.setTranslationY(0); - secondaryIconParams.gravity = BOTTOM | CENTER_HORIZONTAL; - secondaryIconParams.bottomMargin = -(secondaryIconParams.topMargin + taskIconHeight); } primaryIconView.setLayoutParams(primaryIconParams); secondaryIconView.setLayoutParams(secondaryIconParams); diff --git a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java index d5851c8074..a0dde22d84 100644 --- a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java @@ -19,6 +19,7 @@ package com.android.launcher3.touch; import static android.view.Gravity.CENTER_VERTICAL; import static android.view.Gravity.END; import static android.view.Gravity.START; +import static android.view.Gravity.TOP; import static com.android.launcher3.touch.SingleAxisSwipeDetector.HORIZONTAL; import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT; @@ -36,7 +37,9 @@ import android.widget.LinearLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.util.SplitConfigurationOptions; import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption; +import com.android.launcher3.util.SplitConfigurationOptions.StagedSplitBounds; import com.android.launcher3.views.BaseDragLayer; import java.util.Collections; @@ -127,6 +130,23 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler { iconParams.topMargin = snapshotParams.topMargin / 2; } + @Override + public void setSplitIconParams(View primaryIconView, View secondaryIconView, + int taskIconHeight, Rect primarySnapshotBounds, Rect secondarySnapshotBounds, + boolean isRtl, DeviceProfile deviceProfile, StagedSplitBounds splitConfig) { + super.setSplitIconParams(primaryIconView, secondaryIconView, taskIconHeight, + primarySnapshotBounds, secondarySnapshotBounds, isRtl, deviceProfile, splitConfig); + FrameLayout.LayoutParams primaryIconParams = + (FrameLayout.LayoutParams) primaryIconView.getLayoutParams(); + FrameLayout.LayoutParams secondaryIconParams = + (FrameLayout.LayoutParams) secondaryIconView.getLayoutParams(); + + primaryIconParams.gravity = (isRtl ? END : START) | TOP; + secondaryIconParams.gravity = (isRtl ? END : START) | TOP; + primaryIconView.setLayoutParams(primaryIconParams); + secondaryIconView.setLayoutParams(secondaryIconParams); + } + /* ---------- The following are only used by TaskViewTouchHandler. ---------- */ @Override diff --git a/src/com/android/launcher3/util/SplitConfigurationOptions.java b/src/com/android/launcher3/util/SplitConfigurationOptions.java index 0b083e3af4..6aef38fec3 100644 --- a/src/com/android/launcher3/util/SplitConfigurationOptions.java +++ b/src/com/android/launcher3/util/SplitConfigurationOptions.java @@ -85,6 +85,12 @@ public final class SplitConfigurationOptions { } } + /** + * NOTE: Engineers complained about too little ambiguity in the last survey, so there is a class + * with the same name/functionality in wm.shell.util (which launcher3 cannot be built against) + * + * If you make changes here, consider making the same changes there + */ public static class StagedSplitBounds { public final Rect leftTopBounds; public final Rect rightBottomBounds; @@ -100,10 +106,15 @@ public final class SplitConfigurationOptions { * the bounds were originally in */ public final boolean appsStackedVertically; + public final int leftTopTaskId; + public final int rightBottomTaskId; - public StagedSplitBounds(Rect leftTopBounds, Rect rightBottomBounds) { + public StagedSplitBounds(Rect leftTopBounds, Rect rightBottomBounds, int leftTopTaskId, + int rightBottomTaskId) { this.leftTopBounds = leftTopBounds; this.rightBottomBounds = rightBottomBounds; + this.leftTopTaskId = leftTopTaskId; + this.rightBottomTaskId = rightBottomTaskId; if (rightBottomBounds.top > leftTopBounds.top) { // vertical apps, horizontal divider