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

Commit 1df39e2c authored by Winson Chung's avatar Winson Chung
Browse files

Send task description changed though task org taskInfoChanged



- This removes the need for a separate task stack listener and aligns
  with other task info change properties
- Also implement equals/hashCode for the token so we can use it in
  containers

Bug: 148977538
Test: atest TaskOrganizerTests

Signed-off-by: default avatarWinson Chung <winsonc@google.com>
Change-Id: Ie035e6389fdbdc374c1a4b4a684758efa0cb7a9e
parent cb437ade
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -5232,14 +5232,14 @@ package android.window {
    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static java.util.List<android.app.ActivityManager.RunningTaskInfo> getChildTasks(@NonNull android.window.WindowContainerToken, @NonNull int[]);
    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static android.window.WindowContainerToken getImeTarget(int);
    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static java.util.List<android.app.ActivityManager.RunningTaskInfo> getRootTasks(int, @NonNull int[]);
    method public void onBackPressedOnTaskRoot(@NonNull android.app.ActivityManager.RunningTaskInfo);
    method public void onTaskAppeared(@NonNull android.app.ActivityManager.RunningTaskInfo);
    method public void onTaskInfoChanged(@NonNull android.app.ActivityManager.RunningTaskInfo);
    method public void onTaskVanished(@NonNull android.app.ActivityManager.RunningTaskInfo);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void registerOrganizer(int);
    method @BinderThread public void onBackPressedOnTaskRoot(@NonNull android.app.ActivityManager.RunningTaskInfo);
    method @BinderThread public void onTaskAppeared(@NonNull android.app.ActivityManager.RunningTaskInfo);
    method @BinderThread public void onTaskInfoChanged(@NonNull android.app.ActivityManager.RunningTaskInfo);
    method @BinderThread public void onTaskVanished(@NonNull android.app.ActivityManager.RunningTaskInfo);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public final void registerOrganizer(int);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void setInterceptBackPressedOnTaskRoot(boolean);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static void setLaunchRoot(int, @NonNull android.window.WindowContainerToken);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void unregisterOrganizer();
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public final void unregisterOrganizer();
  }

  public final class WindowContainerToken implements android.os.Parcelable {
+34 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.WorkSource;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.DisplayMetrics;
import android.util.Singleton;
@@ -1597,6 +1598,39 @@ public class ActivityManager {
                    + " resizeMode: " + ActivityInfo.resizeModeToString(mResizeMode)
                    + " minWidth: " + mMinWidth + " minHeight: " + mMinHeight;
        }

        @Override
        public boolean equals(Object obj) {
            if (!(obj instanceof TaskDescription)) {
                return false;
            }

            TaskDescription other = (TaskDescription) obj;
            return TextUtils.equals(mLabel, other.mLabel)
                    && TextUtils.equals(mIconFilename, other.mIconFilename)
                    && mIcon == other.mIcon
                    && mColorPrimary == other.mColorPrimary
                    && mColorBackground == other.mColorBackground
                    && mStatusBarColor == other.mStatusBarColor
                    && mNavigationBarColor == other.mNavigationBarColor
                    && mEnsureStatusBarContrastWhenTransparent
                            == other.mEnsureStatusBarContrastWhenTransparent
                    && mEnsureNavigationBarContrastWhenTransparent
                            == other.mEnsureNavigationBarContrastWhenTransparent
                    && mResizeMode == other.mResizeMode
                    && mMinWidth == other.mMinWidth
                    && mMinHeight == other.mMinHeight;
        }

        /** @hide */
        public static boolean equals(TaskDescription td1, TaskDescription td2) {
            if (td1 == null && td2 == null) {
                return true;
            } else if (td1 != null && td2 != null) {
                return td1.equals(td2);
            }
            return false;
        }
    }

    /**
+0 −24
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.app.ActivityTaskManager;
import android.app.ActivityView;
import android.app.IActivityTaskManager;
import android.app.PendingIntent;
import android.app.TaskStackListener;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -129,7 +128,6 @@ public abstract class TaskEmbedder {

    protected SurfaceControl.Transaction mTransaction;
    protected SurfaceControl mSurfaceControl;
    protected TaskStackListener mTaskStackListener;
    protected Listener mListener;
    protected boolean mOpened; // Protected by mGuard.

@@ -170,13 +168,6 @@ public abstract class TaskEmbedder {
        if (!onInitialize()) {
            return false;
        }

        mTaskStackListener = createTaskStackListener();
        try {
            mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
        } catch (RemoteException e) {
            Log.e(TAG, "Failed to register task stack listener", e);
        }
        if (mListener != null && isInitialized()) {
            mListener.onInitialized();
        }
@@ -186,11 +177,6 @@ public abstract class TaskEmbedder {
        return true;
    }

    /**
     * @return the task stack listener for this embedder
     */
    public abstract TaskStackListener createTaskStackListener();

    /**
     * Whether this container has been initialized.
     *
@@ -420,16 +406,6 @@ public abstract class TaskEmbedder {
        mSurfaceControl.release();

        boolean reportReleased = onRelease();

        if (mTaskStackListener != null) {
            try {
                mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener);
            } catch (RemoteException e) {
                Log.e(TAG, "Failed to unregister task stack listener", e);
            }
            mTaskStackListener = null;
        }

        if (mListener != null && reportReleased) {
            mListener.onReleased();
        }
+9 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.window;

import android.annotation.BinderThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -39,7 +40,7 @@ public class TaskOrganizer extends WindowOrganizer {
     * and receive taskVanished callbacks in the process.
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    public void registerOrganizer(int windowingMode) {
    public final void registerOrganizer(int windowingMode) {
        try {
            getController().registerTaskOrganizer(mInterface, windowingMode);
        } catch (RemoteException e) {
@@ -49,7 +50,7 @@ public class TaskOrganizer extends WindowOrganizer {

    /** Unregisters a previously registered task organizer. */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    public void unregisterOrganizer() {
    public final void unregisterOrganizer() {
        try {
            getController().unregisterTaskOrganizer(mInterface);
        } catch (RemoteException e) {
@@ -57,13 +58,17 @@ public class TaskOrganizer extends WindowOrganizer {
        }
    }

    @BinderThread
    public void onTaskAppeared(@NonNull ActivityManager.RunningTaskInfo taskInfo) {}

    @BinderThread
    public void onTaskVanished(@NonNull ActivityManager.RunningTaskInfo taskInfo) {}

    public void onTaskInfoChanged(@NonNull ActivityManager.RunningTaskInfo info) {}
    @BinderThread
    public void onTaskInfoChanged(@NonNull ActivityManager.RunningTaskInfo taskInfo) {}

    public void onBackPressedOnTaskRoot(@NonNull ActivityManager.RunningTaskInfo info) {}
    @BinderThread
    public void onBackPressedOnTaskRoot(@NonNull ActivityManager.RunningTaskInfo taskInfo) {}

    /** Creates a persistent root task in WM for a particular windowing-mode. */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
+7 −30
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;

import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.ActivityView;
import android.app.TaskStackListener;
import android.content.Context;
import android.graphics.Rect;
@@ -55,11 +54,6 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder {
        super(context, host);
    }

    @Override
    public TaskStackListener createTaskStackListener() {
        return new TaskStackListenerImpl();
    }

    /**
     * Whether this container has been initialized.
     *
@@ -219,29 +213,6 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder {
        Log.d(TAG, "[" + System.identityHashCode(this) + "] " + msg);
    }

    /**
     * A task change listener that detects background color change of the topmost stack on our
     * virtual display and updates the background of the surface view. This background will be shown
     * when surface view is resized, but the app hasn't drawn its content in new size yet.
     * It also calls StateCallback.onTaskMovedToFront to notify interested parties that the stack
     * associated with the {@link ActivityView} has had a Task moved to the front. This is useful
     * when needing to also bring the host Activity to the foreground at the same time.
     */
    private class TaskStackListenerImpl extends TaskStackListener {

        @Override
        public void onTaskDescriptionChanged(ActivityManager.RunningTaskInfo taskInfo) {
            if (!isInitialized()) {
                return;
            }
            if (taskInfo.taskId == mTaskInfo.taskId) {
                mTaskInfo.taskDescription = taskInfo.taskDescription;
                mHost.onTaskBackgroundColorChanged(TaskOrganizerTaskEmbedder.this,
                        taskInfo.taskDescription.getBackgroundColor());
            }
        }
    }

    private class TaskOrganizerImpl extends TaskOrganizer {
        @Override
        public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo) {
@@ -249,7 +220,6 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder {
                log("taskAppeared: " + taskInfo.taskId);
            }

            // TODO: Ensure visibility/alpha of the leash in its initial state?
            mTaskInfo = taskInfo;
            mTaskToken = taskInfo.token;
            mTaskLeash = mTaskToken.getLeash();
@@ -269,6 +239,13 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder {
            }
        }

        @Override
        public void onTaskInfoChanged(ActivityManager.RunningTaskInfo taskInfo) {
            mTaskInfo.taskDescription = taskInfo.taskDescription;
            mHost.post(() -> mHost.onTaskBackgroundColorChanged(TaskOrganizerTaskEmbedder.this,
                    taskInfo.taskDescription.getBackgroundColor()));
        }

        @Override
        public void onTaskVanished(ActivityManager.RunningTaskInfo taskInfo) {
            if (DEBUG) {
Loading