merge in klp-release history after reset to klp-dev
diff --git a/InCallUI/res/drawable-hdpi/business_unknown.png b/InCallUI/res/drawable-hdpi/business_unknown.png
new file mode 100644
index 0000000..b369939
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/picture_unknown.png b/InCallUI/res/drawable-hdpi/picture_unknown.png
index ba46da1..26d2be1 100644
--- a/InCallUI/res/drawable-hdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-hdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/business_unknown.png b/InCallUI/res/drawable-mdpi/business_unknown.png
new file mode 100644
index 0000000..eac97a9
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/picture_unknown.png b/InCallUI/res/drawable-mdpi/picture_unknown.png
index 995df75..1ee333c 100644
--- a/InCallUI/res/drawable-mdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-mdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/business_unknown.png b/InCallUI/res/drawable-xhdpi/business_unknown.png
new file mode 100644
index 0000000..aa84456
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/picture_unknown.png b/InCallUI/res/drawable-xhdpi/picture_unknown.png
index b4bd366..db74fd9 100644
--- a/InCallUI/res/drawable-xhdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-xhdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/business_unknown.png b/InCallUI/res/drawable-xxhdpi/business_unknown.png
new file mode 100644
index 0000000..6273bb3
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/picture_unknown.png b/InCallUI/res/drawable-xxhdpi/picture_unknown.png
index 4127593..38bec2c 100644
--- a/InCallUI/res/drawable-xxhdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-xxhdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/layout/call_button_fragment.xml b/InCallUI/res/layout/call_button_fragment.xml
index 06de6d9..338190c 100644
--- a/InCallUI/res/layout/call_button_fragment.xml
+++ b/InCallUI/res/layout/call_button_fragment.xml
@@ -51,6 +51,7 @@
     <ImageButton android:id="@+id/endButton"
                  style="@style/InCallEndButton"
                  android:layout_width="match_parent"
+                 android:layout_marginTop="2dp"
                  android:src="@drawable/ic_in_call_phone_hangup"
                  android:background="@drawable/end_call_background"
                  android:contentDescription="@string/onscreenEndCallText"/>
diff --git a/InCallUI/res/values-es-rUS/strings.xml b/InCallUI/res/values-es-rUS/strings.xml
index b3c162f..4ac62c2 100644
--- a/InCallUI/res/values-es-rUS/strings.xml
+++ b/InCallUI/res/values-es-rUS/strings.xml
@@ -86,7 +86,7 @@
     <string name="sum_cw_enabled" msgid="8083061901633671397">"Durante una llamada, notificarme sobre las llamadas entrantes"</string>
     <string name="sum_cw_disabled" msgid="3648693907300104575">"Durante una llamada, notificarme sobre las llamadas entrantes"</string>
     <string name="call_forwarding_settings" msgid="3378927671091537173">"Configuración de reenvío de llamadas"</string>
-    <string name="labelCF" msgid="2574386948026924737">"Reenvío de llamada"</string>
+    <string name="labelCF" msgid="2574386948026924737">"Desvío de llamadas"</string>
     <string name="labelCFU" msgid="8147177368148660600">"Reenviar siempre"</string>
     <string name="messageCFU" msgid="3560082430662923687">"Usar siempre este número"</string>
     <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Reenviar todas las llamadas"</string>
@@ -369,7 +369,7 @@
     <string name="pin_changed" msgid="4365538014588501049">"El PIN de la tarjeta SIM se modificó correctamente."</string>
     <string name="puk_requested" msgid="3898394204193202803">"Contraseña incorrecta. La tarjeta SIM está bloqueada. Se solicitó PUK2."</string>
     <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
-    <string name="oldPin2Label" msgid="8559146795026261502">"Reenviar cuando está ocupado"</string>
+    <string name="oldPin2Label" msgid="8559146795026261502">"PIN2 viejo"</string>
     <string name="newPin2Label" msgid="4573956902204349054">"PIN2 nuevo"</string>
     <string name="confirmPin2Label" msgid="8100319484454787708">"Confirmar PIN2 nuevo"</string>
     <string name="badPuk2" msgid="4851734468010000418">"El PUK2 que ingresaste es incorrecto. Vuelve a intentarlo."</string>
