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

Commit ed9f9d1b authored by Bishoy Gendy's avatar Bishoy Gendy
Browse files

Fix volume controls show media instead of call volume during a call.

- On some apps like Signal, When the app is in the foreground and there
is a active phone call, volume controls show media volume control
instead of call volume control.
- Investigation showed that with apps having the right behaviour
"MediaSession.dispatchVolumeKeyEvent" is called, while with apps having
the wrong behaviour
"MediaSessionService.dispatchVolumeKeyEventToSessionAsSystemService" is
called.
- Following this guided to the cause of the steps to reproduce it in
other apps by calling "Activty.setMediaController".
- Issue was reproducible on the Sample MediaRouter App.
- Fixed it through checking not being in a call before forwarding the
volume event to the session.

Bug: 240705522
Test: Manual using Signal App / Youtube and Sample MediaRouter App.
Change-Id: Iabac3c80631fd429daba23454488fceedbcc584d
parent 75208d7f
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -1938,9 +1938,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
            case KeyEvent.KEYCODE_VOLUME_UP:
            case KeyEvent.KEYCODE_VOLUME_DOWN:
            case KeyEvent.KEYCODE_VOLUME_MUTE: {
                // If we have a session send it the volume command, otherwise
                // use the suggested stream.
                if (mMediaController != null) {
                // If we have a session and no active phone call send it the volume command,
                // otherwise use the suggested stream.
                if (mMediaController != null && !isActivePhoneCallKnown()) {
                    getMediaSessionManager().dispatchVolumeKeyEventToSessionAsSystemService(event,
                            mMediaController.getSessionToken());
                } else {
@@ -1991,6 +1991,18 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
        return false;
    }

    private boolean isActivePhoneCallKnown() {
        boolean isActivePhoneCallKnown = false;
        AudioManager audioManager =
                (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
        int audioManagerMode = audioManager.getMode();
        if (audioManagerMode == AudioManager.MODE_IN_CALL
                || audioManagerMode == AudioManager.MODE_IN_COMMUNICATION) {
            isActivePhoneCallKnown = true;
        }
        return isActivePhoneCallKnown;
    }

    private KeyguardManager getKeyguardManager() {
        if (mKeyguardManager == null) {
            mKeyguardManager = (KeyguardManager) getContext().getSystemService(