Porting DTMF post dial wait feature.

Bug: 10459289
Change-Id: Ib279fcdf71857abae218b70081f7da569901d80c
diff --git a/src/com/android/phone/BluetoothManager.java b/src/com/android/phone/BluetoothManager.java
index dd38632..c2b4f7d 100644
--- a/src/com/android/phone/BluetoothManager.java
+++ b/src/com/android/phone/BluetoothManager.java
@@ -27,8 +27,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.os.Handler;
-import android.os.Message;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.util.Log;
@@ -36,7 +34,6 @@
 import com.android.internal.telephony.CallManager;
 import com.android.services.telephony.common.Call;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -419,6 +416,11 @@
         updateBluetoothIndication();
     }
 
+    @Override
+    public void onPostDialWait(int callId, String chars) {
+        // no-op
+    }
+
     private void log(String msg) {
         Log.d(LOG_TAG, msg);
     }
diff --git a/src/com/android/phone/CallCommandService.java b/src/com/android/phone/CallCommandService.java
index 72273ee..aaa3190 100644
--- a/src/com/android/phone/CallCommandService.java
+++ b/src/com/android/phone/CallCommandService.java
@@ -220,4 +220,20 @@
             Log.e(TAG, "Error setting the audio mode.", e);
         }
     }
+
+    @Override
+    public void postDialCancel(int callId) throws RemoteException {
+        final CallResult result = mCallModeler.getCallWithId(callId);
+        if (result != null) {
+            result.getConnection().cancelPostDial();
+        }
+    }
+
+    @Override
+    public void postDialWaitContinue(int callId) throws RemoteException {
+        final CallResult result = mCallModeler.getCallWithId(callId);
+        if (result != null) {
+            result.getConnection().proceedAfterWaitChar();
+        }
+    }
 }
diff --git a/src/com/android/phone/CallHandlerServiceProxy.java b/src/com/android/phone/CallHandlerServiceProxy.java
index a57ac5b..4820b33 100644
--- a/src/com/android/phone/CallHandlerServiceProxy.java
+++ b/src/com/android/phone/CallHandlerServiceProxy.java
@@ -192,6 +192,26 @@
         }
     }
 
+
+    @Override
+    public void onPostDialWait(int callId, String remainingChars) {
+        try {
+            synchronized (mServiceAndQueueLock) {
+                if (mCallHandlerServiceGuarded == null) {
+                    if (DBG) {
+                        Log.d(TAG, "CallHandlerService not conneccted. Skipping "
+                                + "onPostDialWait().");
+                    }
+                    return;
+                }
+            }
+
+            mCallHandlerServiceGuarded.onPostDialWait(callId, remainingChars);
+        } catch (Exception e) {
+            Log.e(TAG, "Remote exception handling onUpdate", e);
+        }
+    }
+
     @Override
     public void onAudioModeChange(int newMode, boolean muted) {
         try {
diff --git a/src/com/android/phone/CallModeler.java b/src/com/android/phone/CallModeler.java
index 9c7b9dd..502f2cb 100644
--- a/src/com/android/phone/CallModeler.java
+++ b/src/com/android/phone/CallModeler.java
@@ -16,7 +16,6 @@
 
 package com.android.phone;
 
-import android.content.Context;
 import android.os.AsyncResult;
 import android.os.Handler;
 import android.os.Message;
@@ -114,6 +113,9 @@
             case CallStateMonitor.PHONE_STATE_CHANGED:
                 onPhoneStateChanged((AsyncResult) msg.obj);
                 break;
+            case CallStateMonitor.PHONE_ON_DIAL_CHARS:
+                onPostDialChars((AsyncResult) msg.obj, (char) msg.arg1);
+                break;
             default:
                 break;
         }
@@ -192,6 +194,41 @@
         return false;
     }
 
+
+    /**
+     * Handles the POST_ON_DIAL_CHARS message from the Phone (see our call to
+     * mPhone.setOnPostDialCharacter() above.)
+     *
+     * TODO: NEED TO TEST THIS SEQUENCE now that we no longer handle "dialable" key events here in
+     * the InCallScreen: we do directly to the Dialer UI instead.  Similarly, we may now need to go
+     * directly to the Dialer to handle POST_ON_DIAL_CHARS too.
+     */
+    private void onPostDialChars(AsyncResult r, char ch) {
+        final Connection c = (Connection) r.result;
+
+        if (c != null) {
+            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());
+                        }
+                    }
+                    break;
+
+                default:
+                    break;
+            }
+        }
+    }
+
     private void onNewRingingConnection(AsyncResult r) {
         Log.i(TAG, "onNewRingingConnection");
         final Connection conn = (Connection) r.result;
@@ -686,6 +723,7 @@
         void onDisconnect(Call call);
         void onIncoming(Call call);
         void onUpdate(List<Call> calls);
+        void onPostDialWait(int callId, String remainingChars);
     }
 
     /**
diff --git a/src/com/android/phone/CallStateMonitor.java b/src/com/android/phone/CallStateMonitor.java
index 6152277..3e9ff5d 100644
--- a/src/com/android/phone/CallStateMonitor.java
+++ b/src/com/android/phone/CallStateMonitor.java
@@ -56,6 +56,7 @@
     public static final int PHONE_ENHANCED_VP_OFF = 10;
     public static final int PHONE_RINGBACK_TONE = 11;
     public static final int PHONE_RESEND_MUTE = 12;
+    public static final int PHONE_ON_DIAL_CHARS = 13;
 
     // Other events from call manager
     public static final int EVENT_OTA_PROVISION_CHANGE = 20;
@@ -88,6 +89,7 @@
         callManager.registerForInCallVoicePrivacyOff(this, PHONE_ENHANCED_VP_OFF, null);
         callManager.registerForRingbackTone(this, PHONE_RINGBACK_TONE, null);
         callManager.registerForResendIncallMute(this, PHONE_RESEND_MUTE, null);
+        callManager.registerForPostDialCharacter(this, PHONE_ON_DIAL_CHARS, null);
     }
 
     public void addListener(Handler handler) {
@@ -131,6 +133,7 @@
         callManager.unregisterForResendIncallMute(this);
         callManager.unregisterForInCallVoicePrivacyOn(this);
         callManager.unregisterForInCallVoicePrivacyOff(this);
+        callManager.unregisterForPostDialCharacter(this);
 
         registerForNotifications();
     }
diff --git a/src/com/android/phone/DTMFTonePlayer.java b/src/com/android/phone/DTMFTonePlayer.java
index d3ed53e..0acd114 100644
--- a/src/com/android/phone/DTMFTonePlayer.java
+++ b/src/com/android/phone/DTMFTonePlayer.java
@@ -31,8 +31,6 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.services.telephony.common.Call;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -125,6 +123,11 @@
         checkCallState();
     }
 
+    @Override
+    public void onPostDialWait(int callId, String chars) {
+        // no-op
+    }
+
     /**
      * Allocates some resources we keep around during a "dialer session".
      *