Loading core/java/android/app/ActivityThread.java +13 −11 Original line number Diff line number Diff line Loading @@ -5863,16 +5863,16 @@ public final class ActivityThread extends ClientTransactionHandler final boolean movedToDifferentDisplay = isDifferentDisplay(activity.getDisplayId(), displayId); final Configuration currentResConfig = activity.getResources().getConfiguration(); final int diff = currentResConfig.diffPublicOnly(newConfig); final boolean hasPublicResConfigChange = diff != 0; final Configuration currentConfig = activity.mCurrentConfig; final int diff = currentConfig.diffPublicOnly(newConfig); final boolean hasPublicConfigChange = diff != 0; final ActivityClientRecord r = getActivityClient(activityToken); // TODO(b/173090263): Use diff instead after the improvement of AssetManager and // ResourcesImpl constructions. final boolean shouldUpdateResources = hasPublicResConfigChange || shouldUpdateResources(activityToken, currentResConfig, newConfig, amOverrideConfig, movedToDifferentDisplay, hasPublicResConfigChange); final boolean shouldReportChange = shouldReportChange(activity.mCurrentConfig, newConfig, final boolean shouldUpdateResources = hasPublicConfigChange || shouldUpdateResources(activityToken, currentConfig, newConfig, amOverrideConfig, movedToDifferentDisplay, hasPublicConfigChange); final boolean shouldReportChange = shouldReportChange(diff, currentConfig, newConfig, r != null ? r.mSizeConfigurations : null, activity.mActivityInfo.getRealConfigChanged()); // Nothing significant, don't proceed with updating and reporting. Loading @@ -5896,6 +5896,9 @@ public final class ActivityThread extends ClientTransactionHandler amOverrideConfig, contextThemeWrapperOverrideConfig); mResourcesManager.updateResourcesForActivity(activityToken, finalOverrideConfig, displayId); activity.mConfigChangeFlags = 0; activity.mCurrentConfig = new Configuration(newConfig); // Apply the ContextThemeWrapper override if necessary. // NOTE: Make sure the configurations are not modified, as they are treated as immutable // in many places. Loading @@ -5906,10 +5909,8 @@ public final class ActivityThread extends ClientTransactionHandler activity.dispatchMovedToDisplay(displayId, configToReport); } activity.mConfigChangeFlags = 0; if (shouldReportChange) { activity.mCalled = false; activity.mCurrentConfig = new Configuration(newConfig); activity.onConfigurationChanged(configToReport); if (!activity.mCalled) { throw new SuperNotCalledException("Activity " + activity.getLocalClassName() + Loading @@ -5924,6 +5925,8 @@ public final class ActivityThread extends ClientTransactionHandler * Returns {@code true} if {@link Activity#onConfigurationChanged(Configuration)} should be * dispatched. * * @param publicDiff Usually computed by {@link Configuration#diffPublicOnly(Configuration)}. * This parameter is to prevent we compute it again. * @param currentConfig The current configuration cached in {@link Activity#mCurrentConfig}. * It is {@code null} before the first config update from the server side. * @param newConfig The updated {@link Configuration} Loading @@ -5932,10 +5935,9 @@ public final class ActivityThread extends ClientTransactionHandler * @return {@code true} if the config change should be reported to the Activity */ @VisibleForTesting public static boolean shouldReportChange(@Nullable Configuration currentConfig, public static boolean shouldReportChange(int publicDiff, @Nullable Configuration currentConfig, @NonNull Configuration newConfig, @Nullable SizeConfigurationBuckets sizeBuckets, int handledConfigChanges) { final int publicDiff = currentConfig.diffPublicOnly(newConfig); // Don't report the change if there's no public diff between current and new config. if (publicDiff == 0) { return false; Loading core/tests/mockingcoretests/src/android/app/activity/ActivityThreadClientTest.java +10 −10 Original line number Diff line number Diff line Loading @@ -207,8 +207,8 @@ public class ActivityThreadClientTest { final Configuration currentConfig = new Configuration(); assertFalse("Must not report change if no public diff", shouldReportChange(currentConfig, newConfig, null /* sizeBuckets */, 0 /* handledConfigChanges */)); shouldReportChange(0 /* publicDiff */, currentConfig, newConfig, null /* sizeBuckets */, 0 /* handledConfigChanges */)); final int[] verticalThresholds = {100, 400}; final SizeConfigurationBuckets buckets = new SizeConfigurationBuckets( Loading @@ -221,25 +221,25 @@ public class ActivityThreadClientTest { newConfig.screenHeightDp = 300; assertFalse("Must not report changes if the diff is small and not handled", shouldReportChange(currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); shouldReportChange(CONFIG_SCREEN_SIZE /* publicDiff */, currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); assertTrue("Must report changes if the small diff is handled", shouldReportChange(currentConfig, newConfig, buckets, CONFIG_SCREEN_SIZE /* handledConfigChanges */)); shouldReportChange(CONFIG_SCREEN_SIZE /* publicDiff */, currentConfig, newConfig, buckets, CONFIG_SCREEN_SIZE /* handledConfigChanges */)); currentConfig.fontScale = 0.8f; newConfig.fontScale = 1.2f; assertTrue("Must report handled changes regardless of small unhandled change", shouldReportChange(currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); shouldReportChange(CONFIG_SCREEN_SIZE | CONFIG_FONT_SCALE /* publicDiff */, currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); newConfig.screenHeightDp = 500; assertFalse("Must not report changes if there's unhandled big changes", shouldReportChange(currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); shouldReportChange(CONFIG_SCREEN_SIZE | CONFIG_FONT_SCALE /* publicDiff */, currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); } private void recreateAndVerifyNoRelaunch(ActivityThread activityThread, TestActivity activity) { Loading Loading
core/java/android/app/ActivityThread.java +13 −11 Original line number Diff line number Diff line Loading @@ -5863,16 +5863,16 @@ public final class ActivityThread extends ClientTransactionHandler final boolean movedToDifferentDisplay = isDifferentDisplay(activity.getDisplayId(), displayId); final Configuration currentResConfig = activity.getResources().getConfiguration(); final int diff = currentResConfig.diffPublicOnly(newConfig); final boolean hasPublicResConfigChange = diff != 0; final Configuration currentConfig = activity.mCurrentConfig; final int diff = currentConfig.diffPublicOnly(newConfig); final boolean hasPublicConfigChange = diff != 0; final ActivityClientRecord r = getActivityClient(activityToken); // TODO(b/173090263): Use diff instead after the improvement of AssetManager and // ResourcesImpl constructions. final boolean shouldUpdateResources = hasPublicResConfigChange || shouldUpdateResources(activityToken, currentResConfig, newConfig, amOverrideConfig, movedToDifferentDisplay, hasPublicResConfigChange); final boolean shouldReportChange = shouldReportChange(activity.mCurrentConfig, newConfig, final boolean shouldUpdateResources = hasPublicConfigChange || shouldUpdateResources(activityToken, currentConfig, newConfig, amOverrideConfig, movedToDifferentDisplay, hasPublicConfigChange); final boolean shouldReportChange = shouldReportChange(diff, currentConfig, newConfig, r != null ? r.mSizeConfigurations : null, activity.mActivityInfo.getRealConfigChanged()); // Nothing significant, don't proceed with updating and reporting. Loading @@ -5896,6 +5896,9 @@ public final class ActivityThread extends ClientTransactionHandler amOverrideConfig, contextThemeWrapperOverrideConfig); mResourcesManager.updateResourcesForActivity(activityToken, finalOverrideConfig, displayId); activity.mConfigChangeFlags = 0; activity.mCurrentConfig = new Configuration(newConfig); // Apply the ContextThemeWrapper override if necessary. // NOTE: Make sure the configurations are not modified, as they are treated as immutable // in many places. Loading @@ -5906,10 +5909,8 @@ public final class ActivityThread extends ClientTransactionHandler activity.dispatchMovedToDisplay(displayId, configToReport); } activity.mConfigChangeFlags = 0; if (shouldReportChange) { activity.mCalled = false; activity.mCurrentConfig = new Configuration(newConfig); activity.onConfigurationChanged(configToReport); if (!activity.mCalled) { throw new SuperNotCalledException("Activity " + activity.getLocalClassName() + Loading @@ -5924,6 +5925,8 @@ public final class ActivityThread extends ClientTransactionHandler * Returns {@code true} if {@link Activity#onConfigurationChanged(Configuration)} should be * dispatched. * * @param publicDiff Usually computed by {@link Configuration#diffPublicOnly(Configuration)}. * This parameter is to prevent we compute it again. * @param currentConfig The current configuration cached in {@link Activity#mCurrentConfig}. * It is {@code null} before the first config update from the server side. * @param newConfig The updated {@link Configuration} Loading @@ -5932,10 +5935,9 @@ public final class ActivityThread extends ClientTransactionHandler * @return {@code true} if the config change should be reported to the Activity */ @VisibleForTesting public static boolean shouldReportChange(@Nullable Configuration currentConfig, public static boolean shouldReportChange(int publicDiff, @Nullable Configuration currentConfig, @NonNull Configuration newConfig, @Nullable SizeConfigurationBuckets sizeBuckets, int handledConfigChanges) { final int publicDiff = currentConfig.diffPublicOnly(newConfig); // Don't report the change if there's no public diff between current and new config. if (publicDiff == 0) { return false; Loading
core/tests/mockingcoretests/src/android/app/activity/ActivityThreadClientTest.java +10 −10 Original line number Diff line number Diff line Loading @@ -207,8 +207,8 @@ public class ActivityThreadClientTest { final Configuration currentConfig = new Configuration(); assertFalse("Must not report change if no public diff", shouldReportChange(currentConfig, newConfig, null /* sizeBuckets */, 0 /* handledConfigChanges */)); shouldReportChange(0 /* publicDiff */, currentConfig, newConfig, null /* sizeBuckets */, 0 /* handledConfigChanges */)); final int[] verticalThresholds = {100, 400}; final SizeConfigurationBuckets buckets = new SizeConfigurationBuckets( Loading @@ -221,25 +221,25 @@ public class ActivityThreadClientTest { newConfig.screenHeightDp = 300; assertFalse("Must not report changes if the diff is small and not handled", shouldReportChange(currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); shouldReportChange(CONFIG_SCREEN_SIZE /* publicDiff */, currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); assertTrue("Must report changes if the small diff is handled", shouldReportChange(currentConfig, newConfig, buckets, CONFIG_SCREEN_SIZE /* handledConfigChanges */)); shouldReportChange(CONFIG_SCREEN_SIZE /* publicDiff */, currentConfig, newConfig, buckets, CONFIG_SCREEN_SIZE /* handledConfigChanges */)); currentConfig.fontScale = 0.8f; newConfig.fontScale = 1.2f; assertTrue("Must report handled changes regardless of small unhandled change", shouldReportChange(currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); shouldReportChange(CONFIG_SCREEN_SIZE | CONFIG_FONT_SCALE /* publicDiff */, currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); newConfig.screenHeightDp = 500; assertFalse("Must not report changes if there's unhandled big changes", shouldReportChange(currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); shouldReportChange(CONFIG_SCREEN_SIZE | CONFIG_FONT_SCALE /* publicDiff */, currentConfig, newConfig, buckets, CONFIG_FONT_SCALE /* handledConfigChanges */)); } private void recreateAndVerifyNoRelaunch(ActivityThread activityThread, TestActivity activity) { Loading