Merge "Make WindowOrganizer and TaskOrganizer non-static"
This commit is contained in:
@@ -5621,18 +5621,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();
|
||||
}
|
||||
|
||||
@@ -5669,7 +5669,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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user