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

Commit 271b1f1e authored by xiaotonj's avatar xiaotonj Committed by Grace Jia
Browse files

Refactored audio routing structure.

Add flag and skeleton for new call audio route works.

Bug: 306395598
Test: make
Change-Id: Ic2bdf8685fea174505339614d0b34d74fd49e971
parent e41337d7
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -7,6 +7,13 @@ flag {
  bug: "292599751"
}

flag {
  name: "use_refactored_audio_route_switching"
  namespace: "telecom"
  description: "Refactored audio routing"
  bug: "306395598"
}

flag {
  name: "ensure_audio_mode_updates_on_foreground_call_change"
  namespace: "telecom"
+23 −24
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.media.ToneGenerator;
import android.os.UserHandle;
import android.telecom.CallAudioState;
import android.telecom.Log;
import android.telecom.PhoneAccount;
import android.telecom.VideoProfile;
import android.util.SparseArray;

@@ -55,7 +54,7 @@ public class CallAudioManager extends CallsManagerListenerBase {
    private final Set<Call> mCalls;
    private final SparseArray<LinkedHashSet<Call>> mCallStateToCalls;

    private final CallAudioRouteStateMachine mCallAudioRouteStateMachine;
    private final CallAudioRouteAdapter mCallAudioRouteAdapter;
    private final CallAudioModeStateMachine mCallAudioModeStateMachine;
    private final BluetoothStateReceiver mBluetoothStateReceiver;
    private final CallsManager mCallsManager;
@@ -71,7 +70,7 @@ public class CallAudioManager extends CallsManagerListenerBase {
    private boolean mIsDisconnectedTonePlaying = false;
    private InCallTonePlayer mHoldTonePlayer;

    public CallAudioManager(CallAudioRouteStateMachine callAudioRouteStateMachine,
    public CallAudioManager(CallAudioRouteAdapter callAudioRouteAdapter,
            CallsManager callsManager,
            CallAudioModeStateMachine callAudioModeStateMachine,
            InCallTonePlayer.Factory playerFactory,
@@ -97,7 +96,7 @@ public class CallAudioManager extends CallsManagerListenerBase {
            put(CallState.AUDIO_PROCESSING, mAudioProcessingCalls);
        }};

        mCallAudioRouteStateMachine = callAudioRouteStateMachine;
        mCallAudioRouteAdapter = callAudioRouteAdapter;
        mCallAudioModeStateMachine = callAudioModeStateMachine;
        mCallsManager = callsManager;
        mPlayerFactory = playerFactory;
@@ -109,7 +108,7 @@ public class CallAudioManager extends CallsManagerListenerBase {

        mPlayerFactory.setCallAudioManager(this);
        mCallAudioModeStateMachine.setCallAudioManager(this);
        mCallAudioRouteStateMachine.setCallAudioManager(this);
        mCallAudioRouteAdapter.setCallAudioManager(this);
    }

    @Override
@@ -226,7 +225,7 @@ public class CallAudioManager extends CallsManagerListenerBase {
                // When pulling a video call, automatically enable the speakerphone.
                Log.d(LOG_TAG, "Switching to speaker because external video call %s was pulled." +
                        call.getId());
                mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                        CallAudioRouteStateMachine.SWITCH_SPEAKER);
            }
        }
@@ -378,7 +377,7 @@ public class CallAudioManager extends CallsManagerListenerBase {
    @Override
    public void onConnectionServiceChanged(Call call, ConnectionServiceWrapper oldCs,
            ConnectionServiceWrapper newCs) {
        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
        mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                CallAudioRouteStateMachine.UPDATE_SYSTEM_AUDIO_ROUTE);
    }

@@ -396,13 +395,13 @@ public class CallAudioManager extends CallsManagerListenerBase {
            Log.d(LOG_TAG, "Switching to speaker because call %s transitioned video state from %s" +
                    " to %s", call.getId(), VideoProfile.videoStateToString(previousVideoState),
                    VideoProfile.videoStateToString(newVideoState));
            mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
            mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                    CallAudioRouteStateMachine.SWITCH_SPEAKER);
        }
    }

    public CallAudioState getCallAudioState() {
        return mCallAudioRouteStateMachine.getCurrentCallAudioState();
        return mCallAudioRouteAdapter.getCurrentCallAudioState();
    }

    public Call getPossiblyHeldForegroundCall() {
@@ -423,7 +422,7 @@ public class CallAudioManager extends CallsManagerListenerBase {
            Log.v(this, "ignoring toggleMute for emergency call");
            return;
        }
        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
        mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                CallAudioRouteStateMachine.TOGGLE_MUTE);
    }

