blob: 68050b1dde16dea7278e61479041d1e048080155 [file] [log] [blame]
Jason Monk27d7ea52014-07-18 09:55:41 -04001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16package com.android.settings;
17
Jason Monk78121d92014-08-04 16:08:51 -040018import android.app.admin.DevicePolicyManager;
Jason Monk27d7ea52014-07-18 09:55:41 -040019import android.content.Context;
Jason Monk78121d92014-08-04 16:08:51 -040020import android.content.Intent;
Jason Monk27d7ea52014-07-18 09:55:41 -040021import android.content.res.Resources;
22import android.os.Bundle;
Adrian Roos54375882015-04-16 17:11:22 -070023import android.os.UserHandle;
Jason Monk27d7ea52014-07-18 09:55:41 -040024import android.provider.Settings;
Jason Monk39b46742015-09-10 15:52:51 -040025import android.support.v14.preference.SwitchPreference;
26import android.support.v7.preference.Preference;
27import android.support.v7.preference.Preference.OnPreferenceChangeListener;
28import android.support.v7.preference.PreferenceScreen;
Jason Monk27d7ea52014-07-18 09:55:41 -040029import android.view.LayoutInflater;
30import android.view.View;
Jason Monk0c2ccba2016-06-17 10:05:06 -040031import android.view.ViewGroup;
Jason Monk27d7ea52014-07-18 09:55:41 -040032import android.widget.Switch;
33
Tamas Berghammer265d3c22016-06-22 15:34:45 +010034import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Jason Monk78121d92014-08-04 16:08:51 -040035import com.android.internal.widget.LockPatternUtils;
Maurice Lam2eb170c2017-04-28 16:18:47 -070036import com.android.settings.password.ChooseLockGeneric;
Jason Monk27d7ea52014-07-18 09:55:41 -040037import com.android.settings.search.BaseSearchIndexProvider;
38import com.android.settings.search.Indexable;
39import com.android.settings.search.SearchIndexableRaw;
40import com.android.settings.widget.SwitchBar;
41
Jason Monk78121d92014-08-04 16:08:51 -040042import java.util.ArrayList;
43import java.util.List;
44
Jason Monk27d7ea52014-07-18 09:55:41 -040045/**
46 * Screen pinning settings.
47 */
48public class ScreenPinningSettings extends SettingsPreferenceFragment
49 implements SwitchBar.OnSwitchChangeListener, Indexable {
50
Jason Monk78121d92014-08-04 16:08:51 -040051 private static final CharSequence KEY_USE_SCREEN_LOCK = "use_screen_lock";
52 private static final int CHANGE_LOCK_METHOD_REQUEST = 43;
53
Jason Monk27d7ea52014-07-18 09:55:41 -040054 private SwitchBar mSwitchBar;
Jason Monk78121d92014-08-04 16:08:51 -040055 private SwitchPreference mUseScreenLock;
56 private LockPatternUtils mLockPatternUtils;
Jason Monk27d7ea52014-07-18 09:55:41 -040057
58 @Override
Fan Zhang65076132016-08-08 10:25:13 -070059 public int getMetricsCategory() {
Chris Wren9d1bfd12016-01-26 18:04:01 -050060 return MetricsEvent.SCREEN_PINNING;
Chris Wren8a963ba2015-03-20 10:29:14 -040061 }
62
63 @Override
Jason Monk27d7ea52014-07-18 09:55:41 -040064 public void onActivityCreated(Bundle savedInstanceState) {
65 super.onActivityCreated(savedInstanceState);
66
67 final SettingsActivity activity = (SettingsActivity) getActivity();
Doris Ling03a3b512017-10-18 14:25:01 -070068 if (usePreferenceScreenTitle()) {
69 activity.setTitle(R.string.screen_pinning_title);
70 }
Jason Monk78121d92014-08-04 16:08:51 -040071 mLockPatternUtils = new LockPatternUtils(activity);
72
Jason Monk27d7ea52014-07-18 09:55:41 -040073
74 mSwitchBar = activity.getSwitchBar();
75 mSwitchBar.addOnSwitchChangeListener(this);
76 mSwitchBar.show();
Jason Monk78121d92014-08-04 16:08:51 -040077 mSwitchBar.setChecked(isLockToAppEnabled(getActivity()));
Jason Monk27d7ea52014-07-18 09:55:41 -040078 }
79
80 @Override
Fan Zhang179645e2017-06-05 13:13:42 -070081 protected int getHelpResource() {
82 return R.string.help_url_screen_pinning;
83 }
84
85 @Override
Jason Monk0c2ccba2016-06-17 10:05:06 -040086 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);
93 }
94
95 @Override
Jason Monk27d7ea52014-07-18 09:55:41 -040096 public void onDestroyView() {
97 super.onDestroyView();
98
99 mSwitchBar.removeOnSwitchChangeListener(this);
100 mSwitchBar.hide();
101 }
102
Jason Monk78121d92014-08-04 16:08:51 -0400103 private static boolean isLockToAppEnabled(Context context) {
104 return Settings.System.getInt(context.getContentResolver(),
105 Settings.System.LOCK_TO_APP_ENABLED, 0) != 0;
Jason Monk27d7ea52014-07-18 09:55:41 -0400106 }
107
108 private void setLockToAppEnabled(boolean isEnabled) {
109 Settings.System.putInt(getContentResolver(), Settings.System.LOCK_TO_APP_ENABLED,
110 isEnabled ? 1 : 0);
Jason Monk39ab4ea2015-06-23 12:07:27 -0400111 if (isEnabled) {
112 // Set the value to match what we have defaulted to in the UI.
113 setScreenLockUsedSetting(isScreenLockUsed());
114 }
Jason Monk27d7ea52014-07-18 09:55:41 -0400115 }
116
Jason Monk78121d92014-08-04 16:08:51 -0400117 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;
121 }
122
123 private boolean setScreenLockUsed(boolean isEnabled) {
124 if (isEnabled) {
125 LockPatternUtils lockPatternUtils = new LockPatternUtils(getActivity());
Adrian Roos54375882015-04-16 17:11:22 -0700126 int passwordQuality = lockPatternUtils
127 .getKeyguardStoredPasswordQuality(UserHandle.myUserId());
128 if (passwordQuality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
Jason Monk78121d92014-08-04 16:08:51 -0400129 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);
134 return false;
135 }
136 }
Jason Monk39ab4ea2015-06-23 12:07:27 -0400137 setScreenLockUsedSetting(isEnabled);
138 return true;
139 }
140
141 private void setScreenLockUsedSetting(boolean isEnabled) {
Jason Monk78121d92014-08-04 16:08:51 -0400142 Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
143 isEnabled ? 1 : 0);
Jason Monk78121d92014-08-04 16:08:51 -0400144 }
145
146 @Override
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());
Adrian Roos54375882015-04-16 17:11:22 -0700151 boolean validPassQuality = lockPatternUtils.getKeyguardStoredPasswordQuality(
152 UserHandle.myUserId())
Jason Monk78121d92014-08-04 16:08:51 -0400153 != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
154 setScreenLockUsed(validPassQuality);
155 // Make sure the screen updates.
156 mUseScreenLock.setChecked(validPassQuality);
157 }
158 }
159
160 private int getCurrentSecurityTitle() {
Adrian Roos54375882015-04-16 17:11:22 -0700161 int quality = mLockPatternUtils.getKeyguardStoredPasswordQuality(
162 UserHandle.myUserId());
Jason Monk78121d92014-08-04 16:08:51 -0400163 switch (quality) {
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:
Toni Barzice7d6e4d2016-03-30 11:43:19 -0700170 case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
Jason Monk78121d92014-08-04 16:08:51 -0400171 return R.string.screen_pinning_unlock_password;
172 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
Adrian Roos54375882015-04-16 17:11:22 -0700173 if (mLockPatternUtils.isLockPatternEnabled(UserHandle.myUserId())) {
Jason Monk78121d92014-08-04 16:08:51 -0400174 return R.string.screen_pinning_unlock_pattern;
175 }
176 }
177 return R.string.screen_pinning_unlock_none;
178 }
179
Jason Monk27d7ea52014-07-18 09:55:41 -0400180 /**
181 * Listens to the state change of the lock-to-app master switch.
182 */
183 @Override
184 public void onSwitchChanged(Switch switchView, boolean isChecked) {
185 setLockToAppEnabled(isChecked);
Jason Monk78121d92014-08-04 16:08:51 -0400186 updateDisplay();
187 }
188
189 public void updateDisplay() {
190 PreferenceScreen root = getPreferenceScreen();
191 if (root != null) {
192 root.removeAll();
193 }
194 if (isLockToAppEnabled(getActivity())) {
195 addPreferencesFromResource(R.xml.screen_pinning_settings);
196 root = getPreferenceScreen();
197
198 mUseScreenLock = (SwitchPreference) root.findPreference(KEY_USE_SCREEN_LOCK);
199 mUseScreenLock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
200 @Override
201 public boolean onPreferenceChange(Preference preference, Object newValue) {
202 return setScreenLockUsed((boolean) newValue);
203 }
204 });
205 mUseScreenLock.setChecked(isScreenLockUsed());
206 mUseScreenLock.setTitle(getCurrentSecurityTitle());
207 }
Jason Monk27d7ea52014-07-18 09:55:41 -0400208 }
209
210 /**
211 * For search
212 */
213 public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
214 new BaseSearchIndexProvider() {
215 @Override
216 public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
217 final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>();
218
219 final Resources res = context.getResources();
220
221 // Add fragment title
222 SearchIndexableRaw data = new SearchIndexableRaw(context);
223 data.title = res.getString(R.string.screen_pinning_title);
224 data.screenTitle = res.getString(R.string.screen_pinning_title);
225 result.add(data);
226
Jason Monk78121d92014-08-04 16:08:51 -0400227 if (isLockToAppEnabled(context)) {
228 // Screen lock option
229 data = new SearchIndexableRaw(context);
230 data.title = res.getString(R.string.screen_pinning_unlock_none);
231 data.screenTitle = res.getString(R.string.screen_pinning_title);
232 result.add(data);
233 } else {
234 // Screen pinning description.
235 data = new SearchIndexableRaw(context);
236 data.title = res.getString(R.string.screen_pinning_description);
237 data.screenTitle = res.getString(R.string.screen_pinning_title);
238 result.add(data);
239 }
Jason Monk27d7ea52014-07-18 09:55:41 -0400240
241 return result;
242 }
243 };
244}