1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package com.android.dialer.simulator.impl; 18 19 import android.content.Context; 20 import android.support.annotation.NonNull; 21 import android.telecom.Conferenceable; 22 import android.telecom.Connection; 23 import android.telecom.DisconnectCause; 24 import com.android.dialer.common.LogUtil; 25 import com.android.dialer.simulator.Simulator; 26 import com.android.dialer.simulator.Simulator.ConferenceType; 27 import com.android.dialer.simulator.Simulator.Event; 28 import com.android.dialer.simulator.SimulatorConnectionsBank; 29 import java.util.ArrayList; 30 import java.util.Collection; 31 import java.util.List; 32 import javax.inject.Inject; 33 34 /** Wraps a list of connection tags and common methods around the connection tags list. */ 35 public class SimulatorConnectionsBankImpl 36 implements SimulatorConnectionsBank, SimulatorConference.Listener { 37 private final List<String> connectionTags = new ArrayList<>(); 38 39 @Inject 40 public SimulatorConnectionsBankImpl() {} 41 42 @Override 43 public List<String> getConnectionTags() { 44 return connectionTags; 45 } 46 47 @Override 48 public void add(Connection connection) { 49 connectionTags.add(SimulatorSimCallManager.getConnectionTag(connection)); 50 } 51 52 @Override 53 public void remove(Connection connection) { 54 connectionTags.remove(SimulatorSimCallManager.getConnectionTag(connection)); 55 } 56 57 @Override 58 public void mergeAllConnections(@ConferenceType int conferenceType, Context context) { 59 SimulatorConference simulatorConference = null; 60 if (conferenceType == Simulator.CONFERENCE_TYPE_GSM) { 61 simulatorConference = 62 SimulatorConference.newGsmConference( 63 SimulatorSimCallManager.getSystemPhoneAccountHandle(context)); 64 } else if (conferenceType == Simulator.CONFERENCE_TYPE_VOLTE) { 65 simulatorConference = 66 SimulatorConference.newVoLteConference( 67 SimulatorSimCallManager.getSystemPhoneAccountHandle(context)); 68 } 69 Collection<Connection> connections = 70 SimulatorConnectionService.getInstance().getAllConnections(); 71 for (Connection connection : connections) { 72 simulatorConference.addConnection(connection); 73 } 74 simulatorConference.addListener(this); 75 SimulatorConnectionService.getInstance().addConference(simulatorConference); 76 } 77 78 @Override 79 public void disconnectAllConnections() { 80 Collection<Connection> connections = 81 SimulatorConnectionService.getInstance().getAllConnections(); 82 for (Connection connection : connections) { 83 connection.setDisconnected(new DisconnectCause(DisconnectCause.LOCAL)); 84 } 85 } 86 87 @Override 88 public void updateConferenceableConnections() { 89 LogUtil.enterBlock("SimulatorConferenceCreator.updateConferenceableConnections"); 90 for (String connectionTag : connectionTags) { 91 SimulatorConnection connection = SimulatorSimCallManager.findConnectionByTag(connectionTag); 92 List<Conferenceable> conferenceables = getSimulatorConferenceables(); 93 conferenceables.remove(connection); 94 conferenceables.remove(connection.getConference()); 95 connection.setConferenceables(conferenceables); 96 } 97 } 98 99 private List<Conferenceable> getSimulatorConferenceables() { 100 List<Conferenceable> conferenceables = new ArrayList<>(); 101 for (String connectionTag : connectionTags) { 102 SimulatorConnection connection = SimulatorSimCallManager.findConnectionByTag(connectionTag); 103 conferenceables.add(connection); 104 if (connection.getConference() != null 105 && !conferenceables.contains(connection.getConference())) { 106 conferenceables.add(connection.getConference()); 107 } 108 } 109 return conferenceables; 110 } 111 112 @Override 113 public boolean isSimulatorConnection(@NonNull Connection connection) { 114 for (String connectionTag : connectionTags) { 115 if (connection.getExtras().getBoolean(connectionTag)) { 116 return true; 117 } 118 } 119 return false; 120 } 121 122 @Override 123 public void onEvent(@NonNull SimulatorConference conference, @NonNull Event event) { 124 switch (event.type) { 125 case Event.MERGE: 126 int capabilities = conference.getConnectionCapabilities(); 127 capabilities |= Connection.CAPABILITY_SWAP_CONFERENCE; 128 conference.setConnectionCapabilities(capabilities); 129 break; 130 case Event.SEPARATE: 131 SimulatorConnection connectionToRemove = 132 SimulatorSimCallManager.findConnectionByTag(event.data1); 133 conference.removeConnection(connectionToRemove); 134 break; 135 case Event.DISCONNECT: 136 for (Connection connection : new ArrayList<>(conference.getConnections())) { 137 connection.setDisconnected(new DisconnectCause(DisconnectCause.LOCAL)); 138 } 139 conference.setDisconnected(new DisconnectCause(DisconnectCause.LOCAL)); 140 break; 141 default: 142 LogUtil.i( 143 "SimulatorConferenceCreator.onEvent", "unexpected conference event: " + event.type); 144 break; 145 } 146 } 147 } 148