1717package com .android .internal .telephony .sip ;
1818
1919import android .content .Context ;
20+ import android .media .AudioManager ;
2021import android .net .rtp .AudioGroup ;
2122import android .net .sip .SipAudioCall ;
2223import android .net .sip .SipErrorCode ;
@@ -126,7 +127,7 @@ public void acceptCall() throws CallStateException {
126127 (ringingCall .getState () == Call .State .WAITING )) {
127128 if (DEBUG ) Log .d (LOG_TAG , "acceptCall" );
128129 // Always unmute when answering a new call
129- setMute (false );
130+ ringingCall . setMute (false );
130131 ringingCall .acceptCall ();
131132 } else {
132133 throw new CallStateException ("phone not ringing" );
@@ -170,7 +171,7 @@ private Connection dialInternal(String dialString)
170171 throw new CallStateException ("cannot dial in current state" );
171172 }
172173
173- setMute (false );
174+ foregroundCall . setMute (false );
174175 try {
175176 Connection c = foregroundCall .dial (dialString );
176177 return c ;
@@ -288,16 +289,13 @@ public void setCallWaiting(boolean enable, Message onComplete) {
288289
289290 @ Override
290291 public void setEchoSuppressionEnabled (boolean enabled ) {
292+ // TODO: Remove the enabled argument. We should check the speakerphone
293+ // state with AudioManager instead of keeping a state here so the
294+ // method with a state argument is redundant. Also rename the method
295+ // to something like onSpeaerphoneStateChanged(). Echo suppression may
296+ // not be available on every device.
291297 synchronized (SipPhone .class ) {
292- AudioGroup audioGroup = foregroundCall .getAudioGroup ();
293- if (audioGroup == null ) return ;
294- int mode = audioGroup .getMode ();
295- audioGroup .setMode (enabled
296- ? AudioGroup .MODE_ECHO_SUPPRESSION
297- : AudioGroup .MODE_NORMAL );
298- if (DEBUG ) Log .d (LOG_TAG , String .format (
299- "audioGroup mode change: %d --> %d" , mode ,
300- audioGroup .getMode ()));
298+ foregroundCall .setAudioGroupMode ();
301299 }
302300 }
303301
@@ -450,13 +448,33 @@ void acceptCall() throws CallStateException {
450448 ((SipConnection ) connections .get (0 )).acceptCall ();
451449 }
452450
453- void hold () throws CallStateException {
454- setState (State .HOLDING );
451+ private boolean isSpeakerOn () {
452+ return ((AudioManager ) mContext .getSystemService (Context .AUDIO_SERVICE ))
453+ .isSpeakerphoneOn ();
454+ }
455+
456+ void setAudioGroupMode () {
455457 AudioGroup audioGroup = getAudioGroup ();
456- if (audioGroup != null ) {
458+ if (audioGroup == null ) return ;
459+ int mode = audioGroup .getMode ();
460+ if (state == State .HOLDING ) {
457461 audioGroup .setMode (AudioGroup .MODE_ON_HOLD );
462+ } else if (getMute ()) {
463+ audioGroup .setMode (AudioGroup .MODE_MUTED );
464+ } else if (isSpeakerOn ()) {
465+ audioGroup .setMode (AudioGroup .MODE_ECHO_SUPPRESSION );
466+ } else {
467+ audioGroup .setMode (AudioGroup .MODE_NORMAL );
458468 }
469+ if (DEBUG ) Log .d (LOG_TAG , String .format (
470+ "audioGroup mode change: %d --> %d" , mode ,
471+ audioGroup .getMode ()));
472+ }
473+
474+ void hold () throws CallStateException {
475+ setState (State .HOLDING );
459476 for (Connection c : connections ) ((SipConnection ) c ).hold ();
477+ setAudioGroupMode ();
460478 }
461479
462480 void unhold () throws CallStateException {
@@ -465,19 +483,19 @@ void unhold() throws CallStateException {
465483 for (Connection c : connections ) {
466484 ((SipConnection ) c ).unhold (audioGroup );
467485 }
486+ setAudioGroupMode ();
468487 }
469488
470489 void setMute (boolean muted ) {
471- AudioGroup audioGroup = getAudioGroup ();
472- if (audioGroup == null ) return ;
473- audioGroup .setMode (
474- muted ? AudioGroup .MODE_MUTED : AudioGroup .MODE_NORMAL );
490+ for (Connection c : connections ) {
491+ ((SipConnection ) c ).setMute (muted );
492+ }
475493 }
476494
477495 boolean getMute () {
478- AudioGroup audioGroup = getAudioGroup ();
479- if ( audioGroup == null ) return false ;
480- return ( audioGroup . getMode () == AudioGroup . MODE_MUTED );
496+ return connections . isEmpty ()
497+ ? false
498+ : (( SipConnection ) connections . get ( 0 )). getMute ( );
481499 }
482500
483501 void merge (SipCall that ) throws CallStateException {
@@ -736,6 +754,17 @@ void unhold(AudioGroup audioGroup) throws CallStateException {
736754 }
737755 }
738756
757+ void setMute (boolean muted ) {
758+ if ((mSipAudioCall != null ) && (muted != mSipAudioCall .isMuted ())) {
759+ mSipAudioCall .toggleMute ();
760+ }
761+ }
762+
763+ boolean getMute () {
764+ return (mSipAudioCall == null ) ? false
765+ : mSipAudioCall .isMuted ();
766+ }
767+
739768 @ Override
740769 protected void setState (Call .State state ) {
741770 if (state == mState ) return ;
0 commit comments