• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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  */
16 package com.android.settings.security;
17 
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;
33 
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;
43 
44 import java.util.Arrays;
45 import java.util.List;
46 
47 /**
48  * Screen pinning settings.
49  */
50 public class ScreenPinningSettings extends SettingsPreferenceFragment
51         implements SwitchBar.OnSwitchChangeListener, Indexable {
52 
53     private static final CharSequence KEY_USE_SCREEN_LOCK = "use_screen_lock";
54     private static final int CHANGE_LOCK_METHOD_REQUEST = 43;
55 
56     private SwitchBar mSwitchBar;
57     private SwitchPreference mUseScreenLock;
58     private LockPatternUtils mLockPatternUtils;
59 
60     @Override
getMetricsCategory()61     public int getMetricsCategory() {
62         return MetricsEvent.SCREEN_PINNING;
63     }
64 
65     @Override
onActivityCreated(Bundle savedInstanceState)66     public void onActivityCreated(Bundle savedInstanceState) {
67         super.onActivityCreated(savedInstanceState);
68 
69         final SettingsActivity activity = (SettingsActivity) getActivity();
70         activity.setTitle(R.string.screen_pinning_title);
71         mLockPatternUtils = new LockPatternUtils(activity);
72 
73 
74         mSwitchBar = activity.getSwitchBar();
75         mSwitchBar.addOnSwitchChangeListener(this);
76         mSwitchBar.show();
77         mSwitchBar.setChecked(isLockToAppEnabled(getActivity()));
78     }
79 
80     @Override
getHelpResource()81     public int getHelpResource() {
82         return R.string.help_url_screen_pinning;
83     }
84 
85     @Override
onViewCreated(View view, Bundle savedInstanceState)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);
93     }
94 
95     @Override
onDestroyView()96     public void onDestroyView() {
97         super.onDestroyView();
98 
99         mSwitchBar.removeOnSwitchChangeListener(this);
100         mSwitchBar.hide();
101     }
102 
isLockToAppEnabled(Context context)103     private static boolean isLockToAppEnabled(Context context) {
104         return Settings.System.getInt(context.getContentResolver(),
105                 Settings.System.LOCK_TO_APP_ENABLED, 0) != 0;
106     }
107 
setLockToAppEnabled(boolean isEnabled)108     private void setLockToAppEnabled(boolean isEnabled) {
109         Settings.System.putInt(getContentResolver(), Settings.System.LOCK_TO_APP_ENABLED,
110                 isEnabled ? 1 : 0);
111         if (isEnabled) {
112             // Set the value to match what we have defaulted to in the UI.
113             setScreenLockUsedSetting(isScreenLockUsed());
114         }
115     }
116 
isScreenLockUsed()117     private boolean isScreenLockUsed() {
118         // This functionality should be kept consistent with
119         // com.android.server.wm.LockTaskController (see b/127605586)
120         int defaultValueIfSettingNull = mLockPatternUtils.isSecure(UserHandle.myUserId()) ? 1 : 0;
121         return Settings.Secure.getInt(
122                 getContentResolver(),
123                 Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
124                 defaultValueIfSettingNull) != 0;
125     }
126 
setScreenLockUsed(boolean isEnabled)127     private boolean setScreenLockUsed(boolean isEnabled) {
128         if (isEnabled) {
129             LockPatternUtils lockPatternUtils = new LockPatternUtils(getActivity());
130             int passwordQuality = lockPatternUtils
131                     .getKeyguardStoredPasswordQuality(UserHandle.myUserId());
132             if (passwordQuality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
133                 Intent chooseLockIntent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
134                 chooseLockIntent.putExtra(
135                         ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
136                         DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
137                 startActivityForResult(chooseLockIntent, CHANGE_LOCK_METHOD_REQUEST);
138                 return false;
139             }
140         }
141         setScreenLockUsedSetting(isEnabled);
142         return true;
143     }
144 
setScreenLockUsedSetting(boolean isEnabled)145     private void setScreenLockUsedSetting(boolean isEnabled) {
146         Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
147                 isEnabled ? 1 : 0);
148     }
149 
150     @Override
onActivityResult(int requestCode, int resultCode, Intent data)151     public void onActivityResult(int requestCode, int resultCode, Intent data) {
152         super.onActivityResult(requestCode, resultCode, data);
153         if (requestCode == CHANGE_LOCK_METHOD_REQUEST) {
154             LockPatternUtils lockPatternUtils = new LockPatternUtils(getActivity());
155             boolean validPassQuality = lockPatternUtils.getKeyguardStoredPasswordQuality(
156                     UserHandle.myUserId())
157                     != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
158             setScreenLockUsed(validPassQuality);
159             // Make sure the screen updates.
160             mUseScreenLock.setChecked(validPassQuality);
161         }
162     }
163 
getCurrentSecurityTitle()164     private int getCurrentSecurityTitle() {
165         int quality = mLockPatternUtils.getKeyguardStoredPasswordQuality(
166                 UserHandle.myUserId());
167         switch (quality) {
168             case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
169             case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
170                 return R.string.screen_pinning_unlock_pin;
171             case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
172             case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
173             case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
174             case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
175                 return R.string.screen_pinning_unlock_password;
176             case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
177                 if (mLockPatternUtils.isLockPatternEnabled(UserHandle.myUserId())) {
178                     return R.string.screen_pinning_unlock_pattern;
179                 }
180         }
181         return R.string.screen_pinning_unlock_none;
182     }
183 
184     /**
185      * Listens to the state change of the lock-to-app master switch.
186      */
187     @Override
onSwitchChanged(Switch switchView, boolean isChecked)188     public void onSwitchChanged(Switch switchView, boolean isChecked) {
189         setLockToAppEnabled(isChecked);
190         updateDisplay();
191     }
192 
updateDisplay()193     public void updateDisplay() {
194         PreferenceScreen root = getPreferenceScreen();
195         if (root != null) {
196             root.removeAll();
197         }
198         if (isLockToAppEnabled(getActivity())) {
199             addPreferencesFromResource(R.xml.screen_pinning_settings);
200             root = getPreferenceScreen();
201 
202             mUseScreenLock = (SwitchPreference) root.findPreference(KEY_USE_SCREEN_LOCK);
203             mUseScreenLock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
204                 @Override
205                 public boolean onPreferenceChange(Preference preference, Object newValue) {
206                     return setScreenLockUsed((boolean) newValue);
207                 }
208             });
209             mUseScreenLock.setChecked(isScreenLockUsed());
210             mUseScreenLock.setTitle(getCurrentSecurityTitle());
211         }
212     }
213 
214     /**
215      * For search
216      */
217     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
218         new BaseSearchIndexProvider() {
219 
220             @Override
221             public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
222                     boolean enabled) {
223                 final SearchIndexableResource sir = new SearchIndexableResource(context);
224                 sir.xmlResId = R.xml.screen_pinning_settings;
225                 return Arrays.asList(sir);
226             }
227         };
228 }
229