Merge "Adding logging to capture MessageHandler ordering." into klp-dev
diff --git a/InCallUI/res/values-ca/strings.xml b/InCallUI/res/values-ca/strings.xml
index 9d95426..02e1b8c 100644
--- a/InCallUI/res/values-ca/strings.xml
+++ b/InCallUI/res/values-ca/strings.xml
@@ -617,7 +617,7 @@
     <string name="ringtone_title" msgid="6374978286202084684">"To del telèfon"</string>
     <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrar en sonar"</string>
     <string name="dtmf_tone_enable_title" msgid="827601042915852989">"Sonar en marcar els números"</string>
-    <string name="dial_pad_autocomplete" msgid="494525952035761075">"Compleció autom. del teclat"</string>
+    <string name="dial_pad_autocomplete" msgid="494525952035761075">"Autocompletar amb teclat"</string>
     <string name="preference_category_ringtone" msgid="5197960752529332721">"To i vibració"</string>
     <string name="manageConferenceLabel" msgid="4691922394301969053">"Gestiona la trucada de conferència"</string>
 </resources>
diff --git a/InCallUI/res/values-cs/strings.xml b/InCallUI/res/values-cs/strings.xml
index 49ba0aa..85f4f42 100644
--- a/InCallUI/res/values-cs/strings.xml
+++ b/InCallUI/res/values-cs/strings.xml
@@ -617,7 +617,7 @@
     <string name="ringtone_title" msgid="6374978286202084684">"Vyzváněcí tón telefonu"</string>
     <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrace při vyzvánění"</string>
     <string name="dtmf_tone_enable_title" msgid="827601042915852989">"Tóny při dotyku číselníku"</string>
-    <string name="dial_pad_autocomplete" msgid="494525952035761075">"Aut. doplň. pomocí číselníku"</string>
+    <string name="dial_pad_autocomplete" msgid="494525952035761075">"Autom. doplňování číselníku"</string>
     <string name="preference_category_ringtone" msgid="5197960752529332721">"Vyzvánění a vibrace"</string>
     <string name="manageConferenceLabel" msgid="4691922394301969053">"Spravovat konferenční hovor"</string>
 </resources>
diff --git a/InCallUI/res/values-hi/strings.xml b/InCallUI/res/values-hi/strings.xml
index 8019ab4..825c082 100644
--- a/InCallUI/res/values-hi/strings.xml
+++ b/InCallUI/res/values-hi/strings.xml
@@ -87,23 +87,23 @@
     <string name="sum_cw_disabled" msgid="3648693907300104575">"कॉल के दौरान, मुझे इनकमिंग कॉल की सूचना दें"</string>
     <string name="call_forwarding_settings" msgid="3378927671091537173">"कॉल अग्रेषण सेटिंग"</string>
     <string name="labelCF" msgid="2574386948026924737">"कॉल अग्रेषण"</string>
-    <string name="labelCFU" msgid="8147177368148660600">"हमेशा अग्रेषित करें"</string>
+    <string name="labelCFU" msgid="8147177368148660600">"हमेशा इसको भेजें"</string>
     <string name="messageCFU" msgid="3560082430662923687">"हमेशा इस नंबर का उपयोग करें"</string>
     <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"सभी कॉल अग्रेषित कर रहा है"</string>
     <string name="sum_cfu_enabled" msgid="2450052502198827927">"सभी कॉल <xliff:g id="PHONENUMBER">{0}</xliff:g> को अग्रेषित किए जा रहे हैं"</string>
     <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"नंबर अनुपलब्ध है"</string>
     <string name="sum_cfu_disabled" msgid="3698472522160364904">"अक्षम की गई"</string>
-    <string name="labelCFB" msgid="218938523102207587">"व्यस्त होने पर अग्रेषित करें"</string>
+    <string name="labelCFB" msgid="218938523102207587">"व्यस्त होने पर इसको भेजें"</string>
     <string name="messageCFB" msgid="3711089705936187129">"व्यस्त रहते समय नंबर"</string>
     <string name="sum_cfb_enabled" msgid="5984198104833116690">"<xliff:g id="PHONENUMBER">{0}</xliff:g> को अग्रेषित कर रहा है"</string>
     <string name="sum_cfb_disabled" msgid="227440009979537651">"अक्षम की गई"</string>
     <string name="disable_cfb_forbidden" msgid="3506984333877998061">"जब आपका फ़ोन व्यस्त हो, तो आपका ऑपरेटर कॉल अग्रेषण अक्षम करने का समर्थन नहीं करता."</string>
