diff options
5 files changed, 94 insertions, 13 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 7a6a1e9..cc50d8a 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1043,4 +1043,9 @@ <!-- Apps that are authorized to access shared accounts, overridden by product overlays --> <string name="config_appsAuthorizedForSharedAccounts"></string> + + <!-- Flag indicating that the media framework should not allow changes or mute on any + stream or master volumes. --> + <bool name="config_useFixedVolume">false</bool> + </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 80e77dd..81baaf8 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -277,6 +277,7 @@ <java-symbol type="bool" name="config_camera_sound_forced" /> <java-symbol type="bool" name="config_dontPreferApn" /> <java-symbol type="bool" name="config_speed_up_audio_on_mt_calls" /> + <java-symbol type="bool" name="config_useFixedVolume" /> <java-symbol type="integer" name="config_cursorWindowSize" /> <java-symbol type="integer" name="config_longPressOnPowerBehavior" /> diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 47c70f8..18f3b1e 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -257,6 +257,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { }; private int[] mStreamVolumeAlias; + private final boolean mUseFixedVolume; + // stream names used by dumpStreamStates() private final String[] STREAM_NAMES = new String[] { "STREAM_VOICE_CALL", @@ -487,6 +489,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished { mSafeMediaVolumeIndex = mContext.getResources().getInteger( com.android.internal.R.integer.config_safe_media_volume_index) * 10; + mUseFixedVolume = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_useFixedVolume); + readPersistedSettings(); mSettingsObserver = new SettingsObserver(); updateStreamVolumeAlias(false /*updateVolumes*/); @@ -678,6 +683,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished { if (ringerMode != ringerModeFromSettings) { Settings.Global.putInt(cr, Settings.Global.MODE_RINGER, ringerMode); } + if (mUseFixedVolume) { + ringerMode = AudioManager.RINGER_MODE_NORMAL; + } synchronized(mSettingsLock) { mRingerMode = ringerMode; @@ -736,6 +744,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished { boolean masterMute = System.getIntForUser(cr, System.VOLUME_MASTER_MUTE, 0, UserHandle.USER_CURRENT) == 1; + if (mUseFixedVolume) { + masterMute = false; + AudioSystem.setMasterVolume(1.0f); + } AudioSystem.setMasterMute(masterMute); broadcastMasterMuteStatus(masterMute); @@ -806,6 +818,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished { /** @see AudioManager#adjustStreamVolume(int, int, int) */ public void adjustStreamVolume(int streamType, int direction, int flags) { + if (mUseFixedVolume) { + return; + } if (DEBUG_VOL) Log.d(TAG, "adjustStreamVolume() stream="+streamType+", dir="+direction); ensureValidDirection(direction); @@ -918,6 +933,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished { /** @see AudioManager#adjustMasterVolume(int, int) */ public void adjustMasterVolume(int steps, int flags) { + if (mUseFixedVolume) { + return; + } ensureValidSteps(steps); int volume = Math.round(AudioSystem.getMasterVolume() * MAX_MASTER_VOLUME); int delta = 0; @@ -972,6 +990,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished { /** @see AudioManager#setStreamVolume(int, int, int) */ public void setStreamVolume(int streamType, int index, int flags) { + if (mUseFixedVolume) { + return; + } + ensureValidStreamType(streamType); VolumeStreamState streamState = mStreamStates[mStreamVolumeAlias[streamType]]; @@ -1214,6 +1236,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished { /** @see AudioManager#setStreamSolo(int, boolean) */ public void setStreamSolo(int streamType, boolean state, IBinder cb) { + if (mUseFixedVolume) { + return; + } + for (int stream = 0; stream < mStreamStates.length; stream++) { if (!isStreamAffectedByMute(stream) || stream == streamType) continue; // Bring back last audible volume @@ -1223,6 +1249,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished { /** @see AudioManager#setStreamMute(int, boolean) */ public void setStreamMute(int streamType, boolean state, IBinder cb) { + if (mUseFixedVolume) { + return; + } + if (isStreamAffectedByMute(streamType)) { mStreamStates[streamType].mute(cb, state); } @@ -1235,6 +1265,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished { /** @see AudioManager#setMasterMute(boolean, int) */ public void setMasterMute(boolean state, int flags, IBinder cb) { + if (mUseFixedVolume) { + return; + } + if (state != AudioSystem.getMasterMute()) { AudioSystem.setMasterMute(state); // Post a persist master volume msg @@ -1268,6 +1302,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } public void setMasterVolume(int volume, int flags) { + if (mUseFixedVolume) { + return; + } + if (volume < 0) { volume = 0; } else if (volume > MAX_MASTER_VOLUME) { @@ -1339,6 +1377,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished { /** @see AudioManager#setRingerMode(int) */ public void setRingerMode(int ringerMode) { + if (mUseFixedVolume) { + return; + } + if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) { ringerMode = AudioManager.RINGER_MODE_SILENT; } @@ -1398,6 +1440,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } private void restoreMasterVolume() { + if (mUseFixedVolume) { + AudioSystem.setMasterVolume(1.0f); + return; + } if (mUseMasterVolume) { float volume = Settings.System.getFloatForUser(mContentResolver, Settings.System.VOLUME_MASTER, -1.0f, UserHandle.USER_CURRENT); @@ -1951,8 +1997,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { streamState.readSettings(); // unmute stream that was muted but is not affect by mute anymore - if (streamState.muteCount() != 0 && !isStreamAffectedByMute(streamType) && - !isStreamMutedByRingerMode(streamType)) { + if (streamState.muteCount() != 0 && ((!isStreamAffectedByMute(streamType) && + !isStreamMutedByRingerMode(streamType)) || mUseFixedVolume)) { int size = streamState.mDeathHandlers.size(); for (int i = 0; i < size; i++) { streamState.mDeathHandlers.get(i).mMuteCount = 1; @@ -2833,8 +2879,12 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } public synchronized void readSettings() { - int remainingDevices = AudioSystem.DEVICE_OUT_ALL; - + // force maximum volume on all streams if fixed volume property is set + if (mUseFixedVolume) { + mIndex.put(AudioSystem.DEVICE_OUT_DEFAULT, mIndexMax); + mLastAudibleIndex.put(AudioSystem.DEVICE_OUT_DEFAULT, mIndexMax); + return; + } // do not read system stream volume from settings: this stream is always aliased // to another stream type and its volume is never persisted. Values in settings can // only be stale values @@ -2855,6 +2905,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { return; } + int remainingDevices = AudioSystem.DEVICE_OUT_ALL; + for (int i = 0; remainingDevices != 0; i++) { int device = (1 << i); if ((device & remainingDevices) == 0) { @@ -2972,7 +3024,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished { index = mIndexMax; } } - mIndex.put(device, getValidIndex(index)); + mIndex.put(device, index); if (oldIndex != index) { if (lastAudible) { @@ -3106,7 +3158,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private int getValidIndex(int index) { if (index < 0) { return 0; - } else if (index > mIndexMax) { + } else if (mUseFixedVolume || index > mIndexMax) { return mIndexMax; } @@ -3328,6 +3380,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private void persistVolume(VolumeStreamState streamState, int persistType, int device) { + if (mUseFixedVolume) { + return; + } if ((persistType & PERSIST_CURRENT) != 0) { System.putIntForUser(mContentResolver, streamState.getSettingNameForDevice(false /* lastAudible */, device), @@ -3343,6 +3398,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } private void persistRingerMode(int ringerMode) { + if (mUseFixedVolume) { + return; + } Settings.Global.putInt(mContentResolver, Settings.Global.MODE_RINGER, ringerMode); } @@ -3439,6 +3497,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished { break; case MSG_PERSIST_MASTER_VOLUME: + if (mUseFixedVolume) { + return; + } Settings.System.putFloatForUser(mContentResolver, Settings.System.VOLUME_MASTER, (float)msg.arg1 / (float)1000.0, @@ -3446,6 +3507,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished { break; case MSG_PERSIST_MASTER_VOLUME_MUTE: + if (mUseFixedVolume) { + return; + } Settings.System.putIntForUser(mContentResolver, Settings.System.VOLUME_MASTER_MUTE, msg.arg1, diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioManagerTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioManagerTest.java index 7967ce7..e232338 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioManagerTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioManagerTest.java @@ -42,6 +42,7 @@ public class MediaAudioManagerTest extends ActivityInstrumentationTestCase2<Medi private final static int WAIT_FOR_LOOPER_TO_INITIALIZE_MS = 60000; // 60s private int[] ringtoneMode = {AudioManager.RINGER_MODE_NORMAL, AudioManager.RINGER_MODE_SILENT, AudioManager.RINGER_MODE_VIBRATE}; + private boolean mUseFixedVolume; public MediaAudioManagerTest() { super("com.android.mediaframeworktest", MediaFrameworkTest.class); @@ -65,6 +66,10 @@ public class MediaAudioManagerTest extends ActivityInstrumentationTestCase2<Medi @Override protected void setUp() throws Exception { super.setUp(); + + mUseFixedVolume = getActivity().getResources().getBoolean( + com.android.internal.R.bool.config_useFixedVolume); + synchronized(mLooperLock) { initializeAudioManagerWithLooper(); try { @@ -91,10 +96,12 @@ public class MediaAudioManagerTest extends ActivityInstrumentationTestCase2<Medi public boolean validateSetRingTone(int i) { int getRingtone = mAudioManager.getRingerMode(); - if (i != getRingtone) - return false; - else - return true; + + if (mUseFixedVolume) { + return (getRingtone == AudioManager.RINGER_MODE_NORMAL); + } else { + return (getRingtone == i); + } } // Test case 1: Simple test case to validate the set ringtone mode diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java index 761eb2d..a2ac8fe 100755 --- a/policy/src/com/android/internal/policy/impl/GlobalActions.java +++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java @@ -102,6 +102,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac private boolean mIsWaitingForEcmExit = false; private boolean mHasTelephony; private boolean mHasVibrator; + private final boolean mShowSilentToggle; /** * @param context everything needs a context :( @@ -132,6 +133,9 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac mAirplaneModeObserver); Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); mHasVibrator = vibrator != null && vibrator.hasVibrator(); + + mShowSilentToggle = SHOW_SILENT_TOGGLE && !mContext.getResources().getBoolean( + com.android.internal.R.bool.config_useFixedVolume); } /** @@ -309,7 +313,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } // last: silent mode - if (SHOW_SILENT_TOGGLE) { + if (mShowSilentToggle) { mItems.add(mSilentModeAction); } @@ -390,7 +394,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac mAirplaneModeOn.updateState(mAirplaneState); mAdapter.notifyDataSetChanged(); mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); - if (SHOW_SILENT_TOGGLE) { + if (mShowSilentToggle) { IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); mContext.registerReceiver(mRingerModeReceiver, filter); } @@ -407,7 +411,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac /** {@inheritDoc} */ public void onDismiss(DialogInterface dialog) { - if (SHOW_SILENT_TOGGLE) { + if (mShowSilentToggle) { try { mContext.unregisterReceiver(mRingerModeReceiver); } catch (IllegalArgumentException ie) { |