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

Commit f820ea88 authored by Hongwei Wang's avatar Hongwei Wang
Browse files

Make WindowOrganizer and TaskOrganizer non-static

This is to allow unit test against TaskOrganizer, WindowOrganizer for
interations between Shell and WM core.

To test on WM side
```
when(mWindowOrganizer.getWindowOrganizerController())
    .thenReturn(mockedWindowOrganizerController);
when(mockedWindowOrganizerController.getTaskOrganizerController())
    .thenReturn(mockedTaskOrganizerController)

doSomeTest();

verify(mockedWindowOrganizerController).somethingHappended();
verify(mockedTaskOrganizerController).somethingHappended();
```

To test on Shell side
```
ShellTaskOrganizer organizer = new ShellTaskOrganizer(
        mockedTaskOrganizerController)

doSomeTest()

verify(mockedTaskOrganizerController).somethingHappended();
```

Removed also
- Singleton pattern in TaskOrganizer and DisplayAreaOrganizer as it's
  redundant to what's in WindowOrganizer
- static getController methods in both TaskOrganizer and
  DisplayAreaOrganizer as we prefer non-static for testability
- static methods in TaskOrganizer in general
- static methods in WindowManagerProxy in general

Bug: 161711455
Bug: 149338177
Test: make sure everything still works
Test: atest WmTests:WindowOrganizerTests \
            WmTests:DisplayAreaOrganizerTest
