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".
*