diff options
-rw-r--r-- | api/current.txt | 14 | ||||
-rw-r--r-- | api/system-current.txt | 14 | ||||
-rw-r--r-- | api/test-current.txt | 14 | ||||
-rw-r--r-- | telecomm/java/android/telecom/Call.java | 66 | ||||
-rw-r--r-- | telecomm/java/android/telecom/ConnectionService.java | 37 | ||||
-rw-r--r-- | telecomm/java/android/telecom/InCallAdapter.java | 17 | ||||
-rw-r--r-- | telecomm/java/android/telecom/PhoneAccount.java | 10 | ||||
-rw-r--r-- | telecomm/java/android/telecom/TelecomManager.java | 35 | ||||
-rw-r--r-- | telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl | 3 | ||||
-rw-r--r-- | telecomm/java/com/android/internal/telecom/ITelecomService.aidl | 5 |
10 files changed, 208 insertions, 7 deletions
diff --git a/api/current.txt b/api/current.txt index 4dbbfaa45a15..db5b509854ce 100644 --- a/api/current.txt +++ b/api/current.txt @@ -38687,6 +38687,7 @@ package android.telecom { method public android.telecom.Call.RttCall getRttCall(); method public int getState(); method public android.telecom.InCallService.VideoCall getVideoCall(); + method public void handoverTo(android.telecom.PhoneAccountHandle, int, android.os.Bundle); method public void hold(); method public boolean isRttActive(); method public void mergeConference(); @@ -38731,6 +38732,8 @@ package android.telecom { method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>); method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle); method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details); + method public void onHandoverComplete(android.telecom.Call); + method public void onHandoverFailed(android.telecom.Call, int); method public void onParentChanged(android.telecom.Call, android.telecom.Call); method public void onPostDialWait(android.telecom.Call, java.lang.String); method public void onRttInitiationFailure(android.telecom.Call, int); @@ -38739,6 +38742,10 @@ package android.telecom { method public void onRttStatusChanged(android.telecom.Call, boolean, android.telecom.Call.RttCall); method public void onStateChanged(android.telecom.Call, int); method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall); + field public static final int HANDOVER_FAILURE_DEST_APP_REJECTED = 1; // 0x1 + field public static final int HANDOVER_FAILURE_DEST_INVALID_PERM = 3; // 0x3 + field public static final int HANDOVER_FAILURE_DEST_NOT_SUPPORTED = 2; // 0x2 + field public static final int HANDOVER_FAILURE_DEST_USER_REJECTED = 4; // 0x4 } public static class Call.Details { @@ -39072,8 +39079,11 @@ package android.telecom { method public void onConference(android.telecom.Connection, android.telecom.Connection); method public android.telecom.Connection onCreateIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public void onCreateIncomingConnectionFailed(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); + method public android.telecom.Connection onCreateIncomingHandoverConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public android.telecom.Connection onCreateOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public void onCreateOutgoingConnectionFailed(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); + method public android.telecom.Connection onCreateOutgoingHandoverConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); + method public void onHandoverFailed(android.telecom.ConnectionRequest, int); method public void onRemoteConferenceAdded(android.telecom.RemoteConference); method public void onRemoteExistingConnectionAdded(android.telecom.RemoteConnection); field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.ConnectionService"; @@ -39196,6 +39206,9 @@ package android.telecom { field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR; field public static final java.lang.String EXTRA_CALL_SUBJECT_CHARACTER_ENCODING = "android.telecom.extra.CALL_SUBJECT_CHARACTER_ENCODING"; field public static final java.lang.String EXTRA_CALL_SUBJECT_MAX_LENGTH = "android.telecom.extra.CALL_SUBJECT_MAX_LENGTH"; + field public static final java.lang.String EXTRA_LOG_SELF_MANAGED_CALLS = "android.telecom.extra.LOG_SELF_MANAGED_CALLS"; + field public static final java.lang.String EXTRA_SUPPORTS_HANDOVER_FROM = "android.telecom.extra.SUPPORTS_HANDOVER_FROM"; + field public static final java.lang.String EXTRA_SUPPORTS_HANDOVER_TO = "android.telecom.extra.SUPPORTS_HANDOVER_TO"; field public static final int NO_HIGHLIGHT_COLOR = 0; // 0x0 field public static final int NO_RESOURCE_ID = -1; // 0xffffffff field public static final java.lang.String SCHEME_SIP = "sip"; @@ -39356,6 +39369,7 @@ package android.telecom { } public class TelecomManager { + method public void acceptHandover(android.net.Uri, int, android.telecom.PhoneAccountHandle); method public void acceptRingingCall(); method public void acceptRingingCall(int); method public void addNewIncomingCall(android.telecom.PhoneAccountHandle, android.os.Bundle); diff --git a/api/system-current.txt b/api/system-current.txt index 9bce26584e89..7e9ee830e6c2 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -41920,6 +41920,7 @@ package android.telecom { method public android.telecom.Call.RttCall getRttCall(); method public int getState(); method public android.telecom.InCallService.VideoCall getVideoCall(); + method public void handoverTo(android.telecom.PhoneAccountHandle, int, android.os.Bundle); method public void hold(); method public boolean isRttActive(); method public void mergeConference(); @@ -41966,6 +41967,8 @@ package android.telecom { method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>); method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle); method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details); + method public void onHandoverComplete(android.telecom.Call); + method public void onHandoverFailed(android.telecom.Call, int); method public void onParentChanged(android.telecom.Call, android.telecom.Call); method public void onPostDialWait(android.telecom.Call, java.lang.String); method public void onRttInitiationFailure(android.telecom.Call, int); @@ -41974,6 +41977,10 @@ package android.telecom { method public void onRttStatusChanged(android.telecom.Call, boolean, android.telecom.Call.RttCall); method public void onStateChanged(android.telecom.Call, int); method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall); + field public static final int HANDOVER_FAILURE_DEST_APP_REJECTED = 1; // 0x1 + field public static final int HANDOVER_FAILURE_DEST_INVALID_PERM = 3; // 0x3 + field public static final int HANDOVER_FAILURE_DEST_NOT_SUPPORTED = 2; // 0x2 + field public static final int HANDOVER_FAILURE_DEST_USER_REJECTED = 4; // 0x4 } public static class Call.Details { @@ -42318,8 +42325,11 @@ package android.telecom { method public void onConference(android.telecom.Connection, android.telecom.Connection); method public android.telecom.Connection onCreateIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public void onCreateIncomingConnectionFailed(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); + method public android.telecom.Connection onCreateIncomingHandoverConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public android.telecom.Connection onCreateOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public void onCreateOutgoingConnectionFailed(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); + method public android.telecom.Connection onCreateOutgoingHandoverConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); + method public void onHandoverFailed(android.telecom.ConnectionRequest, int); method public void onRemoteConferenceAdded(android.telecom.RemoteConference); method public void onRemoteExistingConnectionAdded(android.telecom.RemoteConnection); field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.ConnectionService"; @@ -42567,6 +42577,9 @@ package android.telecom { field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR; field public static final java.lang.String EXTRA_CALL_SUBJECT_CHARACTER_ENCODING = "android.telecom.extra.CALL_SUBJECT_CHARACTER_ENCODING"; field public static final java.lang.String EXTRA_CALL_SUBJECT_MAX_LENGTH = "android.telecom.extra.CALL_SUBJECT_MAX_LENGTH"; + field public static final java.lang.String EXTRA_LOG_SELF_MANAGED_CALLS = "android.telecom.extra.LOG_SELF_MANAGED_CALLS"; + field public static final java.lang.String EXTRA_SUPPORTS_HANDOVER_FROM = "android.telecom.extra.SUPPORTS_HANDOVER_FROM"; + field public static final java.lang.String EXTRA_SUPPORTS_HANDOVER_TO = "android.telecom.extra.SUPPORTS_HANDOVER_TO"; field public static final int NO_HIGHLIGHT_COLOR = 0; // 0x0 field public static final int NO_RESOURCE_ID = -1; // 0xffffffff field public static final java.lang.String SCHEME_SIP = "sip"; @@ -42768,6 +42781,7 @@ package android.telecom { } public class TelecomManager { + method public void acceptHandover(android.net.Uri, int, android.telecom.PhoneAccountHandle); method public void acceptRingingCall(); method public void acceptRingingCall(int); method public void addNewIncomingCall(android.telecom.PhoneAccountHandle, android.os.Bundle); diff --git a/api/test-current.txt b/api/test-current.txt index 7534e9f9d618..33d96a7b6e6b 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -38894,6 +38894,7 @@ package android.telecom { method public android.telecom.Call.RttCall getRttCall(); method public int getState(); method public android.telecom.InCallService.VideoCall getVideoCall(); + method public void handoverTo(android.telecom.PhoneAccountHandle, int, android.os.Bundle); method public void hold(); method public boolean isRttActive(); method public void mergeConference(); @@ -38938,6 +38939,8 @@ package android.telecom { method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>); method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle); method public void onDetailsChanged(android.telecom.Call, android.telecom.Call.Details); + method public void onHandoverComplete(android.telecom.Call); + method public void onHandoverFailed(android.telecom.Call, int); method public void onParentChanged(android.telecom.Call, android.telecom.Call); method public void onPostDialWait(android.telecom.Call, java.lang.String); method public void onRttInitiationFailure(android.telecom.Call, int); @@ -38946,6 +38949,10 @@ package android.telecom { method public void onRttStatusChanged(android.telecom.Call, boolean, android.telecom.Call.RttCall); method public void onStateChanged(android.telecom.Call, int); method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall); + field public static final int HANDOVER_FAILURE_DEST_APP_REJECTED = 1; // 0x1 + field public static final int HANDOVER_FAILURE_DEST_INVALID_PERM = 3; // 0x3 + field public static final int HANDOVER_FAILURE_DEST_NOT_SUPPORTED = 2; // 0x2 + field public static final int HANDOVER_FAILURE_DEST_USER_REJECTED = 4; // 0x4 } public static class Call.Details { @@ -39296,8 +39303,11 @@ package android.telecom { method public void onConference(android.telecom.Connection, android.telecom.Connection); method public android.telecom.Connection onCreateIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public void onCreateIncomingConnectionFailed(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); + method public android.telecom.Connection onCreateIncomingHandoverConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public android.telecom.Connection onCreateOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public void onCreateOutgoingConnectionFailed(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); + method public android.telecom.Connection onCreateOutgoingHandoverConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); + method public void onHandoverFailed(android.telecom.ConnectionRequest, int); method public void onRemoteConferenceAdded(android.telecom.RemoteConference); method public void onRemoteExistingConnectionAdded(android.telecom.RemoteConnection); field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.ConnectionService"; @@ -39420,6 +39430,9 @@ package android.telecom { field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR; field public static final java.lang.String EXTRA_CALL_SUBJECT_CHARACTER_ENCODING = "android.telecom.extra.CALL_SUBJECT_CHARACTER_ENCODING"; field public static final java.lang.String EXTRA_CALL_SUBJECT_MAX_LENGTH = "android.telecom.extra.CALL_SUBJECT_MAX_LENGTH"; + field public static final java.lang.String EXTRA_LOG_SELF_MANAGED_CALLS = "android.telecom.extra.LOG_SELF_MANAGED_CALLS"; + field public static final java.lang.String EXTRA_SUPPORTS_HANDOVER_FROM = "android.telecom.extra.SUPPORTS_HANDOVER_FROM"; + field public static final java.lang.String EXTRA_SUPPORTS_HANDOVER_TO = "android.telecom.extra.SUPPORTS_HANDOVER_TO"; field public static final int NO_HIGHLIGHT_COLOR = 0; // 0x0 field public static final int NO_RESOURCE_ID = -1; // 0xffffffff field public static final java.lang.String SCHEME_SIP = "sip"; @@ -39580,6 +39593,7 @@ package android.telecom { } public class TelecomManager { + method public void acceptHandover(android.net.Uri, int, android.telecom.PhoneAccountHandle); method public void acceptRingingCall(); method public void acceptRingingCall(int); method public void addNewIncomingCall(android.telecom.PhoneAccountHandle, android.os.Bundle); diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index e8e06808e189..f81c89af8abf 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -856,6 +856,39 @@ public final class Call { */ public static abstract class Callback { /** + * @hide + */ + @IntDef({HANDOVER_FAILURE_DEST_APP_REJECTED, HANDOVER_FAILURE_DEST_NOT_SUPPORTED, + HANDOVER_FAILURE_DEST_INVALID_PERM, HANDOVER_FAILURE_DEST_USER_REJECTED}) + @Retention(RetentionPolicy.SOURCE) + public @interface HandoverFailureErrors {} + + /** + * Handover failure reason returned via {@link #onHandoverFailed(Call, int)} when the app + * to handover the call rejects handover. + */ + public static final int HANDOVER_FAILURE_DEST_APP_REJECTED = 1; + + /** + * Handover failure reason returned via {@link #onHandoverFailed(Call, int)} when there is + * an error associated with unsupported handover. + */ + public static final int HANDOVER_FAILURE_DEST_NOT_SUPPORTED = 2; + + /** + * Handover failure reason returned via {@link #onHandoverFailed(Call, int)} when there + * are some permission errors associated with APIs doing handover. + */ + public static final int HANDOVER_FAILURE_DEST_INVALID_PERM = 3; + + /** + * Handover failure reason returned via {@link #onHandoverFailed(Call, int)} when user + * rejects handover. + */ + public static final int HANDOVER_FAILURE_DEST_USER_REJECTED = 4; + + + /** * Invoked when the state of this {@code Call} has changed. See {@link #getState()}. * * @param call The {@code Call} invoking this method. @@ -990,6 +1023,21 @@ public final class Call { * {@link android.telecom.Connection.RttModifyStatus#SESSION_MODIFY_REQUEST_SUCCESS}. */ public void onRttInitiationFailure(Call call, int reason) {} + + /** + * Invoked when Call handover from one {@link PhoneAccount} to other {@link PhoneAccount} + * has completed successfully. + * @param call The call which had initiated handover. + */ + public void onHandoverComplete(Call call) {} + + /** + * Invoked when Call handover from one {@link PhoneAccount} to other {@link PhoneAccount} + * has failed. + * @param call The call which had initiated handover. + * @param failureReason Error reason for failure + */ + public void onHandoverFailed(Call call, @HandoverFailureErrors int failureReason) {} } /** @@ -1366,6 +1414,24 @@ public final class Call { } /** + * Initiates a handover of this {@link Call} to the {@link ConnectionService} identified + * by {@code toHandle}. The videoState specified indicates the desired video state after the + * handover. + * <p> + * A handover request is initiated by the user from one app to indicate a desire + * to handover a call to another. + * + * @param toHandle {@link PhoneAccountHandle} of the {@link ConnectionService} to handover + * this call to. + * @param videoState Indicates the video state desired after the handover. + * @param extras Bundle containing extra information to be passed to the + * {@link ConnectionService} + */ + public void handoverTo(PhoneAccountHandle toHandle, int videoState, Bundle extras) { + mInCallAdapter.handoverTo(mTelecomCallId, toHandle, videoState, extras); + } + + /** * Terminate the RTT session on this call. The resulting state change will be notified via * the {@link Callback#onRttStatusChanged(Call, boolean, RttCall)} callback. */ diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index 35804f64f4d7..da8ac5ec00d7 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -2033,6 +2033,43 @@ public abstract class ConnectionService extends Service { } /** + * Called by Telecom on the initiating side of the handover to create an instance of a + * handover connection. + * @param fromPhoneAccountHandle {@link PhoneAccountHandle} associated with the + * ConnectionService which needs to handover the call. + * @param request Details about the call which needs to be handover. + * @return Connection object corresponding to the handover call. + */ + public Connection onCreateOutgoingHandoverConnection(PhoneAccountHandle fromPhoneAccountHandle, + ConnectionRequest request) { + return null; + } + + /** + * Called by Telecom on the receiving side of the handover to request the + * {@link ConnectionService} to create an instance of a handover connection. + * @param fromPhoneAccountHandle {@link PhoneAccountHandle} associated with the + * ConnectionService which needs to handover the call. + * @param request Details about the call which needs to be handover. + * @return {@link Connection} object corresponding to the handover call. + */ + public Connection onCreateIncomingHandoverConnection(PhoneAccountHandle fromPhoneAccountHandle, + ConnectionRequest request) { + return null; + } + + /** + * Called by Telecom in response to a {@code TelecomManager#acceptHandover()} + * invocation which failed. + * @param request Details about the call which needs to be handover. + * @param error Reason for handover failure as defined in + * {@link android.telecom.Call.Callback#HANDOVER_FAILURE_DEST_INVALID_PERM} + */ + public void onHandoverFailed(ConnectionRequest request, int error) { + return; + } + + /** * Create a {@code Connection} for a new unknown call. An unknown call is a call originating * from the ConnectionService that was neither a user-initiated outgoing call, nor an incoming * call created using diff --git a/telecomm/java/android/telecom/InCallAdapter.java b/telecomm/java/android/telecom/InCallAdapter.java index 9bf04675613d..4bc2a9b149f2 100644 --- a/telecomm/java/android/telecom/InCallAdapter.java +++ b/telecomm/java/android/telecom/InCallAdapter.java @@ -435,4 +435,21 @@ public final class InCallAdapter { } catch (RemoteException ignored) { } } + + + /** + * Initiates a handover of this {@link Call} to the {@link ConnectionService} identified + * by destAcct. + * @param callId The callId of the Call which calls this function. + * @param destAcct ConnectionService to which the call should be handed over. + * @param videoState The video state desired after the handover. + * @param extras Extra information to be passed to ConnectionService + */ + public void handoverTo(String callId, PhoneAccountHandle destAcct, int videoState, + Bundle extras) { + try { + mAdapter.handoverTo(callId, destAcct, videoState, extras); + } catch (RemoteException ignored) { + } + } } diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index 691e7cf1d34f..74b9465070c5 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -86,13 +86,11 @@ public final class PhoneAccount implements Parcelable { /** * Boolean {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()}) which * indicates whether this {@link PhoneAccount} is capable of supporting a request to handover a - * connection (see {@link android.telecom.Call#EVENT_REQUEST_HANDOVER}) to this - * {@link PhoneAccount} from a {@link PhoneAccount} specifying - * {@link #EXTRA_SUPPORTS_HANDOVER_FROM}. + * connection (see {@code android.telecom.Call#handoverTo()}) to this {@link PhoneAccount} from + * a {@link PhoneAccount} specifying {@link #EXTRA_SUPPORTS_HANDOVER_FROM}. * <p> * A handover request is initiated by the user from the default dialer app to indicate a desire * to handover a call from one {@link PhoneAccount}/{@link ConnectionService} to another. - * @hide */ public static final String EXTRA_SUPPORTS_HANDOVER_TO = "android.telecom.extra.SUPPORTS_HANDOVER_TO"; @@ -113,12 +111,11 @@ public final class PhoneAccount implements Parcelable { * Boolean {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()}) which * indicates whether this {@link PhoneAccount} is capable of supporting a request to handover a * connection from this {@link PhoneAccount} to another {@link PhoneAccount}. - * (see {@link android.telecom.Call#EVENT_REQUEST_HANDOVER}) which specifies + * (see {@code android.telecom.Call#handoverTo()}) which specifies * {@link #EXTRA_SUPPORTS_HANDOVER_TO}. * <p> * A handover request is initiated by the user from the default dialer app to indicate a desire * to handover a call from one {@link PhoneAccount}/{@link ConnectionService} to another. - * @hide */ public static final String EXTRA_SUPPORTS_HANDOVER_FROM = "android.telecom.extra.SUPPORTS_HANDOVER_FROM"; @@ -132,7 +129,6 @@ public final class PhoneAccount implements Parcelable { * <p> * By default, Self-Managed {@link PhoneAccount}s do not log their calls to the call log. * Setting this extra to {@code true} provides a means for them to log their calls. - * @hide */ public static final String EXTRA_LOG_SELF_MANAGED_CALLS = "android.telecom.extra.LOG_SELF_MANAGED_CALLS"; diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index aa2323d29ec2..4d2cb04783d9 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -1749,6 +1749,41 @@ public class TelecomManager { return false; } + /** + * Called from the recipient side of a handover to indicate a desire to accept the handover + * of an ongoing call to another {@link ConnectionService} identified by + * {@link PhoneAccountHandle} destAcct. For managed {@link ConnectionService}s, the specified + * {@link PhoneAccountHandle} must have been registered with {@link #registerPhoneAccount} and + * the user must have enabled the corresponding {@link PhoneAccount}. This can be checked using + * {@link #getPhoneAccount}. Self-managed {@link ConnectionService}s must have + * {@link android.Manifest.permission#MANAGE_OWN_CALLS} to handover a call to it. + * <p> + * Once invoked, this method will cause the system to bind to the {@link ConnectionService} + * associated with the {@link PhoneAccountHandle} destAcct and call + * (See {@link ConnectionService#onCreateIncomingHandoverConnection}). + * <p> + * For a managed {@link ConnectionService}, a {@link SecurityException} will be thrown if either + * the {@link PhoneAccountHandle} destAcct does not correspond to a registered + * {@link PhoneAccount} or the associated {@link PhoneAccount} is not currently enabled by the + * user. + * <p> + * For a self-managed {@link ConnectionService}, a {@link SecurityException} will be thrown if + * the calling app does not have {@link android.Manifest.permission#MANAGE_OWN_CALLS}. + * + * @param srcAddr The {@link android.net.Uri} of the ongoing call to handover to the caller’s + * {@link ConnectionService}. + * @param videoState Video state after the handover. + * @param destAcct The {@link PhoneAccountHandle} registered to the calling package. + */ + public void acceptHandover(Uri srcAddr, int videoState, PhoneAccountHandle destAcct) { + try { + if (isServiceConnected()) { + getTelecomService().acceptHandover(srcAddr, videoState, destAcct); + } + } catch (RemoteException e) { + Log.e(TAG, "RemoteException acceptHandover: " + e); + } + } private ITelecomService getTelecomService() { if (mTelecomServiceOverride != null) { diff --git a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl index bce339207042..23ac940edfa8 100644 --- a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl +++ b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl @@ -77,4 +77,7 @@ oneway interface IInCallAdapter { void stopRtt(String callId); void setRttMode(String callId, int mode); + + void handoverTo(String callId, in PhoneAccountHandle destAcct, int videoState, + in Bundle extras); } diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl index 8ebac2c6273a..3460754ff9eb 100644 --- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl +++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl @@ -274,4 +274,9 @@ interface ITelecomService { * @see TelecomServiceImpl#waitOnHandler */ void waitOnHandlers(); + + /** + * @see TelecomServiceImpl#acceptHandover + */ + void acceptHandover(in Uri srcAddr, int videoState, in PhoneAccountHandle destAcct); } |