From 22c921a910d236abf3a1705a02541a49fdaf3a14 Mon Sep 17 00:00:00 2001 From: Emily Bernier Date: Wed, 28 May 2014 11:01:32 -0400 Subject: [PATCH] Add an app ops code for microphone muting. When OP_AUDIO_MICROPHONE (linked to the DISALLOW_UNMUTE_MICROPHONE user restriction) is set, the system blocks calls to setMicrophoneMute. Bug: 13585692 Change-Id: Ib32138bcc256cfbac4fe21a090d5ba34f5c641fc --- core/java/android/app/AppOpsManager.java | 13 +++++++++++-- media/java/android/media/AudioManager.java | 7 ++++++- media/java/android/media/AudioService.java | 10 ++++++++++ media/java/android/media/IAudioService.aidl | 2 ++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 586723230ee4a..a480219fbf408 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -189,7 +189,9 @@ public class AppOpsManager { /** @hide Retrieve current usage stats via {@link UsageStatsManager}. */ public static final int OP_GET_USAGE_STATS = 43; /** @hide */ - public static final int _NUM_OP = 44; + public static final int OP_MUTE_MICROPHONE = 44; + /** @hide */ + public static final int _NUM_OP = 45; /** Access to coarse location information. */ public static final String OPSTR_COARSE_LOCATION = @@ -257,6 +259,7 @@ public class AppOpsManager { OP_COARSE_LOCATION, OP_COARSE_LOCATION, OP_GET_USAGE_STATS, + OP_MUTE_MICROPHONE }; /** @@ -308,6 +311,7 @@ public class AppOpsManager { OPSTR_MONITOR_LOCATION, OPSTR_MONITOR_HIGH_POWER_LOCATION, null, + null, }; /** @@ -358,7 +362,8 @@ public class AppOpsManager { "WAKE_LOCK", "MONITOR_LOCATION", "MONITOR_HIGH_POWER_LOCATION", - "GET_USAGE_STATS" + "GET_USAGE_STATS", + "OP_MUTE_MICROPHONE", }; /** @@ -410,6 +415,7 @@ public class AppOpsManager { null, // no permission for generic location monitoring null, // no permission for high power location monitoring android.Manifest.permission.PACKAGE_USAGE_STATS, + null, // no permission for muting/unmuting microphone }; /** @@ -462,6 +468,7 @@ public class AppOpsManager { null, //MONITOR_LOCATION null, //MONITOR_HIGH_POWER_LOCATION null, //GET_USAGE_STATS + UserManager.DISALLOW_UNMUTE_MICROPHONE, // MUTE_MICROPHONE }; /** @@ -512,6 +519,7 @@ public class AppOpsManager { AppOpsManager.MODE_ALLOWED, AppOpsManager.MODE_ALLOWED, AppOpsManager.MODE_IGNORED, // OP_GET_USAGE_STATS + AppOpsManager.MODE_ALLOWED, }; /** @@ -566,6 +574,7 @@ public class AppOpsManager { false, false, false, + false, }; private static HashMap sOpStrToOp = new HashMap(); diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 6280fdeca01fb..b1bc4c4d2fc83 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -1425,7 +1425,12 @@ public class AudioManager { * false to turn mute off */ public void setMicrophoneMute(boolean on){ - AudioSystem.muteMicrophone(on); + IAudioService service = getService(); + try { + service.setMicrophoneMute(on, mContext.getOpPackageName()); + } catch (RemoteException e) { + Log.e(TAG, "Dead object in setMicrophoneMute", e); + } } /** diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 2f782cca94947..d496117cd0617 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -1437,6 +1437,16 @@ public class AudioService extends IAudioService.Stub { } } + /** @see AudioManager#setMicrophoneMute(boolean) */ + public void setMicrophoneMute(boolean on, String callingPackage) { + if (mAppOps.noteOp(AppOpsManager.OP_MUTE_MICROPHONE, Binder.getCallingUid(), + callingPackage) != AppOpsManager.MODE_ALLOWED) { + return; + } + + AudioSystem.muteMicrophone(on); + } + /** @see AudioManager#getRingerMode() */ public int getRingerMode() { synchronized(mSettingsLock) { diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index ba3cfb6034086..c29e967868fe3 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -78,6 +78,8 @@ interface IAudioService { int getLastAudibleMasterVolume(); + void setMicrophoneMute(boolean on, String callingPackage); + void setRingerMode(int ringerMode); int getRingerMode();