Changed user check for play sound effect API

Changed the way the user is checked for audio manager play sound effect
API. Instead of capturing the process user, the current user is used
to determined if the audio should be played. Also moved the should
sound play check to audio service, as the check requires interact
across users permission, instead of adding permission to the API
this can be faciliated in the audio service.

Bug: 165038414
Test: atest AudioManagerTest#testSoundEffects
Test: atest AudioManagerTest#
	testCheckingZenModeBlockDoesNotRequireNotificationPolicyAccess
Test: atest VolumeDialogControllerImplTest
Test: manually disable audio effect sounds settings and play audio
NoNonSdkCheck: IAudioService#playSoundEffect is internal API
Change-Id: Ib0e3001fd76e3a5fdd831551d16f091029d03422
This commit is contained in:
Oscar Azucena
2021-10-26 18:06:54 -07:00
parent c2c3eee8b7
commit 21f2c4d59a
4 changed files with 18 additions and 34 deletions

View File

@@ -55,12 +55,10 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
@@ -3508,20 +3506,7 @@ public class AudioManager {
* whether sounds are heard or not.
*/
public void playSoundEffect(@SystemSoundEffect int effectType) {
if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) {
return;
}
if (!querySoundEffectsEnabled(Process.myUserHandle().getIdentifier())) {
return;
}
final IAudioService service = getService();
try {
service.playSoundEffect(effectType);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
playSoundEffect(effectType, UserHandle.USER_CURRENT);
}
/**
@@ -3537,13 +3522,9 @@ public class AudioManager {
return;
}
if (!querySoundEffectsEnabled(userId)) {
return;
}
final IAudioService service = getService();
try {
service.playSoundEffect(effectType);
service.playSoundEffect(effectType, userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -3571,14 +3552,6 @@ public class AudioManager {
}
}
/**
* Settings has an in memory cache, so this is fast.
*/
private boolean querySoundEffectsEnabled(int user) {
return Settings.System.getIntForUser(getContext().getContentResolver(),
Settings.System.SOUND_EFFECTS_ENABLED, 0, user) != 0;
}
/**
* Load Sound effects.
* This method must be called when sound effects are enabled.

View File

@@ -158,7 +158,7 @@ interface IAudioService {
int getMode();
oneway void playSoundEffect(int effectType);
oneway void playSoundEffect(int effectType, int userId);
oneway void playSoundEffectVolume(int effectType, float volume);

View File

@@ -377,7 +377,8 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
private void playTouchFeedback() {
if (System.currentTimeMillis() - mLastToggledRingerOn < TOUCH_FEEDBACK_TIMEOUT_MS) {
try {
mAudioService.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
mAudioService.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD,
UserHandle.USER_CURRENT);
} catch (RemoteException e) {
// ignore
}

View File

@@ -5013,9 +5013,19 @@ public class AudioService extends IAudioService.Stub
}
}
/** @see AudioManager#playSoundEffect(int) */
public void playSoundEffect(int effectType) {
playSoundEffectVolume(effectType, -1.0f);
/** @see AudioManager#playSoundEffect(int, int) */
public void playSoundEffect(int effectType, int userId) {
if (querySoundEffectsEnabled(userId)) {
playSoundEffectVolume(effectType, -1.0f);
}
}
/**
* Settings has an in memory cache, so this is fast.
*/
private boolean querySoundEffectsEnabled(int user) {
return Settings.System.getIntForUser(getContentResolver(),
Settings.System.SOUND_EFFECTS_ENABLED, 0, user) != 0;
}
/** @see AudioManager#playSoundEffect(int, float) */