Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0cb383b authored by Sander Alewijnse's avatar Sander Alewijnse Committed by Android Git Automerger
Browse files

am 1d7e62b7: am 9d032110: Fix deadlock window manager and device policy manager.

* commit '1d7e62b7b77fb5184feb6676669b0d2544baecd0':
  Fix deadlock window manager and device policy manager.
parents 1e7100a6 f179fe36
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -150,10 +150,9 @@ interface IWindowManager
    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.
    /**
+9 −32
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.server.wm;
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 @@ public class WindowManagerService extends IWindowManager.Stub
     */
    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 class WindowManagerService extends IWindowManager.Stub

        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 @@ public class WindowManagerService extends IWindowManager.Stub
                    }
                }
                break;

                case UPDATE_SCRN_CAP: {
                    synchronized (mWindowMap) {
                        updateScreenCaptureDisabledLocked(msg.arg1);
                    }
                }
                break;
            }
            if (DEBUG_WINDOW_TRACE) {
                Slog.v(TAG, "handleMessage: exit");
+23 −5
Original line number Diff line number Diff line
@@ -791,6 +791,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
            policyFile.delete();
            Slog.i(LOG_TAG, "Removed device policy file " + policyFile.getAbsolutePath());
        }
        updateScreenCaptureDisabledInWindowManager(userHandle, false /* default value */);
    }

    void loadDeviceOwner() {
@@ -1367,6 +1368,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
        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 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
            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 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
        }
    }

    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.
+1 −1
Original line number Diff line number Diff line
@@ -360,7 +360,7 @@ public class IWindowManagerImpl implements IWindowManager {
    }

    @Override
    public void updateScreenCaptureDisabled(int userId) {
    public void setScreenCaptureDisabled(int userId, boolean disabled) {
        // TODO Auto-generated method stub
    }