CallCard.java revision 796c70c99bc39295bf685061056f06ab8949c742
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 com.android.internal.telephony.Call; 20b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport com.android.internal.telephony.CallerInfo; 21b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport com.android.internal.telephony.CallerInfoAsyncQuery; 22b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport com.android.internal.telephony.Connection; 23b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport com.android.internal.telephony.Phone; 24b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 25b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.ContentUris; 26b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.Context; 27b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.graphics.drawable.Drawable; 28b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.net.Uri; 29b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.pim.ContactsAsyncHelper; 30b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.provider.Contacts.People; 31b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.text.TextUtils; 32b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.text.format.DateUtils; 33b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.AttributeSet; 34b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.Log; 35b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.LayoutInflater; 36b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.MotionEvent; 37b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.View; 38b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.ViewGroup; 39b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.FrameLayout; 40b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.ImageView; 41b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.TextView; 42b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 43b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/** 44b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * "Call card" UI element: the in-call screen contains a tiled layout of call 45b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * cards, each representing the state of a current "call" (ie. an active call, 46b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * a call on hold, or an incoming call.) 47b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 48b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpublic class CallCard extends FrameLayout 49b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project implements CallTime.OnTickListener, CallerInfoAsyncQuery.OnQueryCompleteListener, 50b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ContactsAsyncHelper.OnImageLoadCompleteListener{ 51796c70c99bc39295bf685061056f06ab8949c742David Brown private static final String LOG_TAG = "CallCard"; 52796c70c99bc39295bf685061056f06ab8949c742David Brown private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2); 53b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 548bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project /** 558bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * Reference to the InCallScreen activity that owns us. This may be 568bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * null if we haven't been initialized yet *or* after the InCallScreen 578bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * activity has been destroyed. 588bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project */ 598bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project private InCallScreen mInCallScreen; 608bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 61b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Top-level subviews of the CallCard 62b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private ViewGroup mMainCallCard; 63b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private ViewGroup mOtherCallOngoingInfoArea; 64b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private ViewGroup mOtherCallOnHoldInfoArea; 65b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 66b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "Upper" and "lower" title widgets 67b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mUpperTitle; 68b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private ViewGroup mLowerTitleViewGroup; 69b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mLowerTitle; 70b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private ImageView mLowerTitleIcon; 71b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mElapsedTime; 72b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 73b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Text colors, used with the lower title and "other call" info areas 74b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private int mTextColorConnected; 758bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project private int mTextColorConnectedBluetooth; 76b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private int mTextColorEnded; 77b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private int mTextColorOnHold; 78b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 79b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private ImageView mPhoto; 80b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mName; 81b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mPhoneNumber; 82b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mLabel; 83b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 84b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "Other call" info area 858bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project private ImageView mOtherCallOngoingIcon; 86b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mOtherCallOngoingName; 87b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mOtherCallOngoingStatus; 88b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mOtherCallOnHoldName; 89b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mOtherCallOnHoldStatus; 90b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 91b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Menu button hint 92b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private TextView mMenuButtonHint; 93b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 94b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private boolean mRingerSilenced; 95b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 96b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private CallTime mCallTime; 97b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 98b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Track the state for the photo. 99b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private ContactsAsyncHelper.ImageTracker mPhotoTracker; 100b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 101b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // A few hardwired constants used in our screen layout. 102b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: These should all really come from resources, but that's 103b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // nontrivial; see the javadoc for the ConfigurationHelper class. 104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // For now, let's at least keep them all here in one place 105b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // rather than sprinkled througout this file. 106b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 107b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project static final int MAIN_CALLCARD_MIN_HEIGHT_LANDSCAPE = 200; 108b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project static final int CALLCARD_SIDE_MARGIN_LANDSCAPE = 50; 109b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project static final float TITLE_TEXT_SIZE_LANDSCAPE = 22F; // scaled pixels 110b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 111b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public CallCard(Context context, AttributeSet attrs) { 112b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super(context, attrs); 113b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 114b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("CallCard constructor..."); 115b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("- this = " + this); 116b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("- context " + context + ", attrs " + attrs); 117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 118b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Inflate the contents of this CallCard, and add it (to ourself) as a child. 119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project LayoutInflater inflater = LayoutInflater.from(context); 120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project inflater.inflate( 121b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project R.layout.call_card, // resource 122b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project this, // root 123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project true); 124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 125b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime = new CallTime(this); 126b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // create a new object to track the state for the photo. 128b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker = new ContactsAsyncHelper.ImageTracker(); 129b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 130b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1318bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project void setInCallScreenInstance(InCallScreen inCallScreen) { 1328bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mInCallScreen = inCallScreen; 1338bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } 1348bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 135b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project void reset() { 136b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("reset()..."); 137b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 138b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mRingerSilenced = false; 139b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 140b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // default to show ACTIVE call style, with empty title and status text 141b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showCallConnected(); 1428bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project setUpperTitle(""); 143b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 144b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 145b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public void onTickForCallTimeElapsed(long timeElapsed) { 146b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // While a call is in progress, update the elapsed time shown 147b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // onscreen. 148b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updateElapsedTimeWidget(timeElapsed); 149b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 150b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 151b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /* package */ 152b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project void stopTimer() { 153b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.cancelTimer(); 154b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 155b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 157b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project protected void onFinishInflate() { 158b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super.onFinishInflate(); 159b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 160b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("CallCard onFinishInflate(this = " + this + ")..."); 161b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 162b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project LayoutInflater inflater = LayoutInflater.from(getContext()); 163b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 164b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mMainCallCard = (ViewGroup) findViewById(R.id.mainCallCard); 165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOngoingInfoArea = (ViewGroup) findViewById(R.id.otherCallOngoingInfoArea); 166b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOnHoldInfoArea = (ViewGroup) findViewById(R.id.otherCallOnHoldInfoArea); 167b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 168b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "Upper" and "lower" title widgets 169b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mUpperTitle = (TextView) findViewById(R.id.upperTitle); 170b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLowerTitleViewGroup = (ViewGroup) findViewById(R.id.lowerTitleViewGroup); 171b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLowerTitle = (TextView) findViewById(R.id.lowerTitle); 172b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLowerTitleIcon = (ImageView) findViewById(R.id.lowerTitleIcon); 173b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mElapsedTime = (TextView) findViewById(R.id.elapsedTime); 174b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 175b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Text colors 176b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mTextColorConnected = getResources().getColor(R.color.incall_textConnected); 1778bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mTextColorConnectedBluetooth = 1788bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project getResources().getColor(R.color.incall_textConnectedBluetooth); 179b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mTextColorEnded = getResources().getColor(R.color.incall_textEnded); 180b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mTextColorOnHold = getResources().getColor(R.color.incall_textOnHold); 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); 184b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mName = (TextView) findViewById(R.id.name); 185b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoneNumber = (TextView) findViewById(R.id.phoneNumber); 186b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLabel = (TextView) findViewById(R.id.label); 187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "Other call" info area 1898bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mOtherCallOngoingIcon = (ImageView) findViewById(R.id.otherCallOngoingIcon); 190b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOngoingName = (TextView) findViewById(R.id.otherCallOngoingName); 191b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOngoingStatus = (TextView) findViewById(R.id.otherCallOngoingStatus); 192b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOnHoldName = (TextView) findViewById(R.id.otherCallOnHoldName); 193b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOnHoldStatus = (TextView) findViewById(R.id.otherCallOnHoldStatus); 194b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 195b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Menu Button hint 196b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mMenuButtonHint = (TextView) findViewById(R.id.menuButtonHint); 197b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 198b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project void updateState(Phone phone) { 200b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateState(" + phone + ")..."); 201b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 202b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Update some internal state based on the current state of the phone. 203b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: This code, and updateForegroundCall() / updateRingingCall(), 204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // can probably still be simplified some more. 205b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Phone.State state = phone.getState(); // IDLE, RINGING, or OFFHOOK 207b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (state == Phone.State.RINGING) { 208b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // A phone call is ringing *or* call waiting 209b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // (ie. another call may also be active as well.) 210b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updateRingingCall(phone); 211b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (state == Phone.State.OFFHOOK) { 212b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // The phone is off hook. At least one call exists that is 213b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // dialing, active, or holding, and no calls are ringing or waiting. 214b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updateForegroundCall(phone); 215b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 216b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // The phone state is IDLE! 217b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 218b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // The most common reason for this is if a call just 219b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // ended: the phone will be idle, but we *will* still 220b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // have a call in the DISCONNECTED state: 221b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call fgCall = phone.getForegroundCall(); 222b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call bgCall = phone.getBackgroundCall(); 223b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if ((fgCall.getState() == Call.State.DISCONNECTED) 224b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project || (bgCall.getState() == Call.State.DISCONNECTED)) { 225b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // In this case, we want the main CallCard to display 226b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the "Call ended" state. The normal "foreground call" 227b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // code path handles that. 228b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updateForegroundCall(phone); 229b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 230b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // We don't have any DISCONNECTED calls, which means 231b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // that the phone is *truly* idle. 232b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 233b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // It's very rare to be on the InCallScreen at all in this 234b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // state, but it can happen in some cases: 235b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // - A stray onPhoneStateChanged() event came in to the 236b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // InCallScreen *after* it was dismissed. 237b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // - We're allowed to be on the InCallScreen because 238b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // an MMI or USSD is running, but there's no actual "call" 239b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // to display. 240b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // - We're displaying an error dialog to the user 241b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // (explaining why the call failed), so we need to stay on 242b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the InCallScreen so that the dialog will be visible. 243b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 244b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // In these cases, put the callcard into a sane but "blank" state: 245b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updateNoCall(phone); 246b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 247b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 248b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 249b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 250b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 251b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the UI for the state where the phone is in use, but not ringing. 252b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 253b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updateForegroundCall(Phone phone) { 254b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateForegroundCall()..."); 255b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 256b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call fgCall = phone.getForegroundCall(); 257b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call bgCall = phone.getBackgroundCall(); 258b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 259b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (fgCall.isIdle() && !fgCall.hasConnections()) { 260b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateForegroundCall: no active call, show holding call"); 261b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: make sure this case agrees with the latest UI spec. 262b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 263b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Display the background call in the main info area of the 264b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // CallCard, since there is no foreground call. Note that 265b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // displayMainCallStatus() will notice if the call we passed in is on 266b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // hold, and display the "on hold" indication. 267b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project fgCall = bgCall; 268b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 269b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // And be sure to not display anything in the "on hold" box. 270b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project bgCall = null; 271b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 272b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 273b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayMainCallStatus(phone, fgCall); 274b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayOnHoldCallStatus(phone, bgCall); 275b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayOngoingCallStatus(phone, null); 276b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 277b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 278b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 279b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the UI for the state where an incoming call is ringing (or 280b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * call waiting), regardless of whether the phone's already offhook. 281b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 282b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updateRingingCall(Phone phone) { 283b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateRingingCall()..."); 284b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 285b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call ringingCall = phone.getRingingCall(); 286b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call fgCall = phone.getForegroundCall(); 287b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call bgCall = phone.getBackgroundCall(); 288b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 289b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayMainCallStatus(phone, ringingCall); 290b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayOnHoldCallStatus(phone, bgCall); 291b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayOngoingCallStatus(phone, fgCall); 292b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 293b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 294b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 295b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the UI for the state where the phone is not in use. 296b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 297b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * This is analogous to updateForegroundCall() and updateRingingCall(), 298b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 299b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * but for the (uncommon) case where the phone is 300b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * totally idle. (See comments in updateState() above.) 301b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 302b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * This puts the callcard into a sane but "blank" state. 303b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 304b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updateNoCall(Phone phone) { 305b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateNoCall()..."); 306b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 307b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayMainCallStatus(phone, null); 308b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayOnHoldCallStatus(phone, null); 309b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayOngoingCallStatus(phone, null); 310b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 311b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 312b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 313b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the main block of caller info on the CallCard 314b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * (ie. the stuff in the mainCallCard block) based on the specified Call. 315b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 316b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void displayMainCallStatus(Phone phone, Call call) { 317b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("displayMainCallStatus(phone " + phone 318b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project + ", call " + call + ")..."); 319b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 320b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (call == null) { 321b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // There's no call to display, presumably because the phone is idle. 322b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mMainCallCard.setVisibility(View.GONE); 323b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return; 324b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 325b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mMainCallCard.setVisibility(View.VISIBLE); 326b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 327b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 328b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log(" - call.state: " + call.getState()); 329b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 330b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int callCardBackgroundResid = 0; 331b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 3328bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // Background frame resources are different between portrait/landscape. 3338bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // TODO: Don't do this manually. Instead let the resource system do 3348bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // it: just move the *_land assets over to the res/drawable-land 3358bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // directory (but with the same filename as the corresponding 3368bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // portrait asset.) 337b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project boolean landscapeMode = InCallScreen.ConfigurationHelper.isLandscape(); 338b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 3398bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // Background images are also different if Bluetooth is active. 3408bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project final boolean bluetoothActive = PhoneApp.getInstance().showBluetoothIndication(); 3418bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 342b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (state) { 343b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ACTIVE: 344b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showCallConnected(); 345b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 3468bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project if (bluetoothActive) { 3478bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project callCardBackgroundResid = 3488bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project landscapeMode ? R.drawable.incall_frame_bluetooth_tall_land 3498bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project : R.drawable.incall_frame_bluetooth_tall_port; 3508bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } else { 3518bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project callCardBackgroundResid = 3528bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project landscapeMode ? R.drawable.incall_frame_connected_tall_land 3538bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project : R.drawable.incall_frame_connected_tall_port; 3548bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } 3558bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 356b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 357b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // update timer field 358b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("displayMainCallStatus: start periodicUpdateTimer"); 359b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.setActiveCallMode(call); 360b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.reset(); 361b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.periodicUpdateTimer(); 362b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 363b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 364b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 365b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case HOLDING: 366b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showCallOnhold(); 367b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 368b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project callCardBackgroundResid = 369b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project landscapeMode ? R.drawable.incall_frame_hold_tall_land 370b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project : R.drawable.incall_frame_hold_tall_port; 371b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 372b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // update timer field 373b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.cancelTimer(); 374b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 375b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 376b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 377b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DISCONNECTED: 378b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project reset(); 379b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showCallEnded(); 380b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 381b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project callCardBackgroundResid = 382b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project landscapeMode ? R.drawable.incall_frame_ended_tall_land 383b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project : R.drawable.incall_frame_ended_tall_port; 384b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 385b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Stop getting timer ticks from this call 386b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.cancelTimer(); 387b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 388b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 389b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 390b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DIALING: 391b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ALERTING: 392b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showCallConnecting(); 393b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 3948bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project if (bluetoothActive) { 3958bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project callCardBackgroundResid = 3968bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project landscapeMode ? R.drawable.incall_frame_bluetooth_tall_land 3978bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project : R.drawable.incall_frame_bluetooth_tall_port; 3988bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } else { 3998bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project callCardBackgroundResid = 4008bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project landscapeMode ? R.drawable.incall_frame_normal_tall_land 4018bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project : R.drawable.incall_frame_normal_tall_port; 4028bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } 403b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 404b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Stop getting timer ticks from a previous call 405b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.cancelTimer(); 406b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 407b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 408b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 409b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case INCOMING: 410b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case WAITING: 411b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showCallIncoming(); 412b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 4138bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project if (bluetoothActive) { 4148bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project callCardBackgroundResid = 4158bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project landscapeMode ? R.drawable.incall_frame_bluetooth_tall_land 4168bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project : R.drawable.incall_frame_bluetooth_tall_port; 4178bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } else { 4188bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project callCardBackgroundResid = 4198bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project landscapeMode ? R.drawable.incall_frame_normal_tall_land 4208bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project : R.drawable.incall_frame_normal_tall_port; 4218bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } 422b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 423b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Stop getting timer ticks from a previous call 424b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mCallTime.cancelTimer(); 425b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 426b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 427b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 428b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case IDLE: 429b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // The "main CallCard" should never be trying to display 430b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // an idle call! In updateState(), if the phone is idle, 431b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // we call updateNoCall(), which means that we shouldn't 432b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // have passed a call into this method at all. 433b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Log.w(LOG_TAG, "displayMainCallStatus: IDLE call in the main call card!"); 434b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 435b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // (It is possible, though, that we had a valid call which 436b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // became idle *after* the check in updateState() but 437b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // before we get here... So continue the best we can, 438b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // with whatever (stale) info we can get from the 439b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // passed-in Call object.) 440b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 441b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 442b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 443b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project default: 444b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Log.w(LOG_TAG, "displayMainCallStatus: unexpected call state: " + state); 445b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 446b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 447b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 448b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updateCardTitleWidgets(phone, call); 449b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 450b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (PhoneUtils.isConferenceCall(call)) { 451b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Update onscreen info for a conference call. 452b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updateDisplayForConference(); 453b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 454b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Update onscreen info for a regular call (which presumably 455b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // has only one connection.) 456b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Connection conn = call.getEarliestConnection(); 457b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 4584b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project int presentation = conn.getNumberPresentation(); 459b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 460b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (conn == null) { 461b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("displayMainCallStatus: connection is null, using default values."); 462b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if the connection is null, we run through the behaviour 463b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // we had in the past, which breaks down into trivial steps 464b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // with the current implementation of getCallerInfo and 465b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // updateDisplayForPerson. 466b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project CallerInfo info = PhoneUtils.getCallerInfo(getContext(), conn); 4674b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project updateDisplayForPerson(info, presentation, false, call); 468b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 469b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log(" - CONN: " + conn + ", state = " + conn.getState()); 470b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 471b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // make sure that we only make a new query when the current 472b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // callerinfo differs from what we've been requested to display. 473b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project boolean runQuery = true; 474b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Object o = conn.getUserData(); 475b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (o instanceof PhoneUtils.CallerInfoToken) { 476b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project runQuery = mPhotoTracker.isDifferentImageRequest( 477b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ((PhoneUtils.CallerInfoToken) o).currentInfo); 478b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 479b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project runQuery = mPhotoTracker.isDifferentImageRequest(conn); 480b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 481b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 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; 494b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log(" ==> Got CallerInfo; updating display: ci = " + ci); 4954b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project updateDisplayForPerson(ci, presentation, false, call); 496b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (o instanceof PhoneUtils.CallerInfoToken){ 497b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project CallerInfo ci = ((PhoneUtils.CallerInfoToken) o).currentInfo; 498b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log(" ==> Got CallerInfoToken; updating display: ci = " + ci); 4994b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project updateDisplayForPerson(ci, presentation, true, call); 500b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 501b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Log.w(LOG_TAG, "displayMainCallStatus: runQuery was false, " 502b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project + "but we didn't have a cached CallerInfo object! o = " + o); 503b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: any easy way to recover here (given that 504b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the CallCard is probably displaying stale info 505b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // right now?) Maybe force the CallCard into the 506b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "Unknown" state? 507b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 508b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 509b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 510b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 511b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 512b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // In some states we override the "photo" ImageView to be an 513b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // indication of the current state, rather than displaying the 514b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // regular photo as set above. 515b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updatePhotoForCallState(call); 516b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 517b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Set the background frame color based on the state of the call. 518b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project setMainCallCardBackgroundResource(callCardBackgroundResid); 519b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // (Text colors are set in updateCardTitleWidgets().) 520b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 521b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 522b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 523b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Implemented for CallerInfoAsyncQuery.OnQueryCompleteListener interface. 524b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * refreshes the CallCard data when it called. 525b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 526b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public void onQueryComplete(int token, Object cookie, CallerInfo ci) { 527b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("onQueryComplete: token " + token + ", cookie " + cookie + ", ci " + ci); 528b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 529b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (cookie instanceof Call) { 530b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // grab the call object and update the display for an individual call, 531b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // as well as the successive call to update image via call state. 532b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // If the object is a textview instead, we update it as we need to. 533b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("callerinfo query complete, updating ui from displayMainCallStatus()"); 534b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call call = (Call) cookie; 5354b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project updateDisplayForPerson(ci, Connection.PRESENTATION_ALLOWED, false, call); 536b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updatePhotoForCallState(call); 537b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 538b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (cookie instanceof TextView){ 539b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("callerinfo query complete, updating ui from ongoing or onhold"); 540b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ((TextView) cookie).setText(PhoneUtils.getCompactNameFromCallerInfo(ci, mContext)); 541b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 542b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 543b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 544b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 545b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Implemented for ContactsAsyncHelper.OnImageLoadCompleteListener interface. 546b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * make sure that the call state is reflected after the image is loaded. 547b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 548b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public void onImageLoadComplete(int token, Object cookie, ImageView iView, 549b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project boolean imagePresent){ 550b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (cookie != null) { 551b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updatePhotoForCallState((Call) cookie); 552b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 553b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 554b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 555b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 556b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the "upper" and "lower" titles based on the current state of this call. 557b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 558b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updateCardTitleWidgets(Phone phone, Call call) { 559b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateCardTitleWidgets(call " + call + ")..."); 560b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 561b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 562b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: Still need clearer spec on exactly how title *and* status get 563b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // set in all states. (Then, given that info, refactor the code 564b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // here to be more clear about exactly which widgets on the card 565b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // need to be set.) 566b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 567b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Normal "foreground" call card: 568b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String cardTitle = getTitleForCallCard(call); 569b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 570b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateCardTitleWidgets: " + cardTitle); 571b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 572b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // We display *either* the "upper title" or the "lower title", but 573b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // never both. 574b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (state == Call.State.ACTIVE) { 575b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Use the "lower title" (in green). 576b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLowerTitleViewGroup.setVisibility(View.VISIBLE); 5778bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 5788bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project final boolean bluetoothActive = PhoneApp.getInstance().showBluetoothIndication(); 5798bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project int ongoingCallIcon = bluetoothActive ? R.drawable.ic_incall_ongoing_bluetooth 5808bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project : R.drawable.ic_incall_ongoing; 5818bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mLowerTitleIcon.setImageResource(ongoingCallIcon); 5828bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 583b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLowerTitle.setText(cardTitle); 5848bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 5858bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project int textColor = bluetoothActive ? mTextColorConnectedBluetooth : mTextColorConnected; 5868bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mLowerTitle.setTextColor(textColor); 5878bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mElapsedTime.setTextColor(textColor); 5888bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project setUpperTitle(""); 589b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (state == Call.State.DISCONNECTED) { 590b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Use the "lower title" (in red). 591b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: We may not *always* want to use the lower title for 592b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the DISCONNECTED state. "Error" states like BUSY or 593b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // CONGESTION (see getCallFailedString()) should probably go 594b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // in the upper title, for example. In fact, the lower title 595b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // should probably be used *only* for the normal "Call ended" 596b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // case. 597b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLowerTitleViewGroup.setVisibility(View.VISIBLE); 598b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLowerTitleIcon.setImageResource(R.drawable.ic_incall_end); 599b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLowerTitle.setText(cardTitle); 600b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLowerTitle.setTextColor(mTextColorEnded); 601b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mElapsedTime.setTextColor(mTextColorEnded); 6028bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project setUpperTitle(""); 603b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 6048bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // All other states (DIALING, INCOMING, etc.) use the "upper title": 6058bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project setUpperTitle(cardTitle, state); 606b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLowerTitleViewGroup.setVisibility(View.INVISIBLE); 607b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 608b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 609b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Draw the onscreen "elapsed time" indication EXCEPT if we're in 610b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the "Call ended" state. (In that case, don't touch the 611b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // mElapsedTime widget, so we continue to see the elapsed time of 612b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the call that just ended.) 613b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (call.getState() == Call.State.DISCONNECTED) { 614b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "Call ended" state -- don't touch the onscreen elapsed time. 615b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 616b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project long duration = CallTime.getCallDuration(call); // msec 617b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project updateElapsedTimeWidget(duration / 1000); 618b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Also see onTickForCallTimeElapsed(), which updates this 619b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // widget once per second while the call is active. 620b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 621b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 622b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 623b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 624b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates mElapsedTime based on the specified number of seconds. 625b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * A timeElapsed value of zero means to not show an elapsed time at all. 626b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 627b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updateElapsedTimeWidget(long timeElapsed) { 628b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if (DBG) log("updateElapsedTimeWidget: " + timeElapsed); 629b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (timeElapsed == 0) { 630b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mElapsedTime.setText(""); 631b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 632b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mElapsedTime.setText(DateUtils.formatElapsedTime(timeElapsed)); 633b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 634b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 635b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 636b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 637b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Returns the "card title" displayed at the top of a foreground 638b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * ("active") CallCard to indicate the current state of this call, like 639b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * "Dialing" or "In call" or "On hold". A null return value means that 640b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * there's no title string for this state. 641b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 642b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private String getTitleForCallCard(Call call) { 643b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String retVal = null; 644b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 645b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Context context = getContext(); 646b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int resId; 647b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 648b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("- getTitleForCallCard(Call " + call + ")..."); 649b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 650b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (state) { 651b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case IDLE: 652b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 653b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 654b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ACTIVE: 655b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Title is "Call in progress". (Note this appears in the 656b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // "lower title" area of the CallCard.) 657b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project retVal = context.getString(R.string.card_title_in_progress); 658b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 659b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 660b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case HOLDING: 661b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project retVal = context.getString(R.string.card_title_on_hold); 662b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: if this is a conference call on hold, 663b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // maybe have a special title here too? 664b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 665b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 666b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DIALING: 667b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ALERTING: 668b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project retVal = context.getString(R.string.card_title_dialing); 669b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 670b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 671b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case INCOMING: 672b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case WAITING: 673b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project retVal = context.getString(R.string.card_title_incoming_call); 674b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 675b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 676b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DISCONNECTED: 677b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project retVal = getCallFailedString(call); 678b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 679b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 680b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 681b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log(" ==> result: " + retVal); 682b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return retVal; 683b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 684b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 685b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 686b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the "on hold" box in the "other call" info area 687b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * (ie. the stuff in the otherCallOnHoldInfo block) 688b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * based on the specified Call. 689b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Or, clear out the "on hold" box if the specified call 690b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * is null or idle. 691b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 692b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void displayOnHoldCallStatus(Phone phone, Call call) { 693b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("displayOnHoldCallStatus(call =" + call + ")..."); 694b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (call == null) { 695b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOnHoldInfoArea.setVisibility(View.GONE); 696b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return; 697b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 698b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 699b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 700b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (state) { 701b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case HOLDING: 702b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Ok, there actually is a background call on hold. 703b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Display the "on hold" box. 704b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String name; 705b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 706b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // First, see if we need to query. 707b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (PhoneUtils.isConferenceCall(call)) { 708b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("==> conference call."); 709b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project name = getContext().getString(R.string.confCall); 710b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 711b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // perform query and update the name temporarily 712b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // make sure we hand the textview we want updated to the 713b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // callback function. 714b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("==> NOT a conf call; call startGetCallerInfo..."); 715b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project PhoneUtils.CallerInfoToken info = PhoneUtils.startGetCallerInfo( 716b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project getContext(), call, this, mOtherCallOnHoldName); 717b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project name = PhoneUtils.getCompactNameFromCallerInfo(info.currentInfo, getContext()); 718b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 719b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 720b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOnHoldName.setText(name); 721b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 722b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // The call here is always "on hold", so use the orange "hold" frame 723b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // and orange text color: 724b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project setOnHoldInfoAreaBackgroundResource(R.drawable.incall_frame_hold_short); 725b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOnHoldName.setTextColor(mTextColorOnHold); 726b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOnHoldStatus.setTextColor(mTextColorOnHold); 727b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 728b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOnHoldInfoArea.setVisibility(View.VISIBLE); 729b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 730b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 731b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 732b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project default: 733b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // There's actually no call on hold. (Presumably this call's 734b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // state is IDLE, since any other state is meaningless for the 735b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // background call.) 736b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOnHoldInfoArea.setVisibility(View.GONE); 737b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 738b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 739b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 740b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 741b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 742b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the "Ongoing call" box in the "other call" info area 743b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * (ie. the stuff in the otherCallOngoingInfo block) 744b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * based on the specified Call. 745b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Or, clear out the "ongoing call" box if the specified call 746b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * is null or idle. 747b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 748b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void displayOngoingCallStatus(Phone phone, Call call) { 749b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("displayOngoingCallStatus(call =" + call + ")..."); 750b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (call == null) { 751b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOngoingInfoArea.setVisibility(View.GONE); 752b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return; 753b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 754b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 755b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 756b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (state) { 757b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ACTIVE: 758b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DIALING: 759b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ALERTING: 760b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Ok, there actually is an ongoing call. 761b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Display the "ongoing call" box. 762b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String name; 763b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 764b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // First, see if we need to query. 765b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (PhoneUtils.isConferenceCall(call)) { 766b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project name = getContext().getString(R.string.confCall); 767b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 768b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // perform query and update the name temporarily 769b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // make sure we hand the textview we want updated to the 770b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // callback function. 771b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project PhoneUtils.CallerInfoToken info = PhoneUtils.startGetCallerInfo( 772b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project getContext(), call, this, mOtherCallOngoingName); 773b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project name = PhoneUtils.getCompactNameFromCallerInfo(info.currentInfo, getContext()); 774b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 775b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 776b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOngoingName.setText(name); 777b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 7788bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // This is an "ongoing" call: we normally use the green 7798bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // background frame and text color, but we use blue 7808bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // instead if bluetooth is in use. 7818bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project boolean bluetoothActive = PhoneApp.getInstance().showBluetoothIndication(); 7828bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 7838bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project int ongoingCallBackground = 7848bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project bluetoothActive ? R.drawable.incall_frame_bluetooth_short 7858bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project : R.drawable.incall_frame_connected_short; 7868bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project setOngoingInfoAreaBackgroundResource(ongoingCallBackground); 7878bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 7888bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project int ongoingCallIcon = bluetoothActive ? R.drawable.ic_incall_ongoing_bluetooth 7898bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project : R.drawable.ic_incall_ongoing; 7908bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mOtherCallOngoingIcon.setImageResource(ongoingCallIcon); 7918bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 7928bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project int textColor = bluetoothActive ? mTextColorConnectedBluetooth 7938bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project : mTextColorConnected; 7948bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mOtherCallOngoingName.setTextColor(textColor); 7958bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mOtherCallOngoingStatus.setTextColor(textColor); 796b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 797b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOngoingInfoArea.setVisibility(View.VISIBLE); 798b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 799b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 800b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 801b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project default: 802b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // There's actually no ongoing call. (Presumably this call's 803b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // state is IDLE, since any other state is meaningless for the 804b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // foreground call.) 805b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOngoingInfoArea.setVisibility(View.GONE); 806b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 807b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 808b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 809b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 810b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 811b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private String getCallFailedString(Call call) { 812b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Phone phone = PhoneApp.getInstance().phone; 813b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Connection c = call.getEarliestConnection(); 814b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int resID; 815b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 816b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (c == null) { 817b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("getCallFailedString: connection is null, using default values."); 818b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if this connection is null, just assume that the 819b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // default case occurs. 820b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.card_title_call_ended; 821b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 822b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 823b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Connection.DisconnectCause cause = c.getDisconnectCause(); 824b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 825b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: The card *title* should probably be "Call ended" in all 826b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // cases, but if the DisconnectCause was an error condition we should 827b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // probably also display the specific failure reason somewhere... 828b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 829b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (cause) { 830b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case BUSY: 831b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_userBusy; 832b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 833b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 834b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case CONGESTION: 835b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_congestion; 836b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 837b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 838b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case LOST_SIGNAL: 839b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_noSignal; 840b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 841b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 842b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case LIMIT_EXCEEDED: 843b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_limitExceeded; 844b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 845b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 846b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case POWER_OFF: 847b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_powerOff; 848b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 849b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 850b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case SIM_ERROR: 851b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_simError; 852b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 853b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 854b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case OUT_OF_SERVICE: 855b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.callFailed_outOfService; 856b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 857b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 858b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project default: 859b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project resID = R.string.card_title_call_ended; 860b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 861b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 862b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 863b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return getContext().getString(resID); 864b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 865b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 866b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void showCallConnecting() { 867b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("showCallConnecting()..."); 868b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: remove if truly unused 869b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 870b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 871b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void showCallIncoming() { 872b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("showCallIncoming()..."); 873b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: remove if truly unused 874b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 875b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 876b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void showCallConnected() { 877b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("showCallConnected()..."); 878b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: remove if truly unused 879b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 880b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 881b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void showCallEnded() { 882b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("showCallEnded()..."); 883b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: remove if truly unused 884b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 885b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void showCallOnhold() { 886b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("showCallOnhold()..."); 887b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: remove if truly unused 888b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 889b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 890b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 891b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Add the Call object to these next 2 apis since the callbacks from 892b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * updateImageViewWithContactPhotoAsync call will need to use it. 893b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 894b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 8954b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project private void updateDisplayForPerson(CallerInfo info, int presentation, Call call) { 8964b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project updateDisplayForPerson(info, presentation, false, call); 897b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 898b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 899b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 900b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the name / photo / number / label fields on the CallCard 901b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * based on the specified CallerInfo. 902b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 903b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * If the current call is a conference call, use 904b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * updateDisplayForConference() instead. 905b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 906b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updateDisplayForPerson(CallerInfo info, 9074b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project int presentation, 908b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project boolean isTemporary, 909b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call call) { 910b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateDisplayForPerson(" + info + ")..."); 911b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 912b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // inform the state machine that we are displaying a photo. 913b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker.setPhotoRequest(info); 914b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker.setPhotoState(ContactsAsyncHelper.ImageTracker.DISPLAY_IMAGE); 915b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 916b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String name; 917b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String displayNumber = null; 918b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project String label = null; 919b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Uri personUri = null; 920b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 921b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (info != null) { 922b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // It appears that there is a small change in behaviour with the 923b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // PhoneUtils' startGetCallerInfo whereby if we query with an 924b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // empty number, we will get a valid CallerInfo object, but with 925b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // fields that are all null, and the isTemporary boolean input 926b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // parameter as true. 927b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 928b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // In the past, we would see a NULL callerinfo object, but this 929b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // ends up causing null pointer exceptions elsewhere down the 930b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // line in other cases, so we need to make this fix instead. It 931b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // appears that this was the ONLY call to PhoneUtils 932b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // .getCallerInfo() that relied on a NULL CallerInfo to indicate 933b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // an unknown contact. 934b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 935b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (TextUtils.isEmpty(info.name)) { 936b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (TextUtils.isEmpty(info.phoneNumber)) { 9374b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project name = getPresentationString(presentation); 938b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 939b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project name = info.phoneNumber; 940b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 941b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 942b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project name = info.name; 943b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project displayNumber = info.phoneNumber; 944b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project label = info.phoneLabel; 945b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 946b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.person_id); 947b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 9484b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project name = getPresentationString(presentation); 949b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 950b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mName.setText(name); 951b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mName.setVisibility(View.VISIBLE); 952b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 953b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Update mPhoto 954b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if the temporary flag is set, we know we'll be getting another call after 955b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the CallerInfo has been correctly updated. So, we can skip the image 956b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // loading until then. 957b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 958b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // If the photoResource is filled in for the CallerInfo, (like with the 959b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Emergency Number case), then we can just set the photo image without 960b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // requesting for an image load. Please refer to CallerInfoAsyncQuery.java 961b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // for cases where CallerInfo.photoResource may be set. We can also avoid 962b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the image load step if the image data is cached. 963b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (isTemporary && (info == null || !info.isCachedPhotoCurrent)) { 964b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoto.setVisibility(View.INVISIBLE); 965b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (info != null && info.photoResource != 0){ 966b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(mPhoto, info.photoResource); 967b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (!showCachedImage(mPhoto, info)) { 968b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Load the image with a callback to update the image state. 969b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Use a placeholder image value of -1 to indicate no image. 970b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ContactsAsyncHelper.updateImageViewWithContactPhotoAsync(info, 0, this, call, 971b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project getContext(), mPhoto, personUri, -1); 972b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 973b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (displayNumber != null) { 974b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoneNumber.setText(displayNumber); 975b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoneNumber.setVisibility(View.VISIBLE); 976b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 977b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoneNumber.setVisibility(View.GONE); 978b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 979b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 980b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (label != null) { 981b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLabel.setText(label); 982b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLabel.setVisibility(View.VISIBLE); 983b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 984b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLabel.setVisibility(View.GONE); 985b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 986b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 987b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 988b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 9894b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project private String getPresentationString(int presentation) { 9904b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project String name = getContext().getString(R.string.unknown); 9914b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project if (presentation == Connection.PRESENTATION_RESTRICTED) { 9924b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project name = getContext().getString(R.string.private_num); 9934b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project } else if (presentation == Connection.PRESENTATION_PAYPHONE) { 9944b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project name = getContext().getString(R.string.payphone); 9954b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project } 9964b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project return name; 9974b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project } 9984b8337277ec2e375c3536b97c40e6617a7b12990The Android Open Source Project 999b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1000b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the name / photo / number / label fields 1001b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * for the special "conference call" state. 1002b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 1003b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * If the current call has only a single connection, use 1004b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * updateDisplayForPerson() instead. 1005b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1006b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updateDisplayForConference() { 1007b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateDisplayForConference()..."); 1008b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1009b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Display the "conference call" image in the photo slot, 1010b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // with no other information. 1011b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1012b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(mPhoto, R.drawable.picture_conference); 1013b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1014b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mName.setText(R.string.card_title_conf_call); 1015b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mName.setVisibility(View.VISIBLE); 1016b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1017b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: For a conference call, the "phone number" slot is specced 1018b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // to contain a summary of who's on the call, like "Bill Foldes 1019b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // and Hazel Nutt" or "Bill Foldes and 2 others". 1020b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // But for now, just hide it: 1021b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhoneNumber.setVisibility(View.GONE); 1022b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1023b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mLabel.setVisibility(View.GONE); 1024b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1025b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: consider also showing names / numbers / photos of some of the 1026b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // people on the conference here, so you can see that info without 1027b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // having to click "Manage conference". We probably have enough 1028b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // space to show info for 2 people, at least. 1029b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 1030b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // To do this, our caller would pass us the activeConnections 1031b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // list, and we'd call PhoneUtils.getCallerInfo() separately for 1032b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // each connection. 1033b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1034b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1035b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1036b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates the CallCard "photo" IFF the specified Call is in a state 1037b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * that needs a special photo (like "busy" or "dialing".) 1038b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 1039b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * If the current call does not require a special image in the "photo" 1040b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * slot onscreen, don't do anything, since presumably the photo image 1041b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * has already been set (to the photo of the person we're talking, or 1042b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * the generic "picture_unknown" image, or the "conference call" 1043b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * image.) 1044b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1045b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void updatePhotoForCallState(Call call) { 1046b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updatePhotoForCallState(" + call + ")..."); 1047b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int photoImageResource = 0; 1048b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1049b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Check for the (relatively few) telephony states that need a 1050b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // special image in the "photo" slot. 1051b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Call.State state = call.getState(); 1052b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (state) { 1053b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DISCONNECTED: 1054b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Display the special "busy" photo for BUSY or CONGESTION. 1055b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Otherwise (presumably the normal "call ended" state) 1056b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // leave the photo alone. 1057b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Connection c = call.getEarliestConnection(); 1058b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if the connection is null, we assume the default case, 1059b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // otherwise update the image resource normally. 1060b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (c != null) { 1061b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Connection.DisconnectCause cause = c.getDisconnectCause(); 1062b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if ((cause == Connection.DisconnectCause.BUSY) 1063b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project || (cause == Connection.DisconnectCause.CONGESTION)) { 1064b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project photoImageResource = R.drawable.picture_busy; 1065b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1066b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (DBG) { 1067b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project log("updatePhotoForCallState: connection is null, ignoring."); 1068b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1069b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1070b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // TODO: add special images for any other DisconnectCauses? 1071b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 1072b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1073b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case DIALING: 1074b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case ALERTING: 1075b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project photoImageResource = R.drawable.picture_dialing; 1076b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 1077b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1078b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project default: 1079b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Leave the photo alone in all other states. 1080b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // If this call is an individual call, and the image is currently 1081b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // displaying a state, (rather than a photo), we'll need to update 1082b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the image. 1083b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // This is for the case where we've been displaying the state and 1084b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // now we need to restore the photo. This can happen because we 1085b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // only query the CallerInfo once, and limit the number of times 1086b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the image is loaded. (So a state image may overwrite the photo 1087b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // and we would otherwise have no way of displaying the photo when 1088b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // the state goes away.) 1089b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1090b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if the photoResource field is filled-in in the Connection's 1091b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // caller info, then we can just use that instead of requesting 1092b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // for a photo load. 1093b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1094b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // look for the photoResource if it is available. 1095b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project CallerInfo ci = null; 1096b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project { 1097b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Connection conn = call.getEarliestConnection(); 1098b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (conn != null) { 1099b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Object o = conn.getUserData(); 1100b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (o instanceof CallerInfo) { 1101b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ci = (CallerInfo) o; 1102b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (o instanceof PhoneUtils.CallerInfoToken) { 1103b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ci = ((PhoneUtils.CallerInfoToken) o).currentInfo; 1104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1105b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1106b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1107b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1108b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (ci != null) { 1109b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project photoImageResource = ci.photoResource; 1110b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1111b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1112b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // If no photoResource found, check to see if this is a conference call. If 1113b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // it is not a conference call: 1114b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 1. Try to show the cached image 1115b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 2. If the image is not cached, check to see if a load request has been 1116b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // made already. 1117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // 3. If the load request has not been made [DISPLAY_DEFAULT], start the 1118b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // request and note that it has started by updating photo state with 1119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // [DISPLAY_IMAGE]. 1120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Load requests started in (3) use a placeholder image of -1 to hide the 1121b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // image by default. Please refer to CallerInfoAsyncQuery.java for cases 1122b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // where CallerInfo.photoResource may be set. 1123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (photoImageResource == 0) { 1124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (!PhoneUtils.isConferenceCall(call)) { 1125b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (!showCachedImage(mPhoto, ci) && (mPhotoTracker.getPhotoState() == 1126b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ContactsAsyncHelper.ImageTracker.DISPLAY_DEFAULT)) { 1127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ContactsAsyncHelper.updateImageViewWithContactPhotoAsync(ci, 1128b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project getContext(), mPhoto, mPhotoTracker.getPhotoUri(), -1); 1129b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker.setPhotoState( 1130b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ContactsAsyncHelper.ImageTracker.DISPLAY_IMAGE); 1131b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1132b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1133b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 1134b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(mPhoto, photoImageResource); 1135b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker.setPhotoState(ContactsAsyncHelper.ImageTracker.DISPLAY_IMAGE); 1136b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return; 1137b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1138b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project break; 1139b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1140b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1141b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (photoImageResource != 0) { 1142b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("- overrriding photo image: " + photoImageResource); 1143b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(mPhoto, photoImageResource); 1144b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Track the image state. 1145b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mPhotoTracker.setPhotoState(ContactsAsyncHelper.ImageTracker.DISPLAY_DEFAULT); 1146b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1147b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1148b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1149b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1150b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Try to display the cached image from the callerinfo object. 1151b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 1152b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * @return true if we were able to find the image in the cache, false otherwise. 1153b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1154b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final boolean showCachedImage (ImageView view, CallerInfo ci) { 1155b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if ((ci != null) && ci.isCachedPhotoCurrent) { 1156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (ci.cachedPhoto != null) { 1157b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(view, ci.cachedPhoto); 1158b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 1159b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project showImage(view, R.drawable.picture_unknown); 1160b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1161b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return true; 1162b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1163b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return false; 1164b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1166b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** Helper function to display the resource in the imageview AND ensure its visibility.*/ 1167b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final void showImage(ImageView view, int resource) { 1168b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project view.setImageResource(resource); 1169b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project view.setVisibility(View.VISIBLE); 1170b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1171b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1172b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** Helper function to display the drawable in the imageview AND ensure its visibility.*/ 1173b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final void showImage(ImageView view, Drawable drawable) { 1174b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project view.setImageDrawable(drawable); 1175b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project view.setVisibility(View.VISIBLE); 1176b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1177b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1178b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1179b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Intercepts (and discards) any touch events to the CallCard. 1180b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1181b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 1182b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public boolean dispatchTouchEvent(MotionEvent ev) { 1183b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // if (DBG) log("CALLCARD: dispatchTouchEvent(): ev = " + ev); 1184b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1185b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // We *never* let touch events get thru to the UI inside the 1186b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // CallCard, since there's nothing touchable there. 1187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return true; 1188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1189b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1190b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1191b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Sets the background drawable of the main call card. 1192b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1193b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void setMainCallCardBackgroundResource(int resid) { 1194b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mMainCallCard.setBackgroundResource(resid); 1195b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1196b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1197b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1198b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Sets the background drawable of the "ongoing call" info area. 1199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1200b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void setOngoingInfoAreaBackgroundResource(int resid) { 1201b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOngoingInfoArea.setBackgroundResource(resid); 1202b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1203b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1205b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Sets the background drawable of the "call on hold" info area. 1206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1207b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void setOnHoldInfoAreaBackgroundResource(int resid) { 1208b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mOtherCallOnHoldInfoArea.setBackgroundResource(resid); 1209b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1210b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1211b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1212b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Returns the "Menu button hint" TextView (which is manipulated 1213b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * directly by the InCallScreen.) 1214b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * @see InCallScreen.updateMenuButtonHint() 1215b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1216b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /* package */ TextView getMenuButtonHint() { 1217b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return mMenuButtonHint; 1218b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1219b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1220b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1221b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Updates anything about our View hierarchy or internal state 1222b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * that needs to be different in landscape mode. 1223b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 1224b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * @see InCallScreen.applyConfigurationToLayout() 1225b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1226b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /* package */ void updateForLandscapeMode() { 1227b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("updateForLandscapeMode()..."); 1228b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1229b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // The main CallCard's minimum height is smaller in landscape mode 1230b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // than in portrait mode. 1231b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mMainCallCard.setMinimumHeight(MAIN_CALLCARD_MIN_HEIGHT_LANDSCAPE); 1232b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1233b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Add some left and right margin to the top-level elements, since 1234b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // there's no need to use the full width of the screen (which is 1235b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // much wider in landscape mode.) 1236b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project setSideMargins(mMainCallCard, CALLCARD_SIDE_MARGIN_LANDSCAPE); 1237b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project setSideMargins(mOtherCallOngoingInfoArea, CALLCARD_SIDE_MARGIN_LANDSCAPE); 1238b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project setSideMargins(mOtherCallOnHoldInfoArea, CALLCARD_SIDE_MARGIN_LANDSCAPE); 1239b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1240b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // A couple of TextViews are slightly smaller in landscape mode. 1241b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mUpperTitle.setTextSize(TITLE_TEXT_SIZE_LANDSCAPE); 1242b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1243b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1244b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 1245b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Sets the left and right margins of the specified ViewGroup (whose 1246b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * LayoutParams object which must inherit from 1247b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * ViewGroup.MarginLayoutParams.) 1248b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 1249b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * TODO: Is there already a convenience method like this somewhere? 1250b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 1251b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void setSideMargins(ViewGroup vg, int margin) { 1252b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ViewGroup.MarginLayoutParams lp = 1253b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project (ViewGroup.MarginLayoutParams) vg.getLayoutParams(); 1254b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Equivalent to setting android:layout_marginLeft/Right in XML 1255b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project lp.leftMargin = margin; 1256b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project lp.rightMargin = margin; 1257b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project vg.setLayoutParams(lp); 1258b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1259b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 12608bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project /** 12618bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * Sets the CallCard "upper title" to a plain string, with no icon. 12628bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project */ 12638bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project private void setUpperTitle(String title) { 12648bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mUpperTitle.setText(title); 12658bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mUpperTitle.setCompoundDrawables(null, null, null, null); 12668bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } 12678bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 12688bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project /** 12698bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * Sets the CallCard "upper title". Also, depending on the passed-in 12708bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project * Call state, possibly display an icon along with the title. 12718bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project */ 12728bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project private void setUpperTitle(String title, Call.State state) { 12738bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mUpperTitle.setText(title); 12748bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 12758bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project int bluetoothIconId = 0; 12768bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project if (((state == Call.State.INCOMING) || (state == Call.State.WAITING)) 12778bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project && PhoneApp.getInstance().showBluetoothIndication()) { 12788bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // Display the special bluetooth icon also, if this is an incoming 12798bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project // call and the audio will be routed to bluetooth. 12808bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project bluetoothIconId = R.drawable.ic_incoming_call_bluetooth; 12818bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } 12828bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 12838bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project mUpperTitle.setCompoundDrawablesWithIntrinsicBounds(bluetoothIconId, 0, 0, 0); 12848bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project if (bluetoothIconId != 0) mUpperTitle.setCompoundDrawablePadding(5); 12858bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project } 12868bb467d9a1106dedd79e42166c7b6e9fc9a897a7The Android Open Source Project 1287b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1288b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // Debugging / testing code 1289b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1290b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void log(String msg) { 1291796c70c99bc39295bf685061056f06ab8949c742David Brown Log.d(LOG_TAG, msg); 1292b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1293b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 1294b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static void logErr(String msg) { 1295796c70c99bc39295bf685061056f06ab8949c742David Brown Log.e(LOG_TAG, msg); 1296b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 1297b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project} 1298