Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit adfae956 authored by Daniel Hillenbrand's avatar Daniel Hillenbrand Committed by Gerrit Code Review
Browse files

Merge "Fix ring/notification volume not restoring correctly on headset (dis)connect" into ics

parents 5f2e018e 49433621
Loading
Loading
Loading
Loading
+39 −31
Original line number Diff line number Diff line
@@ -226,6 +226,10 @@ public class AudioService extends IAudioService.Stub {
        "AudioService.SAVED_NOTIFICATION_SPEAKER_VOL",
    };

    private static final int HEADSET_VOLUME_RESTORE_CAP_VOICE_CALL = 3; // Out of 5
    private static final int HEADSET_VOLUME_RESTORE_CAP_MUSIC = 8; // Out of 15
    private static final int HEADSET_VOLUME_RESTORE_CAP_OTHER = 4; // Out of 7

    private AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() {
        public void onError(int error) {
            switch (error) {
@@ -2573,56 +2577,60 @@ public class AudioService extends IAudioService.Stub {
                int lastVolume;
                if (state == 1) {
                    // Headset plugged in
                    int volumeRestoreCap;
                    if (Settings.System.getInt(mContentResolver,
                            Settings.System.SAFE_HEADSET_VOLUME_RESTORE, 1) == 0) {
                        // Don't cap
                        volumeRestoreCap = 8;
                    } else {
                        volumeRestoreCap = 4;
                    }
                    final boolean capVolumeRestore = Settings.System.getInt(mContentResolver,
                            Settings.System.SAFE_HEADSET_VOLUME_RESTORE, 1) == 1;
                    for (int stream = 0; stream < STREAM_VOLUME_HEADSET_SETTINGS.length; stream++) {
                        final int streamAlias = STREAM_VOLUME_ALIAS[stream];
                        // Save speaker volume
                        System.putInt(mContentResolver, STREAM_VOLUME_SPEAKER_SETTINGS[stream],
                                getStreamVolume(streamAlias));
                        // Restore headset volume
                        try {
                            lastVolume = System.getInt(mContentResolver,
                                    STREAM_VOLUME_HEADSET_SETTINGS[stream]);
                                    STREAM_VOLUME_HEADSET_SETTINGS[streamAlias]);
                        } catch (SettingNotFoundException e) {
                            lastVolume = -1;
                        }
                        System.putInt(mContentResolver, STREAM_VOLUME_SPEAKER_SETTINGS[stream],
                                getStreamVolume(stream));
                        if (lastVolume >= 0)
                            if (stream == 0) {
                                // Don't touch voice call volume
                                setStreamVolume(stream, lastVolume, 0);
                            } else if (stream != 3) {
                                if (lastVolume > volumeRestoreCap) {
                                    setStreamVolume(stream, volumeRestoreCap, 0);
                                } else {
                                    setStreamVolume(stream, lastVolume, 0);
                        if (lastVolume >= 0) {
                            if (capVolumeRestore) {
                                final int volumeCap;
                                switch (streamAlias) {
                                    case AudioSystem.STREAM_VOICE_CALL:
                                        volumeCap = HEADSET_VOLUME_RESTORE_CAP_VOICE_CALL;
                                        break;
                                    case AudioSystem.STREAM_MUSIC:
                                        volumeCap = HEADSET_VOLUME_RESTORE_CAP_MUSIC;
                                        break;
                                    case AudioSystem.STREAM_SYSTEM:
                                    case AudioSystem.STREAM_RING:
                                    case AudioSystem.STREAM_ALARM:
                                    case AudioSystem.STREAM_NOTIFICATION:
                                    default:
                                        volumeCap = HEADSET_VOLUME_RESTORE_CAP_OTHER;
                                        break;
                                }
                                setStreamVolume(streamAlias, Math.min(volumeCap, lastVolume), 0);
                            } else {
                                // For media volume the cap is doubled to correspond
                                // with its finer granularity
                                if (lastVolume > (volumeRestoreCap * 2)) {
                                    setStreamVolume(stream, (volumeRestoreCap * 2), 0);
                                } else {
                                    setStreamVolume(stream, lastVolume, 0);
                                setStreamVolume(streamAlias, lastVolume, 0);
                            }
                        }
                    }
                } else {
                    // Headset disconnected
                    for (int stream = 0; stream < STREAM_VOLUME_SPEAKER_SETTINGS.length; stream++) {
                        final int streamAlias = STREAM_VOLUME_ALIAS[stream];
                        // Save headset volume
                        System.putInt(mContentResolver, STREAM_VOLUME_HEADSET_SETTINGS[stream],
                                getStreamVolume(streamAlias));
                        // Restore speaker volume
                        try {
                            lastVolume = System.getInt(mContentResolver,
                                    STREAM_VOLUME_SPEAKER_SETTINGS[stream]);
                                    STREAM_VOLUME_SPEAKER_SETTINGS[streamAlias]);
                        } catch (SettingNotFoundException e) {
                            lastVolume = -1;
                        }
                        System.putInt(mContentResolver, STREAM_VOLUME_HEADSET_SETTINGS[stream],
                                getStreamVolume(stream));
                        if (lastVolume >= 0)
                            setStreamVolume(stream, lastVolume, 0);
                            setStreamVolume(streamAlias, lastVolume, 0);
                    }
                }