Fix multiple configuration changes in multiwindow
When in split-screen mode and activity handles configuration changes
it gets 2 onConfigurationChanged calls which originate from
ActivityManagerService#updateConfigurationLocked:
1. app.thread.scheduleConfigurationChanged calls to all process records
send configuration of the whole screen for corresponding orientation,
which leads to CONFIGURATION_CHANGED message in ActivityThread.
2. mStackSupervisor.resizeStackLocked call resizes both visible stacks and
eventually ActivityThread receives ACTIVITY_CONFIGURATION_CHANGED
message with correct configuration corresponding to space occupied in
split-screen.
In this CL if component callback is an instance of Activity and it had
override config set - onConfigurationChanged will not be triggered unless
override config has changed.
Bug: 27948331
Change-Id: Ia73b045570b44eb5b351811bf6c4f63d78c3f909
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 96e1eaa..36e962e 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4727,8 +4727,16 @@
if (callbacks != null) {
final int N = callbacks.size();
for (int i=0; i<N; i++) {
- performConfigurationChanged(callbacks.get(i), null, config, null,
- REPORT_TO_ACTIVITY);
+ ComponentCallbacks2 cb = callbacks.get(i);
+ if (cb instanceof Activity) {
+ // If callback is an Activity - call corresponding method to consider override
+ // config and avoid onConfigurationChanged if it hasn't changed.
+ Activity a = (Activity) cb;
+ performConfigurationChangedForActivity(mActivities.get(a.getActivityToken()),
+ config, REPORT_TO_ACTIVITY);
+ } else {
+ performConfigurationChanged(cb, null, config, null, REPORT_TO_ACTIVITY);
+ }
}
}
}