17b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown/* 27b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Copyright (C) 2009 The Android Open Source Project 37b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * 47b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Licensed under the Apache License, Version 2.0 (the "License"); 57b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * you may not use this file except in compliance with the License. 67b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * You may obtain a copy of the License at 77b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * 87b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * http://www.apache.org/licenses/LICENSE-2.0 97b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * 107b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Unless required by applicable law or agreed to in writing, software 117b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * distributed under the License is distributed on an "AS IS" BASIS, 127b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * See the License for the specific language governing permissions and 147b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * limitations under the License. 157b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown */ 167b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 177b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownpackage com.android.phone; 187b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 197b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport android.os.SystemProperties; 207b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport android.text.TextUtils; 217b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport android.util.Log; 227b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport android.view.View; 237b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport android.view.ViewGroup; 247b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport android.view.ViewStub; 257b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport android.widget.Button; 267b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport android.widget.Chronometer; 277b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport android.widget.ImageButton; 287b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport android.widget.TextView; 297b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 307b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport com.android.internal.telephony.CallerInfo; 317b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport com.android.internal.telephony.CallerInfoAsyncQuery; 32b045b9344f339170d134cf814357361d96c349cfHung-ying Tyanimport com.android.internal.telephony.CallManager; 337b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport com.android.internal.telephony.Connection; 347b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 357b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brownimport java.util.List; 367b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 377b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 387b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown/** 397b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Helper class to initialize and run the InCallScreen's "Manage conference" UI. 407b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown */ 418c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawapublic class ManageConferenceUtils { 427b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown private static final String LOG_TAG = "ManageConferenceUtils"; 437b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown private static final boolean DBG = 44a1a9601840e50e18ff8ca4be9b888e592287577bDianne Hackborn (PhoneGlobals.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1); 457b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 468c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa /** 478c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa * CallerInfoAsyncQuery.OnQueryCompleteListener implementation. 488c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa * 498c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa * This object listens for results from the caller-id info queries we 508c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa * fire off in updateManageConferenceRow(), and updates the 518c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa * corresponding conference row. 528c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa */ 538c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa private final class QueryCompleteListener 548c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa implements CallerInfoAsyncQuery.OnQueryCompleteListener { 558c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa private final int mConferencCallListIndex; 568c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa 578c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa public QueryCompleteListener(int index) { 588c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa mConferencCallListIndex = index; 598c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa } 608c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa 618c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa @Override 628c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa public void onQueryComplete(int token, Object cookie, CallerInfo ci) { 638c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa if (DBG) log("callerinfo query complete, updating UI." + ci); 648c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa 658c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa Connection connection = (Connection) cookie; 668c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa int presentation = connection.getNumberPresentation(); 678c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa 688c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa // get the viewgroup (conference call list item) and make it visible 698c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa ViewGroup viewGroup = mConferenceCallList[mConferencCallListIndex]; 708c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa viewGroup.setVisibility(View.VISIBLE); 718c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa 728c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa // update the list item with this information. 738c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa displayCallerInfoForConferenceRow(ci, presentation, 748c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa (TextView) viewGroup.findViewById(R.id.conferenceCallerName), 758c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa (TextView) viewGroup.findViewById(R.id.conferenceCallerNumberType), 768c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa (TextView) viewGroup.findViewById(R.id.conferenceCallerNumber)); 778c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa } 788c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa } 798c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa 807b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown private InCallScreen mInCallScreen; 81b045b9344f339170d134cf814357361d96c349cfHung-ying Tyan private CallManager mCM; 827b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 837b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // "Manage conference" UI elements and state 847b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown private ViewGroup mManageConferencePanel; 8576f397b08215ffb90fb16772d85589b642fa6229Daisuke Miyakawa private View mButtonManageConferenceDone; 867b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown private ViewGroup[] mConferenceCallList; 877b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown private int mNumCallersInConference; 887b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown private Chronometer mConferenceTime; 897b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 907b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // See CallTracker.MAX_CONNECTIONS_PER_CALL 917b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown private static final int MAX_CALLERS_IN_CONFERENCE = 5; 927b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 93b045b9344f339170d134cf814357361d96c349cfHung-ying Tyan public ManageConferenceUtils(InCallScreen inCallScreen, CallManager cm) { 947b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (DBG) log("ManageConferenceUtils constructor..."); 957b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mInCallScreen = inCallScreen; 96b045b9344f339170d134cf814357361d96c349cfHung-ying Tyan mCM = cm; 977b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 987b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 997b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public void initManageConferencePanel() { 1007b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (DBG) log("initManageConferencePanel()..."); 1017b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (mManageConferencePanel == null) { 1027b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (DBG) log("initManageConferencePanel: first-time initialization!"); 1037b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1047b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // Inflate the ViewStub, look up and initialize the UI elements. 1057b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown ViewStub stub = (ViewStub) mInCallScreen.findViewById(R.id.manageConferencePanelStub); 1067b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown stub.inflate(); 1077b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1087b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mManageConferencePanel = 1097b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown (ViewGroup) mInCallScreen.findViewById(R.id.manageConferencePanel); 1107b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (mManageConferencePanel == null) { 1117b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown throw new IllegalStateException("Couldn't find manageConferencePanel!"); 1127b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1137b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1147b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // set up the Conference Call chronometer 1157b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mConferenceTime = 1167b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown (Chronometer) mInCallScreen.findViewById(R.id.manageConferencePanelHeader); 1177b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mConferenceTime.setFormat(mInCallScreen.getString(R.string.caller_manage_header)); 1187b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1197b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // Create list of conference call widgets 1207b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mConferenceCallList = new ViewGroup[MAX_CALLERS_IN_CONFERENCE]; 1217b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1227b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown final int[] viewGroupIdList = { R.id.caller0, R.id.caller1, R.id.caller2, 1237b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown R.id.caller3, R.id.caller4 }; 1247b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown for (int i = 0; i < MAX_CALLERS_IN_CONFERENCE; i++) { 1257b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mConferenceCallList[i] = 1267b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown (ViewGroup) mInCallScreen.findViewById(viewGroupIdList[i]); 1277b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1287b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 12976f397b08215ffb90fb16772d85589b642fa6229Daisuke Miyakawa mButtonManageConferenceDone = mInCallScreen.findViewById(R.id.manage_done); 1307b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mButtonManageConferenceDone.setOnClickListener(mInCallScreen); 1317b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1327b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1337b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1347b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown /** 1357b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Shows or hides the manageConferencePanel. 1367b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown */ 1377b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public void setPanelVisible(boolean visible) { 1387b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (mManageConferencePanel != null) { 1397b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mManageConferencePanel.setVisibility(visible ? View.VISIBLE : View.GONE); 1407b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1417b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1427b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1437b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown /** 1447b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Starts the "conference time" chronometer. 1457b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown */ 1467b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public void startConferenceTime(long base) { 1477b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (mConferenceTime != null) { 1487b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mConferenceTime.setBase(base); 1497b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mConferenceTime.start(); 1507b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1517b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1527b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1537b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown /** 1547b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Stops the "conference time" chronometer. 1557b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown */ 1567b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public void stopConferenceTime() { 1577b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (mConferenceTime != null) { 1587b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mConferenceTime.stop(); 1597b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1607b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1617b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1627b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public int getNumCallersInConference() { 1637b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown return mNumCallersInConference; 1647b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1657b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1667b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown /** 1677b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Updates the "Manage conference" UI based on the specified List of 1687b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * connections. 1697b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * 1707b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * @param connections the List of connections belonging to 1717b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * the current foreground call; size must be greater than 1 1727b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * (or it wouldn't be a conference call in the first place.) 1737b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown */ 1747b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public void updateManageConferencePanel(List<Connection> connections) { 1757b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mNumCallersInConference = connections.size(); 1767b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (DBG) log("updateManageConferencePanel()... num connections in conference = " 1777b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown + mNumCallersInConference); 1787b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1797b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // Can we give the user the option to separate out ("go private with") a single 1807b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // caller from this conference? 181b045b9344f339170d134cf814357361d96c349cfHung-ying Tyan final boolean hasActiveCall = mCM.hasActiveFgCall(); 182b045b9344f339170d134cf814357361d96c349cfHung-ying Tyan final boolean hasHoldingCall = mCM.hasActiveBgCall(); 1837b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown boolean canSeparate = !(hasActiveCall && hasHoldingCall); 1847b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1857b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown for (int i = 0; i < MAX_CALLERS_IN_CONFERENCE; i++) { 1867b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (i < mNumCallersInConference) { 1877b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // Fill in the row in the UI for this caller. 1887b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown Connection connection = (Connection) connections.get(i); 1897b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown updateManageConferenceRow(i, connection, canSeparate); 1907b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } else { 1917b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // Blank out this row in the UI 1927b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown updateManageConferenceRow(i, null, false); 1937b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1947b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1957b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 1967b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 1977b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown /** 1987b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Updates a single row of the "Manage conference" UI. (One row in this 1997b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * UI represents a single caller in the conference.) 2007b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * 2017b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * @param i the row to update 2027b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * @param connection the Connection corresponding to this caller. 2037b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * If null, that means this is an "empty slot" in the conference, 2047b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * so hide this row in the UI. 2057b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * @param canSeparate if true, show a "Separate" (i.e. "Private") button 2067b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * on this row in the UI. 2077b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown */ 2087b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public void updateManageConferenceRow(final int i, 2097b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown final Connection connection, 2107b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown boolean canSeparate) { 2117b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (DBG) log("updateManageConferenceRow(" + i + ")... connection = " + connection); 2127b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 2137b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (connection != null) { 2147b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // Activate this row of the Manage conference panel: 2157b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mConferenceCallList[i].setVisibility(View.VISIBLE); 2167b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 2177b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // get the relevant children views 21876f397b08215ffb90fb16772d85589b642fa6229Daisuke Miyakawa View endButton = mConferenceCallList[i].findViewById(R.id.conferenceCallerDisconnect); 21976f397b08215ffb90fb16772d85589b642fa6229Daisuke Miyakawa View separateButton = mConferenceCallList[i].findViewById( 2207b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown R.id.conferenceCallerSeparate); 2217b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown TextView nameTextView = (TextView) mConferenceCallList[i].findViewById( 2227b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown R.id.conferenceCallerName); 2237b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown TextView numberTextView = (TextView) mConferenceCallList[i].findViewById( 2247b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown R.id.conferenceCallerNumber); 2257b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown TextView numberTypeTextView = (TextView) mConferenceCallList[i].findViewById( 2267b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown R.id.conferenceCallerNumberType); 2277b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 2287b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (DBG) log("- button: " + endButton + ", nameTextView: " + nameTextView); 2297b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 2307b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // Hook up this row's buttons. 2317b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown View.OnClickListener endThisConnection = new View.OnClickListener() { 2328c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa @Override 2337b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public void onClick(View v) { 2347b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown endConferenceConnection(i, connection); 235a1a9601840e50e18ff8ca4be9b888e592287577bDianne Hackborn PhoneGlobals.getInstance().pokeUserActivity(); 2367b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 2377b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown }; 2387b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown endButton.setOnClickListener(endThisConnection); 2397b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // 2407b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (canSeparate) { 2417b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown View.OnClickListener separateThisConnection = new View.OnClickListener() { 2428c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa @Override 2437b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public void onClick(View v) { 2447b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown separateConferenceConnection(i, connection); 245a1a9601840e50e18ff8ca4be9b888e592287577bDianne Hackborn PhoneGlobals.getInstance().pokeUserActivity(); 2467b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 2477b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown }; 2487b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown separateButton.setOnClickListener(separateThisConnection); 2497b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown separateButton.setVisibility(View.VISIBLE); 2507b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } else { 2517b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown separateButton.setVisibility(View.INVISIBLE); 2527b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 2537b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 2547b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // Name/number for this caller. 2558c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa QueryCompleteListener listener = new QueryCompleteListener(i); 2567b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown PhoneUtils.CallerInfoToken info = 2577b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown PhoneUtils.startGetCallerInfo(mInCallScreen, 2588c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa connection, listener, connection); 2597b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (DBG) log(" - got info from startGetCallerInfo(): " + info); 2607b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 2617b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // display the CallerInfo. 2628c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa displayCallerInfoForConferenceRow(info.currentInfo, connection.getNumberPresentation(), 2638c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa nameTextView, numberTypeTextView, numberTextView); 2647b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } else { 2657b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // Disable this row of the Manage conference panel: 2667b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown mConferenceCallList[i].setVisibility(View.GONE); 2677b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 2687b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 2697b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 2707b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown /** 2717b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Helper function to fill out the Conference Call(er) information 2727b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * for each item in the "Manage Conference Call" list. 2738c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa * 2748c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa * @param presentation presentation specified by {@link Connection}. 2757b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown */ 2768c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa public final void displayCallerInfoForConferenceRow(CallerInfo ci, int presentation, 2778c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa TextView nameTextView, TextView numberTypeTextView, TextView numberTextView) { 2787b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // gather the correct name and number information. 2797b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown String callerName = ""; 2807b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown String callerNumber = ""; 2817b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown String callerNumberType = ""; 2827b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (ci != null) { 2837b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown callerName = ci.name; 2847b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (TextUtils.isEmpty(callerName)) { 2858c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa // Do similar fallback as CallCard does. 2868c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa // See also CallCard#updateDisplayForPerson(). 2878c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa if (TextUtils.isEmpty(ci.phoneNumber)) { 2888c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa callerName = PhoneUtils.getPresentationString(mInCallScreen, presentation); 2898c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa } else if (!TextUtils.isEmpty(ci.cnapName)) { 2908c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa // No name, but we do have a valid CNAP name, so use that. 2918c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa callerName = ci.cnapName; 2928c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa } else { 2938c3a5e592199af04897808f922d7ecc854fb0541Daisuke Miyakawa callerName = ci.phoneNumber; 2947b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 2957b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } else { 2967b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown callerNumber = ci.phoneNumber; 2977b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown callerNumberType = ci.phoneLabel; 2987b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 2997b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 3007b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 3017b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // set the caller name 3027b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown nameTextView.setText(callerName); 3037b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 3047b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // set the caller number in subscript, or make the field disappear. 3057b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (TextUtils.isEmpty(callerNumber)) { 3067b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown numberTextView.setVisibility(View.GONE); 3077b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown numberTypeTextView.setVisibility(View.GONE); 3087b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } else { 3097b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown numberTextView.setVisibility(View.VISIBLE); 3107b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown numberTextView.setText(callerNumber); 3117b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown numberTypeTextView.setVisibility(View.VISIBLE); 3127b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown numberTypeTextView.setText(callerNumberType); 3137b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 3147b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 3157b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 3167b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown /** 3177b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Ends the specified connection on a conference call. This method is 3187b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * run (via a closure containing a row index and Connection) when the 3197b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * user clicks the "End" button on a specific row in the Manage 3207b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * conference UI. 3217b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown */ 3227b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public void endConferenceConnection(int i, Connection connection) { 3237b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (DBG) log("===> ENDING conference connection " + i 3247b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown + ": Connection " + connection); 3257b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // The actual work of ending the connection: 3267b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown PhoneUtils.hangup(connection); 3277b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // No need to manually update the "Manage conference" UI here; 3287b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // that'll happen automatically very soon (when we get the 3297b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // onDisconnect() callback triggered by this hangup() call.) 3307b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 3317b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 3327b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown /** 3337b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * Separates out the specified connection on a conference call. This 3347b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * method is run (via a closure containing a row index and Connection) 3357b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * when the user clicks the "Separate" (i.e. "Private") button on a 3367b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown * specific row in the Manage conference UI. 3377b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown */ 3387b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown public void separateConferenceConnection(int i, Connection connection) { 3397b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown if (DBG) log("===> SEPARATING conference connection " + i 3407b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown + ": Connection " + connection); 3417b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 3427b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown PhoneUtils.separateCall(connection); 3437b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 3447b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // Note that separateCall() automagically makes the 3457b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // newly-separated call into the foreground call (which is the 3467b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // desired UI), so there's no need to do any further 3477b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // call-switching here. 3487b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // There's also no need to manually update (or hide) the "Manage 3497b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // conference" UI; that'll happen on its own in a moment (when we 3507b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // get the phone state change event triggered by the call to 3517b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown // separateCall().) 3527b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 3537b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 3547b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown 3557b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown private void log(String msg) { 3567b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown Log.d(LOG_TAG, msg); 3577b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown } 3587b50e05c9e6a2e75b5f34b8de1866702351d1ffbDavid Brown} 359