Merge "Fix divider display issue" into sc-v2-dev am: bd64fd9f66
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15824236 Change-Id: I90ccc834dabbad3ecc203a5f36e0e937878513bb
This commit is contained in:
@@ -43,6 +43,7 @@ import com.android.wm.shell.common.DisplayImeController;
|
|||||||
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;
|
||||||
|
import com.android.wm.shell.common.split.SplitWindowManager;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
@@ -70,6 +71,19 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.SplitLayou
|
|||||||
private final DisplayImeController mDisplayImeController;
|
private final DisplayImeController mDisplayImeController;
|
||||||
private SplitLayout mSplitLayout;
|
private SplitLayout mSplitLayout;
|
||||||
|
|
||||||
|
private final SplitWindowManager.ParentContainerCallbacks mParentContainerCallbacks =
|
||||||
|
new SplitWindowManager.ParentContainerCallbacks() {
|
||||||
|
@Override
|
||||||
|
public void attachToParentSurface(SurfaceControl.Builder b) {
|
||||||
|
b.setParent(mRootTaskLeash);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLeashReady(SurfaceControl leash) {
|
||||||
|
mSyncQueue.runInSync(t -> t.show(leash));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
AppPair(AppPairsController controller) {
|
AppPair(AppPairsController controller) {
|
||||||
mController = controller;
|
mController = controller;
|
||||||
mSyncQueue = controller.getSyncTransactionQueue();
|
mSyncQueue = controller.getSyncTransactionQueue();
|
||||||
@@ -110,8 +124,7 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.SplitLayou
|
|||||||
mSplitLayout = new SplitLayout(TAG + "SplitDivider",
|
mSplitLayout = new SplitLayout(TAG + "SplitDivider",
|
||||||
mDisplayController.getDisplayContext(mRootTaskInfo.displayId),
|
mDisplayController.getDisplayContext(mRootTaskInfo.displayId),
|
||||||
mRootTaskInfo.configuration, this /* layoutChangeListener */,
|
mRootTaskInfo.configuration, this /* layoutChangeListener */,
|
||||||
b -> b.setParent(mRootTaskLeash), mDisplayImeController,
|
mParentContainerCallbacks, mDisplayImeController, mController.getTaskOrganizer());
|
||||||
mController.getTaskOrganizer());
|
|
||||||
|
|
||||||
final WindowContainerToken token1 = task1.token;
|
final WindowContainerToken token1 = task1.token;
|
||||||
final WindowContainerToken token2 = task2.token;
|
final WindowContainerToken token2 = task2.token;
|
||||||
@@ -218,8 +231,6 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.SplitLayou
|
|||||||
if (mSplitLayout.updateConfiguration(mRootTaskInfo.configuration)) {
|
if (mSplitLayout.updateConfiguration(mRootTaskInfo.configuration)) {
|
||||||
onLayoutChanged(mSplitLayout);
|
onLayoutChanged(mSplitLayout);
|
||||||
}
|
}
|
||||||
// updateConfiguration re-inits the dividerbar, so show it now
|
|
||||||
mSyncQueue.runInSync(t -> t.show(mSplitLayout.getDividerLeash()));
|
|
||||||
}
|
}
|
||||||
} else if (taskInfo.taskId == getTaskId1()) {
|
} else if (taskInfo.taskId == getTaskId1()) {
|
||||||
mTaskInfo1 = taskInfo;
|
mTaskInfo1 = taskInfo;
|
||||||
|
|||||||
@@ -125,8 +125,8 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
|
|||||||
mRotation = configuration.windowConfiguration.getRotation();
|
mRotation = configuration.windowConfiguration.getRotation();
|
||||||
mSplitLayoutHandler = splitLayoutHandler;
|
mSplitLayoutHandler = splitLayoutHandler;
|
||||||
mDisplayImeController = displayImeController;
|
mDisplayImeController = displayImeController;
|
||||||
mSplitWindowManager = new SplitWindowManager(
|
mSplitWindowManager = new SplitWindowManager(windowName, mContext, configuration,
|
||||||
windowName, mContext, configuration, parentContainerCallbacks);
|
parentContainerCallbacks);
|
||||||
mTaskOrganizer = taskOrganizer;
|
mTaskOrganizer = taskOrganizer;
|
||||||
mImePositionProcessor = new ImePositionProcessor(mContext.getDisplayId());
|
mImePositionProcessor = new ImePositionProcessor(mContext.getDisplayId());
|
||||||
mDismissingParallaxPolicy = new DismissingParallaxPolicy();
|
mDismissingParallaxPolicy = new DismissingParallaxPolicy();
|
||||||
@@ -181,22 +181,19 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
|
|||||||
public boolean updateConfiguration(Configuration configuration) {
|
public boolean updateConfiguration(Configuration configuration) {
|
||||||
boolean affectsLayout = false;
|
boolean affectsLayout = false;
|
||||||
|
|
||||||
// Make sure to render the divider bar with proper resources that matching the screen
|
|
||||||
// orientation.
|
|
||||||
final int orientation = configuration.orientation;
|
|
||||||
if (orientation != mOrientation) {
|
|
||||||
mOrientation = orientation;
|
|
||||||
mContext = mContext.createConfigurationContext(configuration);
|
|
||||||
mSplitWindowManager.setConfiguration(configuration);
|
|
||||||
affectsLayout = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the split bounds when necessary. Besides root bounds changed, split bounds need to
|
// Update the split bounds when necessary. Besides root bounds changed, split bounds need to
|
||||||
// be updated when the rotation changed to cover the case that users rotated the screen 180
|
// be updated when the rotation changed to cover the case that users rotated the screen 180
|
||||||
// degrees.
|
// degrees.
|
||||||
|
// Make sure to render the divider bar with proper resources that matching the screen
|
||||||
|
// orientation.
|
||||||
final int rotation = configuration.windowConfiguration.getRotation();
|
final int rotation = configuration.windowConfiguration.getRotation();
|
||||||
final Rect rootBounds = configuration.windowConfiguration.getBounds();
|
final Rect rootBounds = configuration.windowConfiguration.getBounds();
|
||||||
if (rotation != mRotation || !mRootBounds.equals(rootBounds)) {
|
final int orientation = configuration.orientation;
|
||||||
|
if (rotation != mRotation || !mRootBounds.equals(rootBounds)
|
||||||
|
|| orientation != mOrientation) {
|
||||||
|
mContext = mContext.createConfigurationContext(configuration);
|
||||||
|
mSplitWindowManager.setConfiguration(configuration);
|
||||||
|
mOrientation = orientation;
|
||||||
mTempRect.set(mRootBounds);
|
mTempRect.set(mRootBounds);
|
||||||
mRootBounds.set(rootBounds);
|
mRootBounds.set(rootBounds);
|
||||||
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
|
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ public final class SplitWindowManager extends WindowlessWindowManager {
|
|||||||
|
|
||||||
public interface ParentContainerCallbacks {
|
public interface ParentContainerCallbacks {
|
||||||
void attachToParentSurface(SurfaceControl.Builder b);
|
void attachToParentSurface(SurfaceControl.Builder b);
|
||||||
|
void onLeashReady(SurfaceControl leash);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SplitWindowManager(String windowName, Context context, Configuration config,
|
public SplitWindowManager(String windowName, Context context, Configuration config,
|
||||||
@@ -100,6 +101,7 @@ public final class SplitWindowManager extends WindowlessWindowManager {
|
|||||||
.setCallsite("SplitWindowManager#attachToParentSurface");
|
.setCallsite("SplitWindowManager#attachToParentSurface");
|
||||||
mParentContainerCallbacks.attachToParentSurface(builder);
|
mParentContainerCallbacks.attachToParentSurface(builder);
|
||||||
mLeash = builder.build();
|
mLeash = builder.build();
|
||||||
|
mParentContainerCallbacks.onLeashReady(mLeash);
|
||||||
b.setParent(mLeash);
|
b.setParent(mLeash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ import com.android.wm.shell.common.SyncTransactionQueue;
|
|||||||
import com.android.wm.shell.common.TransactionPool;
|
import com.android.wm.shell.common.TransactionPool;
|
||||||
import com.android.wm.shell.common.split.SplitLayout;
|
import com.android.wm.shell.common.split.SplitLayout;
|
||||||
import com.android.wm.shell.common.split.SplitLayout.SplitPosition;
|
import com.android.wm.shell.common.split.SplitLayout.SplitPosition;
|
||||||
|
import com.android.wm.shell.common.split.SplitWindowManager;
|
||||||
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
import com.android.wm.shell.transition.Transitions;
|
import com.android.wm.shell.transition.Transitions;
|
||||||
|
|
||||||
@@ -163,6 +164,19 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
|||||||
mDismissTop = NO_DISMISS;
|
mDismissTop = NO_DISMISS;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private final SplitWindowManager.ParentContainerCallbacks mParentContainerCallbacks =
|
||||||
|
new SplitWindowManager.ParentContainerCallbacks() {
|
||||||
|
@Override
|
||||||
|
public void attachToParentSurface(SurfaceControl.Builder b) {
|
||||||
|
mRootTDAOrganizer.attachToDisplayArea(mDisplayId, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLeashReady(SurfaceControl leash) {
|
||||||
|
mSyncQueue.runInSync(t -> applyDividerVisibility(t));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue,
|
StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue,
|
||||||
RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer,
|
RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer,
|
||||||
DisplayImeController displayImeController,
|
DisplayImeController displayImeController,
|
||||||
@@ -726,7 +740,6 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
|||||||
} else {
|
} else {
|
||||||
t.hide(dividerLeash);
|
t.hide(dividerLeash);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onStageHasChildrenChanged(StageListenerImpl stageListener) {
|
private void onStageHasChildrenChanged(StageListenerImpl stageListener) {
|
||||||
@@ -852,8 +865,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
|||||||
mDisplayAreaInfo = displayAreaInfo;
|
mDisplayAreaInfo = displayAreaInfo;
|
||||||
if (mSplitLayout == null) {
|
if (mSplitLayout == null) {
|
||||||
mSplitLayout = new SplitLayout(TAG + "SplitDivider", mContext,
|
mSplitLayout = new SplitLayout(TAG + "SplitDivider", mContext,
|
||||||
mDisplayAreaInfo.configuration, this,
|
mDisplayAreaInfo.configuration, this, mParentContainerCallbacks,
|
||||||
b -> mRootTDAOrganizer.attachToDisplayArea(mDisplayId, b),
|
|
||||||
mDisplayImeController, mTaskOrganizer);
|
mDisplayImeController, mTaskOrganizer);
|
||||||
mDisplayInsetsController.addInsetsChangedListener(mDisplayId, mSplitLayout);
|
mDisplayInsetsController.addInsetsChangedListener(mDisplayId, mSplitLayout);
|
||||||
}
|
}
|
||||||
@@ -871,7 +883,6 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
|||||||
&& mSplitLayout.updateConfiguration(mDisplayAreaInfo.configuration)
|
&& mSplitLayout.updateConfiguration(mDisplayAreaInfo.configuration)
|
||||||
&& mMainStage.isActive()) {
|
&& mMainStage.isActive()) {
|
||||||
onLayoutChanged(mSplitLayout);
|
onLayoutChanged(mSplitLayout);
|
||||||
mSyncQueue.runInSync(t -> applyDividerVisibility(t));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import static org.mockito.Mockito.verify;
|
|||||||
|
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.view.SurfaceControl;
|
|
||||||
|
|
||||||
import androidx.test.annotation.UiThreadTest;
|
import androidx.test.annotation.UiThreadTest;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
@@ -53,7 +52,7 @@ import org.mockito.MockitoAnnotations;
|
|||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class SplitLayoutTests extends ShellTestCase {
|
public class SplitLayoutTests extends ShellTestCase {
|
||||||
@Mock SplitLayout.SplitLayoutHandler mSplitLayoutHandler;
|
@Mock SplitLayout.SplitLayoutHandler mSplitLayoutHandler;
|
||||||
@Mock SurfaceControl mRootLeash;
|
@Mock SplitWindowManager.ParentContainerCallbacks mCallbacks;
|
||||||
@Mock DisplayImeController mDisplayImeController;
|
@Mock DisplayImeController mDisplayImeController;
|
||||||
@Mock ShellTaskOrganizer mTaskOrganizer;
|
@Mock ShellTaskOrganizer mTaskOrganizer;
|
||||||
@Captor ArgumentCaptor<Runnable> mRunnableCaptor;
|
@Captor ArgumentCaptor<Runnable> mRunnableCaptor;
|
||||||
@@ -67,7 +66,7 @@ public class SplitLayoutTests extends ShellTestCase {
|
|||||||
mContext,
|
mContext,
|
||||||
getConfiguration(),
|
getConfiguration(),
|
||||||
mSplitLayoutHandler,
|
mSplitLayoutHandler,
|
||||||
b -> b.setParent(mRootLeash),
|
mCallbacks,
|
||||||
mDisplayImeController,
|
mDisplayImeController,
|
||||||
mTaskOrganizer));
|
mTaskOrganizer));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import static org.mockito.Mockito.when;
|
|||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.view.InsetsState;
|
import android.view.InsetsState;
|
||||||
import android.view.SurfaceControl;
|
|
||||||
|
|
||||||
import androidx.test.annotation.UiThreadTest;
|
import androidx.test.annotation.UiThreadTest;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
@@ -41,8 +40,8 @@ import org.mockito.MockitoAnnotations;
|
|||||||
@SmallTest
|
@SmallTest
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class SplitWindowManagerTests extends ShellTestCase {
|
public class SplitWindowManagerTests extends ShellTestCase {
|
||||||
@Mock SurfaceControl mSurfaceControl;
|
|
||||||
@Mock SplitLayout mSplitLayout;
|
@Mock SplitLayout mSplitLayout;
|
||||||
|
@Mock SplitWindowManager.ParentContainerCallbacks mCallbacks;
|
||||||
private SplitWindowManager mSplitWindowManager;
|
private SplitWindowManager mSplitWindowManager;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -51,7 +50,7 @@ public class SplitWindowManagerTests extends ShellTestCase {
|
|||||||
final Configuration configuration = new Configuration();
|
final Configuration configuration = new Configuration();
|
||||||
configuration.setToDefaults();
|
configuration.setToDefaults();
|
||||||
mSplitWindowManager = new SplitWindowManager("TestSplitDivider", mContext, configuration,
|
mSplitWindowManager = new SplitWindowManager("TestSplitDivider", mContext, configuration,
|
||||||
b -> b.setParent(mSurfaceControl));
|
mCallbacks);
|
||||||
when(mSplitLayout.getDividerBounds()).thenReturn(
|
when(mSplitLayout.getDividerBounds()).thenReturn(
|
||||||
new Rect(0, 0, configuration.windowConfiguration.getBounds().width(),
|
new Rect(0, 0, configuration.windowConfiguration.getBounds().width(),
|
||||||
configuration.windowConfiguration.getBounds().height()));
|
configuration.windowConfiguration.getBounds().height()));
|
||||||
|
|||||||
Reference in New Issue
Block a user