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
This commit is contained in:
Lenka Trochtova
2019-01-25 17:21:54 +01:00
parent 0d8d233a3d
commit bb8e81770b
7 changed files with 42 additions and 10 deletions

View File

@@ -238,8 +238,8 @@ public class ChooseLockGeneric extends SettingsActivity {
UserManager.get(getActivity()), UserManager.get(getActivity()),
getArguments(), getArguments(),
getActivity().getIntent().getExtras()).getIdentifier(); getActivity().getIntent().getExtras()).getIdentifier();
mController = mController = new ChooseLockGenericController(
new ChooseLockGenericController(getContext(), mUserId, mRequestedMinComplexity); getContext(), mUserId, mRequestedMinComplexity, mLockPatternUtils);
if (ACTION_SET_NEW_PASSWORD.equals(chooseLockAction) if (ACTION_SET_NEW_PASSWORD.equals(chooseLockAction)
&& UserManager.get(getActivity()).isManagedProfile(mUserId) && UserManager.get(getActivity()).isManagedProfile(mUserId)
&& mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) { && mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) {

View File

@@ -27,6 +27,7 @@ import android.os.UserHandle;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R; import com.android.settings.R;
import java.util.ArrayList; import java.util.ArrayList;
@@ -43,12 +44,14 @@ public class ChooseLockGenericController {
@PasswordComplexity private final int mRequestedMinComplexity; @PasswordComplexity private final int mRequestedMinComplexity;
private ManagedLockPasswordProvider mManagedPasswordProvider; private ManagedLockPasswordProvider mManagedPasswordProvider;
private DevicePolicyManager mDpm; private DevicePolicyManager mDpm;
private final LockPatternUtils mLockPatternUtils;
public ChooseLockGenericController(Context context, int userId) { public ChooseLockGenericController(Context context, int userId) {
this( this(
context, context,
userId, userId,
PASSWORD_COMPLEXITY_NONE); PASSWORD_COMPLEXITY_NONE,
new LockPatternUtils(context));
} }
/** /**
@@ -56,13 +59,14 @@ public class ChooseLockGenericController {
* when determining the available screen lock types * when determining the available screen lock types
*/ */
public ChooseLockGenericController(Context context, int userId, public ChooseLockGenericController(Context context, int userId,
@PasswordComplexity int requestedMinComplexity) { @PasswordComplexity int requestedMinComplexity, LockPatternUtils lockPatternUtils) {
this( this(
context, context,
userId, userId,
requestedMinComplexity, requestedMinComplexity,
context.getSystemService(DevicePolicyManager.class), context.getSystemService(DevicePolicyManager.class),
ManagedLockPasswordProvider.get(context, userId)); ManagedLockPasswordProvider.get(context, userId),
lockPatternUtils);
} }
@VisibleForTesting @VisibleForTesting
@@ -71,12 +75,14 @@ public class ChooseLockGenericController {
int userId, int userId,
@PasswordComplexity int requestedMinComplexity, @PasswordComplexity int requestedMinComplexity,
DevicePolicyManager dpm, DevicePolicyManager dpm,
ManagedLockPasswordProvider managedLockPasswordProvider) { ManagedLockPasswordProvider managedLockPasswordProvider,
LockPatternUtils lockPatternUtils) {
mContext = context; mContext = context;
mUserId = userId; mUserId = userId;
mRequestedMinComplexity = requestedMinComplexity; mRequestedMinComplexity = requestedMinComplexity;
mManagedPasswordProvider = managedLockPasswordProvider; mManagedPasswordProvider = managedLockPasswordProvider;
mDpm = dpm; mDpm = dpm;
mLockPatternUtils = lockPatternUtils;
} }
/** /**
@@ -105,6 +111,12 @@ public class ChooseLockGenericController {
&& !managedProfile; // Swipe doesn't make sense for profiles. && !managedProfile; // Swipe doesn't make sense for profiles.
case MANAGED: case MANAGED:
return mManagedPasswordProvider.isManagedPasswordChoosable(); 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; return true;
} }

View File

@@ -34,6 +34,7 @@ import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManager.PasswordComplexity; import android.app.admin.DevicePolicyManager.PasswordComplexity;
import android.content.ComponentName; import android.content.ComponentName;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
@@ -61,10 +62,14 @@ public class ChooseLockGenericControllerTest {
@Mock @Mock
private DevicePolicyManager mDevicePolicyManager; private DevicePolicyManager mDevicePolicyManager;
@Mock
private LockPatternUtils mLockPatternUtils;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mLockPatternUtils.hasSecureLockScreen()).thenReturn(true);
mController = createController(PASSWORD_COMPLEXITY_NONE); mController = createController(PASSWORD_COMPLEXITY_NONE);
SettingsShadowResources.overrideResource(R.bool.config_hide_none_security_option, false); SettingsShadowResources.overrideResource(R.bool.config_hide_none_security_option, false);
SettingsShadowResources.overrideResource(R.bool.config_hide_swipe_security_option, false); SettingsShadowResources.overrideResource(R.bool.config_hide_swipe_security_option, false);
@@ -266,6 +271,7 @@ public class ChooseLockGenericControllerTest {
0 /* userId */, 0 /* userId */,
minPasswordComplexity, minPasswordComplexity,
mDevicePolicyManager, mDevicePolicyManager,
mManagedLockPasswordProvider); mManagedLockPasswordProvider,
mLockPatternUtils);
} }
} }