diff --git a/InCallUI/res/values-km-rKH/strings.xml b/InCallUI/res/values-km-rKH/strings.xml
index cea0a6c..d4cdeb5 100644
--- a/InCallUI/res/values-km-rKH/strings.xml
+++ b/InCallUI/res/values-km-rKH/strings.xml
@@ -350,7 +350,7 @@
     <string name="simContacts_emptyLoading" msgid="2203331234764498011">"កំពុង​អាន​ពី​ស៊ីមកាត…"</string>
     <string name="simContacts_empty" msgid="5270660846489561932">"គ្មាន​ទំនាក់ទំនង​នៅ​លើ​ស៊ីមកាត​របស់​អ្នក​ទេ។"</string>
     <string name="simContacts_title" msgid="1861472842524839921">"ជ្រើស​ទំនាក់​ទំនង​ដើម្បី​នាំចូល"</string>
-    <string name="simContacts_airplaneMode" msgid="1846161429087789936">"ដើម្បី​នាំចូល​ទំនាក់ទំនង​ពី​ស៊ី​ម​កាត​ ដំបូង​បិទ​របៀប​ពេល​ជិះ​​យន្តហោះ​។"</string>
+    <string name="simContacts_airplaneMode" msgid="1846161429087789936">"ដើម្បី​នាំចូល​ទំនាក់ទំនង​ពី​ស៊ី​ម​កាត​ ដំបូង​ត្រូវបិទ​របៀប​ពេល​ជិះ​​យន្តហោះ​។"</string>
     <string name="enable_pin" msgid="5422767284133234860">"បិទ/បើក​កូដ PIN ស៊ីមកាត"</string>
     <string name="change_pin" msgid="9174186126330785343">"ប្ដូរ​កូដ​ PIN ស៊ីមកាត"</string>
     <string name="enter_pin_text" msgid="8532615714751931951">"កូដ PIN ស៊ីមកាត៖"</string>
diff --git a/InCallUI/res/values/colors.xml b/InCallUI/res/values/colors.xml
index 9d149a4..53d8f52 100644
--- a/InCallUI/res/values/colors.xml
+++ b/InCallUI/res/values/colors.xml
@@ -42,5 +42,5 @@
     <drawable name="end_call_pressed_state">#ff4e4e</drawable>
 
     <!-- Used when the End Call button is disabled -->
-    <drawable name="end_call_disabled_state">#00000000</drawable>
+    <drawable name="end_call_disabled_state">#303030</drawable>
 </resources>
diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java
index 2098694..b0fdda1 100644
--- a/InCallUI/src/com/android/incallui/CallButtonFragment.java
+++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java
@@ -189,12 +189,23 @@
     }
 
     @Override
