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:
@@ -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"
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user