diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java index 7c3508ff21893..09b7d053db66e 100644 --- a/telephony/java/com/android/internal/telephony/CallManager.java +++ b/telephony/java/com/android/internal/telephony/CallManager.java @@ -860,6 +860,25 @@ public final class CallManager { return false; } + /** + * Enables or disables echo suppression. + */ + public void setEchoSuppressionEnabled(boolean enabled) { + if (VDBG) { + Log.d(LOG_TAG, " setEchoSuppression(" + enabled + ")"); + Log.d(LOG_TAG, this.toString()); + } + + if (hasActiveFgCall()) { + getActiveFgCall().getPhone().setEchoSuppressionEnabled(enabled); + } + + if (VDBG) { + Log.d(LOG_TAG, "End setEchoSuppression(" + enabled + ")"); + Log.d(LOG_TAG, this.toString()); + } + } + /** * Play a DTMF tone on the active call. * diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java index ec6c0232bd659..2957c7e293afd 100644 --- a/telephony/java/com/android/internal/telephony/Phone.java +++ b/telephony/java/com/android/internal/telephony/Phone.java @@ -1186,6 +1186,11 @@ public interface Phone { */ boolean getMute(); + /** + * Enables or disables echo suppression. + */ + void setEchoSuppressionEnabled(boolean enabled); + /** * Invokes RIL_REQUEST_OEM_HOOK_RAW on RIL implementation. * diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java index 5412768a49010..74e8c1b5624e0 100644 --- a/telephony/java/com/android/internal/telephony/PhoneBase.java +++ b/telephony/java/com/android/internal/telephony/PhoneBase.java @@ -505,6 +505,10 @@ public abstract class PhoneBase extends Handler implements Phone { mCM.unregisterForResendIncallMute(h); } + public void setEchoSuppressionEnabled(boolean enabled) { + // no need for regular phone + } + /** * Subclasses of Phone probably want to replace this with a * version scoped to their packages diff --git a/telephony/java/com/android/internal/telephony/PhoneProxy.java b/telephony/java/com/android/internal/telephony/PhoneProxy.java index 9e0c087fd2457..02fdf282d6a27 100644 --- a/telephony/java/com/android/internal/telephony/PhoneProxy.java +++ b/telephony/java/com/android/internal/telephony/PhoneProxy.java @@ -578,6 +578,10 @@ public class PhoneProxy extends Handler implements Phone { return mActivePhone.getMute(); } + public void setEchoSuppressionEnabled(boolean enabled) { + mActivePhone.setEchoSuppressionEnabled(enabled); + } + public void invokeOemRilRequestRaw(byte[] data, Message response) { mActivePhone.invokeOemRilRequestRaw(data, response); } diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhone.java b/telephony/java/com/android/internal/telephony/sip/SipPhone.java index 37dd971288b8d..38700cd7f2cb9 100755 --- a/telephony/java/com/android/internal/telephony/sip/SipPhone.java +++ b/telephony/java/com/android/internal/telephony/sip/SipPhone.java @@ -330,6 +330,20 @@ public class SipPhone extends SipPhoneBase { Log.e(LOG_TAG, "call waiting not supported"); } + @Override + public void setEchoSuppressionEnabled(boolean enabled) { + synchronized (SipPhone.class) { + AudioGroup audioGroup = foregroundCall.getAudioGroup(); + if (audioGroup == null) return; + int mode = audioGroup.getMode(); + audioGroup.setMode(enabled + ? AudioGroup.MODE_ECHO_SUPPRESSION + : AudioGroup.MODE_NORMAL); + Log.d(LOG_TAG, String.format("audioGroup mode change: %d --> %d", + mode, audioGroup.getMode())); + } + } + public void setMute(boolean muted) { synchronized (SipPhone.class) { foregroundCall.setMute(muted);