2 * Copyright (C) 2014 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com.android.settings.security;
18 import android.app.admin.DevicePolicyManager;
19 import android.content.Context;
20 import android.content.Intent;
21 import android.os.Bundle;
22 import android.os.UserHandle;
23 import android.provider.SearchIndexableResource;
24 import android.provider.Settings;
25 import android.support.v14.preference.SwitchPreference;
26 import android.support.v7.preference.Preference;
27 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
28 import android.support.v7.preference.PreferenceScreen;
29 import android.view.LayoutInflater;
30 import android.view.View;
31 import android.view.ViewGroup;
32 import android.widget.Switch;
34 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
35 import com.android.internal.widget.LockPatternUtils;
36 import com.android.settings.R;
37 import com.android.settings.SettingsActivity;
38 import com.android.settings.SettingsPreferenceFragment;
39 import com.android.settings.password.ChooseLockGeneric;
40 import com.android.settings.search.BaseSearchIndexProvider;
41 import com.android.settings.search.Indexable;
42 import com.android.settings.widget.SwitchBar;
44 import java.util.Arrays;
45 import java.util.List;
48 * Screen pinning settings.
50 public class ScreenPinningSettings extends SettingsPreferenceFragment
51 implements SwitchBar.OnSwitchChangeListener, Indexable {
53 private static final CharSequence KEY_USE_SCREEN_LOCK = "use_screen_lock";
54 private static final int CHANGE_LOCK_METHOD_REQUEST = 43;
56 private SwitchBar mSwitchBar;
57 private SwitchPreference mUseScreenLock;
58 private LockPatternUtils mLockPatternUtils;
61 public int getMetricsCategory() {
62 return MetricsEvent.SCREEN_PINNING;
66 public void onActivityCreated(Bundle savedInstanceState) {
67 super.onActivityCreated(savedInstanceState);
69 final SettingsActivity activity = (SettingsActivity) getActivity();
70 activity.setTitle(R.string.screen_pinning_title);
71 mLockPatternUtils = new LockPatternUtils(activity);
74 mSwitchBar = activity.getSwitchBar();
75 mSwitchBar.addOnSwitchChangeListener(this);
77 mSwitchBar.setChecked(isLockToAppEnabled(getActivity()));
81 public int getHelpResource() {
82 return R.string.help_url_screen_pinning;
86 public void onViewCreated(View view, Bundle savedInstanceState) {
87 super.onViewCreated(view, savedInstanceState);
88 ViewGroup parent = (ViewGroup) view.findViewById(android.R.id.list_container);
89 View emptyView = LayoutInflater.from(getContext())
90 .inflate(R.layout.screen_pinning_instructions, parent, false);
91 parent.addView(emptyView);
92 setEmptyView(emptyView);
96 public void onDestroyView() {
97 super.onDestroyView();
99 mSwitchBar.removeOnSwitchChangeListener(this);
103 private static boolean isLockToAppEnabled(Context context) {
104 return Settings.System.getInt(context.getContentResolver(),
105 Settings.System.LOCK_TO_APP_ENABLED, 0) != 0;
108 private void setLockToAppEnabled(boolean isEnabled) {
109 Settings.System.putInt(getContentResolver(), Settings.System.LOCK_TO_APP_ENABLED,
112 // Set the value to match what we have defaulted to in the UI.
113 setScreenLockUsedSetting(isScreenLockUsed());
117 private boolean isScreenLockUsed() {
118 int def = getCurrentSecurityTitle() != R.string.screen_pinning_unlock_none ? 1 : 0;
119 return Settings.Secure.getInt(getContentResolver(),
120 Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, def) != 0;
123 private boolean setScreenLockUsed(boolean isEnabled) {
125 LockPatternUtils lockPatternUtils = new LockPatternUtils(getActivity());
126 int passwordQuality = lockPatternUtils
127 .getKeyguardStoredPasswordQuality(UserHandle.myUserId());
128 if (passwordQuality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
129 Intent chooseLockIntent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
130 chooseLockIntent.putExtra(
131 ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
132 DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
133 startActivityForResult(chooseLockIntent, CHANGE_LOCK_METHOD_REQUEST);
137 setScreenLockUsedSetting(isEnabled);
141 private void setScreenLockUsedSetting(boolean isEnabled) {
142 Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
147 public void onActivityResult(int requestCode, int resultCode, Intent data) {
148 super.onActivityResult(requestCode, resultCode, data);
149 if (requestCode == CHANGE_LOCK_METHOD_REQUEST) {
150 LockPatternUtils lockPatternUtils = new LockPatternUtils(getActivity());
151 boolean validPassQuality = lockPatternUtils.getKeyguardStoredPasswordQuality(
152 UserHandle.myUserId())
153 != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
154 setScreenLockUsed(validPassQuality);
155 // Make sure the screen updates.
156 mUseScreenLock.setChecked(validPassQuality);
160 private int getCurrentSecurityTitle() {
161 int quality = mLockPatternUtils.getKeyguardStoredPasswordQuality(
162 UserHandle.myUserId());
164 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
165 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
166 return R.string.screen_pinning_unlock_pin;
167 case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
168 case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
169 case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
170 case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
171 return R.string.screen_pinning_unlock_password;
172 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
173 if (mLockPatternUtils.isLockPatternEnabled(UserHandle.myUserId())) {
174 return R.string.screen_pinning_unlock_pattern;
177 return R.string.screen_pinning_unlock_none;
181 * Listens to the state change of the lock-to-app master switch.
184 public void onSwitchChanged(Switch switchView, boolean isChecked) {
185 setLockToAppEnabled(isChecked);
189 public void updateDisplay() {
190 PreferenceScreen root = getPreferenceScreen();
194 if (isLockToAppEnabled(getActivity())) {
195 addPreferencesFromResource(R.xml.screen_pinning_settings);
196 root = getPreferenceScreen();
198 mUseScreenLock = (SwitchPreference) root.findPreference(KEY_USE_SCREEN_LOCK);
199 mUseScreenLock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
201 public boolean onPreferenceChange(Preference preference, Object newValue) {
202 return setScreenLockUsed((boolean) newValue);
205 mUseScreenLock.setChecked(isScreenLockUsed());
206 mUseScreenLock.setTitle(getCurrentSecurityTitle());
213 public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
214 new BaseSearchIndexProvider() {
217 public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
219 final SearchIndexableResource sir = new SearchIndexableResource(context);
220 sir.xmlResId = R.xml.screen_pinning_settings;
221 return Arrays.asList(sir);