Merge "Do not smoothScrollBy(0)"
diff --git a/res/drawable-hdpi/ic_call_arrow.png b/res/drawable-hdpi/ic_call_arrow.png
new file mode 100644
index 0000000..14a33e3
--- /dev/null
+++ b/res/drawable-hdpi/ic_call_arrow.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_call_arrow.png b/res/drawable-mdpi/ic_call_arrow.png
new file mode 100644
index 0000000..169cf29
--- /dev/null
+++ b/res/drawable-mdpi/ic_call_arrow.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_call_arrow.png b/res/drawable-xhdpi/ic_call_arrow.png
new file mode 100644
index 0000000..6f13660
--- /dev/null
+++ b/res/drawable-xhdpi/ic_call_arrow.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_call_arrow.png b/res/drawable-xxhdpi/ic_call_arrow.png
new file mode 100644
index 0000000..0364ee0
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_call_arrow.png
Binary files differ
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index e3b54e1..399294e 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -16,8 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for people (1190841469952343354) -->
-    <skip />
+    <string name="people" msgid="1190841469952343354">"Կոնտակտներ"</string>
     <string name="contactsList" msgid="8661624236494819731">"Կոնտակտներ"</string>
     <string name="shortcutContact" msgid="749243779392912958">"Կոնտակտ"</string>
     <string name="shortcutDialContact" msgid="746622101599186779">"Ուղիղ համարհավաքում"</string>
@@ -65,8 +64,7 @@
     <string name="readOnlyContactDeleteConfirmation" msgid="2137170726670196909">"Այս կոնտակտը պարունակում է տվյալներմի քանի հաշվիներից: Միայն ընթերցելի հաշիվներից տվյալները կթաքցվեն ձեր կոնտակների ցանկից, չեն ջնջվի:"</string>
     <string name="multipleContactDeleteConfirmation" msgid="938900978442960800">"Այս կոնտակտը ջնջելիս տվյալները ևս մի քանի հաշիվներից կջնջվեն:"</string>
     <string name="deleteConfirmation" msgid="811706994761610640">"Այս կոնտակտը կջնջվի:"</string>
-    <!-- no translation found for menu_discard (6854657936970228164) -->
-    <skip />
+    <string name="menu_discard" msgid="6854657936970228164">"Հրաժարվել փոփոխություններից"</string>
     <string name="invalidContactMessage" msgid="8215051456181842274">"Կոնտակտը գոյություն չունի:"</string>
     <string name="createContactShortcutSuccessful" msgid="7874133287558150877">"Կոնտակտի վիջեթը ավելացվեց Գլխավոր էկրանին:"</string>
     <string name="pickerNewContactHeader" msgid="7750705279843568147">"Ստեղծել նոր կոնտակտ"</string>
@@ -214,8 +212,7 @@
     <string name="local_profile_title" msgid="2021416826991393684">"Իմ տեղային պրոֆիլը"</string>
     <string name="external_profile_title" msgid="8034998767621359438">"Իմ <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g> պրոֆիլը"</string>
     <string name="toast_displaying_all_contacts" msgid="2737388783898593875">"Ցուցադրվում են բոլոր կոնտակտները"</string>
-    <!-- no translation found for no_account_prompt (6424883302325061025) -->
-    <skip />
+    <string name="no_account_prompt" msgid="6424883302325061025">"Կոնտակտների հավելվածն ավելի լավ է աշխատում Google հաշվի հետ:\n\n• Մուտք գործեք ցանկացած վեբ դիտարկչով:\n• Պահուստավորեք ձեր կոնտակտներն ապահով ճանապարհով:"</string>
     <string name="generic_no_account_prompt" msgid="7218827704367325460">"Պահեք ձեր կոնտակտները ապահով, նույնիսկ եթե կորցնեք ձեր հեռախոսը. համաժամեցրեք առցանց ծառայության հետ:"</string>
     <string name="generic_no_account_prompt_title" msgid="753783911899054860">"Ավելացնել հաշիվ"</string>
     <string name="contact_editor_prompt_zero_accounts" msgid="1785345895691886499">"Ձեր նոր կոնտակտը չի պահուստավորվի: Ավելացնե՞լ հաշիվ, որն առցանց է պահուստավորում կոնտակտները:"</string>
@@ -226,34 +223,19 @@
     <string name="add_new_account" msgid="5748627740680940264">"Ավելացնել նոր հաշիվ"</string>
     <string name="menu_export_database" msgid="2659719297530170820">"Արտահանել տվյալների շտեմարանի ֆայլերը"</string>
     <string name="contact_detail_picture_description" msgid="6083230522651287030">"Նկար: Ընտրեք՝ փոխելու համար"</string>
-    <!-- no translation found for action_menu_add_new_contact_button (3180222523336380017) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_more (3779194067124758079) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_less (5344160551629714168) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_all (3845258737661412627) -->
-    <skip />
-    <!-- no translation found for communication_card_title (7842656156852232185) -->
-    <skip />
-    <!-- no translation found for recent_card_title (8982782042698001695) -->
-    <skip />
-    <!-- no translation found for send_message (8938418965550543196) -->
-    <skip />
-    <!-- no translation found for toast_making_personal_copy (6137651078366797938) -->
-    <skip />
-    <!-- no translation found for yesterday (6840858548955018569) -->
-    <skip />
-    <!-- no translation found for tomorrow (6241969467795308581) -->
-    <skip />
-    <!-- no translation found for today (8041090779381781781) -->
-    <skip />
-    <!-- no translation found for today_at_time_fmt (605665249491030460) -->
-    <skip />
-    <!-- no translation found for tomorrow_at_time_fmt (4856497969617819421) -->
-    <skip />
-    <!-- no translation found for date_time_fmt (5053178726906863812) -->
-    <skip />
-    <!-- no translation found for untitled_event (3484859385405939366) -->
-    <skip />
+    <string name="action_menu_add_new_contact_button" msgid="3180222523336380017">"ավելացնել նոր կոնտակտ"</string>
+    <string name="expanding_entry_card_view_see_more" msgid="3779194067124758079">"Տեսնել ավելին"</string>
+    <string name="expanding_entry_card_view_see_less" msgid="5344160551629714168">"Տեսնել պակաս"</string>
+    <string name="expanding_entry_card_view_see_all" msgid="3845258737661412627">"Տեսնել բոլորը"</string>
+    <string name="communication_card_title" msgid="7842656156852232185">"Կոնտակտ"</string>
+    <string name="recent_card_title" msgid="8982782042698001695">"Վերջին գործողությունները"</string>
+    <string name="send_message" msgid="8938418965550543196">"Ուղարկել հաղորդագրություն"</string>
+    <string name="toast_making_personal_copy" msgid="6137651078366797938">"Ստեղծվում է անձնական պատճենը..."</string>
+    <string name="yesterday" msgid="6840858548955018569">"Երեկ"</string>
+    <string name="tomorrow" msgid="6241969467795308581">"Վաղը"</string>
+    <string name="today" msgid="8041090779381781781">"Այսօր"</string>
+    <string name="today_at_time_fmt" msgid="605665249491030460">"Այսօր՝ <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="tomorrow_at_time_fmt" msgid="4856497969617819421">"Վաղը՝ <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="date_time_fmt" msgid="5053178726906863812">"<xliff:g id="DATE">%s</xliff:g>, <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="untitled_event" msgid="3484859385405939366">"(Անվերնագիր միջոցառում)"</string>
 </resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 54fc188..4d8009d 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -16,8 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for people (1190841469952343354) -->
-    <skip />
+    <string name="people" msgid="1190841469952343354">"კონტაქტები"</string>
     <string name="contactsList" msgid="8661624236494819731">"კონტაქტები"</string>
     <string name="shortcutContact" msgid="749243779392912958">"კონტაქტი"</string>
     <string name="shortcutDialContact" msgid="746622101599186779">"სწრაფი დარეკვა"</string>
@@ -65,8 +64,7 @@
     <string name="readOnlyContactDeleteConfirmation" msgid="2137170726670196909">"ეს კონტაქტი შეიცავს ინფორმაციას სხვადასხვა ანგარიშებიდან. ინფორმაცია მხოლოდ კითხვადი ანგარიშებიდან არ წაიშლება, არამედ დაიმალება კონტაქტების სიაში."</string>
     <string name="multipleContactDeleteConfirmation" msgid="938900978442960800">"ამ კონტაქტის წაშლით წაიშლება ინფორმაცია რამდენიმე ანგარიშიდან."</string>
     <string name="deleteConfirmation" msgid="811706994761610640">"ეს კონტაქტი წაიშლება."</string>
