Merge "Consolidate app-pair divider bar behavior" into sc-v2-dev

This commit is contained in:
TreeHugger Robot
2021-10-05 03:27:55 +00:00
committed by Android (Google) Code Review
5 changed files with 52 additions and 36 deletions

View File

@@ -27,7 +27,6 @@ import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_UNDEF
import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_TASK_ORG; import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_TASK_ORG;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.graphics.Rect;
import android.view.SurfaceControl; import android.view.SurfaceControl;
import android.view.SurfaceSession; import android.view.SurfaceSession;
import android.window.WindowContainerToken; import android.window.WindowContainerToken;
@@ -40,6 +39,7 @@ import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.SurfaceUtils; import com.android.wm.shell.common.SurfaceUtils;
import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.split.SplitLayout; import com.android.wm.shell.common.split.SplitLayout;
@@ -69,6 +69,7 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.SplitLayou
private final SyncTransactionQueue mSyncQueue; private final SyncTransactionQueue mSyncQueue;
private final DisplayController mDisplayController; private final DisplayController mDisplayController;
private final DisplayImeController mDisplayImeController; private final DisplayImeController mDisplayImeController;
private final DisplayInsetsController mDisplayInsetsController;
private SplitLayout mSplitLayout; private SplitLayout mSplitLayout;
private final SplitWindowManager.ParentContainerCallbacks mParentContainerCallbacks = private final SplitWindowManager.ParentContainerCallbacks mParentContainerCallbacks =
@@ -80,7 +81,12 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.SplitLayou
@Override @Override
public void onLeashReady(SurfaceControl leash) { public void onLeashReady(SurfaceControl leash) {
mSyncQueue.runInSync(t -> t.show(leash)); mSyncQueue.runInSync(t -> t
.show(leash)
.setLayer(leash, SPLIT_DIVIDER_LAYER)
.setPosition(leash,
mSplitLayout.getDividerBounds().left,
mSplitLayout.getDividerBounds().top));
} }
}; };
@@ -89,6 +95,7 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.SplitLayou
mSyncQueue = controller.getSyncTransactionQueue(); mSyncQueue = controller.getSyncTransactionQueue();
mDisplayController = controller.getDisplayController(); mDisplayController = controller.getDisplayController();
mDisplayImeController = controller.getDisplayImeController(); mDisplayImeController = controller.getDisplayImeController();
mDisplayInsetsController = controller.getDisplayInsetsController();
} }
int getRootTaskId() { int getRootTaskId() {
@@ -125,6 +132,7 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.SplitLayou
mDisplayController.getDisplayContext(mRootTaskInfo.displayId), mDisplayController.getDisplayContext(mRootTaskInfo.displayId),
mRootTaskInfo.configuration, this /* layoutChangeListener */, mRootTaskInfo.configuration, this /* layoutChangeListener */,
mParentContainerCallbacks, mDisplayImeController, mController.getTaskOrganizer()); mParentContainerCallbacks, mDisplayImeController, mController.getTaskOrganizer());
mDisplayInsetsController.addInsetsChangedListener(mRootTaskInfo.displayId, mSplitLayout);
final WindowContainerToken token1 = task1.token; final WindowContainerToken token1 = task1.token;
final WindowContainerToken token2 = task2.token; final WindowContainerToken token2 = task2.token;
@@ -190,22 +198,17 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.SplitLayou
if (mTaskLeash1 == null || mTaskLeash2 == null) return; if (mTaskLeash1 == null || mTaskLeash2 == null) return;
mSplitLayout.init(); mSplitLayout.init();
final SurfaceControl dividerLeash = mSplitLayout.getDividerLeash();
final Rect dividerBounds = mSplitLayout.getDividerBounds();
// TODO: Is there more we need to do here? mSyncQueue.runInSync(t -> t
mSyncQueue.runInSync(t -> { .show(mRootTaskLeash)
t.setLayer(dividerLeash, SPLIT_DIVIDER_LAYER) .show(mTaskLeash1)
.setPosition(mTaskLeash1, mTaskInfo1.positionInParent.x, .show(mTaskLeash2)
mTaskInfo1.positionInParent.y) .setPosition(mTaskLeash1,
.setPosition(mTaskLeash2, mTaskInfo2.positionInParent.x, mTaskInfo1.positionInParent.x,
mTaskInfo2.positionInParent.y) mTaskInfo1.positionInParent.y)
.setPosition(dividerLeash, dividerBounds.left, dividerBounds.top) .setPosition(mTaskLeash2,
.show(dividerLeash) mTaskInfo2.positionInParent.x,
.show(mRootTaskLeash) mTaskInfo2.positionInParent.y));
.show(mTaskLeash1)
.show(mTaskLeash2);
});
} }
@Override @Override
@@ -227,10 +230,9 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.SplitLayou
} }
mRootTaskInfo = taskInfo; mRootTaskInfo = taskInfo;
if (mSplitLayout != null) { if (mSplitLayout != null
if (mSplitLayout.updateConfiguration(mRootTaskInfo.configuration)) { && mSplitLayout.updateConfiguration(mRootTaskInfo.configuration)) {
onLayoutChanged(mSplitLayout); onLayoutChanged(mSplitLayout);
}
} }
} else if (taskInfo.taskId == getTaskId1()) { } else if (taskInfo.taskId == getTaskId1()) {
mTaskInfo1 = taskInfo; mTaskInfo1 = taskInfo;

View File

@@ -29,6 +29,7 @@ import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.SyncTransactionQueue;
@@ -50,14 +51,17 @@ public class AppPairsController {
private final SparseArray<AppPair> mActiveAppPairs = new SparseArray<>(); private final SparseArray<AppPair> mActiveAppPairs = new SparseArray<>();
private final DisplayController mDisplayController; private final DisplayController mDisplayController;
private final DisplayImeController mDisplayImeController; private final DisplayImeController mDisplayImeController;
private final DisplayInsetsController mDisplayInsetsController;
public AppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue, public AppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue,
DisplayController displayController, ShellExecutor mainExecutor, DisplayController displayController, ShellExecutor mainExecutor,
DisplayImeController displayImeController) { DisplayImeController displayImeController,
DisplayInsetsController displayInsetsController) {
mTaskOrganizer = organizer; mTaskOrganizer = organizer;
mSyncQueue = syncQueue; mSyncQueue = syncQueue;
mDisplayController = displayController; mDisplayController = displayController;
mDisplayImeController = displayImeController; mDisplayImeController = displayImeController;
mDisplayInsetsController = displayInsetsController;
mMainExecutor = mainExecutor; mMainExecutor = mainExecutor;
} }
@@ -148,6 +152,10 @@ public class AppPairsController {
return mDisplayImeController; return mDisplayImeController;
} }
DisplayInsetsController getDisplayInsetsController() {
return mDisplayInsetsController;
}
public void dump(@NonNull PrintWriter pw, String prefix) { public void dump(@NonNull PrintWriter pw, String prefix) {
final String innerPrefix = prefix + " "; final String innerPrefix = prefix + " ";
final String childPrefix = innerPrefix + " "; final String childPrefix = innerPrefix + " ";

View File

@@ -189,24 +189,28 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
final int rotation = configuration.windowConfiguration.getRotation(); final int rotation = configuration.windowConfiguration.getRotation();
final Rect rootBounds = configuration.windowConfiguration.getBounds(); final Rect rootBounds = configuration.windowConfiguration.getBounds();
final int orientation = configuration.orientation; final int orientation = configuration.orientation;
if (rotation != mRotation || !mRootBounds.equals(rootBounds)
|| orientation != mOrientation) { if (mOrientation == orientation
mContext = mContext.createConfigurationContext(configuration); && rotation == mRotation
mSplitWindowManager.setConfiguration(configuration); && mRootBounds.equals(rootBounds)) {
mOrientation = orientation; return false;
mTempRect.set(mRootBounds);
mRootBounds.set(rootBounds);
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
initDividerPosition(mTempRect);
affectsLayout = true;
} }
mContext = mContext.createConfigurationContext(configuration);
mSplitWindowManager.setConfiguration(configuration);
mOrientation = orientation;
mTempRect.set(mRootBounds);
mRootBounds.set(rootBounds);
mRotation = rotation;
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
initDividerPosition(mTempRect);
if (mInitialized) { if (mInitialized) {
release(); release();
init(); init();
} }
return affectsLayout; return true;
} }
private void initDividerPosition(Rect oldBounds) { private void initDividerPosition(Rect oldBounds) {

View File

@@ -21,6 +21,7 @@ import static org.mockito.Mockito.mock;
import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.SyncTransactionQueue;
@@ -30,7 +31,7 @@ public class TestAppPairsController extends AppPairsController {
public TestAppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue, public TestAppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue,
DisplayController displayController) { DisplayController displayController) {
super(organizer, syncQueue, displayController, mock(ShellExecutor.class), super(organizer, syncQueue, displayController, mock(ShellExecutor.class),
mock(DisplayImeController.class)); mock(DisplayImeController.class), mock(DisplayInsetsController.class));
mPool = new TestAppPairsPool(this); mPool = new TestAppPairsPool(this);
setPairsPool(mPool); setPairsPool(mPool);
} }

View File

@@ -126,9 +126,10 @@ public class WMShellModule {
static AppPairsController provideAppPairs(ShellTaskOrganizer shellTaskOrganizer, static AppPairsController provideAppPairs(ShellTaskOrganizer shellTaskOrganizer,
SyncTransactionQueue syncQueue, DisplayController displayController, SyncTransactionQueue syncQueue, DisplayController displayController,
@ShellMainThread ShellExecutor mainExecutor, @ShellMainThread ShellExecutor mainExecutor,
DisplayImeController displayImeController) { DisplayImeController displayImeController,
DisplayInsetsController displayInsetsController) {
return new AppPairsController(shellTaskOrganizer, syncQueue, displayController, return new AppPairsController(shellTaskOrganizer, syncQueue, displayController,
mainExecutor, displayImeController); mainExecutor, displayImeController, displayInsetsController);
} }
// //