OSDN Git Service

Persist master volume mute across reboot
authorTony Mak <tonymak@google.com>
Fri, 22 Jul 2016 15:02:59 +0000 (16:02 +0100)
committerTony Mak <tonymak@google.com>
Fri, 22 Jul 2016 17:12:54 +0000 (17:12 +0000)
Fix: 30133263

Change-Id: I53450a504e40e55516acc88550f369a74a244eaf

core/java/android/os/UserManager.java
services/core/java/com/android/server/audio/AudioService.java
services/core/java/com/android/server/pm/UserRestrictionsUtils.java
services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java

index feb8b2b..1dae0f8 100644 (file)
@@ -580,6 +580,16 @@ public class UserManager {
     public static final String DISALLOW_CAMERA = "no_camera";
 
     /**
+     * Specifies if a user is not allowed to unmute the device's master volume.
+     *
+     * @see DevicePolicyManager#setMasterVolumeMuted(ComponentName, boolean)
+     * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
+     * @see #getUserRestrictions()
+     * @hide
+     */
+    public static final String DISALLLOW_UNMUTE_DEVICE = "disallow_unmute_device";
+
+    /**
      * Specifies if a user is not allowed to use cellular data when roaming. This can only be set by
      * device owners. The default value is <code>false</code>.
      *
index 7777ae2..275870e 100644 (file)
@@ -1130,8 +1130,11 @@ public class AudioService extends IAudioService.Stub {
         final int currentUser = getCurrentUserId();
 
         // Check the current user restriction.
-        boolean masterMute = mUserManagerInternal.getUserRestriction(
-                    currentUser, UserManager.DISALLOW_ADJUST_VOLUME);
+        boolean masterMute =
+                mUserManagerInternal.getUserRestriction(currentUser,
+                        UserManager.DISALLLOW_UNMUTE_DEVICE)
+                        || mUserManagerInternal.getUserRestriction(currentUser,
+                        UserManager.DISALLOW_ADJUST_VOLUME);
         if (mUseFixedVolume) {
             masterMute = false;
             AudioSystem.setMasterVolume(1.0f);
@@ -5380,9 +5383,11 @@ public class AudioService extends IAudioService.Stub {
             // Update speaker mute state.
             {
                 final boolean wasRestricted =
-                        prevRestrictions.getBoolean(UserManager.DISALLOW_ADJUST_VOLUME);
+                        prevRestrictions.getBoolean(UserManager.DISALLOW_ADJUST_VOLUME)
+                                || prevRestrictions.getBoolean(UserManager.DISALLLOW_UNMUTE_DEVICE);
                 final boolean isRestricted =
-                        newRestrictions.getBoolean(UserManager.DISALLOW_ADJUST_VOLUME);
+                        newRestrictions.getBoolean(UserManager.DISALLOW_ADJUST_VOLUME)
+                                || newRestrictions.getBoolean(UserManager.DISALLLOW_UNMUTE_DEVICE);
                 if (wasRestricted != isRestricted) {
                     setMasterMuteInternalNoCallerCheck(isRestricted, /* flags =*/ 0, userId);
                 }
index 0499757..ae6276b 100644 (file)
@@ -105,7 +105,8 @@ public class UserRestrictionsUtils {
             UserManager.DISALLOW_DATA_ROAMING,
             UserManager.DISALLOW_SET_USER_ICON,
             UserManager.DISALLOW_SET_WALLPAPER,
-            UserManager.DISALLOW_OEM_UNLOCK
+            UserManager.DISALLOW_OEM_UNLOCK,
+            UserManager.DISALLLOW_UNMUTE_DEVICE,
     });
 
     /**
@@ -150,7 +151,8 @@ public class UserRestrictionsUtils {
     private static final Set<String> GLOBAL_RESTRICTIONS = Sets.newArraySet(
             UserManager.DISALLOW_ADJUST_VOLUME,
             UserManager.DISALLOW_RUN_IN_BACKGROUND,
-            UserManager.DISALLOW_UNMUTE_MICROPHONE
+            UserManager.DISALLOW_UNMUTE_MICROPHONE,
+            UserManager.DISALLLOW_UNMUTE_DEVICE
     );
 
     /**
@@ -436,6 +438,7 @@ public class UserRestrictionsUtils {
                             manager.setOemUnlockEnabled(false);
                         }
                     }
+                    break;
             }
         } finally {
             Binder.restoreCallingIdentity(id);
index 159ec4c..feeed8b 100644 (file)
@@ -7930,17 +7930,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
         Preconditions.checkNotNull(who, "ComponentName is null");
         synchronized (this) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
-            int userId = UserHandle.getCallingUserId();
-            long identity = mInjector.binderClearCallingIdentity();
-            try {
-                IAudioService iAudioService = IAudioService.Stub.asInterface(
-                        ServiceManager.getService(Context.AUDIO_SERVICE));
-                iAudioService.setMasterMute(on, 0, mContext.getPackageName(), userId);
-            } catch (RemoteException re) {
-                Slog.e(LOG_TAG, "Failed to setMasterMute", re);
-            } finally {
-                mInjector.binderRestoreCallingIdentity(identity);
-            }
+            setUserRestriction(who, UserManager.DISALLLOW_UNMUTE_DEVICE, on);
         }
     }