Fix 2385283: Add DevicePolicyManager calls to LockScreen.
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 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 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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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);
}