Merge "Remove tab colors and drawables to ContactsCommon."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7795aa8..6879f3a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -122,11 +122,6 @@
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.TAB" />
</intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.SEARCH" />
- </intent-filter>
- <meta-data android:name="android.app.searchable"
- android:resource="@xml/searchable"/>
</activity>
<activity android:name="com.android.dialer.calllog.CallLogActivity"
diff --git a/res/layout/dialtacts_activity.xml b/res/layout/dialtacts_activity.xml
index 6d04103..2cd796b 100644
--- a/res/layout/dialtacts_activity.xml
+++ b/res/layout/dialtacts_activity.xml
@@ -46,53 +46,6 @@
android:id="@+id/search_and_remove_view_container"
android:visibility="gone"
>
- <!-- TODO: This is set to visibility:gone for now, should be removed entirely -->
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="@dimen/search_box_height"
- android:id="@+id/search_view_container"
- android:orientation="horizontal"
- android:layout_marginTop="@dimen/search_top_margin"
- android:layout_marginBottom="@dimen/search_bottom_margin"
- android:layout_marginLeft="@dimen/search_margin_horizontal"
- android:layout_marginRight="@dimen/search_margin_horizontal"
- android:paddingLeft="@dimen/search_box_left_padding"
- android:paddingRight="@dimen/search_box_right_padding"
- android:background="@drawable/search_bg"
- android:gravity="center_vertical"
- android:visibility="gone"
- >
- <EditText
- android:id="@+id/search_view"
- android:layout_width="match_parent"
- android:layout_height="@dimen/search_box_icon_size"
- android:layout_weight="1"
- android:layout_marginLeft="@dimen/search_box_text_left_margin"
- android:textSize="@dimen/search_text_size"
- android:fontFamily="@string/search_font_family"
- android:textColor="@color/searchbox_text_color"
- android:textColorHint="@color/searchbox_hint_text_color"
- android:inputType="textFilter"/>
- <ImageView
- android:id="@+id/search_close_button"
- android:layout_height="@dimen/search_box_icon_size"
- android:layout_width="@dimen/search_box_icon_size"
- android:padding="6dp"
- android:src="@drawable/ic_close_dk"
- android:clickable="true"
- android:background="?android:attr/selectableItemBackground"
- android:contentDescription="@string/description_clear_search"
- android:visibility="gone" />
- <ImageView
- android:id="@+id/voice_search_button"
- android:layout_height="@dimen/search_box_icon_size"
- android:layout_width="@dimen/search_box_icon_size"
- android:padding="@dimen/search_box_icon_padding"
- android:src="@drawable/ic_voice_search"
- android:clickable="true"
- android:contentDescription="@string/description_start_voice_search"
- android:background="?android:attr/selectableItemBackground" />
- </LinearLayout>
<com.android.dialer.list.RemoveView
android:layout_width="match_parent"
android:layout_height="56dp"
diff --git a/res/layout/lists_fragment.xml b/res/layout/lists_fragment.xml
index 6ed0f85..d5b2bf8 100644
--- a/res/layout/lists_fragment.xml
+++ b/res/layout/lists_fragment.xml
@@ -14,11 +14,11 @@
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.dialer.widget.OverlappingPaneLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?android:attr/actionBarSize"
- android:orientation="vertical"
android:animateLayoutChanges="true"
android:id="@+id/lists_frame">
<ListView
@@ -29,18 +29,23 @@
android:clipToPadding="false"
android:fadingEdge="none"
android:divider="@null" />
- <com.android.dialer.list.ViewPagerTabs
- android:id="@+id/lists_pager_header"
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="?android:attr/actionBarSize"
- android:textAllCaps="true"
- android:orientation="horizontal"
- android:layout_gravity="top"
- style="@style/DialtactsActionBarTabTextStyle" />
- <android.support.v4.view.ViewPager
- android:id="@+id/lists_pager"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1">
- </android.support.v4.view.ViewPager>
-</LinearLayout>
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+ <com.android.dialer.list.ViewPagerTabs
+ android:id="@+id/lists_pager_header"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/actionBarSize"
+ android:textAllCaps="true"
+ android:orientation="horizontal"
+ android:layout_gravity="top"
+ style="@style/DialtactsActionBarTabTextStyle" />
+ <android.support.v4.view.ViewPager
+ android:id="@+id/lists_pager"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+ </android.support.v4.view.ViewPager>
+ </LinearLayout>
+</com.android.dialer.widget.OverlappingPaneLayout>
diff --git a/res/layout/search_edittext.xml b/res/layout/search_edittext.xml
new file mode 100644
index 0000000..236d2bf
--- /dev/null
+++ b/res/layout/search_edittext.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/search_view_container"
+ android:orientation="horizontal"
+ android:layout_marginTop="@dimen/search_top_margin"
+ android:layout_marginBottom="@dimen/search_bottom_margin"
+ android:layout_marginLeft="@dimen/search_margin_horizontal"
+ android:layout_marginRight="@dimen/search_margin_horizontal"
+ android:paddingLeft="@dimen/search_box_left_padding"
+ android:paddingRight="@dimen/search_box_right_padding"
+ android:background="@drawable/search_bg"
+ android:gravity="center_vertical"
+ >
+ <EditText
+ android:id="@+id/search_view"
+ android:layout_width="0dp"
+ android:layout_height="@dimen/search_box_icon_size"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/search_box_text_left_margin"
+ android:textSize="@dimen/search_text_size"
+ android:fontFamily="@string/search_font_family"
+ android:textColor="@color/searchbox_text_color"
+ android:textColorHint="@color/searchbox_hint_text_color"
+ android:hint="@string/dialer_hint_find_contact"
+ android:inputType="textFilter"/>
+ <ImageView
+ android:id="@+id/search_close_button"
+ android:layout_height="@dimen/search_box_icon_size"
+ android:layout_width="@dimen/search_box_icon_size"
+ android:padding="6dp"
+ android:src="@drawable/ic_close_dk"
+ android:clickable="true"
+ android:background="?android:attr/selectableItemBackground"
+ android:contentDescription="@string/description_clear_search"
+ android:visibility="gone" />
+ <ImageView
+ android:id="@+id/voice_search_button"
+ android:layout_height="@dimen/search_box_icon_size"
+ android:layout_width="@dimen/search_box_icon_size"
+ android:padding="@dimen/search_box_icon_padding"
+ android:src="@drawable/ic_voice_search"
+ android:clickable="true"
+ android:contentDescription="@string/description_start_voice_search"
+ android:background="?android:attr/selectableItemBackground" />
+</LinearLayout>
\ No newline at end of file
diff --git a/res/menu/dialtacts_options.xml b/res/menu/dialtacts_options.xml
index a332030..17f4d9f 100644
--- a/res/menu/dialtacts_options.xml
+++ b/res/menu/dialtacts_options.xml
@@ -14,16 +14,11 @@
limitations under the License.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/menu_search"
- android:title="@string/description_search_button"
- android:showAsAction="always"
- android:actionViewClass="android.widget.SearchView"/>
+
<item
android:id="@+id/menu_history"
android:icon="@drawable/ic_menu_history_lt"
- android:title="@string/action_menu_call_history_description"
- android:showAsAction="ifRoom"/>
+ android:title="@string/action_menu_call_history_description" />
<item
android:id="@+id/menu_import_export"
android:title="@string/menu_import_export" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 2db6fb3..b8c52fc 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Gemiste oproep"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Stemboodskap"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Voeg kontak by"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Meer opsies"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Bekyk kontak <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Bel <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontakbesonderhede van <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index d8bd866..931e24b 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"ያመለጠ ጥሪ"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"የድምፅ መልዕክት"</string>
<string name="description_add_contact" msgid="3103414772502485851">"እውቅያዎች አክል"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"ተጨማሪ አማራጮች"</string>
<string name="description_view_contact" msgid="5205669345700598415">"ዕውቂያ <xliff:g id="NAME">%1$s</xliff:g> ዕይ"</string>
<string name="description_call" msgid="3443678121983852666">"ጥሪ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"የ<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> እውቂያ ዝርዝሮች"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"ቀልብስ"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"ለ<xliff:g id="NUMBER">%s</xliff:g> ደውል"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"ወደ ዕውቂያዎች አክል"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"ሙሉ የጥሪ ታሪኮችን ይመልከቱ"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> አዲስ ያልተመለሱ ጥሪዎች"</string>
<string name="no_favorites" msgid="5212485868783382971">"ተወዳጆች እና አብዛኛውን ጊዜ\nየሚደውሉላቸው እውቂያዎች እዚህ ይታያሉ።\nስለዚህ መደወል ይጀምሩ።"</string>
<string name="contact_tooltip" msgid="7817483485692282287">"ሁሉንም ቁጥሮች ለማየት ምስሉን መታ ያድርጉ ወይም ቅደም ተከተላቸውን ለማስተካከል ተጭነው ይያዙ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 4eb05b3..44fb1e3 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"مكالمة فائتة"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"البريد الصوتي"</string>
<string name="description_add_contact" msgid="3103414772502485851">"إضافة جهة اتصال"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"خيارات أخرى"</string>
<string name="description_view_contact" msgid="5205669345700598415">"عرض جهة الاتصال <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"الاتصال بـ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"تفاصيل جهة الاتصال بـ <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index bfc648d..17b7633 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Пропуснато обаждане"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Гласова поща"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Добавяне на контакт"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Още опции"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Преглед на контактa <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Обаждане до <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Подробности за контакта за <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Отмяна"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Обаждане на <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Добавяне в контактите"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Преглед на цялата история на обажданията"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> нови пропуснати обаждания"</string>
<string name="no_favorites" msgid="5212485868783382971">"Любимите и контактите, на\nкоито се обаждате често, ще се показват тук.\nЗапочнете да извършвате обаждания."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Докоснете изображението, за да видите всички номера, или натиснете и задръжте, за да пренаредите"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index ae4fb80..cee089e 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Trucada perduda"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Missatge de veu"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Afegeix un contacte"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Més opcions"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Visualitza el contacte <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Truca a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Dades de contacte de: <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 9774b79..82b6e93 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Zmeškaný hovor"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Hlasová schránka"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Přidat kontakt"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Další možnosti"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Zobrazit kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Volat kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Podrobnosti kontaktu pro <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Vrátit zpět"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Zavolat na číslo <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Přidat do kontaktů"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Zobrazení celé historie volání"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Nové zmeškané hovory: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="no_favorites" msgid="5212485868783382971">"Zde se bude zobrazovat vaše oblíbené a často používané kontakty.\nStačí jen začít volat.\n"</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Klepnutím na fotku zobrazíte všechna čísla a přidržením je můžete seřadit"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 8e4acf9..b759da7 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Ubesvaret opkald"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Telefonsvarer"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Tilføj kontaktperson"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Flere muligheder"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Vis kontaktpersonen <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ring til <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontaktoplysninger for <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 6bd2c57..37917ce 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Entgangener Anruf"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Mailbox-Nachricht"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Kontakt hinzufügen"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Weitere Optionen"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Kontakt <xliff:g id="NAME">%1$s</xliff:g> anzeigen"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> anrufen"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontaktdetails für <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 66cadc7..d5e1d83 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Αναπάντητη κλήση"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Αυτόματος τηλεφωνητής"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Προσθήκη επαφής"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Περισσότερες επιλογές"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Προβολή επαφής <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Κλήση του χρήστη <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Στοιχεία επικοινωνίας του <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 007bc54..a2964c3 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Missed call"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Voicemail"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Add contact"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"More options"</string>
<string name="description_view_contact" msgid="5205669345700598415">"View contact <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Call <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Contact details for <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Undo"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Call <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Add to contacts"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"View full call history"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> new missed calls"</string>
<string name="no_favorites" msgid="5212485868783382971">"Favourites & contacts that you\ncall often will show here.\nSo, start calling."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Tap image to see all numbers or press and hold to reorder"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 007bc54..a2964c3 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Missed call"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Voicemail"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Add contact"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"More options"</string>
<string name="description_view_contact" msgid="5205669345700598415">"View contact <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Call <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Contact details for <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Undo"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Call <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Add to contacts"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"View full call history"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> new missed calls"</string>
<string name="no_favorites" msgid="5212485868783382971">"Favourites & contacts that you\ncall often will show here.\nSo, start calling."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Tap image to see all numbers or press and hold to reorder"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 2e91356..11e3075 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Llamada perdida"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Mensaje de voz"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Agregar contacto"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Más opciones"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Ver contacto <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Llamar a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Datos de contacto de <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index c8de505..00a191e 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Llamada perdida"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Buzón de voz"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Añadir contacto"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Más opciones"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Ver contacto <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Llamar a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Información de contacto de <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 802057a..7bae4d7 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Vastamata kõne"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Kõnepost"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Lisa kontakt"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Rohkem valikuid"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Kuva kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Helista: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontakti <xliff:g id="NAMEORNUMBER">%1$s</xliff:g> üksikasjad"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Võta tagasi"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Helista <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Lisa kontaktidesse"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Kogu kõneajaloo vaatamine"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> uus/uut vastamata kõne(t)"</string>
<string name="no_favorites" msgid="5212485868783382971">"Siin kuvatakse lemmikud ja kontaktid,\nkellele sageli helistate.\nVõite hakata helistama."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Puudutage kujutist, et näha kõiki numbreid, või vajutage ja hoidke all ümberkorraldamiseks"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index b1d2505..bc66aef 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"تماس بیپاسخ"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"پست صوتی"</string>
<string name="description_add_contact" msgid="3103414772502485851">"افزودن مخاطب"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"گزینههای بیشتر"</string>
<string name="description_view_contact" msgid="5205669345700598415">"مشاهده مخاطب <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"تماس با <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"جزئیات تماس برای <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"لغو"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"تماس با <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"افزودن به مخاطبین"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"مشاهده سابقه تماس به صورت کامل"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> تماس بیپاسخ جدید"</string>
<string name="no_favorites" msgid="5212485868783382971">"موارد دلخواه و مخاطبینی که اغلب با\nآنها تماس میگیرید اینجا نشان داده میشوند.\nبنابراین شروع به تماس گرفتن کنید."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"برای مشاهده همه شمارهها روی تصویر ضربه بزنید یا برای مرتبسازی مجدد فشار دهید و نگهدارید"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index a9759a7..b3cd101 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Vastaamaton puhelu"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Vastaaja"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Lisää yhteystieto"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Lisää vaihtoehtoja"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Näytä yhteystieto <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Soita: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Yhteystiedot: <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Kumoa"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Soita <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Lisää yhteystietoihin"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Näytä koko soittohistoria"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> uutta vastaamatonta puhelua"</string>
<string name="no_favorites" msgid="5212485868783382971">"Suosikit ja yhteyshenkilöt, joille\nsoitat usein, näkyvät tässä.\nAla siis soitella."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Napauta kuvaa nähdäksesi kaikki numerot tai järjestä uudelleen painamalla pitkään"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 78c4aa3..c09b53c 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Appel manqué"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Messagerie vocale"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Ajouter un contact"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Plus d\'options"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Afficher le contact <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Appeler <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Coordonnées de <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index ff093ac..edb014d 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Appel manqué"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Message vocal"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Ajouter un contact"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Plus d\'options"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Afficher le contact <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Appeler <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Coordonnées associées à <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Annuler"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Appeler le <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Ajouter aux contacts"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Afficher tout l\'historique des appels"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Nouveaux appels manqués : <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="no_favorites" msgid="5212485868783382971">"Retrouvez ici vos favoris et\nles contacts que vous appelez souvent.\n"</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Appuyer sur l\'image pour afficher tous les numéros ou appuyer de manière prolongée pour les réorganiser"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index f18c8af..16a34d5 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"छूटी कॉल"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"ध्वनिमेल"</string>
<string name="description_add_contact" msgid="3103414772502485851">"संपर्क जोड़ें"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"अधिक विकल्प"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> संपर्क देखें"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> को कॉल करें"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> का संपर्क विवरण"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index e90e14c..5d327a7 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Propušteni poziv"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Govorna pošta"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Dodaj kontakt"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Više opcija"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Prikaz kontakta <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Pozovi: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Pojedinosti o kontaktu <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Poništi"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Nazovi <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Dodaj u kontakte"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Prikaz cijele povijesti poziva"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Broj novih propuštenih poziva: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="no_favorites" msgid="5212485868783382971">"Ovdje će se prikazivati favoriti\ni kontakti koje često zovete.\nZato počnite zvati."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Dodirnite sliku da biste vidjeli sve brojeve ili pritisnite i zadržite da biste promijenili poredak"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 3ce07fb..6937243 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Nem fogadott hívás"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Hangüzenet"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Névjegy hozzáadása"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"További lehetőségek"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> névjegyének megtekintése"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> hívása"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> részletes adatai."</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 07c30de..d2ec2b8 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Բաց թողնված զանգ"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Ձայնային փոստ"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Ավելացնել կոտակտ"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Այլ ընտրանքներ"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Դիտել <xliff:g id="NAME">%1$s</xliff:g> կոնտակտը"</string>
<string name="description_call" msgid="3443678121983852666">"Զանգել <xliff:g id="NAME">%1$s</xliff:g>-ին"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>-ի կոնտակտային տվյալները"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Հետարկել"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Զանգել <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Ավելացնել կոնտակտներում"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Դիտել բոլոր զանգերի պատմությունը"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> նոր բաց թողնված զանգ"</string>
<string name="no_favorites" msgid="5212485868783382971">"Հաճախ կանչվող ընտրյալները և կոնտակտները\nկցուցադրվեն այստեղ:\nԿարող եք զանգել:"</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Հպեք նկարին՝ բոլոր համարները տեսնելու, կամ հպեք ու պահեք՝ վերադասավորելու համար:"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index d3efb09..c5abcf7 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Panggilan tak terjawab"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Pesan suara"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Tambahkan kontak"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Opsi lainnya"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Lihat kontak <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Panggil <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detail kontak untuk <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 5d2a4ec..348fc8b 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Chiamata senza risposta"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Messaggio vocale"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Aggiungi contatto"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Altre opzioni"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Visualizza <xliff:g id="NAME">%1$s</xliff:g> contatto"</string>
<string name="description_call" msgid="3443678121983852666">"Chiama <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Dettagli contatto <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index edf8b68..0021146 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"שיחה שלא נענתה"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"דואר קולי"</string>
<string name="description_add_contact" msgid="3103414772502485851">"הוסף איש קשר"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"עוד אפשרויות"</string>
<string name="description_view_contact" msgid="5205669345700598415">"הצג את איש הקשר <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"התקשר אל <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"פרטי יצירת קשר עבור <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index f273614..b168c79 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"不在着信"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"ボイスメール"</string>
<string name="description_add_contact" msgid="3103414772502485851">"連絡先を追加"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"その他のオプション"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g>の連絡先を表示"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g>に発信"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>の連絡先の詳細"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"元に戻す"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"<xliff:g id="NUMBER">%s</xliff:g>に発信"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"連絡先に追加"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"通話履歴をすべて表示"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g>件の不在着信"</string>
<string name="no_favorites" msgid="5212485868783382971">"ここにはお気に入りや\n頻繁に通話する\n連絡先が表示されます。"</string>
<string name="contact_tooltip" msgid="7817483485692282287">"画像をタップするとすべての番号を表示でき、押し続けると並び替えることができます"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index f946fb5..9c50d19 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"გამოტოვებული ზარი"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"ხმოვანი ფოსტა"</string>
<string name="description_add_contact" msgid="3103414772502485851">"კონტაქტის დამატება"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"მეტი ვარიანტები"</string>
<string name="description_view_contact" msgid="5205669345700598415">"კონტაქტის <xliff:g id="NAME">%1$s</xliff:g> ნახვა"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g>-თან დარეკვა"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>-ის კონტაქტის დეტალები"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"დაბრუნება"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"დარეკვა <xliff:g id="NUMBER">%s</xliff:g>-ზე"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"კონტაქტებში დამატება"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"ზარების სრული ისტორიის ნახვა"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> ახალი გაცდენილი ზარი"</string>
<string name="no_favorites" msgid="5212485868783382971">"რჩეულები და ხშირი კონაქტები\nაქ გამოჩნდება.\nასე რომ, დაიწყეთ რეკვა."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"შეეხეთ სურათს ყველა ნომრის სანახავად, ან შეეხეთ და დააყოვნეთ მიმდევრობის შესაცვლელად"</string>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 35a0029..e3f28c0 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"ខកខានទទួល"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"សារជាសំឡេង"</string>
<string name="description_add_contact" msgid="3103414772502485851">"បន្ថែមទំនាក់ទំនង"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"ជម្រើសច្រើនទៀត"</string>
<string name="description_view_contact" msgid="5205669345700598415">"មើលទំនាក់ទំនង <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"ហៅ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"ព័ត៌មានលម្អិតទំនាក់ទំនងសម្រាប់ <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 1f43f7e..8d9d268 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"부재중 전화"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"음성사서함"</string>
<string name="description_add_contact" msgid="3103414772502485851">"연락처 추가"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"옵션 더보기"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g>님의 연락처 보기"</string>
<string name="description_call" msgid="3443678121983852666">"전화하기:<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>의 연락처 세부정보"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"실행취소"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"<xliff:g id="NUMBER">%s</xliff:g>에 전화"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"주소록에 추가"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"전체 통화 기록 조회"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"새로운 부재중 전화 <xliff:g id="NUMBER">%s</xliff:g>건"</string>
<string name="no_favorites" msgid="5212485868783382971">"자주 전화하는 연락처가\n여기에 표시됩니다.\n전화해 보세요."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"이미지를 탭하여 모든 번호를 확인하거나 길게 눌러 재정렬합니다."</string>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index 0320184..4b93e83 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"ສາຍທີ່ບໍ່ໄດ້ຮັບ"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"ຂໍ້ຄວາມສຽງ"</string>
<string name="description_add_contact" msgid="3103414772502485851">"ເພີ່ມລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"ໂຕເລືອກອື່ນ"</string>
<string name="description_view_contact" msgid="5205669345700598415">"ເບິ່ງລາຍຊື່ຜູ່ຕິດຕໍ່ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"ໂທຫາ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"ລາຍລະອຽດລາຍຊື່ຜູ່ຕິດຕໍ່ສຳລັບ <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"ຍົກເລີກ"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"ໂທຫາ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"ເພີ່ມໃສ່ລາຍຊື່ຕິດຕໍ່"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"ເບິ່ງປະຫວັດການໂທແບບເຕັມ"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> ສາຍທີ່ບໍ່ໄດ້ຮັບໃໝ່"</string>
<string name="no_favorites" msgid="5212485868783382971">"ລາຍງານທີ່ມັກ & ລາຍຊື່ຜູ່ຕິດຕໍ່ທີ່ທ່ານ\nໂທຫາເລື້ອຍໆ ຈະປາກົດຢູ່ບ່ອນນີ້.\nສະນັ້ນ, ທ່ານສາມາດເລີ່ມໂທໄດ້."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"ແຕະຮູບພາບເພື່ອເບິ່ງຈໍານວນຮູບພາບທັງໝົດ ຫຼືແຕະຄ້າງໄວ້ເພື່ອຈັດຮຽງໃໝ່"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 30f883e..a6fcbd3 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Praleistas skambutis"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Balso paštas"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Pridėti kontaktą"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Daugiau parinkčių"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Žiūrėti kontaktą <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Skambinti <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Išsami kontaktinė informacija: <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 3a36697..a0e19e4 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Neatbildēts zvans"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Balss pasts"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Pievienot kontaktpersonu"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Citas opcijas"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Skatīt kontaktpersonu <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Zvanīt šim: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontaktpersonas informācija: <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index d222445..505d3ee 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Аваагүй дуудлага"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Дуут шуудан"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Харилцагч нэмэх"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Нэмэлт сонголтууд"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> харилцагчийг харах"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> руу залгах"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>-н харилцагчийн мэдээлэл"</string>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index fc086a1..3483747 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Panggilan tidak dijawab"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Mel suara"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Tambah kenalan"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Lagi pilihan"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Lihat kenalan <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Panggil <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Butiran hubungan untuk <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Buat asal"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Panggil <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Tambahkan pada kenalan"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Lihat sejarah panggilan penuh"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> panggilan terlepas baharu"</string>
<string name="no_favorites" msgid="5212485868783382971">"Kegemaran & kenalan yang\nkerap anda hubungi akan ditunjukkan di sini.\nJadi, mulalah membuat panggilan."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Ketik imej untuk melihat semua nombor atau tekan dan tahan imej untuk menyusun semula"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 4f87fae..91b32a8 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Tapt anrop"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Talepostkasse"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Legg til kontakt"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Flere alternativer"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Se kontakten <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ring til <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontaktinformasjon for <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Angre"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Ring <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Legg til i kontakter"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Se hele anropsloggen"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> nye tapte anrop"</string>
<string name="no_favorites" msgid="5212485868783382971">"Favoritter og kontakter du \nringer ofte vises her.\n Ring i vei."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Trykk på bildet for å se alle telefonnumrene, eller trykk og hold inne for å endre rekkefølgen"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index a272d88..9a759e6 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Gemiste oproep"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Voicemail"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Contact toevoegen"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Meer opties"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Contact <xliff:g id="NAME">%1$s</xliff:g> bekijken"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> bellen"</string>
<string name="description_contact_details" msgid="51229793651342809">"Contactgegevens voor <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 8c28bc9..3320a6a 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Nieodebrane połączenie"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Poczta głosowa"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Dodaj kontakt"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Więcej opcji"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Wyświetl kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Połącz z: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Szczegóły kontaktu: <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 70dd309..a3031b4 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Chamada não atendida"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Correio de voz"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Adicionar contacto"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Mais opções"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Ver o contacto <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ligar a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detalhes de contacto para <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index fa6de35..19df83f 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Chamada perdida"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Mensagem de voz"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Adicionar contato"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Mais opções"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Visualizar contato <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ligar para <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detalhes de contato para <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Desfazer"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Ligar para <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Adicionar aos contatos"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Ver todo o histórico de chamadas"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> novas chamadas perdidas"</string>
<string name="no_favorites" msgid="5212485868783382971">"Seus favoritos e os contatos\npara os quais você liga com mais frequência aparecerão aqui.\nComece a ligar!"</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Toque na imagem para ver todos os números ou pressione e segure para reordenar"</string>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index 8b7edab..cf97465 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -161,6 +161,8 @@
<skip />
<!-- no translation found for description_add_contact (3103414772502485851) -->
<skip />
+ <!-- no translation found for description_dialpad_overflow (5085126640236518486) -->
+ <skip />
<!-- no translation found for description_view_contact (5205669345700598415) -->
<skip />
<!-- no translation found for description_call (3443678121983852666) -->
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 92f4137..40b17fb 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Apel nepreluat"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Mesaj vocal"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Adăugaţi o persoană în agendă"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Mai multe opțiuni"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Afişaţi persoana din agendă <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Apelaţi pe <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detalii de contact pentru <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Anulați"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Apelați <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Adăugați în Agendă"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Vedeți istoricul complet al apelurilor"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> (de) apeluri nepreluate noi"</string>
<string name="no_favorites" msgid="5212485868783382971">"Preferințele și persoanele din Agendă pe care \nle apelați frecvent vor fi afișate aici.\nÎncepeți să faceți apeluri."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Atingeți imaginea pentru a vedea toate numerele sau apăsați și țineți apăsat pentru a reordona"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index df302f2..4093fc8 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Пропущенный вызов"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Голосовая почта"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Добавить контакт"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Ещё"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Просмотреть данные: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Позвонить: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Сведения о контакте <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Отмена"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Позвонить: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Добавить в контакты"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Посмотреть весь журнал звонков"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Пропущенных вызовов: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="no_favorites" msgid="5212485868783382971">"Здесь будут отображаться избранные элементы\nи контакты, которым вы звоните чаще всего.\nОбщайтесь с удовольствием."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Нажмите на фото, чтобы посмотреть информацию о контакте. Чтобы переставить контакт в списке, нажмите на него и передвиньте на нужное место."</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index c2c5a9f..9d0ee88 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Zmeškaný hovor"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Hlasová schránka"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Pridať kontakt"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Viac možností"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Zobraziť kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Volať kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Podrobnosti kontaktu pre <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Späť"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Volať na číslo <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Pridať do kontaktov"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Zobraziť úplnú históriu hovorov"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Počet nových zmeškaných hovorov: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="no_favorites" msgid="5212485868783382971">"Obľúbení ľudia a kontakty,\nktorým často voláte, sa zobrazia tu.\nZačnite teda volať."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Klepnutím na obrázok zobrazíte všetky čísla a pridržaním ich zoradíte"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index bef11a5..e8ef39a 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Neodgovorjeni klic"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Sporočila glasovne pošte"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Dodajanje stika"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Več možnosti"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Ogled stika <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Klicanje osebe <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Podrobnosti stika za <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index be46664..b26258d 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Пропуштен позив"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Говорна пошта"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Додавање контакта"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Још опција"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Прикажи контакт <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Позови корисника <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Детаљи о контакту за <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Опозови"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Позови <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Додај у контакте"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Приказ пуне историје позива"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Нових пропуштених позива: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="no_favorites" msgid="5212485868783382971">"Овде ће се приказати омиљени и\nчесто позивани контакти.\nПа почните са позивањем."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Додирните слику да бисте видели све бројеве или притисните и задржите да бисте променили распоред"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 7e91c24..badb42f 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Missat samtal"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Röstmeddelande"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Lägg till kontakt"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Fler alternativ"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Visa kontakten <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ring <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontaktuppgifter för <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 37c1a81..cac08a9 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Simu isiyojibiwa"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Barua za sauti"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Ongeza anwani"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Chaguo zaidi"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Angalia anwani <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Piga <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Maelezo ya <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Tendua"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Piga simu <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Ongeza kwenye anwani"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Angalia historia kamili ya simu zilizopigwa"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Simu <xliff:g id="NUMBER">%s</xliff:g> za karibuni ambazo hazikujibiwa"</string>
<string name="no_favorites" msgid="5212485868783382971">"Vipendwa na nambari \n unazopiga mara nyingi zitaonekana hapa.\nKwa hivyo, anza kupiga simu."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Gonga picha ili uone nambari zote au bonyeza na ushikilie ili upange upya"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index c0adf23..2ddf8a0 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"สายที่ไม่ได้รับ"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"ข้อความเสียง"</string>
<string name="description_add_contact" msgid="3103414772502485851">"เพิ่มรายชื่อติดต่อ"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"ตัวเลือกอื่น"</string>
<string name="description_view_contact" msgid="5205669345700598415">"ดูรายชื่อติดต่อ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"โทรหา <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"รายละเอียดที่อยู่ติดต่อสำหรับ <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 9d5e773..66e28b4 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Hindi nasagot na tawag"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Voicemail"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Magdagdag ng contact"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Higit pang mga opsyon"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Tingnan ang contact na si <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Tawagan si <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Mga detalye sa pakikipag-ugnayan para kay/sa <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"I-undo"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Tumawag sa <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Idagdag sa mga contact"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Tingnan ang buong kasaysayan ng tawag"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> (na) bagong hindi nasagot na tawag"</string>
<string name="no_favorites" msgid="5212485868783382971">"Ipapakita dito ang mga paborito at contact na\nmadalas mong tinatawagan.\nKaya, simulan ang pagtawag."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"I-tap ang larawan upang makita ang lahat ng numero at pindutin nang matagal upang ayusing muli"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 575e725..87a5043 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Cevapsız çağrı"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Sesli mesaj"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Kişi ekle"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Diğer seçenekler"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Kişiyi görüntüle: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Sesli arama yap: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> için kişi ayrıntıları"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Geri al"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Telefon et: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Kişilere ekle"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Tüm çağrı geçmişini görüntüle"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> yeni cevapsız çağrı"</string>
<string name="no_favorites" msgid="5212485868783382971">"Favoriler ve sık telefon ettiğiniz\nkişiler burada görüntülenir.\nTelefon etmeye başlayın."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Tüm numaraları görmek için resme hafifçe vurun veya yeniden sıralamak için basılı tutun"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 885123e..24ca079 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Пропущений виклик"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Голосова пошта"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Додати контакт"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Інші опції"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Переглянути контакт <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Дзвонити: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Відомості про контакт <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index f8d3e5e..bec7674 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Cuộc gọi nhỡ"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Thư thoại"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Thêm địa chỉ liên hệ"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Thêm tùy chọn"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Xem thông tin liên hệ của <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Gọi <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Chi tiết liên lạc cho <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"Hoàn tác"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"Gọi <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"Thêm vào danh bạ"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"Xem lịch sử cuộc gọi đầy đủ"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> cuộc gọi nhỡ mới"</string>
<string name="no_favorites" msgid="5212485868783382971">"Người liên hệ yêu thích và người liên hệ bạn\nthường gọi sẽ hiển thị tại đây.\nVì vậy, hãy bắt đầu gọi."</string>
<string name="contact_tooltip" msgid="7817483485692282287">"Chạm vào hình ảnh để xem tất cả các số hoặc nhấn và giữ để sắp xếp lại"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index c170fdc..4993276 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"未接电话"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"语音邮件"</string>
<string name="description_add_contact" msgid="3103414772502485851">"添加联系人"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"更多选项"</string>
<string name="description_view_contact" msgid="5205669345700598415">"查看联系人<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"呼叫<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>的详细联系信息"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"撤消"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"拨打<xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"添加到通讯录"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"查看全部通话记录"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g>个新的未接电话"</string>
<string name="no_favorites" msgid="5212485868783382971">"您收藏的联系人和经常通话\n的联系人都会显示在这里。\n现在就开始与联系人通话吧。"</string>
<string name="contact_tooltip" msgid="7817483485692282287">"点按图片可查看所有号码,按住图片可重新排序"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index a945982..829366e 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"未接來電"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"語音信箱"</string>
<string name="description_add_contact" msgid="3103414772502485851">"新增聯絡人"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"更多選項"</string>
<string name="description_view_contact" msgid="5205669345700598415">"查看聯絡人<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"致電<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"「<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>」的聯絡人詳細資料"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 6cdab8c..5881493 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"未接來電"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"語音留言"</string>
<string name="description_add_contact" msgid="3103414772502485851">"新增聯絡人"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"更多選項"</string>
<string name="description_view_contact" msgid="5205669345700598415">"查看聯絡人<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"撥電話給<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"「<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>」的聯絡詳細資料"</string>
@@ -174,8 +175,7 @@
<string name="favorite_hidden_undo" msgid="2508998611039406474">"復原"</string>
<string name="search_shortcut_call_number" msgid="7277194656832895870">"撥打 <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="search_shortcut_add_to_contacts" msgid="1853716708655789069">"新增為聯絡人"</string>
- <!-- no translation found for recents_footer_text (7315554578957453359) -->
- <skip />
+ <string name="recents_footer_text" msgid="7315554578957453359">"查看完整通話紀錄"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> 通新的未接來電"</string>
<string name="no_favorites" msgid="5212485868783382971">"您最愛的聯絡人和經常通話的聯絡人\n都會顯示在這裡,\n可以直接打給他們!"</string>
<string name="contact_tooltip" msgid="7817483485692282287">"輕按圖片即可查看所有號碼,按住圖片則可重新排序"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 2ac055c..3dce536 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -111,6 +111,7 @@
<string name="description_call_log_missed_call" msgid="2242805209983708825">"Ikholi ekulahlekele"</string>
<string name="description_call_log_voicemail" msgid="4600798771975158948">"Ivoyisimeyili"</string>
<string name="description_add_contact" msgid="3103414772502485851">"Faka oxhumana naye"</string>
+ <string name="description_dialpad_overflow" msgid="5085126640236518486">"Izinketho eziningi"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Bheka oxhumana naye <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Fonela <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Imininingwane yokuxhumana ka-<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 83ff4ae..5095cdd 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -50,7 +50,7 @@
<dimen name="dialpad_key_star_pound_size">26sp</dimen>
<dimen name="dialpad_key_numbers_width">30dp</dimen>
<dimen name="dialpad_key_letters_width">50dp</dimen>
- <dimen name="dialpad_key_height">56dp</dimen>
+ <dimen name="dialpad_key_height">56sp</dimen>
<!-- The bottom row of the dialpad is slightly taller to account for the dial button -->
<dimen name="dialpad_bottom_key_height">70dp</dimen>
<dimen name="dialpad_key_plus_size">18sp</dimen>
@@ -113,11 +113,9 @@
<!-- Margin to the left and right of the search box. -->
<dimen name="search_margin_horizontal">7dp</dimen>
<!-- Margin above the search box. -->
- <dimen name="search_top_margin">10dp</dimen>
+ <dimen name="search_top_margin">4dp</dimen>
<!-- Margin below the search box. -->
<dimen name="search_bottom_margin">4dp</dimen>
- <!-- Height of the search box. -->
- <dimen name="search_box_height">41dp</dimen>
<!-- Search box text size -->
<dimen name="search_text_size">13.24sp</dimen>
<!-- Search box interior padding - left -->
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 470c0b6..decfe9b 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -745,9 +745,9 @@
private void loadContactPhotos(Uri photoUri, String displayName, String lookupKey,
int contactType) {
final DefaultImageRequest request = new DefaultImageRequest(displayName, lookupKey,
- contactType);
+ contactType, false);
mContactPhotoManager.loadPhoto(mContactBackgroundView, photoUri,
- mContactBackgroundView.getWidth(), true, request);
+ mContactBackgroundView.getWidth(), true, false /* isCircular */, request);
}
static final class ViewEntry {
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 2e0225a..ce71245 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -20,18 +20,17 @@
import android.animation.LayoutTransition;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorListenerAdapter;
+import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
-import android.app.SearchManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.TypedArray;
-import android.graphics.Outline;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
@@ -41,28 +40,23 @@
import android.speech.RecognizerIntent;
import android.support.v4.view.ViewPager;
import android.telephony.TelephonyManager;
+import android.text.Editable;
import android.text.TextUtils;
+import android.text.TextWatcher;
import android.util.Log;
-import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnLayoutChangeListener;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.inputmethod.InputMethodManager;
import android.widget.AbsListView.OnScrollListener;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
+import android.widget.EditText;
import android.widget.PopupMenu;
import android.widget.RelativeLayout;
import android.widget.SearchView;
-import android.widget.SearchView.OnQueryTextListener;
import android.widget.Toast;
import com.android.contacts.common.CallUtil;
@@ -82,7 +76,6 @@
import com.android.dialer.list.OnDragDropListener;
import com.android.dialer.list.OnListFragmentScrolledListener;
import com.android.dialer.list.SpeedDialFragment;
-import com.android.dialer.list.PhoneFavoriteTileView;
import com.android.dialer.list.PhoneFavoriteSquareTileView;
import com.android.dialer.list.RegularSearchFragment;
import com.android.dialer.list.RemoveView;
@@ -195,7 +188,9 @@
// This view points to the Framelayout that houses both the search view and remove view
// containers.
private View mSearchAndRemoveViewContainer;
- private SearchView mSearchView;
+ private EditText mSearchView;
+ private View mSearchViewCloseButton;
+ private View mVoiceSearchButton;
/**
* View that contains the "Remove" dialog that shows up when the user long presses a contact.
* If the user releases a contact when hovering on top of this, the contact is unfavorited and
@@ -260,19 +255,19 @@
/**
* Listener used to send search queries to the phone search fragment.
*/
- private final OnQueryTextListener mPhoneSearchQueryTextListener = new OnQueryTextListener() {
+ private final TextWatcher mPhoneSearchQueryTextListener = new TextWatcher() {
@Override
- public boolean onQueryTextSubmit(String query) {
- return false;
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
- public boolean onQueryTextChange(String newText) {
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ final String newText = s.toString();
if (newText.equals(mSearchQuery)) {
// If the query hasn't changed (perhaps due to activity being destroyed
// and restored, or user launching the same DIAL intent twice), then there is
// no need to do anything here.
- return true;
+ return;
}
mSearchQuery = newText;
if (DEBUG) {
@@ -283,7 +278,9 @@
// Show search result with non-empty text. Show a bare list otherwise.
if (TextUtils.isEmpty(newText) && getInSearchUi()) {
exitSearchUi();
- return true;
+ mSearchViewCloseButton.setVisibility(View.GONE);
+ mVoiceSearchButton.setVisibility(View.VISIBLE);
+ return;
} else if (!TextUtils.isEmpty(newText)) {
final boolean sameSearchMode = (dialpadSearch && mInDialpadSearch) ||
(!dialpadSearch && mInRegularSearch);
@@ -298,9 +295,15 @@
} else if (mRegularSearchFragment != null) {
mRegularSearchFragment.setQueryString(newText, false);
}
- return true;
+ mSearchViewCloseButton.setVisibility(View.VISIBLE);
+ mVoiceSearchButton.setVisibility(View.GONE);
+ return;
}
- return true;
+ return;
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
}
};
@@ -316,8 +319,17 @@
setContentView(R.layout.dialtacts_activity);
getWindow().setBackgroundDrawable(null);
- getActionBar().setDisplayShowHomeEnabled(false);
- getActionBar().setDisplayShowTitleEnabled(false);
+ final ActionBar actionBar = getActionBar();
+ actionBar.setCustomView(R.layout.search_edittext);
+ actionBar.setDisplayShowCustomEnabled(true);
+
+ final View customView = actionBar.getCustomView();
+
+ mSearchView = (EditText) customView.findViewById(R.id.search_view);
+ mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener);
+
+ mSearchViewCloseButton = customView.findViewById(R.id.search_close_button);
+ mSearchViewCloseButton.setOnClickListener(this);
final TypedArray styledAttributes = getTheme().obtainStyledAttributes(
new int[] { android.R.attr.actionBarSize });
@@ -368,6 +380,7 @@
mInCallDialpadUp = false;
}
mFirstLaunch = false;
+ prepareVoiceSearchButton();
mDialerDatabaseHelper.startSmartDialUpdateThread();
}
@@ -442,9 +455,9 @@
break;
case R.id.search_close_button:
// Clear the search field
- if (!TextUtils.isEmpty(mSearchView.getQuery())) {
+ if (!TextUtils.isEmpty(mSearchView.getText())) {
mDialpadFragment.clearDialpad();
- mSearchView.setQuery("", false);
+ mSearchView.setText(null);
}
break;
case R.id.voice_search_button:
@@ -523,7 +536,7 @@
RecognizerIntent.EXTRA_RESULTS);
if (matches.size() > 0) {
final String match = matches.get(0);
- mSearchView.setQuery(match, false);
+ mSearchView.setText(match);
} else {
Log.e(TAG, "Voice search - nothing heard");
}
@@ -578,7 +591,7 @@
}
private void hideDialpadAndSearchUi() {
- mSearchView.setQuery("", false);
+ mSearchView.setText(null);
hideDialpadFragment(false, true);
}
@@ -641,6 +654,17 @@
}
}
+ private void prepareVoiceSearchButton() {
+ mVoiceSearchButton = getActionBar().getCustomView().findViewById(R.id.voice_search_button);
+ final Intent voiceIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
+ if (canIntentBeHandled(voiceIntent)) {
+ mVoiceSearchButton.setVisibility(View.VISIBLE);
+ mVoiceSearchButton.setOnClickListener(this);
+ } else {
+ mVoiceSearchButton.setVisibility(View.GONE);
+ }
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (DEBUG) {
@@ -648,15 +672,9 @@
}
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.dialtacts_options, menu);
- final MenuItem searchItem = menu.findItem(R.id.menu_search);
- mSearchView = (SearchView) searchItem.getActionView();
- SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
- mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
- mSearchView.setOnQueryTextListener(mPhoneSearchQueryTextListener);
- mSearchView.setIconifiedByDefault(false);
if (mPendingSearchViewQuery != null) {
- mSearchView.setQuery(mPendingSearchViewQuery, false);
+ mSearchView.setText(mPendingSearchViewQuery);
mPendingSearchViewQuery = null;
}
return super.onCreateOptionsMenu(menu);
@@ -823,7 +841,7 @@
if (mDialpadFragment != null && mDialpadFragment.isVisible()) {
hideDialpadFragment(true, false);
} else if (getInSearchUi()) {
- mSearchView.setQuery(null, false);
+ mSearchView.setText(null);
mDialpadFragment.clearDialpad();
} else {
super.onBackPressed();
@@ -837,13 +855,8 @@
}
final String normalizedQuery = SmartDialNameMatcher.normalizeNumber(query,
SmartDialNameMatcher.LATIN_SMART_DIAL_MAP);
- if (mSearchView == null) {
- if (!TextUtils.isEmpty(normalizedQuery)) {
- mPendingSearchViewQuery = normalizedQuery;
- }
- return;
- }
- if (!TextUtils.equals(mSearchView.getQuery(), normalizedQuery)) {
+
+ if (!TextUtils.equals(mSearchView.getText(), normalizedQuery)) {
if (DEBUG) {
Log.d(TAG, "onDialpadQueryChanged - new query: " + query);
}
@@ -853,9 +866,12 @@
// that would bring the user back to the search fragment regardless of the
// previous state of the application. Instead, just return here and let the
// fragment manager correctly figure out whatever fragment was last displayed.
+ if (!TextUtils.isEmpty(normalizedQuery)) {
+ mPendingSearchViewQuery = normalizedQuery;
+ }
return;
}
- mSearchView.setQuery(normalizedQuery, false);
+ mSearchView.setText(normalizedQuery);
}
}
@@ -979,7 +995,10 @@
@Override
public void onPageSelected(int position) {
mCurrentTabPosition = position;
- alignFloatingActionButtonByTab(mCurrentTabPosition);
+ // If the dialpad is showing, the floating action button should always be middle aligned.
+ if (!isDialpadShowing()) {
+ alignFloatingActionButtonByTab(mCurrentTabPosition);
+ }
}
@Override
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index aee24ba..266be34 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -882,19 +882,21 @@
private void setPhoto(CallLogListItemViews views, long photoId, Uri contactUri,
String displayName, String identifier, int contactType) {
views.quickContactView.assignContactUri(contactUri);
+ views.quickContactView.setOverlay(null);
DefaultImageRequest request = new DefaultImageRequest(displayName, identifier,
- contactType);
+ contactType, true /* isCircular */);
mContactPhotoManager.loadThumbnail(views.quickContactView, photoId, false /* darkTheme */,
- request);
+ true /* isCircular */, request);
}
private void setPhoto(CallLogListItemViews views, Uri photoUri, Uri contactUri,
String displayName, String identifier, int contactType) {
views.quickContactView.assignContactUri(contactUri);
+ views.quickContactView.setOverlay(null);
DefaultImageRequest request = new DefaultImageRequest(displayName, identifier,
- contactType);
+ contactType, true /* isCircular */);
mContactPhotoManager.loadDirectoryPhoto(views.quickContactView, photoUri,
- false /* darkTheme */, request);
+ false /* darkTheme */, true /* isCircular */, request);
}
diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java
index 3992676..64eddec 100644
--- a/src/com/android/dialer/calllog/CallLogQueryHandler.java
+++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java
@@ -112,6 +112,8 @@
Log.w(TAG, "Exception on background worker thread", e);
} catch (SQLiteDatabaseCorruptException e) {
Log.w(TAG, "Exception on background worker thread", e);
+ } catch (IllegalArgumentException e) {
+ Log.w(TAG, "ContactsProvider not present on device", e);
}
}
}
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index 72abaa0..0ca26e9 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -405,6 +405,7 @@
mDigits.setOnKeyListener(this);
mDigits.setOnLongClickListener(this);
mDigits.addTextChangedListener(this);
+ mDigits.setElegantTextHeight(false);
PhoneNumberFormatter.setPhoneNumberFormattingTextWatcher(getActivity(), mDigits);
// Check for the presence of the keypad
View oneButton = fragmentView.findViewById(R.id.one);
@@ -624,6 +625,7 @@
lettersView = (TextView) dialpadKey.findViewById(R.id.dialpad_key_letters);
final String numberString = resources.getString(numberIds[i]);
numberView.setText(numberString);
+ numberView.setElegantTextHeight(false);
dialpadKey.setContentDescription(numberString);
if (lettersView != null) {
lettersView.setText(resources.getString(letterIds[i]));
diff --git a/src/com/android/dialer/list/ListsFragment.java b/src/com/android/dialer/list/ListsFragment.java
index a61d8a5..49d6b3a 100644
--- a/src/com/android/dialer/list/ListsFragment.java
+++ b/src/com/android/dialer/list/ListsFragment.java
@@ -9,16 +9,17 @@
import android.content.Loader;
import android.content.SharedPreferences;
import android.database.Cursor;
+import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.LinearLayout;
import android.widget.ListView;
import com.android.contacts.common.GeoUtil;
@@ -32,6 +33,9 @@
import com.android.dialer.calllog.CallLogQuery;
import com.android.dialer.calllog.CallLogQueryHandler;
import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.list.ShortcutCardsAdapter.SwipeableShortcutCard;
+import com.android.dialer.widget.OverlappingPaneLayout;
+import com.android.dialer.widget.OverlappingPaneLayout.PanelSlideListener;
import com.android.dialerbind.ObjectFactory;
import java.util.ArrayList;
@@ -226,10 +230,8 @@
(ListView) parentView.findViewById(R.id.shortcut_card_list);
shortcutCardsListView.setAdapter(mMergedAdapter);
- LayoutTransition transition = ((LinearLayout) parentView).getLayoutTransition();
- // Turns on animations for all types of layout changes so that they occur for
- // height changes.
- transition.enableTransitionType(LayoutTransition.CHANGING);
+ setupPaneLayout((OverlappingPaneLayout) parentView, shortcutCardsListView);
+
return parentView;
}
@@ -295,4 +297,39 @@
mOnPageChangeListeners.get(i).onPageScrollStateChanged(state);
}
}
+
+ private void setupPaneLayout(OverlappingPaneLayout paneLayout,
+ final ListView shortcutCardsListView) {
+ // TODO: Remove the notion of a capturable view. The entire view be slideable, once
+ // the framework better supports nested scrolling.
+ paneLayout.setCapturableView(mViewPagerTabs);
+ paneLayout.openPane();
+ paneLayout.setPanelSlideListener(new PanelSlideListener() {
+ @Override
+ public void onPanelSlide(View panel, float slideOffset) {
+ // For every 2 percent that the panel is slid upwards, clip 3 percent from each edge
+ // of the shortcut card, to achieve the animated effect of the shortcut card
+ // rapidly shrinking and disappearing from view when the panel is slid upwards.
+ float ratioCardHidden = (1 - slideOffset) * 1.5f;
+ if (shortcutCardsListView.getCount() > 0) {
+ SwipeableShortcutCard v =
+ (SwipeableShortcutCard) shortcutCardsListView.getChildAt(0);
+ v.clipCard(ratioCardHidden);
+ }
+ }
+
+ @Override
+ public void onPanelOpened(View panel) {
+ }
+
+ @Override
+ public void onPanelClosed(View panel) {
+ }
+ });
+
+ LayoutTransition transition = paneLayout.getLayoutTransition();
+ // Turns on animations for all types of layout changes so that they occur for
+ // height changes.
+ transition.enableTransitionType(LayoutTransition.CHANGING);
+ }
}
diff --git a/src/com/android/dialer/list/PhoneFavoriteTileView.java b/src/com/android/dialer/list/PhoneFavoriteTileView.java
index 3626bcb..862952d 100644
--- a/src/com/android/dialer/list/PhoneFavoriteTileView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteTileView.java
@@ -131,7 +131,7 @@
@Override
protected DefaultImageRequest getDefaultImageRequest(String displayName, String lookupKey) {
return new DefaultImageRequest(displayName, lookupKey, ContactPhotoManager.TYPE_DEFAULT,
- DEFAULT_IMAGE_LETTER_SCALE, DEFAULT_IMAGE_LETTER_OFFSET);
+ DEFAULT_IMAGE_LETTER_SCALE, DEFAULT_IMAGE_LETTER_OFFSET, false);
}
@Override
diff --git a/src/com/android/dialer/list/ShortcutCardsAdapter.java b/src/com/android/dialer/list/ShortcutCardsAdapter.java
index 0009ee5..8a1f64c 100644
--- a/src/com/android/dialer/list/ShortcutCardsAdapter.java
+++ b/src/com/android/dialer/list/ShortcutCardsAdapter.java
@@ -20,6 +20,7 @@
import android.content.res.Resources;
import android.database.Cursor;
import android.database.DataSetObserver;
+import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
@@ -150,12 +151,12 @@
@Override
public View getView(int position, View convertView, ViewGroup parent) {
- final SwipeableCallLogRow wrapper;
+ final SwipeableShortcutCard wrapper;
if (convertView == null) {
- wrapper = new SwipeableCallLogRow(mContext);
+ wrapper = new SwipeableShortcutCard(mContext);
wrapper.setOnItemSwipeListener(mCallLogOnItemSwipeListener);
} else {
- wrapper = (SwipeableCallLogRow) convertView;
+ wrapper = (SwipeableShortcutCard) convertView;
}
// Special case wrapper view for the most recent call log item. This allows
@@ -186,11 +187,11 @@
/**
* The swipeable call log row.
*/
- private class SwipeableCallLogRow extends FrameLayout implements SwipeHelperCallback {
+ class SwipeableShortcutCard extends FrameLayout implements SwipeHelperCallback {
private SwipeHelper mSwipeHelper;
private OnItemGestureListener mOnItemSwipeListener;
- public SwipeableCallLogRow(Context context) {
+ public SwipeableShortcutCard(Context context) {
super(context);
final float densityScale = getResources().getDisplayMetrics().density;
final float pagingTouchSlop = ViewConfiguration.get(context)
@@ -270,5 +271,49 @@
public void setOnItemSwipeListener(OnItemGestureListener listener) {
mOnItemSwipeListener = listener;
}
+
+ private float mPreviousTranslationZ = 0;
+ private Rect mClipRect = new Rect();
+
+ /**
+ * Clips the card by a specified amount.
+ *
+ * @param ratioHidden A float indicating how much of each edge of the card should be
+ * clipped. If 0, the entire card is displayed. If 0.5f, each edge is hidden
+ * entirely, thus obscuring the entire card.
+ */
+ public void clipCard(float ratioHidden) {
+ final View viewToClip = getChildAt(0);
+ if (viewToClip == null) {
+ return;
+ }
+ int width = viewToClip.getWidth();
+ int height = viewToClip.getHeight();
+
+ if (ratioHidden <= 0.01f) {
+ viewToClip.setTranslationZ(mPreviousTranslationZ);
+ } else if (viewToClip.getTranslationZ() != 0){
+ mPreviousTranslationZ = viewToClip.getTranslationZ();
+ viewToClip.setTranslationZ(0);
+ }
+
+ if (ratioHidden > 0.5f) {
+ mClipRect.set(0, 0 , 0, 0);
+ } else {
+ int newLeft = (int) (ratioHidden * width);
+ int newRight = (width - newLeft);
+ int newTop = (int) (ratioHidden * height);
+ int newBottom = (height - newTop);
+ mClipRect.set(newLeft, newTop, newRight, newBottom);
+ }
+ viewToClip.setClipBounds(mClipRect);
+
+ // If the view has any children, fade them out of view.
+ final ViewGroup viewGroup = (ViewGroup) viewToClip;
+ final int count = viewGroup.getChildCount();
+ for (int i = 0; i < count; i++) {
+ viewGroup.getChildAt(i).setAlpha(Math.max(0, 1 - 4 * ratioHidden));
+ }
+ }
}
}
diff --git a/src/com/android/dialer/list/SmartDialSearchFragment.java b/src/com/android/dialer/list/SmartDialSearchFragment.java
index 0efe918..4f0ce72 100644
--- a/src/com/android/dialer/list/SmartDialSearchFragment.java
+++ b/src/com/android/dialer/list/SmartDialSearchFragment.java
@@ -41,6 +41,8 @@
// Disable the direct call shortcut for the smart dial fragment, since the call button
// will already be showing anyway.
adapter.setShortcutEnabled(SmartDialNumberListAdapter.SHORTCUT_DIRECT_CALL, false);
+ adapter.setShortcutEnabled(SmartDialNumberListAdapter.SHORTCUT_ADD_NUMBER_TO_CONTACTS,
+ false);
return adapter;
}
diff --git a/src/com/android/dialer/list/SpeedDialFragment.java b/src/com/android/dialer/list/SpeedDialFragment.java
index 9de75bb..cfcea9d 100644
--- a/src/com/android/dialer/list/SpeedDialFragment.java
+++ b/src/com/android/dialer/list/SpeedDialFragment.java
@@ -32,6 +32,8 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
+import android.view.animation.AnimationUtils;
+import android.view.animation.LayoutAnimationController;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
@@ -216,6 +218,10 @@
mTileInteractionTeaserView = (TileInteractionTeaserView) inflater.inflate(
R.layout.tile_interactions_teaser_view, mListView, false);
+ final LayoutAnimationController controller = new LayoutAnimationController(
+ AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_in));
+ controller.setDelay(0);
+ mListView.setLayoutAnimation(controller);
mListView.setAdapter(mContactTileAdapter);
mListView.setOnScrollListener(mScrollListener);
diff --git a/src/com/android/dialer/widget/OverlappingPaneLayout.java b/src/com/android/dialer/widget/OverlappingPaneLayout.java
new file mode 100644
index 0000000..d6ebbb0
--- /dev/null
+++ b/src/com/android/dialer/widget/OverlappingPaneLayout.java
@@ -0,0 +1,1076 @@
+/*
+ * Copyright (C) 2012 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.dialer.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.v4.view.AccessibilityDelegateCompat;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.widget.ViewDragHelper;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
+
+import java.util.ArrayList;
+
+/**
+ * A custom layout that aligns its child views vertically as two panes, and allows for the bottom
+ * pane to be dragged upwards to overlap and hide the top pane. This layout is adapted from
+ * {@link android.support.v4.widget.SlidingPaneLayout}.
+ */
+public class OverlappingPaneLayout extends ViewGroup {
+ private static final String TAG = "SlidingPaneLayout";
+
+ /**
+ * Default size of the overhang for a pane in the open state.
+ * At least this much of a sliding pane will remain visible.
+ * This indicates that there is more content available and provides
+ * a "physical" edge to grab to pull it closed.
+ */
+ private static final int DEFAULT_OVERHANG_SIZE = 32; // dp;
+
+ /**
+ * If no fade color is given by default it will fade to 80% gray.
+ */
+ private static final int DEFAULT_FADE_COLOR = 0xcccccccc;
+
+ /**
+ * Minimum velocity that will be detected as a fling
+ */
+ private static final int MIN_FLING_VELOCITY = 400; // dips per second
+
+ /**
+ * The size of the overhang in pixels.
+ * This is the minimum section of the sliding panel that will
+ * be visible in the open state to allow for a closing drag.
+ */
+ private final int mOverhangSize;
+
+ /**
+ * True if a panel can slide with the current measurements
+ */
+ private boolean mCanSlide;
+
+ /**
+ * The child view that can slide, if any.
+ */
+ private View mSlideableView;
+
+ /**
+ * The view that can be used to start the drag with.
+ */
+ private View mCapturableView;
+
+ /**
+ * How far the panel is offset from its closed position.
+ * range [0, 1] where 0 = closed, 1 = open.
+ */
+ private float mSlideOffset;
+
+ /**
+ * How far in pixels the slideable panel may move.
+ */
+ private int mSlideRange;
+
+ /**
+ * A panel view is locked into internal scrolling or another condition that
+ * is preventing a drag.
+ */
+ private boolean mIsUnableToDrag;
+
+ private float mInitialMotionX;
+ private float mInitialMotionY;
+
+ private PanelSlideListener mPanelSlideListener;
+
+ private final ViewDragHelper mDragHelper;
+
+ /**
+ * Stores whether or not the pane was open the last time it was slideable.
+ * If open/close operations are invoked this state is modified. Used by
+ * instance state save/restore.
+ */
+ private boolean mPreservedOpenState;
+ private boolean mFirstLayout = true;
+
+ private final Rect mTmpRect = new Rect();
+
+ /**
+ * Listener for monitoring events about sliding panes.
+ */
+ public interface PanelSlideListener {
+ /**
+ * Called when a sliding pane's position changes.
+ * @param panel The child view that was moved
+ * @param slideOffset The new offset of this sliding pane within its range, from 0-1
+ */
+ public void onPanelSlide(View panel, float slideOffset);
+ /**
+ * Called when a sliding pane becomes slid completely open. The pane may or may not
+ * be interactive at this point depending on how much of the pane is visible.
+ * @param panel The child view that was slid to an open position, revealing other panes
+ */
+ public void onPanelOpened(View panel);
+
+ /**
+ * Called when a sliding pane becomes slid completely closed. The pane is now guaranteed
+ * to be interactive. It may now obscure other views in the layout.
+ * @param panel The child view that was slid to a closed position
+ */
+ public void onPanelClosed(View panel);
+ }
+
+ public OverlappingPaneLayout(Context context) {
+ this(context, null);
+ }
+
+ public OverlappingPaneLayout(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public OverlappingPaneLayout(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ final float density = context.getResources().getDisplayMetrics().density;
+ mOverhangSize = (int) (DEFAULT_OVERHANG_SIZE * density + 0.5f);
+
+ setWillNotDraw(false);
+
+ ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegate());
+ ViewCompat.setImportantForAccessibility(this, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+
+ mDragHelper = ViewDragHelper.create(this, 0.5f, new DragHelperCallback());
+ mDragHelper.setMinVelocity(MIN_FLING_VELOCITY * density);
+ }
+
+ /**
+ * Set the view that can be used to start dragging the sliding pane.
+ */
+ public void setCapturableView(View capturableView) {
+ mCapturableView = capturableView;
+ }
+
+ public void setPanelSlideListener(PanelSlideListener listener) {
+ mPanelSlideListener = listener;
+ }
+
+ void dispatchOnPanelSlide(View panel) {
+ if (mPanelSlideListener != null) {
+ mPanelSlideListener.onPanelSlide(panel, mSlideOffset);
+ }
+ }
+
+ void dispatchOnPanelOpened(View panel) {
+ if (mPanelSlideListener != null) {
+ mPanelSlideListener.onPanelOpened(panel);
+ }
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+ }
+
+ void dispatchOnPanelClosed(View panel) {
+ if (mPanelSlideListener != null) {
+ mPanelSlideListener.onPanelClosed(panel);
+ }
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+ }
+
+ void updateObscuredViewsVisibility(View panel) {
+ final int startBound = getPaddingTop();
+ final int endBound = getHeight() - getPaddingBottom();
+
+ final int leftBound = getPaddingLeft();
+ final int rightBound = getWidth() - getPaddingRight();
+ final int left;
+ final int right;
+ final int top;
+ final int bottom;
+ if (panel != null && viewIsOpaque(panel)) {
+ left = panel.getLeft();
+ right = panel.getRight();
+ top = panel.getTop();
+ bottom = panel.getBottom();
+ } else {
+ left = right = top = bottom = 0;
+ }
+
+ for (int i = 0, childCount = getChildCount(); i < childCount; i++) {
+ final View child = getChildAt(i);
+
+ if (child == panel) {
+ // There are still more children above the panel but they won't be affected.
+ break;
+ }
+
+ final int clampedChildLeft = Math.max(leftBound, child.getLeft());
+ final int clampedChildRight = Math.min(rightBound, child.getRight());
+ final int clampedChildTop = Math.max(startBound, child.getTop());
+ final int clampedChildBottom = Math.min(endBound, child.getBottom());
+
+ final int vis;
+ if (clampedChildLeft >= left && clampedChildTop >= top &&
+ clampedChildRight <= right && clampedChildBottom <= bottom) {
+ vis = INVISIBLE;
+ } else {
+ vis = VISIBLE;
+ }
+ child.setVisibility(vis);
+ }
+ }
+
+ void setAllChildrenVisible() {
+ for (int i = 0, childCount = getChildCount(); i < childCount; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() == INVISIBLE) {
+ child.setVisibility(VISIBLE);
+ }
+ }
+ }
+
+ private static boolean viewIsOpaque(View v) {
+ if (ViewCompat.isOpaque(v)) return true;
+
+ final Drawable bg = v.getBackground();
+ if (bg != null) {
+ return bg.getOpacity() == PixelFormat.OPAQUE;
+ }
+ return false;
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mFirstLayout = true;
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mFirstLayout = true;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+
+ int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+ int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+ int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+
+ if (widthMode != MeasureSpec.EXACTLY) {
+ if (isInEditMode()) {
+ // Don't crash the layout editor. Consume all of the space if specified
+ // or pick a magic number from thin air otherwise.
+ // TODO Better communication with tools of this bogus state.
+ // It will crash on a real device.
+ if (widthMode == MeasureSpec.AT_MOST) {
+ widthMode = MeasureSpec.EXACTLY;
+ } else if (widthMode == MeasureSpec.UNSPECIFIED) {
+ widthMode = MeasureSpec.EXACTLY;
+ widthSize = 300;
+ }
+ } else {
+ throw new IllegalStateException("Width must have an exact value or MATCH_PARENT");
+ }
+ } else if (heightMode == MeasureSpec.UNSPECIFIED) {
+ if (isInEditMode()) {
+ // Don't crash the layout editor. Pick a magic number from thin air instead.
+ // TODO Better communication with tools of this bogus state.
+ // It will crash on a real device.
+ if (heightMode == MeasureSpec.UNSPECIFIED) {
+ heightMode = MeasureSpec.AT_MOST;
+ heightSize = 300;
+ }
+ } else {
+ throw new IllegalStateException("Height must not be UNSPECIFIED");
+ }
+ }
+
+ int layoutWidth = 0;
+ int maxLayoutWidth = -1;
+ switch (widthMode) {
+ case MeasureSpec.EXACTLY:
+ layoutWidth = maxLayoutWidth = widthSize - getPaddingLeft() - getPaddingRight();
+ break;
+ case MeasureSpec.AT_MOST:
+ maxLayoutWidth = widthSize - getPaddingLeft() - getPaddingRight();
+ break;
+ }
+
+ float weightSum = 0;
+ boolean canSlide = false;
+ final int heightAvailable = heightSize - getPaddingTop() - getPaddingBottom();
+ int heightRemaining = heightAvailable;
+ final int childCount = getChildCount();
+
+ if (childCount > 2) {
+ Log.e(TAG, "onMeasure: More than two child views are not supported.");
+ }
+
+ // We'll find the current one below.
+ mSlideableView = null;
+
+ // First pass. Measure based on child LayoutParams width/height.
+ // Weight will incur a second pass.
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+ if (child.getVisibility() == GONE) {
+ continue;
+ }
+
+ if (lp.weight > 0) {
+ weightSum += lp.weight;
+
+ // If we have no height, weight is the only contributor to the final size.
+ // Measure this view on the weight pass only.
+ if (lp.height == 0) continue;
+ }
+
+ int childHeightSpec;
+ final int verticalMargin = lp.topMargin + lp.bottomMargin;
+ if (lp.height == LayoutParams.WRAP_CONTENT) {
+ childHeightSpec = MeasureSpec.makeMeasureSpec(heightAvailable - verticalMargin,
+ MeasureSpec.AT_MOST);
+ } else if (lp.height == LayoutParams.MATCH_PARENT) {
+ childHeightSpec = MeasureSpec.makeMeasureSpec(heightAvailable - verticalMargin,
+ MeasureSpec.EXACTLY);
+ } else {
+ childHeightSpec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);
+ }
+
+ int childWidthSpec;
+ if (lp.width == LayoutParams.WRAP_CONTENT) {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(maxLayoutWidth, MeasureSpec.AT_MOST);
+ } else if (lp.width == LayoutParams.MATCH_PARENT) {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(maxLayoutWidth, MeasureSpec.EXACTLY);
+ } else {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY);
+ }
+
+ child.measure(childWidthSpec, childHeightSpec);
+ final int childWidth = child.getMeasuredWidth();
+ final int childHeight = child.getMeasuredHeight();
+
+ if (widthMode == MeasureSpec.AT_MOST && childWidth > layoutWidth) {
+ layoutWidth = Math.min(childWidth, maxLayoutWidth);
+ }
+
+ heightRemaining -= childHeight;
+ canSlide |= lp.slideable = heightRemaining < 0;
+ if (lp.slideable) {
+ mSlideableView = child;
+ }
+ }
+
+ // Resolve weight and make sure non-sliding panels are smaller than the full screen.
+ if (canSlide || weightSum > 0) {
+ final int fixedPanelHeightLimit = heightAvailable - mOverhangSize;
+
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+
+ if (child.getVisibility() == GONE) {
+ continue;
+ }
+
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+ if (child.getVisibility() == GONE) {
+ continue;
+ }
+
+ final boolean skippedFirstPass = lp.height == 0 && lp.weight > 0;
+ final int measuredHeight = skippedFirstPass ? 0 : child.getMeasuredHeight();
+ if (canSlide && child != mSlideableView) {
+ if (lp.height < 0 && (measuredHeight > fixedPanelHeightLimit || lp.weight > 0)) {
+ // Fixed panels in a sliding configuration should
+ // be clamped to the fixed panel limit.
+ final int childWidthSpec;
+ if (skippedFirstPass) {
+ // Do initial width measurement if we skipped measuring this view
+ // the first time around.
+ if (lp.width == LayoutParams.WRAP_CONTENT) {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(maxLayoutWidth,
+ MeasureSpec.AT_MOST);
+ } else if (lp.height == LayoutParams.MATCH_PARENT) {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(maxLayoutWidth,
+ MeasureSpec.EXACTLY);
+ } else {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(lp.width,
+ MeasureSpec.EXACTLY);
+ }
+ } else {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(
+ child.getMeasuredWidth(), MeasureSpec.EXACTLY);
+ }
+ final int childHeightSpec = MeasureSpec.makeMeasureSpec(
+ fixedPanelHeightLimit, MeasureSpec.EXACTLY);
+ child.measure(childWidthSpec, childHeightSpec);
+ }
+ } else if (lp.weight > 0) {
+ int childWidthSpec;
+ if (lp.height == 0) {
+ // This was skipped the first time; figure out a real width spec.
+ if (lp.width == LayoutParams.WRAP_CONTENT) {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(maxLayoutWidth,
+ MeasureSpec.AT_MOST);
+ } else if (lp.width == LayoutParams.MATCH_PARENT) {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(maxLayoutWidth,
+ MeasureSpec.EXACTLY);
+ } else {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(lp.width,
+ MeasureSpec.EXACTLY);
+ }
+ } else {
+ childWidthSpec = MeasureSpec.makeMeasureSpec(
+ child.getMeasuredWidth(), MeasureSpec.EXACTLY);
+ }
+
+ if (canSlide) {
+ // Consume available space
+ final int verticalMargin = lp.topMargin + lp.bottomMargin;
+ final int newHeight = heightAvailable - verticalMargin;
+ final int childHeightSpec = MeasureSpec.makeMeasureSpec(
+ newHeight, MeasureSpec.EXACTLY);
+ if (measuredHeight != newHeight) {
+ child.measure(childWidthSpec, childHeightSpec);
+ }
+ } else {
+ // Distribute the extra width proportionally similar to LinearLayout
+ final int heightToDistribute = Math.max(0, heightRemaining);
+ final int addedHeight = (int) (lp.weight * heightToDistribute / weightSum);
+ final int childHeightSpec = MeasureSpec.makeMeasureSpec(
+ measuredHeight + addedHeight, MeasureSpec.EXACTLY);
+ child.measure(childWidthSpec, childHeightSpec);
+ }
+ }
+ }
+ }
+
+ final int measuredHeight = heightSize;
+ final int measuredWidth = layoutWidth + getPaddingLeft() + getPaddingRight();
+
+ setMeasuredDimension(measuredWidth, measuredHeight);
+ mCanSlide = canSlide;
+
+ if (mDragHelper.getViewDragState() != ViewDragHelper.STATE_IDLE && !canSlide) {
+ // Cancel scrolling in progress, it's no longer relevant.
+ mDragHelper.abort();
+ }
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_TOP);
+
+ final int height = b - t;
+ final int paddingTop = getPaddingTop();
+ final int paddingBottom = getPaddingBottom();
+ final int paddingLeft = getPaddingLeft();
+
+ final int childCount = getChildCount();
+ int yStart = paddingTop;
+ int nextYStart = yStart;
+
+ if (mFirstLayout) {
+ mSlideOffset = mCanSlide && mPreservedOpenState ? 1.f : 0.f;
+ }
+
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+
+ if (child.getVisibility() == GONE) {
+ continue;
+ }
+
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+ final int childHeight = child.getMeasuredHeight();
+
+ if (lp.slideable) {
+ final int margin = lp.topMargin + lp.bottomMargin;
+ final int range = Math.min(nextYStart,
+ height - paddingBottom - mOverhangSize) - yStart - margin;
+ mSlideRange = range;
+ final int lpMargin = lp.topMargin;
+ final int pos = (int) (range * mSlideOffset);
+ yStart += pos + lpMargin;
+ mSlideOffset = (float) pos / mSlideRange;
+ } else {
+ yStart = nextYStart;
+ }
+
+ final int childTop = yStart;
+ final int childBottom = childTop + childHeight;
+ final int childLeft = paddingLeft;
+ final int childRight = childLeft + child.getMeasuredWidth();
+
+ child.layout(childLeft, childTop, childRight, childBottom);
+
+ nextYStart += child.getHeight();
+ }
+
+ if (mFirstLayout) {
+ updateObscuredViewsVisibility(mSlideableView);
+ }
+
+ mFirstLayout = false;
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ // Recalculate sliding panes and their details
+ if (h != oldh) {
+ mFirstLayout = true;
+ }
+ }
+
+ @Override
+ public void requestChildFocus(View child, View focused) {
+ super.requestChildFocus(child, focused);
+ if (!isInTouchMode() && !mCanSlide) {
+ mPreservedOpenState = child == mSlideableView;
+ }
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ final int action = MotionEventCompat.getActionMasked(ev);
+
+ // Preserve the open state based on the last view that was touched.
+ if (!mCanSlide && action == MotionEvent.ACTION_DOWN && getChildCount() > 1) {
+ // After the first things will be slideable.
+ final View secondChild = getChildAt(1);
+ if (secondChild != null) {
+ mPreservedOpenState = !mDragHelper.isViewUnder(secondChild,
+ (int) ev.getX(), (int) ev.getY());
+ }
+ }
+
+ if (!mCanSlide || (mIsUnableToDrag && action != MotionEvent.ACTION_DOWN)) {
+ mDragHelper.cancel();
+ return super.onInterceptTouchEvent(ev);
+ }
+
+ if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
+ mDragHelper.cancel();
+ return false;
+ }
+
+ switch (action) {
+ case MotionEvent.ACTION_DOWN: {
+ mIsUnableToDrag = false;
+ final float x = ev.getX();
+ final float y = ev.getY();
+ mInitialMotionX = x;
+ mInitialMotionY = y;
+
+ break;
+ }
+
+ case MotionEvent.ACTION_MOVE: {
+ final float x = ev.getX();
+ final float y = ev.getY();
+ final float adx = Math.abs(x - mInitialMotionX);
+ final float ady = Math.abs(y - mInitialMotionY);
+ final int slop = mDragHelper.getTouchSlop();
+ if (ady > slop && adx > ady || !isCapturableViewUnder((int) x, (int) y)) {
+ mDragHelper.cancel();
+ mIsUnableToDrag = true;
+ return false;
+ }
+ }
+ }
+
+ final boolean interceptForDrag = mDragHelper.shouldInterceptTouchEvent(ev);
+
+ return interceptForDrag;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ if (!mCanSlide) {
+ return super.onTouchEvent(ev);
+ }
+
+ mDragHelper.processTouchEvent(ev);
+
+ final int action = ev.getAction();
+ boolean wantTouchEvents = true;
+
+ switch (action & MotionEventCompat.ACTION_MASK) {
+ case MotionEvent.ACTION_DOWN: {
+ final float x = ev.getX();
+ final float y = ev.getY();
+ mInitialMotionX = x;
+ mInitialMotionY = y;
+ break;
+ }
+ }
+
+ return wantTouchEvents;
+ }
+
+ private boolean closePane(View pane, int initialVelocity) {
+ if (mFirstLayout || smoothSlideTo(0.f, initialVelocity)) {
+ mPreservedOpenState = false;
+ return true;
+ }
+ return false;
+ }
+
+ private boolean openPane(View pane, int initialVelocity) {
+ if (mFirstLayout || smoothSlideTo(1.f, initialVelocity)) {
+ mPreservedOpenState = true;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Open the sliding pane if it is currently slideable. If first layout
+ * has already completed this will animate.
+ *
+ * @return true if the pane was slideable and is now open/in the process of opening
+ */
+ public boolean openPane() {
+ return openPane(mSlideableView, 0);
+ }
+
+ /**
+ * Close the sliding pane if it is currently slideable. If first layout
+ * has already completed this will animate.
+ *
+ * @return true if the pane was slideable and is now closed/in the process of closing
+ */
+ public boolean closePane() {
+ return closePane(mSlideableView, 0);
+ }
+
+ /**
+ * Check if the layout is completely open. It can be open either because the slider
+ * itself is open revealing the left pane, or if all content fits without sliding.
+ *
+ * @return true if sliding panels are completely open
+ */
+ public boolean isOpen() {
+ return !mCanSlide || mSlideOffset == 1;
+ }
+
+ /**
+ * Check if the content in this layout cannot fully fit side by side and therefore
+ * the content pane can be slid back and forth.
+ *
+ * @return true if content in this layout can be slid open and closed
+ */
+ public boolean isSlideable() {
+ return mCanSlide;
+ }
+
+ private void onPanelDragged(int newTop) {
+ if (mSlideableView == null) {
+ // This can happen if we're aborting motion during layout because everything now fits.
+ mSlideOffset = 0;
+ return;
+ }
+ final LayoutParams lp = (LayoutParams) mSlideableView.getLayoutParams();
+
+ final int lpMargin = lp.topMargin;
+ final int topBound = getPaddingTop() + lpMargin;
+
+ mSlideOffset = (float) (newTop - topBound) / mSlideRange;
+
+ dispatchOnPanelSlide(mSlideableView);
+ }
+
+ @Override
+ protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ boolean result;
+ final int save = canvas.save(Canvas.CLIP_SAVE_FLAG);
+
+ if (mCanSlide && !lp.slideable && mSlideableView != null) {
+ // Clip against the slider; no sense drawing what will immediately be covered.
+ canvas.getClipBounds(mTmpRect);
+
+ mTmpRect.bottom = Math.min(mTmpRect.bottom, mSlideableView.getTop());
+ canvas.clipRect(mTmpRect);
+ }
+
+ if (Build.VERSION.SDK_INT >= 11) { // HC
+ result = super.drawChild(canvas, child, drawingTime);
+ } else {
+ if (child.isDrawingCacheEnabled()) {
+ child.setDrawingCacheEnabled(false);
+ }
+ result = super.drawChild(canvas, child, drawingTime);
+ }
+
+ canvas.restoreToCount(save);
+
+ return result;
+ }
+
+ /**
+ * Smoothly animate mDraggingPane to the target X position within its range.
+ *
+ * @param slideOffset position to animate to
+ * @param velocity initial velocity in case of fling, or 0.
+ */
+ boolean smoothSlideTo(float slideOffset, int velocity) {
+ if (!mCanSlide) {
+ // Nothing to do.
+ return false;
+ }
+
+ final LayoutParams lp = (LayoutParams) mSlideableView.getLayoutParams();
+
+ int y;
+ int topBound = getPaddingTop() + lp.topMargin;
+ y = (int) (topBound + slideOffset * mSlideRange);
+
+ if (mDragHelper.smoothSlideViewTo(mSlideableView, mSlideableView.getLeft(), y)) {
+ setAllChildrenVisible();
+ ViewCompat.postInvalidateOnAnimation(this);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void computeScroll() {
+ if (mDragHelper.continueSettling(true)) {
+ if (!mCanSlide) {
+ mDragHelper.abort();
+ return;
+ }
+
+ ViewCompat.postInvalidateOnAnimation(this);
+ }
+ }
+
+ private boolean isCapturableViewUnder(int x, int y) {
+ View capturableView = mCapturableView != null ? mCapturableView : mSlideableView;
+ if (capturableView == null) {
+ return false;
+ }
+ int[] viewLocation = new int[2];
+ capturableView.getLocationOnScreen(viewLocation);
+ int[] parentLocation = new int[2];
+ this.getLocationOnScreen(parentLocation);
+ int screenX = parentLocation[0] + x;
+ int screenY = parentLocation[1] + y;
+ return screenX >= viewLocation[0]
+ && screenX < viewLocation[0] + capturableView.getWidth()
+ && screenY >= viewLocation[1]
+ && screenY < viewLocation[1] + capturableView.getHeight();
+ }
+
+ @Override
+ protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
+ return new LayoutParams();
+ }
+
+ @Override
+ protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
+ return p instanceof MarginLayoutParams
+ ? new LayoutParams((MarginLayoutParams) p)
+ : new LayoutParams(p);
+ }
+
+ @Override
+ protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
+ return p instanceof LayoutParams && super.checkLayoutParams(p);
+ }
+
+ @Override
+ public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ Parcelable superState = super.onSaveInstanceState();
+
+ SavedState ss = new SavedState(superState);
+ ss.isOpen = isSlideable() ? isOpen() : mPreservedOpenState;
+
+ return ss;
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ SavedState ss = (SavedState) state;
+ super.onRestoreInstanceState(ss.getSuperState());
+
+ if (ss.isOpen) {
+ openPane();
+ } else {
+ closePane();
+ }
+ mPreservedOpenState = ss.isOpen;
+ }
+
+ private class DragHelperCallback extends ViewDragHelper.Callback {
+
+ @Override
+ public boolean tryCaptureView(View child, int pointerId) {
+ if (mIsUnableToDrag) {
+ return false;
+ }
+
+ return ((LayoutParams) child.getLayoutParams()).slideable;
+ }
+
+ @Override
+ public void onViewDragStateChanged(int state) {
+ if (mDragHelper.getViewDragState() == ViewDragHelper.STATE_IDLE) {
+ if (mSlideOffset == 0) {
+ updateObscuredViewsVisibility(mSlideableView);
+ dispatchOnPanelClosed(mSlideableView);
+ mPreservedOpenState = false;
+ } else {
+ dispatchOnPanelOpened(mSlideableView);
+ mPreservedOpenState = true;
+ }
+ }
+ }
+
+ @Override
+ public void onViewCaptured(View capturedChild, int activePointerId) {
+ // Make all child views visible in preparation for sliding things around
+ setAllChildrenVisible();
+ }
+
+ @Override
+ public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
+ onPanelDragged(top);
+ invalidate();
+ }
+
+ @Override
+ public void onViewReleased(View releasedChild, float xvel, float yvel) {
+ final LayoutParams lp = (LayoutParams) releasedChild.getLayoutParams();
+
+ int top = getPaddingTop() + lp.topMargin;
+ if (yvel > 0 || (yvel == 0 && mSlideOffset > 0.5f)) {
+ top += mSlideRange;
+ }
+
+ int left;
+ mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), top);
+ invalidate();
+ }
+
+ @Override
+ public int getViewVerticalDragRange(View child) {
+ return mSlideRange;
+ }
+
+ @Override
+ public int clampViewPositionHorizontal(View child, int left, int dx) {
+ // Make sure we never move views horizontally.
+ return child.getLeft();
+ }
+
+ @Override
+ public int clampViewPositionVertical(View child, int top, int dy) {
+ final LayoutParams lp = (LayoutParams) mSlideableView.getLayoutParams();
+
+ final int newTop;
+ int topBound = getPaddingTop() + lp.topMargin;
+ int bottomBound = topBound + mSlideRange;
+ newTop = Math.min(Math.max(top, topBound), bottomBound);
+
+ return newTop;
+ }
+
+ @Override
+ public void onEdgeDragStarted(int edgeFlags, int pointerId) {
+ mDragHelper.captureChildView(mSlideableView, pointerId);
+ }
+ }
+
+ public static class LayoutParams extends ViewGroup.MarginLayoutParams {
+ private static final int[] ATTRS = new int[] {
+ android.R.attr.layout_weight
+ };
+
+ /**
+ * The weighted proportion of how much of the leftover space
+ * this child should consume after measurement.
+ */
+ public float weight = 0;
+
+ /**
+ * True if this pane is the slideable pane in the layout.
+ */
+ boolean slideable;
+
+ public LayoutParams() {
+ super(FILL_PARENT, FILL_PARENT);
+ }
+
+ public LayoutParams(int width, int height) {
+ super(width, height);
+ }
+
+ public LayoutParams(android.view.ViewGroup.LayoutParams source) {
+ super(source);
+ }
+
+ public LayoutParams(MarginLayoutParams source) {
+ super(source);
+ }
+
+ public LayoutParams(LayoutParams source) {
+ super(source);
+ this.weight = source.weight;
+ }
+
+ public LayoutParams(Context c, AttributeSet attrs) {
+ super(c, attrs);
+
+ final TypedArray a = c.obtainStyledAttributes(attrs, ATTRS);
+ this.weight = a.getFloat(0, 0);
+ a.recycle();
+ }
+
+ }
+
+ static class SavedState extends BaseSavedState {
+ boolean isOpen;
+
+ SavedState(Parcelable superState) {
+ super(superState);
+ }
+
+ private SavedState(Parcel in) {
+ super(in);
+ isOpen = in.readInt() != 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeInt(isOpen ? 1 : 0);
+ }
+
+ public static final Parcelable.Creator<SavedState> CREATOR =
+ new Parcelable.Creator<SavedState>() {
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+ }
+
+ class AccessibilityDelegate extends AccessibilityDelegateCompat {
+ private final Rect mTmpRect = new Rect();
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
+ final AccessibilityNodeInfoCompat superNode = AccessibilityNodeInfoCompat.obtain(info);
+ super.onInitializeAccessibilityNodeInfo(host, superNode);
+ copyNodeInfoNoChildren(info, superNode);
+ superNode.recycle();
+
+ info.setClassName(OverlappingPaneLayout.class.getName());
+ info.setSource(host);
+
+ final ViewParent parent = ViewCompat.getParentForAccessibility(host);
+ if (parent instanceof View) {
+ info.setParent((View) parent);
+ }
+
+ // This is a best-approximation of addChildrenForAccessibility()
+ // that accounts for filtering.
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() == View.VISIBLE) {
+ // Force importance to "yes" since we can't read the value.
+ ViewCompat.setImportantForAccessibility(
+ child, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ info.addChild(child);
+ }
+ }
+ }
+
+ @Override
+ public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+ super.onInitializeAccessibilityEvent(host, event);
+
+ event.setClassName(OverlappingPaneLayout.class.getName());
+ }
+
+ /**
+ * This should really be in AccessibilityNodeInfoCompat, but there unfortunately
+ * seem to be a few elements that are not easily cloneable using the underlying API.
+ * Leave it private here as it's not general-purpose useful.
+ */
+ private void copyNodeInfoNoChildren(AccessibilityNodeInfoCompat dest,
+ AccessibilityNodeInfoCompat src) {
+ final Rect rect = mTmpRect;
+
+ src.getBoundsInParent(rect);
+ dest.setBoundsInParent(rect);
+
+ src.getBoundsInScreen(rect);
+ dest.setBoundsInScreen(rect);
+
+ dest.setVisibleToUser(src.isVisibleToUser());
+ dest.setPackageName(src.getPackageName());
+ dest.setClassName(src.getClassName());
+ dest.setContentDescription(src.getContentDescription());
+
+ dest.setEnabled(src.isEnabled());
+ dest.setClickable(src.isClickable());
+ dest.setFocusable(src.isFocusable());
+ dest.setFocused(src.isFocused());
+ dest.setAccessibilityFocused(src.isAccessibilityFocused());
+ dest.setSelected(src.isSelected());
+ dest.setLongClickable(src.isLongClickable());
+
+ dest.addAction(src.getActions());
+
+ dest.setMovementGranularities(src.getMovementGranularities());
+ }
+ }
+}