Merge "Import translations. DO NOT MERGE" into klp-dev
diff --git a/res/drawable-xxhdpi/ic_fav_undo_dk.png b/res/drawable-xxhdpi/ic_fav_undo_dk.png
index a37d2bd..4b7dfc4 100644
--- a/res/drawable-xxhdpi/ic_fav_undo_dk.png
+++ b/res/drawable-xxhdpi/ic_fav_undo_dk.png
Binary files differ
diff --git a/res/layout/call_log_list_item_extra.xml b/res/layout/call_log_list_item_extra.xml
index 672abf1..d3f86cf 100644
--- a/res/layout/call_log_list_item_extra.xml
+++ b/res/layout/call_log_list_item_extra.xml
@@ -33,8 +33,8 @@
                   android:layout_height="wrap_content"
                   android:paddingStart="@dimen/call_log_outer_margin"
                   android:paddingEnd="@dimen/call_log_outer_margin"
-                  android:paddingTop="4dip"
-                  android:paddingBottom="4dip"
+                  android:paddingTop="0dip"
+                  android:paddingBottom="0dip"
                   android:background="?android:attr/selectableItemBackground"
                   android:clickable="true">
         <ImageView android:layout_width="wrap_content"
@@ -45,6 +45,14 @@
                   android:layout_height="wrap_content"
                   android:id="@+id/badge_text"
                   android:textColor="@color/dialpad_primary_text_color"
-                  android:layout_gravity="center_vertical"/>
+                  android:layout_gravity="center_vertical"
+                  android:layout_weight="1"/>
+        <ImageView android:id="@+id/dismiss_button"
+                   android:layout_width="wrap_content"
+                   android:layout_height="wrap_content"
+                   android:paddingTop="8dip"
+                   android:src="@drawable/ic_close_dk"
+                   android:background="?android:attr/selectableItemBackground"
+                   android:visibility="gone"/>
     </LinearLayout>
 </FrameLayout>
