@@ -159,9 +159,13 @@ public void start() {
159159 handler .removeCallbacksAndMessages (null );
160160 handler .postAtFrontOfQueue (() -> {
161161 if (!isActive ) {
162+ applyAudioConfiguration ();
163+
162164 audioSwitch .activate ();
163165 isActive = true ;
164- }
166+
167+ applyAudioManagerSettings ();
168+ }
165169 });
166170 }
167171 }
@@ -204,7 +208,9 @@ public void selectAudioOutput(@NonNull Class<? extends AudioDevice> audioDeviceC
204208 }
205209 if (audioDevice != null ) {
206210 Objects .requireNonNull (audioSwitch ).selectDevice (audioDevice );
207- }
211+ applyAudioConfiguration ();
212+ applyAudioManagerSettings ();
213+ }
208214 });
209215 }
210216
@@ -248,6 +254,8 @@ public void enableSpeakerphone(boolean enable) {
248254 } else {
249255 handler .post (() -> {
250256 Objects .requireNonNull (audioSwitch ).selectDevice (null );
257+ applyAudioConfiguration ();
258+ applyAudioManagerSettings ();
251259 });
252260 }
253261 }
@@ -407,6 +415,24 @@ private void applyAudioManagerSettings() {
407415 audioManager .setMode (audioMode );
408416 }
409417
418+ private void applyAudioConfiguration () {
419+ if (audioSwitch == null ) {
420+ return ;
421+ }
422+
423+ handler .post (() -> {
424+ Objects .requireNonNull (audioSwitch ).setManageAudioFocus (manageAudioFocus );
425+ Objects .requireNonNull (audioSwitch ).setFocusMode (focusMode );
426+ Objects .requireNonNull (audioSwitch ).setAudioMode (audioMode );
427+ Objects .requireNonNull (audioSwitch ).setAudioStreamType (audioStreamType );
428+ Objects .requireNonNull (audioSwitch ).setAudioAttributeContentType (audioAttributeContentType );
429+ Objects .requireNonNull (audioSwitch ).setAudioAttributeUsageType (audioAttributeUsageType );
430+ Objects .requireNonNull (audioSwitch ).setForceHandleAudioRouting (forceHandleAudioRouting );
431+
432+ applyAudioManagerSettings ();
433+ });
434+ }
435+
410436 public void clearCommunicationDevice () {
411437 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
412438 audioManager .clearCommunicationDevice ();
@@ -420,12 +446,16 @@ public void setAudioFocusChangeListener(@Nullable AudioManager.OnAudioFocusChang
420446 public void requestAudioFocus () {
421447 handler .post (() -> {
422448 if (audioSwitch != null ) {
449+ applyAudioConfiguration ();
450+
423451 Objects .requireNonNull (audioSwitch ).activate ();
452+
453+ applyAudioManagerSettings ();
424454 }
425455 });
426456 }
427457
428- private static final class ForwardingAudioFocusChangeListener implements AudioManager .OnAudioFocusChangeListener {
458+ private final class ForwardingAudioFocusChangeListener implements AudioManager .OnAudioFocusChangeListener {
429459 @ Nullable
430460 private volatile AudioManager .OnAudioFocusChangeListener delegate ;
431461
@@ -435,6 +465,13 @@ public void onAudioFocusChange(int focusChange) {
435465 if (current != null ) {
436466 current .onAudioFocusChange (focusChange );
437467 }
468+
469+ if (focusChange == AudioManager .AUDIOFOCUS_GAIN ||
470+ focusChange == AudioManager .AUDIOFOCUS_GAIN_TRANSIENT ||
471+ focusChange == AudioManager .AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK ) {
472+ applyAudioConfiguration ();
473+ applyAudioManagerSettings ();
474+ }
438475 }
439476
440477 void setDelegate (@ Nullable AudioManager .OnAudioFocusChangeListener delegate ) {
0 commit comments