Fix deadlock window manager and device policy manager.

Removed all communication from wm to device policy manager.
Added initialization of cache in wm by dpms.

Change-Id: Ifa0b8bfcd625464b156d5cc0fb66d342deda1c27
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 5157c41..83767cb 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -150,10 +150,9 @@
     void setStrictModeVisualIndicatorPreference(String enabled);
 
     /**
-     * Update the windowmanagers cached value of
-     * {@link android.app.admin.DevicePolicyManager#getScreenCaptureDisabled(null, userId)}
+     * Set whether screen capture is disabled for all windows of a specific user
      */
-    void updateScreenCaptureDisabled(int userId);
+    void setScreenCaptureDisabled(int userId, boolean disabled);
 
     // These can only be called with the SET_ORIENTATION permission.
     /**
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 670ba55..80dfb91 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -19,7 +19,6 @@
 import static android.view.WindowManager.LayoutParams.*;
 
 import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
-import android.app.admin.DevicePolicyManager;
 import android.app.AppOpsManager;
 import android.util.ArraySet;
 import android.util.TimeUtils;
@@ -2455,37 +2454,24 @@
      */
     boolean isScreenCaptureDisabledLocked(int userId) {
         Boolean disabled = mScreenCaptureDisabled.get(userId);
-        if (disabled != null) {
-            return disabled;
-        }
-
-        // mScreenCaptureDisabled not set yet, try to update it.
-        updateScreenCaptureDisabledLocked(userId);
-        disabled = mScreenCaptureDisabled.get(userId);
         if (disabled == null) {
-            // Not able to update, return false by default.
             return false;
-        } else {
-            return disabled;
         }
+        return disabled;
     }
 
     /**
-     * Update mScreenCaptureDisabled for specific user according to the device policy manager.
+     * Set mScreenCaptureDisabled for specific user
      */
     @Override
-    public void updateScreenCaptureDisabled(int userId) {
-        mH.sendMessage(mH.obtainMessage(H.UPDATE_SCRN_CAP, userId, 0 /* unused argument */));
-    }
+    public void setScreenCaptureDisabled(int userId, boolean disabled) {
+        int callingUid = Binder.getCallingUid();
+        if (callingUid != Process.SYSTEM_UID) {
+            throw new SecurityException("Only system can call setScreenCaptureDisabled.");
+        }
 
-    void updateScreenCaptureDisabledLocked(int userId) {
-        DevicePolicyManager dpm = (DevicePolicyManager) mContext
-                .getSystemService(Context.DEVICE_POLICY_SERVICE);
-        if (dpm != null) {
-            boolean disabled = dpm.getScreenCaptureDisabled(null, userId);
+        synchronized(mWindowMap) {
             mScreenCaptureDisabled.put(userId, disabled);
-        } else {
-            Slog.e(TAG, "Could not get DevicePolicyManager.");
         }
     }
 
@@ -7293,9 +7279,7 @@
 
         public static final int NEW_ANIMATOR_SCALE = 34;
 
-        public static final int UPDATE_SCRN_CAP = 35;
-
-        public static final int SHOW_DISPLAY_MASK = 36;
+        public static final int SHOW_DISPLAY_MASK = 35;
 
         @Override
         public void handleMessage(Message msg) {
@@ -7776,13 +7760,6 @@
                     }
                 }
                 break;
-
-                case UPDATE_SCRN_CAP: {
-                    synchronized (mWindowMap) {
-                        updateScreenCaptureDisabledLocked(msg.arg1);
-                    }
-                }
-                break;
             }
             if (DEBUG_WINDOW_TRACE) {
                 Slog.v(TAG, "handleMessage: exit");
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 6ab504c..c6730bf 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -791,6 +791,7 @@
             policyFile.delete();
             Slog.i(LOG_TAG, "Removed device policy file " + policyFile.getAbsolutePath());
         }
+        updateScreenCaptureDisabledInWindowManager(userHandle, false /* default value */);
     }
 
     void loadDeviceOwner() {
@@ -1367,6 +1368,16 @@
         new SetupContentObserver(mHandler).register(mContext.getContentResolver());
         // Initialize the user setup state, to handle the upgrade case.
         updateUserSetupComplete();
+
+        // Update the screen capture disabled cache in the window manager
+        List<UserInfo> users = mUserManager.getUsers(true);
+        final int N = users.size();
+        for (int i = 0; i < N; i++) {
+            int userHandle = users.get(i).id;
+            updateScreenCaptureDisabledInWindowManager(userHandle,
+                    getScreenCaptureDisabled(null, userHandle));
+        }
+
     }
 
     private void cleanUpOldUsers() {
@@ -3062,11 +3073,7 @@
             if (ap.disableScreenCapture != disabled) {
                 ap.disableScreenCapture = disabled;
                 saveSettingsLocked(userHandle);
-                try {
-                    getWindowManager().updateScreenCaptureDisabled(userHandle);
-                } catch (RemoteException e) {
-                    Log.w(LOG_TAG, "Unable to notify WindowManager.", e);
-                }
+                updateScreenCaptureDisabledInWindowManager(userHandle, disabled);
             }
         }
     }
@@ -3097,6 +3104,17 @@
         }
     }
 
+    private void updateScreenCaptureDisabledInWindowManager(int userHandle, boolean disabled) {
+        long ident = Binder.clearCallingIdentity();
+        try {
+            getWindowManager().setScreenCaptureDisabled(userHandle, disabled);
+        } catch (RemoteException e) {
+            Log.w(LOG_TAG, "Unable to notify WindowManager.", e);
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+    }
+
     /**
      * The system property used to share the state of the camera. The native camera service
      * is expected to read this property and act accordingly.
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 2ffe4a2..09b57fe 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -360,7 +360,7 @@
     }
 
     @Override
-    public void updateScreenCaptureDisabled(int userId) {
+    public void setScreenCaptureDisabled(int userId, boolean disabled) {
         // TODO Auto-generated method stub
     }