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; 17 18 import android.app.admin.DevicePolicyManager; 19 import android.content.Context; 20 import android.content.Intent; 21 import android.content.res.Resources; 22 import android.os.Bundle; 23 import android.preference.Preference; 24 import android.preference.Preference.OnPreferenceChangeListener; 25 import android.preference.PreferenceScreen; 26 import android.preference.SwitchPreference; 27 import android.provider.Settings; 28 import android.view.LayoutInflater; 29 import android.view.View; 30 import android.view.ViewGroup; 31 import android.widget.Switch; 32 33 import com.android.internal.widget.LockPatternUtils; 34 import com.android.settings.search.BaseSearchIndexProvider; 35 import com.android.settings.search.Indexable; 36 import com.android.settings.search.SearchIndexableRaw; 37 import com.android.settings.widget.SwitchBar; 38 39 import java.util.ArrayList; 40 import java.util.List; 41 42 /** 43 * Screen pinning settings. 44 */ 45 public class ScreenPinningSettings extends SettingsPreferenceFragment 46 implements SwitchBar.OnSwitchChangeListener, Indexable { 47 48 private static final CharSequence KEY_USE_SCREEN_LOCK = "use_screen_lock"; 49 private static final int CHANGE_LOCK_METHOD_REQUEST = 43; 50 51 private SwitchBar mSwitchBar; 52 private SwitchPreference mUseScreenLock; 53 private LockPatternUtils mLockPatternUtils; 54 55 @Override 56 public void onActivityCreated(Bundle savedInstanceState) { 57 super.onActivityCreated(savedInstanceState); 58 59 final SettingsActivity activity = (SettingsActivity) getActivity(); 60 mLockPatternUtils = new LockPatternUtils(activity); 61 62 View emptyView = LayoutInflater.from(activity) 63 .inflate(R.layout.screen_pinning_instructions, null); 64 ((ViewGroup) getListView().getParent()).addView(emptyView); 65 getListView().setEmptyView(emptyView); 66 67 mSwitchBar = activity.getSwitchBar(); 68 mSwitchBar.addOnSwitchChangeListener(this); 69 mSwitchBar.show(); 70 mSwitchBar.setChecked(isLockToAppEnabled(getActivity())); 71 } 72 73 @Override 74 public void onDestroyView() { 75 super.onDestroyView(); 76 77 mSwitchBar.removeOnSwitchChangeListener(this); 78 mSwitchBar.hide(); 79 } 80 81 private static boolean isLockToAppEnabled(Context context) { 82 return Settings.System.getInt(context.getContentResolver(), 83 Settings.System.LOCK_TO_APP_ENABLED, 0) != 0; 84 } 85 86 private void setLockToAppEnabled(boolean isEnabled) { 87 Settings.System.putInt(getContentResolver(), Settings.System.LOCK_TO_APP_ENABLED, 88 isEnabled ? 1 : 0); 89 } 90 91 private boolean isScreenLockUsed() { 92 int def = getCurrentSecurityTitle() != R.string.screen_pinning_unlock_none ? 1 : 0; 93 return Settings.Secure.getInt(getContentResolver(), 94 Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, def) != 0; 95 } 96 97 private boolean setScreenLockUsed(boolean isEnabled) { 98 if (isEnabled) { 99 LockPatternUtils lockPatternUtils = new LockPatternUtils(getActivity()); 100 if (lockPatternUtils.getKeyguardStoredPasswordQuality() 101 == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { 102 Intent chooseLockIntent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); 103 chooseLockIntent.putExtra( 104 ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY, 105 DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); 106 startActivityForResult(chooseLockIntent, CHANGE_LOCK_METHOD_REQUEST); 107 return false; 108 } 109 } 110 Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, 111 isEnabled ? 1 : 0); 112 return true; 113 } 114 115 @Override 116 public void onActivityResult(int requestCode, int resultCode, Intent data) { 117 super.onActivityResult(requestCode, resultCode, data); 118 if (requestCode == CHANGE_LOCK_METHOD_REQUEST) { 119 LockPatternUtils lockPatternUtils = new LockPatternUtils(getActivity()); 120 boolean validPassQuality = lockPatternUtils.getKeyguardStoredPasswordQuality() 121 != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 122 setScreenLockUsed(validPassQuality); 123 // Make sure the screen updates. 124 mUseScreenLock.setChecked(validPassQuality); 125 } 126 } 127 128 private int getCurrentSecurityTitle() { 129 int quality = mLockPatternUtils.getKeyguardStoredPasswordQuality(); 130 switch (quality) { 131 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: 132 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX: 133 return R.string.screen_pinning_unlock_pin; 134 case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: 135 case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: 136 case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: 137 return R.string.screen_pinning_unlock_password; 138 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: 139 if (mLockPatternUtils.isLockPatternEnabled()) { 140 return R.string.screen_pinning_unlock_pattern; 141 } 142 } 143 return R.string.screen_pinning_unlock_none; 144 } 145 146 /** 147 * Listens to the state change of the lock-to-app master switch. 148 */ 149 @Override 150 public void onSwitchChanged(Switch switchView, boolean isChecked) { 151 setLockToAppEnabled(isChecked); 152 updateDisplay(); 153 } 154 155 public void updateDisplay() { 156 PreferenceScreen root = getPreferenceScreen(); 157 if (root != null) { 158 root.removeAll(); 159 } 160 if (isLockToAppEnabled(getActivity())) { 161 addPreferencesFromResource(R.xml.screen_pinning_settings); 162 root = getPreferenceScreen(); 163 164 mUseScreenLock = (SwitchPreference) root.findPreference(KEY_USE_SCREEN_LOCK); 165 mUseScreenLock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 166 @Override 167 public boolean onPreferenceChange(Preference preference, Object newValue) { 168 return setScreenLockUsed((boolean) newValue); 169 } 170 }); 171 mUseScreenLock.setChecked(isScreenLockUsed()); 172 mUseScreenLock.setTitle(getCurrentSecurityTitle()); 173 } 174 } 175 176 /** 177 * For search 178 */ 179 public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 180 new BaseSearchIndexProvider() { 181 @Override 182 public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { 183 final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>(); 184 185 final Resources res = context.getResources(); 186 187 // Add fragment title 188 SearchIndexableRaw data = new SearchIndexableRaw(context); 189 data.title = res.getString(R.string.screen_pinning_title); 190 data.screenTitle = res.getString(R.string.screen_pinning_title); 191 result.add(data); 192 193 if (isLockToAppEnabled(context)) { 194 // Screen lock option 195 data = new SearchIndexableRaw(context); 196 data.title = res.getString(R.string.screen_pinning_unlock_none); 197 data.screenTitle = res.getString(R.string.screen_pinning_title); 198 result.add(data); 199 } else { 200 // Screen pinning description. 201 data = new SearchIndexableRaw(context); 202 data.title = res.getString(R.string.screen_pinning_description); 203 data.screenTitle = res.getString(R.string.screen_pinning_title); 204 result.add(data); 205 } 206 207 return result; 208 } 209 }; 210 } 211