AudioService: evaluate permissions for min stream index

Make AudioManager.getStreamMinVolume(stream) return the lowest
index the caller of this API can set or adjust the volume to
based on the caller's permissions.

Bug: 137015603
Bug: 157319908
Test: atest CtsMediaTestCases:android.media.cts.AudioManagerTest#testVolume
Change-Id: Ie306bd652c2b5ab4d789cafbb141ea530fb1e650
This commit is contained in:
Jean-Michel Trivi
2020-05-27 19:31:58 -07:00
parent 2046776127
commit b2949c77e3

View File

@@ -109,6 +109,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
@@ -3186,10 +3187,17 @@ public class AudioService extends IAudioService.Stub
return (mStreamStates[streamType].getMaxIndex() + 5) / 10;
}
/** @see AudioManager#getStreamMinVolumeInt(int) */
/** @see AudioManager#getStreamMinVolumeInt(int)
* Part of service interface, check permissions here */
public int getStreamMinVolume(int streamType) {
ensureValidStreamType(streamType);
return (mStreamStates[streamType].getMinIndex() + 5) / 10;
final boolean isPrivileged =
Binder.getCallingUid() == Process.SYSTEM_UID
|| (mContext.checkCallingPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS)
== PackageManager.PERMISSION_GRANTED)
|| (mContext.checkCallingPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
== PackageManager.PERMISSION_GRANTED);
return (mStreamStates[streamType].getMinIndex(isPrivileged) + 5) / 10;
}
/** Get last audible volume before stream was muted. */
@@ -5790,10 +5798,22 @@ public class AudioService extends IAudioService.Stub
return mIndexMax;
}
/**
* @return the lowest index regardless of permissions
*/
public int getMinIndex() {
return mIndexMin;
}
/**
* @param isPrivileged true if the caller is privileged and not subject to minimum
* volume index thresholds
* @return the lowest index that this caller can set or adjust to
*/
public int getMinIndex(boolean isPrivileged) {
return isPrivileged ? mIndexMin : mIndexMinNoPerm;
}
/**
* Copies all device/index pairs from the given VolumeStreamState after initializing
* them with the volume for DEVICE_OUT_DEFAULT. No-op if the source VolumeStreamState