Merge "Respect DISALLOW_UNIFIED_PASSWORD in Settings."
This commit is contained in:
@@ -18,7 +18,7 @@
|
|||||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||||
android:title="@string/security_settings_title">
|
android:title="@string/security_settings_title">
|
||||||
|
|
||||||
<SwitchPreference
|
<com.android.settingslib.RestrictedSwitchPreference
|
||||||
android:key="unification"
|
android:key="unification"
|
||||||
android:title="@string/lock_settings_profile_unification_title"
|
android:title="@string/lock_settings_profile_unification_title"
|
||||||
android:summary="@string/lock_settings_profile_unification_summary"
|
android:summary="@string/lock_settings_profile_unification_summary"
|
||||||
|
@@ -73,6 +73,7 @@ import com.android.settings.security.trustagent.TrustAgentManager.TrustAgentComp
|
|||||||
import com.android.settings.widget.GearPreference;
|
import com.android.settings.widget.GearPreference;
|
||||||
import com.android.settingslib.RestrictedLockUtils;
|
import com.android.settingslib.RestrictedLockUtils;
|
||||||
import com.android.settingslib.RestrictedPreference;
|
import com.android.settingslib.RestrictedPreference;
|
||||||
|
import com.android.settingslib.RestrictedSwitchPreference;
|
||||||
import com.android.settingslib.drawer.CategoryKey;
|
import com.android.settingslib.drawer.CategoryKey;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -144,7 +145,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
|
|||||||
private ManagedLockPasswordProvider mManagedPasswordProvider;
|
private ManagedLockPasswordProvider mManagedPasswordProvider;
|
||||||
|
|
||||||
private SwitchPreference mVisiblePatternProfile;
|
private SwitchPreference mVisiblePatternProfile;
|
||||||
private SwitchPreference mUnifyProfile;
|
private RestrictedSwitchPreference mUnifyProfile;
|
||||||
|
|
||||||
private SwitchPreference mShowPassword;
|
private SwitchPreference mShowPassword;
|
||||||
|
|
||||||
@@ -319,7 +320,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
mVisiblePatternProfile =
|
mVisiblePatternProfile =
|
||||||
(SwitchPreference) root.findPreference(KEY_VISIBLE_PATTERN_PROFILE);
|
(SwitchPreference) root.findPreference(KEY_VISIBLE_PATTERN_PROFILE);
|
||||||
mUnifyProfile = (SwitchPreference) root.findPreference(KEY_UNIFICATION);
|
mUnifyProfile = (RestrictedSwitchPreference) root.findPreference(KEY_UNIFICATION);
|
||||||
|
|
||||||
// Append the rest of the settings
|
// Append the rest of the settings
|
||||||
addPreferencesFromResource(R.xml.security_settings_misc);
|
addPreferencesFromResource(R.xml.security_settings_misc);
|
||||||
@@ -560,10 +561,17 @@ public class SecuritySettings extends SettingsPreferenceFragment
|
|||||||
mLocationcontroller.updateSummary();
|
mLocationcontroller.updateSummary();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateUnificationPreference() {
|
@VisibleForTesting
|
||||||
|
void updateUnificationPreference() {
|
||||||
if (mUnifyProfile != null) {
|
if (mUnifyProfile != null) {
|
||||||
mUnifyProfile.setChecked(!mLockPatternUtils.isSeparateProfileChallengeEnabled(
|
final boolean separate =
|
||||||
mProfileChallengeUserId));
|
mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId);
|
||||||
|
mUnifyProfile.setChecked(!separate);
|
||||||
|
if (separate) {
|
||||||
|
mUnifyProfile.setDisabledByAdmin(RestrictedLockUtils.checkIfRestrictionEnforced(
|
||||||
|
getContext(), UserManager.DISALLOW_UNIFIED_PASSWORD,
|
||||||
|
mProfileChallengeUserId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -930,14 +938,11 @@ public class SecuritySettings extends SettingsPreferenceFragment
|
|||||||
.setPositiveButton(
|
.setPositiveButton(
|
||||||
compliant ? R.string.lock_settings_profile_unification_dialog_confirm
|
compliant ? R.string.lock_settings_profile_unification_dialog_confirm
|
||||||
: R.string.lock_settings_profile_unification_dialog_uncompliant_confirm,
|
: R.string.lock_settings_profile_unification_dialog_uncompliant_confirm,
|
||||||
new DialogInterface.OnClickListener() {
|
(dialog, whichButton) -> {
|
||||||
@Override
|
if (compliant) {
|
||||||
public void onClick(DialogInterface dialog, int whichButton) {
|
parentFragment.launchConfirmDeviceLockForUnification();
|
||||||
if (compliant) {
|
} else {
|
||||||
parentFragment.launchConfirmDeviceLockForUnification();
|
parentFragment.unifyUncompliantLocks();
|
||||||
} else {
|
|
||||||
parentFragment.unifyUncompliantLocks();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@@ -17,9 +17,11 @@
|
|||||||
package com.android.settings.security;
|
package com.android.settings.security;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.Matchers.anyInt;
|
import static org.mockito.Matchers.anyInt;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.reset;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||||
@@ -29,7 +31,9 @@ import android.app.Activity;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.hardware.fingerprint.FingerprintManager;
|
import android.hardware.fingerprint.FingerprintManager;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
|
import android.os.UserManager.EnforcingUser;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.support.v7.preference.PreferenceGroup;
|
import android.support.v7.preference.PreferenceGroup;
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
@@ -43,6 +47,9 @@ import com.android.settings.testutils.FakeFeatureFactory;
|
|||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
import com.android.settings.testutils.XmlTestUtils;
|
import com.android.settings.testutils.XmlTestUtils;
|
||||||
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
|
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
|
||||||
|
import com.android.settings.testutils.shadow.ShadowUserManager;
|
||||||
|
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
||||||
|
import com.android.settingslib.RestrictedSwitchPreference;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -55,12 +62,15 @@ import org.robolectric.annotation.Config;
|
|||||||
import org.robolectric.shadows.ShadowApplication;
|
import org.robolectric.shadows.ShadowApplication;
|
||||||
import org.robolectric.util.ReflectionHelpers;
|
import org.robolectric.util.ReflectionHelpers;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
|
||||||
shadows = {
|
shadows = {
|
||||||
ShadowLockPatternUtils.class
|
ShadowLockPatternUtils.class,
|
||||||
|
ShadowUserManager.class,
|
||||||
})
|
})
|
||||||
public class SecuritySettingsTest {
|
public class SecuritySettingsTest {
|
||||||
|
|
||||||
@@ -187,4 +197,49 @@ public class SecuritySettingsTest {
|
|||||||
|
|
||||||
assertThat(keys).containsAllIn(niks);
|
assertThat(keys).containsAllIn(niks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnifyLockRestriction() {
|
||||||
|
// Set up instance under test.
|
||||||
|
final Context context = spy(RuntimeEnvironment.application);
|
||||||
|
final SecuritySettings securitySettings = spy(new SecuritySettings());
|
||||||
|
when(securitySettings.getContext()).thenReturn(context);
|
||||||
|
|
||||||
|
final int userId = 123;
|
||||||
|
ReflectionHelpers.setField(securitySettings, "mProfileChallengeUserId", userId);
|
||||||
|
|
||||||
|
final LockPatternUtils utils = mock(LockPatternUtils.class);
|
||||||
|
when(utils.isSeparateProfileChallengeEnabled(userId)).thenReturn(true);
|
||||||
|
ReflectionHelpers.setField(securitySettings, "mLockPatternUtils", utils);
|
||||||
|
|
||||||
|
final RestrictedSwitchPreference unifyProfile = mock(RestrictedSwitchPreference.class);
|
||||||
|
ReflectionHelpers.setField(securitySettings, "mUnifyProfile", unifyProfile);
|
||||||
|
|
||||||
|
// Pretend that no admins enforce the restriction.
|
||||||
|
ShadowUserManager.getShadow().setUserRestrictionSources(
|
||||||
|
UserManager.DISALLOW_UNIFIED_PASSWORD,
|
||||||
|
UserHandle.of(userId),
|
||||||
|
Collections.emptyList());
|
||||||
|
|
||||||
|
securitySettings.updateUnificationPreference();
|
||||||
|
|
||||||
|
verify(unifyProfile).setDisabledByAdmin(null);
|
||||||
|
|
||||||
|
reset(unifyProfile);
|
||||||
|
|
||||||
|
// Pretend that the restriction is enforced by several admins. Having just one would
|
||||||
|
// require more mocking of implementation details.
|
||||||
|
final EnforcingUser enforcer1 = new EnforcingUser(
|
||||||
|
userId, UserManager.RESTRICTION_SOURCE_PROFILE_OWNER);
|
||||||
|
final EnforcingUser enforcer2 = new EnforcingUser(
|
||||||
|
UserHandle.USER_SYSTEM, UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
|
||||||
|
ShadowUserManager.getShadow().setUserRestrictionSources(
|
||||||
|
UserManager.DISALLOW_UNIFIED_PASSWORD,
|
||||||
|
UserHandle.of(userId),
|
||||||
|
Arrays.asList(enforcer1, enforcer2));
|
||||||
|
|
||||||
|
securitySettings.updateUnificationPreference();
|
||||||
|
|
||||||
|
verify(unifyProfile).setDisabledByAdmin(EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,7 @@ import android.content.Context;
|
|||||||
import android.content.pm.UserInfo;
|
import android.content.pm.UserInfo;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
|
import android.os.UserManager.EnforcingUser;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
@@ -31,14 +32,18 @@ import org.robolectric.shadow.api.Shadow;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Implements(UserManager.class)
|
@Implements(UserManager.class)
|
||||||
public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {
|
public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {
|
||||||
|
|
||||||
private SparseArray<UserInfo> mUserInfos = new SparseArray<>();
|
private SparseArray<UserInfo> mUserInfos = new SparseArray<>();
|
||||||
private boolean mAdminUser;
|
private boolean mAdminUser;
|
||||||
private List<String> mRestrictions = new ArrayList<>();
|
private final List<String> mRestrictions = new ArrayList<>();
|
||||||
|
private final Map<String, List<EnforcingUser>> mRestrictionSources = new HashMap<>();
|
||||||
|
|
||||||
|
|
||||||
public void setIsAdminUser(boolean isAdminUser) {
|
public void setIsAdminUser(boolean isAdminUser) {
|
||||||
mAdminUser = isAdminUser;
|
mAdminUser = isAdminUser;
|
||||||
@@ -91,4 +96,15 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
|
|||||||
return (ShadowUserManager) Shadow.extract(
|
return (ShadowUserManager) Shadow.extract(
|
||||||
RuntimeEnvironment.application.getSystemService(UserManager.class));
|
RuntimeEnvironment.application.getSystemService(UserManager.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Implementation
|
||||||
|
public List<EnforcingUser> getUserRestrictionSources(
|
||||||
|
String restrictionKey, UserHandle userHandle) {
|
||||||
|
return mRestrictionSources.get(restrictionKey + userHandle.getIdentifier());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserRestrictionSources(
|
||||||
|
String restrictionKey, UserHandle userHandle, List<EnforcingUser> enforcers) {
|
||||||
|
mRestrictionSources.put(restrictionKey + userHandle.getIdentifier(), enforcers);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user