@@ -443,7 +442,7 @@ public class CallAudioManager extends CallsManagerListenerBase {
            Log.v(this, "ignoring mute for emergency call");
        }

        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(shouldMute
        mCallAudioRouteAdapter.sendMessageWithSessionInfo(shouldMute
                ? CallAudioRouteStateMachine.MUTE_ON : CallAudioRouteStateMachine.MUTE_OFF);
    }

@@ -459,23 +458,23 @@ public class CallAudioManager extends CallsManagerListenerBase {
        Log.v(this, "setAudioRoute, route: %s", CallAudioState.audioRouteToString(route));
        switch (route) {
            case CallAudioState.ROUTE_BLUETOOTH:
                mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                        CallAudioRouteStateMachine.USER_SWITCH_BLUETOOTH, 0, bluetoothAddress);
                return;
            case CallAudioState.ROUTE_SPEAKER:
                mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                        CallAudioRouteStateMachine.USER_SWITCH_SPEAKER);
                return;
            case CallAudioState.ROUTE_WIRED_HEADSET:
                mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                        CallAudioRouteStateMachine.USER_SWITCH_HEADSET);
                return;
            case CallAudioState.ROUTE_EARPIECE:
                mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                        CallAudioRouteStateMachine.USER_SWITCH_EARPIECE);
                return;
            case CallAudioState.ROUTE_WIRED_OR_EARPIECE:
                mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                        CallAudioRouteStateMachine.USER_SWITCH_BASELINE_ROUTE,
                        CallAudioRouteStateMachine.NO_INCLUDE_BLUETOOTH_IN_BASELINE);
                return;
@@ -490,7 +489,7 @@ public class CallAudioManager extends CallsManagerListenerBase {
     */
    void switchBaseline() {
        Log.i(this, "switchBaseline");
        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
        mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                CallAudioRouteStateMachine.USER_SWITCH_BASELINE_ROUTE,
                CallAudioRouteStateMachine.INCLUDE_BLUETOOTH_IN_BASELINE);
    }
