Do not add starting window after the starting data was cleared.

After moving the starting window logic to Shell, some timeing could be
changed. For some case the starting window could be added back to
window manager after app has drawn, for this case the mStartingData
was already cleared.
A reasonable solution should to prevent the starting window add back
to window manager if window manager already clear the starting data,
and for this case we don't need to remove the starting window from
window manager.

Bug: 182749276
Test: atest ActivityRecordTests
Change-Id: Iec8581908a413a1d8f70a2006d58386c5c8f5b86
This commit is contained in:
wilsonshih
2021-03-16 10:52:50 +08:00
parent c415157f45
commit e19a5a29d6
3 changed files with 20 additions and 5 deletions

View File

@@ -3307,6 +3307,12 @@
"group": "WM_DEBUG_WINDOW_TRANSITIONS",
"at": "com\/android\/server\/wm\/TransitionController.java"
},
"1804245629": {
"message": "Attempted to add starting window to token but already cleaned",
"level": "WARN",
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
"1810019902": {
"message": "TRANSIT_FLAG_OPEN_BEHIND, adding %s to mOpeningApps",
"level": "DEBUG",

View File

@@ -2247,6 +2247,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// Go ahead and cancel the request.
ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "Clearing startingData for token=%s", this);
mStartingData = null;
// Clean surface up since we don't want the window to be added back, so we don't
// need to keep the surface to remove it.
mStartingSurface = null;
}
return;
}

View File

@@ -1600,11 +1600,17 @@ public class WindowManagerService extends IWindowManager.Stub
ProtoLog.w(WM_ERROR, "Attempted to add window with exiting application token "
+ ".%s Aborting.", token);
return WindowManagerGlobal.ADD_APP_EXITING;
} else if (type == TYPE_APPLICATION_STARTING && activity.mStartingWindow != null) {
ProtoLog.w(WM_ERROR,
"Attempted to add starting window to token with already existing"
+ " starting window");
return WindowManagerGlobal.ADD_DUPLICATE_ADD;
} else if (type == TYPE_APPLICATION_STARTING) {
if (activity.mStartingWindow != null) {
ProtoLog.w(WM_ERROR, "Attempted to add starting window to "
+ "token with already existing starting window");
return WindowManagerGlobal.ADD_DUPLICATE_ADD;
}
if (activity.mStartingData == null) {
ProtoLog.w(WM_ERROR, "Attempted to add starting window to "
+ "token but already cleaned");
return WindowManagerGlobal.ADD_DUPLICATE_ADD;
}
}
} else if (rootType == TYPE_INPUT_METHOD) {
if (token.windowType != TYPE_INPUT_METHOD) {