/* * 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 com.android.services.telephony; import android.telecom.Conference; import android.telecom.Connection; import android.telecom.PhoneAccountHandle; import android.telecom.PhoneCapabilities; import com.android.internal.telephony.Call; import com.android.internal.telephony.CallStateException; import java.util.List; /** * CDMA-based conference call. */ public class CdmaConference extends Conference { private int mCapabilities = PhoneCapabilities.MUTE; public CdmaConference(PhoneAccountHandle phoneAccount, int capabilities) { super(phoneAccount); setCapabilities(mCapabilities | capabilities); setActive(); } private void updateCapabilities() { setCapabilities(mCapabilities); } /** * Invoked when the Conference and all it's {@link Connection}s should be disconnected. */ @Override public void onDisconnect() { Call call = getOriginalCall(); if (call != null) { Log.d(this, "Found multiparty call to hangup for conference."); try { call.hangup(); } catch (CallStateException e) { Log.e(this, e, "Exception thrown trying to hangup conference"); } } } @Override public void onSeparate(Connection connection) { Log.e(this, new Exception(), "Separate not supported for CDMA conference call."); } @Override public void onHold() { Log.e(this, new Exception(), "Hold not supported for CDMA conference call."); } /** * Invoked when the conference should be moved from hold to active. */ @Override public void onUnhold() { Log.e(this, new Exception(), "Unhold not supported for CDMA conference call."); } @Override public void onMerge() { Log.i(this, "Merging CDMA conference call."); // Can only merge once mCapabilities &= ~PhoneCapabilities.MERGE_CONFERENCE; // Once merged, swap is enabled. mCapabilities |= PhoneCapabilities.SWAP_CONFERENCE; updateCapabilities(); sendFlash(); } @Override public void onPlayDtmfTone(char c) { final CdmaConnection connection = getFirstConnection(); if (connection != null) { connection.onPlayDtmfTone(c); } else { Log.w(this, "No CDMA connection found while trying to play dtmf tone."); } } @Override public void onStopDtmfTone() { final CdmaConnection connection = getFirstConnection(); if (connection != null) { connection.onStopDtmfTone(); } else { Log.w(this, "No CDMA connection found while trying to stop dtmf tone."); } } @Override public void onSwap() { Log.i(this, "Swapping CDMA conference call."); sendFlash(); } private void sendFlash() { Call call = getOriginalCall(); if (call != null) { try { // For CDMA calls, this just sends a flash command. call.getPhone().switchHoldingAndActive(); } catch (CallStateException e) { Log.e(this, e, "Error while trying to send flash command."); } } } private Call getMultipartyCallForConnection(Connection connection) { com.android.internal.telephony.Connection radioConnection = getOriginalConnection(connection); if (radioConnection != null) { Call call = radioConnection.getCall(); if (call != null && call.isMultiparty()) { return call; } } return null; } private Call getOriginalCall() { List connections = getConnections(); if (!connections.isEmpty()) { com.android.internal.telephony.Connection originalConnection = getOriginalConnection(connections.get(0)); if (originalConnection != null) { return originalConnection.getCall(); } } return null; } private com.android.internal.telephony.Connection getOriginalConnection(Connection connection) { if (connection instanceof CdmaConnection) { return ((CdmaConnection) connection).getOriginalConnection(); } else { Log.e(this, null, "Non CDMA connection found in a CDMA conference"); return null; } } private CdmaConnection getFirstConnection() { final List connections = getConnections(); if (connections.isEmpty()) { return null; } return (CdmaConnection) connections.get(0); } }