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

Commit 02a5a6bb authored by Wale Ogunwale's avatar Wale Ogunwale Committed by Android (Google) Code Review
Browse files

Merge "Added StackId object for checking what features a stack supports"

parents aad093b6 3797c22e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@

package com.android.commands.am;

import static android.app.ActivityManager.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.RESIZE_MODE_SYSTEM;
import static android.app.ActivityManager.RESIZE_MODE_USER;

+2 −2
Original line number Diff line number Diff line
@@ -2728,8 +2728,8 @@ public class Activity extends ContextThemeWrapper
    /**
     * Called to move the window and its activity/task to a different stack container.
     * For example, a window can move between
     * {@link android.app.ActivityManager#FULLSCREEN_WORKSPACE_STACK_ID} stack and
     * {@link android.app.ActivityManager#FREEFORM_WORKSPACE_STACK_ID} stack.
     * {@link android.app.ActivityManager.StackId#FULLSCREEN_WORKSPACE_STACK_ID} stack and
     * {@link android.app.ActivityManager.StackId#FREEFORM_WORKSPACE_STACK_ID} stack.
     *
     * @param stackId stack Id to change to.
     * @hide
+98 −47
Original line number Diff line number Diff line
@@ -73,7 +73,6 @@ import java.util.List;
 */
public class ActivityManager {
    private static String TAG = "ActivityManager";
    private static boolean localLOGV = false;

