diff --git a/samples/ApiDemos/res/layout/device_admin_sample.xml b/samples/ApiDemos/res/layout/device_admin_sample.xml
index d4f3147a8..f7273be0a 100644
--- a/samples/ApiDemos/res/layout/device_admin_sample.xml
+++ b/samples/ApiDemos/res/layout/device_admin_sample.xml
@@ -15,138 +15,199 @@
-->
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:paddingBottom="4dip"
+ android:text="@string/sample_device_admin_summary"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/samples/ApiDemos/res/values/arrays.xml b/samples/ApiDemos/res/values/arrays.xml
index df918cd62..f5ccbe13f 100644
--- a/samples/ApiDemos/res/values/arrays.xml
+++ b/samples/ApiDemos/res/values/arrays.xml
@@ -92,6 +92,7 @@
- Numeric
- Alphabetic
- Alphanumeric
+ - Complex
diff --git a/samples/ApiDemos/res/values/strings.xml b/samples/ApiDemos/res/values/strings.xml
index 016ca1854..6d58cc364 100644
--- a/samples/ApiDemos/res/values/strings.xml
+++ b/samples/ApiDemos/res/values/strings.xml
@@ -485,6 +485,12 @@
Disable Admin
Password Quality
Minimum Length
+ Minimum Letters
+ Minimum Uppercase
+ Minimum Lowercase
+ Minimum Symbols
+ Minimum Numeric
+ Minimum Non-Letter
Password History Length
Set Password
Password
diff --git a/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java b/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java
index b62706a63..a28217297 100644
--- a/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java
+++ b/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java
@@ -54,6 +54,12 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
static String PREF_PASSWORD_QUALITY = "password_quality";
static String PREF_PASSWORD_LENGTH = "password_length";
+ static String PREF_PASSWORD_MINIMUM_LETTERS = "password_minimum_letters";
+ static String PREF_PASSWORD_MINIMUM_UPPERCASE = "password_minimum_uppercase";
+ static String PREF_PASSWORD_MINIMUM_LOWERCASE = "password_minimum_lowercase";
+ static String PREF_PASSWORD_MINIMUM_NUMERIC = "password_minimum_numeric";
+ static String PREF_PASSWORD_MINIMUM_SYMBOLS = "password_minimum_symbols";
+ static String PREF_PASSWORD_MINIMUM_NONLETTER = "password_minimum_nonletter";
static String PREF_PASSWORD_HISTORY_LENGTH = "password_history_length";
static String PREF_MAX_FAILED_PW = "max_failed_pw";
@@ -116,10 +122,17 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
DevicePolicyManager.PASSWORD_QUALITY_SOMETHING,
DevicePolicyManager.PASSWORD_QUALITY_NUMERIC,
DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC,
- DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
+ DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC,
+ DevicePolicyManager.PASSWORD_QUALITY_COMPLEX
};
Spinner mPasswordQuality;
EditText mPasswordLength;
+ EditText mPasswordMinimumLetters;
+ EditText mPasswordMinimumUppercase;
+ EditText mPasswordMinimumLowercase;
+ EditText mPasswordMinimumNumeric;
+ EditText mPasswordMinimumSymbols;
+ EditText mPasswordMinimumNonLetter;
EditText mPasswordHistoryLength;
Button mSetPasswordButton;
@@ -180,6 +193,84 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
}
}
});
+ mPasswordMinimumLetters = (EditText)findViewById(R.id.password_minimum_letters);
+ mPasswordMinimumLetters.addTextChangedListener(new TextWatcher() {
+ public void afterTextChanged(Editable s) {
+ }
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ try {
+ setPasswordMinimumLetters(Integer.parseInt(s.toString()));
+ } catch (NumberFormatException e) {
+ }
+ }
+ });
+ mPasswordMinimumUppercase = (EditText)findViewById(R.id.password_minimum_uppercase);
+ mPasswordMinimumUppercase.addTextChangedListener(new TextWatcher() {
+ public void afterTextChanged(Editable s) {
+ }
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ try {
+ setPasswordMinimumUppercase(Integer.parseInt(s.toString()));
+ } catch (NumberFormatException e) {
+ }
+ }
+ });
+ mPasswordMinimumLowercase = (EditText)findViewById(R.id.password_minimum_lowercase);
+ mPasswordMinimumLowercase.addTextChangedListener(new TextWatcher() {
+ public void afterTextChanged(Editable s) {
+ }
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ try {
+ setPasswordMinimumLowercase(Integer.parseInt(s.toString()));
+ } catch (NumberFormatException e) {
+ }
+ }
+ });
+ mPasswordMinimumNumeric = (EditText)findViewById(R.id.password_minimum_numeric);
+ mPasswordMinimumNumeric.addTextChangedListener(new TextWatcher() {
+ public void afterTextChanged(Editable s) {
+ }
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ try {
+ setPasswordMinimumNumeric(Integer.parseInt(s.toString()));
+ } catch (NumberFormatException e) {
+ }
+ }
+ });
+ mPasswordMinimumSymbols = (EditText)findViewById(R.id.password_minimum_symbols);
+ mPasswordMinimumSymbols.addTextChangedListener(new TextWatcher() {
+ public void afterTextChanged(Editable s) {
+ }
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ try {
+ setPasswordMinimumSymbols(Integer.parseInt(s.toString()));
+ } catch (NumberFormatException e) {
+ }
+ }
+ });
+ mPasswordMinimumNonLetter = (EditText)findViewById(R.id.password_minimum_nonletter);
+ mPasswordMinimumNonLetter.addTextChangedListener(new TextWatcher() {
+ public void afterTextChanged(Editable s) {
+ }
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ try {
+ setPasswordMinimumNonLetter(Integer.parseInt(s.toString()));
+ } catch (NumberFormatException e) {
+ }
+ }
+ });
mPasswordHistoryLength = (EditText)findViewById(R.id.password_history_length);
mPasswordHistoryLength.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
@@ -236,6 +327,12 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
mDisableButton.setEnabled(true);
mPasswordQuality.setEnabled(true);
mPasswordLength.setEnabled(true);
+ mPasswordMinimumLetters.setEnabled(true);
+ mPasswordMinimumUppercase.setEnabled(true);
+ mPasswordMinimumLowercase.setEnabled(true);
+ mPasswordMinimumSymbols.setEnabled(true);
+ mPasswordMinimumNumeric.setEnabled(true);
+ mPasswordMinimumNonLetter.setEnabled(true);
mPasswordHistoryLength.setEnabled(true);
mSetPasswordButton.setEnabled(true);
mPassword.setEnabled(true);
@@ -247,6 +344,12 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
mDisableButton.setEnabled(false);
mPasswordQuality.setEnabled(false);
mPasswordLength.setEnabled(false);
+ mPasswordMinimumLetters.setEnabled(false);
+ mPasswordMinimumUppercase.setEnabled(false);
+ mPasswordMinimumLowercase.setEnabled(false);
+ mPasswordMinimumSymbols.setEnabled(false);
+ mPasswordMinimumNumeric.setEnabled(false);
+ mPasswordMinimumNonLetter.setEnabled(false);
mPasswordHistoryLength.setEnabled(false);
mSetPasswordButton.setEnabled(false);
mPassword.setEnabled(false);
@@ -261,6 +364,12 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
final int pwQuality = prefs.getInt(PREF_PASSWORD_QUALITY,
DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
final int pwLength = prefs.getInt(PREF_PASSWORD_LENGTH, 0);
+ final int pwMinLetters = prefs.getInt(PREF_PASSWORD_MINIMUM_LETTERS, 0);
+ final int pwMinUppercase = prefs.getInt(PREF_PASSWORD_MINIMUM_UPPERCASE, 0);
+ final int pwMinLowercase = prefs.getInt(PREF_PASSWORD_MINIMUM_LOWERCASE, 0);
+ final int pwMinNumeric = prefs.getInt(PREF_PASSWORD_MINIMUM_NUMERIC, 0);
+ final int pwMinSymbols = prefs.getInt(PREF_PASSWORD_MINIMUM_SYMBOLS, 0);
+ final int pwMinNonLetter = prefs.getInt(PREF_PASSWORD_MINIMUM_NONLETTER, 0);
final int pwHistoryLength = prefs.getInt(PREF_PASSWORD_HISTORY_LENGTH, 0);
final int maxFailedPw = prefs.getInt(PREF_MAX_FAILED_PW, 0);
@@ -270,6 +379,12 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
}
}
mPasswordLength.setText(Integer.toString(pwLength));
+ mPasswordMinimumLetters.setText(Integer.toString(pwMinLetters));
+ mPasswordMinimumUppercase.setText(Integer.toString(pwMinUppercase));
+ mPasswordMinimumLowercase.setText(Integer.toString(pwMinLowercase));
+ mPasswordMinimumSymbols.setText(Integer.toString(pwMinSymbols));
+ mPasswordMinimumNumeric.setText(Integer.toString(pwMinNumeric));
+ mPasswordMinimumNonLetter.setText(Integer.toString(pwMinNonLetter));
mPasswordHistoryLength.setText(Integer.toString(pwHistoryLength));
mMaxFailedPw.setText(Integer.toString(maxFailedPw));
}
@@ -279,6 +394,12 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
final int pwQuality = prefs.getInt(PREF_PASSWORD_QUALITY,
DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
final int pwLength = prefs.getInt(PREF_PASSWORD_LENGTH, 0);
+ final int pwMinLetters = prefs.getInt(PREF_PASSWORD_MINIMUM_LETTERS, 0);
+ final int pwMinUppercase = prefs.getInt(PREF_PASSWORD_MINIMUM_UPPERCASE, 0);
+ final int pwMinLowercase = prefs.getInt(PREF_PASSWORD_MINIMUM_LOWERCASE, 0);
+ final int pwMinNumeric = prefs.getInt(PREF_PASSWORD_MINIMUM_NUMERIC, 0);
+ final int pwMinSymbols = prefs.getInt(PREF_PASSWORD_MINIMUM_SYMBOLS, 0);
+ final int pwMinNonLetter = prefs.getInt(PREF_PASSWORD_MINIMUM_NONLETTER, 0);
final int pwHistoryLength = prefs.getInt(PREF_PASSWORD_HISTORY_LENGTH, 0);
final int maxFailedPw = prefs.getInt(PREF_MAX_FAILED_PW, 0);
@@ -286,6 +407,12 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
if (active) {
mDPM.setPasswordQuality(mDeviceAdminSample, pwQuality);
mDPM.setPasswordMinimumLength(mDeviceAdminSample, pwLength);
+ mDPM.setPasswordMinimumLetters(mDeviceAdminSample, pwMinLetters);
+ mDPM.setPasswordMinimumUpperCase(mDeviceAdminSample, pwMinUppercase);
+ mDPM.setPasswordMinimumLowerCase(mDeviceAdminSample, pwMinLowercase);
+ mDPM.setPasswordMinimumNumeric(mDeviceAdminSample, pwMinNumeric);
+ mDPM.setPasswordMinimumSymbols(mDeviceAdminSample, pwMinSymbols);
+ mDPM.setPasswordMinimumNonLetter(mDeviceAdminSample, pwMinNonLetter);
mDPM.setPasswordHistoryLength(mDeviceAdminSample, pwHistoryLength);
mDPM.setMaximumFailedPasswordsForWipe(mDeviceAdminSample, maxFailedPw);
}
@@ -303,6 +430,42 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
updatePolicies();
}
+ void setPasswordMinimumLetters(int length) {
+ SharedPreferences prefs = getSamplePreferences(this);
+ prefs.edit().putInt(PREF_PASSWORD_MINIMUM_LETTERS, length).commit();
+ updatePolicies();
+ }
+
+ void setPasswordMinimumUppercase(int length) {
+ SharedPreferences prefs = getSamplePreferences(this);
+ prefs.edit().putInt(PREF_PASSWORD_MINIMUM_UPPERCASE, length).commit();
+ updatePolicies();
+ }
+
+ void setPasswordMinimumLowercase(int length) {
+ SharedPreferences prefs = getSamplePreferences(this);
+ prefs.edit().putInt(PREF_PASSWORD_MINIMUM_LOWERCASE, length).commit();
+ updatePolicies();
+ }
+
+ void setPasswordMinimumNumeric(int length) {
+ SharedPreferences prefs = getSamplePreferences(this);
+ prefs.edit().putInt(PREF_PASSWORD_MINIMUM_NUMERIC, length).commit();
+ updatePolicies();
+ }
+
+ void setPasswordMinimumSymbols(int length) {
+ SharedPreferences prefs = getSamplePreferences(this);
+ prefs.edit().putInt(PREF_PASSWORD_MINIMUM_SYMBOLS, length).commit();
+ updatePolicies();
+ }
+
+ void setPasswordMinimumNonLetter(int length) {
+ SharedPreferences prefs = getSamplePreferences(this);
+ prefs.edit().putInt(PREF_PASSWORD_MINIMUM_NONLETTER, length).commit();
+ updatePolicies();
+ }
+
void setPasswordHistoryLength(int length) {
SharedPreferences prefs = getSamplePreferences(this);
prefs.edit().putInt(PREF_PASSWORD_HISTORY_LENGTH, length).commit();