diff --git a/samples/ApiDemos/res/layout/device_admin_sample.xml b/samples/ApiDemos/res/layout/device_admin_sample.xml
index 374b87fd7..b898e8e35 100644
--- a/samples/ApiDemos/res/layout/device_admin_sample.xml
+++ b/samples/ApiDemos/res/layout/device_admin_sample.xml
@@ -138,6 +138,12 @@
android:text="@string/set_password">
+
+
Update
Update Status
Set Password
+ Check Password
Password
Reset Password
Password Attempts Wipe Data
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 04944ef1c..a9ce89a8c 100644
--- a/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java
+++ b/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java
@@ -162,6 +162,7 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
};
Spinner mPasswordQuality;
+ int mPasswordQualityRecent = 0;
EditText mPasswordLength;
EditText mPasswordMinimumLetters;
EditText mPasswordMinimumUppercase;
@@ -170,7 +171,6 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
EditText mPasswordMinimumSymbols;
EditText mPasswordMinimumNonLetter;
EditText mPasswordHistoryLength;
- Button mSetPasswordButton;
EditText mPassword;
Button mResetPasswordButton;
@@ -221,7 +221,12 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
new OnItemSelectedListener() {
public void onItemSelected(
AdapterView> parent, View view, int position, long id) {
- setPasswordQuality(mPasswordQualityValues[position]);
+ // Simple debounce, mainly to catch initialization case (we don't
+ // want to change the DPM values if the user didn't click it).
+ if (position != mPasswordQualityRecent) {
+ setPasswordQuality(mPasswordQualityValues[position]);
+ mPasswordQualityRecent = position;
+ }
}
public void onNothingSelected(AdapterView> parent) {
@@ -355,8 +360,8 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
}
});
- mSetPasswordButton = (Button)findViewById(R.id.set_password);
- mSetPasswordButton.setOnClickListener(mSetPasswordListener);
+ findViewById(R.id.set_password).setOnClickListener(mSetPasswordListener);
+ findViewById(R.id.check_password_button).setOnClickListener(mCheckPasswordListener);
mPassword = (EditText)findViewById(R.id.password);
mResetPasswordButton = (Button)findViewById(R.id.reset_password);
@@ -417,7 +422,6 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
mPasswordMinimumNumeric.setEnabled(true);
mPasswordMinimumNonLetter.setEnabled(true);
mPasswordHistoryLength.setEnabled(true);
- mSetPasswordButton.setEnabled(true);
mPassword.setEnabled(true);
mResetPasswordButton.setEnabled(true);
mForceLockButton.setEnabled(true);
@@ -439,7 +443,6 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
mPasswordMinimumNumeric.setEnabled(false);
mPasswordMinimumNonLetter.setEnabled(false);
mPasswordHistoryLength.setEnabled(false);
- mSetPasswordButton.setEnabled(false);
mPassword.setEnabled(false);
mResetPasswordButton.setEnabled(false);
mForceLockButton.setEnabled(false);
@@ -678,6 +681,73 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
}
};
+ // Retrieve information about the current password requirements and status, and display
+ // to the user in a simple alert dialog.
+ private OnClickListener mCheckPasswordListener = new OnClickListener() {
+ public void onClick(View v) {
+ boolean active = mDPM.isAdminActive(mDeviceAdminSample);
+ if (!active) {
+ Toast.makeText(Controller.this, "Cannot check password status unless active",
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ boolean sufficient = mDPM.isActivePasswordSufficient();
+ int quality = mDPM.getPasswordQuality(null);
+ int minimumLength = mDPM.getPasswordMinimumLength(null);
+ int minimumUpperCase = mDPM.getPasswordMinimumUpperCase(null);
+ int minimumLowerCase = mDPM.getPasswordMinimumLowerCase(null);
+ int minimumLetters = mDPM.getPasswordMinimumLetters(null);
+ int minimumNumeric = mDPM.getPasswordMinimumNumeric(null);
+ int minimumSymbols = mDPM.getPasswordMinimumSymbols(null);
+ int minimumNonLetter = mDPM.getPasswordMinimumNonLetter(null);
+ long timeToExpiration = mDPM.getPasswordExpiration(null);
+
+ // Quick string: Do better than this.
+ String qualityText;
+ switch (quality) {
+ case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
+ qualityText = "unspecified";
+ break;
+ case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
+ qualityText = "something";
+ break;
+ case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
+ qualityText = "numeric";
+ break;
+ case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
+ qualityText = "alphabetic";
+ break;
+ case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
+ qualityText = "alphanumeric";
+ break;
+ case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
+ qualityText = "complex";
+ break;
+ default:
+ qualityText = "0x" + Integer.toString(quality, 16);
+ break;
+ }
+ StringBuilder sb = new StringBuilder("Password Status:\n");
+ sb.append(" isActivePasswordSufficient=").append(sufficient).append("\n");
+ sb.append(" getPasswordQuality=").append(qualityText).append("\n");
+ sb.append(" getPasswordMinimumLength=").append(minimumLength).append("\n");
+ sb.append(" getPasswordMinimumUpperCase=").append(minimumUpperCase).append("\n");
+ sb.append(" getPasswordMinimumLowerCase=").append(minimumLowerCase).append("\n");
+ sb.append(" getPasswordMinimumLetters=").append(minimumLetters).append("\n");
+ sb.append(" getPasswordMinimumNumeric=").append(minimumNumeric).append("\n");
+ sb.append(" getPasswordMinimumSymbols=").append(minimumSymbols).append("\n");
+ sb.append(" getPasswordMinimumNonLetter=").append(minimumNonLetter).append("\n");
+ sb.append(" getPasswordExpiration=").append(timeToExpiration/1000).append(" sec");
+ if (timeToExpiration < 0) {
+ sb.append(" (expired)");
+ }
+ AlertDialog.Builder builder = new AlertDialog.Builder(Controller.this);
+ builder.setMessage(sb.toString());
+ builder.setPositiveButton("OK", null);
+ builder.show();
+ }
+ };
+
private OnClickListener mResetPasswordListener = new OnClickListener() {
public void onClick(View v) {
if (ActivityManager.isUserAMonkey()) {