diff --git a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java index 156e230c6b5..1284b6ad6e0 100644 --- a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java +++ b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java @@ -84,8 +84,7 @@ public class ChangeScreenLockPreferenceController extends AbstractPreferenceCont @Override public void updateState(Preference preference) { if (mPreference != null && mPreference instanceof GearPreference) { - if (mLockPatternUtils.isSecure(mUserId) - || !mLockPatternUtils.isLockScreenDisabled(mUserId)) { + if (mLockPatternUtils.isSecure(mUserId)) { ((GearPreference) mPreference).setOnGearClickListener(this); } else { ((GearPreference) mPreference).setOnGearClickListener(null); diff --git a/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java index 6cc1704bf39..fda5942b212 100644 --- a/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java @@ -17,17 +17,28 @@ package com.android.settings.security; import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.os.UserManager; +import android.view.LayoutInflater; +import android.view.View; + +import androidx.preference.PreferenceScreen; +import androidx.preference.PreferenceViewHolder; import com.android.internal.widget.LockPatternUtils; +import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowUtils; +import com.android.settings.widget.GearPreference; import org.junit.Before; import org.junit.Test; @@ -47,10 +58,15 @@ public class ChangeScreenLockPreferenceControllerTest { private UserManager mUserManager; @Mock private DevicePolicyManager mDevicePolicyManager; + @Mock + private PreferenceScreen mPreferenceScreen; private Context mContext; private FakeFeatureFactory mFeatureFactory; private ChangeScreenLockPreferenceController mController; + private View mGearView; + private GearPreference mGearPreference; + private PreferenceViewHolder mPreferenceViewHolder; @Before public void setUp() { @@ -75,4 +91,149 @@ public class ChangeScreenLockPreferenceControllerTest { public void testDeviceAdministrators_ifDisabled_shouldNotBeShown() { assertThat(mController.isAvailable()).isFalse(); } + + @Test + public void updateState_notSecureDisableKeyguard_shouldNotShowGear() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(true); + mockGearPreferenceAndViewHolder(); + + showPreference(); + + assertThat(mGearView.getVisibility()).isEqualTo(View.GONE); + } + + @Test + public void updateState_notSecureDisableKeyguard_summaryShouldShowOff() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(true); + mockGearPreferenceAndViewHolder(); + + showPreference(); + + assertThat(mGearPreference.getSummary()) + .isEqualTo(mContext.getString(R.string.unlock_set_unlock_mode_off)); + } + + @Test + public void updateState_notSecureWithSwipeKeyguard_shouldNotShowGear() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false); + mockGearPreferenceAndViewHolder(); + + showPreference(); + + assertThat(mGearView.getVisibility()).isEqualTo(View.GONE); + } + + @Test + public void updateState_notSecureWithSwipeKeyguard_summaryShouldShowSwipe() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false); + mockGearPreferenceAndViewHolder(); + + showPreference(); + + assertThat(mGearPreference.getSummary()) + .isEqualTo(mContext.getString(R.string.unlock_set_unlock_mode_none)); + } + + @Test + public void updateState_secureWithPinKeyguard_shouldShowGear() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false); + doReturn(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX).when(mLockPatternUtils) + .getKeyguardStoredPasswordQuality(anyInt()); + mockGearPreferenceAndViewHolder(); + + showPreference(); + + assertThat(mGearView.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void updateState_secureWithPinKeyguard_summaryShouldShowPin() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false); + doReturn(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX).when(mLockPatternUtils) + .getKeyguardStoredPasswordQuality(anyInt()); + + mockGearPreferenceAndViewHolder(); + + showPreference(); + + assertThat(mGearPreference.getSummary()) + .isEqualTo(mContext.getString(R.string.unlock_set_unlock_mode_pin)); + } + + @Test + public void updateState_secureWithPasswordKeyguard_shouldShowGear() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false); + doReturn(DevicePolicyManager.PASSWORD_QUALITY_COMPLEX).when(mLockPatternUtils) + .getKeyguardStoredPasswordQuality(anyInt()); + mockGearPreferenceAndViewHolder(); + + showPreference(); + + assertThat(mGearView.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void updateState_secureWithPasswordKeyguard_summaryShouldShowPassword() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false); + doReturn(DevicePolicyManager.PASSWORD_QUALITY_COMPLEX).when(mLockPatternUtils) + .getKeyguardStoredPasswordQuality(anyInt()); + mockGearPreferenceAndViewHolder(); + + showPreference(); + + assertThat(mGearPreference.getSummary()) + .isEqualTo(mContext.getString(R.string.unlock_set_unlock_mode_password)); + } + + @Test + public void updateState_secureWithPatternKeyguard_shouldShowGear() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false); + doReturn(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING).when(mLockPatternUtils) + .getKeyguardStoredPasswordQuality(anyInt()); + mockGearPreferenceAndViewHolder(); + + showPreference(); + + assertThat(mGearView.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void updateState_secureWithPatternKeyguard_summaryShouldShowPattern() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false); + doReturn(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING).when(mLockPatternUtils) + .getKeyguardStoredPasswordQuality(anyInt()); + mockGearPreferenceAndViewHolder(); + + showPreference(); + + assertThat(mGearPreference.getSummary()) + .isEqualTo(mContext.getString(R.string.unlock_set_unlock_mode_pattern)); + } + + private void mockGearPreferenceAndViewHolder() { + mGearPreference = new GearPreference(mContext, null); + mGearView = new View(mContext); + PreferenceViewHolder viewHolder = PreferenceViewHolder.createInstanceForTests( + LayoutInflater.from(mContext).inflate( + mGearPreference.getLayoutResource(), null, false)); + mPreferenceViewHolder = spy(viewHolder); + doReturn(mGearView).when(mPreferenceViewHolder).findViewById(R.id.settings_button); + when(mPreferenceScreen.findPreference(anyString())).thenReturn(mGearPreference); + } + + private void showPreference() { + mController.displayPreference(mPreferenceScreen); + mController.updateState(mGearPreference); + mGearPreference.onBindViewHolder(mPreferenceViewHolder); + } } \ No newline at end of file