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

Commit c6467172 authored by Ivan Podogov's avatar Ivan Podogov
Browse files

Fix setRequestedOrientation() freeze on Android Wear.

In ag/1460784 and ag/1551198, logic of
ActivityManagerService.updateConfigurationLocked
(now updateDisplayOverrideConfigurationLocked) was changed a bit:
before those CL's, with (changes == 0) we were still calling
mWindowManager.setNewConfiguration(mGlobalConfiguration)
(which is now mWindowManager.setNewDisplayOverrideConfiguration).
Now, when there was a call to Activity.setRequestedOrientation, the
window becomes frozen and waiting for configuration, which is never sent
since there are no changes detected (which we don't know in advance when
freezing the window). This is important for watches, since they have
"square" screens, and resources configuration for them doesn't change
after requesting landscape orientation, i.e. display rotates 90 degrees,
yet the layout stays portrait. As a result, device becomes frozen.

This CL only moves mWindowManager.setNewDisplayOverrideConfiguration
call outside of the (changes == 0) check to restore the old logic.

Bug: 37684680
Test: go/wm-smoke (on Pixel), manual (on Wear)
Change-Id: Idf1f5989173494d51437b9a66296b4cac82d15c2
parent 614636e9
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -20180,6 +20180,11 @@ public class ActivityManagerService extends IActivityManager.Stub
        mTempConfig.setTo(getGlobalConfiguration());
        final int changes = mTempConfig.updateFrom(values);
        if (changes == 0) {
            // Since calling to Activity.setRequestedOrientation leads to freezing the window with
            // setting WindowManagerService.mWaitingForConfig to true, it is important that we call
            // performDisplayOverrideConfigUpdate in order to send the new display configuration
            // (even if there are no actual changes) to unfreeze the window.
            performDisplayOverrideConfigUpdate(values, deferResume, DEFAULT_DISPLAY);
            return 0;
        }
@@ -20368,12 +20373,9 @@ public class ActivityManagerService extends IActivityManager.Stub
            int displayId) {
        mTempConfig.setTo(mStackSupervisor.getDisplayOverrideConfiguration(displayId));
        final int changes = mTempConfig.updateFrom(values);
        if (changes == 0) {
            return 0;
        }
        Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " " + mTempConfig
                + " for displayId=" + displayId);
        if (changes != 0) {
            Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " "
                    + mTempConfig + " for displayId=" + displayId);
            mStackSupervisor.setDisplayOverrideConfiguration(mTempConfig, displayId);
            final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
@@ -20381,7 +20383,9 @@ public class ActivityManagerService extends IActivityManager.Stub
                // Reset the unsupported display size dialog.
                mUiHandler.sendEmptyMessage(SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG);
            killAllBackgroundProcessesExcept(N, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
                killAllBackgroundProcessesExcept(N,
                        ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
            }
        }
        // Update the configuration with WM first and check if any of the stacks need to be resized