Merge changes If7fb2450,I36614c86,Ic8bd2d0e,I4062f1f4 into tm-qpr-dev

* changes:
  Do not pass in anon callback.
  Dismiss user dialog when keyguard is going away.
  Bouncer pin appear flashes the message area
  Add more top margin for bouncer user switcher
This commit is contained in:
Aaron Liu
2023-03-07 20:54:59 +00:00
committed by Android (Google) Code Review
15 changed files with 82 additions and 29 deletions

View File

@@ -27,6 +27,4 @@
<integer name="scaled_password_text_size">26</integer> <integer name="scaled_password_text_size">26</integer>
<dimen name="bouncer_user_switcher_y_trans">@dimen/status_bar_height</dimen> <dimen name="bouncer_user_switcher_y_trans">@dimen/status_bar_height</dimen>
<dimen name="bouncer_user_switcher_view_mode_user_switcher_bottom_margin">0dp</dimen>
<dimen name="bouncer_user_switcher_view_mode_view_flipper_bottom_margin">0dp</dimen>
</resources> </resources>

View File

@@ -123,9 +123,7 @@
<dimen name="bouncer_user_switcher_item_padding_vertical">10dp</dimen> <dimen name="bouncer_user_switcher_item_padding_vertical">10dp</dimen>
<dimen name="bouncer_user_switcher_item_padding_horizontal">12dp</dimen> <dimen name="bouncer_user_switcher_item_padding_horizontal">12dp</dimen>
<dimen name="bouncer_user_switcher_header_padding_end">44dp</dimen> <dimen name="bouncer_user_switcher_header_padding_end">44dp</dimen>
<dimen name="bouncer_user_switcher_y_trans">0dp</dimen> <dimen name="bouncer_user_switcher_y_trans">80dp</dimen>
<dimen name="bouncer_user_switcher_view_mode_user_switcher_bottom_margin">0dp</dimen>
<dimen name="bouncer_user_switcher_view_mode_view_flipper_bottom_margin">0dp</dimen>
<!-- 2 * the margin + size should equal the plus_margin --> <!-- 2 * the margin + size should equal the plus_margin -->
<dimen name="user_switcher_icon_large_margin">16dp</dimen> <dimen name="user_switcher_icon_large_margin">16dp</dimen>

View File

@@ -66,4 +66,8 @@
<dimen name="controls_header_horizontal_padding">12dp</dimen> <dimen name="controls_header_horizontal_padding">12dp</dimen>
<dimen name="controls_content_margin_horizontal">16dp</dimen> <dimen name="controls_content_margin_horizontal">16dp</dimen>
<!-- Bouncer user switcher margins -->
<dimen name="bouncer_user_switcher_view_mode_user_switcher_bottom_margin">0dp</dimen>
<dimen name="bouncer_user_switcher_view_mode_view_flipper_bottom_margin">0dp</dimen>
</resources> </resources>

View File

@@ -21,6 +21,6 @@
<!-- Space between status view and notification shelf --> <!-- Space between status view and notification shelf -->
<dimen name="keyguard_status_view_bottom_margin">70dp</dimen> <dimen name="keyguard_status_view_bottom_margin">70dp</dimen>
<dimen name="keyguard_clock_top_margin">80dp</dimen> <dimen name="keyguard_clock_top_margin">80dp</dimen>
<dimen name="bouncer_user_switcher_view_mode_user_switcher_bottom_margin">186dp</dimen> <dimen name="bouncer_user_switcher_view_mode_user_switcher_bottom_margin">155dp</dimen>
<dimen name="bouncer_user_switcher_view_mode_view_flipper_bottom_margin">110dp</dimen> <dimen name="bouncer_user_switcher_view_mode_view_flipper_bottom_margin">85dp</dimen>
</resources> </resources>

View File

@@ -1701,4 +1701,9 @@
it is long-pressed. it is long-pressed.
--> -->
<dimen name="keyguard_long_press_settings_popup_vertical_offset">96dp</dimen> <dimen name="keyguard_long_press_settings_popup_vertical_offset">96dp</dimen>
<!-- Bouncer user switcher margins -->
<dimen name="bouncer_user_switcher_view_mode_user_switcher_bottom_margin">0dp</dimen>
<dimen name="bouncer_user_switcher_view_mode_view_flipper_bottom_margin">0dp</dimen>
</resources> </resources>

