Merge "Only update lastFocusedTaskDisplayArea if it handles orientation request"

This commit is contained in:
Chris Li
2020-12-04 18:26:03 +00:00
committed by Android (Google) Code Review
8 changed files with 102 additions and 27 deletions

View File

@@ -174,6 +174,13 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
return false;
}
if (mDisplayContent.mFocusedApp != null) {
// We record the last focused TDA that respects orientation request, check if this
// change may affect it.
mDisplayContent.onLastFocusedTaskDisplayAreaChanged(
mDisplayContent.mFocusedApp.getDisplayArea());
}
// The orientation request from this DA may now be respected.
if (!ignoreOrientationRequest) {
return mDisplayContent.updateOrientation();

View File

@@ -489,8 +489,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
*/
ActivityRecord mFocusedApp = null;
/** The last focused {@link TaskDisplayArea} on this display. */
private TaskDisplayArea mLastFocusedTaskDisplayArea = null;
/**
* We only respect the orientation request from apps below this {@link TaskDisplayArea}.
* It is the last focused {@link TaskDisplayArea} on this display that handles orientation
* request.
*/
@Nullable
private TaskDisplayArea mOrientationRequestingTaskDisplayArea = null;
/**
* The launching activity which is using fixed rotation transformation.
@@ -3326,7 +3331,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// Called even if the focused app is not changed in case the app is moved to a different
// TaskDisplayArea.
setLastFocusedTaskDisplayArea(newFocus.getDisplayArea());
onLastFocusedTaskDisplayAreaChanged(newFocus.getDisplayArea());
}
if (mFocusedApp == newFocus) {
return false;
@@ -3340,16 +3345,27 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
/** Called when the focused {@link TaskDisplayArea} on this display may have changed. */
@VisibleForTesting
void setLastFocusedTaskDisplayArea(@Nullable TaskDisplayArea taskDisplayArea) {
if (taskDisplayArea != null) {
mLastFocusedTaskDisplayArea = taskDisplayArea;
void onLastFocusedTaskDisplayAreaChanged(@Nullable TaskDisplayArea taskDisplayArea) {
// Only record the TaskDisplayArea that handles orientation request.
if (taskDisplayArea != null && taskDisplayArea.handlesOrientationChangeFromDescendant()) {
mOrientationRequestingTaskDisplayArea = taskDisplayArea;
return;
}
// If the previous TDA no longer handles orientation request, clear it.
if (mOrientationRequestingTaskDisplayArea != null
&& !mOrientationRequestingTaskDisplayArea
.handlesOrientationChangeFromDescendant()) {
mOrientationRequestingTaskDisplayArea = null;
}
}
/** Gets the last focused {@link TaskDisplayArea} on this display. */
TaskDisplayArea getLastFocusedTaskDisplayArea() {
return mLastFocusedTaskDisplayArea;
/**
* Gets the {@link TaskDisplayArea} that we respect orientation requests from apps below it.
*/
@Nullable
TaskDisplayArea getOrientationRequestingTaskDisplayArea() {
return mOrientationRequestingTaskDisplayArea;
}
/** Updates the layer assignment of windows on this display. */

View File

@@ -641,9 +641,7 @@ final class TaskDisplayArea extends DisplayArea<Task> {
@Override
int getOrientation(int candidate) {
mLastOrientationSource = null;
// Only allow to specify orientation if this TDA is not set to ignore orientation request,
// and it has the focus.
if (mIgnoreOrientationRequest || !isLastFocused()) {
if (!canSpecifyOrientation()) {
return SCREEN_ORIENTATION_UNSET;
}
@@ -1918,10 +1916,14 @@ final class TaskDisplayArea extends DisplayArea<Task> {
return lastReparentedStack;
}
/** Whether this task display area is the last focused one on this logical display. */
/** Whether this task display area can request orientation. */
@VisibleForTesting
boolean isLastFocused() {
return mDisplayContent.getLastFocusedTaskDisplayArea() == this;
boolean canSpecifyOrientation() {
// Only allow to specify orientation if this TDA is not set to ignore orientation request,
// and it is the last focused one on this logical display that can request orientation
// request.
return !mIgnoreOrientationRequest
&& mDisplayContent.getOrientationRequestingTaskDisplayArea() == this;
}
@Override

View File

@@ -61,7 +61,7 @@ public class DisplayAreaGroupTest extends WindowTestsBase {
mTaskDisplayArea = new TaskDisplayArea(
mDisplayContent, mWm, "TDA1", FEATURE_VENDOR_FIRST + 1);
mDisplayAreaGroup.addChild(mTaskDisplayArea, POSITION_TOP);
mDisplayContent.setLastFocusedTaskDisplayArea(mTaskDisplayArea);
mDisplayContent.onLastFocusedTaskDisplayAreaChanged(mTaskDisplayArea);
}
@Test

View File

@@ -458,8 +458,7 @@ public class DisplayAreaTest extends WindowTestsBase {
@Test
public void testSetIgnoreOrientationRequest_notCallSuperOnDescendantOrientationChanged() {
final TaskDisplayArea tda =
mDisplayContent.getDefaultTaskDisplayArea();
final TaskDisplayArea tda = mDisplayContent.getDefaultTaskDisplayArea();
final Task stack =
new TaskBuilder(mSupervisor).setOnTop(!ON_TOP).setCreateActivity(true).build();
final ActivityRecord activity = stack.getTopNonFinishingActivity();
@@ -478,6 +477,27 @@ public class DisplayAreaTest extends WindowTestsBase {
verify(mDisplayContent).onDescendantOrientationChanged(any());
}
@Test
public void testSetIgnoreOrientationRequest_updateOrientationRequestingTaskDisplayArea() {
final TaskDisplayArea tda = mDisplayContent.getDefaultTaskDisplayArea();
final Task stack =
new TaskBuilder(mSupervisor).setOnTop(!ON_TOP).setCreateActivity(true).build();
final ActivityRecord activity = stack.getTopNonFinishingActivity();
mDisplayContent.setFocusedApp(activity);
assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isEqualTo(tda);
// TDA is no longer handling orientation request, clear the last focused TDA.
tda.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isNull();
// TDA now handles orientation request, update last focused TDA based on the focused app.
tda.setIgnoreOrientationRequest(false /* ignoreOrientationRequest */);
assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isEqualTo(tda);
}
private static class TestDisplayArea<T extends WindowContainer> extends DisplayArea<T> {
private TestDisplayArea(WindowManagerService wms, Rect bounds) {
super(wms, ANY, "half display area");

View File

@@ -325,7 +325,7 @@ public class SystemServicesTestRule implements TestRule {
final TaskDisplayArea taskDisplayArea = display.getDefaultTaskDisplayArea();
// Set the default focused TDA.
display.setLastFocusedTaskDisplayArea(taskDisplayArea);
display.onLastFocusedTaskDisplayAreaChanged(taskDisplayArea);
spyOn(taskDisplayArea);
final Task homeStack = taskDisplayArea.getRootTask(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME);

View File

@@ -262,20 +262,50 @@ public class TaskDisplayAreaTests extends WindowTestsBase {
// Activity on TDA1 is focused
mDisplayContent.setFocusedApp(firstActivity);
assertThat(firstTaskDisplayArea.isLastFocused()).isTrue();
assertThat(secondTaskDisplayArea.isLastFocused()).isFalse();
assertThat(firstTaskDisplayArea.canSpecifyOrientation()).isTrue();
assertThat(secondTaskDisplayArea.canSpecifyOrientation()).isFalse();
// No focused app, TDA1 is still recorded as last focused.
mDisplayContent.setFocusedApp(null);
assertThat(firstTaskDisplayArea.isLastFocused()).isTrue();
assertThat(secondTaskDisplayArea.isLastFocused()).isFalse();
assertThat(firstTaskDisplayArea.canSpecifyOrientation()).isTrue();
assertThat(secondTaskDisplayArea.canSpecifyOrientation()).isFalse();
// Activity on TDA2 is focused
mDisplayContent.setFocusedApp(secondActivity);
assertThat(firstTaskDisplayArea.isLastFocused()).isFalse();
assertThat(secondTaskDisplayArea.isLastFocused()).isTrue();
assertThat(firstTaskDisplayArea.canSpecifyOrientation()).isFalse();
assertThat(secondTaskDisplayArea.canSpecifyOrientation()).isTrue();
}
@Test
public void testIsLastFocused_onlyCountIfTaskDisplayAreaHandlesOrientationRequest() {
final TaskDisplayArea firstTaskDisplayArea = mDisplayContent.getDefaultTaskDisplayArea();
final TaskDisplayArea secondTaskDisplayArea = createTaskDisplayArea(
mDisplayContent, mRootWindowContainer.mWmService, "TestTaskDisplayArea",
FEATURE_VENDOR_FIRST);
final Task firstStack = firstTaskDisplayArea.createRootTask(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */);
final Task secondStack = secondTaskDisplayArea.createRootTask(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */);
final ActivityRecord firstActivity = new ActivityBuilder(mAtm)
.setTask(firstStack).build();
final ActivityRecord secondActivity = new ActivityBuilder(mAtm)
.setTask(secondStack).build();
firstTaskDisplayArea.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
secondTaskDisplayArea.setIgnoreOrientationRequest(false /* ignoreOrientationRequest */);
// Activity on TDA1 is focused, but TDA1 doesn't respect orientation request
mDisplayContent.setFocusedApp(firstActivity);
assertThat(firstTaskDisplayArea.canSpecifyOrientation()).isFalse();
assertThat(secondTaskDisplayArea.canSpecifyOrientation()).isFalse();
// Activity on TDA2 is focused, and TDA2 respects orientation request
mDisplayContent.setFocusedApp(secondActivity);
assertThat(firstTaskDisplayArea.canSpecifyOrientation()).isFalse();
assertThat(secondTaskDisplayArea.canSpecifyOrientation()).isTrue();
}
@Test

View File

@@ -161,7 +161,7 @@ class TestDisplayContent extends DisplayContent {
mService.mRootWindowContainer.addChild(newDisplay, mPosition);
// Set the default focused TDA.
newDisplay.setLastFocusedTaskDisplayArea(newDisplay.getDefaultTaskDisplayArea());
newDisplay.onLastFocusedTaskDisplayAreaChanged(newDisplay.getDefaultTaskDisplayArea());
return newDisplay;
}