summaryrefslogtreecommitdiffstats
path: root/telecomm
diff options
context:
space:
mode:
authorSailesh Nepal <sail@google.com>2014-04-03 12:54:33 -0700
committerSailesh Nepal <sail@google.com>2014-04-03 22:12:26 -0700
commitb632e5b122d82333c390cc334ab17100bc2af7a2 (patch)
treee0376a16079627f6c9cbd728889f7edb1cfc7ec6 /telecomm
parent34c3c05963e350c477f2e34dcf9d9e05641487ff (diff)
downloadframeworks_base-b632e5b122d82333c390cc334ab17100bc2af7a2.zip
frameworks_base-b632e5b122d82333c390cc334ab17100bc2af7a2.tar.gz
frameworks_base-b632e5b122d82333c390cc334ab17100bc2af7a2.tar.bz2
Handoff: Add APIs to allow handoff between call services
This CL adds: - CallInfo.mExtra and CallInfo.mCurrentCallServiceDescriptor. These can be used by the selector to perform handoff. - InCallService.setHandoffEnabled to enform the in-call UI that handoff is allowed. - InCallAdapater.handoffCall to initiate handoff. Bug: 13643568 Change-Id: I94c28b10c0e0a253450f14d31ecdc416d5b44ca4
Diffstat (limited to 'telecomm')
-rw-r--r--telecomm/java/android/telecomm/CallInfo.java43
-rw-r--r--telecomm/java/android/telecomm/CallServiceSelector.java22
-rw-r--r--telecomm/java/android/telecomm/InCallAdapter.java12
-rw-r--r--telecomm/java/android/telecomm/InCallService.java19
-rw-r--r--telecomm/java/com/android/internal/telecomm/ICallServiceSelector.aidl4
-rw-r--r--telecomm/java/com/android/internal/telecomm/IInCallAdapter.aidl2
-rw-r--r--telecomm/java/com/android/internal/telecomm/IInCallService.aidl2
7 files changed, 101 insertions, 3 deletions
diff --git a/telecomm/java/android/telecomm/CallInfo.java b/telecomm/java/android/telecomm/CallInfo.java
index bb08c2a..b0a7a99 100644
--- a/telecomm/java/android/telecomm/CallInfo.java
+++ b/telecomm/java/android/telecomm/CallInfo.java
@@ -17,6 +17,7 @@
package android.telecomm;
import android.net.Uri;
+import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -51,6 +52,15 @@ public final class CallInfo implements Parcelable {
*/
private final GatewayInfo mGatewayInfo;
+ /**
+ * Additional information that can be persisted. For example, extra handoff information can
+ * attached to a call using {@link CallServiceSelectorAdapter#setHandoffInfo(String,Uri,Bundle).
+ */
+ private final Bundle mExtras;
+
+ /** The descriptor for the call service currently routing this call. */
+ private final CallServiceDescriptor mCurrentCallServiceDescriptor;
+
// 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
@@ -64,7 +74,7 @@ public final class CallInfo implements Parcelable {
// 4) Disconnected timestamp - The time at which the call was disconnected.
public CallInfo(String id, CallState state, Uri handle) {
- this(id, state, handle, null);
+ this(id, state, handle, null, Bundle.EMPTY, null);
}
/**
@@ -74,14 +84,25 @@ public final class CallInfo implements Parcelable {
* @param state The state of the call.
* @param handle The handle to the other party in this call.
* @param gatewayInfo Gateway information pertaining to this call.
+ * @param extras Additional information that can be persisted.
+ * @param currentCallServiceDescriptor The descriptor for the call service currently routing
+ * this call.
*
* @hide
*/
- public CallInfo(String id, CallState state, Uri handle, GatewayInfo gatewayInfo) {
+ public CallInfo(
+ String id,
+ CallState state,
+ Uri handle,
+ GatewayInfo gatewayInfo,
+ Bundle extras,
+ CallServiceDescriptor currentCallServiceDescriptor) {
mId = id;
mState = state;
mHandle = handle;
mGatewayInfo = gatewayInfo;
+ mExtras = extras;
+ mCurrentCallServiceDescriptor = currentCallServiceDescriptor;
}
public String getId() {
@@ -112,6 +133,14 @@ public final class CallInfo implements Parcelable {
return mGatewayInfo;
}
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ public CallServiceDescriptor getCurrentCallServiceDescriptor() {
+ return mCurrentCallServiceDescriptor;
+ }
+
//
// Parceling related code below here.
//
@@ -127,13 +156,17 @@ public final class CallInfo implements Parcelable {
String id = source.readString();
CallState state = CallState.valueOf(source.readString());
Uri handle = Uri.CREATOR.createFromParcel(source);
+
boolean gatewayInfoPresent = source.readByte() != 0;
GatewayInfo gatewayInfo = null;
if (gatewayInfoPresent) {
gatewayInfo = GatewayInfo.CREATOR.createFromParcel(source);
}
- return new CallInfo(id, state, handle, gatewayInfo);
+ ClassLoader classLoader = CallInfo.class.getClassLoader();
+ Bundle extras = source.readParcelable(classLoader);
+ CallServiceDescriptor descriptor = source.readParcelable(classLoader);
+ return new CallInfo(id, state, handle, gatewayInfo, extras, descriptor);
}
@Override
@@ -158,11 +191,15 @@ public final class CallInfo implements Parcelable {
destination.writeString(mId);
destination.writeString(mState.name());
mHandle.writeToParcel(destination, 0);
+
if (mGatewayInfo != null) {
destination.writeByte((byte) 1);
mGatewayInfo.writeToParcel(destination, 0);
} else {
destination.writeByte((byte) 0);
}
+
+ destination.writeParcelable(mExtras, 0);
+ destination.writeParcelable(mCurrentCallServiceDescriptor, 0);
}
}
diff --git a/telecomm/java/android/telecomm/CallServiceSelector.java b/telecomm/java/android/telecomm/CallServiceSelector.java
index 73bcfcd..9e714b4 100644
--- a/telecomm/java/android/telecomm/CallServiceSelector.java
+++ b/telecomm/java/android/telecomm/CallServiceSelector.java
@@ -28,6 +28,9 @@ import com.android.internal.os.SomeArgs;
import com.android.internal.telecomm.ICallServiceSelector;
import com.android.internal.telecomm.ICallServiceSelectorAdapter;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
/**
@@ -39,6 +42,8 @@ public abstract class CallServiceSelector extends Service {
private static final int MSG_SET_CALL_SERVICE_SELECTOR_ADAPTER = 0;
private static final int MSG_SELECT = 1;
+ private final HashMap<String, CallInfo> mCalls = new HashMap<String, CallInfo>();
+
/** Handler to move client-bound method calls to the main thread. */
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
@@ -76,6 +81,16 @@ public abstract class CallServiceSelector extends Service {
args.arg2 = descriptors;
mHandler.obtainMessage(MSG_SELECT, args).sendToTarget();
}
+
+ @Override
+ public void onCallUpdated(CallInfo callInfo) {
+ mCalls.put(callInfo.getId(), callInfo);
+ }
+
+ @Override
+ public void onCallRemoved(String callId) {
+ mCalls.remove(callId);
+ }
}
private final CallServiceSelectorBinder mBinder;
@@ -90,6 +105,13 @@ public abstract class CallServiceSelector extends Service {
}
/**
+ * Returns a list of all calls managed by this selector.
+ */
+ protected final Collection<CallInfo> getCalls() {
+ return Collections.unmodifiableCollection(mCalls.values());
+ }
+
+ /**
* Sets an adapter that allows the selector to communicate with Telecomm.
*
* @param adapter Adapter object for communicating with Telecomm.
diff --git a/telecomm/java/android/telecomm/InCallAdapter.java b/telecomm/java/android/telecomm/InCallAdapter.java
index 2933f17..e41d3f6 100644
--- a/telecomm/java/android/telecomm/InCallAdapter.java
+++ b/telecomm/java/android/telecomm/InCallAdapter.java
@@ -184,4 +184,16 @@ public final class InCallAdapter {
} catch (RemoteException e) {
}
}
+
+ /**
+ * Instructs Telecomm to handoff the call to another call service.
+ *
+ * @param callId The identifier of the call to handoff.
+ */
+ public void handoffCall(String callId) {
+ try {
+ mAdapter.handoffCall(callId);
+ } catch (RemoteException e) {
+ }
+ }
}
diff --git a/telecomm/java/android/telecomm/InCallService.java b/telecomm/java/android/telecomm/InCallService.java
index 3942d70..c70f56e 100644
--- a/telecomm/java/android/telecomm/InCallService.java
+++ b/telecomm/java/android/telecomm/InCallService.java
@@ -46,6 +46,7 @@ public abstract class InCallService extends Service {
private static final int MSG_SET_RINGING = 8;
private static final int MSG_SET_POST_DIAL = 9;
private static final int MSG_SET_POST_DIAL_WAIT = 10;
+ private static final int MSG_SET_HANDOFF_ENABLED = 11;
/** Default Handler used to consolidate binder method calls onto a single thread. */
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@@ -98,6 +99,10 @@ public abstract class InCallService extends Service {
break;
case MSG_ON_AUDIO_STATE_CHANGED:
onAudioStateChanged((CallAudioState) msg.obj);
+ break;
+ case MSG_SET_HANDOFF_ENABLED:
+ setHandoffEnabled((String) msg.obj, msg.arg1 == 1 ? true : false);
+ break;
default:
break;
}
@@ -167,6 +172,12 @@ public abstract class InCallService extends Service {
args.arg2 = remaining;
mHandler.obtainMessage(MSG_SET_POST_DIAL_WAIT, args).sendToTarget();
}
+
+ @Override
+ public void setHandoffEnabled(String callId, boolean isHandoffEnabled) {
+ mHandler.obtainMessage(MSG_SET_HANDOFF_ENABLED, isHandoffEnabled ? 1 : 0, 0,
+ callId).sendToTarget();
+ }
}
private final InCallServiceBinder mBinder;
@@ -277,4 +288,12 @@ public abstract class InCallService extends Service {
* @param remaining The remaining postdial string to be dialed.
*/
protected abstract void setPostDialWait(String callId, String remaining);
+
+ /**
+ * Called when the call's handoff state has changed.
+ *
+ * @param callId The identifier of the call whose handoff state was changed.
+ * @param isHandoffEnabled True if handoff is enabled.
+ */
+ protected abstract void setHandoffEnabled(String callId, boolean isHandoffEnabled);
}
diff --git a/telecomm/java/com/android/internal/telecomm/ICallServiceSelector.aidl b/telecomm/java/com/android/internal/telecomm/ICallServiceSelector.aidl
index 0dd3855..9597dc1 100644
--- a/telecomm/java/com/android/internal/telecomm/ICallServiceSelector.aidl
+++ b/telecomm/java/com/android/internal/telecomm/ICallServiceSelector.aidl
@@ -35,4 +35,8 @@ oneway interface ICallServiceSelector {
void setCallServiceSelectorAdapter(in ICallServiceSelectorAdapter adapter);
void select(in CallInfo callInfo, in List<CallServiceDescriptor> callServiceDescriptors);
+
+ void onCallUpdated(in CallInfo callInfo);
+
+ void onCallRemoved(String callId);
}
diff --git a/telecomm/java/com/android/internal/telecomm/IInCallAdapter.aidl b/telecomm/java/com/android/internal/telecomm/IInCallAdapter.aidl
index e0cdb83..512e898 100644
--- a/telecomm/java/com/android/internal/telecomm/IInCallAdapter.aidl
+++ b/telecomm/java/com/android/internal/telecomm/IInCallAdapter.aidl
@@ -45,4 +45,6 @@ oneway interface IInCallAdapter {
void stopDtmfTone(String callId);
void postDialContinue(String callId);
+
+ void handoffCall(String callId);
}
diff --git a/telecomm/java/com/android/internal/telecomm/IInCallService.aidl b/telecomm/java/com/android/internal/telecomm/IInCallService.aidl
index f5847df..4187fa8 100644
--- a/telecomm/java/com/android/internal/telecomm/IInCallService.aidl
+++ b/telecomm/java/com/android/internal/telecomm/IInCallService.aidl
@@ -48,4 +48,6 @@ oneway interface IInCallService {
void setPostDial(String callId, String remaining);
void setPostDialWait(String callId, String remaining);
+
+ void setHandoffEnabled(String callId, boolean isHandoffEnabled);
}