Update ApiDemos to show active password status

* Add Check Password button
* Use it to report overall password status - isActivePasswordSufficient()
  and various password settings.
* Fixed a minor bug that cause the password quality to be reset to
  "unspecified" every time you start the activity.
* Leave the two password buttons enabled all the time (set password
  can be used when not active, and check password just puts up a toast
  explaining why it can't be used when inactive.)

This code can be used to confirm bug b/4445007 and hopefully its fix, too.

Change-Id: I136706072257d2e49184a29b0aa5d7a524960c40
This commit is contained in:
Andy Stadler
2011-05-24 22:55:22 -07:00
parent d3ca80b699
commit 69d5096f2b
3 changed files with 83 additions and 6 deletions

View File

@@ -138,6 +138,12 @@
android:text="@string/set_password"> android:text="@string/set_password">
</Button> </Button>
<Button android:id="@+id/check_password_button"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android_layout_gravity="east|center_vertical"
android:text="@string/check_password">
</Button>
</LinearLayout> </LinearLayout>
<LinearLayout android:orientation="horizontal" android:gravity="center" <LinearLayout android:orientation="horizontal" android:gravity="center"

View File

@@ -654,6 +654,7 @@
<string name="update_expiration_label">Update</string> <string name="update_expiration_label">Update</string>
<string name="update_expiration_status_label">Update Status</string> <string name="update_expiration_status_label">Update Status</string>
<string name="set_password">Set Password</string> <string name="set_password">Set Password</string>
<string name="check_password">Check Password</string>
<string name="password_hint">Password</string> <string name="password_hint">Password</string>
<string name="reset_password">Reset Password</string> <string name="reset_password">Reset Password</string>
<string name="max_failed_pw_hint">Password Attempts Wipe Data</string> <string name="max_failed_pw_hint">Password Attempts Wipe Data</string>

View File

@@ -162,6 +162,7 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
}; };
Spinner mPasswordQuality; Spinner mPasswordQuality;
int mPasswordQualityRecent = 0;
EditText mPasswordLength; EditText mPasswordLength;
EditText mPasswordMinimumLetters; EditText mPasswordMinimumLetters;
EditText mPasswordMinimumUppercase; EditText mPasswordMinimumUppercase;
@@ -170,7 +171,6 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
EditText mPasswordMinimumSymbols; EditText mPasswordMinimumSymbols;
EditText mPasswordMinimumNonLetter; EditText mPasswordMinimumNonLetter;
EditText mPasswordHistoryLength; EditText mPasswordHistoryLength;
Button mSetPasswordButton;
EditText mPassword; EditText mPassword;
Button mResetPasswordButton; Button mResetPasswordButton;
@@ -221,7 +221,12 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
new OnItemSelectedListener() { new OnItemSelectedListener() {
public void onItemSelected( public void onItemSelected(
AdapterView<?> parent, View view, int position, long id) { 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) { public void onNothingSelected(AdapterView<?> parent) {
@@ -355,8 +360,8 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
} }
}); });
mSetPasswordButton = (Button)findViewById(R.id.set_password); findViewById(R.id.set_password).setOnClickListener(mSetPasswordListener);
mSetPasswordButton.setOnClickListener(mSetPasswordListener); findViewById(R.id.check_password_button).setOnClickListener(mCheckPasswordListener);
mPassword = (EditText)findViewById(R.id.password); mPassword = (EditText)findViewById(R.id.password);
mResetPasswordButton = (Button)findViewById(R.id.reset_password); mResetPasswordButton = (Button)findViewById(R.id.reset_password);
@@ -417,7 +422,6 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
mPasswordMinimumNumeric.setEnabled(true); mPasswordMinimumNumeric.setEnabled(true);
mPasswordMinimumNonLetter.setEnabled(true); mPasswordMinimumNonLetter.setEnabled(true);
mPasswordHistoryLength.setEnabled(true); mPasswordHistoryLength.setEnabled(true);
mSetPasswordButton.setEnabled(true);
mPassword.setEnabled(true); mPassword.setEnabled(true);
mResetPasswordButton.setEnabled(true); mResetPasswordButton.setEnabled(true);
mForceLockButton.setEnabled(true); mForceLockButton.setEnabled(true);
@@ -439,7 +443,6 @@ public class DeviceAdminSample extends DeviceAdminReceiver {
mPasswordMinimumNumeric.setEnabled(false); mPasswordMinimumNumeric.setEnabled(false);
mPasswordMinimumNonLetter.setEnabled(false); mPasswordMinimumNonLetter.setEnabled(false);
mPasswordHistoryLength.setEnabled(false); mPasswordHistoryLength.setEnabled(false);
mSetPasswordButton.setEnabled(false);
mPassword.setEnabled(false); mPassword.setEnabled(false);
mResetPasswordButton.setEnabled(false); mResetPasswordButton.setEnabled(false);
mForceLockButton.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() { private OnClickListener mResetPasswordListener = new OnClickListener() {
public void onClick(View v) { public void onClick(View v) {
if (ActivityManager.isUserAMonkey()) { if (ActivityManager.isUserAMonkey()) {