Play local DTMF tones for post-dial actions

Bug: 10695960
Change-Id: I9d039f8a1a27c7f9371eea1a76f175ca9df3249f
diff --git a/src/com/android/phone/BluetoothManager.java b/src/com/android/phone/BluetoothManager.java
index ffce465..443c950 100644
--- a/src/com/android/phone/BluetoothManager.java
+++ b/src/com/android/phone/BluetoothManager.java
@@ -32,6 +32,7 @@
 import android.util.Log;
 
 import com.android.internal.telephony.CallManager;
+import com.android.internal.telephony.Connection;
 import com.android.services.telephony.common.Call;
 
 import java.util.List;
@@ -416,7 +417,7 @@
     }
 
     @Override
-    public void onPostDialWait(int callId, String chars) {
+    public void onPostDialAction(Connection.PostDialState state, int callId, String chars, char c) {
         // no-op
     }
 
diff --git a/src/com/android/phone/CallHandlerServiceProxy.java b/src/com/android/phone/CallHandlerServiceProxy.java
index 2f71457..e54b624 100644
--- a/src/com/android/phone/CallHandlerServiceProxy.java
+++ b/src/com/android/phone/CallHandlerServiceProxy.java
@@ -31,8 +31,11 @@
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.os.SystemProperties;
+import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.internal.telephony.Connection;
+import com.android.internal.telephony.Connection.PostDialState;
 import com.android.phone.AudioRouter.AudioModeListener;
 import com.android.phone.NotificationMgr.StatusBarHelper;
 import com.android.services.telephony.common.AudioMode;
@@ -207,7 +210,9 @@
 
 
     @Override
-    public void onPostDialWait(int callId, String remainingChars) {
+    public void onPostDialAction(Connection.PostDialState state, int callId, String remainingChars,
+            char currentChar) {
+        if (state != PostDialState.WAIT) return;
         try {
             synchronized (mServiceAndQueueLock) {
                 if (mCallHandlerServiceGuarded == null) {
diff --git a/src/com/android/phone/CallModeler.java b/src/com/android/phone/CallModeler.java
index 75da0be..11792af 100644
--- a/src/com/android/phone/CallModeler.java
+++ b/src/com/android/phone/CallModeler.java
@@ -265,20 +265,23 @@
             final Connection.PostDialState state = (Connection.PostDialState) r.userObj;
 
             switch (state) {
-                // TODO(klp): add other post dial related functions
                 case WAIT:
                     final Call call = getCallFromMap(mCallMap, c, false);
                     if (call == null) {
                         Log.i(TAG, "Call no longer exists. Skipping onPostDialWait().");
                     } else {
                         for (Listener mListener : mListeners) {
-                            mListener.onPostDialWait(call.getCallId(),
-                                    c.getRemainingPostDialString());
+                            mListener.onPostDialAction(state, call.getCallId(),
+                                    c.getRemainingPostDialString(), ch);
                         }
                     }
                     break;
-
                 default:
+                    // This is primarily to cause the DTMFTonePlayer to play local tones.
+                    // Other listeners simply perform no-ops.
+                    for (Listener mListener : mListeners) {
+                        mListener.onPostDialAction(state, 0, "", ch);
+                    }
                     break;
             }
         }
@@ -840,7 +843,8 @@
         void onDisconnect(Call call);
         void onIncoming(Call call);
         void onUpdate(List<Call> calls);
-        void onPostDialWait(int callId, String remainingChars);
+        void onPostDialAction(Connection.PostDialState state, int callId, String remainingChars,
+                char c);
     }
 
     /**
diff --git a/src/com/android/phone/DTMFTonePlayer.java b/src/com/android/phone/DTMFTonePlayer.java
index 0acd114..b8adaf1 100644
--- a/src/com/android/phone/DTMFTonePlayer.java
+++ b/src/com/android/phone/DTMFTonePlayer.java
@@ -27,6 +27,7 @@
 import android.util.Log;
 
 import com.android.internal.telephony.CallManager;
+import com.android.internal.telephony.Connection.PostDialState;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.services.telephony.common.Call;
@@ -124,8 +125,25 @@
     }
 
     @Override
-    public void onPostDialWait(int callId, String chars) {
-        // no-op
+    public void onPostDialAction(PostDialState state, int callId, String remainingChars,
+            char currentChar) {
+        switch (state) {
+            case STARTED:
+                stopLocalToneIfNeeded();
+                if (!mToneMap.containsKey(currentChar)) {
+                    return;
+                }
+                startLocalToneIfNeeded(currentChar);
+                break;
+            case PAUSE:
+            case WAIT:
+            case WILD:
+            case COMPLETE:
+                stopLocalToneIfNeeded();
+                break;
+            default:
+                break;
+        }
     }
 
     /**
@@ -387,5 +405,4 @@
             Log.d(LOG_TAG, msg);
         }
     }
-
 }