-    <!-- no translation found for menu_discard (6854657936970228164) -->
-    <skip />
+    <string name="menu_discard" msgid="6854657936970228164">"ცვლილებების გაუქმება"</string>
     <string name="invalidContactMessage" msgid="8215051456181842274">"კონტაქტი არ არსებობს."</string>
     <string name="createContactShortcutSuccessful" msgid="7874133287558150877">"მთავარ ეკრანს დაემატა კონტაქტების ვიჯეტი."</string>
     <string name="pickerNewContactHeader" msgid="7750705279843568147">"ახალი კონტაქტის შექმნა"</string>
@@ -214,8 +212,7 @@
     <string name="local_profile_title" msgid="2021416826991393684">"ჩემი ადგილობრივი პროფილი"</string>
     <string name="external_profile_title" msgid="8034998767621359438">"ჩემი <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g> პროფილი"</string>
     <string name="toast_displaying_all_contacts" msgid="2737388783898593875">"ყველა კონტაქტის ჩვენება"</string>
-    <!-- no translation found for no_account_prompt (6424883302325061025) -->
-    <skip />
+    <string name="no_account_prompt" msgid="6424883302325061025">"კონტაქტები Google ანგარიშთან ერთად უკეთ მუშაობს.\n\n• იქონიეთ წვდომა ნებისმიერი ვებ-ბრაუზერიდან.\n• Back up your contacts securely."</string>
     <string name="generic_no_account_prompt" msgid="7218827704367325460">"შეინახეთ თქვენი კონტაქტები საიმედოდ ტელეფონის დაკარგვის შემთხვევაშიც კი: მოახდინეთ სინქრონიზაცია ონლაინ სერვისთან."</string>
     <string name="generic_no_account_prompt_title" msgid="753783911899054860">"ანგარიშის დამატება"</string>
     <string name="contact_editor_prompt_zero_accounts" msgid="1785345895691886499">"თქვენი ახალი კონტაქტი არ დამარქაფდება. გსურთ ანგარიშის დამატება, რომელიც დაამარქაფებს კონტაქტებს ონლაინ?"</string>
@@ -226,34 +223,19 @@
     <string name="add_new_account" msgid="5748627740680940264">"ახალი ანგარიშის დამატება"</string>
     <string name="menu_export_database" msgid="2659719297530170820">"მონაცემთა ბაზის ფაილების ექსპორტი"</string>
     <string name="contact_detail_picture_description" msgid="6083230522651287030">"სურათი. მონიშნეთ შესაცვლელად"</string>
-    <!-- no translation found for action_menu_add_new_contact_button (3180222523336380017) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_more (3779194067124758079) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_less (5344160551629714168) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_all (3845258737661412627) -->
-    <skip />
-    <!-- no translation found for communication_card_title (7842656156852232185) -->
-    <skip />
-    <!-- no translation found for recent_card_title (8982782042698001695) -->
-    <skip />
-    <!-- no translation found for send_message (8938418965550543196) -->
-    <skip />
-    <!-- no translation found for toast_making_personal_copy (6137651078366797938) -->
-    <skip />
-    <!-- no translation found for yesterday (6840858548955018569) -->
-    <skip />
-    <!-- no translation found for tomorrow (6241969467795308581) -->
-    <skip />
-    <!-- no translation found for today (8041090779381781781) -->
-    <skip />
-    <!-- no translation found for today_at_time_fmt (605665249491030460) -->
-    <skip />
-    <!-- no translation found for tomorrow_at_time_fmt (4856497969617819421) -->
-    <skip />
-    <!-- no translation found for date_time_fmt (5053178726906863812) -->
-    <skip />
-    <!-- no translation found for untitled_event (3484859385405939366) -->
-    <skip />
+    <string name="action_menu_add_new_contact_button" msgid="3180222523336380017">"ახალი კონტაქტის დამატება"</string>
+    <string name="expanding_entry_card_view_see_more" msgid="3779194067124758079">"იხილე მეტი"</string>
+    <string name="expanding_entry_card_view_see_less" msgid="5344160551629714168">"ნაკლების ჩვენება"</string>
+    <string name="expanding_entry_card_view_see_all" msgid="3845258737661412627">"ყველას ჩვენება"</string>
+    <string name="communication_card_title" msgid="7842656156852232185">"კონტაქტი"</string>
+    <string name="recent_card_title" msgid="8982782042698001695">"ბოლო"</string>
+    <string name="send_message" msgid="8938418965550543196">"შეტყობინების გაგზავნა"</string>
+    <string name="toast_making_personal_copy" msgid="6137651078366797938">"იქმნება პერსონალური ასლი..."</string>
+    <string name="yesterday" msgid="6840858548955018569">"გუშინ"</string>
+    <string name="tomorrow" msgid="6241969467795308581">"ხვალ"</string>
+    <string name="today" msgid="8041090779381781781">"დღეს"</string>
+    <string name="today_at_time_fmt" msgid="605665249491030460">"დღეს <xliff:g id="TIME_INTERVAL">%s</xliff:g>-ზე"</string>
+    <string name="tomorrow_at_time_fmt" msgid="4856497969617819421">"ხვალ <xliff:g id="TIME_INTERVAL">%s</xliff:g>-ზე"</string>
+    <string name="date_time_fmt" msgid="5053178726906863812">"<xliff:g id="DATE">%s</xliff:g>, <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="untitled_event" msgid="3484859385405939366">"(უსათაურო მოვლენა)"</string>
 </resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index fc74be4..e1aabf8 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -16,8 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for people (1190841469952343354) -->
-    <skip />
+    <string name="people" msgid="1190841469952343354">"Kenalan"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kenalan"</string>
     <string name="shortcutContact" msgid="749243779392912958">"Kenalan"</string>
     <string name="shortcutDialContact" msgid="746622101599186779">"Dail terus"</string>
@@ -65,8 +64,7 @@
     <string name="readOnlyContactDeleteConfirmation" msgid="2137170726670196909">"Kenalan ini mengandungi maklumat daripada berbilang akaun. Maklumat daripada akaun baca sahaja akan disembunyikan dalam senarai kenalan anda, dan bukannya dipadamkan."</string>
     <string name="multipleContactDeleteConfirmation" msgid="938900978442960800">"Pemadaman kenalan ini akan turut memadamkan maklumat daripada berbilang akaun."</string>
     <string name="deleteConfirmation" msgid="811706994761610640">"Kenalan ini akan dipadamkan."</string>
-    <!-- no translation found for menu_discard (6854657936970228164) -->
-    <skip />
+    <string name="menu_discard" msgid="6854657936970228164">"Buang perubahan"</string>
     <string name="invalidContactMessage" msgid="8215051456181842274">"Kenalan tidak wujud."</string>
     <string name="createContactShortcutSuccessful" msgid="7874133287558150877">"Widget kenalan telah ditambahkan ke skrin Utama."</string>
     <string name="pickerNewContactHeader" msgid="7750705279843568147">"Wujudkan kenalan baru"</string>
@@ -214,8 +212,7 @@
     <string name="local_profile_title" msgid="2021416826991393684">"Profil setempat saya"</string>
     <string name="external_profile_title" msgid="8034998767621359438">"Profil <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g> saya"</string>
     <string name="toast_displaying_all_contacts" msgid="2737388783898593875">"Memaparkan semua kenalan"</string>
-    <!-- no translation found for no_account_prompt (6424883302325061025) -->
-    <skip />
+    <string name="no_account_prompt" msgid="6424883302325061025">"Kenalan berfungsi lebih baik dengan Akaun Google.\n\n• Akses dari mana-mana penyemak imbas web.\n• Buat sandaran untuk kenalan anda secara selamat."</string>
     <string name="generic_no_account_prompt" msgid="7218827704367325460">"Pastikan kenalan anda selamat walaupun jika anda kehilangan telefon anda: segerakkan dengan perkhidmatan dalam talian."</string>
     <string name="generic_no_account_prompt_title" msgid="753783911899054860">"Tambah akaun"</string>
     <string name="contact_editor_prompt_zero_accounts" msgid="1785345895691886499">"Kenalan baharu anda tidak akan dibuat sandaran. Tambahkan akaun yang membuat sandaran kenalan dalam talian?"</string>
@@ -226,34 +223,19 @@
     <string name="add_new_account" msgid="5748627740680940264">"Tambah akaun baharu"</string>
     <string name="menu_export_database" msgid="2659719297530170820">"Eksport fail pangkalan data"</string>
     <string name="contact_detail_picture_description" msgid="6083230522651287030">"Gambar. Pilih untuk menukar"</string>
