Merge "Fix divider display issue" into sc-v2-dev

This commit is contained in:
TreeHugger Robot
2021-09-16 06:06:30 +00:00
committed by Android (Google) Code Review
6 changed files with 46 additions and 27 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);
} }

View File

@@ -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));
} }
} }

View File

@@ -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));
} }

View File

@@ -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()));