Work Profile Passphrase Setting

Create a new section in Security Settings which includes all
settings for the Work Challenge.
Only some settings apply to the Work Challenge, so we reuse
the security settings layouts for items and compare them against
a whitelist to remove unwanted items.

Additionally, remove all usages of ChooseLockGeneric.KEY_USER_ID
in favor of Intent.EXTRA_USER_ID.

Change-Id: I3d1ba953a2056f7c61a7b3feeb8b49f1a352dff6
This commit is contained in:
Clara Bayarri
2015-10-14 11:07:35 +01:00
parent 00683f9d62
commit 6934a044b8
11 changed files with 306 additions and 7 deletions

View File

@@ -0,0 +1,193 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.UserInfo;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceChangeListener;
import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.widget.LockPatternUtils;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Settings for the Profile Challenge.
*/
public class ProfileChallengePreferenceFragment extends SettingsPreferenceFragment
implements OnPreferenceChangeListener {
private static final String TAG = "WorkChallengePreferenceFragment";
private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";
private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
// Not all preferences make sense for the Work Challenge, this is a whitelist.
private static final Set<String> ALLOWED_PREFERENCE_KEYS = new HashSet<>();
{
ALLOWED_PREFERENCE_KEYS.add(KEY_UNLOCK_SET_OR_CHANGE);
ALLOWED_PREFERENCE_KEYS.add(KEY_VISIBLE_PATTERN);
}
// These switch preferences need special handling since they're not all stored in Settings.
private static final Set<String> SWITCH_PREFERENCE_KEYS = new HashSet<>();
{
SWITCH_PREFERENCE_KEYS.add(KEY_VISIBLE_PATTERN);
}
private LockPatternUtils mLockPatternUtils;
private int mProfileUserId;
private SwitchPreference mVisiblePattern;
@Override
protected int getMetricsCategory() {
return MetricsLogger.PROFILE_CHALLENGE;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLockPatternUtils = new LockPatternUtils(getActivity());
mProfileUserId = getArguments().getInt(Intent.EXTRA_USER_ID, -1);
if (mProfileUserId == -1) {
finish();
}
}
@Override
public boolean onPreferenceTreeClick(Preference preference) {
final String key = preference.getKey();
if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) {
Bundle extras = new Bundle();
extras.putInt(Intent.EXTRA_USER_ID, mProfileUserId);
startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
R.string.lock_settings_picker_title, SET_OR_CHANGE_LOCK_METHOD_REQUEST, extras);
return true;
}
return super.onPreferenceTreeClick(preference);
}
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
final String key = preference.getKey();
if (KEY_VISIBLE_PATTERN.equals(key)) {
mLockPatternUtils.setVisiblePatternEnabled((Boolean) value, mProfileUserId);
return true;
}
return false;
}
@Override
public void onResume() {
super.onResume();
// Make sure we reload the preference hierarchy since some of these settings
// depend on others...
createPreferenceHierarchy();
if (mVisiblePattern != null) {
mVisiblePattern.setChecked(mLockPatternUtils.isVisiblePatternEnabled(
mProfileUserId));
}
}
private void createPreferenceHierarchy() {
PreferenceScreen root = getPreferenceScreen();
if (root != null) {
root.removeAll();
}
addPreferencesFromResource(R.xml.profile_challenge_settings);
root = getPreferenceScreen();
// Add options for lock/unlock screen
final int resid = getResIdForLockUnlockScreen(getActivity(), mLockPatternUtils);
addPreferencesFromResource(resid);
mVisiblePattern = (SwitchPreference) root.findPreference(KEY_VISIBLE_PATTERN);
removeNonWhitelistedItems(root);
}
private void removeNonWhitelistedItems(PreferenceGroup prefScreen) {
int numPreferences = prefScreen.getPreferenceCount();
int i = 0;
while (i < numPreferences) {
final Preference pref = prefScreen.getPreference(i);
// Recursively look into categories and remove them if they are empty.
if (pref instanceof PreferenceCategory) {
PreferenceCategory category = (PreferenceCategory) pref;
removeNonWhitelistedItems(category);
if (category.getPreferenceCount() == 0) {
prefScreen.removePreference(category);
--i;
--numPreferences;
}
} else if (ALLOWED_PREFERENCE_KEYS.contains(pref.getKey())) {
if (SWITCH_PREFERENCE_KEYS.contains(pref.getKey())) {
pref.setOnPreferenceChangeListener(this);
}
} else {
prefScreen.removePreference(pref);
--i;
--numPreferences;
}
++i;
}
}
private int getResIdForLockUnlockScreen(Context context,
LockPatternUtils lockPatternUtils) {
int resid = 0;
if (!lockPatternUtils.isSecure(mProfileUserId)) {
resid = R.xml.security_settings_lockscreen;
} else {
switch (lockPatternUtils.getKeyguardStoredPasswordQuality(mProfileUserId)) {
case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
resid = R.xml.security_settings_pattern;
break;
case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
resid = R.xml.security_settings_pin;
break;
case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
resid = R.xml.security_settings_password;
break;
}
}
return resid;
}
}