Support default, pattern, pin and password encryption types
Use plumbing provided by dependant change to bring up correct dialog at boot time. Needs matching framework changes from https://googleplex-android-review.googlesource.com/#/c/412885/ Bug: 8769627 Change-Id: Ib04a2875e051a7cccca035fadb25978dfec22491
This commit is contained in:
@@ -226,20 +226,7 @@ public class ChooseLockGeneric extends SettingsActivity {
|
||||
private int upgradeQuality(int quality, MutableBoolean allowBiometric) {
|
||||
quality = upgradeQualityForDPM(quality);
|
||||
quality = upgradeQualityForKeyStore(quality);
|
||||
int encryptionQuality = upgradeQualityForEncryption(quality);
|
||||
if (encryptionQuality > quality) {
|
||||
//The first case checks whether biometric is allowed, prior to the user making
|
||||
//their selection from the list
|
||||
if (allowBiometric != null) {
|
||||
allowBiometric.value = quality <=
|
||||
DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK;
|
||||
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) {
|
||||
//When the user has selected biometric we shouldn't change that due to
|
||||
//encryption
|
||||
return quality;
|
||||
}
|
||||
}
|
||||
return encryptionQuality;
|
||||
return quality;
|
||||
}
|
||||
|
||||
private int upgradeQualityForDPM(int quality) {
|
||||
@@ -251,27 +238,6 @@ public class ChooseLockGeneric extends SettingsActivity {
|
||||
return quality;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mix in "encryption minimums" to any given quality value. This prevents users
|
||||
* from downgrading the pattern/pin/password to a level below the minimums.
|
||||
*
|
||||
* ASSUMPTION: Setting quality is sufficient (e.g. minimum lengths will be set
|
||||
* appropriately.)
|
||||
*/
|
||||
private int upgradeQualityForEncryption(int quality) {
|
||||
// Don't upgrade quality for secondary users. Encryption requirements don't apply.
|
||||
if (!Process.myUserHandle().equals(UserHandle.OWNER)) return quality;
|
||||
int encryptionStatus = mDPM.getStorageEncryptionStatus();
|
||||
boolean encrypted = (encryptionStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE)
|
||||
|| (encryptionStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVATING);
|
||||
if (encrypted) {
|
||||
if (quality < CryptKeeperSettings.MIN_PASSWORD_QUALITY) {
|
||||
quality = CryptKeeperSettings.MIN_PASSWORD_QUALITY;
|
||||
}
|
||||
}
|
||||
return quality;
|
||||
}
|
||||
|
||||
private int upgradeQualityForKeyStore(int quality) {
|
||||
if (!mKeyStore.isEmpty()) {
|
||||
if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) {
|
||||
|
@@ -34,6 +34,7 @@ import android.os.ServiceManager;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.UserHandle;
|
||||
import android.os.storage.IMountService;
|
||||
import android.os.storage.StorageManager;
|
||||
import android.provider.Settings;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.text.Editable;
|
||||
@@ -60,6 +61,9 @@ import com.android.internal.statusbar.StatusBarIcon;
|
||||
import com.android.internal.telephony.ITelephony;
|
||||
import com.android.internal.telephony.Phone;
|
||||
import com.android.internal.telephony.PhoneConstants;
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.internal.widget.LockPatternView;
|
||||
import com.android.internal.widget.LockPatternView.Cell;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -113,6 +117,7 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
||||
private int mCooldown;
|
||||
PowerManager.WakeLock mWakeLock;
|
||||
private EditText mPasswordEntry;
|
||||
private LockPatternView mLockPatternView;
|
||||
/** Number of calls to {@link #notifyUser()} to ignore before notifying. */
|
||||
private int mNotificationCountdown = 0;
|
||||
|
||||
@@ -175,7 +180,9 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
||||
final TextView status = (TextView) findViewById(R.id.status);
|
||||
status.setText(R.string.try_again);
|
||||
// Reenable the password entry
|
||||
mPasswordEntry.setEnabled(true);
|
||||
if (mPasswordEntry != null) {
|
||||
mPasswordEntry.setEnabled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -354,7 +361,21 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
||||
setContentView(R.layout.crypt_keeper_progress);
|
||||
encryptionProgressInit();
|
||||
} else if (mValidationComplete || isDebugView(FORCE_VIEW_PASSWORD)) {
|
||||
setContentView(R.layout.crypt_keeper_password_entry);
|
||||
final IMountService service = getMountService();
|
||||
int type = StorageManager.CRYPT_TYPE_PASSWORD;
|
||||
try {
|
||||
type = service.getPasswordType();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error while getting type - showing default dialog" + e);
|
||||
}
|
||||
|
||||
if(type == StorageManager.CRYPT_TYPE_PIN) {
|
||||
setContentView(R.layout.crypt_keeper_pin_entry);
|
||||
} else if (type == StorageManager.CRYPT_TYPE_PATTERN) {
|
||||
setContentView(R.layout.crypt_keeper_pattern_entry);
|
||||
} else {
|
||||
setContentView(R.layout.crypt_keeper_password_entry);
|
||||
}
|
||||
passwordEntryInit();
|
||||
} else if (!mValidationRequested) {
|
||||
// We're supposed to be encrypted, but no validation has been done.
|
||||
@@ -503,14 +524,44 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
||||
}
|
||||
}
|
||||
|
||||
private void passwordEntryInit() {
|
||||
protected LockPatternView.OnPatternListener mChooseNewLockPatternListener =
|
||||
new LockPatternView.OnPatternListener() {
|
||||
|
||||
@Override
|
||||
public void onPatternStart() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPatternCleared() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPatternDetected(List<LockPatternView.Cell> pattern) {
|
||||
new DecryptTask().execute(LockPatternUtils.patternToString(pattern));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPatternCellAdded(List<Cell> pattern) {
|
||||
}
|
||||
};
|
||||
|
||||
private void passwordEntryInit() {
|
||||
// Password/pin case
|
||||
mPasswordEntry = (EditText) findViewById(R.id.passwordEntry);
|
||||
mPasswordEntry.setOnEditorActionListener(this);
|
||||
mPasswordEntry.requestFocus();
|
||||
// Become quiet when the user interacts with the Edit text screen.
|
||||
mPasswordEntry.setOnKeyListener(this);
|
||||
mPasswordEntry.setOnTouchListener(this);
|
||||
mPasswordEntry.addTextChangedListener(this);
|
||||
if (mPasswordEntry != null){
|
||||
mPasswordEntry.setOnEditorActionListener(this);
|
||||
mPasswordEntry.requestFocus();
|
||||
// Become quiet when the user interacts with the Edit text screen.
|
||||
mPasswordEntry.setOnKeyListener(this);
|
||||
mPasswordEntry.setOnTouchListener(this);
|
||||
mPasswordEntry.addTextChangedListener(this);
|
||||
}
|
||||
|
||||
// Pattern case
|
||||
mLockPatternView = (LockPatternView) findViewById(R.id.lockPattern);
|
||||
if (mLockPatternView != null) {
|
||||
mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener);
|
||||
}
|
||||
|
||||
// Disable the Emergency call button if the device has no voice telephone capability
|
||||
final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
|
||||
|
Reference in New Issue
Block a user