Update the Telecomm APIs to use CallInfo.

Replace uses of callId and/or handle with a single, extensible CallInfo
object.

Change-Id: I4b7b86ccb7153e5dc49f4d3fa31f485fd06a960a
This commit is contained in:
Santos Cordon
2014-01-16 19:53:05 -08:00
committed by Evan Charlton
parent 8986ef4601
commit 658c0cf6c3
5 changed files with 56 additions and 60 deletions

View File

@@ -20,6 +20,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import java.util.Date;
import java.util.UUID;
/**
* A parcelable holder class of Call information data. This class is intended for transfering call
@@ -35,6 +36,11 @@ public final class CallInfo implements Parcelable {
*/
private final String mHandle;
/**
* Unique identifier for the call as a UUID string.
*/
private String mId;
// There are 4 timestamps that are important to a call:
// 1) Created timestamp - The time at which the user explicitly chose to make the call.
// 2) Connected timestamp - The time at which a call service confirms that it has connected
@@ -49,8 +55,12 @@ public final class CallInfo implements Parcelable {
/**
* Persists handle of the other party of this call.
*
* @param id The unique ID of the call.
* @param handle The handle to the other party in this call.
*/
public CallInfo(String handle) {
public CallInfo(String id, String handle) {
mId = id;
mHandle = handle;
}
@@ -58,6 +68,10 @@ public final class CallInfo implements Parcelable {
return mHandle;
}
public String getId() {
return mId;
}
//
// Parceling related code below here.
//
@@ -70,7 +84,10 @@ public final class CallInfo implements Parcelable {
@Override
public CallInfo createFromParcel(Parcel source) {
return new CallInfo(source.readString());
String id = source.readString();
String handle = source.readString();
return new CallInfo(id, handle);
}
@Override
@@ -92,6 +109,7 @@ public final class CallInfo implements Parcelable {
*/
@Override
public void writeToParcel(Parcel destination, int flags) {
destination.writeString(mId);
destination.writeString(mHandle);
}
}

View File

@@ -59,25 +59,10 @@ public abstract class CallService extends Service {
setCallServiceAdapter((ICallServiceAdapter) msg.obj);
break;
case MSG_IS_COMPATIBLE_WITH:
// See {@link CallServiceWrapper#isCompatibleWith} for dataObject definition.
try {
// TODO(santoscordon): Switch to using a custom class here instead. When we
// switch to using Call objects instead of handles directly, this may not even be
// necessary.
Pair<String, String> dataObject = (Pair<String, String>) msg.obj;
isCompatibleWith(dataObject.first, dataObject.second);
} catch (ClassCastException e) {
Log.e(TAG, "Unexpected object type for MSG_IS_COMPATIBLE_WITH.", e);
}
isCompatibleWith((CallInfo) msg.obj);
break;
case MSG_CALL:
// See {@link CallServiceWrapper#call} for dataObject definition.
try {
Pair<String, String> dataObject = (Pair<String, String>) msg.obj;
call(dataObject.first, dataObject.second);
} catch (ClassCastException e) {
Log.e(TAG, "Unexpected object type for MSG_CALL.", e);
}
call((CallInfo) msg.obj);
break;
case MSG_DISCONNECT:
disconnect((String) msg.obj);
@@ -99,15 +84,13 @@ public abstract class CallService extends Service {
}
@Override
public void isCompatibleWith(String handle, String callId) {
Pair<String, String> dataObject = new Pair<String, String>(handle, callId);
mMessageHandler.obtainMessage(MSG_IS_COMPATIBLE_WITH, dataObject).sendToTarget();
public void isCompatibleWith(CallInfo callInfo) {
mMessageHandler.obtainMessage(MSG_IS_COMPATIBLE_WITH, callInfo).sendToTarget();
}
@Override
public void call(String handle, String callId) {
Pair<String, String> dataObject = new Pair<String, String>(handle, callId);
mMessageHandler.obtainMessage(MSG_CALL, dataObject).sendToTarget();
public void call(CallInfo callInfo) {
mMessageHandler.obtainMessage(MSG_CALL, callInfo).sendToTarget();
}
@Override
@@ -170,27 +153,25 @@ public abstract class CallService extends Service {
public abstract void setCallServiceAdapter(ICallServiceAdapter callServiceAdapter);
/**
* Determines if the CallService can make calls to the handle. Response is sent via
* ICallServiceAdapter. When responding, the correct call ID must be specified along with
* the handle.
* Determines if the CallService can place the specified call. Response is sent via
* {@link ICallServiceAdapter#setCompatibleWith}. When responding, the correct call ID must be
* specified.
*
* @param handle The destination handle to test against.
* @param callId The call identifier associated with this compatibility request.
* @param callInfo The details of the relevant call.
*/
public abstract void isCompatibleWith(String handle, String callId);
public abstract void isCompatibleWith(CallInfo callInfo);
/**
* Attempts to call the relevant party using the specified handle, be it a phone number,
* Attempts to call the relevant party using the specified call's handle, be it a phone number,
* SIP address, or some other kind of user ID. Note that the set of handle types is
* dynamically extensible since call providers should be able to implement arbitrary
* handle-calling systems. See {@link #isCompatibleWith}. It is expected that the
* call service respond via {@link ICallServiceAdapter#newOutgoingCall} if it can successfully
* make the call.
*
* @param handle The destination handle to call.
* @param callId Unique identifier for the call.
* @param callInfo The details of the relevant call.
*/
public abstract void call(String handle, String callId);
public abstract void call(CallInfo callInfo);
/**
* Disconnects the specified call.

View File

@@ -16,6 +16,7 @@
package android.telecomm;
import android.telecomm.CallInfo;
import android.telecomm.ICallServiceAdapter;
/**
@@ -43,22 +44,19 @@ oneway interface ICallService {
void setCallServiceAdapter(in ICallServiceAdapter callServiceAdapter);
/**
* Determines if the ICallService can make calls to the handle. Response is sent via
* Determines if the ICallService can place the specified call. Response is sent via
* {@link ICallServiceAdapter#setCompatibleWith}. When responding, the correct call ID must be
* specified along with the handle. It is expected that the call service respond within 500
* milliseconds. Any response that takes longer than 500 milliseconds will be treated as being
* incompatible.
* specified. It is expected that the call service respond within 500 milliseconds. Any response
* that takes longer than 500 milliseconds will be treated as being incompatible.
* TODO(santoscordon): 500 ms was arbitrarily chosen and must be confirmed before this
* API is made public.
* TODO(santoscordon): Switch from specific parameters to CallInfo/Call.
*
* @param handle The destination handle to test against.
* @param callId The call identifier associated with this compatibility request.
* @param callInfo The details of the relevant call.
*/
void isCompatibleWith(String handle, String callId);
void isCompatibleWith(in CallInfo callInfo);
/**
* Attempts to call the relevant party using the specified handle, be it a phone number,
* Attempts to call the relevant party using the specified call's handle, be it a phone number,
* SIP address, or some other kind of user ID. Note that the set of handle types is
* dynamically extensible since call providers should be able to implement arbitrary
* handle-calling systems. See {@link #isCompatibleWith}. It is expected that the
@@ -67,10 +65,9 @@ oneway interface ICallService {
* TODO(santoscordon): Figure out how a calls service can short-circuit a failure to
* the adapter.
*
* @param handle The destination handle to call.
* @param callId Unique identifier for the call.
* @param callInfo The details of the relevant call.
*/
void call(String handle, String callId);
void call(in CallInfo callInfo);
/**
* Disconnects the call identified by callId.

View File

@@ -31,13 +31,16 @@ oneway interface ICallServiceAdapter {
void getNextCallId(/* TODO(santoscordon): Needs response object */);
/**
* Receives confirmation of the call service's ability to make a call to the specified handle.
* Receives confirmation of a call service's ability to place a call. This method is used in
* response to {@link ICallService#isCompatibleWith}.
* TODO(santoscordon): rename to setIsCompatibleWith().
*
* @param handle The handle to call.
* @param callId The identifier of the call for which compatibility is being received.
* @param isCompatible True if the call service can place a call to the handle.
* @param callId The identifier of the call for which compatibility is being received. This ID
* should correspond to the ID given as part of the call information in
* {@link ICallService#isCompatibleWith}.
* @param isCompatible True if the call service can place the call.
*/
void setCompatibleWith(String handle, String callId, boolean isCompatible);
void setCompatibleWith(String callId, boolean isCompatible);
/**
* Tells CallsManager of a new incoming call.

View File

@@ -16,6 +16,7 @@
package android.telecomm;
import android.telecomm.CallInfo;
import android.telecomm.ICallService;
import android.telecomm.ICallServiceSelectionResponse;
import android.telecomm.ICallSwitchabilityResponse;
@@ -67,27 +68,23 @@ oneway interface ICallServiceSelector {
/**
* Initiates the process to retrieve the sorted set of call services that are preferred
* by this call-service selector.
* TODO(gilad): Pass reduced-visibility call-service objects, see isSwitchable/callId below.
* TODO(gilad): Consider passing a Call object encapsulating the relevant call details (e.g.
* handle, contactInfo, etc).
*
* @param handle The handle to dial.
* @param callInfo The details of the relevant call.
* @param callServiceBinders The list of binders to select call services from.
* @param response The response object through which the selected services are passed back
* to the switchboard.
*/
void select(
String handle,
in CallInfo callInfo,
in List<IBinder> callServiceBinders,
in ICallServiceSelectionResponse response);
/**
* Determines if the specified ongoing call can/should be switched from the currently-used
* call service to another.
* TODO(gilad): Pass a CallInfo instead that contains (among other fields) the callId.
*
* @param callId The identifier of the call to disconnect.
* @param callInfo The details of the relevant call.
* @param response The response object to be populated and returned to switchboard.
*/
void isSwitchable(String callId, in ICallSwitchabilityResponse response);
void isSwitchable(in CallInfo callInfo, in ICallSwitchabilityResponse response);
}