Merge "Reland "Deferring visibility updates while applying WCT"" into sc-v2-dev
This commit is contained in:
@@ -352,6 +352,12 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
|
|||||||
*/
|
*/
|
||||||
private int mVisibilityTransactionDepth;
|
private int mVisibilityTransactionDepth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to the visibility updates that started from {@code RootWindowContainer} should be
|
||||||
|
* deferred.
|
||||||
|
*/
|
||||||
|
private boolean mDeferRootVisibilityUpdate;
|
||||||
|
|
||||||
private ActivityMetricsLogger mActivityMetricsLogger;
|
private ActivityMetricsLogger mActivityMetricsLogger;
|
||||||
|
|
||||||
/** Check if placing task or activity on specified display is allowed. */
|
/** Check if placing task or activity on specified display is allowed. */
|
||||||
@@ -2297,6 +2303,14 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
|
|||||||
return mVisibilityTransactionDepth > 0;
|
return mVisibilityTransactionDepth > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setDeferRootVisibilityUpdate(boolean deferUpdate) {
|
||||||
|
mDeferRootVisibilityUpdate = deferUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isRootVisibilityUpdateDeferred() {
|
||||||
|
return mDeferRootVisibilityUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the state or visibility of an attached activity is changed.
|
* Called when the state or visibility of an attached activity is changed.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1998,7 +1998,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
|
|||||||
*/
|
*/
|
||||||
void ensureActivitiesVisible(ActivityRecord starting, int configChanges,
|
void ensureActivitiesVisible(ActivityRecord starting, int configChanges,
|
||||||
boolean preserveWindows, boolean notifyClients) {
|
boolean preserveWindows, boolean notifyClients) {
|
||||||
if (mTaskSupervisor.inActivityVisibilityUpdate()) {
|
if (mTaskSupervisor.inActivityVisibilityUpdate()
|
||||||
|
|| mTaskSupervisor.isRootVisibilityUpdateDeferred()) {
|
||||||
// Don't do recursive work.
|
// Don't do recursive work.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4665,8 +4665,10 @@ class Task extends TaskFragment {
|
|||||||
mAtmService.continueWindowLayout();
|
mAtmService.continueWindowLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
mRootWindowContainer.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS);
|
if (!mTaskSupervisor.isRootVisibilityUpdateDeferred()) {
|
||||||
mRootWindowContainer.resumeFocusedTasksTopActivities();
|
mRootWindowContainer.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS);
|
||||||
|
mRootWindowContainer.resumeFocusedTasksTopActivities();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void resumeNextFocusAfterReparent() {
|
void resumeNextFocusAfterReparent() {
|
||||||
|
|||||||
@@ -322,6 +322,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
|
|||||||
int effects = 0;
|
int effects = 0;
|
||||||
ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Apply window transaction, syncId=%d", syncId);
|
ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Apply window transaction, syncId=%d", syncId);
|
||||||
mService.deferWindowLayout();
|
mService.deferWindowLayout();
|
||||||
|
mService.mTaskSupervisor.setDeferRootVisibilityUpdate(true /* deferUpdate */);
|
||||||
try {
|
try {
|
||||||
if (transition != null) {
|
if (transition != null) {
|
||||||
// First check if we have a display rotation transition and if so, update it.
|
// First check if we have a display rotation transition and if so, update it.
|
||||||
@@ -411,6 +412,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
|
|||||||
task.setMainWindowSizeChangeTransaction(sft);
|
task.setMainWindowSizeChangeTransaction(sft);
|
||||||
}
|
}
|
||||||
if ((effects & TRANSACT_EFFECTS_LIFECYCLE) != 0) {
|
if ((effects & TRANSACT_EFFECTS_LIFECYCLE) != 0) {
|
||||||
|
mService.mTaskSupervisor.setDeferRootVisibilityUpdate(false /* deferUpdate */);
|
||||||
// Already calls ensureActivityConfig
|
// Already calls ensureActivityConfig
|
||||||
mService.mRootWindowContainer.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS);
|
mService.mRootWindowContainer.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS);
|
||||||
mService.mRootWindowContainer.resumeFocusedTasksTopActivities();
|
mService.mRootWindowContainer.resumeFocusedTasksTopActivities();
|
||||||
@@ -432,6 +434,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
|
|||||||
mService.addWindowLayoutReasons(LAYOUT_REASON_CONFIG_CHANGED);
|
mService.addWindowLayoutReasons(LAYOUT_REASON_CONFIG_CHANGED);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
mService.mTaskSupervisor.setDeferRootVisibilityUpdate(false /* deferUpdate */);
|
||||||
mService.continueWindowLayout();
|
mService.continueWindowLayout();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -472,7 +475,15 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
|
|||||||
throw new UnsupportedOperationException("Not supported to set multi-window"
|
throw new UnsupportedOperationException("Not supported to set multi-window"
|
||||||
+ " windowing mode during locked task mode.");
|
+ " windowing mode during locked task mode.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final int prevMode = container.getWindowingMode();
|
||||||
container.setWindowingMode(windowingMode);
|
container.setWindowingMode(windowingMode);
|
||||||
|
if (prevMode != container.getWindowingMode()) {
|
||||||
|
// The activity in the container may become focusable or non-focusable due to
|
||||||
|
// windowing modes changes (such as entering or leaving pinned windowing mode),
|
||||||
|
// so also apply the lifecycle effects to this transaction.
|
||||||
|
effects |= TRANSACT_EFFECTS_LIFECYCLE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return effects;
|
return effects;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ import android.window.ITaskOrganizer;
|
|||||||
import android.window.IWindowContainerTransactionCallback;
|
import android.window.IWindowContainerTransactionCallback;
|
||||||
import android.window.StartingWindowInfo;
|
import android.window.StartingWindowInfo;
|
||||||
import android.window.TaskAppearedInfo;
|
import android.window.TaskAppearedInfo;
|
||||||
|
import android.window.WindowContainerToken;
|
||||||
import android.window.WindowContainerTransaction;
|
import android.window.WindowContainerTransaction;
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
@@ -1275,6 +1276,24 @@ public class WindowOrganizerTests extends WindowTestsBase {
|
|||||||
assertTrue(optionsCaptor.getValue().getOriginalOptions().getTransientLaunch());
|
assertTrue(optionsCaptor.getValue().getOriginalOptions().getTransientLaunch());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testResumeTopsWhenLeavingPinned() {
|
||||||
|
final ActivityRecord record = makePipableActivity();
|
||||||
|
final Task rootTask = record.getRootTask();
|
||||||
|
|
||||||
|
clearInvocations(mWm.mAtmService.mRootWindowContainer);
|
||||||
|
final WindowContainerTransaction t = new WindowContainerTransaction();
|
||||||
|
WindowContainerToken wct = rootTask.mRemoteToken.toWindowContainerToken();
|
||||||
|
t.setWindowingMode(wct, WINDOWING_MODE_PINNED);
|
||||||
|
mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
|
||||||
|
verify(mWm.mAtmService.mRootWindowContainer).resumeFocusedTasksTopActivities();
|
||||||
|
|
||||||
|
clearInvocations(mWm.mAtmService.mRootWindowContainer);
|
||||||
|
t.setWindowingMode(wct, WINDOWING_MODE_FULLSCREEN);
|
||||||
|
mWm.mAtmService.mWindowOrganizerController.applyTransaction(t);
|
||||||
|
verify(mWm.mAtmService.mRootWindowContainer).resumeFocusedTasksTopActivities();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verifies that task vanished is called for a specific task.
|
* Verifies that task vanished is called for a specific task.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user