View File

@@ -217,9 +217,11 @@ public class KeyguardPINView extends KeyguardPinBasedInputView {
private void animate(float progress) { private void animate(float progress) {
Interpolator standardDecelerate = Interpolators.STANDARD_DECELERATE; Interpolator standardDecelerate = Interpolators.STANDARD_DECELERATE;
Interpolator legacyDecelerate = Interpolators.LEGACY_DECELERATE; Interpolator legacyDecelerate = Interpolators.LEGACY_DECELERATE;
float standardProgress = standardDecelerate.getInterpolation(progress);
mBouncerMessageView.setTranslationY( mBouncerMessageView.setTranslationY(
mYTrans - mYTrans * standardDecelerate.getInterpolation(progress)); mYTrans - mYTrans * standardProgress);
mBouncerMessageView.setAlpha(standardProgress);
for (int i = 0; i < mViews.length; i++) { for (int i = 0; i < mViews.length; i++) {
View[] row = mViews[i]; View[] row = mViews[i];
@@ -236,7 +238,7 @@ public class KeyguardPINView extends KeyguardPinBasedInputView {
view.setAlpha(scaledProgress); view.setAlpha(scaledProgress);
int yDistance = mYTrans + mYTransOffset * i; int yDistance = mYTrans + mYTransOffset * i;
view.setTranslationY( view.setTranslationY(
yDistance - (yDistance * standardDecelerate.getInterpolation(progress))); yDistance - (yDistance * standardProgress));
if (view instanceof NumPadAnimationListener) { if (view instanceof NumPadAnimationListener) {
((NumPadAnimationListener) view).setProgress(scaledProgress); ((NumPadAnimationListener) view).setProgress(scaledProgress);
} }

View File

@@ -1220,8 +1220,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
constraintSet.connect(rightElement, LEFT, leftElement, RIGHT); constraintSet.connect(rightElement, LEFT, leftElement, RIGHT);
constraintSet.connect(rightElement, RIGHT, PARENT_ID, RIGHT); constraintSet.connect(rightElement, RIGHT, PARENT_ID, RIGHT);
constraintSet.connect(mUserSwitcherViewGroup.getId(), TOP, PARENT_ID, TOP); constraintSet.connect(mUserSwitcherViewGroup.getId(), TOP, PARENT_ID, TOP);
constraintSet.connect(mUserSwitcherViewGroup.getId(), BOTTOM, PARENT_ID, BOTTOM, constraintSet.connect(mUserSwitcherViewGroup.getId(), BOTTOM, PARENT_ID, BOTTOM);
yTrans);
constraintSet.connect(mViewFlipper.getId(), TOP, PARENT_ID, TOP); constraintSet.connect(mViewFlipper.getId(), TOP, PARENT_ID, TOP);
constraintSet.connect(mViewFlipper.getId(), BOTTOM, PARENT_ID, BOTTOM); constraintSet.connect(mViewFlipper.getId(), BOTTOM, PARENT_ID, BOTTOM);
constraintSet.setHorizontalChainStyle(mUserSwitcherViewGroup.getId(), CHAIN_SPREAD); constraintSet.setHorizontalChainStyle(mUserSwitcherViewGroup.getId(), CHAIN_SPREAD);

View File

@@ -708,6 +708,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
if (mKeyguardGoingAway) { if (mKeyguardGoingAway) {
updateFaceListeningState(BIOMETRIC_ACTION_STOP, updateFaceListeningState(BIOMETRIC_ACTION_STOP,
FACE_AUTH_STOPPED_KEYGUARD_GOING_AWAY); FACE_AUTH_STOPPED_KEYGUARD_GOING_AWAY);
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onKeyguardGoingAway();
}
}
} }
updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE); updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE);
} }
@@ -3644,7 +3650,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
* Register to receive notifications about general keyguard information * Register to receive notifications about general keyguard information
* (see {@link KeyguardUpdateMonitorCallback}. * (see {@link KeyguardUpdateMonitorCallback}.
* *
* @param callback The callback to register * @param callback The callback to register. Stay away from passing anonymous instances
* as they will likely be dereferenced. Ensure that the callback is a class
* field to persist it.
*/ */
public void registerCallback(KeyguardUpdateMonitorCallback callback) { public void registerCallback(KeyguardUpdateMonitorCallback callback) {
Assert.isMainThread(); Assert.isMainThread();

View File

@@ -317,4 +317,9 @@ public class KeyguardUpdateMonitorCallback {
* Called when the non-strong biometric state changed. * Called when the non-strong biometric state changed.
*/ */
public void onNonStrongBiometricAllowedChanged(int userId) { } public void onNonStrongBiometricAllowedChanged(int userId) { }
/**
* Called when keyguard is going away or not going away.
*/
public void onKeyguardGoingAway() { }
} }

View File

@@ -122,21 +122,24 @@ constructor(
val isInteractable: Flow<Boolean> = bouncerExpansion.map { it > 0.9 } val isInteractable: Flow<Boolean> = bouncerExpansion.map { it > 0.9 }
val sideFpsShowing: Flow<Boolean> = repository.sideFpsShowing val sideFpsShowing: Flow<Boolean> = repository.sideFpsShowing
init { /**
keyguardUpdateMonitor.registerCallback( * This callback needs to be a class field so it does not get garbage collected.
object : KeyguardUpdateMonitorCallback() { */
override fun onBiometricRunningStateChanged( val keyguardUpdateMonitorCallback = object : KeyguardUpdateMonitorCallback() {
running: Boolean, override fun onBiometricRunningStateChanged(
biometricSourceType: BiometricSourceType? running: Boolean,
) { biometricSourceType: BiometricSourceType?
updateSideFpsVisibility() ) {
} updateSideFpsVisibility()
}
override fun onStrongAuthStateChanged(userId: Int) { override fun onStrongAuthStateChanged(userId: Int) {
updateSideFpsVisibility() updateSideFpsVisibility()
} }
} }
)
init {
keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
} }
// TODO(b/243685699): Move isScrimmed logic to data layer. // TODO(b/243685699): Move isScrimmed logic to data layer.

View File

@@ -32,6 +32,8 @@ import android.os.UserManager
import android.provider.Settings import android.provider.Settings
import android.util.Log import android.util.Log
import com.android.internal.util.UserIcons import com.android.internal.util.UserIcons
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.SystemUISecondaryUserService import com.android.systemui.SystemUISecondaryUserService
import com.android.systemui.animation.Expandable import com.android.systemui.animation.Expandable
@@ -90,6 +92,7 @@ constructor(
@Application private val applicationScope: CoroutineScope, @Application private val applicationScope: CoroutineScope,
telephonyInteractor: TelephonyInteractor, telephonyInteractor: TelephonyInteractor,
broadcastDispatcher: BroadcastDispatcher, broadcastDispatcher: BroadcastDispatcher,
keyguardUpdateMonitor: KeyguardUpdateMonitor,
@Background private val backgroundDispatcher: CoroutineDispatcher, @Background private val backgroundDispatcher: CoroutineDispatcher,
private val activityManager: ActivityManager, private val activityManager: ActivityManager,
private val refreshUsersScheduler: RefreshUsersScheduler, private val refreshUsersScheduler: RefreshUsersScheduler,
@@ -286,6 +289,12 @@ constructor(
val isSimpleUserSwitcher: Boolean val isSimpleUserSwitcher: Boolean
get() = repository.isSimpleUserSwitcher() get() = repository.isSimpleUserSwitcher()
val keyguardUpdateMonitorCallback =
object : KeyguardUpdateMonitorCallback() {
override fun onKeyguardGoingAway() {
dismissDialog()
}
}
init { init {
refreshUsersScheduler.refreshIfNotPaused() refreshUsersScheduler.refreshIfNotPaused()
@@ -316,6 +325,7 @@ constructor(
onBroadcastReceived(intent, previousSelectedUser) onBroadcastReceived(intent, previousSelectedUser)
} }
.launchIn(applicationScope) .launchIn(applicationScope)
keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
} }
fun addCallback(callback: UserCallback) { fun addCallback(callback: UserCallback) {

View File

@@ -263,9 +263,6 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
assertThat(viewFlipperConstraint.layout.bottomToBottom).isEqualTo(PARENT_ID); assertThat(viewFlipperConstraint.layout.bottomToBottom).isEqualTo(PARENT_ID);
assertThat(userSwitcherConstraint.layout.topToTop).isEqualTo(PARENT_ID); assertThat(userSwitcherConstraint.layout.topToTop).isEqualTo(PARENT_ID);
assertThat(userSwitcherConstraint.layout.bottomToBottom).isEqualTo(PARENT_ID); assertThat(userSwitcherConstraint.layout.bottomToBottom).isEqualTo(PARENT_ID);
assertThat(userSwitcherConstraint.layout.bottomMargin).isEqualTo(
getContext().getResources().getDimensionPixelSize(
R.dimen.bouncer_user_switcher_y_trans));
assertThat(viewFlipperConstraint.layout.horizontalChainStyle).isEqualTo(CHAIN_SPREAD); assertThat(viewFlipperConstraint.layout.horizontalChainStyle).isEqualTo(CHAIN_SPREAD);
assertThat(userSwitcherConstraint.layout.horizontalChainStyle).isEqualTo(CHAIN_SPREAD); assertThat(userSwitcherConstraint.layout.horizontalChainStyle).isEqualTo(CHAIN_SPREAD);
assertThat(viewFlipperConstraint.layout.mHeight).isEqualTo(MATCH_CONSTRAINT); assertThat(viewFlipperConstraint.layout.mHeight).isEqualTo(MATCH_CONSTRAINT);

View File

@@ -29,6 +29,8 @@ import android.os.UserManager
import android.provider.Settings import android.provider.Settings
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.internal.logging.UiEventLogger import com.android.internal.logging.UiEventLogger
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.systemui.GuestResetOrExitSessionReceiver import com.android.systemui.GuestResetOrExitSessionReceiver
import com.android.systemui.GuestResumeSessionReceiver import com.android.systemui.GuestResumeSessionReceiver
import com.android.systemui.R import com.android.systemui.R
@@ -62,6 +64,7 @@ import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.nullable import com.android.systemui.util.mockito.nullable
import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import junit.framework.Assert.assertNotNull
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.StandardTestDispatcher
@@ -72,6 +75,7 @@ import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.junit.runners.JUnit4 import org.junit.runners.JUnit4
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock import org.mockito.Mock
@@ -96,6 +100,7 @@ class UserInteractorTest : SysuiTestCase() {
@Mock private lateinit var resumeSessionReceiver: GuestResumeSessionReceiver @Mock private lateinit var resumeSessionReceiver: GuestResumeSessionReceiver
@Mock private lateinit var resetOrExitSessionReceiver: GuestResetOrExitSessionReceiver @Mock private lateinit var resetOrExitSessionReceiver: GuestResetOrExitSessionReceiver
@Mock private lateinit var commandQueue: CommandQueue @Mock private lateinit var commandQueue: CommandQueue
@Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
private lateinit var underTest: UserInteractor private lateinit var underTest: UserInteractor
@@ -154,6 +159,7 @@ class UserInteractorTest : SysuiTestCase() {
repository = telephonyRepository, repository = telephonyRepository,
), ),
broadcastDispatcher = fakeBroadcastDispatcher, broadcastDispatcher = fakeBroadcastDispatcher,
keyguardUpdateMonitor = keyguardUpdateMonitor,
backgroundDispatcher = testDispatcher, backgroundDispatcher = testDispatcher,
activityManager = activityManager, activityManager = activityManager,
refreshUsersScheduler = refreshUsersScheduler, refreshUsersScheduler = refreshUsersScheduler,
@@ -176,6 +182,18 @@ class UserInteractorTest : SysuiTestCase() {
) )
} }
@Test
fun `testKeyguardUpdateMonitor_onKeyguardGoingAway`() =
testScope.runTest {
val argumentCaptor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java)
verify(keyguardUpdateMonitor).registerCallback(argumentCaptor.capture())
argumentCaptor.value.onKeyguardGoingAway()
val lastValue = collectLastValue(underTest.dialogDismissRequests)
assertNotNull(lastValue)
}
@Test @Test
fun `onRecordSelected - user`() = fun `onRecordSelected - user`() =
testScope.runTest { testScope.runTest {

View File

@@ -25,6 +25,7 @@ import android.graphics.drawable.BitmapDrawable
import android.os.UserManager import android.os.UserManager
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.internal.logging.UiEventLogger import com.android.internal.logging.UiEventLogger
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.GuestResetOrExitSessionReceiver import com.android.systemui.GuestResetOrExitSessionReceiver
import com.android.systemui.GuestResumeSessionReceiver import com.android.systemui.GuestResumeSessionReceiver
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
@@ -80,6 +81,7 @@ class StatusBarUserChipViewModelTest : SysuiTestCase() {
@Mock private lateinit var resumeSessionReceiver: GuestResumeSessionReceiver @Mock private lateinit var resumeSessionReceiver: GuestResumeSessionReceiver
@Mock private lateinit var resetOrExitSessionReceiver: GuestResetOrExitSessionReceiver @Mock private lateinit var resetOrExitSessionReceiver: GuestResetOrExitSessionReceiver
@Mock private lateinit var commandQueue: CommandQueue @Mock private lateinit var commandQueue: CommandQueue
@Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
private lateinit var underTest: StatusBarUserChipViewModel private lateinit var underTest: StatusBarUserChipViewModel
@@ -263,6 +265,7 @@ class StatusBarUserChipViewModelTest : SysuiTestCase() {
repository = FakeTelephonyRepository(), repository = FakeTelephonyRepository(),
), ),
broadcastDispatcher = fakeBroadcastDispatcher, broadcastDispatcher = fakeBroadcastDispatcher,
keyguardUpdateMonitor = keyguardUpdateMonitor,
backgroundDispatcher = testDispatcher, backgroundDispatcher = testDispatcher,
activityManager = activityManager, activityManager = activityManager,
refreshUsersScheduler = refreshUsersScheduler, refreshUsersScheduler = refreshUsersScheduler,

View File

@@ -23,6 +23,7 @@ import android.content.pm.UserInfo
import android.os.UserManager import android.os.UserManager
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.internal.logging.UiEventLogger import com.android.internal.logging.UiEventLogger
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.GuestResetOrExitSessionReceiver import com.android.systemui.GuestResetOrExitSessionReceiver
import com.android.systemui.GuestResumeSessionReceiver import com.android.systemui.GuestResumeSessionReceiver
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
@@ -81,6 +82,7 @@ class UserSwitcherViewModelTest : SysuiTestCase() {
@Mock private lateinit var resumeSessionReceiver: GuestResumeSessionReceiver @Mock private lateinit var resumeSessionReceiver: GuestResumeSessionReceiver
@Mock private lateinit var resetOrExitSessionReceiver: GuestResetOrExitSessionReceiver @Mock private lateinit var resetOrExitSessionReceiver: GuestResetOrExitSessionReceiver
@Mock private lateinit var commandQueue: CommandQueue @Mock private lateinit var commandQueue: CommandQueue
@Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
private lateinit var underTest: UserSwitcherViewModel private lateinit var underTest: UserSwitcherViewModel
@@ -165,6 +167,7 @@ class UserSwitcherViewModelTest : SysuiTestCase() {
repository = FakeTelephonyRepository(), repository = FakeTelephonyRepository(),
), ),
broadcastDispatcher = fakeBroadcastDispatcher, broadcastDispatcher = fakeBroadcastDispatcher,
keyguardUpdateMonitor = keyguardUpdateMonitor,
backgroundDispatcher = testDispatcher, backgroundDispatcher = testDispatcher,
activityManager = activityManager, activityManager = activityManager,
refreshUsersScheduler = refreshUsersScheduler, refreshUsersScheduler = refreshUsersScheduler,