Loading services/core/java/com/android/server/audio/AudioService.java +40 −37 Original line number Diff line number Diff line Loading @@ -226,6 +226,7 @@ public class AudioService extends IAudioService.Stub private final AudioSystemAdapter mAudioSystem; private final SystemServerAdapter mSystemServer; private final SettingsAdapter mSettings; /** Debug audio mode */ protected static final boolean DEBUG_MODE = false; Loading Loading @@ -876,11 +877,12 @@ public class AudioService extends IAudioService.Stub /** @hide */ public AudioService(Context context) { this(context, AudioSystemAdapter.getDefaultAdapter(), SystemServerAdapter.getDefaultAdapter(context)); SystemServerAdapter.getDefaultAdapter(context), SettingsAdapter.getDefaultAdapter()); } public AudioService(Context context, AudioSystemAdapter audioSystem, SystemServerAdapter systemServer) { SystemServerAdapter systemServer, SettingsAdapter settings) { sLifecycleLogger.log(new AudioEventLogger.StringEvent("AudioService()")); mContext = context; mContentResolver = context.getContentResolver(); Loading @@ -888,6 +890,7 @@ public class AudioService extends IAudioService.Stub mAudioSystem = audioSystem; mSystemServer = systemServer; mSettings = settings; mPlatformType = AudioSystem.getPlatformType(context); Loading Loading @@ -1024,7 +1027,7 @@ public class AudioService extends IAudioService.Stub new String("AudioService ctor"), 0); mSafeMediaVolumeState = Settings.Global.getInt(mContentResolver, mSafeMediaVolumeState = mSettings.getGlobalInt(mContentResolver, Settings.Global.AUDIO_SAFE_VOLUME_STATE, SAFE_MEDIA_VOLUME_NOT_CONFIGURED); // The default safe volume index read here will be replaced by the actual value when Loading Loading @@ -2009,7 +2012,7 @@ public class AudioService extends IAudioService.Stub private void readDockAudioSettings(ContentResolver cr) { mDockAudioMediaEnabled = Settings.Global.getInt( mDockAudioMediaEnabled = mSettings.getGlobalInt( cr, Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 0) == 1; sendMsg(mAudioHandler, Loading @@ -2025,7 +2028,7 @@ public class AudioService extends IAudioService.Stub private void updateMasterMono(ContentResolver cr) { final boolean masterMono = System.getIntForUser( final boolean masterMono = mSettings.getSystemIntForUser( cr, System.MASTER_MONO, 0 /* default */, UserHandle.USER_CURRENT) == 1; if (DEBUG_VOL) { Log.d(TAG, String.format("Master mono %b", masterMono)); Loading @@ -2046,7 +2049,7 @@ public class AudioService extends IAudioService.Stub private void sendEncodedSurroundMode(ContentResolver cr, String eventSource) { final int encodedSurroundMode = Settings.Global.getInt( final int encodedSurroundMode = mSettings.getGlobalInt( cr, Settings.Global.ENCODED_SURROUND_OUTPUT, Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO); sendEncodedSurroundMode(encodedSurroundMode, eventSource); Loading Loading @@ -2162,7 +2165,7 @@ public class AudioService extends IAudioService.Stub final long token = Binder.clearCallingIdentity(); try { synchronized (mSettingsLock) { Settings.Global.putString(mContentResolver, mSettings.putGlobalString(mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS, TextUtils.join(",", enabledFormats)); } Loading @@ -2183,7 +2186,7 @@ public class AudioService extends IAudioService.Stub final long token = Binder.clearCallingIdentity(); try { synchronized (mSettingsLock) { Settings.Global.putInt(mContentResolver, mSettings.putGlobalInt(mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, toEncodedSurroundSetting(mode)); } Loading @@ -2204,7 +2207,7 @@ public class AudioService extends IAudioService.Stub final long token = Binder.clearCallingIdentity(); try { synchronized (mSettingsLock) { int encodedSurroundSetting = Settings.Global.getInt(mContentResolver, int encodedSurroundSetting = mSettings.getGlobalInt(mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, AudioManager.ENCODED_SURROUND_OUTPUT_AUTO); return toEncodedSurroundOutputMode(encodedSurroundSetting, targetSdkVersion); Loading @@ -2217,7 +2220,7 @@ public class AudioService extends IAudioService.Stub /** @return the formats that are enabled in global settings */ private HashSet<Integer> getEnabledFormats() { HashSet<Integer> formats = new HashSet<>(); String enabledFormats = Settings.Global.getString(mContentResolver, String enabledFormats = mSettings.getGlobalString(mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS); if (enabledFormats != null) { try { Loading Loading @@ -2280,7 +2283,7 @@ public class AudioService extends IAudioService.Stub // Manually enable surround formats only when the setting is in manual mode. return; } String enabledSurroundFormats = Settings.Global.getString( String enabledSurroundFormats = mSettings.getGlobalString( cr, Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS); if (enabledSurroundFormats == null) { // Never allow enabledSurroundFormats as a null, which could happen when Loading Loading @@ -2308,7 +2311,7 @@ public class AudioService extends IAudioService.Stub } // Set filtered surround formats to settings DB in case // there are invalid surround formats in original settings. Settings.Global.putString(mContext.getContentResolver(), mSettings.putGlobalString(mContext.getContentResolver(), Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS, TextUtils.join(",", formats)); sendMsg(mAudioHandler, MSG_ENABLE_SURROUND_FORMATS, SENDMSG_QUEUE, 0, 0, formats, 0); Loading Loading @@ -2336,11 +2339,11 @@ public class AudioService extends IAudioService.Stub packageName = mRoleObserver.getAssistantRoleHolder(); } if (TextUtils.isEmpty(packageName)) { String assistantName = Settings.Secure.getStringForUser( String assistantName = mSettings.getSecureStringForUser( mContentResolver, Settings.Secure.VOICE_INTERACTION_SERVICE, UserHandle.USER_CURRENT); if (TextUtils.isEmpty(assistantName)) { assistantName = Settings.Secure.getStringForUser( assistantName = mSettings.getSecureStringForUser( mContentResolver, Settings.Secure.ASSISTANT, UserHandle.USER_CURRENT); } Loading Loading @@ -2383,7 +2386,7 @@ public class AudioService extends IAudioService.Stub final ContentResolver cr = mContentResolver; int ringerModeFromSettings = Settings.Global.getInt( mSettings.getGlobalInt( cr, Settings.Global.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL); int ringerMode = ringerModeFromSettings; // validity check in case the settings are restored from a device with incompatible Loading @@ -2395,7 +2398,7 @@ public class AudioService extends IAudioService.Stub ringerMode = AudioManager.RINGER_MODE_SILENT; } if (ringerMode != ringerModeFromSettings) { Settings.Global.putInt(cr, Settings.Global.MODE_RINGER, ringerMode); mSettings.putGlobalInt(cr, Settings.Global.MODE_RINGER, ringerMode); } if (mUseFixedVolume || mIsSingleVolume) { ringerMode = AudioManager.RINGER_MODE_NORMAL; Loading Loading @@ -2427,7 +2430,7 @@ public class AudioService extends IAudioService.Stub AudioSystem.setRttEnabled(mRttEnabled); } mMuteAffectedStreams = System.getIntForUser(cr, mMuteAffectedStreams = mSettings.getSystemIntForUser(cr, System.MUTE_STREAMS_AFFECTED, AudioSystem.DEFAULT_MUTE_STREAMS_AFFECTED, UserHandle.USER_CURRENT); Loading Loading @@ -4480,7 +4483,7 @@ public class AudioService extends IAudioService.Stub int silenceRingerSetting = Settings.Secure.VOLUME_HUSH_OFF; if (mContext.getResources() .getBoolean(com.android.internal.R.bool.config_volumeHushGestureEnabled)) { silenceRingerSetting = Settings.Secure.getIntForUser(mContentResolver, silenceRingerSetting = mSettings.getSecureIntForUser(mContentResolver, Settings.Secure.VOLUME_HUSH_GESTURE, VOLUME_HUSH_OFF, UserHandle.USER_CURRENT); } Loading Loading @@ -5241,7 +5244,7 @@ public class AudioService extends IAudioService.Stub * Settings has an in memory cache, so this is fast. */ private boolean querySoundEffectsEnabled(int user) { return Settings.System.getIntForUser(getContentResolver(), return mSettings.getSystemIntForUser(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 0, user) != 0; } Loading Loading @@ -5326,7 +5329,7 @@ public class AudioService extends IAudioService.Stub checkMuteAffectedStreams(); synchronized (mSafeMediaVolumeStateLock) { mMusicActiveMs = MathUtils.constrain(Settings.Secure.getIntForUser(mContentResolver, mMusicActiveMs = MathUtils.constrain(mSettings.getSecureIntForUser(mContentResolver, Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS, 0, UserHandle.USER_CURRENT), 0, UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX); if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) { Loading Loading @@ -5968,7 +5971,7 @@ public class AudioService extends IAudioService.Stub @GuardedBy("mSettingsLock") private boolean updateRingerAndZenModeAffectedStreams() { boolean updatedZenModeAffectedStreams = updateZenModeAffectedStreams(); int ringerModeAffectedStreams = Settings.System.getIntForUser(mContentResolver, int ringerModeAffectedStreams = mSettings.getSystemIntForUser(mContentResolver, Settings.System.MODE_RINGER_STREAMS_AFFECTED, ((1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_NOTIFICATION)| (1 << AudioSystem.STREAM_SYSTEM)|(1 << AudioSystem.STREAM_SYSTEM_ENFORCED)), Loading @@ -5992,7 +5995,7 @@ public class AudioService extends IAudioService.Stub } if (ringerModeAffectedStreams != mRingerModeAffectedStreams) { Settings.System.putIntForUser(mContentResolver, mSettings.putSystemIntForUser(mContentResolver, Settings.System.MODE_RINGER_STREAMS_AFFECTED, ringerModeAffectedStreams, UserHandle.USER_CURRENT); Loading Loading @@ -6969,7 +6972,7 @@ public class AudioService extends IAudioService.Stub + ", device " + AudioSystem.getOutputDeviceName(device) + " and User=" + ActivityManager.getCurrentUser()); } boolean success = Settings.System.putIntForUser(mContentResolver, boolean success = mSettings.putSystemIntForUser(mContentResolver, getSettingNameForDevice(device), getIndex(device), UserHandle.USER_CURRENT); Loading @@ -6995,7 +6998,7 @@ public class AudioService extends IAudioService.Stub ? AudioSystem.DEFAULT_STREAM_VOLUME[mPublicStreamType] : -1; int index; String name = getSettingNameForDevice(device); index = Settings.System.getIntForUser( index = mSettings.getSystemIntForUser( mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT); if (index == -1) { continue; Loading Loading @@ -7244,7 +7247,7 @@ public class AudioService extends IAudioService.Stub index = defaultIndex; } else { String name = getSettingNameForDevice(device); index = Settings.System.getIntForUser( index = mSettings.getSystemIntForUser( mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT); } if (index == -1) { Loading Loading @@ -7781,7 +7784,7 @@ public class AudioService extends IAudioService.Stub return; } if (streamState.hasValidSettingsName()) { System.putIntForUser(mContentResolver, mSettings.putSystemIntForUser(mContentResolver, streamState.getSettingNameForDevice(device), (streamState.getIndex(device) + 5)/ 10, UserHandle.USER_CURRENT); Loading @@ -7792,11 +7795,11 @@ public class AudioService extends IAudioService.Stub if (mUseFixedVolume) { return; } Settings.Global.putInt(mContentResolver, Settings.Global.MODE_RINGER, ringerMode); mSettings.putGlobalInt(mContentResolver, Settings.Global.MODE_RINGER, ringerMode); } private void onPersistSafeVolumeState(int state) { Settings.Global.putInt(mContentResolver, mSettings.putGlobalInt(mContentResolver, Settings.Global.AUDIO_SAFE_VOLUME_STATE, state); } Loading Loading @@ -7940,7 +7943,7 @@ public class AudioService extends IAudioService.Stub case MSG_PERSIST_MUSIC_ACTIVE_MS: final int musicActiveMs = msg.arg1; Settings.Secure.putIntForUser(mContentResolver, mSettings.putSecureIntForUser(mContentResolver, Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS, musicActiveMs, UserHandle.USER_CURRENT); break; Loading Loading @@ -8081,12 +8084,12 @@ public class AudioService extends IAudioService.Stub mContentResolver.registerContentObserver(Settings.System.getUriFor( Settings.System.MASTER_BALANCE), false, this); mEncodedSurroundMode = Settings.Global.getInt( mEncodedSurroundMode = mSettings.getGlobalInt( mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO); mContentResolver.registerContentObserver(Settings.Global.getUriFor( Settings.Global.ENCODED_SURROUND_OUTPUT), false, this); mEnabledSurroundFormats = Settings.Global.getString( mEnabledSurroundFormats = mSettings.getGlobalString( mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS); mContentResolver.registerContentObserver(Settings.Global.getUriFor( Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS), false, this); Loading Loading @@ -8120,7 +8123,7 @@ public class AudioService extends IAudioService.Stub } private void updateEncodedSurroundOutput() { int newSurroundMode = Settings.Global.getInt( int newSurroundMode = mSettings.getGlobalInt( mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO); // Did it change? Loading Loading @@ -8663,13 +8666,13 @@ public class AudioService extends IAudioService.Stub } void onPersistSpatialAudioEnabled(boolean enabled) { Settings.Secure.putIntForUser(mContentResolver, mSettings.putSecureIntForUser(mContentResolver, Settings.Secure.SPATIAL_AUDIO_ENABLED, enabled ? 1 : 0, UserHandle.USER_CURRENT); } boolean isSpatialAudioEnabled() { return Settings.Secure.getIntForUser(mContentResolver, return mSettings.getSecureIntForUser(mContentResolver, Settings.Secure.SPATIAL_AUDIO_ENABLED, SPATIAL_AUDIO_ENABLED_DEFAULT ? 1 : 0, UserHandle.USER_CURRENT) == 1; } Loading Loading @@ -9806,7 +9809,7 @@ public class AudioService extends IAudioService.Stub } public void loadSettings(ContentResolver cr) { mLongPressTimeout = Settings.Secure.getIntForUser(cr, mLongPressTimeout = mSettings.getSecureIntForUser(cr, Settings.Secure.LONG_PRESS_TIMEOUT, 500, UserHandle.USER_CURRENT); } Loading Loading @@ -11430,7 +11433,7 @@ public class AudioService extends IAudioService.Stub } final long callingIdentity = Binder.clearCallingIdentity(); try { System.putIntForUser(mContentResolver, mSettings.putSystemIntForUser(mContentResolver, getSettingsNameForDeviceVolumeBehavior(deviceType), deviceVolumeBehavior, UserHandle.USER_CURRENT); Loading @@ -11441,7 +11444,7 @@ public class AudioService extends IAudioService.Stub @AudioManager.DeviceVolumeBehaviorState private int retrieveStoredDeviceVolumeBehavior(int deviceType) { return System.getIntForUser(mContentResolver, return mSettings.getSystemIntForUser(mContentResolver, getSettingsNameForDeviceVolumeBehavior(deviceType), AudioManager.DEVICE_VOLUME_BEHAVIOR_UNSET, UserHandle.USER_CURRENT); Loading services/core/java/com/android/server/audio/SettingsAdapter.java 0 → 100644 +92 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.audio; import android.content.ContentResolver; import android.provider.Settings; /** * Adapter for methods that read and write settings in android.provider.Settings. */ public class SettingsAdapter { public static SettingsAdapter getDefaultAdapter() { return new SettingsAdapter(); } /** * Wrapper methods for Settings.Global */ /** Wraps {@link Settings.Global#getInt(ContentResolver, String, int)} */ public int getGlobalInt(ContentResolver cr, String name, int def) { return Settings.Global.getInt(cr, name, def); } /** Wraps {@link Settings.Global#getString(ContentResolver, String)} */ public String getGlobalString(ContentResolver resolver, String name) { return Settings.Global.getString(resolver, name); } /** Wraps {@link Settings.Global#putInt(ContentResolver, String, int)} */ public boolean putGlobalInt(ContentResolver cr, String name, int value) { return Settings.Global.putInt(cr, name, value); } /** Wraps {@link Settings.Global#putString(ContentResolver, String, String)} */ public boolean putGlobalString(ContentResolver resolver, String name, String value) { return Settings.Global.putString(resolver, name, value); } /** * Wrapper methods for Settings.System */ /** Wraps {@link Settings.System#getIntForUser(ContentResolver, String, int, int)} */ public int getSystemIntForUser(ContentResolver cr, String name, int def, int userHandle) { return Settings.System.getIntForUser(cr, name, def, userHandle); } /** Wraps {@link Settings.System#putIntForUser(ContentResolver, String, int, int)} */ public boolean putSystemIntForUser(ContentResolver cr, String name, int value, int userHandle) { return Settings.System.putIntForUser(cr, name, value, userHandle); } /** * Wrapper methods for Settings.Secure */ /** Wraps {@link Settings.Secure#getIntForUser(ContentResolver, String, int, int)} */ public int getSecureIntForUser(ContentResolver cr, String name, int def, int userHandle) { return Settings.Secure.getIntForUser(cr, name, def, userHandle); } /** Wraps {@link Settings.Secure#getStringForUser(ContentResolver, String, int)} */ public String getSecureStringForUser(ContentResolver resolver, String name, int userHandle) { return Settings.Secure.getStringForUser(resolver, name, userHandle); } /** Wraps {@link Settings.Secure#putIntForUser(ContentResolver, String, int, int)} */ public boolean putSecureIntForUser(ContentResolver cr, String name, int value, int userHandle) { return Settings.Secure.putIntForUser(cr, name, value, userHandle); } /** Wraps {@link Settings.Secure#putStringForUser(ContentResolver, String, String, int)} */ public boolean putSecureStringForUser(ContentResolver cr, String name, String value, int userHandle) { return Settings.Secure.putStringForUser(cr, name, value, userHandle); } } services/tests/servicestests/AndroidManifest.xml +1 −1 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ android:name="android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD"/> <uses-permission android:name="android.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY" /> <uses-permission android:name="android.permission.READ_NEARBY_STREAMING_POLICY" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" /> <uses-permission android:name="android.permission.PACKAGE_VERIFICATION_AGENT" /> <queries> Loading services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java +4 −1 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ public class AudioServiceTest { private Context mContext; private AudioSystemAdapter mAudioSystem; @Spy private SystemServerAdapter mSpySystemServer; private SettingsAdapter mSettingsAdapter; // the class being unit-tested here private AudioService mAudioService; Loading @@ -59,7 +60,9 @@ public class AudioServiceTest { mContext = InstrumentationRegistry.getTargetContext(); mAudioSystem = new NoOpAudioSystemAdapter(); mSpySystemServer = spy(new NoOpSystemServerAdapter()); mAudioService = new AudioService(mContext, mAudioSystem, mSpySystemServer); mSettingsAdapter = new NoOpSettingsAdapter(); mAudioService = new AudioService(mContext, mAudioSystem, mSpySystemServer, mSettingsAdapter); } /** Loading services/tests/servicestests/src/com/android/server/audio/NoOpSettingsAdapter.java 0 → 100644 +102 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.audio; import android.content.ContentResolver; import java.util.HashMap; import java.util.Map; public class NoOpSettingsAdapter extends SettingsAdapter { /** * No-op methods for Settings.Global */ private Map<String, Integer> mGlobalIntSettings = new HashMap<>(); private Map<String, String> mGlobalStringSettings = new HashMap<>(); @Override public int getGlobalInt(ContentResolver cr, String name, int def) { return mGlobalIntSettings.getOrDefault(name, def); } @Override public String getGlobalString(ContentResolver resolver, String name) { return mGlobalStringSettings.getOrDefault(name, null); } @Override public boolean putGlobalInt(ContentResolver cr, String name, int value) { mGlobalIntSettings.put(name, value); return true; } @Override public boolean putGlobalString(ContentResolver resolver, String name, String value) { mGlobalStringSettings.put(name, value); return true; } /** * No-op methods for Settings.System */ private Map<String, Integer> mSystemIntSettings = new HashMap<>(); @Override public int getSystemIntForUser(ContentResolver cr, String name, int def, int userHandle) { return mSystemIntSettings.getOrDefault(name, def); } @Override public boolean putSystemIntForUser(ContentResolver cr, String name, int value, int userHandle) { mSystemIntSettings.put(name, value); return true; } /** * No-op methods for Settings.Secure */ private Map<String, Integer> mSecureIntSettings = new HashMap<>(); private Map<String, String> mSecureStringSettings = new HashMap<>(); @Override public int getSecureIntForUser(ContentResolver cr, String name, int def, int userHandle) { return mSecureIntSettings.getOrDefault(name, def); } @Override public String getSecureStringForUser(ContentResolver resolver, String name, int userHandle) { return mSecureStringSettings.getOrDefault(name, null); } @Override public boolean putSecureIntForUser(ContentResolver cr, String name, int value, int userHandle) { mSecureIntSettings.put(name, value); return true; } @Override public boolean putSecureStringForUser(ContentResolver cr, String name, String value, int userHandle) { mSecureStringSettings.put(name, value); return true; } } Loading
services/core/java/com/android/server/audio/AudioService.java +40 −37 Original line number Diff line number Diff line Loading @@ -226,6 +226,7 @@ public class AudioService extends IAudioService.Stub private final AudioSystemAdapter mAudioSystem; private final SystemServerAdapter mSystemServer; private final SettingsAdapter mSettings; /** Debug audio mode */ protected static final boolean DEBUG_MODE = false; Loading Loading @@ -876,11 +877,12 @@ public class AudioService extends IAudioService.Stub /** @hide */ public AudioService(Context context) { this(context, AudioSystemAdapter.getDefaultAdapter(), SystemServerAdapter.getDefaultAdapter(context)); SystemServerAdapter.getDefaultAdapter(context), SettingsAdapter.getDefaultAdapter()); } public AudioService(Context context, AudioSystemAdapter audioSystem, SystemServerAdapter systemServer) { SystemServerAdapter systemServer, SettingsAdapter settings) { sLifecycleLogger.log(new AudioEventLogger.StringEvent("AudioService()")); mContext = context; mContentResolver = context.getContentResolver(); Loading @@ -888,6 +890,7 @@ public class AudioService extends IAudioService.Stub mAudioSystem = audioSystem; mSystemServer = systemServer; mSettings = settings; mPlatformType = AudioSystem.getPlatformType(context); Loading Loading @@ -1024,7 +1027,7 @@ public class AudioService extends IAudioService.Stub new String("AudioService ctor"), 0); mSafeMediaVolumeState = Settings.Global.getInt(mContentResolver, mSafeMediaVolumeState = mSettings.getGlobalInt(mContentResolver, Settings.Global.AUDIO_SAFE_VOLUME_STATE, SAFE_MEDIA_VOLUME_NOT_CONFIGURED); // The default safe volume index read here will be replaced by the actual value when Loading Loading @@ -2009,7 +2012,7 @@ public class AudioService extends IAudioService.Stub private void readDockAudioSettings(ContentResolver cr) { mDockAudioMediaEnabled = Settings.Global.getInt( mDockAudioMediaEnabled = mSettings.getGlobalInt( cr, Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 0) == 1; sendMsg(mAudioHandler, Loading @@ -2025,7 +2028,7 @@ public class AudioService extends IAudioService.Stub private void updateMasterMono(ContentResolver cr) { final boolean masterMono = System.getIntForUser( final boolean masterMono = mSettings.getSystemIntForUser( cr, System.MASTER_MONO, 0 /* default */, UserHandle.USER_CURRENT) == 1; if (DEBUG_VOL) { Log.d(TAG, String.format("Master mono %b", masterMono)); Loading @@ -2046,7 +2049,7 @@ public class AudioService extends IAudioService.Stub private void sendEncodedSurroundMode(ContentResolver cr, String eventSource) { final int encodedSurroundMode = Settings.Global.getInt( final int encodedSurroundMode = mSettings.getGlobalInt( cr, Settings.Global.ENCODED_SURROUND_OUTPUT, Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO); sendEncodedSurroundMode(encodedSurroundMode, eventSource); Loading Loading @@ -2162,7 +2165,7 @@ public class AudioService extends IAudioService.Stub final long token = Binder.clearCallingIdentity(); try { synchronized (mSettingsLock) { Settings.Global.putString(mContentResolver, mSettings.putGlobalString(mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS, TextUtils.join(",", enabledFormats)); } Loading @@ -2183,7 +2186,7 @@ public class AudioService extends IAudioService.Stub final long token = Binder.clearCallingIdentity(); try { synchronized (mSettingsLock) { Settings.Global.putInt(mContentResolver, mSettings.putGlobalInt(mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, toEncodedSurroundSetting(mode)); } Loading @@ -2204,7 +2207,7 @@ public class AudioService extends IAudioService.Stub final long token = Binder.clearCallingIdentity(); try { synchronized (mSettingsLock) { int encodedSurroundSetting = Settings.Global.getInt(mContentResolver, int encodedSurroundSetting = mSettings.getGlobalInt(mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, AudioManager.ENCODED_SURROUND_OUTPUT_AUTO); return toEncodedSurroundOutputMode(encodedSurroundSetting, targetSdkVersion); Loading @@ -2217,7 +2220,7 @@ public class AudioService extends IAudioService.Stub /** @return the formats that are enabled in global settings */ private HashSet<Integer> getEnabledFormats() { HashSet<Integer> formats = new HashSet<>(); String enabledFormats = Settings.Global.getString(mContentResolver, String enabledFormats = mSettings.getGlobalString(mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS); if (enabledFormats != null) { try { Loading Loading @@ -2280,7 +2283,7 @@ public class AudioService extends IAudioService.Stub // Manually enable surround formats only when the setting is in manual mode. return; } String enabledSurroundFormats = Settings.Global.getString( String enabledSurroundFormats = mSettings.getGlobalString( cr, Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS); if (enabledSurroundFormats == null) { // Never allow enabledSurroundFormats as a null, which could happen when Loading Loading @@ -2308,7 +2311,7 @@ public class AudioService extends IAudioService.Stub } // Set filtered surround formats to settings DB in case // there are invalid surround formats in original settings. Settings.Global.putString(mContext.getContentResolver(), mSettings.putGlobalString(mContext.getContentResolver(), Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS, TextUtils.join(",", formats)); sendMsg(mAudioHandler, MSG_ENABLE_SURROUND_FORMATS, SENDMSG_QUEUE, 0, 0, formats, 0); Loading Loading @@ -2336,11 +2339,11 @@ public class AudioService extends IAudioService.Stub packageName = mRoleObserver.getAssistantRoleHolder(); } if (TextUtils.isEmpty(packageName)) { String assistantName = Settings.Secure.getStringForUser( String assistantName = mSettings.getSecureStringForUser( mContentResolver, Settings.Secure.VOICE_INTERACTION_SERVICE, UserHandle.USER_CURRENT); if (TextUtils.isEmpty(assistantName)) { assistantName = Settings.Secure.getStringForUser( assistantName = mSettings.getSecureStringForUser( mContentResolver, Settings.Secure.ASSISTANT, UserHandle.USER_CURRENT); } Loading Loading @@ -2383,7 +2386,7 @@ public class AudioService extends IAudioService.Stub final ContentResolver cr = mContentResolver; int ringerModeFromSettings = Settings.Global.getInt( mSettings.getGlobalInt( cr, Settings.Global.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL); int ringerMode = ringerModeFromSettings; // validity check in case the settings are restored from a device with incompatible Loading @@ -2395,7 +2398,7 @@ public class AudioService extends IAudioService.Stub ringerMode = AudioManager.RINGER_MODE_SILENT; } if (ringerMode != ringerModeFromSettings) { Settings.Global.putInt(cr, Settings.Global.MODE_RINGER, ringerMode); mSettings.putGlobalInt(cr, Settings.Global.MODE_RINGER, ringerMode); } if (mUseFixedVolume || mIsSingleVolume) { ringerMode = AudioManager.RINGER_MODE_NORMAL; Loading Loading @@ -2427,7 +2430,7 @@ public class AudioService extends IAudioService.Stub AudioSystem.setRttEnabled(mRttEnabled); } mMuteAffectedStreams = System.getIntForUser(cr, mMuteAffectedStreams = mSettings.getSystemIntForUser(cr, System.MUTE_STREAMS_AFFECTED, AudioSystem.DEFAULT_MUTE_STREAMS_AFFECTED, UserHandle.USER_CURRENT); Loading Loading @@ -4480,7 +4483,7 @@ public class AudioService extends IAudioService.Stub int silenceRingerSetting = Settings.Secure.VOLUME_HUSH_OFF; if (mContext.getResources() .getBoolean(com.android.internal.R.bool.config_volumeHushGestureEnabled)) { silenceRingerSetting = Settings.Secure.getIntForUser(mContentResolver, silenceRingerSetting = mSettings.getSecureIntForUser(mContentResolver, Settings.Secure.VOLUME_HUSH_GESTURE, VOLUME_HUSH_OFF, UserHandle.USER_CURRENT); } Loading Loading @@ -5241,7 +5244,7 @@ public class AudioService extends IAudioService.Stub * Settings has an in memory cache, so this is fast. */ private boolean querySoundEffectsEnabled(int user) { return Settings.System.getIntForUser(getContentResolver(), return mSettings.getSystemIntForUser(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 0, user) != 0; } Loading Loading @@ -5326,7 +5329,7 @@ public class AudioService extends IAudioService.Stub checkMuteAffectedStreams(); synchronized (mSafeMediaVolumeStateLock) { mMusicActiveMs = MathUtils.constrain(Settings.Secure.getIntForUser(mContentResolver, mMusicActiveMs = MathUtils.constrain(mSettings.getSecureIntForUser(mContentResolver, Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS, 0, UserHandle.USER_CURRENT), 0, UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX); if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) { Loading Loading @@ -5968,7 +5971,7 @@ public class AudioService extends IAudioService.Stub @GuardedBy("mSettingsLock") private boolean updateRingerAndZenModeAffectedStreams() { boolean updatedZenModeAffectedStreams = updateZenModeAffectedStreams(); int ringerModeAffectedStreams = Settings.System.getIntForUser(mContentResolver, int ringerModeAffectedStreams = mSettings.getSystemIntForUser(mContentResolver, Settings.System.MODE_RINGER_STREAMS_AFFECTED, ((1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_NOTIFICATION)| (1 << AudioSystem.STREAM_SYSTEM)|(1 << AudioSystem.STREAM_SYSTEM_ENFORCED)), Loading @@ -5992,7 +5995,7 @@ public class AudioService extends IAudioService.Stub } if (ringerModeAffectedStreams != mRingerModeAffectedStreams) { Settings.System.putIntForUser(mContentResolver, mSettings.putSystemIntForUser(mContentResolver, Settings.System.MODE_RINGER_STREAMS_AFFECTED, ringerModeAffectedStreams, UserHandle.USER_CURRENT); Loading Loading @@ -6969,7 +6972,7 @@ public class AudioService extends IAudioService.Stub + ", device " + AudioSystem.getOutputDeviceName(device) + " and User=" + ActivityManager.getCurrentUser()); } boolean success = Settings.System.putIntForUser(mContentResolver, boolean success = mSettings.putSystemIntForUser(mContentResolver, getSettingNameForDevice(device), getIndex(device), UserHandle.USER_CURRENT); Loading @@ -6995,7 +6998,7 @@ public class AudioService extends IAudioService.Stub ? AudioSystem.DEFAULT_STREAM_VOLUME[mPublicStreamType] : -1; int index; String name = getSettingNameForDevice(device); index = Settings.System.getIntForUser( index = mSettings.getSystemIntForUser( mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT); if (index == -1) { continue; Loading Loading @@ -7244,7 +7247,7 @@ public class AudioService extends IAudioService.Stub index = defaultIndex; } else { String name = getSettingNameForDevice(device); index = Settings.System.getIntForUser( index = mSettings.getSystemIntForUser( mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT); } if (index == -1) { Loading Loading @@ -7781,7 +7784,7 @@ public class AudioService extends IAudioService.Stub return; } if (streamState.hasValidSettingsName()) { System.putIntForUser(mContentResolver, mSettings.putSystemIntForUser(mContentResolver, streamState.getSettingNameForDevice(device), (streamState.getIndex(device) + 5)/ 10, UserHandle.USER_CURRENT); Loading @@ -7792,11 +7795,11 @@ public class AudioService extends IAudioService.Stub if (mUseFixedVolume) { return; } Settings.Global.putInt(mContentResolver, Settings.Global.MODE_RINGER, ringerMode); mSettings.putGlobalInt(mContentResolver, Settings.Global.MODE_RINGER, ringerMode); } private void onPersistSafeVolumeState(int state) { Settings.Global.putInt(mContentResolver, mSettings.putGlobalInt(mContentResolver, Settings.Global.AUDIO_SAFE_VOLUME_STATE, state); } Loading Loading @@ -7940,7 +7943,7 @@ public class AudioService extends IAudioService.Stub case MSG_PERSIST_MUSIC_ACTIVE_MS: final int musicActiveMs = msg.arg1; Settings.Secure.putIntForUser(mContentResolver, mSettings.putSecureIntForUser(mContentResolver, Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS, musicActiveMs, UserHandle.USER_CURRENT); break; Loading Loading @@ -8081,12 +8084,12 @@ public class AudioService extends IAudioService.Stub mContentResolver.registerContentObserver(Settings.System.getUriFor( Settings.System.MASTER_BALANCE), false, this); mEncodedSurroundMode = Settings.Global.getInt( mEncodedSurroundMode = mSettings.getGlobalInt( mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO); mContentResolver.registerContentObserver(Settings.Global.getUriFor( Settings.Global.ENCODED_SURROUND_OUTPUT), false, this); mEnabledSurroundFormats = Settings.Global.getString( mEnabledSurroundFormats = mSettings.getGlobalString( mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS); mContentResolver.registerContentObserver(Settings.Global.getUriFor( Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS), false, this); Loading Loading @@ -8120,7 +8123,7 @@ public class AudioService extends IAudioService.Stub } private void updateEncodedSurroundOutput() { int newSurroundMode = Settings.Global.getInt( int newSurroundMode = mSettings.getGlobalInt( mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT, Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO); // Did it change? Loading Loading @@ -8663,13 +8666,13 @@ public class AudioService extends IAudioService.Stub } void onPersistSpatialAudioEnabled(boolean enabled) { Settings.Secure.putIntForUser(mContentResolver, mSettings.putSecureIntForUser(mContentResolver, Settings.Secure.SPATIAL_AUDIO_ENABLED, enabled ? 1 : 0, UserHandle.USER_CURRENT); } boolean isSpatialAudioEnabled() { return Settings.Secure.getIntForUser(mContentResolver, return mSettings.getSecureIntForUser(mContentResolver, Settings.Secure.SPATIAL_AUDIO_ENABLED, SPATIAL_AUDIO_ENABLED_DEFAULT ? 1 : 0, UserHandle.USER_CURRENT) == 1; } Loading Loading @@ -9806,7 +9809,7 @@ public class AudioService extends IAudioService.Stub } public void loadSettings(ContentResolver cr) { mLongPressTimeout = Settings.Secure.getIntForUser(cr, mLongPressTimeout = mSettings.getSecureIntForUser(cr, Settings.Secure.LONG_PRESS_TIMEOUT, 500, UserHandle.USER_CURRENT); } Loading Loading @@ -11430,7 +11433,7 @@ public class AudioService extends IAudioService.Stub } final long callingIdentity = Binder.clearCallingIdentity(); try { System.putIntForUser(mContentResolver, mSettings.putSystemIntForUser(mContentResolver, getSettingsNameForDeviceVolumeBehavior(deviceType), deviceVolumeBehavior, UserHandle.USER_CURRENT); Loading @@ -11441,7 +11444,7 @@ public class AudioService extends IAudioService.Stub @AudioManager.DeviceVolumeBehaviorState private int retrieveStoredDeviceVolumeBehavior(int deviceType) { return System.getIntForUser(mContentResolver, return mSettings.getSystemIntForUser(mContentResolver, getSettingsNameForDeviceVolumeBehavior(deviceType), AudioManager.DEVICE_VOLUME_BEHAVIOR_UNSET, UserHandle.USER_CURRENT); Loading
services/core/java/com/android/server/audio/SettingsAdapter.java 0 → 100644 +92 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.audio; import android.content.ContentResolver; import android.provider.Settings; /** * Adapter for methods that read and write settings in android.provider.Settings. */ public class SettingsAdapter { public static SettingsAdapter getDefaultAdapter() { return new SettingsAdapter(); } /** * Wrapper methods for Settings.Global */ /** Wraps {@link Settings.Global#getInt(ContentResolver, String, int)} */ public int getGlobalInt(ContentResolver cr, String name, int def) { return Settings.Global.getInt(cr, name, def); } /** Wraps {@link Settings.Global#getString(ContentResolver, String)} */ public String getGlobalString(ContentResolver resolver, String name) { return Settings.Global.getString(resolver, name); } /** Wraps {@link Settings.Global#putInt(ContentResolver, String, int)} */ public boolean putGlobalInt(ContentResolver cr, String name, int value) { return Settings.Global.putInt(cr, name, value); } /** Wraps {@link Settings.Global#putString(ContentResolver, String, String)} */ public boolean putGlobalString(ContentResolver resolver, String name, String value) { return Settings.Global.putString(resolver, name, value); } /** * Wrapper methods for Settings.System */ /** Wraps {@link Settings.System#getIntForUser(ContentResolver, String, int, int)} */ public int getSystemIntForUser(ContentResolver cr, String name, int def, int userHandle) { return Settings.System.getIntForUser(cr, name, def, userHandle); } /** Wraps {@link Settings.System#putIntForUser(ContentResolver, String, int, int)} */ public boolean putSystemIntForUser(ContentResolver cr, String name, int value, int userHandle) { return Settings.System.putIntForUser(cr, name, value, userHandle); } /** * Wrapper methods for Settings.Secure */ /** Wraps {@link Settings.Secure#getIntForUser(ContentResolver, String, int, int)} */ public int getSecureIntForUser(ContentResolver cr, String name, int def, int userHandle) { return Settings.Secure.getIntForUser(cr, name, def, userHandle); } /** Wraps {@link Settings.Secure#getStringForUser(ContentResolver, String, int)} */ public String getSecureStringForUser(ContentResolver resolver, String name, int userHandle) { return Settings.Secure.getStringForUser(resolver, name, userHandle); } /** Wraps {@link Settings.Secure#putIntForUser(ContentResolver, String, int, int)} */ public boolean putSecureIntForUser(ContentResolver cr, String name, int value, int userHandle) { return Settings.Secure.putIntForUser(cr, name, value, userHandle); } /** Wraps {@link Settings.Secure#putStringForUser(ContentResolver, String, String, int)} */ public boolean putSecureStringForUser(ContentResolver cr, String name, String value, int userHandle) { return Settings.Secure.putStringForUser(cr, name, value, userHandle); } }
services/tests/servicestests/AndroidManifest.xml +1 −1 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ android:name="android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD"/> <uses-permission android:name="android.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY" /> <uses-permission android:name="android.permission.READ_NEARBY_STREAMING_POLICY" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" /> <uses-permission android:name="android.permission.PACKAGE_VERIFICATION_AGENT" /> <queries> Loading
services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java +4 −1 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ public class AudioServiceTest { private Context mContext; private AudioSystemAdapter mAudioSystem; @Spy private SystemServerAdapter mSpySystemServer; private SettingsAdapter mSettingsAdapter; // the class being unit-tested here private AudioService mAudioService; Loading @@ -59,7 +60,9 @@ public class AudioServiceTest { mContext = InstrumentationRegistry.getTargetContext(); mAudioSystem = new NoOpAudioSystemAdapter(); mSpySystemServer = spy(new NoOpSystemServerAdapter()); mAudioService = new AudioService(mContext, mAudioSystem, mSpySystemServer); mSettingsAdapter = new NoOpSettingsAdapter(); mAudioService = new AudioService(mContext, mAudioSystem, mSpySystemServer, mSettingsAdapter); } /** Loading
services/tests/servicestests/src/com/android/server/audio/NoOpSettingsAdapter.java 0 → 100644 +102 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.audio; import android.content.ContentResolver; import java.util.HashMap; import java.util.Map; public class NoOpSettingsAdapter extends SettingsAdapter { /** * No-op methods for Settings.Global */ private Map<String, Integer> mGlobalIntSettings = new HashMap<>(); private Map<String, String> mGlobalStringSettings = new HashMap<>(); @Override public int getGlobalInt(ContentResolver cr, String name, int def) { return mGlobalIntSettings.getOrDefault(name, def); } @Override public String getGlobalString(ContentResolver resolver, String name) { return mGlobalStringSettings.getOrDefault(name, null); } @Override public boolean putGlobalInt(ContentResolver cr, String name, int value) { mGlobalIntSettings.put(name, value); return true; } @Override public boolean putGlobalString(ContentResolver resolver, String name, String value) { mGlobalStringSettings.put(name, value); return true; } /** * No-op methods for Settings.System */ private Map<String, Integer> mSystemIntSettings = new HashMap<>(); @Override public int getSystemIntForUser(ContentResolver cr, String name, int def, int userHandle) { return mSystemIntSettings.getOrDefault(name, def); } @Override public boolean putSystemIntForUser(ContentResolver cr, String name, int value, int userHandle) { mSystemIntSettings.put(name, value); return true; } /** * No-op methods for Settings.Secure */ private Map<String, Integer> mSecureIntSettings = new HashMap<>(); private Map<String, String> mSecureStringSettings = new HashMap<>(); @Override public int getSecureIntForUser(ContentResolver cr, String name, int def, int userHandle) { return mSecureIntSettings.getOrDefault(name, def); } @Override public String getSecureStringForUser(ContentResolver resolver, String name, int userHandle) { return mSecureStringSettings.getOrDefault(name, null); } @Override public boolean putSecureIntForUser(ContentResolver cr, String name, int value, int userHandle) { mSecureIntSettings.put(name, value); return true; } @Override public boolean putSecureStringForUser(ContentResolver cr, String name, String value, int userHandle) { mSecureStringSettings.put(name, value); return true; } }