Merge "Fix bug in getCameraDisabled for a specified admin" into udc-qpr-dev
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
index 4eb156a..016e85b 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
@@ -624,6 +624,27 @@
     }
 
     /**
+     * Retrieves the global policy set by the admin for the provided {@code policyDefinition} and
+     * if one was set, otherwise returns {@code null}.
+     */
+    @Nullable
+    <V> V getGlobalPolicySetByAdmin(
+            @NonNull PolicyDefinition<V> policyDefinition,
+            @NonNull EnforcingAdmin enforcingAdmin) {
+        Objects.requireNonNull(policyDefinition);
+        Objects.requireNonNull(enforcingAdmin);
+
+        synchronized (mLock) {
+            if (!hasGlobalPolicyLocked(policyDefinition)) {
+                return null;
+            }
+            PolicyValue<V> value = getGlobalPolicyStateLocked(policyDefinition)
+                    .getPoliciesSetByAdmins().get(enforcingAdmin);
+            return value == null ? null : value.getValue();
+        }
+    }
+
+    /**
      * Retrieves the values set for the provided {@code policyDefinition} by each admin.
      */
     @NonNull
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 7a64a7f..6885a89 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -9332,16 +9332,20 @@
         }
 
         int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle;
-
         if (isPolicyEngineForFinanceFlagEnabled()) {
             PolicyDefinition<Boolean> policy =
                     PolicyDefinition.getPolicyDefinitionForUserRestriction(
                             UserManager.DISALLOW_CAMERA);
             if (who != null) {
                 EnforcingAdmin admin = getEnforcingAdminForCaller(who, callerPackageName);
-                return Boolean.TRUE.equals(
-                        mDevicePolicyEngine.getLocalPolicySetByAdmin(
-                                policy, admin, affectedUserId));
+                Boolean value = null;
+                if (isDeviceOwner(caller)) {
+                    value = mDevicePolicyEngine.getGlobalPolicySetByAdmin(policy, admin);
+                } else {
+                    value = mDevicePolicyEngine.getLocalPolicySetByAdmin(
+                            policy, admin, affectedUserId);
+                }
+                return Boolean.TRUE.equals(value);
             } else {
                 return Boolean.TRUE.equals(
                         mDevicePolicyEngine.getResolvedPolicy(policy, affectedUserId));