[Keyguard] Fix unlock animation for occluded LS.

When we open shade from dream (which is in an occluded keyguard state)
and open settings. We are prompted to authenticate with the bouncer.
Upon doing so, the app hangs in keyguard even though the user is no
unlocked. In order to fix this, we opt not to defer keyguard done when
keyguard is occluded.

Test: Manual and a unit test
Bug: 228064734
Change-Id: I58aebe033f069dc6bedb3ad3a78da849ed29dc78
This commit is contained in:
Aaron Liu
2022-07-07 12:56:52 -07:00
parent 91079f446e
commit 6096b1a597
2 changed files with 25 additions and 1 deletions

View File

@@ -2560,8 +2560,13 @@ public class CentralSurfacesImpl extends CoreStartable implements
callback.onActivityStarted(ActivityManager.START_CANCELED);
}
};
// Do not deferKeyguard when occluded because, when keyguard is occluded,
// we do not launch the activity until keyguard is done.
boolean occluded = mStatusBarKeyguardViewManager.isShowing()
&& mStatusBarKeyguardViewManager.isOccluded();
boolean deferred = !occluded;
executeRunnableDismissingKeyguard(runnable, cancelRunnable, dismissShadeDirectly,
willLaunchResolverActivity, true /* deferred */, animate);
willLaunchResolverActivity, deferred /* deferred */, animate);
}
@Nullable

View File

@@ -19,6 +19,8 @@ package com.android.systemui.statusbar.phone;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK;
import static com.google.common.truth.Truth.assertThat;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static junit.framework.TestCase.fail;
@@ -44,6 +46,7 @@ import android.app.WallpaperManager;
import android.app.trust.TrustManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.devicestate.DeviceStateManager;
import android.hardware.display.AmbientDisplayConfiguration;
@@ -999,6 +1002,22 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
verify(mStatusBarStateController, never()).setLeaveOpenOnKeyguardHide(true);
}
@Test
public void startActivityDismissingKeyguard_isShowingandIsOccluded() {
when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
mCentralSurfaces.startActivityDismissingKeyguard(
new Intent(),
/* onlyProvisioned = */false,
/* dismissShade = */false);
verify(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any(Runnable.class));
ArgumentCaptor<OnDismissAction> onDismissActionCaptor =
ArgumentCaptor.forClass(OnDismissAction.class);
verify(mStatusBarKeyguardViewManager)
.dismissWithAction(onDismissActionCaptor.capture(), any(Runnable.class), eq(true));
assertThat(onDismissActionCaptor.getValue().onDismiss()).isFalse();
}
private void setDeviceState(int state) {
ArgumentCaptor<DeviceStateManager.DeviceStateCallback> callbackCaptor =
ArgumentCaptor.forClass(DeviceStateManager.DeviceStateCallback.class);