CallCard.java revision 22e353c3d76a3dd649c6e87244c5d94cadf64c8e
1b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/* 2b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 3b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 4b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * you may not use this file except in compliance with the License. 6b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * You may obtain a copy of the License at 7b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 8b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 10b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * See the License for the specific language governing permissions and 14b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * limitations under the License. 15b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 16b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 17b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpackage com.android.phone; 18b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 19b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.ContentUris; 20b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.Context; 21b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.graphics.drawable.Drawable; 22b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.net.Uri; 23b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.pim.ContactsAsyncHelper; 243d6d70562622660e581b53308e675386d299dd19Dmitri Plotnikovimport android.provider.ContactsContract.Contacts; 25b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.text.TextUtils; 26b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.text.format.DateUtils; 27b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.AttributeSet; 28b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.Log; 29b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.LayoutInflater; 30b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.View; 31b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.ViewGroup; 32dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brownimport android.view.accessibility.AccessibilityEvent; 336d5544932495d81ff7ce53f4678c4beb25acc1b0David Brownimport android.widget.Button; 34b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.FrameLayout; 35b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.ImageView; 36b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.TextView; 37b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 386b7d0da33af02960736da204eb7a25ccf91d5396David Brownimport com.android.internal.telephony.Call; 396b7d0da33af02960736da204eb7a25ccf91d5396David Brownimport com.android.internal.telephony.CallerInfo; 406b7d0da33af02960736da204eb7a25ccf91d5396David Brownimport com.android.internal.telephony.CallerInfoAsyncQuery; 416b7d0da33af02960736da204eb7a25ccf91d5396David Brownimport com.android.internal.telephony.Connection; 426b7d0da33af02960736da204eb7a25ccf91d5396David Brownimport com.android.internal.telephony.Phone; 438343169cc89621d46dce86449f5ee1ff5d3a4919John Wangimport com.android.internal.telephony.CallManager; 446b7d0da33af02960736da204eb7a25ccf91d5396David Brown 450fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Savilleimport java.util.List; 460fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville 476b7d0da33af02960736da204eb7a25ccf91d5396David Brown 48b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/** 49b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * "Call card" UI element: the in-call screen contains a tiled layout of call 50b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * cards, each representing the state of a current "call" (ie. an active call, 51b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * a call on hold, or an incoming call.) 52b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 53b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpublic class CallCard extends FrameLayout 54b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project implements CallTime.OnTickListener, CallerInfoAsyncQuery.OnQueryCompleteListener, 556d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown ContactsAsyncHelper.OnImageLoadCompleteListener, View.OnClickListener { 56796c70c99bc39295bf685061056f06ab8949c742David Brown private static final String LOG_TAG = "CallCard"; 57796c70c99bc39295bf685061056f06ab8949c742David Brown private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2); 58b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 598bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project /** 608bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * Reference to the InCallScreen activity that owns us. This may be 618bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * null if we haven't been initialized yet *or* after the InCallScreen 628bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * activity has been destroyed. 638bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project */ 648bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project private InCallScreen mInCallScreen; 658bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 660fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // Phone app instance 670fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville private PhoneApp mApplication; 680fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville 69b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Top-level subviews of the CallCard 700d315275d08cd33f801ae3a74e8fc265520f6246David Brown private ViewGroup mPrimaryCallInfo; 710d315275d08cd33f801ae3a74e8fc265520f6246David Brown private ViewGroup mSecondaryCallInfo; 72b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 7334a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // Title and elapsed-time widgets 74b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mUpperTitle; 75b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mElapsedTime; 76b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 7734a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // Text colors, used for various labels / titles 789688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown private int mTextColorDefaultPrimary; 799688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown private int mTextColorDefaultSecondary; 80b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private int mTextColorConnected; 818bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project private int mTextColorConnectedBluetooth; 82b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private int mTextColorEnded; 83b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private int mTextColorOnHold; 849d14e16e8214b4a396dad293b6f0941608ee4798David Brown private int mTextColorCallTypeSip; 85b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 860d315275d08cd33f801ae3a74e8fc265520f6246David Brown // The main block of info about the "primary" or "active" call, 870d315275d08cd33f801ae3a74e8fc265520f6246David Brown // including photo / name / phone number / etc. 88b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private ImageView mPhoto; 896d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown private Button mManageConferencePhotoButton; // Possibly shown in place of mPhoto 90b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mName; 91b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mPhoneNumber; 92b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mLabel; 939d14e16e8214b4a396dad293b6f0941608ee4798David Brown private TextView mCallTypeLabel; 9429d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown private TextView mSocialStatus; 95b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 960d315275d08cd33f801ae3a74e8fc265520f6246David Brown // Info about the "secondary" call, which is the "call on hold" when 970d315275d08cd33f801ae3a74e8fc265520f6246David Brown // two lines are in use. 980d315275d08cd33f801ae3a74e8fc265520f6246David Brown private TextView mSecondaryCallName; 990d315275d08cd33f801ae3a74e8fc265520f6246David Brown private TextView mSecondaryCallStatus; 1000d315275d08cd33f801ae3a74e8fc265520f6246David Brown private ImageView mSecondaryCallPhoto; 101b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 102b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Menu button hint 103b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mMenuButtonHint; 104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1059688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown // Onscreen hint for the incoming call RotarySelector widget. 1069688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown private int mRotarySelectorHintTextResId; 1079688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown private int mRotarySelectorHintColorResId; 1089688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown 109b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private CallTime mCallTime; 110b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 111b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Track the state for the photo. 112b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private ContactsAsyncHelper.ImageTracker mPhotoTracker; 113b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 11429d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown // Cached DisplayMetrics density. 11529d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown private float mDensity; 11629d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown 117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public CallCard(Context context, AttributeSet attrs) { 118b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super(context, attrs); 119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("CallCard constructor..."); 121b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("- this = " + this); 122b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("- context " + context + ", attrs " + attrs); 123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Inflate the contents of this CallCard, and add it (to ourself) as a child. 125b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project LayoutInflater inflater = LayoutInflater.from(context); 126b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project inflater.inflate( 127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project R.layout.call_card, // resource 128b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project this, // root 129b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project true); 130b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1310fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville mApplication = PhoneApp.getInstance(); 1320fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville 133b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime = new CallTime(this); 134b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 135b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // create a new object to track the state for the photo. 136b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker = new ContactsAsyncHelper.ImageTracker(); 13729d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown 13829d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown mDensity = getResources().getDisplayMetrics().density; 13929d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown if (DBG) log("- Density: " + mDensity); 140b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 141b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1428bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project void setInCallScreenInstance(InCallScreen inCallScreen) { 1438bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mInCallScreen = inCallScreen; 1448bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } 1458bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 146b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public void onTickForCallTimeElapsed(long timeElapsed) { 147b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // While a call is in progress, update the elapsed time shown 148b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // onscreen. 149b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updateElapsedTimeWidget(timeElapsed); 150b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 151b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 152b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /* package */ 153b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project void stopTimer() { 154b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.cancelTimer(); 155b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 157b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 158b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void onFinishInflate() { 159b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super.onFinishInflate(); 160b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 161b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("CallCard onFinishInflate(this = " + this + ")..."); 162b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1630d315275d08cd33f801ae3a74e8fc265520f6246David Brown mPrimaryCallInfo = (ViewGroup) findViewById(R.id.primaryCallInfo); 1640d315275d08cd33f801ae3a74e8fc265520f6246David Brown mSecondaryCallInfo = (ViewGroup) findViewById(R.id.secondaryCallInfo); 165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 166b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "Upper" and "lower" title widgets 167b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mUpperTitle = (TextView) findViewById(R.id.upperTitle); 168b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mElapsedTime = (TextView) findViewById(R.id.elapsedTime); 169b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 170b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Text colors 1719688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown mTextColorDefaultPrimary = // corresponds to textAppearanceLarge 1729688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown getResources().getColor(android.R.color.primary_text_dark); 1739688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown mTextColorDefaultSecondary = // corresponds to textAppearanceSmall 1749688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown getResources().getColor(android.R.color.secondary_text_dark); 175b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mTextColorConnected = getResources().getColor(R.color.incall_textConnected); 1768bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mTextColorConnectedBluetooth = 1778bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project getResources().getColor(R.color.incall_textConnectedBluetooth); 178b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mTextColorEnded = getResources().getColor(R.color.incall_textEnded); 179b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mTextColorOnHold = getResources().getColor(R.color.incall_textOnHold); 1809d14e16e8214b4a396dad293b6f0941608ee4798David Brown mTextColorCallTypeSip = getResources().getColor(R.color.incall_callTypeSip); 181b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 182b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "Caller info" area, including photo / name / phone numbers / etc 183b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoto = (ImageView) findViewById(R.id.photo); 1846d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown mManageConferencePhotoButton = (Button) findViewById(R.id.manageConferencePhotoButton); 1856d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown mManageConferencePhotoButton.setOnClickListener(this); 186b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mName = (TextView) findViewById(R.id.name); 187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoneNumber = (TextView) findViewById(R.id.phoneNumber); 188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLabel = (TextView) findViewById(R.id.label); 1899d14e16e8214b4a396dad293b6f0941608ee4798David Brown mCallTypeLabel = (TextView) findViewById(R.id.callTypeLabel); 19029d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown mSocialStatus = (TextView) findViewById(R.id.socialStatus); 191b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 192b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "Other call" info area 1930d315275d08cd33f801ae3a74e8fc265520f6246David Brown mSecondaryCallName = (TextView) findViewById(R.id.secondaryCallName); 1940d315275d08cd33f801ae3a74e8fc265520f6246David Brown mSecondaryCallStatus = (TextView) findViewById(R.id.secondaryCallStatus); 1950d315275d08cd33f801ae3a74e8fc265520f6246David Brown mSecondaryCallPhoto = (ImageView) findViewById(R.id.secondaryCallPhoto); 196b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 197b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Menu Button hint 198b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mMenuButtonHint = (TextView) findViewById(R.id.menuButtonHint); 199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 200b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 201b15bef0ddcb4f744dff92013a9b596f2fcc2a008David Brown /** 202b15bef0ddcb4f744dff92013a9b596f2fcc2a008David Brown * Updates the state of all UI elements on the CallCard, based on the 203b15bef0ddcb4f744dff92013a9b596f2fcc2a008David Brown * current state of the phone. 204b15bef0ddcb4f744dff92013a9b596f2fcc2a008David Brown */ 2058343169cc89621d46dce86449f5ee1ff5d3a4919John Wang void updateState(CallManager cm) { 2068343169cc89621d46dce86449f5ee1ff5d3a4919John Wang if (DBG) log("updateState(" + cm + ")..."); 207b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 208b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Update some internal state based on the current state of the phone. 2096b7d0da33af02960736da204eb7a25ccf91d5396David Brown 2106b7d0da33af02960736da204eb7a25ccf91d5396David Brown // TODO: clean up this method to just fully update EVERYTHING in 2116b7d0da33af02960736da204eb7a25ccf91d5396David Brown // the callcard based on the current phone state: set the overall 2126b7d0da33af02960736da204eb7a25ccf91d5396David Brown // type of the CallCard, load up the main caller info area, and 2136b7d0da33af02960736da204eb7a25ccf91d5396David Brown // load up and show or hide the "other call" area if necessary. 214b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 2158343169cc89621d46dce86449f5ee1ff5d3a4919John Wang Phone.State state = cm.getState(); // IDLE, RINGING, or OFFHOOK 216b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (state == Phone.State.RINGING) { 217b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // A phone call is ringing *or* call waiting 218b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // (ie. another call may also be active as well.) 2198343169cc89621d46dce86449f5ee1ff5d3a4919John Wang updateRingingCall(cm); 220b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (state == Phone.State.OFFHOOK) { 221b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // The phone is off hook. At least one call exists that is 222b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // dialing, active, or holding, and no calls are ringing or waiting. 2238343169cc89621d46dce86449f5ee1ff5d3a4919John Wang updateForegroundCall(cm); 224b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 225b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // The phone state is IDLE! 226b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 227b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // The most common reason for this is if a call just 228b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // ended: the phone will be idle, but we *will* still 229b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // have a call in the DISCONNECTED state: 230ba72aa717c41d96e57209b3a74f0bedc8599ec15John Wang if (mApplication.mCM.hasDisconnectedFgCall() 231ba72aa717c41d96e57209b3a74f0bedc8599ec15John Wang || mApplication.mCM.hasDisconnectedBgCall()) { 232b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // In this case, we want the main CallCard to display 233b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the "Call ended" state. The normal "foreground call" 234b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // code path handles that. 2358343169cc89621d46dce86449f5ee1ff5d3a4919John Wang updateForegroundCall(cm); 236b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 237b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // We don't have any DISCONNECTED calls, which means 238b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // that the phone is *truly* idle. 239b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 240b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // It's very rare to be on the InCallScreen at all in this 241b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // state, but it can happen in some cases: 242b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // - A stray onPhoneStateChanged() event came in to the 243b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // InCallScreen *after* it was dismissed. 244b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // - We're allowed to be on the InCallScreen because 245b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // an MMI or USSD is running, but there's no actual "call" 246b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // to display. 247b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // - We're displaying an error dialog to the user 248b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // (explaining why the call failed), so we need to stay on 249b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the InCallScreen so that the dialog will be visible. 250b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 251b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // In these cases, put the callcard into a sane but "blank" state: 2528343169cc89621d46dce86449f5ee1ff5d3a4919John Wang updateNoCall(cm); 253b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 254b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 255b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 256b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 257b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 258b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the UI for the state where the phone is in use, but not ringing. 259b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 2608343169cc89621d46dce86449f5ee1ff5d3a4919John Wang private void updateForegroundCall(CallManager cm) { 261b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateForegroundCall()..."); 2628343169cc89621d46dce86449f5ee1ff5d3a4919John Wang if (DBG) PhoneUtils.dumpCallManager(); 2638343169cc89621d46dce86449f5ee1ff5d3a4919John Wang 2648343169cc89621d46dce86449f5ee1ff5d3a4919John Wang Call fgCall = cm.getActiveFgCall(); 2658343169cc89621d46dce86449f5ee1ff5d3a4919John Wang Call bgCall = cm.getFirstActiveBgCall(); 2668343169cc89621d46dce86449f5ee1ff5d3a4919John Wang 267b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 268b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 269b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (fgCall.isIdle() && !fgCall.hasConnections()) { 270b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateForegroundCall: no active call, show holding call"); 271b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: make sure this case agrees with the latest UI spec. 272b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 273b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Display the background call in the main info area of the 274b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // CallCard, since there is no foreground call. Note that 275b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // displayMainCallStatus() will notice if the call we passed in is on 276b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // hold, and display the "on hold" indication. 277b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project fgCall = bgCall; 278b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 279b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // And be sure to not display anything in the "on hold" box. 280b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project bgCall = null; 281b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 282b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 2838343169cc89621d46dce86449f5ee1ff5d3a4919John Wang displayMainCallStatus(cm, fgCall); 2848343169cc89621d46dce86449f5ee1ff5d3a4919John Wang 2858343169cc89621d46dce86449f5ee1ff5d3a4919John Wang Phone phone = fgCall.getPhone(); 2860fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville 28779b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink int phoneType = phone.getPhoneType(); 28879b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink if (phoneType == Phone.PHONE_TYPE_CDMA) { 28939a84144262f12df44861d746788b9de92259e4fAbhishek Pillai if ((mApplication.cdmaPhoneCallState.getCurrentCallState() 29039a84144262f12df44861d746788b9de92259e4fAbhishek Pillai == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) 29139a84144262f12df44861d746788b9de92259e4fAbhishek Pillai && mApplication.cdmaPhoneCallState.IsThreeWayCallOrigStateDialing()) { 2928343169cc89621d46dce86449f5ee1ff5d3a4919John Wang displayOnHoldCallStatus(cm, fgCall); 2930fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } else { 2940fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville //This is required so that even if a background call is not present 2950fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // we need to clean up the background call area. 2968343169cc89621d46dce86449f5ee1ff5d3a4919John Wang displayOnHoldCallStatus(cm, bgCall); 2970fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } 298872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan } else if ((phoneType == Phone.PHONE_TYPE_GSM) 299872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan || (phoneType == Phone.PHONE_TYPE_SIP)) { 3008343169cc89621d46dce86449f5ee1ff5d3a4919John Wang displayOnHoldCallStatus(cm, bgCall); 3010fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } 302b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 303b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 304b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 305b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the UI for the state where an incoming call is ringing (or 306b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * call waiting), regardless of whether the phone's already offhook. 307b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 3088343169cc89621d46dce86449f5ee1ff5d3a4919John Wang private void updateRingingCall(CallManager cm) { 309b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateRingingCall()..."); 310b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 3118343169cc89621d46dce86449f5ee1ff5d3a4919John Wang Call ringingCall = cm.getFirstActiveRingingCall(); 312b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 3136b7d0da33af02960736da204eb7a25ccf91d5396David Brown // Display caller-id info and photo from the incoming call: 3148343169cc89621d46dce86449f5ee1ff5d3a4919John Wang displayMainCallStatus(cm, ringingCall); 3156b7d0da33af02960736da204eb7a25ccf91d5396David Brown 3166b7d0da33af02960736da204eb7a25ccf91d5396David Brown // And even in the Call Waiting case, *don't* show any info about 3176b7d0da33af02960736da204eb7a25ccf91d5396David Brown // the current ongoing call and/or the current call on hold. 3186b7d0da33af02960736da204eb7a25ccf91d5396David Brown // (Since the caller-id info for the incoming call totally trumps 3196b7d0da33af02960736da204eb7a25ccf91d5396David Brown // any info about the current call(s) in progress.) 3208343169cc89621d46dce86449f5ee1ff5d3a4919John Wang displayOnHoldCallStatus(cm, null); 321b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 322b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 323b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 324b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the UI for the state where the phone is not in use. 325b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * This is analogous to updateForegroundCall() and updateRingingCall(), 326b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * but for the (uncommon) case where the phone is 327b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * totally idle. (See comments in updateState() above.) 328b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 329b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * This puts the callcard into a sane but "blank" state. 330b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 3318343169cc89621d46dce86449f5ee1ff5d3a4919John Wang private void updateNoCall(CallManager cm) { 332b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateNoCall()..."); 333b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 3348343169cc89621d46dce86449f5ee1ff5d3a4919John Wang displayMainCallStatus(cm, null); 3358343169cc89621d46dce86449f5ee1ff5d3a4919John Wang displayOnHoldCallStatus(cm, null); 336b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 337b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 338b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 339b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the main block of caller info on the CallCard 3400d315275d08cd33f801ae3a74e8fc265520f6246David Brown * (ie. the stuff in the primaryCallInfo block) based on the specified Call. 341b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 3428343169cc89621d46dce86449f5ee1ff5d3a4919John Wang private void displayMainCallStatus(CallManager cm, Call call) { 3438343169cc89621d46dce86449f5ee1ff5d3a4919John Wang if (DBG) log("displayMainCallStatus(phone " + cm 344b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project + ", call " + call + ")..."); 345b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 346b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (call == null) { 347b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // There's no call to display, presumably because the phone is idle. 3480d315275d08cd33f801ae3a74e8fc265520f6246David Brown mPrimaryCallInfo.setVisibility(View.GONE); 349b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return; 350b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 3510d315275d08cd33f801ae3a74e8fc265520f6246David Brown mPrimaryCallInfo.setVisibility(View.VISIBLE); 352b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 353b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 354b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log(" - call.state: " + call.getState()); 355b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 356b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (state) { 357b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ACTIVE: 3585eff1e7d582679b3a85f580eb1d550b2e6ca111cDavid Brown case DISCONNECTING: 359b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // update timer field 360b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("displayMainCallStatus: start periodicUpdateTimer"); 361b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.setActiveCallMode(call); 362b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.reset(); 363b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.periodicUpdateTimer(); 364b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 365b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 366b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 367b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case HOLDING: 368b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // update timer field 369b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.cancelTimer(); 370b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 371b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 372b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 373b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DISCONNECTED: 374b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Stop getting timer ticks from this call 375b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.cancelTimer(); 376b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 377b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 378b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 379b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DIALING: 380b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ALERTING: 381b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Stop getting timer ticks from a previous call 382b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.cancelTimer(); 383b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 384b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 385b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 386b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case INCOMING: 387b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case WAITING: 388b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Stop getting timer ticks from a previous call 389b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.cancelTimer(); 390b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 391b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 392b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 393b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case IDLE: 394b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // The "main CallCard" should never be trying to display 395b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // an idle call! In updateState(), if the phone is idle, 396b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // we call updateNoCall(), which means that we shouldn't 397b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // have passed a call into this method at all. 398b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Log.w(LOG_TAG, "displayMainCallStatus: IDLE call in the main call card!"); 399b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 400b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // (It is possible, though, that we had a valid call which 401b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // became idle *after* the check in updateState() but 402b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // before we get here... So continue the best we can, 403b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // with whatever (stale) info we can get from the 404b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // passed-in Call object.) 405b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 406b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 407b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 408b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project default: 409b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Log.w(LOG_TAG, "displayMainCallStatus: unexpected call state: " + state); 410b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 411b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 412b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 4138343169cc89621d46dce86449f5ee1ff5d3a4919John Wang updateCardTitleWidgets(call.getPhone(), call); 414b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 415b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (PhoneUtils.isConferenceCall(call)) { 416b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Update onscreen info for a conference call. 417872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan updateDisplayForConference(call); 418b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 419b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Update onscreen info for a regular call (which presumably 420b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // has only one connection.) 4210fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville Connection conn = null; 4228343169cc89621d46dce86449f5ee1ff5d3a4919John Wang int phoneType = call.getPhone().getPhoneType(); 42379b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink if (phoneType == Phone.PHONE_TYPE_CDMA) { 4240fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville conn = call.getLatestConnection(); 425872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan } else if ((phoneType == Phone.PHONE_TYPE_GSM) 426872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan || (phoneType == Phone.PHONE_TYPE_SIP)) { 4270fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville conn = call.getEarliestConnection(); 42879b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink } else { 42979b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink throw new IllegalStateException("Unexpected phone type: " + phoneType); 4300fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } 431b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 432b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (conn == null) { 433b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("displayMainCallStatus: connection is null, using default values."); 434b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if the connection is null, we run through the behaviour 435b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // we had in the past, which breaks down into trivial steps 436b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // with the current implementation of getCallerInfo and 437b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // updateDisplayForPerson. 4384359358c4f430cbb986a5e7640ec506f08f1e332David Brown CallerInfo info = PhoneUtils.getCallerInfo(getContext(), null /* conn */); 4394359358c4f430cbb986a5e7640ec506f08f1e332David Brown updateDisplayForPerson(info, Connection.PRESENTATION_ALLOWED, false, call); 440b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 441b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log(" - CONN: " + conn + ", state = " + conn.getState()); 4424359358c4f430cbb986a5e7640ec506f08f1e332David Brown int presentation = conn.getNumberPresentation(); 443b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 444b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // make sure that we only make a new query when the current 445b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // callerinfo differs from what we've been requested to display. 446b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project boolean runQuery = true; 447b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Object o = conn.getUserData(); 448b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (o instanceof PhoneUtils.CallerInfoToken) { 449b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project runQuery = mPhotoTracker.isDifferentImageRequest( 450b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ((PhoneUtils.CallerInfoToken) o).currentInfo); 451b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 452b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project runQuery = mPhotoTracker.isDifferentImageRequest(conn); 453b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 454b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 45546532b66a467f247380054270c6151aa3dc7a761Wink Saville // Adding a check to see if the update was caused due to a Phone number update 45646532b66a467f247380054270c6151aa3dc7a761Wink Saville // or CNAP update. If so then we need to start a new query 45779b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink if (phoneType == Phone.PHONE_TYPE_CDMA) { 45846532b66a467f247380054270c6151aa3dc7a761Wink Saville Object obj = conn.getUserData(); 45946532b66a467f247380054270c6151aa3dc7a761Wink Saville String updatedNumber = conn.getAddress(); 46046532b66a467f247380054270c6151aa3dc7a761Wink Saville String updatedCnapName = conn.getCnapName(); 46146532b66a467f247380054270c6151aa3dc7a761Wink Saville CallerInfo info = null; 46246532b66a467f247380054270c6151aa3dc7a761Wink Saville if (obj instanceof PhoneUtils.CallerInfoToken) { 46346532b66a467f247380054270c6151aa3dc7a761Wink Saville info = ((PhoneUtils.CallerInfoToken) o).currentInfo; 46446532b66a467f247380054270c6151aa3dc7a761Wink Saville } else if (o instanceof CallerInfo) { 46546532b66a467f247380054270c6151aa3dc7a761Wink Saville info = (CallerInfo) o; 46646532b66a467f247380054270c6151aa3dc7a761Wink Saville } 46746532b66a467f247380054270c6151aa3dc7a761Wink Saville 46846532b66a467f247380054270c6151aa3dc7a761Wink Saville if (info != null) { 46946532b66a467f247380054270c6151aa3dc7a761Wink Saville if (updatedNumber != null && !updatedNumber.equals(info.phoneNumber)) { 47046532b66a467f247380054270c6151aa3dc7a761Wink Saville if (DBG) log("- displayMainCallStatus: updatedNumber = " 47146532b66a467f247380054270c6151aa3dc7a761Wink Saville + updatedNumber); 47246532b66a467f247380054270c6151aa3dc7a761Wink Saville runQuery = true; 47346532b66a467f247380054270c6151aa3dc7a761Wink Saville } 47446532b66a467f247380054270c6151aa3dc7a761Wink Saville if (updatedCnapName != null && !updatedCnapName.equals(info.cnapName)) { 47546532b66a467f247380054270c6151aa3dc7a761Wink Saville if (DBG) log("- displayMainCallStatus: updatedCnapName = " 47646532b66a467f247380054270c6151aa3dc7a761Wink Saville + updatedCnapName); 47746532b66a467f247380054270c6151aa3dc7a761Wink Saville runQuery = true; 47846532b66a467f247380054270c6151aa3dc7a761Wink Saville } 47946532b66a467f247380054270c6151aa3dc7a761Wink Saville } 48046532b66a467f247380054270c6151aa3dc7a761Wink Saville } 48146532b66a467f247380054270c6151aa3dc7a761Wink Saville 482b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (runQuery) { 483b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("- displayMainCallStatus: starting CallerInfo query..."); 484b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project PhoneUtils.CallerInfoToken info = 485b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project PhoneUtils.startGetCallerInfo(getContext(), conn, this, call); 4864b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project updateDisplayForPerson(info.currentInfo, presentation, !info.isFinal, call); 487b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 488b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // No need to fire off a new query. We do still need 489b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // to update the display, though (since we might have 490b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // previously been in the "conference call" state.) 491b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("- displayMainCallStatus: using data we already have..."); 492b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (o instanceof CallerInfo) { 493b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project CallerInfo ci = (CallerInfo) o; 494e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai // Update CNAP information if Phone state change occurred 495e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai ci.cnapName = conn.getCnapName(); 496e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai ci.numberPresentation = conn.getNumberPresentation(); 497e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai ci.namePresentation = conn.getCnapNamePresentation(); 498e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai if (DBG) log("- displayMainCallStatus: CNAP data from Connection: " 499e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai + "CNAP name=" + ci.cnapName 500e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai + ", Number/Name Presentation=" + ci.numberPresentation); 501b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log(" ==> Got CallerInfo; updating display: ci = " + ci); 5024b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project updateDisplayForPerson(ci, presentation, false, call); 503b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (o instanceof PhoneUtils.CallerInfoToken){ 504b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project CallerInfo ci = ((PhoneUtils.CallerInfoToken) o).currentInfo; 505e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai if (DBG) log("- displayMainCallStatus: CNAP data from Connection: " 506e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai + "CNAP name=" + ci.cnapName 507e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai + ", Number/Name Presentation=" + ci.numberPresentation); 508b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log(" ==> Got CallerInfoToken; updating display: ci = " + ci); 5094b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project updateDisplayForPerson(ci, presentation, true, call); 510b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 511b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Log.w(LOG_TAG, "displayMainCallStatus: runQuery was false, " 512b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project + "but we didn't have a cached CallerInfo object! o = " + o); 513b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: any easy way to recover here (given that 514b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the CallCard is probably displaying stale info 515b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // right now?) Maybe force the CallCard into the 516b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "Unknown" state? 517b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 518b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 519b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 520b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 521b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 522b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // In some states we override the "photo" ImageView to be an 523b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // indication of the current state, rather than displaying the 524b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // regular photo as set above. 525b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updatePhotoForCallState(call); 5269688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown 5279688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown // One special feature of the "number" text field: For incoming 5289688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown // calls, while the user is dragging the RotarySelector widget, we 5299688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown // use mPhoneNumber to display a hint like "Rotate to answer". 5309688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown if (mRotarySelectorHintTextResId != 0) { 5319688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown // Display the hint! 5329688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown mPhoneNumber.setText(mRotarySelectorHintTextResId); 5339688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown mPhoneNumber.setTextColor(getResources().getColor(mRotarySelectorHintColorResId)); 5349688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown mPhoneNumber.setVisibility(View.VISIBLE); 5359688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown mLabel.setVisibility(View.GONE); 5369688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown } 5379688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown // If we don't have a hint to display, just don't touch 5389688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown // mPhoneNumber and mLabel. (Their text / color / visibility have 5399688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown // already been set correctly, by either updateDisplayForPerson() 5409688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown // or updateDisplayForConference().) 541b15bef0ddcb4f744dff92013a9b596f2fcc2a008David Brown } 542b15bef0ddcb4f744dff92013a9b596f2fcc2a008David Brown 543b15bef0ddcb4f744dff92013a9b596f2fcc2a008David Brown /** 544b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Implemented for CallerInfoAsyncQuery.OnQueryCompleteListener interface. 545b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * refreshes the CallCard data when it called. 546b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 547b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public void onQueryComplete(int token, Object cookie, CallerInfo ci) { 548b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("onQueryComplete: token " + token + ", cookie " + cookie + ", ci " + ci); 549b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 550b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (cookie instanceof Call) { 551b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // grab the call object and update the display for an individual call, 552b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // as well as the successive call to update image via call state. 553b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // If the object is a textview instead, we update it as we need to. 554b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("callerinfo query complete, updating ui from displayMainCallStatus()"); 555b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call call = (Call) cookie; 556a0ea7a803c8953a14bc35d1fef0973fd1d9c64b9Abhishek Pillai Connection conn = null; 557872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan int phoneType = call.getPhone().getPhoneType(); 558a0ea7a803c8953a14bc35d1fef0973fd1d9c64b9Abhishek Pillai if (phoneType == Phone.PHONE_TYPE_CDMA) { 559a0ea7a803c8953a14bc35d1fef0973fd1d9c64b9Abhishek Pillai conn = call.getLatestConnection(); 560872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan } else if ((phoneType == Phone.PHONE_TYPE_GSM) 561872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan || (phoneType == Phone.PHONE_TYPE_SIP)) { 562a0ea7a803c8953a14bc35d1fef0973fd1d9c64b9Abhishek Pillai conn = call.getEarliestConnection(); 563a0ea7a803c8953a14bc35d1fef0973fd1d9c64b9Abhishek Pillai } else { 564a0ea7a803c8953a14bc35d1fef0973fd1d9c64b9Abhishek Pillai throw new IllegalStateException("Unexpected phone type: " + phoneType); 565a0ea7a803c8953a14bc35d1fef0973fd1d9c64b9Abhishek Pillai } 566e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai PhoneUtils.CallerInfoToken cit = 567e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai PhoneUtils.startGetCallerInfo(getContext(), conn, this, null); 568e066d6979acb39dbc0ba79ecc10bc12e84a15195David Brown 569e066d6979acb39dbc0ba79ecc10bc12e84a15195David Brown int presentation = Connection.PRESENTATION_ALLOWED; 570e066d6979acb39dbc0ba79ecc10bc12e84a15195David Brown if (conn != null) presentation = conn.getNumberPresentation(); 571e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai if (DBG) log("- onQueryComplete: presentation=" + presentation 572e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai + ", contactExists=" + ci.contactExists); 573e066d6979acb39dbc0ba79ecc10bc12e84a15195David Brown 574e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai // Depending on whether there was a contact match or not, we want to pass in different 575e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai // CallerInfo (for CNAP). Therefore if ci.contactExists then use the ci passed in. 576e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai // Otherwise, regenerate the CIT from the Connection and use the CallerInfo from there. 577e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai if (ci.contactExists) { 578e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai updateDisplayForPerson(ci, Connection.PRESENTATION_ALLOWED, false, call); 579e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai } else { 580e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai updateDisplayForPerson(cit.currentInfo, presentation, false, call); 581e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai } 582b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updatePhotoForCallState(call); 583b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 584b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (cookie instanceof TextView){ 585b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("callerinfo query complete, updating ui from ongoing or onhold"); 586b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ((TextView) cookie).setText(PhoneUtils.getCompactNameFromCallerInfo(ci, mContext)); 587b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 588b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 589b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 590b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 591b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Implemented for ContactsAsyncHelper.OnImageLoadCompleteListener interface. 592b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * make sure that the call state is reflected after the image is loaded. 593b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 594b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public void onImageLoadComplete(int token, Object cookie, ImageView iView, 595b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project boolean imagePresent){ 596b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (cookie != null) { 597b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updatePhotoForCallState((Call) cookie); 598b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 599b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 600b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 601b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 60234a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown * Updates the "card title" (and also elapsed time widget) based on 60334a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown * the current state of the call. 604b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 605e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // TODO: it's confusing for updateCardTitleWidgets() and 606e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // getTitleForCallCard() to be separate methods, since they both 607e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // just list out the exact same "phone state" cases. 608e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // Let's merge the getTitleForCallCard() logic into here. 609b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updateCardTitleWidgets(Phone phone, Call call) { 610b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateCardTitleWidgets(call " + call + ")..."); 611b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 612b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 613b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: Still need clearer spec on exactly how title *and* status get 614b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // set in all states. (Then, given that info, refactor the code 615b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // here to be more clear about exactly which widgets on the card 616b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // need to be set.) 617b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 6183800ac871d6548790ac6119bb68b9be0640af261David Krause String cardTitle; 619872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan int phoneType = phone.getPhoneType(); 62079b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink if (phoneType == Phone.PHONE_TYPE_CDMA) { 6213800ac871d6548790ac6119bb68b9be0640af261David Krause if (!PhoneApp.getInstance().notifier.getIsCdmaRedialCall()) { 6226b7d0da33af02960736da204eb7a25ccf91d5396David Brown cardTitle = getTitleForCallCard(call); // Normal "foreground" call card 6233800ac871d6548790ac6119bb68b9be0640af261David Krause } else { 6243800ac871d6548790ac6119bb68b9be0640af261David Krause cardTitle = getContext().getString(R.string.card_title_redialing); 6253800ac871d6548790ac6119bb68b9be0640af261David Krause } 626872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan } else if ((phoneType == Phone.PHONE_TYPE_GSM) 627872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan || (phoneType == Phone.PHONE_TYPE_SIP)) { 6283800ac871d6548790ac6119bb68b9be0640af261David Krause cardTitle = getTitleForCallCard(call); 62979b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink } else { 63079b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink throw new IllegalStateException("Unexpected phone type: " + phoneType); 6313800ac871d6548790ac6119bb68b9be0640af261David Krause } 632b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateCardTitleWidgets: " + cardTitle); 633b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 63434a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // Update the title and elapsed time widgets based on the current call state. 63534a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown switch (state) { 63634a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown case ACTIVE: 63734a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown case DISCONNECTING: 63834a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown final boolean bluetoothActive = mApplication.showBluetoothIndication(); 63934a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown int ongoingCallIcon = bluetoothActive ? R.drawable.ic_incall_ongoing_bluetooth 64034a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown : R.drawable.ic_incall_ongoing; 64134a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown int connectedTextColor = bluetoothActive 64234a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown ? mTextColorConnectedBluetooth : mTextColorConnected; 643b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 64479b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink if (phoneType == Phone.PHONE_TYPE_CDMA) { 64534a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // Check if the "Dialing" 3Way call needs to be displayed 64634a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // as the Foreground Call state still remains ACTIVE 64734a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown if (mApplication.cdmaPhoneCallState.IsThreeWayCallOrigStateDialing()) { 64834a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // Use the "upper title": 6499688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown setUpperTitle(cardTitle, mTextColorDefaultPrimary, state); 65034a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown } else { 65134a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // Normal "ongoing call" state; don't use any "title" at all. 65234a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown clearUpperTitle(); 65334a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown } 654872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan } else if ((phoneType == Phone.PHONE_TYPE_GSM) 655872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan || (phoneType == Phone.PHONE_TYPE_SIP)) { 656e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // While in the DISCONNECTING state we display a 657e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // "Hanging up" message in order to make the UI feel more 658e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // responsive. (In GSM it's normal to see a delay of a 659e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // couple of seconds while negotiating the disconnect with 660e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // the network, so the "Hanging up" state at least lets 661e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // the user know that we're doing something.) 662e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // TODO: consider displaying the "Hanging up" state for 663e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // CDMA also if the latency there ever gets high enough. 664e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown if (state == Call.State.DISCONNECTING) { 665e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // Display the brief "Hanging up" indication. 666e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown setUpperTitle(cardTitle, mTextColorDefaultPrimary, state); 667e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown } else { // state == Call.State.ACTIVE 668e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown // Normal "ongoing call" state; don't use any "title" at all. 669e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown clearUpperTitle(); 670e806935bab812a8ebf71846cdf342bb1a46a45f4David Brown } 67134a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown } 67234a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 67334a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // Use the elapsed time widget to show the current call duration. 67434a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown mElapsedTime.setVisibility(View.VISIBLE); 67534a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown mElapsedTime.setTextColor(connectedTextColor); 67634a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown long duration = CallTime.getCallDuration(call); // msec 67734a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown updateElapsedTimeWidget(duration / 1000); 67834a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // Also see onTickForCallTimeElapsed(), which updates this 67934a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // widget once per second while the call is active. 68034a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown break; 68134a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 68234a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown case DISCONNECTED: 68334a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // Display "Call ended" (or possibly some error indication; 68434a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // see getCallFailedString()) in the upper title, in red. 68534a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 68634a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // TODO: display a "call ended" icon somewhere, like the old 68734a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // R.drawable.ic_incall_end? 68834a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 68934a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown setUpperTitle(cardTitle, mTextColorEnded, state); 69034a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 69134a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // In the "Call ended" state, leave the mElapsedTime widget 69234a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // visible, but don't touch it (so we continue to see the elapsed time of 69334a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // the call that just ended.) 69434a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown mElapsedTime.setVisibility(View.VISIBLE); 69534a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown mElapsedTime.setTextColor(mTextColorEnded); 69634a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown break; 69734a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 69834a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown case HOLDING: 69934a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // For a single call on hold, display the title "On hold" in 70034a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // orange. 70134a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // (But since the upper title overlaps the label of the 70234a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // Hold/Unhold button, we actually use the elapsedTime widget 70334a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // to display the title in this case.) 70434a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 70534a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // TODO: display an "On hold" icon somewhere, like the old 70634a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // R.drawable.ic_incall_onhold? 70734a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 70834a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown clearUpperTitle(); 70934a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown mElapsedTime.setText(cardTitle); 71034a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 71134a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // While on hold, the elapsed time widget displays an 71234a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // "on hold" indication rather than an amount of time. 71334a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown mElapsedTime.setVisibility(View.VISIBLE); 71434a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown mElapsedTime.setTextColor(mTextColorOnHold); 71534a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown break; 71634a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 71734a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown default: 71834a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // All other states (DIALING, INCOMING, etc.) use the "upper title": 7199688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown setUpperTitle(cardTitle, mTextColorDefaultPrimary, state); 72034a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 72134a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown // ...and we don't show the elapsed time. 72234a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown mElapsedTime.setVisibility(View.INVISIBLE); 72334a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown break; 724b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 725b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 726b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 727b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 728b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates mElapsedTime based on the specified number of seconds. 729b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * A timeElapsed value of zero means to not show an elapsed time at all. 730b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 731b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updateElapsedTimeWidget(long timeElapsed) { 732b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if (DBG) log("updateElapsedTimeWidget: " + timeElapsed); 733b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (timeElapsed == 0) { 734b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mElapsedTime.setText(""); 735b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 736b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mElapsedTime.setText(DateUtils.formatElapsedTime(timeElapsed)); 737b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 738b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 739b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 740b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 741b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Returns the "card title" displayed at the top of a foreground 742b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * ("active") CallCard to indicate the current state of this call, like 743b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * "Dialing" or "In call" or "On hold". A null return value means that 744b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * there's no title string for this state. 745b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 746b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private String getTitleForCallCard(Call call) { 747b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String retVal = null; 748b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 749b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Context context = getContext(); 750b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int resId; 751b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 752b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("- getTitleForCallCard(Call " + call + ")..."); 753b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 754b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (state) { 755b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case IDLE: 756b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 757b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 758b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ACTIVE: 759b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Title is "Call in progress". (Note this appears in the 760b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "lower title" area of the CallCard.) 761872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan int phoneType = call.getPhone().getPhoneType(); 76279b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink if (phoneType == Phone.PHONE_TYPE_CDMA) { 7630fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville if (mApplication.cdmaPhoneCallState.IsThreeWayCallOrigStateDialing()) { 7640fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville retVal = context.getString(R.string.card_title_dialing); 7650fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } else { 7660fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville retVal = context.getString(R.string.card_title_in_progress); 7670fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } 768872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan } else if ((phoneType == Phone.PHONE_TYPE_GSM) 769872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan || (phoneType == Phone.PHONE_TYPE_SIP)) { 7700fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville retVal = context.getString(R.string.card_title_in_progress); 77179b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink } else { 77279b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink throw new IllegalStateException("Unexpected phone type: " + phoneType); 7730fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } 774b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 775b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 776b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case HOLDING: 777b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project retVal = context.getString(R.string.card_title_on_hold); 778b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: if this is a conference call on hold, 779b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // maybe have a special title here too? 780b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 781b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 782b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DIALING: 783b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ALERTING: 784b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project retVal = context.getString(R.string.card_title_dialing); 785b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 786b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 787b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case INCOMING: 788b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case WAITING: 789b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project retVal = context.getString(R.string.card_title_incoming_call); 790b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 791b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 7925eff1e7d582679b3a85f580eb1d550b2e6ca111cDavid Brown case DISCONNECTING: 7935eff1e7d582679b3a85f580eb1d550b2e6ca111cDavid Brown retVal = context.getString(R.string.card_title_hanging_up); 7945eff1e7d582679b3a85f580eb1d550b2e6ca111cDavid Brown break; 7955eff1e7d582679b3a85f580eb1d550b2e6ca111cDavid Brown 796b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DISCONNECTED: 797b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project retVal = getCallFailedString(call); 798b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 799b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 800b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 801b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log(" ==> result: " + retVal); 802b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return retVal; 803b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 804b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 805b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 806b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the "on hold" box in the "other call" info area 8070d315275d08cd33f801ae3a74e8fc265520f6246David Brown * (ie. the stuff in the secondaryCallInfo block) 808b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * based on the specified Call. 809b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Or, clear out the "on hold" box if the specified call 810b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * is null or idle. 811b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 8128343169cc89621d46dce86449f5ee1ff5d3a4919John Wang private void displayOnHoldCallStatus(CallManager cm, Call call) { 813b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("displayOnHoldCallStatus(call =" + call + ")..."); 814af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville 815af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville if ((call == null) || (PhoneApp.getInstance().isOtaCallInActiveState())) { 8160d315275d08cd33f801ae3a74e8fc265520f6246David Brown mSecondaryCallInfo.setVisibility(View.GONE); 817b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return; 818b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 819b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 8208da4d90151c882972e15429d4d48bdaa45095d72David Brown boolean showSecondaryCallInfo = false; 821b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 822b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (state) { 823b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case HOLDING: 824b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Ok, there actually is a background call on hold. 825b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Display the "on hold" box. 826b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 8270d315275d08cd33f801ae3a74e8fc265520f6246David Brown // Note this case occurs only on GSM devices. (On CDMA, 8280d315275d08cd33f801ae3a74e8fc265520f6246David Brown // the "call on hold" is actually the 2nd connection of 8290d315275d08cd33f801ae3a74e8fc265520f6246David Brown // that ACTIVE call; see the ACTIVE case below.) 8300d315275d08cd33f801ae3a74e8fc265520f6246David Brown 831b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (PhoneUtils.isConferenceCall(call)) { 832b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("==> conference call."); 8330d315275d08cd33f801ae3a74e8fc265520f6246David Brown mSecondaryCallName.setText(getContext().getString(R.string.confCall)); 8340d315275d08cd33f801ae3a74e8fc265520f6246David Brown showImage(mSecondaryCallPhoto, R.drawable.picture_conference); 835b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 836b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // perform query and update the name temporarily 837b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // make sure we hand the textview we want updated to the 838b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // callback function. 839b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("==> NOT a conf call; call startGetCallerInfo..."); 8400d315275d08cd33f801ae3a74e8fc265520f6246David Brown PhoneUtils.CallerInfoToken infoToken = PhoneUtils.startGetCallerInfo( 8410d315275d08cd33f801ae3a74e8fc265520f6246David Brown getContext(), call, this, mSecondaryCallName); 8420d315275d08cd33f801ae3a74e8fc265520f6246David Brown mSecondaryCallName.setText( 8430d315275d08cd33f801ae3a74e8fc265520f6246David Brown PhoneUtils.getCompactNameFromCallerInfo(infoToken.currentInfo, 8440d315275d08cd33f801ae3a74e8fc265520f6246David Brown getContext())); 8450d315275d08cd33f801ae3a74e8fc265520f6246David Brown 8460d315275d08cd33f801ae3a74e8fc265520f6246David Brown // Also pull the photo out of the current CallerInfo. 8470d315275d08cd33f801ae3a74e8fc265520f6246David Brown // (Note we assume we already have a valid photo at 8480d315275d08cd33f801ae3a74e8fc265520f6246David Brown // this point, since *presumably* the caller-id query 8490d315275d08cd33f801ae3a74e8fc265520f6246David Brown // was already run at some point *before* this call 8500d315275d08cd33f801ae3a74e8fc265520f6246David Brown // got put on hold. If there's no cached photo, just 8510d315275d08cd33f801ae3a74e8fc265520f6246David Brown // fall back to the default "unknown" image.) 8520d315275d08cd33f801ae3a74e8fc265520f6246David Brown if (infoToken.isFinal) { 8530d315275d08cd33f801ae3a74e8fc265520f6246David Brown showCachedImage(mSecondaryCallPhoto, infoToken.currentInfo); 8540d315275d08cd33f801ae3a74e8fc265520f6246David Brown } else { 8550d315275d08cd33f801ae3a74e8fc265520f6246David Brown showImage(mSecondaryCallPhoto, R.drawable.picture_unknown); 8560d315275d08cd33f801ae3a74e8fc265520f6246David Brown } 857b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 858b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 8598da4d90151c882972e15429d4d48bdaa45095d72David Brown showSecondaryCallInfo = true; 860b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 861b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 862b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 8630fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville case ACTIVE: 8640fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // CDMA: This is because in CDMA when the user originates the second call, 8650fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // although the Foreground call state is still ACTIVE in reality the network 8660fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // put the first call on hold. 86779b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink if (mApplication.phone.getPhoneType() == Phone.PHONE_TYPE_CDMA) { 8680fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville List<Connection> connections = call.getConnections(); 8690fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville if (connections.size() > 2) { 8700fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // This means that current Mobile Originated call is the not the first 3-Way 8710fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // call the user is making, which in turn tells the PhoneApp that we no 8720fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // longer know which previous caller/party had dropped out before the user 8730fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // made this call. 8740d315275d08cd33f801ae3a74e8fc265520f6246David Brown mSecondaryCallName.setText( 8750d315275d08cd33f801ae3a74e8fc265520f6246David Brown getContext().getString(R.string.card_title_in_call)); 8760d315275d08cd33f801ae3a74e8fc265520f6246David Brown showImage(mSecondaryCallPhoto, R.drawable.picture_unknown); 8770fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } else { 8780fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // This means that the current Mobile Originated call IS the first 3-Way 8790fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // and hence we display the first callers/party's info here. 8800fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville Connection conn = call.getEarliestConnection(); 881de0d16c814b5e7f6c75d00025dc331f64703de1cPaul Berman PhoneUtils.CallerInfoToken infoToken = PhoneUtils.startGetCallerInfo( 8820d315275d08cd33f801ae3a74e8fc265520f6246David Brown getContext(), conn, this, mSecondaryCallName); 8830fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville 884de0d16c814b5e7f6c75d00025dc331f64703de1cPaul Berman // Get the compactName to be displayed, but then check that against 885de0d16c814b5e7f6c75d00025dc331f64703de1cPaul Berman // the number presentation value for the call. If it's not an allowed 886de0d16c814b5e7f6c75d00025dc331f64703de1cPaul Berman // presentation, then display the appropriate presentation string instead. 887de0d16c814b5e7f6c75d00025dc331f64703de1cPaul Berman CallerInfo info = infoToken.currentInfo; 8880d315275d08cd33f801ae3a74e8fc265520f6246David Brown 8890d315275d08cd33f801ae3a74e8fc265520f6246David Brown String name = PhoneUtils.getCompactNameFromCallerInfo(info, getContext()); 8900d315275d08cd33f801ae3a74e8fc265520f6246David Brown boolean forceGenericPhoto = false; 891de0d16c814b5e7f6c75d00025dc331f64703de1cPaul Berman if (info != null && info.numberPresentation != 892de0d16c814b5e7f6c75d00025dc331f64703de1cPaul Berman Connection.PRESENTATION_ALLOWED) { 893de0d16c814b5e7f6c75d00025dc331f64703de1cPaul Berman name = getPresentationString(info.numberPresentation); 8940d315275d08cd33f801ae3a74e8fc265520f6246David Brown forceGenericPhoto = true; 8950d315275d08cd33f801ae3a74e8fc265520f6246David Brown } 8960d315275d08cd33f801ae3a74e8fc265520f6246David Brown mSecondaryCallName.setText(name); 8970d315275d08cd33f801ae3a74e8fc265520f6246David Brown 8980d315275d08cd33f801ae3a74e8fc265520f6246David Brown // Also pull the photo out of the current CallerInfo. 8990d315275d08cd33f801ae3a74e8fc265520f6246David Brown // (Note we assume we already have a valid photo at 9000d315275d08cd33f801ae3a74e8fc265520f6246David Brown // this point, since *presumably* the caller-id query 9010d315275d08cd33f801ae3a74e8fc265520f6246David Brown // was already run at some point *before* this call 9020d315275d08cd33f801ae3a74e8fc265520f6246David Brown // got put on hold. If there's no cached photo, just 9030d315275d08cd33f801ae3a74e8fc265520f6246David Brown // fall back to the default "unknown" image.) 9040d315275d08cd33f801ae3a74e8fc265520f6246David Brown if (!forceGenericPhoto && infoToken.isFinal) { 9050d315275d08cd33f801ae3a74e8fc265520f6246David Brown showCachedImage(mSecondaryCallPhoto, info); 9060d315275d08cd33f801ae3a74e8fc265520f6246David Brown } else { 9070d315275d08cd33f801ae3a74e8fc265520f6246David Brown showImage(mSecondaryCallPhoto, R.drawable.picture_unknown); 908de0d16c814b5e7f6c75d00025dc331f64703de1cPaul Berman } 9090fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } 9108da4d90151c882972e15429d4d48bdaa45095d72David Brown showSecondaryCallInfo = true; 9110fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville 9120d315275d08cd33f801ae3a74e8fc265520f6246David Brown } else { 9130d315275d08cd33f801ae3a74e8fc265520f6246David Brown // We shouldn't ever get here at all for non-CDMA devices. 9140d315275d08cd33f801ae3a74e8fc265520f6246David Brown Log.w(LOG_TAG, "displayOnHoldCallStatus: ACTIVE state on non-CDMA device"); 9158da4d90151c882972e15429d4d48bdaa45095d72David Brown showSecondaryCallInfo = false; 9160fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } 9170fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville break; 9180fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville 919b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project default: 920b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // There's actually no call on hold. (Presumably this call's 921b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // state is IDLE, since any other state is meaningless for the 922b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // background call.) 9238da4d90151c882972e15429d4d48bdaa45095d72David Brown showSecondaryCallInfo = false; 924b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 925b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 9268da4d90151c882972e15429d4d48bdaa45095d72David Brown 9278da4d90151c882972e15429d4d48bdaa45095d72David Brown if (showSecondaryCallInfo) { 9288da4d90151c882972e15429d4d48bdaa45095d72David Brown // Ok, we have something useful to display in the "secondary 9298da4d90151c882972e15429d4d48bdaa45095d72David Brown // call" info area. 9308da4d90151c882972e15429d4d48bdaa45095d72David Brown mSecondaryCallInfo.setVisibility(View.VISIBLE); 9318da4d90151c882972e15429d4d48bdaa45095d72David Brown 9328da4d90151c882972e15429d4d48bdaa45095d72David Brown // Watch out: there are some cases where we need to display the 9338da4d90151c882972e15429d4d48bdaa45095d72David Brown // secondary call photo but *not* the two lines of text above it. 9348da4d90151c882972e15429d4d48bdaa45095d72David Brown // Specifically, that's any state where the CallCard "upper title" is 9358da4d90151c882972e15429d4d48bdaa45095d72David Brown // in use, since the title (e.g. "Dialing" or "Call ended") might 9368da4d90151c882972e15429d4d48bdaa45095d72David Brown // collide with the secondaryCallStatus and secondaryCallName widgets. 9378da4d90151c882972e15429d4d48bdaa45095d72David Brown // 9388da4d90151c882972e15429d4d48bdaa45095d72David Brown // We detect this case by simply seeing whether or not there's any text 9398da4d90151c882972e15429d4d48bdaa45095d72David Brown // in mUpperTitle. (This is much simpler than detecting all possible 9408da4d90151c882972e15429d4d48bdaa45095d72David Brown // telephony states where the "upper title" is used! But note it does 9418da4d90151c882972e15429d4d48bdaa45095d72David Brown // rely on the fact that updateCardTitleWidgets() gets called *earlier* 9428da4d90151c882972e15429d4d48bdaa45095d72David Brown // than this method, in the CallCard.updateState() sequence...) 9438da4d90151c882972e15429d4d48bdaa45095d72David Brown boolean okToShowLabels = TextUtils.isEmpty(mUpperTitle.getText()); 9448da4d90151c882972e15429d4d48bdaa45095d72David Brown mSecondaryCallName.setVisibility(okToShowLabels ? View.VISIBLE : View.INVISIBLE); 9458da4d90151c882972e15429d4d48bdaa45095d72David Brown mSecondaryCallStatus.setVisibility(okToShowLabels ? View.VISIBLE : View.INVISIBLE); 9468da4d90151c882972e15429d4d48bdaa45095d72David Brown } else { 9478da4d90151c882972e15429d4d48bdaa45095d72David Brown // Hide the entire "secondary call" info area. 9488da4d90151c882972e15429d4d48bdaa45095d72David Brown mSecondaryCallInfo.setVisibility(View.GONE); 9498da4d90151c882972e15429d4d48bdaa45095d72David Brown } 950b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 951b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 952b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private String getCallFailedString(Call call) { 953b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Connection c = call.getEarliestConnection(); 954b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int resID; 955b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 956b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (c == null) { 957b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("getCallFailedString: connection is null, using default values."); 958b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if this connection is null, just assume that the 959b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // default case occurs. 960b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.card_title_call_ended; 961b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 962b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 963b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Connection.DisconnectCause cause = c.getDisconnectCause(); 964b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 965b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: The card *title* should probably be "Call ended" in all 966b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // cases, but if the DisconnectCause was an error condition we should 967b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // probably also display the specific failure reason somewhere... 968b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 969b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (cause) { 970b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case BUSY: 971b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_userBusy; 972b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 973b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 974b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case CONGESTION: 975b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_congestion; 976b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 977b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 978b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case LOST_SIGNAL: 9793800ac871d6548790ac6119bb68b9be0640af261David Krause case CDMA_DROP: 980b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_noSignal; 981b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 982b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 983b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case LIMIT_EXCEEDED: 984b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_limitExceeded; 985b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 986b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 987b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case POWER_OFF: 988b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_powerOff; 989b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 990b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 991a69de9f9a2e99fe08f0009bb218b95ed7985c575Wink Saville case ICC_ERROR: 992b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_simError; 993b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 994b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 995b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case OUT_OF_SERVICE: 996b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_outOfService; 997b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 998b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 99922e353c3d76a3dd649c6e87244c5d94cadf64c8eHung-ying Tyan case INVALID_NUMBER: 10009eb2ffdf7b4752c7199eba6a3b88f63edc4a0ac8Naveen Kalla case UNOBTAINABLE_NUMBER: 10019eb2ffdf7b4752c7199eba6a3b88f63edc4a0ac8Naveen Kalla resID = R.string.callFailed_unobtainable_number; 10029eb2ffdf7b4752c7199eba6a3b88f63edc4a0ac8Naveen Kalla break; 10039eb2ffdf7b4752c7199eba6a3b88f63edc4a0ac8Naveen Kalla 1004b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project default: 1005b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.card_title_call_ended; 1006b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 1007b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1008b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1009b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return getContext().getString(resID); 1010b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1011b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1012b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1013b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the name / photo / number / label fields on the CallCard 1014b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * based on the specified CallerInfo. 1015b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 1016b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * If the current call is a conference call, use 1017b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * updateDisplayForConference() instead. 1018b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1019b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updateDisplayForPerson(CallerInfo info, 10204b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project int presentation, 1021b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project boolean isTemporary, 1022b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call call) { 1023a1c2398ade0e01d0bcfe23212bdaa18e4c19a1e5Nicolas Catania if (DBG) log("updateDisplayForPerson(" + info + ")\npresentation:" + 1024a1c2398ade0e01d0bcfe23212bdaa18e4c19a1e5Nicolas Catania presentation + " isTemporary:" + isTemporary); 1025b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1026b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // inform the state machine that we are displaying a photo. 1027b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker.setPhotoRequest(info); 1028b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker.setPhotoState(ContactsAsyncHelper.ImageTracker.DISPLAY_IMAGE); 1029b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1030b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String name; 1031b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String displayNumber = null; 1032b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String label = null; 1033b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Uri personUri = null; 103429d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown String socialStatusText = null; 103529d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown Drawable socialStatusBadge = null; 1036b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1037b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (info != null) { 1038b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // It appears that there is a small change in behaviour with the 1039b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // PhoneUtils' startGetCallerInfo whereby if we query with an 1040b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // empty number, we will get a valid CallerInfo object, but with 1041b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // fields that are all null, and the isTemporary boolean input 1042b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // parameter as true. 1043b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1044b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // In the past, we would see a NULL callerinfo object, but this 1045b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // ends up causing null pointer exceptions elsewhere down the 1046b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // line in other cases, so we need to make this fix instead. It 1047b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // appears that this was the ONLY call to PhoneUtils 1048b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // .getCallerInfo() that relied on a NULL CallerInfo to indicate 1049b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // an unknown contact. 1050b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1051b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (TextUtils.isEmpty(info.name)) { 1052b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (TextUtils.isEmpty(info.phoneNumber)) { 10534b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project name = getPresentationString(presentation); 1054e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai } else if (presentation != Connection.PRESENTATION_ALLOWED) { 1055e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai // This case should never happen since the network should never send a phone # 1056e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai // AND a restricted presentation. However we leave it here in case of weird 1057e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai // network behavior 1058e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai name = getPresentationString(presentation); 1059e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai } else if (!TextUtils.isEmpty(info.cnapName)) { 1060e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai name = info.cnapName; 1061e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai info.name = info.cnapName; 1062e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai displayNumber = info.phoneNumber; 1063b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 1064b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project name = info.phoneNumber; 1065b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1066b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 1067e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai if (presentation != Connection.PRESENTATION_ALLOWED) { 1068e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai // This case should never happen since the network should never send a name 1069e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai // AND a restricted presentation. However we leave it here in case of weird 1070e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai // network behavior 1071e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai name = getPresentationString(presentation); 1072e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai } else { 1073e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai name = info.name; 1074e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai displayNumber = info.phoneNumber; 1075e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai label = info.phoneLabel; 1076e2c9e16a099b6a120db0a589ad1959b8787b9f9bAbhishek Pillai } 1077b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 10783d6d70562622660e581b53308e675386d299dd19Dmitri Plotnikov personUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, info.person_id); 1079b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 10804b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project name = getPresentationString(presentation); 1081b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 10820fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville 10830fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville if (call.isGeneric()) { 10840fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville mName.setText(R.string.card_title_in_call); 10850fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } else { 10860fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville mName.setText(name); 10870fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } 1088b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mName.setVisibility(View.VISIBLE); 1089b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1090b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Update mPhoto 1091b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if the temporary flag is set, we know we'll be getting another call after 1092b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the CallerInfo has been correctly updated. So, we can skip the image 1093b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // loading until then. 1094b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1095b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // If the photoResource is filled in for the CallerInfo, (like with the 1096b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Emergency Number case), then we can just set the photo image without 1097b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // requesting for an image load. Please refer to CallerInfoAsyncQuery.java 1098b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // for cases where CallerInfo.photoResource may be set. We can also avoid 1099b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the image load step if the image data is cached. 1100b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (isTemporary && (info == null || !info.isCachedPhotoCurrent)) { 1101b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoto.setVisibility(View.INVISIBLE); 1102b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (info != null && info.photoResource != 0){ 1103b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(mPhoto, info.photoResource); 1104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (!showCachedImage(mPhoto, info)) { 1105b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Load the image with a callback to update the image state. 1106a1c2398ade0e01d0bcfe23212bdaa18e4c19a1e5Nicolas Catania // Use the default unknown picture while the query is running. 1107a1c2398ade0e01d0bcfe23212bdaa18e4c19a1e5Nicolas Catania ContactsAsyncHelper.updateImageViewWithContactPhotoAsync( 1108a1c2398ade0e01d0bcfe23212bdaa18e4c19a1e5Nicolas Catania info, 0, this, call, getContext(), mPhoto, personUri, R.drawable.picture_unknown); 1109b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 11106d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown // And no matter what, on all devices, we never see the "manage 11116d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown // conference" button in this state. 11126d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown mManageConferencePhotoButton.setVisibility(View.INVISIBLE); 11136d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown 11140fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville if (displayNumber != null && !call.isGeneric()) { 1115b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoneNumber.setText(displayNumber); 11169688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown mPhoneNumber.setTextColor(mTextColorDefaultSecondary); 1117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoneNumber.setVisibility(View.VISIBLE); 1118b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 1119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoneNumber.setVisibility(View.GONE); 1120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1121b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1122153e79d8d413b1ccd4abf55a8dbe4e266aa92799Paul Berman if (label != null && !call.isGeneric()) { 1123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLabel.setText(label); 1124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLabel.setVisibility(View.VISIBLE); 1125b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 1126b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLabel.setVisibility(View.GONE); 1127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1128b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 11299d14e16e8214b4a396dad293b6f0941608ee4798David Brown // Other text fields: 11309d14e16e8214b4a396dad293b6f0941608ee4798David Brown updateCallTypeLabel(call); 11319d14e16e8214b4a396dad293b6f0941608ee4798David Brown updateSocialStatus(socialStatusText, socialStatusBadge, call); // Currently unused 113229d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown } 1133b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 11344b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project private String getPresentationString(int presentation) { 11354b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project String name = getContext().getString(R.string.unknown); 11364b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project if (presentation == Connection.PRESENTATION_RESTRICTED) { 11374b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project name = getContext().getString(R.string.private_num); 11384b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project } else if (presentation == Connection.PRESENTATION_PAYPHONE) { 11394b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project name = getContext().getString(R.string.payphone); 11404b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project } 11414b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project return name; 11424b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project } 11434b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project 1144b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1145b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the name / photo / number / label fields 1146b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * for the special "conference call" state. 1147b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 1148b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * If the current call has only a single connection, use 1149b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * updateDisplayForPerson() instead. 1150b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1151872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan private void updateDisplayForConference(Call call) { 1152b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateDisplayForConference()..."); 1153b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1154872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan int phoneType = call.getPhone().getPhoneType(); 115579b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink if (phoneType == Phone.PHONE_TYPE_CDMA) { 11560fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // This state corresponds to both 3-Way merged call and 11570fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville // Call Waiting accepted call. 115829d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown // In this case we display the UI in a "generic" state, with 115929d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown // the generic "dialing" icon and no caller information, 116029d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown // because in this state in CDMA the user does not really know 116129d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown // which caller party he is talking to. 11620fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville showImage(mPhoto, R.drawable.picture_dialing); 11630fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville mName.setText(R.string.card_title_in_call); 1164872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan } else if ((phoneType == Phone.PHONE_TYPE_GSM) 1165872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan || (phoneType == Phone.PHONE_TYPE_SIP)) { 11666d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown if (mInCallScreen.isTouchUiEnabled()) { 11676d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown // Display the "manage conference" button in place of the photo. 11686d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown mManageConferencePhotoButton.setVisibility(View.VISIBLE); 11696d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown mPhoto.setVisibility(View.INVISIBLE); // Not GONE, since that would break 11706d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown // other views in our RelativeLayout. 11716d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown } else { 11726d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown // Display the "conference call" image in the photo slot, 11736d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown // with no other information. 11746d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown showImage(mPhoto, R.drawable.picture_conference); 11756d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown } 11760fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville mName.setText(R.string.card_title_conf_call); 117779b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink } else { 117879b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink throw new IllegalStateException("Unexpected phone type: " + phoneType); 11790fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } 1180b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1181b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mName.setVisibility(View.VISIBLE); 1182b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1183b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: For a conference call, the "phone number" slot is specced 1184b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // to contain a summary of who's on the call, like "Bill Foldes 1185b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // and Hazel Nutt" or "Bill Foldes and 2 others". 1186b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // But for now, just hide it: 1187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoneNumber.setVisibility(View.GONE); 1188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLabel.setVisibility(View.GONE); 1189b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 11909d14e16e8214b4a396dad293b6f0941608ee4798David Brown // Other text fields: 11919d14e16e8214b4a396dad293b6f0941608ee4798David Brown updateCallTypeLabel(call); 11929d14e16e8214b4a396dad293b6f0941608ee4798David Brown updateSocialStatus(null, null, null); // socialStatus is never visible in this state 119329d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown 119429d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown // TODO: for a GSM conference call, since we do actually know who 119529d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown // you're talking to, consider also showing names / numbers / 119629d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown // photos of some of the people on the conference here, so you can 119729d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown // see that info without having to click "Manage conference". We 119829d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown // probably have enough space to show info for 2 people, at least. 1199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 1200b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // To do this, our caller would pass us the activeConnections 1201b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // list, and we'd call PhoneUtils.getCallerInfo() separately for 1202b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // each connection. 1203b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1205b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the CallCard "photo" IFF the specified Call is in a state 1207b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * that needs a special photo (like "busy" or "dialing".) 1208b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 1209b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * If the current call does not require a special image in the "photo" 1210b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * slot onscreen, don't do anything, since presumably the photo image 1211b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * has already been set (to the photo of the person we're talking, or 1212b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * the generic "picture_unknown" image, or the "conference call" 1213b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * image.) 1214b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1215b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updatePhotoForCallState(Call call) { 1216b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updatePhotoForCallState(" + call + ")..."); 1217b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int photoImageResource = 0; 1218b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1219b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Check for the (relatively few) telephony states that need a 1220b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // special image in the "photo" slot. 1221b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 1222b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (state) { 1223b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DISCONNECTED: 1224b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Display the special "busy" photo for BUSY or CONGESTION. 1225b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Otherwise (presumably the normal "call ended" state) 1226b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // leave the photo alone. 1227b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Connection c = call.getEarliestConnection(); 1228b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if the connection is null, we assume the default case, 1229b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // otherwise update the image resource normally. 1230b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (c != null) { 1231b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Connection.DisconnectCause cause = c.getDisconnectCause(); 1232b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if ((cause == Connection.DisconnectCause.BUSY) 1233b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project || (cause == Connection.DisconnectCause.CONGESTION)) { 1234b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project photoImageResource = R.drawable.picture_busy; 1235b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1236b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (DBG) { 1237b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project log("updatePhotoForCallState: connection is null, ignoring."); 1238b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1239b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1240b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: add special images for any other DisconnectCauses? 1241b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 1242b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1243b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ALERTING: 124444e42e4eccd8ecdcdcca166c9f6f35a4d6c65591Nicolas Catania case DIALING: 1245b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project default: 1246b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Leave the photo alone in all other states. 1247b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // If this call is an individual call, and the image is currently 1248b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // displaying a state, (rather than a photo), we'll need to update 1249b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the image. 1250b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // This is for the case where we've been displaying the state and 1251b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // now we need to restore the photo. This can happen because we 1252b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // only query the CallerInfo once, and limit the number of times 1253b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the image is loaded. (So a state image may overwrite the photo 1254b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // and we would otherwise have no way of displaying the photo when 1255b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the state goes away.) 1256b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1257b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if the photoResource field is filled-in in the Connection's 1258b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // caller info, then we can just use that instead of requesting 1259b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // for a photo load. 1260b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1261b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // look for the photoResource if it is available. 1262b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project CallerInfo ci = null; 1263b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project { 12640fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville Connection conn = null; 1265872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan int phoneType = call.getPhone().getPhoneType(); 126679b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink if (phoneType == Phone.PHONE_TYPE_CDMA) { 12670fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville conn = call.getLatestConnection(); 1268872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan } else if ((phoneType == Phone.PHONE_TYPE_GSM) 1269872a3a7af50ce6a4efb180336614bddefe102ac5Hung-ying Tyan || (phoneType == Phone.PHONE_TYPE_SIP)) { 12700fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville conn = call.getEarliestConnection(); 127179b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink } else { 127279b9f6e30e8402b103f1ec3ed9dda1fcad2b1cd5Tammo Spalink throw new IllegalStateException("Unexpected phone type: " + phoneType); 12730fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville } 12740fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville 1275b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (conn != null) { 1276b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Object o = conn.getUserData(); 1277b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (o instanceof CallerInfo) { 1278b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ci = (CallerInfo) o; 1279b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (o instanceof PhoneUtils.CallerInfoToken) { 1280b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ci = ((PhoneUtils.CallerInfoToken) o).currentInfo; 1281b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1282b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1283b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1284b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1285b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (ci != null) { 1286b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project photoImageResource = ci.photoResource; 1287b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1288b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1289b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // If no photoResource found, check to see if this is a conference call. If 1290b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // it is not a conference call: 1291b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 1. Try to show the cached image 1292b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 2. If the image is not cached, check to see if a load request has been 1293b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // made already. 1294b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 3. If the load request has not been made [DISPLAY_DEFAULT], start the 1295b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // request and note that it has started by updating photo state with 1296b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // [DISPLAY_IMAGE]. 1297b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Load requests started in (3) use a placeholder image of -1 to hide the 1298b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // image by default. Please refer to CallerInfoAsyncQuery.java for cases 1299b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // where CallerInfo.photoResource may be set. 1300b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (photoImageResource == 0) { 1301b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (!PhoneUtils.isConferenceCall(call)) { 1302b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (!showCachedImage(mPhoto, ci) && (mPhotoTracker.getPhotoState() == 1303b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ContactsAsyncHelper.ImageTracker.DISPLAY_DEFAULT)) { 1304b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ContactsAsyncHelper.updateImageViewWithContactPhotoAsync(ci, 1305b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project getContext(), mPhoto, mPhotoTracker.getPhotoUri(), -1); 1306b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker.setPhotoState( 1307b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ContactsAsyncHelper.ImageTracker.DISPLAY_IMAGE); 1308b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1309b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1310b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 1311b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(mPhoto, photoImageResource); 1312b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker.setPhotoState(ContactsAsyncHelper.ImageTracker.DISPLAY_IMAGE); 1313b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return; 1314b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1315b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 1316b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1317b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1318b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (photoImageResource != 0) { 1319b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("- overrriding photo image: " + photoImageResource); 1320b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(mPhoto, photoImageResource); 1321b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Track the image state. 1322b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker.setPhotoState(ContactsAsyncHelper.ImageTracker.DISPLAY_DEFAULT); 1323b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1324b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1325b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1326b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1327b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Try to display the cached image from the callerinfo object. 1328b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 1329b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * @return true if we were able to find the image in the cache, false otherwise. 1330b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 13310d315275d08cd33f801ae3a74e8fc265520f6246David Brown private static final boolean showCachedImage(ImageView view, CallerInfo ci) { 1332b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if ((ci != null) && ci.isCachedPhotoCurrent) { 1333b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (ci.cachedPhoto != null) { 1334b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(view, ci.cachedPhoto); 1335b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 1336b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(view, R.drawable.picture_unknown); 1337b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1338b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return true; 1339b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1340b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return false; 1341b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1342b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1343b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** Helper function to display the resource in the imageview AND ensure its visibility.*/ 1344b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final void showImage(ImageView view, int resource) { 1345b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project view.setImageResource(resource); 1346b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project view.setVisibility(View.VISIBLE); 1347b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1348b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1349b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** Helper function to display the drawable in the imageview AND ensure its visibility.*/ 1350b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final void showImage(ImageView view, Drawable drawable) { 1351b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project view.setImageDrawable(drawable); 1352b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project view.setVisibility(View.VISIBLE); 1353b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1354b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1355b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1356b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Returns the "Menu button hint" TextView (which is manipulated 1357b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * directly by the InCallScreen.) 1358b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * @see InCallScreen.updateMenuButtonHint() 1359b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1360b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /* package */ TextView getMenuButtonHint() { 1361b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return mMenuButtonHint; 1362b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1363b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1364b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1365b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Sets the left and right margins of the specified ViewGroup (whose 1366b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * LayoutParams object which must inherit from 1367b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * ViewGroup.MarginLayoutParams.) 1368b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 1369b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * TODO: Is there already a convenience method like this somewhere? 1370b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1371b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void setSideMargins(ViewGroup vg, int margin) { 1372b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ViewGroup.MarginLayoutParams lp = 1373b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project (ViewGroup.MarginLayoutParams) vg.getLayoutParams(); 1374b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Equivalent to setting android:layout_marginLeft/Right in XML 1375b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project lp.leftMargin = margin; 1376b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project lp.rightMargin = margin; 1377b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project vg.setLayoutParams(lp); 1378b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1379b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 13808bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project /** 13818bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * Sets the CallCard "upper title". Also, depending on the passed-in 13828bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * Call state, possibly display an icon along with the title. 13838bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project */ 138434a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown private void setUpperTitle(String title, int color, Call.State state) { 13858bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mUpperTitle.setText(title); 138634a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown mUpperTitle.setTextColor(color); 13878bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 13888bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project int bluetoothIconId = 0; 138934a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown if (!TextUtils.isEmpty(title) 139034a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown && ((state == Call.State.INCOMING) || (state == Call.State.WAITING)) 13910fb2b4b8eff811fd3243aefdf536e7ba2b10f4e9Wink Saville && mApplication.showBluetoothIndication()) { 13928bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // Display the special bluetooth icon also, if this is an incoming 13938bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // call and the audio will be routed to bluetooth. 13948bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project bluetoothIconId = R.drawable.ic_incoming_call_bluetooth; 13958bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } 13968bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 13978bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mUpperTitle.setCompoundDrawablesWithIntrinsicBounds(bluetoothIconId, 0, 0, 0); 139829d71cebdbcfe433f851899b91a650ad9352c15fDavid Brown if (bluetoothIconId != 0) mUpperTitle.setCompoundDrawablePadding((int) (mDensity * 5)); 13998bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } 14008bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 1401af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville /** 140234a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown * Clears the CallCard "upper title", for states (like a normal 140334a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown * ongoing call) where we don't use any "title" at all. 140434a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown */ 140534a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown private void clearUpperTitle() { 140634a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown setUpperTitle("", 0, Call.State.IDLE); // Use dummy values for "color" and "state" 140734a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown } 140834a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown 140934a38b7ed4a63f8e6264030735911fdeadb21e5cDavid Brown /** 14109d14e16e8214b4a396dad293b6f0941608ee4798David Brown * Updates the "Call type" label, based on the current foreground call. 14119d14e16e8214b4a396dad293b6f0941608ee4798David Brown * This is a special label and/or branding we display for certain 14129d14e16e8214b4a396dad293b6f0941608ee4798David Brown * kinds of calls. 14139d14e16e8214b4a396dad293b6f0941608ee4798David Brown * 14149d14e16e8214b4a396dad293b6f0941608ee4798David Brown * (So far, this is used only for SIP calls, which get an 14159d14e16e8214b4a396dad293b6f0941608ee4798David Brown * "Internet call" label. TODO: But eventually, the telephony 14169d14e16e8214b4a396dad293b6f0941608ee4798David Brown * layer might allow each pluggable "provider" to specify a string 14179d14e16e8214b4a396dad293b6f0941608ee4798David Brown * and/or icon to be displayed here.) 14189d14e16e8214b4a396dad293b6f0941608ee4798David Brown */ 14199d14e16e8214b4a396dad293b6f0941608ee4798David Brown private void updateCallTypeLabel(Call call) { 14209d14e16e8214b4a396dad293b6f0941608ee4798David Brown int phoneType = (call != null) ? call.getPhone().getPhoneType() : Phone.PHONE_TYPE_NONE; 14219d14e16e8214b4a396dad293b6f0941608ee4798David Brown if (phoneType == Phone.PHONE_TYPE_SIP) { 14229d14e16e8214b4a396dad293b6f0941608ee4798David Brown mCallTypeLabel.setVisibility(View.VISIBLE); 14239d14e16e8214b4a396dad293b6f0941608ee4798David Brown mCallTypeLabel.setText(R.string.incall_call_type_label_sip); 14249d14e16e8214b4a396dad293b6f0941608ee4798David Brown mCallTypeLabel.setTextColor(mTextColorCallTypeSip); 14259d14e16e8214b4a396dad293b6f0941608ee4798David Brown // If desired, we could also display a "badge" next to the label, as follows: 14269d14e16e8214b4a396dad293b6f0941608ee4798David Brown // mCallTypeLabel.setCompoundDrawablesWithIntrinsicBounds( 14279d14e16e8214b4a396dad293b6f0941608ee4798David Brown // callTypeSpecificBadge, null, null, null); 14289d14e16e8214b4a396dad293b6f0941608ee4798David Brown // mCallTypeLabel.setCompoundDrawablePadding((int) (mDensity * 6)); 14299d14e16e8214b4a396dad293b6f0941608ee4798David Brown } else { 14309d14e16e8214b4a396dad293b6f0941608ee4798David Brown mCallTypeLabel.setVisibility(View.GONE); 14319d14e16e8214b4a396dad293b6f0941608ee4798David Brown } 14329d14e16e8214b4a396dad293b6f0941608ee4798David Brown } 14339d14e16e8214b4a396dad293b6f0941608ee4798David Brown 14349d14e16e8214b4a396dad293b6f0941608ee4798David Brown /** 14359d14e16e8214b4a396dad293b6f0941608ee4798David Brown * Updates the "social status" label with the specified text and 14369d14e16e8214b4a396dad293b6f0941608ee4798David Brown * (optional) badge. 14379d14e16e8214b4a396dad293b6f0941608ee4798David Brown */ 14389d14e16e8214b4a396dad293b6f0941608ee4798David Brown private void updateSocialStatus(String socialStatusText, 14399d14e16e8214b4a396dad293b6f0941608ee4798David Brown Drawable socialStatusBadge, 14409d14e16e8214b4a396dad293b6f0941608ee4798David Brown Call call) { 14419d14e16e8214b4a396dad293b6f0941608ee4798David Brown // The socialStatus field is *only* visible while an incoming call 14429d14e16e8214b4a396dad293b6f0941608ee4798David Brown // is ringing, never in any other call state. 14439d14e16e8214b4a396dad293b6f0941608ee4798David Brown if ((socialStatusText != null) 14449d14e16e8214b4a396dad293b6f0941608ee4798David Brown && (call != null) 14459d14e16e8214b4a396dad293b6f0941608ee4798David Brown && call.isRinging() 14469d14e16e8214b4a396dad293b6f0941608ee4798David Brown && !call.isGeneric()) { 14479d14e16e8214b4a396dad293b6f0941608ee4798David Brown mSocialStatus.setVisibility(View.VISIBLE); 14489d14e16e8214b4a396dad293b6f0941608ee4798David Brown mSocialStatus.setText(socialStatusText); 14499d14e16e8214b4a396dad293b6f0941608ee4798David Brown mSocialStatus.setCompoundDrawablesWithIntrinsicBounds( 14509d14e16e8214b4a396dad293b6f0941608ee4798David Brown socialStatusBadge, null, null, null); 14519d14e16e8214b4a396dad293b6f0941608ee4798David Brown mSocialStatus.setCompoundDrawablePadding((int) (mDensity * 6)); 14529d14e16e8214b4a396dad293b6f0941608ee4798David Brown } else { 14539d14e16e8214b4a396dad293b6f0941608ee4798David Brown mSocialStatus.setVisibility(View.GONE); 14549d14e16e8214b4a396dad293b6f0941608ee4798David Brown } 14559d14e16e8214b4a396dad293b6f0941608ee4798David Brown } 14569d14e16e8214b4a396dad293b6f0941608ee4798David Brown 14579d14e16e8214b4a396dad293b6f0941608ee4798David Brown /** 1458af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * Hides the top-level UI elements of the call card: The "main 1459af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * call card" element representing the current active or ringing call, 1460af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * and also the info areas for "ongoing" or "on hold" calls in some 1461af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * states. 1462af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * 1463af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * This is intended to be used in special states where the normal 1464af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * in-call UI is totally replaced by some other UI, like OTA mode on a 1465af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * CDMA device. 1466af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * 1467af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * To bring back the regular CallCard UI, just re-run the normal 1468af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville * updateState() call sequence. 1469af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville */ 1470af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville public void hideCallCardElements() { 14710d315275d08cd33f801ae3a74e8fc265520f6246David Brown mPrimaryCallInfo.setVisibility(View.GONE); 14720d315275d08cd33f801ae3a74e8fc265520f6246David Brown mSecondaryCallInfo.setVisibility(View.GONE); 1473af684393e2c6d0c051b9d5a189c2cd1de2506831Wink Saville } 1474b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 14759688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown /* 14769688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown * Updates the hint (like "Rotate to answer") that we display while 14779688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown * the user is dragging the incoming call RotarySelector widget. 14789688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown */ 14799688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown /* package */ void setRotarySelectorHint(int hintTextResId, int hintColorResId) { 14809688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown mRotarySelectorHintTextResId = hintTextResId; 14819688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown mRotarySelectorHintColorResId = hintColorResId; 14829688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown } 14839688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown 14846d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown // View.OnClickListener implementation 14856d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown public void onClick(View view) { 14866d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown int id = view.getId(); 14876d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown if (DBG) log("onClick(View " + view + ", id " + id + ")..."); 14886d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown 14896d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown switch (id) { 14906d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown case R.id.manageConferencePhotoButton: 14916d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown // A click on anything here gets forwarded 14926d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown // straight to the InCallScreen. 14936d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown mInCallScreen.handleOnscreenButtonClick(id); 14946d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown break; 14956d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown 14966d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown default: 14976d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown Log.w(LOG_TAG, "onClick: unexpected click: View " + view + ", id " + id); 14986d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown break; 14996d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown } 15006d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown } 15016d5544932495d81ff7ce53f4678c4beb25acc1b0David Brown 1502dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown // Accessibility event support. 1503dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown // Since none of the CallCard elements are focusable, we need to manually 1504dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown // fill in the AccessibilityEvent here (so that the name / number / etc will 1505dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown // get pronounced by a screen reader, for example.) 1506dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown @Override 1507dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 1508dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown dispatchPopulateAccessibilityEvent(event, mUpperTitle); 1509dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown dispatchPopulateAccessibilityEvent(event, mPhoto); 1510dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown dispatchPopulateAccessibilityEvent(event, mManageConferencePhotoButton); 1511dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown dispatchPopulateAccessibilityEvent(event, mName); 1512dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown dispatchPopulateAccessibilityEvent(event, mPhoneNumber); 1513dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown dispatchPopulateAccessibilityEvent(event, mLabel); 1514dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown dispatchPopulateAccessibilityEvent(event, mSocialStatus); 1515dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown dispatchPopulateAccessibilityEvent(event, mSecondaryCallName); 1516dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown dispatchPopulateAccessibilityEvent(event, mSecondaryCallStatus); 1517dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown dispatchPopulateAccessibilityEvent(event, mSecondaryCallPhoto); 1518dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown return true; 1519dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown } 1520dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown 1521dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown private void dispatchPopulateAccessibilityEvent(AccessibilityEvent event, View view) { 1522dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown List<CharSequence> eventText = event.getText(); 1523dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown int size = eventText.size(); 1524dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown view.dispatchPopulateAccessibilityEvent(event); 1525dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown // if no text added write null to keep relative position 1526dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown if (size == eventText.size()) { 1527dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown eventText.add(null); 1528dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown } 1529dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown } 1530dc66301e77d854b6cef2101bf7029c9bbb816f3eDavid Brown 15319688349b8750a9ac7282d83993e0112c5f51e7acDavid Brown 1532b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Debugging / testing code 1533b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1534b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void log(String msg) { 1535796c70c99bc39295bf685061056f06ab8949c742David Brown Log.d(LOG_TAG, msg); 1536b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1537b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project} 1538