Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b8f766b authored by Pat Manning's avatar Pat Manning
Browse files

Move overview actions to task menu when no focused task.

Bug: 265641913
Test: manual
Change-Id: I03a88275b399940468246a69365f76f7deda724e
parent c3cb117b
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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);
+3 −1
Original line number Diff line number Diff line
@@ -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 { }
@@ -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,
+5 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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.
+10 −12
Original line number Diff line number Diff line
@@ -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>(
@@ -59,7 +59,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> {
                    false
                ) as TaskMenuViewWithArrow<*>

            return taskMenuViewWithArrow.populateAndShowForTask(taskContainer, alignSecondRow)
            return taskMenuViewWithArrow.populateAndShowForTask(taskContainer, alignedOptionIndex)
        }
    }

@@ -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
@@ -125,7 +125,7 @@ class TaskMenuViewWithArrow<T : BaseDraggingActivity> : ArrowPopup<T> {

    private fun populateAndShowForTask(
        taskContainer: TaskIdAttributeContainer,
        alignSecondRow: Boolean
        alignedOptionIndex: Int
    ): Boolean {
        if (isAttachedToWindow) {
            return false
@@ -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()
@@ -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
@@ -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
@@ -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()

+15 −4
Original line number Diff line number Diff line
@@ -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;
@@ -940,10 +941,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