    private static int gMaxRecentTasks = -1;

@@ -397,60 +396,112 @@ public class ActivityManager {
     */
    public static final int COMPAT_MODE_TOGGLE = 2;

    /** @hide */
    public static class StackId {
        /** Invalid stack ID. */
        public static final int INVALID_STACK_ID = -1;

        /** First static stack ID. */
        public static final int FIRST_STATIC_STACK_ID = 0;

        /** Home activity stack ID. */
        public static final int HOME_STACK_ID = FIRST_STATIC_STACK_ID;

        /** ID of stack where fullscreen activities are normally launched into. */
        public static final int FULLSCREEN_WORKSPACE_STACK_ID = 1;

        /** ID of stack where freeform/resized activities are normally launched into. */
        public static final int FREEFORM_WORKSPACE_STACK_ID = FULLSCREEN_WORKSPACE_STACK_ID + 1;

        /** ID of stack that occupies a dedicated region of the screen. */
        public static final int DOCKED_STACK_ID = FREEFORM_WORKSPACE_STACK_ID + 1;

        /** ID of stack that always on top (always visible) when it exist. */
        public static final int PINNED_STACK_ID = DOCKED_STACK_ID + 1;

        /** Last static stack stack ID. */
        public static final int LAST_STATIC_STACK_ID = PINNED_STACK_ID;

        /** Start of ID range used by stacks that are created dynamically. */
        public static final int FIRST_DYNAMIC_STACK_ID = LAST_STATIC_STACK_ID + 1;

        public static boolean isStaticStack(int stackId) {
            return stackId >= FIRST_STATIC_STACK_ID && stackId <= LAST_STATIC_STACK_ID;
        }

        /**
     * Invalid stack ID.
     * @hide
         * Returns true if the activities contained in the input stack display a shadow around
         * their border.
         */
    public static final int INVALID_STACK_ID = -1;
        public static boolean hasWindowShadow(int stackId) {
            return stackId == FREEFORM_WORKSPACE_STACK_ID || stackId == PINNED_STACK_ID;
        }

        /**
     * First static stack ID.
     * @hide
         * Returns true if the activities contained in the input stack display a decor view.
         */
    public static final int FIRST_STATIC_STACK_ID = 0;
        public static boolean hasWindowDecor(int stackId) {
            return stackId == FREEFORM_WORKSPACE_STACK_ID;
        }

        /**
     * Home activity stack ID.
     * @hide
         * Returns true if the tasks contained in the stack can be resized independently of the
         * stack.
         */
    public static final int HOME_STACK_ID = FIRST_STATIC_STACK_ID;
        public static boolean isTaskResizeAllowed(int stackId) {
            return stackId == FREEFORM_WORKSPACE_STACK_ID;
        }

        /**
     * ID of stack where fullscreen activities are normally launched into.
     * @hide
         * Returns true if the task bounds should persist across power cycles.
         */
    public static final int FULLSCREEN_WORKSPACE_STACK_ID = 1;
        public static boolean persistTaskBounds(int stackId) {
            return isStaticStack(stackId) &&
                    stackId != DOCKED_STACK_ID && stackId != PINNED_STACK_ID;
        }

        /**
     * ID of stack where freeform/resized activities are normally launched into.
     * @hide
         * Returns true if dynamic stacks are allowed to be visible behind the input stack.
         */
    public static final int FREEFORM_WORKSPACE_STACK_ID = FULLSCREEN_WORKSPACE_STACK_ID + 1;
        public static boolean isDynamicStacksVisibleBehindAllowed(int stackId) {
            return stackId == PINNED_STACK_ID;
        }

        /**
     * ID of stack that occupies a dedicated region of the screen.
     * @hide
         * Returns true if we try to maintain focus in the current stack when the top activity
         * finishes.
         */
    public static final int DOCKED_STACK_ID = FREEFORM_WORKSPACE_STACK_ID + 1;
        public static boolean keepFocusInStackIfPossible(int stackId) {
            return stackId == FREEFORM_WORKSPACE_STACK_ID
                    || stackId == DOCKED_STACK_ID || stackId == PINNED_STACK_ID;
        }

        /**
     * ID of stack that always on top (always visible) when it exist.
     * Mainly used for this in Picture-in-Picture mode.
     * @hide
         * Returns true if Stack size is affected by the docked stack changing size.
         */
    public static final int PINNED_STACK_ID = DOCKED_STACK_ID + 1;
        public static boolean isResizeableByDockedStack(int stackId) {
            return isStaticStack(stackId) &&
                    stackId != DOCKED_STACK_ID && stackId != PINNED_STACK_ID;
        }

        /**
     * Last static stack stack ID.
     * @hide
         * Returns true if the size of tasks in the input stack are affected by the docked stack
         * changing size.
         */
    public static final int LAST_STATIC_STACK_ID = PINNED_STACK_ID;
        public static boolean isTaskResizeableByDockedStack(int stackId) {
            return isStaticStack(stackId) && stackId != FREEFORM_WORKSPACE_STACK_ID
                    && stackId != DOCKED_STACK_ID && stackId != PINNED_STACK_ID;
        }

        /**
     * Start of ID range used by stacks that are created dynamically.
     * @hide
         * Returns true if the windows of tasks being moved to this stack should be preserved so
         * there isn't a display gap.
         */
    public static final int FIRST_DYNAMIC_STACK_ID = LAST_STATIC_STACK_ID + 1;
        public static boolean preserveWindowOnTaskMove(int stackId) {
            return stackId == FULLSCREEN_WORKSPACE_STACK_ID
                    || stackId == DOCKED_STACK_ID || stackId == PINNED_STACK_ID;
        }
    }

    /**
     * Input parameter to {@link android.app.IActivityManager#moveTaskToDockedStack} which
+2 −2
Original line number Diff line number Diff line
@@ -552,8 +552,8 @@ public abstract class Window {
        /**
         * Called to move the window and its activity/task to a different stack container.
         * For example, a window can move between
         * {@link android.app.ActivityManager#FULLSCREEN_WORKSPACE_STACK_ID} stack and
         * {@link android.app.ActivityManager#FREEFORM_WORKSPACE_STACK_ID} stack.
         * {@link android.app.ActivityManager.StackId#FULLSCREEN_WORKSPACE_STACK_ID} stack and
         * {@link android.app.ActivityManager.StackId#FREEFORM_WORKSPACE_STACK_ID} stack.
         *
         * @param stackId stack Id to change to.
         */
+12 −31
Original line number Diff line number Diff line
@@ -16,11 +16,8 @@

package com.android.internal.policy;

import static android.app.ActivityManager.FIRST_DYNAMIC_STACK_ID;
import static android.app.ActivityManager.FREEFORM_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.INVALID_STACK_ID;
import static android.app.ActivityManager.PINNED_STACK_ID;
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.view.View.MeasureSpec.AT_MOST;
import static android.view.View.MeasureSpec.EXACTLY;
import static android.view.View.MeasureSpec.getMode;
@@ -30,6 +27,7 @@ import static android.view.WindowManager.LayoutParams.*;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.app.ActivityManager.StackId;
import android.app.ActivityManagerNative;
import android.app.SearchManager;
import android.os.Build;
@@ -737,9 +735,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
            if (mWorkspaceId != workspaceId) {
                mWorkspaceId = workspaceId;
                // We might have to change the kind of surface before we do anything else.
                mNonClientDecorView.phoneWindowUpdated(hasNonClientDecor(mWorkspaceId),
                        nonClientDecorHasShadow(mWorkspaceId));
                mDecor.enableNonClientDecor(hasNonClientDecor(workspaceId));
                mNonClientDecorView.phoneWindowUpdated(StackId.hasWindowDecor(mWorkspaceId),
                        StackId.hasWindowShadow(mWorkspaceId));
                mDecor.enableNonClientDecor(StackId.hasWindowDecor(workspaceId));
            }
        }
    }
