diff options
3 files changed, 86 insertions, 8 deletions
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 3c5a753..9f7a370 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -16,7 +16,10 @@ package com.android.internal.widget; +import android.app.DevicePolicyManager; +import android.content.ComponentName; import android.content.ContentResolver; +import android.content.Context; import android.os.SystemClock; import android.provider.Settings; import android.security.MessageDigest; @@ -93,15 +96,17 @@ public class LockPatternUtils { public final static String PASSWORD_TYPE_KEY = "lockscreen.password_type"; private final ContentResolver mContentResolver; - + private DevicePolicyManager mDevicePolicyManager; private static String sLockPatternFilename; private static String sLockPasswordFilename; /** * @param contentResolver Used to look up and save settings. */ - public LockPatternUtils(ContentResolver contentResolver) { - mContentResolver = contentResolver; + public LockPatternUtils(Context context) { + mContentResolver = context.getContentResolver(); + mDevicePolicyManager = + (DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE); // Initialize the location of gesture lock file if (sLockPatternFilename == null) { sLockPatternFilename = android.os.Environment.getDataDirectory() @@ -112,6 +117,71 @@ public class LockPatternUtils { } + public boolean isDevicePolicyActive() { + ComponentName admin = mDevicePolicyManager.getActiveAdmin(); + return admin != null ? mDevicePolicyManager.isAdminActive(admin) : false; + } + + public int getRequestedMinimumPasswordLength() { + return mDevicePolicyManager.getMinimumPasswordLength(); + } + + public int getActiveMinimumPasswordLength() { + return mDevicePolicyManager.getActiveMinimumPasswordLength(); + } + + /** + * Gets the device policy password mode. If the mode is non-specific, returns + * MODE_PATTERN which allows the user to choose anything. + * + * @return + */ + public int getRequestedPasswordMode() { + int policyMode = mDevicePolicyManager.getPasswordMode(); + switch (policyMode) { + case DevicePolicyManager.PASSWORD_MODE_ALPHANUMERIC: + return MODE_PASSWORD; + case DevicePolicyManager.PASSWORD_MODE_NUMERIC: + return MODE_PIN; + case DevicePolicyManager.PASSWORD_MODE_UNSPECIFIED: + return MODE_PATTERN; + } + return MODE_PATTERN; + } + + /** + * Returns the actual password mode, as set by keyguard after updating the password. + * + * @return + */ + public int getActivePasswordMode() { + return mDevicePolicyManager.getActivePasswordMode(); + } + + public void reportFailedPasswordAttempt() { + mDevicePolicyManager.reportFailedPasswordAttempt(); + } + + public void reportSuccessfulPasswordAttempt() { + mDevicePolicyManager.reportSuccessfulPasswordAttempt(); + } + + public void setActivePasswordState(int mode, int length) { + int policyMode = DevicePolicyManager.PASSWORD_MODE_UNSPECIFIED; + switch (mode) { + case MODE_PATTERN: + policyMode = DevicePolicyManager.PASSWORD_MODE_UNSPECIFIED; + break; + case MODE_PIN: + policyMode = DevicePolicyManager.PASSWORD_MODE_NUMERIC; + break; + case MODE_PASSWORD: + policyMode = DevicePolicyManager.PASSWORD_MODE_ALPHANUMERIC; + break; + } + mDevicePolicyManager.setActivePasswordState(policyMode, length); + } + /** * Check to see if a pattern matches the saved pattern. If no pattern exists, * always returns true. @@ -227,6 +297,10 @@ public class LockPatternUtils { raf.close(); setBoolean(PATTERN_EVER_CHOSEN_KEY, true); setLong(PASSWORD_TYPE_KEY, MODE_PATTERN); + if (pattern != null && isDevicePolicyActive()) { + setActivePasswordState(DevicePolicyManager.PASSWORD_MODE_UNSPECIFIED, + pattern.size()); + } } catch (FileNotFoundException fnfe) { // Cant do much, unless we want to fail over to using the settings provider Log.e(TAG, "Unable to save lock pattern to " + sLockPatternFilename); @@ -255,6 +329,10 @@ public class LockPatternUtils { } raf.close(); setLong(PASSWORD_TYPE_KEY, numericHint ? MODE_PIN : MODE_PASSWORD); + if (password != null && isDevicePolicyActive()) { + setActivePasswordState(numericHint ? DevicePolicyManager.PASSWORD_MODE_NUMERIC + : DevicePolicyManager.PASSWORD_MODE_ALPHANUMERIC, password.length()); + } } catch (FileNotFoundException fnfe) { // Cant do much, unless we want to fail over to using the settings provider Log.e(TAG, "Unable to save lock pattern to " + sLockPasswordFilename); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index a1dca7e..89d75b7 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -580,7 +580,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { upgradeVersion = 46; } - + if (upgradeVersion != currentVersion) { Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion + ", must wipe the settings provider"); @@ -608,7 +608,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { if (!TextUtils.isEmpty(lockPattern)) { // Convert lock pattern try { - LockPatternUtils lpu = new LockPatternUtils(mContext.getContentResolver()); + LockPatternUtils lpu = new LockPatternUtils(mContext); List<LockPatternView.Cell> cellPattern = LockPatternUtils.stringToPattern(lockPattern); lpu.saveLockPattern(cellPattern); @@ -928,11 +928,11 @@ public class DatabaseHelper extends SQLiteOpenHelper { private void loadSecure35Settings(SQLiteStatement stmt) { loadBooleanSetting(stmt, Settings.Secure.BACKUP_ENABLED, R.bool.def_backup_enabled); - + loadStringSetting(stmt, Settings.Secure.BACKUP_TRANSPORT, R.string.def_backup_transport); } - + private void loadSetting(SQLiteStatement stmt, String key, Object value) { stmt.bindString(1, key); stmt.bindString(2, value.toString()); diff --git a/services/java/com/android/server/DockObserver.java b/services/java/com/android/server/DockObserver.java index 6ea50c7..363e93e 100644 --- a/services/java/com/android/server/DockObserver.java +++ b/services/java/com/android/server/DockObserver.java @@ -99,7 +99,7 @@ class DockObserver extends UEventObserver { public DockObserver(Context context, PowerManagerService pm) { mContext = context; mPowerManager = pm; - mLockPatternUtils = new LockPatternUtils(context.getContentResolver()); + mLockPatternUtils = new LockPatternUtils(context); init(); // set initial status startObserving(DOCK_UEVENT_MATCH); } |