Files
frameworks_base/telecomm/java/android/telecomm/ConnectionServiceAdapter.java
Sailesh Nepal 2a46b90222 Move ICallService.aidl to IConnectionService.aidl
Change-Id: I5a082e50dafea0104174cb97d3ae8af168944fc3
2014-07-08 04:15:55 +00:00

341 lines
11 KiB
Java

/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.telecomm;
import android.content.ComponentName;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
import android.os.RemoteException;
import com.android.internal.telecomm.IConnectionService;
import com.android.internal.telecomm.IConnectionServiceAdapter;
import com.android.internal.telecomm.ICallVideoProvider;
import com.android.internal.telecomm.RemoteServiceCallback;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Provides methods for IConnectionService implementations to interact with the system phone app.
*
* @hide
*/
final class ConnectionServiceAdapter implements DeathRecipient {
private final Set<IConnectionServiceAdapter> mAdapters = new HashSet<>();
ConnectionServiceAdapter() {
}
void addAdapter(IConnectionServiceAdapter adapter) {
if (mAdapters.add(adapter)) {
try {
adapter.asBinder().linkToDeath(this, 0);
} catch (RemoteException e) {
mAdapters.remove(adapter);
}
}
}
void removeAdapter(IConnectionServiceAdapter adapter) {
if (mAdapters.remove(adapter)) {
adapter.asBinder().unlinkToDeath(this, 0);
}
}
/** ${inheritDoc} */
@Override
public void binderDied() {
for (IConnectionServiceAdapter adapter : mAdapters) {
if (!adapter.asBinder().isBinderAlive()) {
removeAdapter(adapter);
}
}
}
/**
* Provides Telecomm with the details of an incoming call. An invocation of this method must
* follow {@link ConnectionService#setIncomingCallId} and use the call ID specified therein.
* Upon the invocation of this method, Telecomm will bring up the incoming-call interface where
* the user can elect to answer or reject a call.
*
* @param request The connection request.
*/
void notifyIncomingCall(ConnectionRequest request) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.notifyIncomingCall(request);
} catch (RemoteException e) {
}
}
}
/**
* Tells Telecomm that an attempt to place the specified outgoing call succeeded.
*
* @param request The originating request for a connection.
*/
void handleSuccessfulOutgoingCall(ConnectionRequest request) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.handleSuccessfulOutgoingCall(request);
} catch (RemoteException e) {
}
}
}
/**
* Tells Telecomm that an attempt to place the specified outgoing call failed.
*
* @param request The originating request for a connection.
* @param errorCode The error code associated with the failed call attempt.
* @param errorMsg The error message associated with the failed call attempt.
*/
void handleFailedOutgoingCall(
ConnectionRequest request,
int errorCode,
String errorMsg) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.handleFailedOutgoingCall(request, errorCode, errorMsg);
} catch (RemoteException e) {
}
}
}
/**
* Tells Telecomm to cancel the call.
*
* @param request The originating request for a connection.
*/
void cancelOutgoingCall(ConnectionRequest request) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.cancelOutgoingCall(request);
} catch (RemoteException e) {
}
}
}
/**
* Sets a call's state to active (e.g., an ongoing call where two parties can actively
* communicate).
*
* @param callId The unique ID of the call whose state is changing to active.
*/
void setActive(String callId) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.setActive(callId);
} catch (RemoteException e) {
}
}
}
/**
* Sets a call's state to ringing (e.g., an inbound ringing call).
*
* @param callId The unique ID of the call whose state is changing to ringing.
*/
void setRinging(String callId) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.setRinging(callId);
} catch (RemoteException e) {
}
}
}
/**
* Sets a call's state to dialing (e.g., dialing an outbound call).
*
* @param callId The unique ID of the call whose state is changing to dialing.
*/
void setDialing(String callId) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.setDialing(callId);
} catch (RemoteException e) {
}
}
}
/**
* Sets a call's state to disconnected.
*
* @param callId The unique ID of the call whose state is changing to disconnected.
* @param disconnectCause The reason for the disconnection, any of
* {@link android.telephony.DisconnectCause}.
* @param disconnectMessage Optional call-service-provided message about the disconnect.
*/
void setDisconnected(String callId, int disconnectCause, String disconnectMessage) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.setDisconnected(callId, disconnectCause, disconnectMessage);
} catch (RemoteException e) {
}
}
}
/**
* Sets a call's state to be on hold.
*
* @param callId - The unique ID of the call whose state is changing to be on hold.
*/
void setOnHold(String callId) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.setOnHold(callId);
} catch (RemoteException e) {
}
}
}
/**
* Asks Telecomm to start or stop a ringback tone for a call.
*
* @param callId The unique ID of the call whose ringback is being changed.
* @param ringback Whether Telecomm should start playing a ringback tone.
*/
void setRequestingRingback(String callId, boolean ringback) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.setRequestingRingback(callId, ringback);
} catch (RemoteException e) {
}
}
}
/**
* Indicates that the specified call can conference with any of the specified list of calls.
*
* @param callId The unique ID of the call.
* @param canConference Specified whether or not the call can be conferenced.
*/
void setCanConference(String callId, boolean canConference) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.setCanConference(callId, canConference);
} catch (RemoteException ignored) {
}
}
}
/**
* Indicates whether or not the specified call is currently conferenced into the specified
* conference call.
*
* @param callId The unique ID of the call being conferenced.
* @param conferenceCallId The unique ID of the conference call. Null if call is not
* conferenced.
*/
void setIsConferenced(String callId, String conferenceCallId) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.setIsConferenced(callId, conferenceCallId);
} catch (RemoteException ignored) {
}
}
}
/**
* Indicates that the call no longer exists. Can be used with either a call or a conference
* call.
*
* @param callId The unique ID of the call.
*/
void removeCall(String callId) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.removeCall(callId);
} catch (RemoteException ignored) {
}
}
}
void onPostDialWait(String callId, String remaining) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.onPostDialWait(callId, remaining);
} catch (RemoteException ignored) {
}
}
}
/**
* Indicates that a new conference call has been created.
*
* @param callId The unique ID of the conference call.
*/
void addConferenceCall(String callId) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.addConferenceCall(callId);
} catch (RemoteException ignored) {
}
}
}
/**
* Retrieves a list of remote connection services usable to place calls.
*/
void queryRemoteConnectionServices(RemoteServiceCallback callback) {
// Only supported when there is only one adapter.
if (mAdapters.size() == 1) {
try {
mAdapters.iterator().next().queryRemoteConnectionServices(callback);
} catch (RemoteException e) {
Log.e(this, e, "Exception trying to query for remote CSs");
}
}
}
/**
* Sets the call video provider for a call.
*
* @param callId The unique ID of the call to set with the given call video provider.
* @param callVideoProvider The call video provider instance to set on the call.
*/
void setCallVideoProvider(String callId, CallVideoProvider callVideoProvider) {
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.setCallVideoProvider(callId, callVideoProvider.getInterface());
} catch (RemoteException e) {
}
}
}
/**
* Set the features associated with the given call.
* Features are defined in {@link android.telecomm.CallFeatures} and are passed in as a
* bit-mask.
*
* @param callId The unique ID of the call to set features for.
* @param features The features.
*/
void setFeatures(String callId, int features) {
Log.v(this, "setFeatures: %d", features);
for (IConnectionServiceAdapter adapter : mAdapters) {
try {
adapter.setFeatures(callId, features);
} catch (RemoteException ignored) {
}
}
}
}