@@ -3735,7 +3733,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
         * @return Returns true when the window has a shadow created by the non client decor.
         **/
        private boolean windowHasShadow() {
            return windowHasNonClientDecor() && nonClientDecorHasShadow(mWindow.mWorkspaceId);
            return windowHasNonClientDecor() && StackId.hasWindowShadow(mWindow.mWorkspaceId);
        }

        void setWindow(PhoneWindow phoneWindow) {
@@ -4234,7 +4232,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
        mWorkspaceId = getWorkspaceId();
        // Only a non floating application window on one of the allowed workspaces can get a non
        // client decor.
        if (!isFloating() && isApplication && mWorkspaceId < FIRST_DYNAMIC_STACK_ID) {
        if (!isFloating() && isApplication && StackId.isStaticStack(mWorkspaceId)) {
            // Dependent on the brightness of the used title we either use the
            // dark or the light button frame.
            if (nonClientDecorView == null) {
@@ -4250,12 +4248,13 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
                            R.layout.non_client_decor_light, null);
                }
            }
            nonClientDecorView.setPhoneWindow(this, hasNonClientDecor(mWorkspaceId),
                    nonClientDecorHasShadow(mWorkspaceId), getResizingBackgroundDrawable(),
            nonClientDecorView.setPhoneWindow(this, StackId.hasWindowDecor(mWorkspaceId),
                    StackId.hasWindowShadow(mWorkspaceId), getResizingBackgroundDrawable(),
                    mDecor.getContext().getDrawable(R.drawable.non_client_decor_title_focused));
        }
        // Tell the decor if it has a visible non client decor.
        mDecor.enableNonClientDecor(nonClientDecorView != null && hasNonClientDecor(mWorkspaceId));
        mDecor.enableNonClientDecor(
                nonClientDecorView != null&& StackId.hasWindowDecor(mWorkspaceId));

        return nonClientDecorView;
    }
@@ -5428,24 +5427,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
        return workspaceId;
    }

    /**
     * Determines if the window should show a non client decor for the workspace it is in.
     * @param workspaceId The Id of the workspace which contains this window.
     * @Return Returns true if the window should show a non client decor.
     **/
    private static boolean hasNonClientDecor(int workspaceId) {
        return workspaceId == FREEFORM_WORKSPACE_STACK_ID;
    }

    /**
     * Determines if the window should show a shadow or not, dependent on the workspace.
     * @param workspaceId The Id of the workspace which contains this window.
     * @Return Returns true if the window should show a shadow.
     **/
    private static boolean nonClientDecorHasShadow(int workspaceId) {
        return workspaceId == FREEFORM_WORKSPACE_STACK_ID || workspaceId == PINNED_STACK_ID;
    }

    @Override
    public void setTheme(int resid) {
        mTheme = resid;
Loading