1 /* 2 * Copyright (C) 2013 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.incallui; 18 19 import android.content.Context; 20 21 import com.android.incallui.ContactInfoCache.ContactCacheEntry; 22 import com.android.incallui.InCallPresenter.InCallState; 23 import com.android.incallui.InCallPresenter.InCallStateListener; 24 import com.android.services.telephony.common.Call; 25 26 import com.google.common.base.Preconditions; 27 import com.google.common.collect.ImmutableSortedSet; 28 29 /** 30 * Logic for call buttons. 31 */ 32 public class ConferenceManagerPresenter 33 extends Presenter<ConferenceManagerPresenter.ConferenceManagerUi> 34 implements InCallStateListener { 35 36 private static final int MAX_CALLERS_IN_CONFERENCE = 5; 37 38 private int mNumCallersInConference; 39 private Integer[] mCallerIds; 40 private Context mContext; 41 42 @Override 43 public void onUiReady(ConferenceManagerUi ui) { 44 super.onUiReady(ui); 45 46 // register for call state changes last 47 InCallPresenter.getInstance().addListener(this); 48 } 49 50 @Override 51 public void onUiUnready(ConferenceManagerUi ui) { 52 super.onUiUnready(ui); 53 54 InCallPresenter.getInstance().removeListener(this); 55 } 56 57 @Override 58 public void onStateChange(InCallState state, CallList callList) { 59 if (getUi().isFragmentVisible()) { 60 Log.v(this, "onStateChange" + state); 61 if (state == InCallState.INCALL) { 62 final Call call = callList.getActiveOrBackgroundCall(); 63 if (call != null && call.isConferenceCall()) { 64 Log.v(this, "Number of existing calls is " + 65 String.valueOf(call.getChildCallIds().size())); 66 update(callList); 67 } else { 68 getUi().setVisible(false); 69 } 70 } else { 71 getUi().setVisible(false); 72 } 73 } 74 } 75 76 public void init(Context context, CallList callList) { 77 mContext = Preconditions.checkNotNull(context); 78 mContext = context; 79 update(callList); 80 } 81 82 private void update(CallList callList) { 83 mCallerIds = null; 84 mCallerIds = callList.getActiveOrBackgroundCall().getChildCallIds().toArray(new Integer[0]); 85 mNumCallersInConference = mCallerIds.length; 86 Log.v(this, "Number of calls is " + String.valueOf(mNumCallersInConference)); 87 88 // Users can split out a call from the conference call if there either the active call 89 // or the holding call is empty. If both are filled at the moment, users can not split out 90 // another call. 91 final boolean hasActiveCall = (callList.getActiveCall() != null); 92 final boolean hasHoldingCall = (callList.getBackgroundCall() != null); 93 boolean canSeparate = !(hasActiveCall && hasHoldingCall); 94 95 for (int i = 0; i < MAX_CALLERS_IN_CONFERENCE; i++) { 96 if (i < mNumCallersInConference) { 97 // Fill in the row in the UI for this caller. 98 99 final ContactCacheEntry contactCache = ContactInfoCache.getInstance(mContext). 100 getInfo(mCallerIds[i]); 101 updateManageConferenceRow(i, contactCache, canSeparate); 102 } else { 103 // Blank out this row in the UI 104 updateManageConferenceRow(i, null, false); 105 } 106 } 107 } 108 109 /** 110 * Updates a single row of the "Manage conference" UI. (One row in this 111 * UI represents a single caller in the conference.) 112 * 113 * @param i the row to update 114 * @param contactCacheEntry the contact details corresponding to this caller. 115 * If null, that means this is an "empty slot" in the conference, 116 * so hide this row in the UI. 117 * @param canSeparate if true, show a "Separate" (i.e. "Private") button 118 * on this row in the UI. 119 */ 120 public void updateManageConferenceRow(final int i, 121 final ContactCacheEntry contactCacheEntry, 122 boolean canSeparate) { 123 124 if (contactCacheEntry != null) { 125 // Activate this row of the Manage conference panel: 126 getUi().setRowVisible(i, true); 127 128 final String name = contactCacheEntry.name; 129 final String number = contactCacheEntry.number; 130 131 if (canSeparate) { 132 getUi().setCanSeparateButtonForRow(i, canSeparate); 133 } 134 // display the CallerInfo. 135 getUi().setupEndButtonForRow(i); 136 getUi().displayCallerInfoForConferenceRow(i, name, number, contactCacheEntry.label); 137 } else { 138 // Disable this row of the Manage conference panel: 139 getUi().setRowVisible(i, false); 140 } 141 } 142 143 public void manageConferenceDoneClicked() { 144 getUi().setVisible(false); 145 } 146 147 public int getMaxCallersInConference() { 148 return MAX_CALLERS_IN_CONFERENCE; 149 } 150 151 public void separateConferenceConnection(int rowId) { 152 CallCommandClient.getInstance().separateCall(mCallerIds[rowId]); 153 } 154 155 public void endConferenceConnection(int rowId) { 156 CallCommandClient.getInstance().disconnectCall(mCallerIds[rowId]); 157 } 158 159 public interface ConferenceManagerUi extends Ui { 160 void setVisible(boolean on); 161 boolean isFragmentVisible(); 162 void setRowVisible(int rowId, boolean on); 163 void displayCallerInfoForConferenceRow(int rowId, String callerName, String callerNumber, 164 String callerNumberType); 165 void setCanSeparateButtonForRow(int rowId, boolean canSeparate); 166 void setupEndButtonForRow(int rowId); 167 void startConferenceTime(long base); 168 void stopConferenceTime(); 169 } 170 } 171