From 3ad1b4899fcf38de92b6ac8d84e55a738f0baad9 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Fri, 1 Apr 2016 16:41:41 -0700 Subject: [PATCH] Fix issue with overridden configuration in onConfigurationChanged When using applyOverrideConfiguration, subsequent callbacks to onConfigurationChanged didn't take into account the locally overridden configuration. This patches the incoming configuration to match what is expected by the application. Bug:27644297 Change-Id: I3a090e9862a56470d999aa0aa4d5bae29f533a11 --- core/java/android/app/ActivityThread.java | 17 ++++++++++++++++- core/java/android/view/ContextThemeWrapper.java | 9 +++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 5b94696c1461b..14c4fc6451fc4 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -91,6 +91,7 @@ import android.util.PrintWriterPrinter; import android.util.Slog; import android.util.SparseIntArray; import android.util.SuperNotCalledException; +import android.view.ContextThemeWrapper; import android.view.Display; import android.view.ThreadedRenderer; import android.view.View; @@ -4632,7 +4633,21 @@ public final class ActivityThread { } if (reportToActivity) { - cb.onConfigurationChanged(newConfig); + Configuration configToReport = newConfig; + + if (cb instanceof ContextThemeWrapper) { + // ContextThemeWrappers may override the configuration for that context. + // We must check and apply any overrides defined. + ContextThemeWrapper contextThemeWrapper = (ContextThemeWrapper) cb; + final Configuration localOverrideConfig = + contextThemeWrapper.getOverrideConfiguration(); + if (localOverrideConfig != null) { + configToReport = new Configuration(newConfig); + configToReport.updateFrom(localOverrideConfig); + } + } + + cb.onConfigurationChanged(configToReport); } if (activity != null) { diff --git a/core/java/android/view/ContextThemeWrapper.java b/core/java/android/view/ContextThemeWrapper.java index 4888877cb28be..86318e91b8854 100644 --- a/core/java/android/view/ContextThemeWrapper.java +++ b/core/java/android/view/ContextThemeWrapper.java @@ -101,6 +101,15 @@ public class ContextThemeWrapper extends ContextWrapper { mOverrideConfiguration = new Configuration(overrideConfiguration); } + /** + * Used by ActivityThread to apply the overridden configuration to onConfigurationChange + * callbacks. + * @hide + */ + public Configuration getOverrideConfiguration() { + return mOverrideConfiguration; + } + @Override public AssetManager getAssets() { // Ensure we're returning assets with the correct configuration.