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

Commit 454c7eea authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 11078623 from 4cb75fb0 to 24Q1-release

Change-Id: I7c268f50743c8c2fd30599bba68e7bc187323cbe
parents b27c4839 4cb75fb0
Loading
Loading
Loading
Loading
+14 −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"
@@ -27,3 +34,10 @@ flag {
  description: "Fix audio route transition issue on call disconnection when bt audio connected."
  bug: "306113816"
}

flag {
  name: "call_audio_communication_device_refactor"
  namespace: "telecom"
  description: "Refactor call audio set/clear communication device and include unsupported routes."
  bug: "308968392"
}
 No newline at end of file
+10 −6
Original line number Diff line number Diff line
@@ -63,6 +63,10 @@ public class CallAudioCommunicationDeviceTracker {
        return mAudioDeviceType == audioDeviceType;
    }

    public int getCurrentLocallyRequestedCommunicationDevice() {
       return mAudioDeviceType;
    }

    @VisibleForTesting
    public void setTestCommunicationDevice(int audioDeviceType) {
        mAudioDeviceType = audioDeviceType;
@@ -177,12 +181,6 @@ public class CallAudioCommunicationDeviceTracker {
            return;
        }

        if (isBtDevice && mBtAudioDevice != null) {
            // Signal that BT audio was lost for device.
            mBluetoothRouteManager.onAudioLost(mBtAudioDevice);
            mBtAudioDevice = null;
        }

        if (mAudioManager == null) {
            Log.i(this, "clearCommunicationDevice: mAudioManager is null");
            return;
@@ -191,6 +189,12 @@ public class CallAudioCommunicationDeviceTracker {
        // Clear device and reset locally saved device type.
        mAudioManager.clearCommunicationDevice();
        mAudioDeviceType = sAUDIO_DEVICE_TYPE_INVALID;

        if (isBtDevice && mBtAudioDevice != null) {
            // Signal that BT audio was lost for device.
            mBluetoothRouteManager.onAudioLost(mBtAudioDevice);
            mBtAudioDevice = null;
        }
    }

    private boolean isUsbHeadsetType(int audioDeviceType, int sourceType) {
+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
+18 −6
Original line number Diff line number Diff line
@@ -41,8 +41,10 @@ public class CallAudioModeStateMachine extends StateMachine {
    private LocalLog mLocalLog = new LocalLog(20);
    public static class Factory {
        public CallAudioModeStateMachine create(SystemStateHelper systemStateHelper,
                                                AudioManager am, FeatureFlags featureFlags) {
            return new CallAudioModeStateMachine(systemStateHelper, am, featureFlags);
                AudioManager am, FeatureFlags featureFlags,
                CallAudioCommunicationDeviceTracker callAudioCommunicationDeviceTracker) {
            return new CallAudioModeStateMachine(systemStateHelper, am,
                    featureFlags, callAudioCommunicationDeviceTracker);
        }
    }

@@ -277,6 +279,11 @@ public class CallAudioModeStateMachine extends StateMachine {
            Log.i(LOG_TAG, "Audio focus entering UNFOCUSED state");
            mLocalLog.log("Enter UNFOCUSED");
            if (mIsInitialized) {
                // Clear any communication device that was requested previously.
                if (mFeatureFlags.callAudioCommunicationDeviceRefactor()) {
                    mCommunicationDeviceTracker.clearCommunicationDevice(mCommunicationDeviceTracker
                            .getCurrentLocallyRequestedCommunicationDevice());
                }
                if (mFeatureFlags.setAudioModeBeforeAbandonFocus()) {
                    mAudioManager.setMode(AudioManager.MODE_NORMAL);
                    mCallAudioManager.setCallAudioRouteFocusState(
@@ -727,12 +734,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);
        }

@@ -878,17 +885,20 @@ public class CallAudioModeStateMachine extends StateMachine {
    private final SystemStateHelper mSystemStateHelper;
    private CallAudioManager mCallAudioManager;
    private FeatureFlags mFeatureFlags;
    private CallAudioCommunicationDeviceTracker mCommunicationDeviceTracker;

    private int mMostRecentMode;
    private boolean mIsInitialized = false;

    public CallAudioModeStateMachine(SystemStateHelper systemStateHelper,
            AudioManager audioManager, FeatureFlags featureFlags) {
            AudioManager audioManager, FeatureFlags featureFlags,
            CallAudioCommunicationDeviceTracker callAudioCommunicationDeviceTracker) {
        super(CallAudioModeStateMachine.class.getSimpleName());
        mAudioManager = audioManager;
        mSystemStateHelper = systemStateHelper;
        mMostRecentMode = AudioManager.MODE_NORMAL;
        mFeatureFlags = featureFlags;
        mCommunicationDeviceTracker = callAudioCommunicationDeviceTracker;

        createStates();
    }
@@ -897,12 +907,14 @@ public class CallAudioModeStateMachine extends StateMachine {
     * Used for testing
     */
    public CallAudioModeStateMachine(SystemStateHelper systemStateHelper,
            AudioManager audioManager, Looper looper, FeatureFlags featureFlags) {
            AudioManager audioManager, Looper looper, FeatureFlags featureFlags,
            CallAudioCommunicationDeviceTracker communicationDeviceTracker) {
        super(CallAudioModeStateMachine.class.getSimpleName(), looper);
        mAudioManager = audioManager;
        mSystemStateHelper = systemStateHelper;
        mMostRecentMode = AudioManager.MODE_NORMAL;
        mFeatureFlags = featureFlags;
        mCommunicationDeviceTracker = communicationDeviceTracker;

        createStates();
    }
+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);
}
Loading