-    <string name="labelCFNRy" msgid="3646316323834351390">"अनुत्तरित होने पर अग्रेषित करें"</string>
+    <string name="labelCFNRy" msgid="3646316323834351390">"अनुत्तरित होने पर इसको भेजें"</string>
     <string name="messageCFNRy" msgid="672317899884380374">"अनुत्तरित होने पर नंबर"</string>
     <string name="sum_cfnry_enabled" msgid="6955775691317662910">"<xliff:g id="PHONENUMBER">{0}</xliff:g> को अग्रेषित कर रहा है"</string>
     <string name="sum_cfnry_disabled" msgid="8422350929957344729">"अक्षम की गई"</string>
     <string name="disable_cfnry_forbidden" msgid="4308233959150658058">"जब आपका फ़ोन उत्तर न दे, तो आपका ऑपरेटर कॉल अग्रेषण अक्षम करने का समर्थन नहीं करता."</string>
-    <string name="labelCFNRc" msgid="47183615370850000">"पहुंच योग्य न होने पर अग्रेषित करें"</string>
+    <string name="labelCFNRc" msgid="47183615370850000">"पहुंच योग्य न होने पर इसको भेजें"</string>
     <string name="messageCFNRc" msgid="6380695421020295119">"पहुंच योग्य न होने पर नंबर"</string>
     <string name="sum_cfnrc_enabled" msgid="7010898346095497421">"<xliff:g id="PHONENUMBER">{0}</xliff:g> को अग्रेषित कर रहा है"</string>
     <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"अक्षम की गई"</string>
diff --git a/InCallUI/res/values-pt/strings.xml b/InCallUI/res/values-pt/strings.xml
index 844d3cd..01e88c3 100644
--- a/InCallUI/res/values-pt/strings.xml
+++ b/InCallUI/res/values-pt/strings.xml
@@ -580,10 +580,10 @@
     <string name="sip_system_decide" msgid="368030746310423471">"Automático"</string>
     <string name="sip_always_send_keepalive" msgid="8192080724632877132">"Sempre enviar"</string>
     <string name="not_voice_capable" msgid="2739898841461577811">"Chamada de voz não compatível"</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Não posso falar agora. Me manda um SMS, por favor?"</string>
+    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Não posso falar agora. Manda um SMS, por favor?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Já te ligo de volta."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Eu te ligo mais tarde."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Não posso falar agora. Me liga depois, por favor?"</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Não posso falar agora. Liga depois, por favor?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escreva sua resposta..."</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respostas rápidas"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editar respostas rápidas"</string>
@@ -616,7 +616,7 @@
     <string name="default_notification_description" msgid="78174796906240970">"Som padrão (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
     <string name="ringtone_title" msgid="6374978286202084684">"Toque do telefone"</string>
     <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrar quando estiver tocando"</string>
-    <string name="dtmf_tone_enable_title" msgid="827601042915852989">"Tons de toque do teclado numérico"</string>
+    <string name="dtmf_tone_enable_title" msgid="827601042915852989">"Tons de toque teclado numérico"</string>
     <string name="dial_pad_autocomplete" msgid="494525952035761075">"Autopreenchimento do teclado"</string>
     <string name="preference_category_ringtone" msgid="5197960752529332721">"Toque e vibração"</string>
     <string name="manageConferenceLabel" msgid="4691922394301969053">"Gerenciar conferência telefônica"</string>
diff --git a/InCallUI/res/values-sw/strings.xml b/InCallUI/res/values-sw/strings.xml
index 661e310..51c8add 100644
--- a/InCallUI/res/values-sw/strings.xml
+++ b/InCallUI/res/values-sw/strings.xml
@@ -617,7 +617,7 @@
     <string name="ringtone_title" msgid="6374978286202084684">"Mlio wa simu"</string>
     <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Tetema wakati wa kuita"</string>
     <string name="dtmf_tone_enable_title" msgid="827601042915852989">"Toa sauti vitufe vya kupiga vinapoguswa"</string>