-    <!-- no translation found for action_menu_add_new_contact_button (3180222523336380017) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_more (3779194067124758079) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_less (5344160551629714168) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_all (3845258737661412627) -->
-    <skip />
-    <!-- no translation found for communication_card_title (7842656156852232185) -->
-    <skip />
-    <!-- no translation found for recent_card_title (8982782042698001695) -->
-    <skip />
-    <!-- no translation found for send_message (8938418965550543196) -->
-    <skip />
-    <!-- no translation found for toast_making_personal_copy (6137651078366797938) -->
-    <skip />
-    <!-- no translation found for yesterday (6840858548955018569) -->
-    <skip />
-    <!-- no translation found for tomorrow (6241969467795308581) -->
-    <skip />
-    <!-- no translation found for today (8041090779381781781) -->
-    <skip />
-    <!-- no translation found for today_at_time_fmt (605665249491030460) -->
-    <skip />
-    <!-- no translation found for tomorrow_at_time_fmt (4856497969617819421) -->
-    <skip />
-    <!-- no translation found for date_time_fmt (5053178726906863812) -->
-    <skip />
-    <!-- no translation found for untitled_event (3484859385405939366) -->
-    <skip />
+    <string name="action_menu_add_new_contact_button" msgid="3180222523336380017">"tambah kenalan baharu"</string>
+    <string name="expanding_entry_card_view_see_more" msgid="3779194067124758079">"Lihat lagi"</string>
+    <string name="expanding_entry_card_view_see_less" msgid="5344160551629714168">"Lihat sedikit"</string>
+    <string name="expanding_entry_card_view_see_all" msgid="3845258737661412627">"Lihat semua"</string>
+    <string name="communication_card_title" msgid="7842656156852232185">"Kenalan"</string>
+    <string name="recent_card_title" msgid="8982782042698001695">"Terbaharu"</string>
+    <string name="send_message" msgid="8938418965550543196">"Hantar mesej"</string>
+    <string name="toast_making_personal_copy" msgid="6137651078366797938">"Membuat salinan peribadi..."</string>
+    <string name="yesterday" msgid="6840858548955018569">"Semalam"</string>
+    <string name="tomorrow" msgid="6241969467795308581">"Esok"</string>
+    <string name="today" msgid="8041090779381781781">"Hari ini"</string>
+    <string name="today_at_time_fmt" msgid="605665249491030460">"Hari ini pada <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="tomorrow_at_time_fmt" msgid="4856497969617819421">"Esok pada <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="date_time_fmt" msgid="5053178726906863812">"<xliff:g id="DATE">%s</xliff:g>, <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="untitled_event" msgid="3484859385405939366">"(Acara tidak bertajuk)"</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 1620e48..53f1b07 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -16,8 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for people (1190841469952343354) -->
-    <skip />
+    <string name="people" msgid="1190841469952343354">"Contatos"</string>
     <string name="contactsList" msgid="8661624236494819731">"Contatos"</string>
     <string name="shortcutContact" msgid="749243779392912958">"Contato"</string>
     <string name="shortcutDialContact" msgid="746622101599186779">"Discagem direta"</string>
@@ -65,8 +64,7 @@
     <string name="readOnlyContactDeleteConfirmation" msgid="2137170726670196909">"Este contato contém informações de diversas contas. As informações de contas somente de leitura ficarão ocultas nas suas listas de contatos, mas não serão excluídas."</string>
     <string name="multipleContactDeleteConfirmation" msgid="938900978442960800">"Excluir este contato irá excluir informações de várias contas."</string>
     <string name="deleteConfirmation" msgid="811706994761610640">"Este contato será excluído."</string>
-    <!-- no translation found for menu_discard (6854657936970228164) -->
-    <skip />
+    <string name="menu_discard" msgid="6854657936970228164">"Descartar alterações"</string>
     <string name="invalidContactMessage" msgid="8215051456181842274">"O contato não existe."</string>
     <string name="createContactShortcutSuccessful" msgid="7874133287558150877">"Widget Contato adicionado à tela inicial."</string>
     <string name="pickerNewContactHeader" msgid="7750705279843568147">"Criar novo contato"</string>
@@ -214,8 +212,7 @@
     <string name="local_profile_title" msgid="2021416826991393684">"Meu perfil local"</string>
     <string name="external_profile_title" msgid="8034998767621359438">"Meu perfil <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g>"</string>
     <string name="toast_displaying_all_contacts" msgid="2737388783898593875">"Exibindo todos os contatos"</string>
-    <!-- no translation found for no_account_prompt (6424883302325061025) -->
-    <skip />
+    <string name="no_account_prompt" msgid="6424883302325061025">"Contatos funciona melhor com uma conta do Google.\n\n• Acesse-o a partir de qualquer navegador da web.\n• Faça backup de seus contatos com segurança."</string>
     <string name="generic_no_account_prompt" msgid="7218827704367325460">"Mantenha seus contatos seguros, mesmo se você perder seu telefone: sincronize com um serviço on-line."</string>
     <string name="generic_no_account_prompt_title" msgid="753783911899054860">"Adicionar uma conta"</string>
     <string name="contact_editor_prompt_zero_accounts" msgid="1785345895691886499">"Não será possível fazer backup de seu novo contato. Deseja adicionar uma conta que faça backup de contatos on-line?"</string>
@@ -226,34 +223,19 @@
     <string name="add_new_account" msgid="5748627740680940264">"Adicionar nova conta"</string>
     <string name="menu_export_database" msgid="2659719297530170820">"Exportar arquivos do banco de dados"</string>
     <string name="contact_detail_picture_description" msgid="6083230522651287030">"Imagem. Selecione para alterar"</string>
-    <!-- no translation found for action_menu_add_new_contact_button (3180222523336380017) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_more (3779194067124758079) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_less (5344160551629714168) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_all (3845258737661412627) -->
-    <skip />
-    <!-- no translation found for communication_card_title (7842656156852232185) -->
-    <skip />
-    <!-- no translation found for recent_card_title (8982782042698001695) -->
-    <skip />
-    <!-- no translation found for send_message (8938418965550543196) -->
-    <skip />
-    <!-- no translation found for toast_making_personal_copy (6137651078366797938) -->
-    <skip />
-    <!-- no translation found for yesterday (6840858548955018569) -->
-    <skip />
-    <!-- no translation found for tomorrow (6241969467795308581) -->
-    <skip />
-    <!-- no translation found for today (8041090779381781781) -->
-    <skip />
-    <!-- no translation found for today_at_time_fmt (605665249491030460) -->
-    <skip />
-    <!-- no translation found for tomorrow_at_time_fmt (4856497969617819421) -->
-    <skip />
-    <!-- no translation found for date_time_fmt (5053178726906863812) -->
-    <skip />
-    <!-- no translation found for untitled_event (3484859385405939366) -->
-    <skip />
+    <string name="action_menu_add_new_contact_button" msgid="3180222523336380017">"adicionar novo contato"</string>
+    <string name="expanding_entry_card_view_see_more" msgid="3779194067124758079">"Ver mais"</string>
+    <string name="expanding_entry_card_view_see_less" msgid="5344160551629714168">"Ver menos"</string>
+    <string name="expanding_entry_card_view_see_all" msgid="3845258737661412627">"Ver tudo"</string>
+    <string name="communication_card_title" msgid="7842656156852232185">"Contato"</string>
+    <string name="recent_card_title" msgid="8982782042698001695">"Recente"</string>
+    <string name="send_message" msgid="8938418965550543196">"Enviar mensagem"</string>
+    <string name="toast_making_personal_copy" msgid="6137651078366797938">"Criando uma cópia pessoal..."</string>
+    <string name="yesterday" msgid="6840858548955018569">"Ontem"</string>
+    <string name="tomorrow" msgid="6241969467795308581">"Amanhã"</string>
+    <string name="today" msgid="8041090779381781781">"Hoje"</string>
+    <string name="today_at_time_fmt" msgid="605665249491030460">"Hoje, às <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="tomorrow_at_time_fmt" msgid="4856497969617819421">"Amanhã, às <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="date_time_fmt" msgid="5053178726906863812">"<xliff:g id="DATE">%s</xliff:g>, <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="untitled_event" msgid="3484859385405939366">"(Evento sem título)"</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 5a4e02f..ea8cd6a 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -16,8 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for people (1190841469952343354) -->
-    <skip />
+    <string name="people" msgid="1190841469952343354">"Agendă"</string>
     <string name="contactsList" msgid="8661624236494819731">"Agendă"</string>
     <string name="shortcutContact" msgid="749243779392912958">"Persoană din Agendă"</string>
     <string name="shortcutDialContact" msgid="746622101599186779">"Apel direct"</string>
@@ -65,8 +64,7 @@
     <string name="readOnlyContactDeleteConfirmation" msgid="2137170726670196909">"Informaţiile despre această persoană din agendă provin din mai multe conturi. Informaţiile provenite din conturile numai în citire nu vor fi şterse din lista dvs., ci doar ascunse."</string>
     <string name="multipleContactDeleteConfirmation" msgid="938900978442960800">"Ștergerea acestei persoane din agendă va elimina informaţii din mai multe conturi."</string>
     <string name="deleteConfirmation" msgid="811706994761610640">"Această persoană va fi ştearsă din agendă."</string>
