summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
Diffstat (limited to 'libs')
-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
7 files changed, 70 insertions, 35 deletions
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