Separate fillsParent from deciding orientation

This keep the behavior of commit a930e1e to avoid orientation
from being affected by the change of mOccludesParent.

But the animation style can still refer to the runtime change of
translucent, e.g. AppTransitionController#findAnimLayoutParamsToken.

Bug: 234328568
Test: ActivityRecordTests#testShouldStartWhenMakeClientActive
Change-Id: If9019dfa6e4a69cd34607f24dfe2d06994fd6f10
This commit is contained in:
Riddle Hsu
2022-05-31 17:17:09 +00:00
parent 0dfb582d5a
commit fb7fd8ed90
4 changed files with 20 additions and 12 deletions

View File

@@ -670,9 +670,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
* from the style of activity. Because we don't want {@link WindowContainer#getOrientation()}
* to be affected by the temporal state of {@link ActivityClientController#convertToTranslucent}
* when running ANIM_SCENE_TRANSITION.
* @see WindowContainer#fillsParent()
* @see WindowContainer#providesOrientation()
*/
private final boolean mFillsParent;
private final boolean mStyleFillsParent;
// The input dispatching timeout for this application token in milliseconds.
long mInputDispatchingTimeoutMillis = DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
@@ -1971,10 +1971,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// This style is propagated to the main window attributes with
// FLAG_SHOW_WALLPAPER from PhoneWindow#generateLayout.
|| ent.array.getBoolean(R.styleable.Window_windowShowWallpaper, false);
mFillsParent = mOccludesParent;
mStyleFillsParent = mOccludesParent;
noDisplay = ent.array.getBoolean(R.styleable.Window_windowNoDisplay, false);
} else {
mFillsParent = mOccludesParent = true;
mStyleFillsParent = mOccludesParent = true;
noDisplay = false;
}
@@ -2879,9 +2879,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return (TaskDisplayArea) super.getDisplayArea();
}
@Override
boolean providesOrientation() {
return mStyleFillsParent;
}
@Override
boolean fillsParent() {
return mFillsParent;
return occludesParent(true /* includingFinishing */);
}
/** Returns true if this activity is not finishing, is opaque and fills the entire space of

View File

@@ -172,7 +172,7 @@ class PinnedTaskController {
*/
void deferOrientationChangeForEnteringPipFromFullScreenIfNeeded() {
final ActivityRecord topFullscreen = mDisplayContent.getActivity(
a -> a.fillsParent() && !a.getTask().inMultiWindowMode());
a -> a.providesOrientation() && !a.getTask().inMultiWindowMode());
if (topFullscreen == null || topFullscreen.hasFixedRotationTransform()) {
return;
}

View File

@@ -1495,8 +1495,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
*/
int getOrientation(int candidate) {
mLastOrientationSource = null;
if (!fillsParent()) {
// Ignore containers that don't completely fill their parents.
if (!providesOrientation()) {
return SCREEN_ORIENTATION_UNSET;
}
@@ -1530,8 +1529,8 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
continue;
}
if (wc.fillsParent() || orientation != SCREEN_ORIENTATION_UNSPECIFIED) {
// Use the orientation if the container fills its parent or requested an explicit
if (wc.providesOrientation() || orientation != SCREEN_ORIENTATION_UNSPECIFIED) {
// Use the orientation if the container can provide or requested an explicit
// orientation that isn't SCREEN_ORIENTATION_UNSPECIFIED.
ProtoLog.v(WM_DEBUG_ORIENTATION, "%s is requesting orientation %d (%s)",
wc.toString(), orientation,
@@ -1560,6 +1559,10 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
return source;
}
boolean providesOrientation() {
return fillsParent();
}
/**
* Returns true if this container is opaque and fills all the space made available by its parent
* container.

View File

@@ -756,8 +756,8 @@ public class ActivityRecordTests extends WindowTestsBase {
final ActivityRecord activity = createActivityWithTask();
ActivityRecord topActivity = new ActivityBuilder(mAtm).setTask(activity.getTask()).build();
topActivity.setOccludesParent(false);
// The requested occluding state doesn't affect whether it fills parent.
assertTrue(topActivity.fillsParent());
// The requested occluding state doesn't affect whether it can decide orientation.
assertTrue(topActivity.providesOrientation());
activity.setState(STOPPED, "Testing");
activity.setVisibility(true);
activity.makeActiveIfNeeded(null /* activeActivity */);