View File

@@ -33,6 +33,7 @@ import androidx.fragment.app.FragmentActivity;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener; import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -43,7 +44,7 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadows.androidx.fragment.FragmentController; import org.robolectric.shadows.androidx.fragment.FragmentController;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowAlertDialogCompat.class) @Config(shadows = {ShadowAlertDialogCompat.class, ShadowLockPatternUtils.class})
public class ChooseLockTypeDialogFragmentTest { public class ChooseLockTypeDialogFragmentTest {
private Context mContext; private Context mContext;

View File

@@ -34,6 +34,7 @@ import com.android.settings.password.ChooseLockPassword.IntentBuilder;
import com.android.settings.password.SetupChooseLockPassword.SetupChooseLockPasswordFragment; import com.android.settings.password.SetupChooseLockPassword.SetupChooseLockPasswordFragment;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; 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.testutils.shadow.ShadowUtils;
import com.android.settings.widget.ScrollToParentEditText; import com.android.settings.widget.ScrollToParentEditText;
@@ -57,7 +58,13 @@ import java.util.Collections;
import java.util.List; import java.util.List;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {SettingsShadowResources.class, ShadowUtils.class, ShadowAlertDialogCompat.class}) @Config(
shadows = {
SettingsShadowResources.class,
ShadowLockPatternUtils.class,
ShadowUtils.class,
ShadowAlertDialogCompat.class
})
public class SetupChooseLockPasswordTest { public class SetupChooseLockPasswordTest {
@Before @Before

View File

@@ -38,6 +38,7 @@ import com.android.settings.SetupRedactionInterstitial;
import com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment; import com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment;
import com.android.settings.password.ChooseLockPattern.IntentBuilder; import com.android.settings.password.ChooseLockPattern.IntentBuilder;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; 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.testutils.shadow.ShadowUtils;
import com.google.android.setupcompat.PartnerCustomizationLayout; import com.google.android.setupcompat.PartnerCustomizationLayout;
@@ -57,7 +58,7 @@ import org.robolectric.util.ReflectionHelpers.ClassParameter;
import java.util.Arrays; import java.util.Arrays;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowUtils.class, ShadowAlertDialogCompat.class}) @Config(shadows = {ShadowUtils.class, ShadowAlertDialogCompat.class, ShadowLockPatternUtils.class})
public class SetupChooseLockPatternTest { public class SetupChooseLockPatternTest {
private SetupChooseLockPattern mActivity; private SetupChooseLockPattern mActivity;

View File

@@ -31,6 +31,11 @@ public class ShadowLockPatternUtils {
private static boolean sDeviceEncryptionEnabled; private static boolean sDeviceEncryptionEnabled;
@Implementation
protected boolean hasSecureLockScreen() {
return true;
}
@Implementation @Implementation
protected boolean isSecure(int id) { protected boolean isSecure(int id) {
return true; return true;