diff options
Diffstat (limited to 'src/com/android/server/telecom/CallAudioModeStateMachine.java')
-rw-r--r-- | src/com/android/server/telecom/CallAudioModeStateMachine.java | 113 |
1 files changed, 95 insertions, 18 deletions
diff --git a/src/com/android/server/telecom/CallAudioModeStateMachine.java b/src/com/android/server/telecom/CallAudioModeStateMachine.java index 9ad9094ef..71956a1e0 100644 --- a/src/com/android/server/telecom/CallAudioModeStateMachine.java +++ b/src/com/android/server/telecom/CallAudioModeStateMachine.java @@ -16,6 +16,8 @@ package com.android.server.telecom; +import android.media.AudioAttributes; +import android.media.AudioFocusRequest; import android.media.AudioManager; import android.os.Looper; import android.os.Message; @@ -29,6 +31,7 @@ import com.android.internal.util.IState; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.State; import com.android.internal.util.StateMachine; +import com.android.server.telecom.flags.FeatureFlags; public class CallAudioModeStateMachine extends StateMachine { /** @@ -38,11 +41,29 @@ public class CallAudioModeStateMachine extends StateMachine { private LocalLog mLocalLog = new LocalLog(20); public static class Factory { public CallAudioModeStateMachine create(SystemStateHelper systemStateHelper, - AudioManager am) { - return new CallAudioModeStateMachine(systemStateHelper, am); + AudioManager am, FeatureFlags featureFlags, + CallAudioCommunicationDeviceTracker callAudioCommunicationDeviceTracker) { + return new CallAudioModeStateMachine(systemStateHelper, am, + featureFlags, callAudioCommunicationDeviceTracker); } } + private static final AudioAttributes RING_AUDIO_ATTRIBUTES = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) + .setLegacyStreamType(AudioManager.STREAM_RING) + .build(); + public static final AudioFocusRequest RING_AUDIO_FOCUS_REQUEST = new AudioFocusRequest + .Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT) + .setAudioAttributes(RING_AUDIO_ATTRIBUTES).build(); + + private static final AudioAttributes CALL_AUDIO_ATTRIBUTES = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) + .setLegacyStreamType(AudioManager.STREAM_VOICE_CALL) + .build(); + public static final AudioFocusRequest CALL_AUDIO_FOCUS_REQUEST = new AudioFocusRequest + .Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT) + .setAudioAttributes(CALL_AUDIO_ATTRIBUTES).build(); + public static class MessageArgs { public boolean hasActiveOrDialingCalls; public boolean hasRingingCalls; @@ -212,6 +233,8 @@ public class CallAudioModeStateMachine extends StateMachine { public static final String STREAMING_STATE_NAME = StreamingFocusState.class.getSimpleName(); public static final String COMMS_STATE_NAME = VoipCallFocusState.class.getSimpleName(); + private AudioFocusRequest mCurrentAudioFocusRequest = null; + private class BaseState extends State { @Override public boolean processMessage(Message msg) { @@ -256,8 +279,20 @@ public class CallAudioModeStateMachine extends StateMachine { Log.i(LOG_TAG, "Audio focus entering UNFOCUSED state"); mLocalLog.log("Enter UNFOCUSED"); if (mIsInitialized) { - mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.NO_FOCUS); - mAudioManager.setMode(AudioManager.MODE_NORMAL); + // 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( + CallAudioRouteStateMachine.NO_FOCUS); + } else { + mCallAudioManager.setCallAudioRouteFocusState( + CallAudioRouteStateMachine.NO_FOCUS); + mAudioManager.setMode(AudioManager.MODE_NORMAL); + } mLocalLog.log("Mode MODE_NORMAL"); mMostRecentMode = AudioManager.MODE_NORMAL; // Don't release focus here -- wait until we get a signal that any other audio @@ -310,7 +345,14 @@ public class CallAudioModeStateMachine extends StateMachine { return HANDLED; case AUDIO_OPERATIONS_COMPLETE: Log.i(LOG_TAG, "Abandoning audio focus: now UNFOCUSED"); - mAudioManager.abandonAudioFocusForCall(); + if (mFeatureFlags.telecomResolveHiddenDependencies()) { + if (mCurrentAudioFocusRequest != null) { + mAudioManager.abandonAudioFocusRequest(mCurrentAudioFocusRequest); + mCurrentAudioFocusRequest = null; + } + } else { + mAudioManager.abandonAudioFocusForCall(); + } return HANDLED; default: // The forced focus switch commands are handled by BaseState. @@ -381,7 +423,14 @@ public class CallAudioModeStateMachine extends StateMachine { return HANDLED; case AUDIO_OPERATIONS_COMPLETE: Log.i(LOG_TAG, "Abandoning audio focus: now AUDIO_PROCESSING"); - mAudioManager.abandonAudioFocusForCall(); + if (mFeatureFlags.telecomResolveHiddenDependencies()) { + if (mCurrentAudioFocusRequest != null) { + mAudioManager.abandonAudioFocusRequest(mCurrentAudioFocusRequest); + mCurrentAudioFocusRequest = null; + } + } else { + mAudioManager.abandonAudioFocusForCall(); + } return HANDLED; default: // The forced focus switch commands are handled by BaseState. @@ -406,8 +455,13 @@ public class CallAudioModeStateMachine extends StateMachine { } if (mCallAudioManager.startRinging()) { - mAudioManager.requestAudioFocusForCall( - AudioManager.STREAM_RING, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); + if (mFeatureFlags.telecomResolveHiddenDependencies()) { + mCurrentAudioFocusRequest = RING_AUDIO_FOCUS_REQUEST; + mAudioManager.requestAudioFocus(RING_AUDIO_FOCUS_REQUEST); + } else { + mAudioManager.requestAudioFocusForCall( + AudioManager.STREAM_RING, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); + } // Do not set MODE_RINGTONE if we were previously in the CALL_SCREENING mode -- // this trips up the audio system. if (mAudioManager.getMode() != AudioManager.MODE_CALL_SCREENING) { @@ -504,8 +558,13 @@ public class CallAudioModeStateMachine extends StateMachine { public void enter() { Log.i(LOG_TAG, "Audio focus entering SIM CALL state"); mLocalLog.log("Enter SIM_CALL"); - mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL, - AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); + if (mFeatureFlags.telecomResolveHiddenDependencies()) { + mCurrentAudioFocusRequest = CALL_AUDIO_FOCUS_REQUEST; + mAudioManager.requestAudioFocus(CALL_AUDIO_FOCUS_REQUEST); + } else { + mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL, + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); + } mAudioManager.setMode(AudioManager.MODE_IN_CALL); mLocalLog.log("Mode MODE_IN_CALL"); mMostRecentMode = AudioManager.MODE_IN_CALL; @@ -587,8 +646,13 @@ public class CallAudioModeStateMachine extends StateMachine { public void enter() { Log.i(LOG_TAG, "Audio focus entering VOIP CALL state"); mLocalLog.log("Enter VOIP_CALL"); - mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL, - AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); + if (mFeatureFlags.telecomResolveHiddenDependencies()) { + mCurrentAudioFocusRequest = CALL_AUDIO_FOCUS_REQUEST; + mAudioManager.requestAudioFocus(CALL_AUDIO_FOCUS_REQUEST); + } else { + mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL, + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); + } mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); mLocalLog.log("Mode MODE_IN_COMMUNICATION"); mMostRecentMode = AudioManager.MODE_IN_COMMUNICATION; @@ -670,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); } @@ -742,8 +806,13 @@ public class CallAudioModeStateMachine extends StateMachine { public void enter() { Log.i(LOG_TAG, "Audio focus entering TONE/HOLDING state"); mLocalLog.log("Enter TONE/HOLDING"); - mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL, - AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); + if (mFeatureFlags.telecomResolveHiddenDependencies()) { + mCurrentAudioFocusRequest = CALL_AUDIO_FOCUS_REQUEST; + mAudioManager.requestAudioFocus(CALL_AUDIO_FOCUS_REQUEST); + } else { + mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL, + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); + } mAudioManager.setMode(mMostRecentMode); mLocalLog.log("Mode " + mMostRecentMode); mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.ACTIVE_FOCUS); @@ -815,16 +884,21 @@ public class CallAudioModeStateMachine extends StateMachine { private final AudioManager mAudioManager; 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) { + AudioManager audioManager, FeatureFlags featureFlags, + CallAudioCommunicationDeviceTracker callAudioCommunicationDeviceTracker) { super(CallAudioModeStateMachine.class.getSimpleName()); mAudioManager = audioManager; mSystemStateHelper = systemStateHelper; mMostRecentMode = AudioManager.MODE_NORMAL; + mFeatureFlags = featureFlags; + mCommunicationDeviceTracker = callAudioCommunicationDeviceTracker; createStates(); } @@ -833,11 +907,14 @@ public class CallAudioModeStateMachine extends StateMachine { * Used for testing */ public CallAudioModeStateMachine(SystemStateHelper systemStateHelper, - AudioManager audioManager, Looper looper) { + 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(); } |