Change-Id: I978d20c7b87e73d0f6d22f7ab08188e4d12d745c
parent 9de9f13e
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -5623,18 +5623,18 @@ package android.window {

  public class TaskOrganizer extends android.window.WindowOrganizer {
    ctor public TaskOrganizer();
    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static android.app.ActivityManager.RunningTaskInfo createRootTask(int, int);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static boolean deleteRootTask(@NonNull android.window.WindowContainerToken);
    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 @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public android.app.ActivityManager.RunningTaskInfo createRootTask(int, int);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public boolean deleteRootTask(@NonNull android.window.WindowContainerToken);
    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public java.util.List<android.app.ActivityManager.RunningTaskInfo> getChildTasks(@NonNull android.window.WindowContainerToken, @NonNull int[]);
    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public android.window.WindowContainerToken getImeTarget(int);
    method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public java.util.List<android.app.ActivityManager.RunningTaskInfo> getRootTasks(int, @NonNull int[]);
    method @BinderThread public void onBackPressedOnTaskRoot(@NonNull android.app.ActivityManager.RunningTaskInfo);
    method @BinderThread public void onTaskAppeared(@NonNull android.app.ActivityManager.RunningTaskInfo, @NonNull android.view.SurfaceControl);
    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();
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void setInterceptBackPressedOnTaskRoot(@NonNull android.window.WindowContainerToken, 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 setLaunchRoot(int, @NonNull android.window.WindowContainerToken);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public final void unregisterOrganizer();
  }

@@ -5671,7 +5671,7 @@ package android.window {
  public class WindowOrganizer {
    ctor public WindowOrganizer();
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public int applySyncTransaction(@NonNull android.window.WindowContainerTransaction, @NonNull android.window.WindowContainerTransactionCallback);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static void applyTransaction(@NonNull android.window.WindowContainerTransaction);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void applyTransaction(@NonNull android.window.WindowContainerTransaction);
  }

}
+6 −17
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.TestApi;
import android.os.RemoteException;
import android.util.Singleton;
import android.view.SurfaceControl;

/**
@@ -135,22 +134,12 @@ public class DisplayAreaOrganizer extends WindowOrganizer {
        }
    };

    private static IDisplayAreaOrganizerController getController() {
        return IDisplayAreaOrganizerControllerSingleton.get();
    }

    private static final Singleton<IDisplayAreaOrganizerController>
            IDisplayAreaOrganizerControllerSingleton =
            new Singleton<IDisplayAreaOrganizerController>() {
                @Override
                protected IDisplayAreaOrganizerController create() {
    private IDisplayAreaOrganizerController getController() {
        try {
                        return getWindowOrganizerController()
                                .getDisplayAreaOrganizerController();
            return getWindowOrganizerController().getDisplayAreaOrganizerController();
        } catch (RemoteException e) {
            return null;
        }
    }
            };

}
+35 −30
Original line number Diff line number Diff line
@@ -23,9 +23,10 @@ import android.annotation.RequiresPermission;
import android.annotation.TestApi;
import android.app.ActivityManager;
import android.os.RemoteException;
import android.util.Singleton;
import android.view.SurfaceControl;

import com.android.internal.annotations.VisibleForTesting;

import java.util.List;

/**
@@ -35,13 +36,25 @@ import java.util.List;
@TestApi
public class TaskOrganizer extends WindowOrganizer {

    private ITaskOrganizerController mTaskOrganizerController;

    public TaskOrganizer() {
        mTaskOrganizerController = getController();
    }

    /** @hide */
    @VisibleForTesting
    public TaskOrganizer(ITaskOrganizerController taskOrganizerController) {
        mTaskOrganizerController = taskOrganizerController;
    }

    /**
     * Register a TaskOrganizer to manage tasks as they enter a supported windowing mode.
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    public final void registerOrganizer() {
        try {
            getController().registerTaskOrganizer(mInterface);
            mTaskOrganizerController.registerTaskOrganizer(mInterface);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -51,7 +64,7 @@ public class TaskOrganizer extends WindowOrganizer {
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    public final void unregisterOrganizer() {
        try {
            getController().unregisterTaskOrganizer(mInterface);
            mTaskOrganizerController.unregisterTaskOrganizer(mInterface);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -78,9 +91,9 @@ public class TaskOrganizer extends WindowOrganizer {
    /** Creates a persistent root task in WM for a particular windowing-mode. */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    @Nullable
    public static ActivityManager.RunningTaskInfo createRootTask(int displayId, int windowingMode) {
    public ActivityManager.RunningTaskInfo createRootTask(int displayId, int windowingMode) {
        try {
            return getController().createRootTask(displayId, windowingMode);
            return mTaskOrganizerController.createRootTask(displayId, windowingMode);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -88,9 +101,9 @@ public class TaskOrganizer extends WindowOrganizer {

    /** Deletes a persistent root task in WM */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    public static boolean deleteRootTask(@NonNull WindowContainerToken task) {
    public boolean deleteRootTask(@NonNull WindowContainerToken task) {
        try {
            return getController().deleteRootTask(task);
            return mTaskOrganizerController.deleteRootTask(task);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -99,10 +112,10 @@ public class TaskOrganizer extends WindowOrganizer {
    /** Gets direct child tasks (ordered from top-to-bottom) */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    @Nullable
    public static List<ActivityManager.RunningTaskInfo> getChildTasks(
    public List<ActivityManager.RunningTaskInfo> getChildTasks(
            @NonNull WindowContainerToken parent, @NonNull int[] activityTypes) {
        try {
            return getController().getChildTasks(parent, activityTypes);
            return mTaskOrganizerController.getChildTasks(parent, activityTypes);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -111,10 +124,10 @@ public class TaskOrganizer extends WindowOrganizer {
    /** Gets all root tasks on a display (ordered from top-to-bottom) */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    @Nullable
    public static List<ActivityManager.RunningTaskInfo> getRootTasks(
    public List<ActivityManager.RunningTaskInfo> getRootTasks(
            int displayId, @NonNull int[] activityTypes) {
        try {
            return getController().getRootTasks(displayId, activityTypes);
            return mTaskOrganizerController.getRootTasks(displayId, activityTypes);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -123,9 +136,9 @@ public class TaskOrganizer extends WindowOrganizer {
    /** Get the root task which contains the current ime target */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    @Nullable
    public static WindowContainerToken getImeTarget(int display) {
    public WindowContainerToken getImeTarget(int display) {
        try {
            return getController().getImeTarget(display);
            return mTaskOrganizerController.getImeTarget(display);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -136,9 +149,9 @@ public class TaskOrganizer extends WindowOrganizer {
     * root and thus new tasks just end up directly on the display.
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    public static void setLaunchRoot(int displayId, @NonNull WindowContainerToken root) {
    public void setLaunchRoot(int displayId, @NonNull WindowContainerToken root) {
        try {
            getController().setLaunchRoot(displayId, root);
            mTaskOrganizerController.setLaunchRoot(displayId, root);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -152,7 +165,7 @@ public class TaskOrganizer extends WindowOrganizer {
    public void setInterceptBackPressedOnTaskRoot(@NonNull WindowContainerToken task,
            boolean interceptBackPressed) {
        try {
            getController().setInterceptBackPressedOnTaskRoot(task, interceptBackPressed);
            mTaskOrganizerController.setInterceptBackPressedOnTaskRoot(task, interceptBackPressed);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -181,19 +194,11 @@ public class TaskOrganizer extends WindowOrganizer {
        }
    };

    private static ITaskOrganizerController getController() {
        return ITaskOrganizerControllerSingleton.get();
    }

    private static final Singleton<ITaskOrganizerController> ITaskOrganizerControllerSingleton =
            new Singleton<ITaskOrganizerController>() {
                @Override
                protected ITaskOrganizerController create() {
    private ITaskOrganizerController getController() {
        try {
            return getWindowOrganizerController().getTaskOrganizerController();
        } catch (RemoteException e) {
            return null;
        }
    }
            };
}
+3 −3
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder {
        }
        WindowContainerTransaction wct = new WindowContainerTransaction();
        wct.setHidden(mTaskToken, false /* hidden */);
        WindowOrganizer.applyTransaction(wct);
        mTaskOrganizer.applyTransaction(wct);
        // TODO(b/151449487): Only call callback once we enable synchronization
        if (mListener != null) {
            mListener.onTaskVisibilityChanged(getTaskId(), true);
@@ -133,7 +133,7 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder {
        }
        WindowContainerTransaction wct = new WindowContainerTransaction();
        wct.setHidden(mTaskToken, true /* hidden */);
        WindowOrganizer.applyTransaction(wct);
        mTaskOrganizer.applyTransaction(wct);
        // TODO(b/151449487): Only call callback once we enable synchronization
        if (mListener != null) {
            mListener.onTaskVisibilityChanged(getTaskId(), false);
@@ -165,7 +165,7 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder {
        WindowContainerTransaction wct = new WindowContainerTransaction();
        wct.setBounds(mTaskToken, screenBounds);
        // TODO(b/151449487): Enable synchronization
        WindowOrganizer.applyTransaction(wct);
        mTaskOrganizer.applyTransaction(wct);
    }

    /**
+3 −3
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ public class WindowOrganizer {
     * @param t The transaction to apply.
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    public static void applyTransaction(@NonNull WindowContainerTransaction t) {
    public void applyTransaction(@NonNull WindowContainerTransaction t) {
        try {
            getWindowOrganizerController().applyTransaction(t);
        } catch (RemoteException e) {
@@ -74,7 +74,7 @@ public class WindowOrganizer {
     */
    @Nullable
    @RequiresPermission(android.Manifest.permission.READ_FRAME_BUFFER)
    public static SurfaceControl takeScreenshot(@NonNull WindowContainerToken token) {
    public SurfaceControl takeScreenshot(@NonNull WindowContainerToken token) {
        try {
            SurfaceControl surfaceControl = new SurfaceControl();
            if (getWindowOrganizerController().takeScreenshot(token, surfaceControl)) {
@@ -88,7 +88,7 @@ public class WindowOrganizer {
    }

    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    static IWindowOrganizerController getWindowOrganizerController() {
    IWindowOrganizerController getWindowOrganizerController() {
        return IWindowOrganizerControllerSingleton.get();
    }

Loading