Merge "Import translations. DO NOT MERGE"
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/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/ConferenceManagerPresenter.java b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
index d0f62d7..1ba88cb 100644
--- a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
+++ b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
@@ -64,6 +64,8 @@
                     Log.v(this, "Number of existing calls is " +
                             String.valueOf(call.getChildCallIds().size()));
                     update(callList);
+                } else {
+                    getUi().setVisible(false);
                 }
             } else {
                 getUi().setVisible(false);
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/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
index 541661c..4b38939 100644
--- a/InCallUI/src/com/android/incallui/InCallPresenter.java
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -246,7 +246,7 @@
      */
     @Override
     public void onDisconnect(Call call) {
-        mInCallActivity.hideDialpadForDisconnect();
+        hideDialpadForDisconnect();
         maybeShowErrorDialogOnDisconnect(call);
 
         // We need to do the run the same code as onCallListChange.
@@ -487,6 +487,15 @@
     }
 
     /**
+     * Hides the dialpad.  Called when a call is disconnected (Requires hiding dialpad).
+     */
+    private void hideDialpadForDisconnect() {
+        if (isActivityStarted()) {
+            mInCallActivity.hideDialpadForDisconnect();
+        }
+    }
+
+    /**
      * When the state of in-call changes, this is the first method to get called. It determines if
      * the UI needs to be started or finished depending on the new state and does it.
      */
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index 89d0744..1690c54 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -329,15 +329,24 @@
      * Gets a large icon from the contact info object to display in the notification.
      */
     private Bitmap getLargeIconToDisplay(ContactCacheEntry contactInfo, boolean isConference) {
+        Bitmap largeIcon = null;
         if (isConference) {
-            return BitmapFactory.decodeResource(mContext.getResources(),
+            largeIcon = BitmapFactory.decodeResource(mContext.getResources(),
                     R.drawable.picture_conference);
         }
         if (contactInfo.photo != null && (contactInfo.photo instanceof BitmapDrawable)) {
-            return ((BitmapDrawable) contactInfo.photo).getBitmap();
+            largeIcon = ((BitmapDrawable) contactInfo.photo).getBitmap();
         }
 
-        return null;
+        if (largeIcon != null) {
+            final int height = (int) mContext.getResources().getDimension(
+                    android.R.dimen.notification_large_icon_height);
+            final int width = (int) mContext.getResources().getDimension(
+                    android.R.dimen.notification_large_icon_width);
+            largeIcon = Bitmap.createScaledBitmap(largeIcon, width, height, false);
+        }
+
+        return largeIcon;
     }
 
     /**
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();
     }
 }