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