\ No newline at end of file
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 4bc1787..b2e5206 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -640,7 +640,13 @@
         if (!mIsCallLog) {
             final int numMissed = getNumMissedCalls(callType);
             final ViewStub stub = (ViewStub) view.findViewById(R.id.link_stub);
+
             if (shouldShowBadge(numMissed, info, details)) {
+                // Do not process if the data has not changed (optimization since bind view is
+                // called multiple times due to contact lookup).
+                if (numMissed == mNumMissedCallsShown) {
+                    return;
+                }
 
                 // stub will be null if it was already inflated.
                 if (stub != null) {
@@ -718,11 +724,6 @@
      */
     protected boolean shouldShowBadge(int numMissedCalls, ContactInfo info,
             PhoneCallDetails details) {
-        // Do not process if the data has not changed (optimization since bind view is called
-        // multiple times due to contact lookup).
-        if (numMissedCalls == mNumMissedCallsShown) {
-            return false;
-        }
         return numMissedCalls > 0;
     }
 
diff --git a/src/com/android/dialer/calllog/ContactInfo.java b/src/com/android/dialer/calllog/ContactInfo.java
index 2006744..601f552 100644
--- a/src/com/android/dialer/calllog/ContactInfo.java
+++ b/src/com/android/dialer/calllog/ContactInfo.java
@@ -42,6 +42,8 @@
 
     public static String GEOCODE_AS_LABEL = "";
 
+    public int sourceType = 0;
+
     @Override
     public int hashCode() {
         // Uses only name and contactUri to determine hashcode.
diff --git a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
index cb3d994..14e1bed 100644
--- a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
+++ b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
@@ -118,12 +118,12 @@
             // Check if we already know the name associated with this number.
             String name = names.get(newCall.number);
             if (name == null) {
-                // Look it up in the database.
-                name = mNameLookupQuery.query(newCall.number);
+                name = mPhoneNumberHelper.getDisplayName(newCall.number,
+                        newCall.numberPresentation).toString();
                 // If we cannot lookup the contact, use the number instead.
-                if (name == null) {
-                    name = mPhoneNumberHelper.getDisplayNumber(newCall.number,
-                            newCall.numberPresentation, "").toString();
+                if (TextUtils.isEmpty(name)) {
+                    // Look it up in the database.
+                    name = mNameLookupQuery.query(newCall.number);
                     if (TextUtils.isEmpty(name)) {
                         name = newCall.number;
                     }
diff --git a/src/com/android/dialer/calllog/PhoneNumberHelper.java b/src/com/android/dialer/calllog/PhoneNumberHelper.java
index 9e1d816..336facb 100644
--- a/src/com/android/dialer/calllog/PhoneNumberHelper.java
+++ b/src/com/android/dialer/calllog/PhoneNumberHelper.java
@@ -33,14 +33,7 @@
         mResources = resources;
     }
 
-    /**
-     * Returns the string to display for the given phone number.
-     *
-     * @param number the number to display
-     * @param formattedNumber the formatted number if available, may be null
-     */
-    public CharSequence getDisplayNumber(CharSequence number,
-            int presentation, CharSequence formattedNumber) {
+    /* package */ CharSequence getDisplayName(CharSequence number, int presentation) {
         if (presentation == Calls.PRESENTATION_UNKNOWN) {
             return mResources.getString(R.string.unknown);
         }
@@ -50,12 +43,34 @@
         if (presentation == Calls.PRESENTATION_PAYPHONE) {
             return mResources.getString(R.string.payphone);
         }
-        if (TextUtils.isEmpty(number)) {
-            return "";
-        }
         if (new PhoneNumberUtilsWrapper().isVoicemailNumber(number)) {
             return mResources.getString(R.string.voicemail);
         }
+        if (PhoneNumberUtilsWrapper.isLegacyUnknownNumbers(number)) {
+            return mResources.getString(R.string.unknown);
+        }
+        return "";
+    }
+
+    /**
+     * Returns the string to display for the given phone number.
+     *
+     * @param number the number to display
+     * @param formattedNumber the formatted number if available, may be null
+     */
+    public CharSequence getDisplayNumber(CharSequence number,
+            int presentation, CharSequence formattedNumber) {
+
+        final CharSequence displayName = getDisplayName(number, presentation);
+
+        if (!TextUtils.isEmpty(displayName)) {
+            return displayName;
+        }
+
+        if (TextUtils.isEmpty(number)) {
+            return "";
+        }
+
         if (TextUtils.isEmpty(formattedNumber)) {
             return number;
         } else {
diff --git a/src/com/android/dialer/calllog/PhoneNumberUtilsWrapper.java b/src/com/android/dialer/calllog/PhoneNumberUtilsWrapper.java
index c397f0a..9913c20 100644
--- a/src/com/android/dialer/calllog/PhoneNumberUtilsWrapper.java
+++ b/src/com/android/dialer/calllog/PhoneNumberUtilsWrapper.java
@@ -20,15 +20,21 @@
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 
+import com.google.android.collect.Sets;
+
+import java.util.Set;
+
 /**
  *
  */
 public class PhoneNumberUtilsWrapper {
 
+    private static final Set<String> LEGACY_UNKNOWN_NUMBERS = Sets.newHashSet("-1", "-2", "-3");
+
     /** Returns true if it is possible to place a call to the given number. */
     public static boolean canPlaceCallsTo(CharSequence number, int presentation) {
         return presentation == CallLog.Calls.PRESENTATION_ALLOWED
-            && !TextUtils.isEmpty(number);
+            && !TextUtils.isEmpty(number) && !isLegacyUnknownNumbers(number);
     }
 
     /**
@@ -71,6 +77,13 @@
         if (new PhoneNumberUtilsWrapper().isVoicemailNumber(number)) {
             return false;
         }
+        if (isLegacyUnknownNumbers(number.toString())) {
+            return false;
+        }
         return true;
     }
+
+    public static boolean isLegacyUnknownNumbers(CharSequence number) {
+        return LEGACY_UNKNOWN_NUMBERS.contains(number.toString());
+    }
 }
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index e46a8d3..46364b2 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -807,6 +807,9 @@
     }
 
     private void keyPressed(int keyCode) {
+        if (getView().getTranslationY() != 0) {
+            return;
+        }
         switch (keyCode) {
             case KeyEvent.KEYCODE_1:
                 playTone(ToneGenerator.TONE_DTMF_1, TONE_LENGTH_INFINITE);
diff --git a/src/com/android/dialer/list/RegularSearchFragment.java b/src/com/android/dialer/list/RegularSearchFragment.java
index 21c8c31..9f4e6be 100644
--- a/src/com/android/dialer/list/RegularSearchFragment.java
+++ b/src/com/android/dialer/list/RegularSearchFragment.java
@@ -15,7 +15,11 @@
  */
 package com.android.dialer.list;
 
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+
 import com.android.contacts.common.list.ContactEntryListAdapter;
+import com.android.contacts.common.list.PinnedHeaderListView;
 import com.android.dialerbind.ObjectFactory;
 import com.android.dialer.service.CachedNumberLookupService;
 
@@ -36,6 +40,11 @@
     }
 
     @Override
+    protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
+        super.onCreateView(inflater, container);
+        ((PinnedHeaderListView) getListView()).setScrollToSectionOnHeaderTouch(true);
+    }
+
     protected ContactEntryListAdapter createListAdapter() {
         RegularSearchListAdapter adapter = new RegularSearchListAdapter(getActivity());
         adapter.setDisplayPhotos(true);