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);
     }