Use the new incoming call confirmation APIs.
Update Telecomm and Telecomm test package to use the new
confirm-incoming-call APIs including confirmIncomingCall and
handleConfirmedIncomingCall. Test call service always confirms all
incoming calls.
Also adds a list of unconfirmed incoming calls to the adapter. The
purpose of this is for the adapter to know which incoming call
confirmations to accept and which to ignore.
Change-Id: I914f25c45e5c887ca84d181d3dc173f25577e520
diff --git a/src/com/android/telecomm/CallServiceAdapter.java b/src/com/android/telecomm/CallServiceAdapter.java
index 6308567..9a9d0db 100644
--- a/src/com/android/telecomm/CallServiceAdapter.java
+++ b/src/com/android/telecomm/CallServiceAdapter.java
@@ -20,9 +20,13 @@
import android.os.Looper;
import android.telecomm.CallInfo;
import android.telecomm.ICallServiceAdapter;
+import android.util.Log;
+import com.google.android.collect.Sets;
import com.google.common.base.Strings;
+import java.util.Set;
+
/**
* Used by call services in order to update state and control calls while the call service is bound
* to Telecomm. Each call service is given its own instance for the lifetime of the binding between
@@ -34,6 +38,7 @@
* TODO(santoscordon): Do we need Binder.clear/restoreCallingIdentity() in the service methods?
*/
public final class CallServiceAdapter extends ICallServiceAdapter.Stub {
+ private static final String TAG = CallServiceAdapter.class.getSimpleName();
private final CallsManager mCallsManager;
@@ -42,6 +47,14 @@
/** Used to run code (e.g. messages, Runnables) on the main (UI) thread. */
private final Handler mHandler = new Handler(Looper.getMainLooper());
+ /** The list of unconfirmed incoming call IDs. Contains only IDs for incoming calls which are
+ * pending confirmation from the call service. Entries are added by the call service when a
+ * confirmation request is sent and removed when the confirmation is received or it times out.
+ * See {@link IncomingCallsManager} for more information about the incoming sequence and its
+ * timeouts.
+ */
+ private final Set<String> mUnconfirmedIncomingCallIds = Sets.newHashSet();
+
/**
* Persists the specified parameters.
*/
@@ -51,20 +64,23 @@
}
/** {@inheritDoc} */
- @Override public void getNextCallId() {
- // TODO(santoscordon): needs response object.
- }
-
- /** {@inheritDoc} */
@Override public void setCompatibleWith(String callId, boolean isCompatible) {
// TODO(santoscordon): fill in.
}
- /**
- * {@inheritDoc}
- */
- @Override public void handleIncomingCall(CallInfo callInfo) {
- // TODO(santoscordon): fill in.
+ /** {@inheritDoc} */
+ @Override public void handleConfirmedIncomingCall(final CallInfo callInfo) {
+ checkValidCallId(callInfo.getId());
+ mHandler.post(new Runnable() {
+ @Override public void run() {
+ if (mUnconfirmedIncomingCallIds.remove(callInfo.getId())) {
+ // TODO(santoscordon): Uncomment when ready.
+ // mIncomingCallsManager.handleSuccessfulIncomingCall(callInfo);
+ } else {
+ Log.wtf(TAG, "Call service confirming unknown incoming call " + callInfo);
+ }
+ }
+ });
}
/** {@inheritDoc} */
@@ -128,13 +144,32 @@
}
/**
+ * Adds a call ID to the list of unconfirmed incoming call IDs. Only calls with call IDs in the
+ * list will be handled by {@link #handleConfirmedIncomingCall}.
+ *
+ * @param callId The ID of the call.
+ */
+ void addUnconfirmedIncomingCallId(String callId) {
+ mUnconfirmedIncomingCallIds.add(callId);
+ }
+
+ /**
+ * Removed a call ID from the list of unconfirmed incoming call IDs.
+ *
+ * @param callId The ID of the call.
+ */
+ void removeUnconfirmedIncomingCallId(String callId) {
+ mUnconfirmedIncomingCallIds.remove(callId);
+ }
+
+ /**
* Throws an IllegalArgumentException if the specified call ID is invalid.
*
* @param callId The call ID to check.
*/
private void checkValidCallId(String callId) {
if (Strings.isNullOrEmpty(callId)) {
- throw new IllegalArgumentException();
+ throw new IllegalArgumentException("Invalid call ID.");
}
}
}
diff --git a/src/com/android/telecomm/CallServiceWrapper.java b/src/com/android/telecomm/CallServiceWrapper.java
index 74277c4..2ff1cfc 100644
--- a/src/com/android/telecomm/CallServiceWrapper.java
+++ b/src/com/android/telecomm/CallServiceWrapper.java
@@ -121,6 +121,32 @@
}
}
+ /** See {@link ICallService#confirmIncomingCall}. */
+ public void confirmIncomingCall(String callId, String callToken) {
+ try {
+ if (mServiceInterface == null) {
+ Log.wtf(TAG, "confirmIncomingCall() invoked while service in unbound.");
+ } else {
+ mAdapter.addUnconfirmedIncomingCallId(callId);
+ mServiceInterface.confirmIncomingCall(callId, callToken);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to confirmIncomingCall for call " + callId, e);
+ mAdapter.removeUnconfirmedIncomingCallId(callId);
+ }
+ }
+
+ /**
+ * Cancels the an incoming call confirmation for the specified call ID.
+ * TODO(santoscordon): This method should be called by IncomingCallManager when the incoming
+ * call confirmation has failed.
+ *
+ * @param callId The ID of the call.
+ */
+ void cancelIncomingCall(String callId) {
+ mAdapter.removeUnconfirmedIncomingCallId(callId);
+ }
+
/** {@inheritDoc} */
@Override protected void setServiceInterface(IBinder binder) {
mServiceInterface = ICallService.Stub.asInterface(binder);