Apply new keyguard orientation when it becomes non-rotatable

Notification shade window didn't update its orientation
layout params sometimes when switching displays,
it worked only if there was a coincidental call
about other state change right after display switch.
Added explicit applying of the state if the value
of the resource that shows if the rotation is allowed
has changed.

Bug: 216622540
Test: atest com.android.systemui.statusbar.phone.NotificationShadeWindowControllerImplTest
Test: manually fold several times from portrait
 orientation on the inner screen to AOD screen
Change-Id: Ic071a614df33386796881029a17b55eb989e40d5
This commit is contained in:
Nick Chameyev
2022-02-23 12:44:52 +00:00
parent ddb497d64a
commit 9f017c7fdf
2 changed files with 46 additions and 1 deletions

View File

@@ -26,6 +26,7 @@ import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENAB
import android.app.IActivityManager;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.graphics.Region;
import android.os.Binder;
@@ -117,6 +118,7 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW
* @see #batchApplyWindowLayoutParams(Runnable)
*/
private int mDeferWindowLayoutParams;
private boolean mLastKeyguardRotationAllowed;
@Inject
public NotificationShadeWindowControllerImpl(Context context, WindowManager windowManager,
@@ -143,7 +145,7 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW
mScreenOffAnimationController = screenOffAnimationController;
dumpManager.registerDumpable(getClass().getName(), this);
mAuthController = authController;
mLastKeyguardRotationAllowed = mKeyguardStateController.isKeyguardScreenRotationAllowed();
mLockScreenDisplayTimeout = context.getResources()
.getInteger(R.integer.config_lockScreenDisplayTimeout);
((SysuiStatusBarStateController) statusBarStateController)
@@ -779,6 +781,17 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW
setKeyguardDark(useDarkText);
}
@Override
public void onConfigChanged(Configuration newConfig) {
final boolean newScreenRotationAllowed = mKeyguardStateController
.isKeyguardScreenRotationAllowed();
if (mLastKeyguardRotationAllowed != newScreenRotationAllowed) {
apply(mCurrentState);
mLastKeyguardRotationAllowed = newScreenRotationAllowed;
}
}
/**
* When keyguard will be dismissed but didn't start animation yet.
*/

View File

@@ -32,6 +32,8 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.IActivityManager;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.View;
@@ -227,6 +229,36 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase {
assertThat((mLayoutParameters.getValue().flags & FLAG_ALT_FOCUSABLE_IM) == 0).isTrue();
}
@Test
public void rotationBecameAllowed_layoutParamsUpdated() {
mNotificationShadeWindowController.setKeyguardShowing(true);
when(mKeyguardStateController.isKeyguardScreenRotationAllowed()).thenReturn(false);
mNotificationShadeWindowController.onConfigChanged(new Configuration());
clearInvocations(mWindowManager);
when(mKeyguardStateController.isKeyguardScreenRotationAllowed()).thenReturn(true);
mNotificationShadeWindowController.onConfigChanged(new Configuration());
verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture());
assertThat(mLayoutParameters.getValue().screenOrientation)
.isEqualTo(ActivityInfo.SCREEN_ORIENTATION_USER);
}
@Test
public void rotationBecameNotAllowed_layoutParamsUpdated() {
mNotificationShadeWindowController.setKeyguardShowing(true);
when(mKeyguardStateController.isKeyguardScreenRotationAllowed()).thenReturn(true);
mNotificationShadeWindowController.onConfigChanged(new Configuration());
clearInvocations(mWindowManager);
when(mKeyguardStateController.isKeyguardScreenRotationAllowed()).thenReturn(false);
mNotificationShadeWindowController.onConfigChanged(new Configuration());
verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture());
assertThat(mLayoutParameters.getValue().screenOrientation)
.isEqualTo(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}
@Test
public void batchApplyWindowLayoutParams_doesNotDispatchEvents() {
mNotificationShadeWindowController.setForceDozeBrightness(true);