-    <!-- no translation found for menu_discard (6854657936970228164) -->
-    <skip />
+    <string name="menu_discard" msgid="6854657936970228164">"Renunțați la modificări"</string>
     <string name="invalidContactMessage" msgid="8215051456181842274">"Persoana nu există în agendă."</string>
     <string name="createContactShortcutSuccessful" msgid="7874133287558150877">"Widgetul Agendă a fost adăugat la ecranul de pornire."</string>
     <string name="pickerNewContactHeader" msgid="7750705279843568147">"Creaţi o persoană nouă în agendă"</string>
@@ -214,8 +212,7 @@
     <string name="local_profile_title" msgid="2021416826991393684">"Profilul meu local"</string>
     <string name="external_profile_title" msgid="8034998767621359438">"Profilul meu <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g>"</string>
     <string name="toast_displaying_all_contacts" msgid="2737388783898593875">"Se afişează toată agenda"</string>
-    <!-- no translation found for no_account_prompt (6424883302325061025) -->
-    <skip />
+    <string name="no_account_prompt" msgid="6424883302325061025">"Agenda funcționează mai bine cu un Cont Google.\n\n• O puteți accesa din orice browser web.\n• Creați în siguranță backup pentru persoanele de contact."</string>
     <string name="generic_no_account_prompt" msgid="7218827704367325460">"Păstraţi agenda dvs. în condiţii de siguranţă, chiar dacă pierdeţi telefonul, prin sincronizarea acesteia cu un serviciu online."</string>
     <string name="generic_no_account_prompt_title" msgid="753783911899054860">"Adăugaţi un cont"</string>
     <string name="contact_editor_prompt_zero_accounts" msgid="1785345895691886499">"Pentru noul contact nu se va crea o copie de rezervă. Adăugați un cont care creează online copii de rezervă pentru contacte?"</string>
@@ -226,34 +223,19 @@
     <string name="add_new_account" msgid="5748627740680940264">"Adăugaţi un cont nou"</string>
     <string name="menu_export_database" msgid="2659719297530170820">"Exportaţi fişierele bazei de date"</string>
     <string name="contact_detail_picture_description" msgid="6083230522651287030">"Fotografie. Selectați pentru a schimba."</string>
-    <!-- no translation found for action_menu_add_new_contact_button (3180222523336380017) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_more (3779194067124758079) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_less (5344160551629714168) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_all (3845258737661412627) -->
-    <skip />
-    <!-- no translation found for communication_card_title (7842656156852232185) -->
-    <skip />
-    <!-- no translation found for recent_card_title (8982782042698001695) -->
-    <skip />
-    <!-- no translation found for send_message (8938418965550543196) -->
-    <skip />
-    <!-- no translation found for toast_making_personal_copy (6137651078366797938) -->
-    <skip />
-    <!-- no translation found for yesterday (6840858548955018569) -->
-    <skip />
-    <!-- no translation found for tomorrow (6241969467795308581) -->
-    <skip />
-    <!-- no translation found for today (8041090779381781781) -->
-    <skip />
-    <!-- no translation found for today_at_time_fmt (605665249491030460) -->
-    <skip />
-    <!-- no translation found for tomorrow_at_time_fmt (4856497969617819421) -->
-    <skip />
-    <!-- no translation found for date_time_fmt (5053178726906863812) -->
-    <skip />
-    <!-- no translation found for untitled_event (3484859385405939366) -->
-    <skip />
+    <string name="action_menu_add_new_contact_button" msgid="3180222523336380017">"adăugați o persoană de contact nouă"</string>
+    <string name="expanding_entry_card_view_see_more" msgid="3779194067124758079">"Mai multe detalii"</string>
+    <string name="expanding_entry_card_view_see_less" msgid="5344160551629714168">"Mai puține detalii"</string>
+    <string name="expanding_entry_card_view_see_all" msgid="3845258737661412627">"Vedeți tot"</string>
+    <string name="communication_card_title" msgid="7842656156852232185">"Contact"</string>
+    <string name="recent_card_title" msgid="8982782042698001695">"Recente"</string>
+    <string name="send_message" msgid="8938418965550543196">"Trimiteți mesajul"</string>
+    <string name="toast_making_personal_copy" msgid="6137651078366797938">"Se creează o copie personală..."</string>
+    <string name="yesterday" msgid="6840858548955018569">"Ieri"</string>
+    <string name="tomorrow" msgid="6241969467795308581">"Mâine"</string>
+    <string name="today" msgid="8041090779381781781">"Astăzi"</string>
+    <string name="today_at_time_fmt" msgid="605665249491030460">"Astăzi, la <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="tomorrow_at_time_fmt" msgid="4856497969617819421">"Mâine, la <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="date_time_fmt" msgid="5053178726906863812">"<xliff:g id="DATE">%s</xliff:g>, <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="untitled_event" msgid="3484859385405939366">"(Eveniment fără titlu)"</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 286e303..488d42a 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -16,8 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for people (1190841469952343354) -->
-    <skip />
+    <string name="people" msgid="1190841469952343354">"联系人"</string>
     <string name="contactsList" msgid="8661624236494819731">"联系人"</string>
     <string name="shortcutContact" msgid="749243779392912958">"联系人"</string>
     <string name="shortcutDialContact" msgid="746622101599186779">"直接拨打电话"</string>
@@ -65,8 +64,7 @@
     <string name="readOnlyContactDeleteConfirmation" msgid="2137170726670196909">"该联系人的信息中包含来自多个帐户的信息。来自只读帐户的信息将在您的联系人列表中隐藏,但不会删除。"</string>
     <string name="multipleContactDeleteConfirmation" msgid="938900978442960800">"删除该联系人将会删除多个帐户中的信息。"</string>
     <string name="deleteConfirmation" msgid="811706994761610640">"将会删除此联系人。"</string>
-    <!-- no translation found for menu_discard (6854657936970228164) -->
-    <skip />
+    <string name="menu_discard" msgid="6854657936970228164">"舍弃更改"</string>
     <string name="invalidContactMessage" msgid="8215051456181842274">"该联系人不存在。"</string>
     <string name="createContactShortcutSuccessful" msgid="7874133287558150877">"联系人小部件已添加到主屏幕。"</string>
     <string name="pickerNewContactHeader" msgid="7750705279843568147">"新建联系人"</string>
@@ -214,8 +212,7 @@
     <string name="local_profile_title" msgid="2021416826991393684">"我的本地个人资料"</string>
     <string name="external_profile_title" msgid="8034998767621359438">"我的<xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g>个人资料"</string>
     <string name="toast_displaying_all_contacts" msgid="2737388783898593875">"显示所有联系人"</string>
-    <!-- no translation found for no_account_prompt (6424883302325061025) -->
-    <skip />
+    <string name="no_account_prompt" msgid="6424883302325061025">"登录Google帐户可获取更棒的“联系人”应用体验。\n\n• 可通过任意浏览器访问。\n• 安全妥善地备份您的联系人数据。"</string>
     <string name="generic_no_account_prompt" msgid="7218827704367325460">"即使手机丢了,也能确保您的联系人信息的安全性:与在线服务同步。"</string>
     <string name="generic_no_account_prompt_title" msgid="753783911899054860">"添加帐户"</string>
     <string name="contact_editor_prompt_zero_accounts" msgid="1785345895691886499">"系统不会备份您的新联系人。要添加用于在线备份联系人的帐户吗?"</string>
@@ -226,34 +223,19 @@
     <string name="add_new_account" msgid="5748627740680940264">"添加新帐户"</string>
     <string name="menu_export_database" msgid="2659719297530170820">"导出数据库文件"</string>
     <string name="contact_detail_picture_description" msgid="6083230522651287030">"照片(选择即可更换)"</string>
