Merge "Allow to replace fixed rotation state"

This commit is contained in:
Riddle Hsu
2020-08-12 05:34:03 +00:00
committed by Android (Google) Code Review
3 changed files with 43 additions and 20 deletions

View File

@@ -1557,7 +1557,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// the heavy operations. This also benefits that the states of multiple activities
// are handled together.
r.linkFixedRotationTransform(prevRotatedLaunchingApp);
setFixedRotationLaunchingAppUnchecked(r, rotation);
if (r != mFixedRotationTransitionListener.mAnimatingRecents) {
// Only update the record for normal activity so the display orientation can be
// updated when the transition is done if it becomes the top. And the case of
// recents can be handled when the recents animation is finished.
setFixedRotationLaunchingAppUnchecked(r, rotation);
}
return;
}

View File

@@ -548,7 +548,7 @@ class WindowToken extends WindowContainer<WindowState> {
void applyFixedRotationTransform(DisplayInfo info, DisplayFrames displayFrames,
Configuration config) {
if (mFixedRotationTransformState != null) {
return;
cleanUpFixedRotationTransformState(true /* replacing */);
}
mFixedRotationTransformState = new FixedRotationTransformState(info, displayFrames,
new Configuration(config), mDisplayContent.getRotation());
@@ -565,12 +565,12 @@ class WindowToken extends WindowContainer<WindowState> {
* one. This takes the same effect as {@link #applyFixedRotationTransform}.
*/
void linkFixedRotationTransform(WindowToken other) {
if (mFixedRotationTransformState != null) {
final FixedRotationTransformState fixedRotationState = other.mFixedRotationTransformState;
if (fixedRotationState == null || mFixedRotationTransformState == fixedRotationState) {
return;
}
final FixedRotationTransformState fixedRotationState = other.mFixedRotationTransformState;
if (fixedRotationState == null) {
return;
if (mFixedRotationTransformState != null) {
cleanUpFixedRotationTransformState(true /* replacing */);
}
mFixedRotationTransformState = fixedRotationState;
fixedRotationState.mAssociatedTokens.add(this);
@@ -626,11 +626,17 @@ class WindowToken extends WindowContainer<WindowState> {
// The state is cleared at the end, because it is used to indicate that other windows can
// use seamless rotation when applying rotation to display.
for (int i = state.mAssociatedTokens.size() - 1; i >= 0; i--) {
state.mAssociatedTokens.get(i).cleanUpFixedRotationTransformState();
state.mAssociatedTokens.get(i).cleanUpFixedRotationTransformState(
false /* replacing */);
}
}
private void cleanUpFixedRotationTransformState() {
private void cleanUpFixedRotationTransformState(boolean replacing) {
if (replacing && mFixedRotationTransformState.mAssociatedTokens.size() > 1) {
// The state is not only used by self. Make sure to leave the influence by others.
mFixedRotationTransformState.mAssociatedTokens.remove(this);
mFixedRotationTransformState.mRotatedContainers.remove(this);
}
mFixedRotationTransformState = null;
notifyFixedRotationTransform(false /* enabled */);
}

View File

@@ -27,6 +27,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -145,29 +146,40 @@ public class WindowTokenTests extends WindowTestsBase {
assertEquals(0, token.getWindowsCount());
}
@UseTestDisplay(addWindows = { W_ACTIVITY, W_WALLPAPER })
@Test
public void testFinishFixedRotationTransform() {
final WindowToken appToken = mAppWindow.mToken;
final WindowToken wallpaperToken = mWallpaperWindow.mToken;
final WindowToken[] tokens = new WindowToken[3];
for (int i = 0; i < tokens.length; i++) {
tokens[i] = createTestWindowToken(TYPE_APPLICATION_OVERLAY, mDisplayContent);
}
final Configuration config = new Configuration(mDisplayContent.getConfiguration());
final int originalRotation = config.windowConfiguration.getRotation();
final int targetRotation = (originalRotation + 1) % 4;
config.windowConfiguration.setRotation(targetRotation);
appToken.applyFixedRotationTransform(mDisplayInfo, mDisplayContent.mDisplayFrames, config);
wallpaperToken.linkFixedRotationTransform(appToken);
tokens[0].applyFixedRotationTransform(mDisplayInfo, mDisplayContent.mDisplayFrames, config);
tokens[1].linkFixedRotationTransform(tokens[0]);
// The window tokens should apply the rotation by the transformation.
assertEquals(targetRotation, appToken.getWindowConfiguration().getRotation());
assertEquals(targetRotation, wallpaperToken.getWindowConfiguration().getRotation());
assertEquals(targetRotation, tokens[0].getWindowConfiguration().getRotation());
assertEquals(targetRotation, tokens[1].getWindowConfiguration().getRotation());
// The display doesn't rotate, the transformation will be canceled.
mAppWindow.mToken.finishFixedRotationTransform();
tokens[2].applyFixedRotationTransform(mDisplayInfo, mDisplayContent.mDisplayFrames, config);
// The tokens[1] was linked to tokens[0], this should make tokens[1] link to tokens[2].
tokens[1].linkFixedRotationTransform(tokens[2]);
// The window tokens should restore to the original rotation.
assertEquals(originalRotation, appToken.getWindowConfiguration().getRotation());
assertEquals(originalRotation, wallpaperToken.getWindowConfiguration().getRotation());
// Assume the display doesn't rotate, the transformation will be canceled.
tokens[0].finishFixedRotationTransform();
// The tokens[0] should restore to the original rotation.
assertEquals(originalRotation, tokens[0].getWindowConfiguration().getRotation());
// The tokens[1] is linked to tokens[2], it should keep the target rotation.
assertNotEquals(originalRotation, tokens[1].getWindowConfiguration().getRotation());
tokens[2].finishFixedRotationTransform();
// The rotation of tokens[1] should be restored because its linked state is finished.
assertEquals(originalRotation, tokens[1].getWindowConfiguration().getRotation());
}
/**