Loading quickstep/src/com/android/quickstep/TaskOverlayFactory.java +4 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import androidx.annotation.RequiresApi; import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.R; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.popup.SystemShortcut; Loading Loading @@ -77,9 +78,11 @@ public class TaskOverlayFactory implements ResourceBasedOverride { RecentsOrientedState orientedState = taskView.getRecentsView().getPagedViewOrientedState(); boolean canLauncherRotate = orientedState.isRecentsActivityRotationAllowed(); boolean isInLandscape = orientedState.getTouchRotation() != ROTATION_0; boolean isTablet = activity.getDeviceProfile().isTablet; // Add overview actions to the menu when in in-place rotate landscape mode. if (!canLauncherRotate && isInLandscape) { if ((!canLauncherRotate && isInLandscape) || (isTablet && FeatureFlags.ENABLE_GRID_ONLY_OVERVIEW.get())) { // Add screenshot action to task menu. List<SystemShortcut> screenshotShortcuts = TaskShortcutFactory.SCREENSHOT .getShortcuts(activity, taskContainer); Loading quickstep/src/com/android/quickstep/views/OverviewActionsView.java +3 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,8 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo HIDDEN_NO_TASKS, HIDDEN_NO_RECENTS, HIDDEN_SPLIT_SCREEN, HIDDEN_SPLIT_SELECT_ACTIVE HIDDEN_SPLIT_SELECT_ACTIVE, HIDDEN_ACTIONS_IN_MENU }) @Retention(RetentionPolicy.SOURCE) public @interface ActionsHiddenFlags { } Loading @@ -65,6 +66,7 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo public static final int HIDDEN_NO_RECENTS = 1 << 2; public static final int HIDDEN_SPLIT_SCREEN = 1 << 3; public static final int HIDDEN_SPLIT_SELECT_ACTIVE = 1 << 4; public static final int HIDDEN_ACTIONS_IN_MENU = 1 << 5; @IntDef(flag = true, value = { DISABLED_SCROLLING, Loading quickstep/src/com/android/quickstep/views/RecentsView.java +5 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import static com.android.launcher3.anim.Interpolators.FINAL_FRAME; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.anim.Interpolators.OVERSHOOT_0_75; import static com.android.launcher3.anim.Interpolators.clampToProgress; import static com.android.launcher3.config.FeatureFlags.ENABLE_GRID_ONLY_OVERVIEW; import static com.android.launcher3.config.FeatureFlags.ENABLE_LAUNCH_FROM_STAGED_APP; import static com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_IN_OVERVIEW; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_OVERVIEW_ACTIONS_SPLIT; Loading @@ -60,6 +61,7 @@ import static com.android.quickstep.views.ClearAllButton.DISMISS_ALPHA; import static com.android.quickstep.views.DesktopTaskView.DESKTOP_MODE_SUPPORTED; import static com.android.quickstep.views.OverviewActionsView.FLAG_IS_NOT_TABLET; import static com.android.quickstep.views.OverviewActionsView.FLAG_SINGLE_TASK; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_ACTIONS_IN_MENU; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NON_ZERO_ROTATION; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_RECENTS; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_TASKS; Loading Loading @@ -1864,6 +1866,9 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T DeviceProfile dp = mActivity.getDeviceProfile(); setOverviewGridEnabled( mActivity.getStateManager().getState().displayOverviewTasksAsGrid(dp)); if (ENABLE_GRID_ONLY_OVERVIEW.get()) { mActionsView.updateHiddenFlags(HIDDEN_ACTIONS_IN_MENU, dp.isTablet); } setPageSpacing(dp.overviewPageSpacing); // Propagate DeviceProfile change event. Loading quickstep/src/com/android/quickstep/views/TaskMenuViewWithArrow.kt +10 −12 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { fun showForTask( taskContainer: TaskIdAttributeContainer, alignSecondRow: Boolean = false alignedOptionIndex: Int = 0 ): Boolean { val activity = BaseDraggingActivity.fromContext<BaseDraggingActivity>( Loading @@ -59,7 +59,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { false ) as TaskMenuViewWithArrow<*> return taskMenuViewWithArrow.populateAndShowForTask(taskContainer, alignSecondRow) return taskMenuViewWithArrow.populateAndShowForTask(taskContainer, alignedOptionIndex) } } Loading @@ -82,9 +82,9 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { CLOSE_FADE_DURATION = CLOSE_CHILD_FADE_DURATION } private var alignSecondRow: Boolean = false private val extraSpaceForSecondRowAlignment: Int get() = if (alignSecondRow) optionMeasuredHeight else 0 private var alignedOptionIndex: Int = 0 private val extraSpaceForRowAlignment: Int get() = optionMeasuredHeight * alignedOptionIndex private val menuWidth = context.resources.getDimensionPixelSize(R.dimen.task_menu_width_grid) private lateinit var taskView: TaskView Loading Loading @@ -125,7 +125,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { private fun populateAndShowForTask( taskContainer: TaskIdAttributeContainer, alignSecondRow: Boolean alignedOptionIndex: Int ): Boolean { if (isAttachedToWindow) { return false Loading @@ -133,7 +133,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { taskView = taskContainer.taskView this.taskContainer = taskContainer this.alignSecondRow = alignSecondRow this.alignedOptionIndex = alignedOptionIndex if (!populateMenu()) return false addScrim() show() Loading Loading @@ -257,8 +257,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { } /** * Orients this container to the left or right of the given icon, aligning with the first option * or second. * Orients this container to the left or right of the given icon, aligning with the desired row. * * These are the preferred orientations, in order (RTL prefers right-aligned over left): * - Right and first option aligned Loading Loading @@ -298,7 +297,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { // Offset y so that the arrow and row are center-aligned with the original icon. val iconHeight = mTempRect.height() val yOffset = (optionMeasuredHeight - iconHeight) / 2 var menuStartY = mTempRect.top - yOffset - extraSpaceForSecondRowAlignment var menuStartY = mTempRect.top - yOffset - extraSpaceForRowAlignment // Insets are added later, so subtract them now. menuStartX -= insets.left Loading @@ -316,8 +315,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { override fun addArrow() { popupContainer.addView(mArrow) mArrow.x = getArrowX() mArrow.y = y + (optionMeasuredHeight / 2) - (mArrowHeight / 2) + extraSpaceForSecondRowAlignment mArrow.y = y + (optionMeasuredHeight / 2) - (mArrowHeight / 2) + extraSpaceForRowAlignment updateArrowColor() Loading quickstep/src/com/android/quickstep/views/TaskView.java +15 −4 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.popup.SystemShortcut; import com.android.launcher3.statemanager.StatefulActivity; Loading Loading @@ -953,10 +954,20 @@ public class TaskView extends FrameLayout implements Reusable { protected boolean showTaskMenuWithContainer(IconView iconView) { TaskIdAttributeContainer menuContainer = mTaskIdAttributeContainer[iconView == mIconView ? 0 : 1]; if (mActivity.getDeviceProfile().isTablet) { boolean alignSecondRow = getRecentsView().isOnGridBottomRow(menuContainer.getTaskView()) && mActivity.getDeviceProfile().isLandscape; return TaskMenuViewWithArrow.Companion.showForTask(menuContainer, alignSecondRow); DeviceProfile dp = mActivity.getDeviceProfile(); if (dp.isTablet) { int alignedOptionIndex = 0; if (getRecentsView().isOnGridBottomRow(menuContainer.getTaskView()) && dp.isLandscape) { if (FeatureFlags.ENABLE_GRID_ONLY_OVERVIEW.get()) { // With no focused task, there is less available space below the tasks, so align // the arrow to the third option in the menu. alignedOptionIndex = 2; } else { // Bottom row of landscape grid aligns arrow to second option to avoid clipping alignedOptionIndex = 1; } } return TaskMenuViewWithArrow.Companion.showForTask(menuContainer, alignedOptionIndex); } else { return TaskMenuView.showForTask(menuContainer); } Loading Loading
quickstep/src/com/android/quickstep/TaskOverlayFactory.java +4 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import androidx.annotation.RequiresApi; import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.R; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.popup.SystemShortcut; Loading Loading @@ -77,9 +78,11 @@ public class TaskOverlayFactory implements ResourceBasedOverride { RecentsOrientedState orientedState = taskView.getRecentsView().getPagedViewOrientedState(); boolean canLauncherRotate = orientedState.isRecentsActivityRotationAllowed(); boolean isInLandscape = orientedState.getTouchRotation() != ROTATION_0; boolean isTablet = activity.getDeviceProfile().isTablet; // Add overview actions to the menu when in in-place rotate landscape mode. if (!canLauncherRotate && isInLandscape) { if ((!canLauncherRotate && isInLandscape) || (isTablet && FeatureFlags.ENABLE_GRID_ONLY_OVERVIEW.get())) { // Add screenshot action to task menu. List<SystemShortcut> screenshotShortcuts = TaskShortcutFactory.SCREENSHOT .getShortcuts(activity, taskContainer); Loading
quickstep/src/com/android/quickstep/views/OverviewActionsView.java +3 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,8 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo HIDDEN_NO_TASKS, HIDDEN_NO_RECENTS, HIDDEN_SPLIT_SCREEN, HIDDEN_SPLIT_SELECT_ACTIVE HIDDEN_SPLIT_SELECT_ACTIVE, HIDDEN_ACTIONS_IN_MENU }) @Retention(RetentionPolicy.SOURCE) public @interface ActionsHiddenFlags { } Loading @@ -65,6 +66,7 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo public static final int HIDDEN_NO_RECENTS = 1 << 2; public static final int HIDDEN_SPLIT_SCREEN = 1 << 3; public static final int HIDDEN_SPLIT_SELECT_ACTIVE = 1 << 4; public static final int HIDDEN_ACTIONS_IN_MENU = 1 << 5; @IntDef(flag = true, value = { DISABLED_SCROLLING, Loading
quickstep/src/com/android/quickstep/views/RecentsView.java +5 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import static com.android.launcher3.anim.Interpolators.FINAL_FRAME; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.anim.Interpolators.OVERSHOOT_0_75; import static com.android.launcher3.anim.Interpolators.clampToProgress; import static com.android.launcher3.config.FeatureFlags.ENABLE_GRID_ONLY_OVERVIEW; import static com.android.launcher3.config.FeatureFlags.ENABLE_LAUNCH_FROM_STAGED_APP; import static com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_IN_OVERVIEW; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_OVERVIEW_ACTIONS_SPLIT; Loading @@ -60,6 +61,7 @@ import static com.android.quickstep.views.ClearAllButton.DISMISS_ALPHA; import static com.android.quickstep.views.DesktopTaskView.DESKTOP_MODE_SUPPORTED; import static com.android.quickstep.views.OverviewActionsView.FLAG_IS_NOT_TABLET; import static com.android.quickstep.views.OverviewActionsView.FLAG_SINGLE_TASK; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_ACTIONS_IN_MENU; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NON_ZERO_ROTATION; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_RECENTS; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_TASKS; Loading Loading @@ -1864,6 +1866,9 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T DeviceProfile dp = mActivity.getDeviceProfile(); setOverviewGridEnabled( mActivity.getStateManager().getState().displayOverviewTasksAsGrid(dp)); if (ENABLE_GRID_ONLY_OVERVIEW.get()) { mActionsView.updateHiddenFlags(HIDDEN_ACTIONS_IN_MENU, dp.isTablet); } setPageSpacing(dp.overviewPageSpacing); // Propagate DeviceProfile change event. Loading
quickstep/src/com/android/quickstep/views/TaskMenuViewWithArrow.kt +10 −12 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { fun showForTask( taskContainer: TaskIdAttributeContainer, alignSecondRow: Boolean = false alignedOptionIndex: Int = 0 ): Boolean { val activity = BaseDraggingActivity.fromContext<BaseDraggingActivity>( Loading @@ -59,7 +59,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { false ) as TaskMenuViewWithArrow<*> return taskMenuViewWithArrow.populateAndShowForTask(taskContainer, alignSecondRow) return taskMenuViewWithArrow.populateAndShowForTask(taskContainer, alignedOptionIndex) } } Loading @@ -82,9 +82,9 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { CLOSE_FADE_DURATION = CLOSE_CHILD_FADE_DURATION } private var alignSecondRow: Boolean = false private val extraSpaceForSecondRowAlignment: Int get() = if (alignSecondRow) optionMeasuredHeight else 0 private var alignedOptionIndex: Int = 0 private val extraSpaceForRowAlignment: Int get() = optionMeasuredHeight * alignedOptionIndex private val menuWidth = context.resources.getDimensionPixelSize(R.dimen.task_menu_width_grid) private lateinit var taskView: TaskView Loading Loading @@ -125,7 +125,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { private fun populateAndShowForTask( taskContainer: TaskIdAttributeContainer, alignSecondRow: Boolean alignedOptionIndex: Int ): Boolean { if (isAttachedToWindow) { return false Loading @@ -133,7 +133,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { taskView = taskContainer.taskView this.taskContainer = taskContainer this.alignSecondRow = alignSecondRow this.alignedOptionIndex = alignedOptionIndex if (!populateMenu()) return false addScrim() show() Loading Loading @@ -257,8 +257,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { } /** * Orients this container to the left or right of the given icon, aligning with the first option * or second. * Orients this container to the left or right of the given icon, aligning with the desired row. * * These are the preferred orientations, in order (RTL prefers right-aligned over left): * - Right and first option aligned Loading Loading @@ -298,7 +297,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { // Offset y so that the arrow and row are center-aligned with the original icon. val iconHeight = mTempRect.height() val yOffset = (optionMeasuredHeight - iconHeight) / 2 var menuStartY = mTempRect.top - yOffset - extraSpaceForSecondRowAlignment var menuStartY = mTempRect.top - yOffset - extraSpaceForRowAlignment // Insets are added later, so subtract them now. menuStartX -= insets.left Loading @@ -316,8 +315,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> { override fun addArrow() { popupContainer.addView(mArrow) mArrow.x = getArrowX() mArrow.y = y + (optionMeasuredHeight / 2) - (mArrowHeight / 2) + extraSpaceForSecondRowAlignment mArrow.y = y + (optionMeasuredHeight / 2) - (mArrowHeight / 2) + extraSpaceForRowAlignment updateArrowColor() Loading
quickstep/src/com/android/quickstep/views/TaskView.java +15 −4 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.popup.SystemShortcut; import com.android.launcher3.statemanager.StatefulActivity; Loading Loading @@ -953,10 +954,20 @@ public class TaskView extends FrameLayout implements Reusable { protected boolean showTaskMenuWithContainer(IconView iconView) { TaskIdAttributeContainer menuContainer = mTaskIdAttributeContainer[iconView == mIconView ? 0 : 1]; if (mActivity.getDeviceProfile().isTablet) { boolean alignSecondRow = getRecentsView().isOnGridBottomRow(menuContainer.getTaskView()) && mActivity.getDeviceProfile().isLandscape; return TaskMenuViewWithArrow.Companion.showForTask(menuContainer, alignSecondRow); DeviceProfile dp = mActivity.getDeviceProfile(); if (dp.isTablet) { int alignedOptionIndex = 0; if (getRecentsView().isOnGridBottomRow(menuContainer.getTaskView()) && dp.isLandscape) { if (FeatureFlags.ENABLE_GRID_ONLY_OVERVIEW.get()) { // With no focused task, there is less available space below the tasks, so align // the arrow to the third option in the menu. alignedOptionIndex = 2; } else { // Bottom row of landscape grid aligns arrow to second option to avoid clipping alignedOptionIndex = 1; } } return TaskMenuViewWithArrow.Companion.showForTask(menuContainer, alignedOptionIndex); } else { return TaskMenuView.showForTask(menuContainer); } Loading