summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/test-current.txt14
-rw-r--r--core/java/android/window/DisplayAreaOrganizer.java23
-rw-r--r--core/java/android/window/TaskOrganizer.java65
-rw-r--r--core/java/android/window/TaskOrganizerTaskEmbedder.java6
-rw-r--r--core/java/android/window/WindowOrganizer.java6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java15
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java10
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java18
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTaskOrganizer.java5
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/WindowManagerProxy.java32
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java7
-rw-r--r--services/core/java/com/android/server/wm/TaskOrganizerController.java2
14 files changed, 127 insertions, 101 deletions
diff --git a/api/test-current.txt b/api/test-current.txt
index 2dd740924275..b42fac582ce3 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -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);
}
}
diff --git a/core/java/android/window/DisplayAreaOrganizer.java b/core/java/android/window/DisplayAreaOrganizer.java
index f035d36a0f71..78fa30358d74 100644
--- a/core/java/android/window/DisplayAreaOrganizer.java
+++ b/core/java/android/window/DisplayAreaOrganizer.java
@@ -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 IDisplayAreaOrganizerController getController() {
+ try {
+ return getWindowOrganizerController().getDisplayAreaOrganizerController();
+ } catch (RemoteException e) {
+ return null;
+ }
}
- private static final Singleton<IDisplayAreaOrganizerController>
- IDisplayAreaOrganizerControllerSingleton =
- new Singleton<IDisplayAreaOrganizerController>() {
- @Override
- protected IDisplayAreaOrganizerController create() {
- try {
- return getWindowOrganizerController()
- .getDisplayAreaOrganizerController();
- } catch (RemoteException e) {
- return null;
- }
- }
- };
-
}
diff --git a/core/java/android/window/TaskOrganizer.java b/core/java/android/window/TaskOrganizer.java
index 38fb023a0822..d8f2bb248fd1 100644
--- a/core/java/android/window/TaskOrganizer.java
+++ b/core/java/android/window/TaskOrganizer.java
@@ -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 ITaskOrganizerController getController() {
+ try {
+ return getWindowOrganizerController().getTaskOrganizerController();
+ } catch (RemoteException e) {
+ return null;
+ }
}
-
- private static final Singleton<ITaskOrganizerController> ITaskOrganizerControllerSingleton =
- new Singleton<ITaskOrganizerController>() {
- @Override
- protected ITaskOrganizerController create() {
- try {
- return getWindowOrganizerController().getTaskOrganizerController();
- } catch (RemoteException e) {
- return null;
- }
- }
- };
}
diff --git a/core/java/android/window/TaskOrganizerTaskEmbedder.java b/core/java/android/window/TaskOrganizerTaskEmbedder.java
index eb9dfed7f644..1e293df38cf8 100644
--- a/core/java/android/window/TaskOrganizerTaskEmbedder.java
+++ b/core/java/android/window/TaskOrganizerTaskEmbedder.java
@@ -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);
}
/**
diff --git a/core/java/android/window/WindowOrganizer.java b/core/java/android/window/WindowOrganizer.java
index ff40ddac134e..97a97d9984f9 100644
--- a/core/java/android/window/WindowOrganizer.java
+++ b/core/java/android/window/WindowOrganizer.java
@@ -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();
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
index ea9576a511e9..f9ba695c8503 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
@@ -17,23 +17,23 @@
package com.android.wm.shell;
import android.app.ActivityManager.RunningTaskInfo;
-import android.app.WindowConfiguration;
-import android.content.Context;
import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
import android.view.SurfaceControl;
+import android.window.ITaskOrganizerController;
import android.window.TaskOrganizer;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
-import com.android.wm.shell.protolog.ShellProtoLogImpl;
import java.util.ArrayList;
import java.util.Arrays;
/**
* Unified task organizer for all components in the shell.
+ * TODO(b/167582004): may consider consolidating this class and TaskOrganizer
*/
public class ShellTaskOrganizer extends TaskOrganizer {
@@ -56,6 +56,15 @@ public class ShellTaskOrganizer extends TaskOrganizer {
// require us to report to both old and new listeners)
private final SparseArray<Pair<RunningTaskInfo, SurfaceControl>> mTasks = new SparseArray<>();
+ public ShellTaskOrganizer() {
+ super();
+ }
+
+ @VisibleForTesting
+ ShellTaskOrganizer(ITaskOrganizerController taskOrganizerController) {
+ super(taskOrganizerController);
+ }
+
/**
* Adds a listener for tasks in a specific windowing mode.
*/
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java
index 92cee8a1a874..ff617ed466d1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java
@@ -30,7 +30,6 @@ import android.view.SurfaceControl;
import android.window.TaskOrganizer;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
-import android.window.WindowOrganizer;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.TransactionPool;
@@ -44,6 +43,7 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor
private final SplitScreenTaskOrganizer mSplits;
private final TransactionPool mTransactionPool;
private final Handler mHandler;
+ private final TaskOrganizer mTaskOrganizer;
/**
* These are the y positions of the top of the IME surface when it is hidden and when it is
@@ -92,10 +92,12 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor
private boolean mPausedTargetAdjusted = false;
private boolean mAdjustedWhileHidden = false;
- DividerImeController(SplitScreenTaskOrganizer splits, TransactionPool pool, Handler handler) {
+ DividerImeController(SplitScreenTaskOrganizer splits, TransactionPool pool, Handler handler,
+ TaskOrganizer taskOrganizer) {
mSplits = splits;
mTransactionPool = pool;
mHandler = handler;
+ mTaskOrganizer = taskOrganizer;
}
private DividerView getView() {
@@ -111,7 +113,7 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor
}
private boolean getSecondaryHasFocus(int displayId) {
- WindowContainerToken imeSplit = TaskOrganizer.getImeTarget(displayId);
+ WindowContainerToken imeSplit = mTaskOrganizer.getImeTarget(displayId);
return imeSplit != null
&& (imeSplit.asBinder() == mSplits.mSecondary.token.asBinder());
}
@@ -236,7 +238,7 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor
}
if (!mSplits.mSplitScreenController.getWmProxy().queueSyncTransactionIfWaiting(wct)) {
- WindowOrganizer.applyTransaction(wct);
+ mTaskOrganizer.applyTransaction(wct);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java
index 79bfda92bd92..00146e9447bd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java
@@ -619,7 +619,7 @@ public class DividerView extends FrameLayout implements OnTouchListener,
mEntranceAnimationRunning = false;
mExitAnimationRunning = false;
if (!dismissed && !wasMinimizeInteraction) {
- WindowManagerProxy.applyResizeSplits(snapTarget.position, mSplitLayout);
+ mWindowManagerProxy.applyResizeSplits(snapTarget.position, mSplitLayout);
}
if (mCallback != null) {
mCallback.onDraggingEnd();
@@ -889,7 +889,7 @@ public class DividerView extends FrameLayout implements OnTouchListener,
t.hide(sc).apply();
mTiles.releaseTransaction(t);
int midPos = mSplitLayout.getSnapAlgorithm().getMiddleTarget().position;
- WindowManagerProxy.applyResizeSplits(midPos, mSplitLayout);
+ mWindowManagerProxy.applyResizeSplits(midPos, mSplitLayout);
}
void setMinimizedDockStack(boolean minimized, long animDuration,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
index d5326d4845a3..eed5092ea96b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
@@ -29,9 +29,9 @@ import android.provider.Settings;
import android.util.Slog;
import android.view.LayoutInflater;
import android.view.View;
+import android.window.TaskOrganizer;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
-import android.window.WindowOrganizer;
import com.android.internal.policy.DividerSnapAlgorithm;
import com.android.wm.shell.R;
@@ -71,6 +71,7 @@ public class SplitScreenController implements SplitScreen,
private final SystemWindows mSystemWindows;
final TransactionPool mTransactionPool;
private final WindowManagerProxy mWindowManagerProxy;
+ private final TaskOrganizer mTaskOrganizer;
private final ArrayList<WeakReference<Consumer<Boolean>>> mDockedStackExistsListeners =
new ArrayList<>();
@@ -106,9 +107,12 @@ public class SplitScreenController implements SplitScreen,
mHandler = handler;
mForcedResizableController = new ForcedResizableInfoActivityController(context, this);
mTransactionPool = transactionPool;
- mWindowManagerProxy = new WindowManagerProxy(mTransactionPool, mHandler);
+ mWindowManagerProxy = new WindowManagerProxy(mTransactionPool, mHandler,
+ shellTaskOrganizer);
+ mTaskOrganizer = shellTaskOrganizer;
mSplits = new SplitScreenTaskOrganizer(this, shellTaskOrganizer);
- mImePositionProcessor = new DividerImeController(mSplits, mTransactionPool, mHandler);
+ mImePositionProcessor = new DividerImeController(mSplits, mTransactionPool, mHandler,
+ shellTaskOrganizer);
mRotationController =
(display, fromRotation, toRotation, wct) -> {
if (!mSplits.isSplitScreenSupported() || mWindowManagerProxy == null) {
@@ -132,7 +136,7 @@ public class SplitScreenController implements SplitScreen,
sdl.resizeSplits(target.position, t);
if (isSplitActive() && mHomeStackResizable) {
- WindowManagerProxy
+ mWindowManagerProxy
.applyHomeTasksMinimized(sdl, mSplits.mSecondary.token, t);
}
if (mWindowManagerProxy.queueSyncTransactionIfWaiting(t)) {
@@ -189,7 +193,7 @@ public class SplitScreenController implements SplitScreen,
final WindowContainerTransaction tct = new WindowContainerTransaction();
int midPos = mSplitLayout.getSnapAlgorithm().getMiddleTarget().position;
mSplitLayout.resizeSplits(midPos, tct);
- WindowOrganizer.applyTransaction(tct);
+ mTaskOrganizer.applyTransaction(tct);
} catch (Exception e) {
Slog.e(TAG, "Failed to register docked stack listener", e);
removeDivider();
@@ -208,7 +212,7 @@ public class SplitScreenController implements SplitScreen,
int midPos = mSplitLayout.getSnapAlgorithm().getMiddleTarget().position;
final WindowContainerTransaction tct = new WindowContainerTransaction();
mSplitLayout.resizeSplits(midPos, tct);
- WindowOrganizer.applyTransaction(tct);
+ mTaskOrganizer.applyTransaction(tct);
} else if (mSplitLayout.mDisplayLayout.rotation()
== mRotateSplitLayout.mDisplayLayout.rotation()) {
mSplitLayout.mPrimary = new Rect(mRotateSplitLayout.mPrimary);
@@ -372,7 +376,7 @@ public class SplitScreenController implements SplitScreen,
// If we are only setting focusability, a sync transaction isn't necessary (in fact it
// can interrupt other animations), so see if it can be submitted on pending instead.
if (!mWindowManagerProxy.queueSyncTransactionIfWaiting(wct)) {
- WindowOrganizer.applyTransaction(wct);
+ mTaskOrganizer.applyTransaction(wct);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTaskOrganizer.java
index 6d28c5e17d42..30bc43b0292f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTaskOrganizer.java
@@ -31,7 +31,6 @@ import android.util.Log;
import android.view.Display;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
-import android.window.TaskOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
@@ -64,9 +63,9 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener {
void init() throws RemoteException {
synchronized (this) {
try {
- mPrimary = TaskOrganizer.createRootTask(Display.DEFAULT_DISPLAY,
+ mPrimary = mTaskOrganizer.createRootTask(Display.DEFAULT_DISPLAY,
WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
- mSecondary = TaskOrganizer.createRootTask(Display.DEFAULT_DISPLAY,
+ mSecondary = mTaskOrganizer.createRootTask(Display.DEFAULT_DISPLAY,
WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
} catch (Exception e) {
// teardown to prevent callbacks
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/WindowManagerProxy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/WindowManagerProxy.java
index cd96676ad1fe..015707ecc6c8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/WindowManagerProxy.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/WindowManagerProxy.java
@@ -83,8 +83,12 @@ class WindowManagerProxy {
}
};
- WindowManagerProxy(TransactionPool transactionPool, Handler handler) {
+ private final TaskOrganizer mTaskOrganizer;
+
+ WindowManagerProxy(TransactionPool transactionPool, Handler handler,
+ TaskOrganizer taskOrganizer) {
mSyncTransactionQueue = new SyncTransactionQueue(transactionPool, handler);
+ mTaskOrganizer = taskOrganizer;
}
void dismissOrMaximizeDocked(final SplitScreenTaskOrganizer tiles, SplitDisplayLayout layout,
@@ -113,18 +117,18 @@ class WindowManagerProxy {
mExecutor.execute(mSetTouchableRegionRunnable);
}
- static void applyResizeSplits(int position, SplitDisplayLayout splitLayout) {
+ void applyResizeSplits(int position, SplitDisplayLayout splitLayout) {
WindowContainerTransaction t = new WindowContainerTransaction();
splitLayout.resizeSplits(position, t);
- WindowOrganizer.applyTransaction(t);
+ new WindowOrganizer().applyTransaction(t);
}
- private static boolean getHomeAndRecentsTasks(List<ActivityManager.RunningTaskInfo> out,
+ private boolean getHomeAndRecentsTasks(List<ActivityManager.RunningTaskInfo> out,
WindowContainerToken parent) {
boolean resizable = false;
List<ActivityManager.RunningTaskInfo> rootTasks = parent == null
- ? TaskOrganizer.getRootTasks(Display.DEFAULT_DISPLAY, HOME_AND_RECENTS)
- : TaskOrganizer.getChildTasks(parent, HOME_AND_RECENTS);
+ ? mTaskOrganizer.getRootTasks(Display.DEFAULT_DISPLAY, HOME_AND_RECENTS)
+ : mTaskOrganizer.getChildTasks(parent, HOME_AND_RECENTS);
for (int i = 0, n = rootTasks.size(); i < n; ++i) {
final ActivityManager.RunningTaskInfo ti = rootTasks.get(i);
out.add(ti);
@@ -140,7 +144,7 @@ class WindowManagerProxy {
* split is minimized. This actually "sticks out" of the secondary split area, but when in
* minimized mode, the secondary split gets a 'negative' crop to expose it.
*/
- static boolean applyHomeTasksMinimized(SplitDisplayLayout layout, WindowContainerToken parent,
+ boolean applyHomeTasksMinimized(SplitDisplayLayout layout, WindowContainerToken parent,
@NonNull WindowContainerTransaction wct) {
// Resize the home/recents stacks to the larger minimized-state size
final Rect homeBounds;
@@ -192,9 +196,9 @@ class WindowManagerProxy {
// Set launchtile first so that any stack created after
// getAllStackInfos and before reparent (even if unlikely) are placed
// correctly.
- TaskOrganizer.setLaunchRoot(DEFAULT_DISPLAY, tiles.mSecondary.token);
+ mTaskOrganizer.setLaunchRoot(DEFAULT_DISPLAY, tiles.mSecondary.token);
List<ActivityManager.RunningTaskInfo> rootTasks =
- TaskOrganizer.getRootTasks(DEFAULT_DISPLAY, null /* activityTypes */);
+ mTaskOrganizer.getRootTasks(DEFAULT_DISPLAY, null /* activityTypes */);
WindowContainerTransaction wct = new WindowContainerTransaction();
if (rootTasks.isEmpty()) {
return false;
@@ -230,7 +234,7 @@ class WindowManagerProxy {
return isHomeResizable;
}
- static boolean isHomeOrRecentTask(ActivityManager.RunningTaskInfo ti) {
+ boolean isHomeOrRecentTask(ActivityManager.RunningTaskInfo ti) {
final int atype = ti.configuration.windowConfiguration.getActivityType();
return atype == ACTIVITY_TYPE_HOME || atype == ACTIVITY_TYPE_RECENTS;
}
@@ -245,18 +249,18 @@ class WindowManagerProxy {
boolean dismissOrMaximize) {
// Set launch root first so that any task created after getChildContainers and
// before reparent (pretty unlikely) are put into fullscreen.
- TaskOrganizer.setLaunchRoot(Display.DEFAULT_DISPLAY, null);
+ mTaskOrganizer.setLaunchRoot(Display.DEFAULT_DISPLAY, null);
// TODO(task-org): Once task-org is more complete, consider using Appeared/Vanished
// plus specific APIs to clean this up.
List<ActivityManager.RunningTaskInfo> primaryChildren =
- TaskOrganizer.getChildTasks(tiles.mPrimary.token, null /* activityTypes */);
+ mTaskOrganizer.getChildTasks(tiles.mPrimary.token, null /* activityTypes */);
List<ActivityManager.RunningTaskInfo> secondaryChildren =
- TaskOrganizer.getChildTasks(tiles.mSecondary.token, null /* activityTypes */);
+ mTaskOrganizer.getChildTasks(tiles.mSecondary.token, null /* activityTypes */);
// In some cases (eg. non-resizable is launched), system-server will leave split-screen.
// as a result, the above will not capture any tasks; yet, we need to clean-up the
// home task bounds.
List<ActivityManager.RunningTaskInfo> freeHomeAndRecents =
- TaskOrganizer.getRootTasks(DEFAULT_DISPLAY, HOME_AND_RECENTS);
+ mTaskOrganizer.getRootTasks(DEFAULT_DISPLAY, HOME_AND_RECENTS);
// Filter out the root split tasks
freeHomeAndRecents.removeIf(p -> p.token.equals(tiles.mSecondary.token)
|| p.token.equals(tiles.mPrimary.token));
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java
index 10672c8d87ad..497b6b714281 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java
@@ -20,10 +20,14 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
import android.app.ActivityManager.RunningTaskInfo;
-import android.content.res.Configuration;
+import android.os.RemoteException;
import android.view.SurfaceControl;
+import android.window.ITaskOrganizer;
+import android.window.ITaskOrganizerController;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -31,6 +35,8 @@ import androidx.test.filters.SmallTest;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
@@ -41,6 +47,9 @@ import java.util.ArrayList;
@RunWith(AndroidJUnit4.class)
public class ShellTaskOrganizerTests {
+ @Mock
+ private ITaskOrganizerController mTaskOrganizerController;
+
ShellTaskOrganizer mOrganizer;
private class TrackingTaskListener implements ShellTaskOrganizer.TaskListener {
@@ -71,7 +80,15 @@ public class ShellTaskOrganizerTests {
@Before
public void setUp() {
- mOrganizer = new ShellTaskOrganizer();
+ MockitoAnnotations.initMocks(this);
+ mOrganizer = new ShellTaskOrganizer(mTaskOrganizerController);
+ }
+
+ @Test
+ public void registerOrganizer_sendRegisterTaskOrganizer() throws RemoteException {
+ mOrganizer.registerOrganizer();
+
+ verify(mTaskOrganizerController).registerTaskOrganizer(any(ITaskOrganizer.class));
}
@Test
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
index 862405609de8..5793cddd7d26 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
@@ -57,7 +57,6 @@ import android.window.TaskOrganizer;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
import android.window.WindowContainerTransactionCallback;
-import android.window.WindowOrganizer;
import com.android.internal.os.SomeArgs;
import com.android.systemui.dagger.SysUISingleton;
@@ -309,7 +308,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize
// Don't bother doing an animation if the display rotation differs or if it's in
// a non-supported windowing mode
applyWindowingModeChangeOnExit(wct, direction);
- WindowOrganizer.applyTransaction(wct);
+ mTaskOrganizer.applyTransaction(wct);
// Send finished callback though animation is ignored.
sendOnPipTransitionFinished(direction);
mInPip = false;
@@ -379,7 +378,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize
// Reset the task bounds first to ensure the activity configuration is reset as well
final WindowContainerTransaction wct = new WindowContainerTransaction();
wct.setBounds(mToken, null);
- WindowOrganizer.applyTransaction(wct);
+ mTaskOrganizer.applyTransaction(wct);
ActivityTaskManager.getService().removeStacksInWindowingModes(
new int[]{ WINDOWING_MODE_PINNED });
@@ -932,7 +931,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize
*/
public void applyFinishBoundsResize(@NonNull WindowContainerTransaction wct,
@PipAnimationController.TransitionDirection int direction) {
- WindowOrganizer.applyTransaction(wct);
+ mTaskOrganizer.applyTransaction(wct);
}
/**
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index 63a595e3bc17..d9290fb18f08 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -38,7 +38,6 @@ import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
-import android.util.SparseBooleanArray;
import android.view.SurfaceControl;
import android.window.ITaskOrganizer;
import android.window.ITaskOrganizerController;
@@ -54,7 +53,6 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
-import java.util.Set;
import java.util.WeakHashMap;
import java.util.function.Consumer;