-    <!-- no translation found for action_menu_add_new_contact_button (3180222523336380017) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_more (3779194067124758079) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_less (5344160551629714168) -->
-    <skip />
-    <!-- no translation found for expanding_entry_card_view_see_all (3845258737661412627) -->
-    <skip />
-    <!-- no translation found for communication_card_title (7842656156852232185) -->
-    <skip />
-    <!-- no translation found for recent_card_title (8982782042698001695) -->
-    <skip />
-    <!-- no translation found for send_message (8938418965550543196) -->
-    <skip />
-    <!-- no translation found for toast_making_personal_copy (6137651078366797938) -->
-    <skip />
-    <!-- no translation found for yesterday (6840858548955018569) -->
-    <skip />
-    <!-- no translation found for tomorrow (6241969467795308581) -->
-    <skip />
-    <!-- no translation found for today (8041090779381781781) -->
-    <skip />
-    <!-- no translation found for today_at_time_fmt (605665249491030460) -->
-    <skip />
-    <!-- no translation found for tomorrow_at_time_fmt (4856497969617819421) -->
-    <skip />
-    <!-- no translation found for date_time_fmt (5053178726906863812) -->
-    <skip />
-    <!-- no translation found for untitled_event (3484859385405939366) -->
-    <skip />
+    <string name="action_menu_add_new_contact_button" msgid="3180222523336380017">"添加新联系人"</string>
+    <string name="expanding_entry_card_view_see_more" msgid="3779194067124758079">"查看更多"</string>
+    <string name="expanding_entry_card_view_see_less" msgid="5344160551629714168">"隐藏部分"</string>
+    <string name="expanding_entry_card_view_see_all" msgid="3845258737661412627">"查看全部"</string>
+    <string name="communication_card_title" msgid="7842656156852232185">"联系"</string>
+    <string name="recent_card_title" msgid="8982782042698001695">"最近"</string>
+    <string name="send_message" msgid="8938418965550543196">"发送短信"</string>
+    <string name="toast_making_personal_copy" msgid="6137651078366797938">"正在创建个人副本…"</string>
+    <string name="yesterday" msgid="6840858548955018569">"昨天"</string>
+    <string name="tomorrow" msgid="6241969467795308581">"明天"</string>
+    <string name="today" msgid="8041090779381781781">"今天"</string>
+    <string name="today_at_time_fmt" msgid="605665249491030460">"今天<xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="tomorrow_at_time_fmt" msgid="4856497969617819421">"明天<xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="date_time_fmt" msgid="5053178726906863812">"<xliff:g id="DATE">%s</xliff:g>,<xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
+    <string name="untitled_event" msgid="3484859385405939366">"(未命名的活动)"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index e39ee6f..795163d 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -212,7 +212,7 @@
     <string name="local_profile_title" msgid="2021416826991393684">"我的本機個人資料"</string>
     <string name="external_profile_title" msgid="8034998767621359438">"我的 <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g> 個人資料"</string>
     <string name="toast_displaying_all_contacts" msgid="2737388783898593875">"顯示所有聯絡人"</string>
-    <string name="no_account_prompt" msgid="6424883302325061025">"聯絡人與 Google 帳戶搭配使用的效能更優異。\n\n• 透過任何網絡瀏覽器皆可存取。\n• 安全備份您的聯絡人。"</string>
+    <string name="no_account_prompt" msgid="6424883302325061025">"聯絡人與 Google 帳戶搭配使用的效能更卓越。\n\n• 透過任何網絡瀏覽器皆可存取。\n• 安全備份您的聯絡人。"</string>
     <string name="generic_no_account_prompt" msgid="7218827704367325460">"即使丟失手機,也要確保通訊錄安全:與網上服務保持同步。"</string>
     <string name="generic_no_account_prompt_title" msgid="753783911899054860">"新增帳戶"</string>
     <string name="contact_editor_prompt_zero_accounts" msgid="1785345895691886499">"您的新聯絡人資料不會備份。要新增可在網上備份聯絡人資料的帳戶嗎?"</string>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 0f5997b..962fe97 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -49,4 +49,7 @@
 
     <!-- Color of the margin for cards -->
     <color name="card_margin_color">#ffbbbbbb</color>
+
+    <color name="call_arrow_green">#2aad6f</color>
+    <color name="call_arrow_red">#ff2e58</color>
 </resources>
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index bfb661d..db20540 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -1030,17 +1030,16 @@
             }
             case R.id.menu_settings: {
                 final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
-                // as there is only one section right now, make sure it is selected
-                // on small screens, this also hides the section selector
-                // Due to b/5045558, this code unfortunately only works properly on phones
-                boolean settingsAreMultiPane = getResources().getBoolean(
-                        com.android.internal.R.bool.preferences_prefer_dual_pane);
-                if (!settingsAreMultiPane) {
-                    intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT,
-                            DisplayOptionsPreferenceFragment.class.getName());
-                    intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_TITLE,
-                            R.string.activity_title_settings);
-                }
+                // Since there is only one section right now, make sure it is selected on
+                // small screens.
+                intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT,
+                        DisplayOptionsPreferenceFragment.class.getName());
+                // By default, the title of the activity should be equivalent to the fragment
+                // title. We set this argument to avoid this. Because of a bug, the following
+                // line isn't necessary. But, once the bug is fixed this may become necessary.
+                // b/5045558 refers to this issue, as well as another.
+                intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_TITLE,
+                        R.string.activity_title_settings);
                 startActivity(intent);
                 return true;
             }
