diff --git a/res/values/strings.xml b/res/values/strings.xml
index f8721c395f2..309172728b1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5903,6 +5903,14 @@
Screen pinning
When turned on, you can use screen pinning to keep the current screen in view until you unpin.\n\nTo use screen pinning:\n\n1. Make sure screen pinning is turned on.\n\n2. Open the screen you want to pin.\n\n3. Touch Overview.\n\n4. Touch the pin icon.
+
+ Ask for unlock pattern before unpinning
+
+ Ask for PIN before unpinning
+
+ Ask for password before unpinning
+
+ Lock device when unpinning
Work profile
diff --git a/res/xml/screen_pinning_settings.xml b/res/xml/screen_pinning_settings.xml
new file mode 100644
index 00000000000..67276873e47
--- /dev/null
+++ b/res/xml/screen_pinning_settings.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/src/com/android/settings/ScreenPinningSettings.java b/src/com/android/settings/ScreenPinningSettings.java
index ada5b178424..3f39088906c 100644
--- a/src/com/android/settings/ScreenPinningSettings.java
+++ b/src/com/android/settings/ScreenPinningSettings.java
@@ -15,42 +15,59 @@
*/
package com.android.settings;
-import java.util.ArrayList;
-import java.util.List;
-
+import android.app.admin.DevicePolicyManager;
import android.content.Context;
+import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.PreferenceScreen;
+import android.preference.SwitchPreference;
import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Switch;
+import com.android.internal.widget.LockPatternUtils;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.widget.SwitchBar;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Screen pinning settings.
*/
public class ScreenPinningSettings extends SettingsPreferenceFragment
implements SwitchBar.OnSwitchChangeListener, Indexable {
+ private static final CharSequence KEY_USE_SCREEN_LOCK = "use_screen_lock";
+ private static final int CHANGE_LOCK_METHOD_REQUEST = 43;
+
private SwitchBar mSwitchBar;
+ private SwitchPreference mUseScreenLock;
+ private LockPatternUtils mLockPatternUtils;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final SettingsActivity activity = (SettingsActivity) getActivity();
+ mLockPatternUtils = new LockPatternUtils(activity);
+
+ View emptyView = LayoutInflater.from(activity)
+ .inflate(R.layout.screen_pinning_instructions, null);
+ ((ViewGroup) getListView().getParent()).addView(emptyView);
+ getListView().setEmptyView(emptyView);
mSwitchBar = activity.getSwitchBar();
mSwitchBar.addOnSwitchChangeListener(this);
mSwitchBar.show();
- mSwitchBar.setChecked(isLockToAppEnabled());
+ mSwitchBar.setChecked(isLockToAppEnabled(getActivity()));
}
@Override
@@ -61,19 +78,9 @@ public class ScreenPinningSettings extends SettingsPreferenceFragment
mSwitchBar.hide();
}
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- return inflater.inflate(R.layout.screen_pinning_instructions, null);
- }
-
- private boolean isLockToAppEnabled() {
- try {
- return Settings.System.getInt(getContentResolver(), Settings.System.LOCK_TO_APP_ENABLED)
- != 0;
- } catch (SettingNotFoundException e) {
- return false;
- }
+ private static boolean isLockToAppEnabled(Context context) {
+ return Settings.System.getInt(context.getContentResolver(),
+ Settings.System.LOCK_TO_APP_ENABLED, 0) != 0;
}
private void setLockToAppEnabled(boolean isEnabled) {
@@ -81,12 +88,89 @@ public class ScreenPinningSettings extends SettingsPreferenceFragment
isEnabled ? 1 : 0);
}
+ private boolean isScreenLockUsed() {
+ int def = getCurrentSecurityTitle() != R.string.screen_pinning_unlock_none ? 1 : 0;
+ return Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.LOCK_TO_APP_EXIT_LOCKED, def) != 0;
+ }
+
+ private boolean setScreenLockUsed(boolean isEnabled) {
+ if (isEnabled) {
+ LockPatternUtils lockPatternUtils = new LockPatternUtils(getActivity());
+ if (lockPatternUtils.getKeyguardStoredPasswordQuality()
+ == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
+ Intent chooseLockIntent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
+ chooseLockIntent.putExtra(
+ ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
+ DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+ startActivityForResult(chooseLockIntent, CHANGE_LOCK_METHOD_REQUEST);
+ return false;
+ }
+ }
+ Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
+ isEnabled ? 1 : 0);
+ return true;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == CHANGE_LOCK_METHOD_REQUEST) {
+ LockPatternUtils lockPatternUtils = new LockPatternUtils(getActivity());
+ boolean validPassQuality = lockPatternUtils.getKeyguardStoredPasswordQuality()
+ != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+ setScreenLockUsed(validPassQuality);
+ // Make sure the screen updates.
+ mUseScreenLock.setChecked(validPassQuality);
+ }
+ }
+
+ private int getCurrentSecurityTitle() {
+ int quality = mLockPatternUtils.getKeyguardStoredPasswordQuality();
+ switch (quality) {
+ case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
+ case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
+ return R.string.screen_pinning_unlock_pin;
+ case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
+ case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
+ case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
+ return R.string.screen_pinning_unlock_password;
+ case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
+ if (mLockPatternUtils.isLockPatternEnabled()) {
+ return R.string.screen_pinning_unlock_pattern;
+ }
+ }
+ return R.string.screen_pinning_unlock_none;
+ }
+
/**
* Listens to the state change of the lock-to-app master switch.
*/
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
setLockToAppEnabled(isChecked);
+ updateDisplay();
+ }
+
+ public void updateDisplay() {
+ PreferenceScreen root = getPreferenceScreen();
+ if (root != null) {
+ root.removeAll();
+ }
+ if (isLockToAppEnabled(getActivity())) {
+ addPreferencesFromResource(R.xml.screen_pinning_settings);
+ root = getPreferenceScreen();
+
+ mUseScreenLock = (SwitchPreference) root.findPreference(KEY_USE_SCREEN_LOCK);
+ mUseScreenLock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ return setScreenLockUsed((boolean) newValue);
+ }
+ });
+ mUseScreenLock.setChecked(isScreenLockUsed());
+ mUseScreenLock.setTitle(getCurrentSecurityTitle());
+ }
}
/**
@@ -106,11 +190,19 @@ public class ScreenPinningSettings extends SettingsPreferenceFragment
data.screenTitle = res.getString(R.string.screen_pinning_title);
result.add(data);
- // Screen pinning description.
- data = new SearchIndexableRaw(context);
- data.title = res.getString(R.string.screen_pinning_description);
- data.screenTitle = res.getString(R.string.screen_pinning_title);
- result.add(data);
+ if (isLockToAppEnabled(context)) {
+ // Screen lock option
+ data = new SearchIndexableRaw(context);
+ data.title = res.getString(R.string.screen_pinning_unlock_none);
+ data.screenTitle = res.getString(R.string.screen_pinning_title);
+ result.add(data);
+ } else {
+ // Screen pinning description.
+ data = new SearchIndexableRaw(context);
+ data.title = res.getString(R.string.screen_pinning_description);
+ data.screenTitle = res.getString(R.string.screen_pinning_title);
+ result.add(data);
+ }
return result;
}