Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db3e4ecf authored by Andrii Kulian's avatar Andrii Kulian
Browse files

Don't make redundant launch while updating configuration

If the configuration changed the same time when the app was launched,
from ActivityStackSupervisor#realStartActivityLocked we updated
configuration, which lead to resuming top activity in focused stack.
This caused second redundant launch of already launching activity.

Bug: 29516875
Change-Id: I2babe1936dfb53b5a440deee34874731913db2eb
parent 9b550cb1
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -18669,7 +18669,7 @@ public final class ActivityManagerService extends ActivityManagerNative
        synchronized(this) {
            final long origId = Binder.clearCallingIdentity();
            updateConfigurationLocked(values, null, false, true, userId);
            updateConfigurationLocked(values, null, false, true, userId, false /* deferResume */);
            Binder.restoreCallingIdentity(origId);
        }
    }
@@ -18737,11 +18737,16 @@ public final class ActivityManagerService extends ActivityManagerNative
        updateConfigurationLocked(configuration, null, false);
    }
    boolean updateConfigurationLocked(Configuration values,
            ActivityRecord starting, boolean initLocale) {
    boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
            boolean initLocale) {
        return updateConfigurationLocked(values, starting, initLocale, false /* deferResume */);
    }
    boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
            boolean initLocale, boolean deferResume) {
        // pass UserHandle.USER_NULL as userId because we don't persist configuration for any user
        return updateConfigurationLocked(values, starting, initLocale, false,
                UserHandle.USER_NULL);
        return updateConfigurationLocked(values, starting, initLocale, false /* persistent */,
                UserHandle.USER_NULL, deferResume);
    }
    // To cache the list of supported system locales
@@ -18757,8 +18762,8 @@ public final class ActivityManagerService extends ActivityManagerNative
     * @param userId is only used when persistent parameter is set to true to persist configuration
     *               for that particular user
     */
    private boolean updateConfigurationLocked(Configuration values,
            ActivityRecord starting, boolean initLocale, boolean persistent, int userId) {
    private boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
            boolean initLocale, boolean persistent, int userId, boolean deferResume) {
        int changes = 0;
        if (mWindowManager != null) {
@@ -18886,7 +18891,7 @@ public final class ActivityManagerService extends ActivityManagerNative
                    for (int stackId : resizedStacks) {
                        final Rect newBounds = mWindowManager.getBoundsForNewConfiguration(stackId);
                        mStackSupervisor.resizeStackLocked(
                                stackId, newBounds, null, null, false, false, !DEFER_RESUME);
                                stackId, newBounds, null, null, false, false, deferResume);
                    }
                }
            }
@@ -21783,7 +21788,8 @@ public final class ActivityManagerService extends ActivityManagerNative
            Preconditions.checkNotNull(values, "Configuration must not be null");
            Preconditions.checkArgumentNonnegative(userId, "userId " + userId + " not supported");
            synchronized (ActivityManagerService.this) {
                updateConfigurationLocked(values, null, false, true, userId);
                updateConfigurationLocked(values, null, false, true, userId,
                        false /* deferResume */);
            }
        }
+19 −6
Original line number Diff line number Diff line
@@ -1189,7 +1189,10 @@ public final class ActivityStackSupervisor implements DisplayListener {
            Configuration config = mWindowManager.updateOrientationFromAppTokens(
                    mService.mConfiguration,
                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
            mService.updateConfigurationLocked(config, r, false);
            // Deferring resume here because we're going to launch new activity shortly.
            // We don't want to perform a redundant launch of the same record while ensuring
            // configurations and trying to resume top activity of focused stack.
            mService.updateConfigurationLocked(config, r, false, true /* deferResume */);
        }

        r.app = app;
@@ -2004,7 +2007,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
            boolean preserveWindows, boolean allowResizeInDockedMode, boolean deferResume) {
        if (stackId == DOCKED_STACK_ID) {
            resizeDockedStackLocked(bounds, tempTaskBounds, tempTaskInsetBounds, null, null,
                    preserveWindows);
                    preserveWindows, deferResume);
            return;
        }
        final ActivityStack stack = getStack(stackId);
@@ -2154,8 +2157,16 @@ public final class ActivityStackSupervisor implements DisplayListener {
    }

    void resizeDockedStackLocked(Rect dockedBounds, Rect tempDockedTaskBounds,
            Rect tempDockedTaskInsetBounds,
            Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds, boolean preserveWindows) {
            Rect tempDockedTaskInsetBounds, Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds,
            boolean preserveWindows) {
        resizeDockedStackLocked(dockedBounds, tempDockedTaskBounds, tempDockedTaskInsetBounds,
                tempOtherTaskBounds, tempOtherTaskInsetBounds, preserveWindows,
                false /* deferResume */);
    }

    void resizeDockedStackLocked(Rect dockedBounds, Rect tempDockedTaskBounds,
            Rect tempDockedTaskInsetBounds, Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds,
            boolean preserveWindows, boolean deferResume) {

        if (!mAllowDockedStackResize) {
            // Docked stack resize currently disabled.
@@ -2198,11 +2209,13 @@ public final class ActivityStackSupervisor implements DisplayListener {
                    if (StackId.isResizeableByDockedStack(i) && getStack(i) != null) {
                        resizeStackLocked(i, tempRect, tempOtherTaskBounds,
                                tempOtherTaskInsetBounds, preserveWindows,
                                true /* allowResizeInDockedMode */, !DEFER_RESUME);
                                true /* allowResizeInDockedMode */, deferResume);
                    }
                }
            }
            if (!deferResume) {
                stack.ensureVisibleActivitiesConfigurationLocked(r, preserveWindows);
            }
        } finally {
            mAllowDockedStackResize = true;
            mWindowManager.continueSurfaceLayout();