-    public void setVisible(boolean on) {
-        if (on) {
-            getView().setVisibility(View.VISIBLE);
-        } else {
-            getView().setVisibility(View.INVISIBLE);
+    public void setEnabled(boolean isEnabled) {
+        View view = getView();
+        if (view.getVisibility() != View.VISIBLE) {
+            view.setVisibility(View.VISIBLE);
         }
+
+        // The main end-call button spanning across the screen.
+        mEndCallButton.setEnabled(isEnabled);
+
+        // The smaller buttons laid out horizontally just below the end-call button.
+        mMuteButton.setEnabled(isEnabled);
+        mAudioButton.setEnabled(isEnabled);
+        mHoldButton.setEnabled(isEnabled);
+        mShowDialpadButton.setEnabled(isEnabled);
+        mMergeButton.setEnabled(isEnabled);
+        mAddCallButton.setEnabled(isEnabled);
+        mSwapButton.setEnabled(isEnabled);
     }
 
     @Override
diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
index 6840a15..3642630 100644
--- a/InCallUI/src/com/android/incallui/CallButtonPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
@@ -221,14 +221,14 @@
             return;
         }
 
-        final boolean isVisible = state.isConnectingOrConnected() &&
+        final boolean isEnabled = state.isConnectingOrConnected() &&
                 !state.isIncoming() && call != null;
 
-        ui.setVisible(isVisible);
+        ui.setEnabled(isEnabled);
 
         Log.d(this, "Updating call UI for call: ", call);
 
-        if (isVisible) {
+        if (isEnabled) {
             Log.v(this, "Show hold ", call.can(Capabilities.SUPPORT_HOLD));
             Log.v(this, "Enable hold", call.can(Capabilities.HOLD));
             Log.v(this, "Show merge ", call.can(Capabilities.MERGE_CALLS));
@@ -335,7 +335,7 @@
     }
 
     public interface CallButtonUi extends Ui {
-        void setVisible(boolean on);
+        void setEnabled(boolean on);
         void setMute(boolean on);
         void enableMute(boolean enabled);
         void setHold(boolean on);
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 4ff4d65..949d718 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -261,6 +261,9 @@
                     if (entry.name != null) {
                         Log.d(TAG, "Contact found: " + entry);
                     }
+                    if (entry.personUri != null) {
+                        CallerInfoUtils.sendViewNotification(mContext, entry.personUri);
+                    }
                 }
 
                 @Override
diff --git a/InCallUI/src/com/android/incallui/CallerInfoUtils.java b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
index 2971a29..3d2c5c4 100644
--- a/InCallUI/src/com/android/incallui/CallerInfoUtils.java
+++ b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
@@ -1,6 +1,8 @@
 package com.android.incallui;
 
 import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
 import android.text.TextUtils;
 
 import com.android.services.telephony.common.Call;
@@ -9,7 +11,7 @@
 import java.util.Arrays;
 
 /**
- * TODO: Insert description here. (generated by yorkelee)
+ * Utility methods for contact and caller info related functionality
  */
 public class CallerInfoUtils {
 
@@ -18,6 +20,12 @@
     /** Define for not a special CNAP string */
     private static final int CNAP_SPECIAL_CASE_NO = -1;
 
+    private static final String VIEW_NOTIFICATION_ACTION =
+            "com.android.contacts.VIEW_NOTIFICATION";
+    private static final String VIEW_NOTIFICATION_PACKAGE = "com.android.contacts";
+    private static final String VIEW_NOTIFICATION_CLASS =
+            "com.android.contacts.ViewNotificationService";
+
     public CallerInfoUtils() {
     }
 
@@ -172,4 +180,14 @@
         }
         return builder.toString();
     }
+
+    /**
+     * Send a notification that that we are viewing a particular contact, so that the high-res
+     * photo is downloaded by the sync adapter.
+     */
+    public static void sendViewNotification(Context context, Uri contactUri) {
+        final Intent intent = new Intent(VIEW_NOTIFICATION_ACTION, contactUri);
+        intent.setClassName(VIEW_NOTIFICATION_PACKAGE, VIEW_NOTIFICATION_CLASS);
+        context.startService(intent);
+    }
 }
diff --git a/InCallUI/src/com/android/incallui/ContactInfoCache.java b/InCallUI/src/com/android/incallui/ContactInfoCache.java
index 13f8dd0..4b482cb 100644
--- a/InCallUI/src/com/android/incallui/ContactInfoCache.java
+++ b/InCallUI/src/com/android/incallui/ContactInfoCache.java
@@ -234,6 +234,12 @@
                 entry.location = oldEntry.location;
             }
 
+            // If no image and it's a business, switch to using the default business avatar.
+            if (info.getImageUrl() == null && info.isBusiness()) {
+                Log.d(TAG, "Business has no image. Using default.");
+                entry.photo = mContext.getResources().getDrawable(R.drawable.business_unknown);
+            }
+
             // Add the contact info to the cache.
             mInfoMap.put(mCallId, entry);
             sendInfoNotifications(mCallId, entry);
diff --git a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
index 942bf42..24303cd 100644
--- a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
+++ b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
@@ -67,5 +67,6 @@
         public String getPhoneLabel();
         public String getNormalizedNumber();
         public String getImageUrl();
+        public boolean isBusiness();
     }
 }