diff --git a/src/com/android/contacts/interactions/CallLogInteraction.java b/src/com/android/contacts/interactions/CallLogInteraction.java
new file mode 100644
index 0000000..8607974
--- /dev/null
+++ b/src/com/android/contacts/interactions/CallLogInteraction.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts.interactions;
+
+import com.android.contacts.R;
+import com.android.contacts.common.util.BitmapUtil;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.provider.CallLog.Calls;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.util.Log;
+
+/**
+ * Represents a call log event interaction, wrapping the columns in
+ * {@link android.provider.CallLog.Calls}.
+ *
+ * This class does not return log entries related to voicemail or SIP calls. Additionally,
+ * this class ignores number presentation. Number presentation affects how to identify phone
+ * numbers. Since, we already know the identity of the phone number owner we can ignore number
+ * presentation.
+ *
+ * As a result of ignoring voicemail and number presentation, we don't need to worry about API
+ * version.
+ */
+public class CallLogInteraction implements ContactInteraction {
+
+    private static final String URI_TARGET_PREFIX = "tel:";
+    private static final int CALL_LOG_ICON_RES = R.drawable.ic_phone_24dp;
+    private static final int CALL_ARROW_ICON_RES = R.drawable.ic_call_arrow;
+
+    private ContentValues mValues;
+
+    public CallLogInteraction(ContentValues values) {
+        mValues = values;
+    }
+
+    @Override
+    public Intent getIntent() {
+        return new Intent(Intent.ACTION_CALL).setData(Uri.parse(URI_TARGET_PREFIX + getNumber()));
+    }
+
+    @Override
+    public String getViewHeader(Context context) {
+        return getNumber();
+    }
+
+    @Override
+    public long getInteractionDate() {
+        return getDate();
+    }
+
+    @Override
+    public String getViewBody(Context context) {
+        int numberType = getCachedNumberType();
+        if (numberType == -1) {
+            return null;
+        }
+        return Phone.getTypeLabel(context.getResources(), getCachedNumberType(),
+                getCachedNumberLabel()).toString();
+    }
+
+    @Override
+    public String getViewFooter(Context context) {
+        return ContactInteractionUtil.formatDateStringFromTimestamp(getDate(), context);
+    }
+
+    @Override
+    public Drawable getIcon(Context context) {
+        return context.getResources().getDrawable(CALL_LOG_ICON_RES);
+    }
+
+    @Override
+    public Drawable getBodyIcon(Context context) {
+        return null;
+    }
+
+    @Override
+    public Drawable getFooterIcon(Context context) {
+        Drawable callArrow = null;
+        Resources res = context.getResources();
+        switch (getType()) {
+            case Calls.INCOMING_TYPE:
+                callArrow = res.getDrawable(CALL_ARROW_ICON_RES);
+                callArrow.setColorFilter(res.getColor(R.color.call_arrow_green),
+                        PorterDuff.Mode.MULTIPLY);
+                break;
+            case Calls.MISSED_TYPE:
+                callArrow = res.getDrawable(CALL_ARROW_ICON_RES);
+                callArrow.setColorFilter(res.getColor(R.color.call_arrow_red),
+                        PorterDuff.Mode.MULTIPLY);
+                break;
+            case Calls.OUTGOING_TYPE:
+                callArrow = BitmapUtil.getRotatedDrawable(res, CALL_ARROW_ICON_RES, 180f);
+                callArrow.setColorFilter(res.getColor(R.color.call_arrow_green),
+                        PorterDuff.Mode.MULTIPLY);
+                break;
+        }
+        return callArrow;
+    }
+
+    public String getCachedName() {
+        return mValues.getAsString(Calls.CACHED_NAME);
+    }
+
+    public String getCachedNumberLabel() {
+        return mValues.getAsString(Calls.CACHED_NUMBER_LABEL);
+    }
+
+    public int getCachedNumberType() {
+        Integer type = mValues.getAsInteger(Calls.CACHED_NUMBER_TYPE);
+        return type != null ? type : -1;
+    }
+
+    public long getDate() {
+        return mValues.getAsLong(Calls.DATE);
+    }
+
+    public long getDuration() {
+        return mValues.getAsLong(Calls.DURATION);
+    }
+
+    public boolean getIsRead() {
+        return mValues.getAsBoolean(Calls.IS_READ);
+    }
+
+    public int getLimitParamKey() {
+        return mValues.getAsInteger(Calls.LIMIT_PARAM_KEY);
+    }
+
+    public boolean getNew() {
+        return mValues.getAsBoolean(Calls.NEW);
+    }
+
+    public String getNumber() {
+        return mValues.getAsString(Calls.NUMBER);
+    }
+
+    public int getNumberPresentation() {
+        return mValues.getAsInteger(Calls.NUMBER_PRESENTATION);
+    }
+
+    public int getOffsetParamKey() {
+        return mValues.getAsInteger(Calls.OFFSET_PARAM_KEY);
+    }
+
+    public int getType() {
+        return mValues.getAsInteger(Calls.TYPE);
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/contacts/interactions/CallLogInteractionsLoader.java b/src/com/android/contacts/interactions/CallLogInteractionsLoader.java
new file mode 100644
index 0000000..8172232
--- /dev/null
+++ b/src/com/android/contacts/interactions/CallLogInteractionsLoader.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts.interactions;
+
+import android.content.AsyncTaskLoader;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.database.DatabaseUtils;
+import android.net.Uri;
+import android.provider.CallLog.Calls;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class CallLogInteractionsLoader extends AsyncTaskLoader<List<ContactInteraction>> {
+
+    private final String[] mPhoneNumbers;
+    private final int mMaxToRetrieve;
+    private List<ContactInteraction> mData;
+
+    public CallLogInteractionsLoader(Context context, String[] phoneNumbers,
+            int maxToRetrieve) {
+        super(context);
+        mPhoneNumbers = phoneNumbers;
+        mMaxToRetrieve = maxToRetrieve;
+    }
+
+    @Override
+    public List<ContactInteraction> loadInBackground() {
+        if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
+                || mPhoneNumbers == null || mPhoneNumbers.length == 0) {
+            return Collections.emptyList();
+        }
+
+        final List<ContactInteraction> interactions = new ArrayList<>();
+        for (String number : mPhoneNumbers) {
+            interactions.addAll(getCallLogInteractions(number));
+        }
+        // Sort the call log interactions by date for duplicate removal
+        Collections.sort(interactions, new Comparator<ContactInteraction>() {
+            @Override
+            public int compare(ContactInteraction i1, ContactInteraction i2) {
+                if (i2.getInteractionDate() - i1.getInteractionDate() > 0) {
+                    return 1;
+                } else if (i2.getInteractionDate() == i1.getInteractionDate()) {
+                    return 0;
+                } else {
+                    return -1;
+                }
+            }
+        });
+
+        return pruneDuplicateCallLogInteractions(interactions, mMaxToRetrieve);
+    }
+
+    /**
+     * Two different phone numbers can match the same call log entry (since phone number
+     * matching is inexact). Therefore, we need to remove duplicates. In a reasonable call log,
+     * every entry should have a distinct date. Therefore, we can assume duplicate entries are
+     * adjacent entries.
+     * @param interactions The interaction list potentially containing duplicates
+     * @return The list with duplicates removed
+     */
+    @VisibleForTesting
+    static List<ContactInteraction> pruneDuplicateCallLogInteractions(
+            List<ContactInteraction> interactions, int maxToRetrieve) {
+        final List<ContactInteraction> subsetInteractions = new ArrayList<>();
+        for (int i = 0; i < interactions.size(); i++) {
+            if (i >= 1 && interactions.get(i).getInteractionDate() ==
+                    interactions.get(i-1).getInteractionDate()) {
+                continue;
+            }
+            subsetInteractions.add(interactions.get(i));
+            if (subsetInteractions.size() >= maxToRetrieve) {
+                break;
+            }
+        }
+        return subsetInteractions;
+    }
+
+    private List<ContactInteraction> getCallLogInteractions(String phoneNumber) {
+        final Uri uri = Uri.withAppendedPath(Calls.CONTENT_FILTER_URI, phoneNumber);
+        final String orderBy = Calls.DATE + " DESC";
+        final Cursor cursor = getContext().getContentResolver().query(uri, null, null, null,
+                orderBy);
+        try {
+            if (cursor == null || cursor.getCount() < 1) {
+                return Collections.emptyList();
+            }
+            cursor.moveToPosition(-1);
+            List<ContactInteraction> interactions = new ArrayList<>();
+            while (cursor.moveToNext()) {
+                final ContentValues values = new ContentValues();
+                DatabaseUtils.cursorRowToContentValues(cursor, values);
+                interactions.add(new CallLogInteraction(values));
+            }
+            return interactions;
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+    }
+
+    @Override
+    protected void onStartLoading() {
+        super.onStartLoading();
+
+        if (mData != null) {
+            deliverResult(mData);
+        }
+
+        if (takeContentChanged() || mData == null) {
+            forceLoad();
+        }
+    }
+
+    @Override
+    protected void onStopLoading() {
+        // Attempt to cancel the current load task if possible.
+        cancelLoad();
+    }
+
+    @Override
+    public void deliverResult(List<ContactInteraction> data) {
+        mData = data;
+        if (isStarted()) {
+            super.deliverResult(data);
+        }
+    }
+
+    @Override
+    protected void onReset() {
+        super.onReset();
+
+        // Ensure the loader is stopped
+        onStopLoading();
+        if (mData != null) {
+            mData.clear();
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/contacts/list/ContactNameHighlightingAnimation.java b/src/com/android/contacts/list/ContactNameHighlightingAnimation.java
deleted file mode 100644
index 46fe88b..0000000
--- a/src/com/android/contacts/list/ContactNameHighlightingAnimation.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.contacts.list;
-
-import android.view.View;
-import android.widget.ListView;
-
-import com.android.contacts.common.list.ContactListItemView;
-import com.android.contacts.widget.TextHighlightingAnimation;
-
-/**
- * A {@link TextHighlightingAnimation} that redraws just the contact display name in a
- * list item.
- */
-public class ContactNameHighlightingAnimation extends TextHighlightingAnimation {
-    private final ListView mListView;
-    private boolean mSavedScrollingCacheEnabledFlag;
-
-    public ContactNameHighlightingAnimation(ListView listView, int duration) {
-        super(duration);
-        this.mListView = listView;
-    }
-
-    /**
-     * Redraws all visible items of the list corresponding to contacts
-     */
-    @Override
-    protected void invalidate() {
-        int childCount = mListView.getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            View itemView = mListView.getChildAt(i);
-            if (itemView instanceof ContactListItemView) {
-                final ContactListItemView view = (ContactListItemView)itemView;
-                view.getNameTextView().invalidate();
-            }
-        }
-    }
-
-    @Override
-    protected void onAnimationStarted() {
-        mSavedScrollingCacheEnabledFlag = mListView.isScrollingCacheEnabled();
-        mListView.setScrollingCacheEnabled(false);
-    }
-
-    @Override
-    protected void onAnimationEnded() {
-        mListView.setScrollingCacheEnabled(mSavedScrollingCacheEnabledFlag);
-    }
-}
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 26dbebe..9533d75 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -82,6 +82,7 @@
 import com.android.contacts.detail.ContactDetailDisplayUtils;
 import com.android.contacts.common.util.UriUtils;
 import com.android.contacts.interactions.CalendarInteractionsLoader;
+import com.android.contacts.interactions.CallLogInteractionsLoader;
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.interactions.ContactInteraction;
 import com.android.contacts.interactions.SmsInteractionsLoader;
@@ -191,14 +192,17 @@
     /** Id for the background contact loader */
     private static final int LOADER_CONTACT_ID = 0;
 
+    private static final String KEY_LOADER_EXTRA_PHONES =
+            QuickContactActivity.class.getCanonicalName() + ".KEY_LOADER_EXTRA_PHONES";
+
     /** Id for the background Sms Loader */
     private static final int LOADER_SMS_ID = 1;
-    private static final String KEY_LOADER_EXTRA_SMS_PHONES =
-            QuickContactActivity.class.getCanonicalName() + ".KEY_LOADER_EXTRA_SMS_PHONES";
     private static final int MAX_SMS_RETRIEVE = 3;
+
+    /** Id for the back Calendar Loader */
     private static final int LOADER_CALENDAR_ID = 2;
-    private static final String KEY_LOADER_EXTRA_CALENDAR_EMAILS =
-            QuickContactActivity.class.getCanonicalName() + ".KEY_LOADER_EXTRA_CALENDAR_EMAILS";
+    private static final String KEY_LOADER_EXTRA_EMAILS =
+            QuickContactActivity.class.getCanonicalName() + ".KEY_LOADER_EXTRA_EMAILS";
     private static final int MAX_PAST_CALENDAR_RETRIEVE = 3;
     private static final int MAX_FUTURE_CALENDAR_RETRIEVE = 3;
     private static final long PAST_MILLISECOND_TO_SEARCH_LOCAL_CALENDAR =
@@ -206,7 +210,15 @@
     private static final long FUTURE_MILLISECOND_TO_SEARCH_LOCAL_CALENDAR =
             36L * 60L * 60L * 1000L /* 36 hours */;
 
-    private static final int[] mRecentLoaderIds = new int[]{LOADER_SMS_ID, LOADER_CALENDAR_ID};
+    /** Id for the background Call Log Loader */
+    private static final int LOADER_CALL_LOG_ID = 3;
+    private static final int MAX_CALL_LOG_RETRIEVE = 3;
+
+
+    private static final int[] mRecentLoaderIds = new int[]{
+        LOADER_SMS_ID,
+        LOADER_CALENDAR_ID,
+        LOADER_CALL_LOG_ID};
     private Map<Integer, List<ContactInteraction>> mRecentLoaderResults;
 
     private static final String FRAGMENT_TAG_SELECT_ACCOUNT = "select_account_fragment";
@@ -482,22 +494,29 @@
             Set<String> emailAddresses,
             List<String> sortedActionMimeTypes) {
         Trace.beginSection("start sms loader");
-        final Bundle smsExtraBundle = new Bundle();
-        smsExtraBundle.putStringArray(KEY_LOADER_EXTRA_SMS_PHONES,
+        final Bundle phonesExtraBundle = new Bundle();
+        phonesExtraBundle.putStringArray(KEY_LOADER_EXTRA_PHONES,
                 phoneNumbers.toArray(new String[phoneNumbers.size()]));
         getLoaderManager().initLoader(
                 LOADER_SMS_ID,
-                smsExtraBundle,
+                phonesExtraBundle,
+                mLoaderInteractionsCallbacks);
+        Trace.endSection();
+
+        Trace.beginSection("start call log loader");
+        getLoaderManager().initLoader(
+                LOADER_CALL_LOG_ID,
+                phonesExtraBundle,
                 mLoaderInteractionsCallbacks);
         Trace.endSection();
 
         Trace.beginSection("start calendar loader");
-        final Bundle calendarExtraBundle = new Bundle();
-        calendarExtraBundle.putStringArray(KEY_LOADER_EXTRA_CALENDAR_EMAILS,
+        final Bundle emailsExtraBundle = new Bundle();
+        emailsExtraBundle.putStringArray(KEY_LOADER_EXTRA_EMAILS,
                 emailAddresses.toArray(new String[emailAddresses.size()]));
         getLoaderManager().initLoader(
                 LOADER_CALENDAR_ID,
-                calendarExtraBundle,
+                emailsExtraBundle,
                 mLoaderInteractionsCallbacks);
         Trace.endSection();
 
@@ -886,19 +905,25 @@
                     Log.v(TAG, "LOADER_SMS_ID");
                     loader = new SmsInteractionsLoader(
                             QuickContactActivity.this,
-                            args.getStringArray(KEY_LOADER_EXTRA_SMS_PHONES),
+                            args.getStringArray(KEY_LOADER_EXTRA_PHONES),
                             MAX_SMS_RETRIEVE);
                     break;
                 case LOADER_CALENDAR_ID:
                     Log.v(TAG, "LOADER_CALENDAR_ID");
                     loader = new CalendarInteractionsLoader(
                             QuickContactActivity.this,
-                            Arrays.asList(args.getStringArray(KEY_LOADER_EXTRA_CALENDAR_EMAILS)),
+                            Arrays.asList(args.getStringArray(KEY_LOADER_EXTRA_EMAILS)),
                             MAX_FUTURE_CALENDAR_RETRIEVE,
                             MAX_PAST_CALENDAR_RETRIEVE,
                             FUTURE_MILLISECOND_TO_SEARCH_LOCAL_CALENDAR,
                             PAST_MILLISECOND_TO_SEARCH_LOCAL_CALENDAR);
                     break;
+                case LOADER_CALL_LOG_ID:
+                    Log.v(TAG, "LOADER_CALL_LOG_ID");
+                    loader = new CallLogInteractionsLoader(
+                            QuickContactActivity.this,
+                            args.getStringArray(KEY_LOADER_EXTRA_PHONES),
+                            MAX_CALL_LOG_RETRIEVE);
             }
             return loader;
         }
diff --git a/src/com/android/contacts/widget/TextHighlightingAnimation.java b/src/com/android/contacts/widget/TextHighlightingAnimation.java
deleted file mode 100644
index d269276..0000000
--- a/src/com/android/contacts/widget/TextHighlightingAnimation.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.contacts.widget;
-
-import android.database.CharArrayBuffer;
-import android.graphics.Color;
-import android.os.Handler;
-import android.text.TextPaint;
-import android.text.style.CharacterStyle;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
-
-import com.android.contacts.common.format.FormatUtils;
-import com.android.internal.R;
-
-/**
- * An animation that alternately dims and brightens the non-highlighted portion of text.
- */
-public abstract class TextHighlightingAnimation implements Runnable, TextWithHighlightingFactory {
-
-    private static final int MAX_ALPHA = 255;
-    private static final int MIN_ALPHA = 50;
-
-    private AccelerateInterpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator();
-    private DecelerateInterpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator();
-
-    private final static DimmingSpan[] sEmptySpans = new DimmingSpan[0];
-
-    /**
-     * Frame rate expressed a number of millis between frames.
-     */
-    private static final long FRAME_RATE = 50;
-
-    private DimmingSpan mDimmingSpan;
-    private Handler mHandler;
-    private boolean mAnimating;
-    private boolean mDimming;
-    private long mTargetTime;
-    private final int mDuration;
-
-    /**
-     * A Spanned that highlights a part of text by dimming another part of that text.
-     */
-    public class TextWithHighlightingImpl implements TextWithHighlighting {
-
-        private final DimmingSpan[] mSpans;
-        private boolean mDimmingEnabled;
-        private CharArrayBuffer mText;
-        private int mDimmingSpanStart;
-        private int mDimmingSpanEnd;
-        private String mString;
-
-        public TextWithHighlightingImpl() {
-            mSpans = new DimmingSpan[] { mDimmingSpan };
-        }
-
-        public void setText(CharArrayBuffer baseText, CharArrayBuffer highlightedText) {
-            mText = baseText;
-
-            // TODO figure out a way to avoid string allocation
-            mString = new String(mText.data, 0, mText.sizeCopied);
-
-            int index = FormatUtils.overlapPoint(baseText, highlightedText);
-
-            if (index == 0 || index == -1) {
-                mDimmingEnabled = false;
-            } else {
-                mDimmingEnabled = true;
-                mDimmingSpanStart = 0;
-                mDimmingSpanEnd = index;
-            }
-        }
-
-        @SuppressWarnings("unchecked")
-        public <T> T[] getSpans(int start, int end, Class<T> type) {
-            if (mDimmingEnabled) {
-                return (T[])mSpans;
-            } else {
-                return (T[])sEmptySpans;
-            }
-        }
-
-        public int getSpanStart(Object tag) {
-            // We only have one span - no need to check the tag parameter
-            return mDimmingSpanStart;
-        }
-
-        public int getSpanEnd(Object tag) {
-            // We only have one span - no need to check the tag parameter
-            return mDimmingSpanEnd;
-        }
-
-        public int getSpanFlags(Object tag) {
-            // String is immutable - flags not needed
-            return 0;
-        }
-
-        public int nextSpanTransition(int start, int limit, Class type) {
-            // Never called since we only have one span
-            return 0;
-        }
-
-        public char charAt(int index) {
-            return mText.data[index];
-        }
-
-        public int length() {
-            return mText.sizeCopied;
-        }
-
-        public CharSequence subSequence(int start, int end) {
-            // Never called - implementing for completeness
-            return new String(mText.data, start, end);
-        }
-
-        @Override
-        public String toString() {
-            return mString;
-        }
-    }
-
-    /**
-     * A Span that modifies alpha of the default foreground color.
-     */
-    private static class DimmingSpan extends CharacterStyle {
-        private int mAlpha;
-
-        public void setAlpha(int alpha) {
-            mAlpha = alpha;
-        }
-
-        @Override
-        public void updateDrawState(TextPaint ds) {
-
-            // Only dim the text in the basic state; not selected, focused or pressed
-            int[] states = ds.drawableState;
-            if (states != null) {
-                int count = states.length;
-                for (int i = 0; i < count; i++) {
-                    switch (states[i]) {
-                        case R.attr.state_pressed:
-                        case R.attr.state_selected:
-                        case R.attr.state_focused:
-                            // We can simply return, because the supplied text
-                            // paint is already configured with defaults.
-                            return;
-                    }
-                }
-            }
-
-            int color = ds.getColor();
-            color = Color.argb(mAlpha, Color.red(color), Color.green(color), Color.blue(color));
-            ds.setColor(color);
-        }
-    }
-
-    /**
-     * Constructor.
-     */
-    public TextHighlightingAnimation(int duration) {
-        mDuration = duration;
-        mHandler = new Handler();
-        mDimmingSpan = new DimmingSpan();
-        mDimmingSpan.setAlpha(MAX_ALPHA);
-    }
-
-    /**
-     * Returns a Spanned that can be used by a text view to show text with highlighting.
-     */
-    public TextWithHighlightingImpl createTextWithHighlighting() {
-        return new TextWithHighlightingImpl();
-    }
-
-    /**
-     * Override and invalidate (redraw) TextViews showing {@link TextWithHighlightingImpl}.
-     */
-    protected abstract void invalidate();
-
-    /**
-     * Starts the highlighting animation, which will dim portions of text.
-     */
-    public void startHighlighting() {
-        startAnimation(true);
-    }
-
-    /**
-     * Starts un-highlighting animation, which will brighten the dimmed portions of text
-     * to the brightness level of the rest of text.
-     */
-    public void stopHighlighting() {
-        startAnimation(false);
-    }
-
-    /**
-     * Called when the animation starts.
-     */
-    protected void onAnimationStarted() {
-    }
-
-    /**
-     * Called when the animation has stopped.
-     */
-    protected void onAnimationEnded() {
-    }
-
-    private void startAnimation(boolean dim) {
-        if (mDimming != dim) {
-            mDimming = dim;
-            long now = System.currentTimeMillis();
-            if (!mAnimating) {
-                mAnimating = true;
-                mTargetTime = now + mDuration;
-                onAnimationStarted();
-                mHandler.post(this);
-            } else  {
-
-                // If we have started dimming, reverse the direction and adjust the target
-                // time accordingly.
-                mTargetTime = (now + mDuration) - (mTargetTime - now);
-            }
-        }
-    }
-
-    /**
-     * Animation step.
-     */
-    public void run() {
-        long now = System.currentTimeMillis();
-        long timeLeft = mTargetTime - now;
-        if (timeLeft < 0) {
-            mDimmingSpan.setAlpha(mDimming ? MIN_ALPHA : MAX_ALPHA);
-            mAnimating = false;
-            onAnimationEnded();
-            return;
-        }
-
-        // Start=1, end=0
-        float virtualTime = (float)timeLeft / mDuration;
-        if (mDimming) {
-            float interpolatedTime = DECELERATE_INTERPOLATOR.getInterpolation(virtualTime);
-            mDimmingSpan.setAlpha((int)(MIN_ALPHA + (MAX_ALPHA-MIN_ALPHA) * interpolatedTime));
-        } else {
-            float interpolatedTime = ACCELERATE_INTERPOLATOR.getInterpolation(virtualTime);
-            mDimmingSpan.setAlpha((int)(MIN_ALPHA + (MAX_ALPHA-MIN_ALPHA) * (1-interpolatedTime)));
-        }
-
-        invalidate();
-
-        // Repeat
-        mHandler.postDelayed(this, FRAME_RATE);
-    }
-}
diff --git a/src/com/android/contacts/widget/TextWithHighlighting.java b/src/com/android/contacts/widget/TextWithHighlighting.java
deleted file mode 100644
index 3a32b02..0000000
--- a/src/com/android/contacts/widget/TextWithHighlighting.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.contacts.widget;
-
-import android.database.CharArrayBuffer;
-import android.text.Spanned;
-
-/**
- * A Spanned that highlights a part of text by dimming another part of that text.
- */
-public interface TextWithHighlighting extends Spanned {
-    void setText(CharArrayBuffer baseText, CharArrayBuffer highlightedText);
-}
diff --git a/src/com/android/contacts/widget/TextWithHighlightingFactory.java b/src/com/android/contacts/widget/TextWithHighlightingFactory.java
deleted file mode 100644
index ee5744d..0000000
--- a/src/com/android/contacts/widget/TextWithHighlightingFactory.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.contacts.widget;
-
-/**
- * A factory for text fields with animated highlighting.
- */
-public interface TextWithHighlightingFactory {
-    TextWithHighlighting createTextWithHighlighting();
-}
diff --git a/tests/src/com/android/contacts/format/TestTextWithHighlightingFactory.java b/tests/src/com/android/contacts/format/TestTextWithHighlightingFactory.java
deleted file mode 100644
index 9dbd364..0000000
--- a/tests/src/com/android/contacts/format/TestTextWithHighlightingFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.format;
-
-import android.database.CharArrayBuffer;
-import android.graphics.Typeface;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.text.SpannableStringBuilder;
-import android.text.style.StyleSpan;
-
-import com.android.contacts.widget.TextWithHighlighting;
-import com.android.contacts.widget.TextWithHighlightingFactory;
-
-/** A factory for {@link TextWithHighlighting} that wraps its parts in italics. */
-@SmallTest
-public final class TestTextWithHighlightingFactory implements TextWithHighlightingFactory {
-    /** A {@link TextWithHighlighting} implementation that wraps its parts in italics. */
-    private final static class TestTextWithHighlighting extends SpannableStringBuilder
-            implements TextWithHighlighting {
-        @Override
-        public void setText(CharArrayBuffer baseText, CharArrayBuffer highlightedText) {
-            append(new String(baseText.data, 0, baseText.sizeCopied));
-            append(' ');
-            append(new String(highlightedText.data, 0, highlightedText.sizeCopied));
-            setSpan(new StyleSpan(Typeface.ITALIC), 0, baseText.sizeCopied, 0);
-            setSpan(new StyleSpan(Typeface.ITALIC), baseText.sizeCopied + 1,
-                    baseText.sizeCopied + 1 + highlightedText.sizeCopied, 0);
-        }
-    }
-
-    @Override
-    public TextWithHighlighting createTextWithHighlighting() {
-        return new TestTextWithHighlighting();
-    }
-}
diff --git a/tests/src/com/android/contacts/interactions/CallLogInteractionsLoaderTest.java b/tests/src/com/android/contacts/interactions/CallLogInteractionsLoaderTest.java
new file mode 100644
index 0000000..079411f
--- /dev/null
+++ b/tests/src/com/android/contacts/interactions/CallLogInteractionsLoaderTest.java
@@ -0,0 +1,65 @@
+package com.android.contacts.interactions;
+
+import android.content.ContentValues;
+import android.provider.CallLog.Calls;
+import android.test.AndroidTestCase;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests {@link CallLogInteractionsLoader}
+ */
+public class CallLogInteractionsLoaderTest extends AndroidTestCase {
+
+    public void testCallLogInteractions_pruneDuplicates_containsDuplicates() {
+        List<ContactInteraction> interactions = new ArrayList<>();
+        int maxToRetrieve = 5;
+
+        ContentValues interactionOneValues = new ContentValues();
+        interactionOneValues.put(Calls.DATE, 1L);
+        interactions.add(new CallLogInteraction(interactionOneValues));
+
+        ContentValues interactionTwoValues = new ContentValues();
+        interactionTwoValues.put(Calls.DATE, 1L);
+        interactions.add(new CallLogInteraction(interactionTwoValues));
+
+        interactions = CallLogInteractionsLoader.pruneDuplicateCallLogInteractions(interactions,
+                maxToRetrieve);
+        assertEquals(1, interactions.size());
+    }
+
+    public void testCallLogInteractions_pruneDuplicates_containsNoDuplicates() {
+        List<ContactInteraction> interactions = new ArrayList<>();
+        int maxToRetrieve = 5;
+
+        ContentValues interactionOneValues = new ContentValues();
+        interactionOneValues.put(Calls.DATE, 1L);
+        interactions.add(new CallLogInteraction(interactionOneValues));
+
+        ContentValues interactionTwoValues = new ContentValues();
+        interactionTwoValues.put(Calls.DATE, 5L);
+        interactions.add(new CallLogInteraction(interactionTwoValues));
+
+        interactions = CallLogInteractionsLoader.pruneDuplicateCallLogInteractions(interactions,
+                maxToRetrieve);
+        assertEquals(2, interactions.size());
+    }
+
+    public void testCallLogInteractions_maxToRetrieve() {
+        List<ContactInteraction> interactions = new ArrayList<>();
+        int maxToRetrieve = 1;
+
+        ContentValues interactionOneValues = new ContentValues();
+        interactionOneValues.put(Calls.DATE, 1L);
+        interactions.add(new CallLogInteraction(interactionOneValues));
+
+        ContentValues interactionTwoValues = new ContentValues();
+        interactionTwoValues.put(Calls.DATE, 5L);
+        interactions.add(new CallLogInteraction(interactionTwoValues));
+
+        interactions = CallLogInteractionsLoader.pruneDuplicateCallLogInteractions(interactions,
+                maxToRetrieve);
+        assertEquals(1, interactions.size());
+    }
+}