@@ -534,7 +533,7 @@ public class CallAudioManager extends CallsManagerListenerBase {
        synchronized (mCallsManager.getLock()) {
            Call localForegroundCall = mForegroundCall;
            boolean result = mRinger.startRinging(localForegroundCall,
                    mCallAudioRouteStateMachine.isHfpDeviceAvailable());
                    mCallAudioRouteAdapter.isHfpDeviceAvailable());
            if (result) {
                localForegroundCall.setStartRingTime();
            }
@@ -567,7 +566,7 @@ public class CallAudioManager extends CallsManagerListenerBase {

    @VisibleForTesting
    public void setCallAudioRouteFocusState(int focusState) {
        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
        mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                CallAudioRouteStateMachine.SWITCH_FOCUS, focusState);
    }

@@ -577,8 +576,8 @@ public class CallAudioManager extends CallsManagerListenerBase {
    }

    @VisibleForTesting
    public CallAudioRouteStateMachine getCallAudioRouteStateMachine() {
        return mCallAudioRouteStateMachine;
    public CallAudioRouteAdapter getCallAudioRouteAdapter() {
        return mCallAudioRouteAdapter;
    }

    @VisibleForTesting
@@ -615,9 +614,9 @@ public class CallAudioManager extends CallsManagerListenerBase {
        mCallAudioModeStateMachine.dump(pw);
        pw.decreaseIndent();

        pw.println("CallAudioRouteStateMachine:");
        pw.println("mCallAudioRouteAdapter:");
        pw.increaseIndent();
        mCallAudioRouteStateMachine.dump(pw);
        mCallAudioRouteAdapter.dump(pw);
        pw.decreaseIndent();

        pw.println("BluetoothDeviceManager:");
@@ -813,7 +812,7 @@ public class CallAudioManager extends CallsManagerListenerBase {
                mHoldingCalls.stream().map(c -> c.getId()).collect(Collectors.joining(","))
        );
        if (mForegroundCall != oldForegroundCall) {
            mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
            mCallAudioRouteAdapter.sendMessageWithSessionInfo(
                    CallAudioRouteStateMachine.UPDATE_SYSTEM_AUDIO_ROUTE);

            if (mForegroundCall != null
+2 −2
Original line number Diff line number Diff line
@@ -727,12 +727,12 @@ public class CallAudioModeStateMachine extends StateMachine {
            mAudioManager.setMode(AudioManager.MODE_COMMUNICATION_REDIRECT);
            mMostRecentMode = AudioManager.MODE_NORMAL;
            mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.ACTIVE_FOCUS);
            mCallAudioManager.getCallAudioRouteStateMachine().sendMessageWithSessionInfo(
            mCallAudioManager.getCallAudioRouteAdapter().sendMessageWithSessionInfo(
                    CallAudioRouteStateMachine.STREAMING_FORCE_ENABLED);
        }

        private void preExit() {
            mCallAudioManager.getCallAudioRouteStateMachine().sendMessageWithSessionInfo(
            mCallAudioManager.getCallAudioRouteAdapter().sendMessageWithSessionInfo(
                    CallAudioRouteStateMachine.STREAMING_FORCE_DISABLED);
        }

+19 −0
Original line number Diff line number Diff line
package com.android.server.telecom;

import android.os.Handler;
import android.telecom.CallAudioState;

import com.android.internal.util.IndentingPrintWriter;

public interface CallAudioRouteAdapter {
    void initialize();
    void sendMessageWithSessionInfo(int message);
    void sendMessageWithSessionInfo(int message, int arg);
    void sendMessageWithSessionInfo(int message, int arg, String data);
    void sendMessage(int message, Runnable r);
    void setCallAudioManager(CallAudioManager callAudioManager);
    CallAudioState getCurrentCallAudioState();
    boolean isHfpDeviceAvailable();
    Handler getAdapterHandler();
    void dump(IndentingPrintWriter pw);
}
+64 −0
Original line number Diff line number Diff line
package com.android.server.telecom;

import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.telecom.CallAudioState;

import com.android.internal.util.IndentingPrintWriter;

public class CallAudioRouteController implements CallAudioRouteAdapter {
    private Handler mHandler;

    public CallAudioRouteController() {
        HandlerThread handlerThread = new HandlerThread(this.getClass().getSimpleName());
        handlerThread.start();
        mHandler = new Handler(handlerThread.getLooper());
    }
    @Override
    public void initialize() {
    }

    @Override
    public void sendMessageWithSessionInfo(int message) {
    }

    @Override
    public void sendMessageWithSessionInfo(int message, int arg) {

    }

    @Override
    public void sendMessageWithSessionInfo(int message, int arg, String data) {

    }

    @Override
    public void sendMessage(int message, Runnable r) {

    }

    @Override
    public void setCallAudioManager(CallAudioManager callAudioManager) {
    }

    @Override
    public CallAudioState getCurrentCallAudioState() {
        return null;
    }

    @Override
    public boolean isHfpDeviceAvailable() {
        return false;
    }

    @Override
    public Handler getAdapterHandler() {
        return mHandler;
    }

    @Override
    public void dump(IndentingPrintWriter pw) {

    }
}
Loading