From 64413843b5d5fdc30f4fa6b0fbf768794bb3d763 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 8 Jul 2020 23:48:36 +0800 Subject: [PATCH] Simplify handling activity config a bit - Remove parameter movedToDifferentDisplay because it can be retrieved by comparing current display id and new id. Then some logic can be shared. - REPORT_TO_ACTIVITY was used to distinguish whether to report new configuration to the activity according it is process or activity level change. Since the conditions had been separated by different methods, its usages can be removed. Bug: 160780522 Test: atest MultiDisplayActivityLaunchTests Change-Id: I914963261ba339ba8c7bb5c50d7a8b25791db12e --- core/java/android/app/ActivityThread.java | 73 +++++++++-------------- 1 file changed, 29 insertions(+), 44 deletions(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index a2947a967d881..81fc5dfc56a63 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -271,9 +271,6 @@ public final class ActivityThread extends ClientTransactionHandler { /** Type for IActivityManager.serviceDoneExecuting: done stopping (destroying) service */ public static final int SERVICE_DONE_EXECUTING_STOP = 2; - // Whether to invoke an activity callback after delivering new configuration. - private static final boolean REPORT_TO_ACTIVITY = true; - /** Use foreground GC policy (less pause time) and higher JIT weight. */ private static final int VM_PROCESS_STATE_JANK_PERCEPTIBLE = 0; /** Use background GC policy and default JIT threshold. */ @@ -5539,18 +5536,14 @@ public final class ActivityThread extends ClientTransactionHandler { } /** - * Updates the configuration for an Activity. The ActivityClientRecord's - * {@link ActivityClientRecord#overrideConfig} is used to compute the final Configuration for - * that Activity. {@link ActivityClientRecord#tmpConfig} is used as a temporary for delivering - * the updated Configuration. - * @param r ActivityClientRecord representing the Activity. - * @param newBaseConfig The new configuration to use. This may be augmented with - * {@link ActivityClientRecord#overrideConfig}. + * Updates the configuration for an Activity in its current display. + * + * @see #performConfigurationChangedForActivity(ActivityClientRecord, Configuration, int, + * boolean) */ private void performConfigurationChangedForActivity(ActivityClientRecord r, Configuration newBaseConfig) { - performConfigurationChangedForActivity(r, newBaseConfig, r.activity.getDisplayId(), - false /* movedToDifferentDisplay */); + performConfigurationChangedForActivity(r, newBaseConfig, r.activity.getDisplayId()); } /** @@ -5562,17 +5555,16 @@ public final class ActivityThread extends ClientTransactionHandler { * @param newBaseConfig The new configuration to use. This may be augmented with * {@link ActivityClientRecord#overrideConfig}. * @param displayId The id of the display where the Activity currently resides. - * @param movedToDifferentDisplay Indicates if the activity was moved to different display. * @return {@link Configuration} instance sent to client, null if not sent. */ private Configuration performConfigurationChangedForActivity(ActivityClientRecord r, - Configuration newBaseConfig, int displayId, boolean movedToDifferentDisplay) { + Configuration newBaseConfig, int displayId) { r.tmpConfig.setTo(newBaseConfig); if (r.overrideConfig != null) { r.tmpConfig.updateFrom(r.overrideConfig); } final Configuration reportedConfig = performActivityConfigurationChanged(r.activity, - r.tmpConfig, r.overrideConfig, displayId, movedToDifferentDisplay); + r.tmpConfig, r.overrideConfig, displayId); freeTextLayoutCachesIfNeeded(r.activity.mCurrentConfig.diff(r.tmpConfig)); return reportedConfig; } @@ -5599,10 +5591,6 @@ public final class ActivityThread extends ClientTransactionHandler { * @param newConfig The new configuration. */ private void performConfigurationChanged(ComponentCallbacks2 cb, Configuration newConfig) { - if (!REPORT_TO_ACTIVITY) { - return; - } - // ContextThemeWrappers may override the configuration for that context. We must check and // apply any overrides defined. Configuration contextThemeWrapperOverrideConfig = null; @@ -5627,12 +5615,10 @@ public final class ActivityThread extends ClientTransactionHandler { * from the base global configuration. This is supplied by * ActivityManager. * @param displayId Id of the display where activity currently resides. - * @param movedToDifferentDisplay Indicates if the activity was moved to different display. * @return Configuration sent to client, null if no changes and not moved to different display. */ private Configuration performActivityConfigurationChanged(Activity activity, - Configuration newConfig, Configuration amOverrideConfig, int displayId, - boolean movedToDifferentDisplay) { + Configuration newConfig, Configuration amOverrideConfig, int displayId) { if (activity == null) { throw new IllegalArgumentException("No activity provided."); } @@ -5645,6 +5631,7 @@ public final class ActivityThread extends ClientTransactionHandler { // callback, see also PinnedStackTests#testConfigurationChangeOrderDuringTransition handleWindowingModeChangeIfNeeded(activity, newConfig); + final boolean movedToDifferentDisplay = isDifferentDisplay(activity, displayId); boolean shouldReportChange = false; if (activity.mCurrentConfig == null) { shouldReportChange = true; @@ -5658,8 +5645,7 @@ public final class ActivityThread extends ClientTransactionHandler { amOverrideConfig)) { // Nothing significant, don't proceed with updating and reporting. return null; - } else if ((~activity.mActivityInfo.getRealConfigChanged() & diff) == 0 - || !REPORT_TO_ACTIVITY) { + } else if ((~activity.mActivityInfo.getRealConfigChanged() & diff) == 0) { // If this activity doesn't handle any of the config changes, then don't bother // calling onConfigurationChanged. Otherwise, report to the activity for the // changes. @@ -5693,11 +5679,6 @@ public final class ActivityThread extends ClientTransactionHandler { final Configuration configToReport = createNewConfigAndUpdateIfNotNull(newConfig, contextThemeWrapperOverrideConfig); - if (!REPORT_TO_ACTIVITY) { - // Not configured to report to activity. - return configToReport; - } - if (movedToDifferentDisplay) { activity.dispatchMovedToDisplay(displayId, configToReport); } @@ -5990,8 +5971,6 @@ public final class ActivityThread extends ClientTransactionHandler { if (DEBUG_CONFIGURATION) Slog.w(TAG, "Not found target activity to report to: " + r); return; } - final boolean movedToDifferentDisplay = displayId != INVALID_DISPLAY - && displayId != r.activity.getDisplayId(); synchronized (r) { if (overrideConfig.isOtherSeqNewer(r.mPendingOverrideConfig)) { @@ -6005,6 +5984,7 @@ public final class ActivityThread extends ClientTransactionHandler { r.mPendingOverrideConfig = null; } + final boolean movedToDifferentDisplay = isDifferentDisplay(r.activity, displayId); if (r.overrideConfig != null && !r.overrideConfig.isOtherSeqNewer(overrideConfig) && !movedToDifferentDisplay) { if (DEBUG_CONFIGURATION) { @@ -6020,29 +6000,34 @@ public final class ActivityThread extends ClientTransactionHandler { final ViewRootImpl viewRoot = r.activity.mDecor != null ? r.activity.mDecor.getViewRootImpl() : null; - if (movedToDifferentDisplay) { - if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle activity moved to display, activity:" - + r.activityInfo.name + ", displayId=" + displayId + if (DEBUG_CONFIGURATION) { + Slog.v(TAG, "Handle activity config changed, activity:" + + r.activityInfo.name + ", displayId=" + r.activity.getDisplayId() + + (movedToDifferentDisplay ? (", newDisplayId=" + displayId) : "") + ", config=" + overrideConfig); - - final Configuration reportedConfig = performConfigurationChangedForActivity(r, - mCompatConfiguration, displayId, true /* movedToDifferentDisplay */); - if (viewRoot != null) { - viewRoot.onMovedToDisplay(displayId, reportedConfig); - } - } else { - if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle activity config changed: " - + r.activityInfo.name + ", config=" + overrideConfig); - performConfigurationChangedForActivity(r, mCompatConfiguration); } + final Configuration reportedConfig = performConfigurationChangedForActivity(r, + mCompatConfiguration, + movedToDifferentDisplay ? displayId : r.activity.getDisplayId()); // Notify the ViewRootImpl instance about configuration changes. It may have initiated this // update to make sure that resources are updated before updating itself. if (viewRoot != null) { + if (movedToDifferentDisplay) { + viewRoot.onMovedToDisplay(displayId, reportedConfig); + } viewRoot.updateConfiguration(displayId); } mSomeActivitiesChanged = true; } + /** + * Checks if the display id of activity is different from the given one. Note that + * {@link #INVALID_DISPLAY} means no difference. + */ + private static boolean isDifferentDisplay(@NonNull Activity activity, int displayId) { + return displayId != INVALID_DISPLAY && displayId != activity.getDisplayId(); + } + final void handleProfilerControl(boolean start, ProfilerInfo profilerInfo, int profileType) { if (start) { try {