-    <string name="dial_pad_autocomplete" msgid="494525952035761075">"Jaza kitufe cha kupiga kiotomatiki"</string>
+    <string name="dial_pad_autocomplete" msgid="494525952035761075">"Jaza nambari kiotomatiki"</string>
     <string name="preference_category_ringtone" msgid="5197960752529332721">"Malio wa simu na Mtetemo"</string>
     <string name="manageConferenceLabel" msgid="4691922394301969053">"Dhibiti simu ya kongamano"</string>
 </resources>
diff --git a/InCallUI/src/com/android/incallui/AnimationUtils.java b/InCallUI/src/com/android/incallui/AnimationUtils.java
index aef3cdf..d214c85 100644
--- a/InCallUI/src/com/android/incallui/AnimationUtils.java
+++ b/InCallUI/src/com/android/incallui/AnimationUtils.java
@@ -209,11 +209,14 @@
             final ImageView imageView, final Drawable from, final Drawable to) {
         // We skip the cross-fade when those two Drawables are equal, or they are BitmapDrawables
         // pointing to the same Bitmap.
-        final boolean areSameImage = from.equals(to) ||
-                ((from instanceof BitmapDrawable)
-                        && (to instanceof BitmapDrawable)
-                        && ((BitmapDrawable) from).getBitmap()
-                                .equals(((BitmapDrawable) to).getBitmap()));
+        final boolean drawableIsEqual = (from != null && to != null && from.equals(to));
+        final boolean hasFromImage = ((from instanceof BitmapDrawable) &&
+                ((BitmapDrawable) from).getBitmap() != null);
+        final boolean hasToImage = ((to instanceof BitmapDrawable) &&
+                ((BitmapDrawable) to).getBitmap() != null);
+        final boolean areSameImage = drawableIsEqual || (hasFromImage && hasToImage &&
+                ((BitmapDrawable) from).getBitmap().equals(((BitmapDrawable) to).getBitmap()));
+
         if (!areSameImage) {
             if (FADE_DBG) {
                 log("Start cross-fade animation for " + imageView
@@ -263,6 +266,9 @@
             imageView.setImageDrawable(transitionDrawable);
             transitionDrawable.startTransition(ANIMATION_DURATION); */
             imageView.setTag(to);
+        } else if (!hasFromImage && hasToImage) {
+            imageView.setImageDrawable(to);
+            imageView.setTag(to);
         } else {
             if (FADE_DBG) {
                 log("*Not* start cross-fade. " + imageView);
diff --git a/InCallUI/src/com/android/incallui/AnswerPresenter.java b/InCallUI/src/com/android/incallui/AnswerPresenter.java
index e8bcc99..e820929 100644
--- a/InCallUI/src/com/android/incallui/AnswerPresenter.java
+++ b/InCallUI/src/com/android/incallui/AnswerPresenter.java
@@ -56,7 +56,6 @@
         if (mCallId != Call.INVALID_CALL_ID) {
             CallList.getInstance().removeCallUpdateListener(mCallId, this);
         }
-
     }
 
     @Override
diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
index b2884e6..ec8e844 100644
--- a/InCallUI/src/com/android/incallui/CallButtonPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
@@ -50,13 +50,12 @@
 
     @Override
     public void onUiUnready(CallButtonUi ui) {
+        super.onUiUnready(ui);
+
         InCallPresenter.getInstance().removeListener(this);
         AudioModeProvider.getInstance().removeListener(this);
 
         mProximitySensor = null;
-
-        // set Ui to null, so should go last
-        super.onUiUnready(ui);
     }
 
     @Override
@@ -195,13 +194,13 @@
         }
 
         final boolean isVisible = state.isConnectingOrConnected() &&
-                !state.isIncoming();
+                !state.isIncoming() && call != null;
 
         ui.setVisible(isVisible);
 
         Log.d(this, "Updating call UI for call: ", call);
 
-        if (isVisible && call != null) {
+        if (isVisible) {
             Log.v(this, "Show hold ", call.can(Capabilities.HOLD));
             Log.v(this, "Show merge ", call.can(Capabilities.MERGE_CALLS));
             Log.v(this, "Show swap ", call.can(Capabilities.SWAP_CALLS));
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 07978ff..6c8056b 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -253,9 +253,12 @@
                     // because the contactinfocache pre-massages the data into the ui fields.
                     // Need to do massaging outside of contactinfocache.
                     if (entry.label == null) {
-                        // Name not found.  Try lookup.
-                        Log.d(TAG, "Contact lookup. Contact provider miss. Searching people api.");
-                        lookupPhoneNumber(identification.getNumber(), isPrimary, isConference);
+                        if (identification.getNumberPresentation() == Call.PRESENTATION_ALLOWED) {
+                            // Name not found.  Try lookup.
+                            Log.d(TAG, "Contact lookup. Contact provider miss. Searching people "
+                                    + "api.");
+                            lookupPhoneNumber(identification.getNumber(), isPrimary, isConference);
+                        }
                     } else {
                         Log.d(TAG, "Contact lookup. Found in contact provider: " + entry);
                         updateContactEntry(entry, isPrimary, isConference);
diff --git a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
index ccda4a5..041614d 100644
--- a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
+++ b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
@@ -39,8 +39,24 @@
     private Context mContext;
 
     @Override
+    public void onUiReady(ConferenceManagerUi ui) {
+        super.onUiReady(ui);
+
+        // register for call state changes last
+        InCallPresenter.getInstance().addListener(this);
+    }
+
+    @Override
+    public void onUiUnready(ConferenceManagerUi ui) {
+        super.onUiUnready(ui);
+
+        InCallPresenter.getInstance().removeListener(this);
+    }
+
+    @Override
     public void onStateChange(InCallState state, CallList callList) {
         if (getUi().isFragmentVisible()) {
+            Log.v(this, "onStateChange" + state);
             if (state == InCallState.INCALL && callList.getActiveOrBackgroundCall() != null &&
                     callList.getActiveOrBackgroundCall().isConferenceCall()) {
                 Log.v(this, "Number of existing calls is " +
diff --git a/InCallUI/src/com/android/incallui/InCallActivity.java b/InCallUI/src/com/android/incallui/InCallActivity.java
index 38e2a48..7d7ca4b 100644
--- a/InCallUI/src/com/android/incallui/InCallActivity.java
+++ b/InCallUI/src/com/android/incallui/InCallActivity.java
@@ -273,6 +273,7 @@
         if (mCallButtonFragment == null) {
             mCallButtonFragment = (CallButtonFragment) getFragmentManager()
                     .findFragmentById(R.id.callButtonFragment);
+            mCallButtonFragment.getView().setVisibility(View.INVISIBLE);
         }
 
         if (mCallCardFragment == null) {
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index c5b60fe..ad1a67e 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -25,6 +25,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
@@ -215,10 +216,11 @@
     private void buildAndSendNotification(InCallState state, Call call,
             ContactCacheEntry contactInfo, boolean allowFullScreenIntent) {
 
+        final boolean isConference = call.isConferenceCall();
         final int iconResId = getIconToDisplay(call);
-        final Bitmap largeIcon = getLargeIconToDisplay(contactInfo);
+        final Bitmap largeIcon = getLargeIconToDisplay(contactInfo, isConference);
         final int contentResId = getContentString(call);
-        final String contentTitle = getContentTitle(contactInfo);
+        final String contentTitle = getContentTitle(contactInfo, isConference);
 
         // If we checked and found that nothing is different, dont issue another notification.
         if (!checkForChangeAndSaveData(iconResId, contentResId, largeIcon, contentTitle, state,
@@ -316,7 +318,10 @@
     /**
      * Returns the main string to use in the notification.
      */
-    private String getContentTitle(ContactCacheEntry contactInfo) {
+    private String getContentTitle(ContactCacheEntry contactInfo, boolean isConference) {
+        if (isConference) {
+            return mContext.getResources().getString(R.string.card_title_conf_call);
+        }
         if (TextUtils.isEmpty(contactInfo.name)) {
             return contactInfo.number;
         }
@@ -327,7 +332,11 @@
     /**
      * Gets a large icon from the contact info object to display in the notification.
      */
-    private Bitmap getLargeIconToDisplay(ContactCacheEntry contactInfo) {
+    private Bitmap getLargeIconToDisplay(ContactCacheEntry contactInfo, boolean isConference) {
+        if (isConference) {
+            return BitmapFactory.decodeResource(mContext.getResources(),
+                    R.drawable.picture_conference);
+        }
         if (contactInfo.photo != null && (contactInfo.photo instanceof BitmapDrawable)) {
             return ((BitmapDrawable) contactInfo.photo).getBitmap();
         }