From 2623b922787a0f4262c9475bbbdc83a25e309fed Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Fri, 13 May 2022 13:01:02 +0800 Subject: [PATCH] Send client relaunch event to WMCore. By sending the local relaunch event to server side, WMCore can keep the starting window when client remove the original window, and because client won't preserve the original window, the result of redrawed view will match the new configuration. Bug: 230998394 Test: launch chrome => swipe to go home => change toggle to either light or dark theme => launch chrome again. Verify the app won't become transparent and the starting window remains on screen until client report finish draw. Change-Id: Ic8f1ebaf0bbaf2b060338ca08a11069481c09b9a --- core/java/android/app/ActivityClient.java | 9 +++++++++ core/java/android/app/ActivityThread.java | 1 + core/java/android/app/IActivityClientController.aidl | 1 + .../android/server/wm/ActivityClientController.java | 12 ++++++++++++ 4 files changed, 23 insertions(+) diff --git a/core/java/android/app/ActivityClient.java b/core/java/android/app/ActivityClient.java index 668dc6b8ec63f..73678d9f2ddad 100644 --- a/core/java/android/app/ActivityClient.java +++ b/core/java/android/app/ActivityClient.java @@ -98,6 +98,15 @@ public class ActivityClient { } } + /** Reports the activity starts local relaunch. */ + public void activityLocalRelaunch(IBinder token) { + try { + getActivityClientController().activityLocalRelaunch(token); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + /** Reports the activity has completed relaunched. */ public void activityRelaunched(IBinder token) { try { diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index b4cabada05228..3158bd7b21db0 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -5728,6 +5728,7 @@ public final class ActivityThread extends ClientTransactionHandler return; } + ActivityClient.getInstance().activityLocalRelaunch(r.token); // Initialize a relaunch request. final MergedConfiguration mergedConfiguration = new MergedConfiguration( r.createdConfig != null diff --git a/core/java/android/app/IActivityClientController.aidl b/core/java/android/app/IActivityClientController.aidl index 130716122ed2f..0138186974a67 100644 --- a/core/java/android/app/IActivityClientController.aidl +++ b/core/java/android/app/IActivityClientController.aidl @@ -53,6 +53,7 @@ interface IActivityClientController { oneway void activityStopped(in IBinder token, in Bundle state, in PersistableBundle persistentState, in CharSequence description); oneway void activityDestroyed(in IBinder token); + oneway void activityLocalRelaunch(in IBinder token); oneway void activityRelaunched(in IBinder token); oneway void reportSizeConfigurations(in IBinder token, diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index f21f906317928..f6748de660e27 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -245,6 +245,18 @@ class ActivityClientController extends IActivityClientController.Stub { } } + @Override + public void activityLocalRelaunch(IBinder token) { + final long origId = Binder.clearCallingIdentity(); + synchronized (mGlobalLock) { + final ActivityRecord r = ActivityRecord.forTokenLocked(token); + if (r != null) { + r.startRelaunching(); + } + } + Binder.restoreCallingIdentity(origId); + } + @Override public void activityRelaunched(IBinder token) { final long origId = Binder.clearCallingIdentity();