From bb8e81770b6df4f770949dc3350202a1f0d34992 Mon Sep 17 00:00:00 2001 From: Lenka Trochtova Date: Fri, 25 Jan 2019 17:21:54 +0100 Subject: [PATCH] Settings UI fix for missing secure lock screen feature. Bug: 123737250 Bug: 111072170 Bug: 111071972 Test: manual both with and without the feature flag Test: make RunSettingsRoboTests Change-Id: Iacefa95dce85d860633315e074cbf2772691cfdd --- .../settings/password/ChooseLockGeneric.java | 4 ++-- .../password/ChooseLockGenericController.java | 20 +++++++++++++++---- .../ChooseLockGenericControllerTest.java | 8 +++++++- .../ChooseLockTypeDialogFragmentTest.java | 3 ++- .../password/SetupChooseLockPasswordTest.java | 9 ++++++++- .../password/SetupChooseLockPatternTest.java | 3 ++- .../shadow/ShadowLockPatternUtils.java | 5 +++++ 7 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index cae7d332117..cf6211246f0 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -238,8 +238,8 @@ public class ChooseLockGeneric extends SettingsActivity { UserManager.get(getActivity()), getArguments(), getActivity().getIntent().getExtras()).getIdentifier(); - mController = - new ChooseLockGenericController(getContext(), mUserId, mRequestedMinComplexity); + mController = new ChooseLockGenericController( + getContext(), mUserId, mRequestedMinComplexity, mLockPatternUtils); if (ACTION_SET_NEW_PASSWORD.equals(chooseLockAction) && UserManager.get(getActivity()).isManagedProfile(mUserId) && mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) { diff --git a/src/com/android/settings/password/ChooseLockGenericController.java b/src/com/android/settings/password/ChooseLockGenericController.java index 91ca9574a98..62a00635800 100644 --- a/src/com/android/settings/password/ChooseLockGenericController.java +++ b/src/com/android/settings/password/ChooseLockGenericController.java @@ -27,6 +27,7 @@ import android.os.UserHandle; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import java.util.ArrayList; @@ -43,12 +44,14 @@ public class ChooseLockGenericController { @PasswordComplexity private final int mRequestedMinComplexity; private ManagedLockPasswordProvider mManagedPasswordProvider; private DevicePolicyManager mDpm; + private final LockPatternUtils mLockPatternUtils; public ChooseLockGenericController(Context context, int userId) { this( context, userId, - PASSWORD_COMPLEXITY_NONE); + PASSWORD_COMPLEXITY_NONE, + new LockPatternUtils(context)); } /** @@ -56,13 +59,14 @@ public class ChooseLockGenericController { * when determining the available screen lock types */ public ChooseLockGenericController(Context context, int userId, - @PasswordComplexity int requestedMinComplexity) { + @PasswordComplexity int requestedMinComplexity, LockPatternUtils lockPatternUtils) { this( context, userId, requestedMinComplexity, context.getSystemService(DevicePolicyManager.class), - ManagedLockPasswordProvider.get(context, userId)); + ManagedLockPasswordProvider.get(context, userId), + lockPatternUtils); } @VisibleForTesting @@ -71,12 +75,14 @@ public class ChooseLockGenericController { int userId, @PasswordComplexity int requestedMinComplexity, DevicePolicyManager dpm, - ManagedLockPasswordProvider managedLockPasswordProvider) { + ManagedLockPasswordProvider managedLockPasswordProvider, + LockPatternUtils lockPatternUtils) { mContext = context; mUserId = userId; mRequestedMinComplexity = requestedMinComplexity; mManagedPasswordProvider = managedLockPasswordProvider; mDpm = dpm; + mLockPatternUtils = lockPatternUtils; } /** @@ -105,6 +111,12 @@ public class ChooseLockGenericController { && !managedProfile; // Swipe doesn't make sense for profiles. case MANAGED: return mManagedPasswordProvider.isManagedPasswordChoosable(); + case PIN: + case PATTERN: + case PASSWORD: + // Hide the secure lock screen options if the device doesn't support the secure lock + // screen feature. + return mLockPatternUtils.hasSecureLockScreen(); } return true; } diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericControllerTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericControllerTest.java index 2b7bdeb6948..4adc01b8a95 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericControllerTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericControllerTest.java @@ -34,6 +34,7 @@ import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager.PasswordComplexity; import android.content.ComponentName; +import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.testutils.shadow.SettingsShadowResources; @@ -61,10 +62,14 @@ public class ChooseLockGenericControllerTest { @Mock private DevicePolicyManager mDevicePolicyManager; + @Mock + private LockPatternUtils mLockPatternUtils; + @Before public void setUp() { MockitoAnnotations.initMocks(this); + when(mLockPatternUtils.hasSecureLockScreen()).thenReturn(true); mController = createController(PASSWORD_COMPLEXITY_NONE); SettingsShadowResources.overrideResource(R.bool.config_hide_none_security_option, false); SettingsShadowResources.overrideResource(R.bool.config_hide_swipe_security_option, false); @@ -266,6 +271,7 @@ public class ChooseLockGenericControllerTest { 0 /* userId */, minPasswordComplexity, mDevicePolicyManager, - mManagedLockPasswordProvider); + mManagedLockPasswordProvider, + mLockPatternUtils); } } diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java index 195c82d0089..9e8644ffdec 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java @@ -33,6 +33,7 @@ import androidx.fragment.app.FragmentActivity; import com.android.settings.R; import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import com.android.settings.testutils.shadow.ShadowLockPatternUtils; import org.junit.Before; import org.junit.Test; @@ -43,7 +44,7 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.androidx.fragment.FragmentController; @RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowAlertDialogCompat.class) +@Config(shadows = {ShadowAlertDialogCompat.class, ShadowLockPatternUtils.class}) public class ChooseLockTypeDialogFragmentTest { private Context mContext; diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java index e0c6dedc83f..aeb16e6f207 100644 --- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java +++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java @@ -34,6 +34,7 @@ import com.android.settings.password.ChooseLockPassword.IntentBuilder; import com.android.settings.password.SetupChooseLockPassword.SetupChooseLockPasswordFragment; import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import com.android.settings.testutils.shadow.ShadowLockPatternUtils; import com.android.settings.testutils.shadow.ShadowUtils; import com.android.settings.widget.ScrollToParentEditText; @@ -57,7 +58,13 @@ import java.util.Collections; import java.util.List; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {SettingsShadowResources.class, ShadowUtils.class, ShadowAlertDialogCompat.class}) +@Config( + shadows = { + SettingsShadowResources.class, + ShadowLockPatternUtils.class, + ShadowUtils.class, + ShadowAlertDialogCompat.class + }) public class SetupChooseLockPasswordTest { @Before diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java index 430c535428d..4852546525e 100644 --- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java +++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java @@ -38,6 +38,7 @@ import com.android.settings.SetupRedactionInterstitial; import com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment; import com.android.settings.password.ChooseLockPattern.IntentBuilder; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import com.android.settings.testutils.shadow.ShadowLockPatternUtils; import com.android.settings.testutils.shadow.ShadowUtils; import com.google.android.setupcompat.PartnerCustomizationLayout; @@ -57,7 +58,7 @@ import org.robolectric.util.ReflectionHelpers.ClassParameter; import java.util.Arrays; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowUtils.class, ShadowAlertDialogCompat.class}) +@Config(shadows = {ShadowUtils.class, ShadowAlertDialogCompat.class, ShadowLockPatternUtils.class}) public class SetupChooseLockPatternTest { private SetupChooseLockPattern mActivity; diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java index 7ce098d9ea8..f2870854750 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java @@ -31,6 +31,11 @@ public class ShadowLockPatternUtils { private static boolean sDeviceEncryptionEnabled; + @Implementation + protected boolean hasSecureLockScreen() { + return true; + } + @Implementation protected boolean isSecure(int id) { return true;