Merge "Hide redundant restrictions" into nyc-mr1-dev

This commit is contained in:
Tony Mak
2016-08-03 09:28:24 +00:00
committed by Android (Google) Code Review
2 changed files with 60 additions and 20 deletions

View File

@@ -22,8 +22,9 @@ import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.InsetDrawable; import android.graphics.drawable.InsetDrawable;
import android.inputmethodservice.KeyboardView;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.text.Editable; import android.text.Editable;
@@ -39,7 +40,6 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@@ -49,8 +49,6 @@ import android.widget.TextView.OnEditorActionListener;
import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternUtils.RequestThrottledException; import com.android.internal.widget.LockPatternUtils.RequestThrottledException;
import com.android.internal.widget.PasswordEntryKeyboardHelper;
import com.android.internal.widget.PasswordEntryKeyboardView;
import com.android.internal.widget.TextViewInputDisabler; import com.android.internal.widget.TextViewInputDisabler;
import com.android.settings.notification.RedactionInterstitial; import com.android.settings.notification.RedactionInterstitial;
import com.android.settings.password.PasswordRequirementAdapter; import com.android.settings.password.PasswordRequirementAdapter;
@@ -179,6 +177,7 @@ public class ChooseLockPassword extends SettingsActivity {
private int mPasswordMinSymbols = 0; private int mPasswordMinSymbols = 0;
private int mPasswordMinNumeric = 0; private int mPasswordMinNumeric = 0;
private int mPasswordMinNonLetter = 0; private int mPasswordMinNonLetter = 0;
private int mPasswordMinLengthToFulfillAllPolicies = 0;
private int mUserId; private int mUserId;
private boolean mHideDrawer = false; private boolean mHideDrawer = false;
/** /**
@@ -200,6 +199,8 @@ public class ChooseLockPassword extends SettingsActivity {
private Button mCancelButton; private Button mCancelButton;
private Button mNextButton; private Button mNextButton;
private TextChangedHandler mTextChangedHandler;
private static final int CONFIRM_EXISTING_REQUEST = 58; private static final int CONFIRM_EXISTING_REQUEST = 58;
static final int RESULT_FINISHED = RESULT_FIRST_USER; static final int RESULT_FINISHED = RESULT_FIRST_USER;
@@ -284,6 +285,7 @@ public class ChooseLockPassword extends SettingsActivity {
w.start(mChooseLockSettingsHelper.utils(), required, w.start(mChooseLockSettingsHelper.utils(), required,
false, 0, current, current, mRequestedQuality, mUserId); false, 0, current, current, mRequestedQuality, mUserId);
} }
mTextChangedHandler = new TextChangedHandler();
} }
@Override @Override
@@ -397,11 +399,13 @@ public class ChooseLockPassword extends SettingsActivity {
mPasswordMinLowerCase)); mPasswordMinLowerCase));
} }
if (mPasswordMinLetters > 0) { if (mPasswordMinLetters > 0) {
if (mPasswordMinLetters > mPasswordMinUpperCase + mPasswordMinLowerCase) {
passwordRequirements.add(MIN_LETTER_IN_PASSWORD); passwordRequirements.add(MIN_LETTER_IN_PASSWORD);
requirementDescriptions.add(getResources().getQuantityString( requirementDescriptions.add(getResources().getQuantityString(
R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters, R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters,
mPasswordMinLetters)); mPasswordMinLetters));
} }
}
if (mPasswordMinNumeric > 0) { if (mPasswordMinNumeric > 0) {
passwordRequirements.add(MIN_NUMBER_IN_PASSWORD); passwordRequirements.add(MIN_NUMBER_IN_PASSWORD);
requirementDescriptions.add(getResources().getQuantityString( requirementDescriptions.add(getResources().getQuantityString(
@@ -415,11 +419,14 @@ public class ChooseLockPassword extends SettingsActivity {
mPasswordMinSymbols)); mPasswordMinSymbols));
} }
if (mPasswordMinNonLetter > 0) { if (mPasswordMinNonLetter > 0) {
if (mPasswordMinNonLetter > mPasswordMinNumeric + mPasswordMinSymbols) {
passwordRequirements.add(MIN_NON_LETTER_IN_PASSWORD); passwordRequirements.add(MIN_NON_LETTER_IN_PASSWORD);
requirementDescriptions.add(getResources().getQuantityString( requirementDescriptions.add(getResources().getQuantityString(
R.plurals.lockpassword_password_requires_nonletter, mPasswordMinNonLetter, R.plurals.lockpassword_password_requires_nonletter, mPasswordMinNonLetter,
mPasswordMinNonLetter)); mPasswordMinNonLetter));
} }
}
// Convert list to array. // Convert list to array.
mPasswordRequirements = passwordRequirements.stream().mapToInt(i -> i).toArray(); mPasswordRequirements = passwordRequirements.stream().mapToInt(i -> i).toArray();
mPasswordRestrictionView = mPasswordRestrictionView =
@@ -553,6 +560,7 @@ public class ChooseLockPassword extends SettingsActivity {
mPasswordMinSymbols = 0; mPasswordMinSymbols = 0;
mPasswordMinNonLetter = 0; mPasswordMinNonLetter = 0;
} }
mPasswordMinLengthToFulfillAllPolicies = getMinLengthToFulfillAllPolicies();
} }
/** /**
@@ -565,7 +573,9 @@ public class ChooseLockPassword extends SettingsActivity {
int errorCode = NO_ERROR; int errorCode = NO_ERROR;
if (password.length() < mPasswordMinLength) { if (password.length() < mPasswordMinLength) {
if (mPasswordMinLength > mPasswordMinLengthToFulfillAllPolicies) {
errorCode |= TOO_SHORT; errorCode |= TOO_SHORT;
}
} else if (password.length() > mPasswordMaxLength) { } else if (password.length() > mPasswordMaxLength) {
errorCode |= TOO_LONG; errorCode |= TOO_LONG;
} else { } else {
@@ -728,11 +738,6 @@ public class ChooseLockPassword extends SettingsActivity {
if ((errorCode & CONTAIN_NON_DIGITS) > 0) { if ((errorCode & CONTAIN_NON_DIGITS) > 0) {
messages.add(getString(R.string.lockpassword_pin_contains_non_digits)); messages.add(getString(R.string.lockpassword_pin_contains_non_digits));
} }
if ((errorCode & NOT_ENOUGH_LETTER) > 0) {
messages.add(getResources().getQuantityString(
R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters,
mPasswordMinLetters));
}
if ((errorCode & NOT_ENOUGH_UPPER_CASE) > 0) { if ((errorCode & NOT_ENOUGH_UPPER_CASE) > 0) {
messages.add(getResources().getQuantityString( messages.add(getResources().getQuantityString(
R.plurals.lockpassword_password_requires_uppercase, mPasswordMinUpperCase, R.plurals.lockpassword_password_requires_uppercase, mPasswordMinUpperCase,
@@ -743,6 +748,11 @@ public class ChooseLockPassword extends SettingsActivity {
R.plurals.lockpassword_password_requires_lowercase, mPasswordMinLowerCase, R.plurals.lockpassword_password_requires_lowercase, mPasswordMinLowerCase,
mPasswordMinLowerCase)); mPasswordMinLowerCase));
} }
if ((errorCode & NOT_ENOUGH_LETTER) > 0) {
messages.add(getResources().getQuantityString(
R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters,
mPasswordMinLetters));
}
if ((errorCode & NOT_ENOUGH_DIGITS) > 0) { if ((errorCode & NOT_ENOUGH_DIGITS) > 0) {
messages.add(getResources().getQuantityString( messages.add(getResources().getQuantityString(
R.plurals.lockpassword_password_requires_numeric, mPasswordMinNumeric, R.plurals.lockpassword_password_requires_numeric, mPasswordMinNumeric,
@@ -778,6 +788,14 @@ public class ChooseLockPassword extends SettingsActivity {
return messages.toArray(new String[0]); return messages.toArray(new String[0]);
} }
private int getMinLengthToFulfillAllPolicies() {
final int minLengthForLetters = Math.max(mPasswordMinLetters,
mPasswordMinUpperCase + mPasswordMinLowerCase);
final int minLengthForNonLetters = Math.max(mPasswordMinNonLetter,
mPasswordMinSymbols + mPasswordMinNumeric);
return minLengthForLetters + minLengthForNonLetters;
}
/** /**
* Update the hint based on current Stage and length of password entry * Update the hint based on current Stage and length of password entry
*/ */
@@ -818,7 +836,8 @@ public class ChooseLockPassword extends SettingsActivity {
if (mUiStage == Stage.ConfirmWrong) { if (mUiStage == Stage.ConfirmWrong) {
mUiStage = Stage.NeedToConfirm; mUiStage = Stage.NeedToConfirm;
} }
updateUi(); // Schedule the UI update.
mTextChangedHandler.notifyAfterTextChanged();
} }
public void beforeTextChanged(CharSequence s, int start, int count, int after) { public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -864,6 +883,27 @@ public class ChooseLockPassword extends SettingsActivity {
} }
getActivity().finish(); getActivity().finish();
} }
class TextChangedHandler extends Handler {
private static final int ON_TEXT_CHANGED = 1;
private static final int DELAY_IN_MILLISECOND = 100;
/**
* With the introduction of delay, we batch processing the text changed event to reduce
* unnecessary UI updates.
*/
private void notifyAfterTextChanged() {
removeMessages(ON_TEXT_CHANGED);
sendEmptyMessageDelayed(ON_TEXT_CHANGED, DELAY_IN_MILLISECOND);
}
@Override
public void handleMessage(Message msg) {
if (msg.what == ON_TEXT_CHANGED) {
updateUi();
}
}
}
} }
private static class SaveAndFinishWorker extends SaveChosenLockWorkerBase { private static class SaveAndFinishWorker extends SaveChosenLockWorkerBase {

View File

@@ -28,7 +28,7 @@ import static com.android.settings.password.PasswordRequirementAdapter
.PasswordRequirementViewHolder; .PasswordRequirementViewHolder;
/** /**
* Used in {@link com.android.settings.ConfirmLockPassword} to show password requirements. * Used in {@link com.android.settings.ChooseLockPassword} to show password requirements.
*/ */
public class PasswordRequirementAdapter extends public class PasswordRequirementAdapter extends
RecyclerView.Adapter<PasswordRequirementViewHolder> { RecyclerView.Adapter<PasswordRequirementViewHolder> {