Update indication whenever locked state changes

Otherwise the state of TrustAgents would be out of sync.

Test: manual with trusted bt headphones
Test: atest KeyguardIndicationControllerTest
Fixes: 131048776
Change-Id: I796ecd3bff3eaca52b46354c30a839eef8097338
This commit is contained in:
Lucas Dupin
2019-04-25 16:40:54 -07:00
parent 5a9e4ba9d5
commit 8e2fd0123a
2 changed files with 76 additions and 21 deletions

View File

@@ -56,6 +56,7 @@ import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.UnlockMethodCache;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.util.wakelock.SettableWakeLock;
@@ -69,7 +70,8 @@ import java.util.IllegalFormatConversionException;
/**
* Controls the indications and error messages shown on the Keyguard
*/
public class KeyguardIndicationController implements StateListener {
public class KeyguardIndicationController implements StateListener,
UnlockMethodCache.OnUnlockMethodChangedListener {
private static final String TAG = "KeyguardIndication";
private static final boolean DEBUG_CHARGING_SPEED = false;
@@ -81,6 +83,9 @@ public class KeyguardIndicationController implements StateListener {
private final Context mContext;
private final ShadeController mShadeController;
private final AccessibilityController mAccessibilityController;
private final UnlockMethodCache mUnlockMethodCache;
private final StatusBarStateController mStatusBarStateController;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private ViewGroup mIndicationArea;
private KeyguardIndicationTextView mTextView;
private KeyguardIndicationTextView mDisclosure;
@@ -122,18 +127,21 @@ public class KeyguardIndicationController implements StateListener {
this(context, indicationArea, lockIcon, new LockPatternUtils(context),
WakeLock.createPartial(context, "Doze:KeyguardIndication"),
Dependency.get(ShadeController.class),
Dependency.get(AccessibilityController.class));
registerCallbacks(KeyguardUpdateMonitor.getInstance(context));
Dependency.get(AccessibilityController.class),
UnlockMethodCache.getInstance(context),
Dependency.get(StatusBarStateController.class),
KeyguardUpdateMonitor.getInstance(context));
}
/**
* Creates a new KeyguardIndicationController for testing. Does *not* register callbacks.
* Creates a new KeyguardIndicationController for testing.
*/
@VisibleForTesting
KeyguardIndicationController(Context context, ViewGroup indicationArea, LockIcon lockIcon,
LockPatternUtils lockPatternUtils, WakeLock wakeLock, ShadeController shadeController,
AccessibilityController accessibilityController) {
AccessibilityController accessibilityController, UnlockMethodCache unlockMethodCache,
StatusBarStateController statusBarStateController,
KeyguardUpdateMonitor keyguardUpdateMonitor) {
mContext = context;
mIndicationArea = indicationArea;
mTextView = indicationArea.findViewById(R.id.keyguard_indication_text);
@@ -143,6 +151,9 @@ public class KeyguardIndicationController implements StateListener {
mLockIcon = lockIcon;
mShadeController = shadeController;
mAccessibilityController = accessibilityController;
mUnlockMethodCache = unlockMethodCache;
mStatusBarStateController = statusBarStateController;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
// lock icon is not used on all form factors.
if (mLockIcon != null) {
mLockIcon.setOnLongClickListener(this::handleLockLongClick);
@@ -161,15 +172,12 @@ public class KeyguardIndicationController implements StateListener {
mDevicePolicyManager = (DevicePolicyManager) context.getSystemService(
Context.DEVICE_POLICY_SERVICE);
updateDisclosure();
}
private void registerCallbacks(KeyguardUpdateMonitor monitor) {
monitor.registerCallback(getKeyguardCallback());
KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mTickReceiver);
Dependency.get(StatusBarStateController.class).addCallback(this);
mKeyguardUpdateMonitor.registerCallback(getKeyguardCallback());
mKeyguardUpdateMonitor.registerCallback(mTickReceiver);
mStatusBarStateController.addCallback(this);
mUnlockMethodCache.addListener(this);
}
/**
@@ -179,8 +187,10 @@ public class KeyguardIndicationController implements StateListener {
* //TODO: This can probably be converted to a fragment and not have to be manually recreated
*/
public void destroy() {
KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mTickReceiver);
Dependency.get(StatusBarStateController.class).removeCallback(this);
mKeyguardUpdateMonitor.removeCallback(mTickReceiver);
mKeyguardUpdateMonitor.removeCallback(getKeyguardCallback());
mStatusBarStateController.removeCallback(this);
mUnlockMethodCache.removeListener(this);
}
private boolean handleLockLongClick(View view) {
@@ -271,7 +281,8 @@ public class KeyguardIndicationController implements StateListener {
*
* @return {@code null} or an empty string if a trust indication text should not be shown.
*/
private String getTrustGrantedIndication() {
@VisibleForTesting
String getTrustGrantedIndication() {
return mContext.getString(R.string.keyguard_indication_trust_unlocked);
}
@@ -363,7 +374,6 @@ public class KeyguardIndicationController implements StateListener {
return;
}
KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
int userId = KeyguardUpdateMonitor.getCurrentUser();
String trustGrantedIndication = getTrustGrantedIndication();
String trustManagedIndication = getTrustManagedIndication();
@@ -374,7 +384,7 @@ public class KeyguardIndicationController implements StateListener {
mTextView.switchIndication(mTransientIndication);
mTextView.setTextColor(mTransientTextColorState);
} else if (!TextUtils.isEmpty(trustGrantedIndication)
&& updateMonitor.getUserHasTrust(userId)) {
&& mKeyguardUpdateMonitor.getUserHasTrust(userId)) {
mTextView.switchIndication(trustGrantedIndication);
mTextView.setTextColor(mInitialTextColorState);
} else if (mPowerPluggedIn) {
@@ -389,8 +399,8 @@ public class KeyguardIndicationController implements StateListener {
mTextView.switchIndication(indication);
}
} else if (!TextUtils.isEmpty(trustManagedIndication)
&& updateMonitor.getUserTrustIsManaged(userId)
&& !updateMonitor.getUserHasTrust(userId)) {
&& mKeyguardUpdateMonitor.getUserTrustIsManaged(userId)
&& !mKeyguardUpdateMonitor.getUserHasTrust(userId)) {
mTextView.switchIndication(trustManagedIndication);
mTextView.setTextColor(mInitialTextColorState);
} else {
@@ -572,6 +582,11 @@ public class KeyguardIndicationController implements StateListener {
setDozing(isDozing);
}
@Override
public void onUnlockMethodStateChanged() {
updateIndication(!mDozing);
}
protected class BaseKeyguardCallback extends KeyguardUpdateMonitorCallback {
public static final int HIDE_DELAY_MS = 5000;

View File

@@ -20,10 +20,12 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
@@ -43,12 +45,15 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.UnlockMethodCache;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.util.wakelock.WakeLockFake;
@@ -81,6 +86,12 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
private ShadeController mShadeController;
@Mock
private AccessibilityController mAccessibilityController;
@Mock
private UnlockMethodCache mUnlockMethodCache;
@Mock
private StatusBarStateController mStatusBarStateController;
@Mock
private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private KeyguardIndicationTextView mTextView;
private KeyguardIndicationController mController;
@@ -111,7 +122,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
Looper.prepare();
}
mController = new KeyguardIndicationController(mContext, mIndicationArea, mLockIcon,
mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController);
mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController,
mUnlockMethodCache, mStatusBarStateController, mKeyguardUpdateMonitor);
}
@Test
@@ -250,4 +262,32 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
longClickCaptor.getValue().onLongClick(mLockIcon);
verify(mLockPatternUtils).requireCredentialEntry(anyInt());
}
@Test
public void unlockMethodCache_listenerUpdatesIndication() {
createController();
String restingIndication = "Resting indication";
when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(true);
mController.setRestingIndication(restingIndication);
mController.setVisible(true);
assertThat(mTextView.getText()).isEqualTo(mController.getTrustGrantedIndication());
reset(mKeyguardUpdateMonitor);
when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false);
mController.onUnlockMethodStateChanged();
assertThat(mTextView.getText()).isEqualTo(restingIndication);
}
@Test
public void unlockMethodCache_listener() {
createController();
verify(mUnlockMethodCache).addListener(eq(mController));
verify(mStatusBarStateController).addCallback(eq(mController));
verify(mKeyguardUpdateMonitor, times(2)).registerCallback(any());
mController.destroy();
verify(mUnlockMethodCache).removeListener(eq(mController));
verify(mStatusBarStateController).removeCallback(eq(mController));
verify(mKeyguardUpdateMonitor, times(2)).removeCallback(any());
}
}