am 2d95d497: (-s ours) am 1527532a: Import revised translations. DO NOT MERGE
* commit '2d95d497647708a7ce3d725378bab2337587b5e6':
Import revised translations. DO NOT MERGE
diff --git a/res/layout-xlarge/raw_contact_editor_view.xml b/res/layout-xlarge/raw_contact_editor_view.xml
index 044a5ea..02c0314 100644
--- a/res/layout-xlarge/raw_contact_editor_view.xml
+++ b/res/layout-xlarge/raw_contact_editor_view.xml
@@ -67,7 +67,7 @@
android:layout_height="1px"
android:background="@color/contact_detail_header_divider_color" />
- <com.android.contacts.editor.TextFieldsEditorView
+ <com.android.contacts.editor.StructuredNameEditorView
android:id="@+id/edit_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -77,13 +77,19 @@
android:layout_marginTop="6dip"
android:layout_marginBottom="4dip" />
- <ViewStub
- android:id="@+id/aggregation_suggestion_stub"
- android:inflatedId="@+id/aggregation_suggestion"
- android:layout="@layout/aggregation_suggestions"
+ <FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:visibility="visible" />
+ android:layout_marginLeft="52dip"
+ android:layout_marginRight="48dip">
+ <ViewStub
+ android:id="@+id/aggregation_suggestion_stub"
+ android:inflatedId="@+id/aggregation_suggestion"
+ android:layout="@layout/aggregation_suggestions"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="visible" />
+ </FrameLayout>
</LinearLayout>
</com.android.contacts.widget.InterpolatingLayout>
diff --git a/res/layout/list_separator.xml b/res/layout/list_separator.xml
index 1257935..9f562cf 100644
--- a/res/layout/list_separator.xml
+++ b/res/layout/list_separator.xml
@@ -17,6 +17,5 @@
<!-- Layout used for list separators. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="?android:attr/listSeparatorTextViewStyle"
- android:textColor="@*android:color/dim_foreground_dark"
android:gravity="left|center_vertical"
/>
diff --git a/res/layout/raw_contact_editor_view.xml b/res/layout/raw_contact_editor_view.xml
index 62d904f..022d0b4 100644
--- a/res/layout/raw_contact_editor_view.xml
+++ b/res/layout/raw_contact_editor_view.xml
@@ -96,7 +96,7 @@
</FrameLayout>
- <com.android.contacts.editor.TextFieldsEditorView
+ <com.android.contacts.editor.StructuredNameEditorView
android:id="@+id/edit_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/res/layout/social_widget.xml b/res/layout/social_widget.xml
index fb02bb7..ddcd995 100644
--- a/res/layout/social_widget.xml
+++ b/res/layout/social_widget.xml
@@ -14,75 +14,78 @@
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="96dip"
android:background="#00000000"
- android:paddingLeft="12dip"
android:paddingTop="1dip"
- android:paddingRight="12dip"
- android:paddingBottom="20dip"
->
- <FrameLayout
- android:layout_width="70dip"
- android:layout_height="70dip"
- android:layout_marginTop="1dip"
- android:layout_marginLeft="1dip"
- >
- <ImageView
- android:id="@+id/image"
- android:padding="4dip"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
- <ImageButton
- android:id="@+id/border"
- android:background="@drawable/frame_thumbnail_contact_widget_holo"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- </FrameLayout>
- <RelativeLayout
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:background="@drawable/bg_status_contact_widget"
- android:layout_marginTop="4dip"
- android:layout_marginRight="4dip"
- android:layout_marginBottom="7dip"
- android:layout_marginLeft="0dip"
- android:paddingLeft="47dip"
- android:paddingRight="8dip"
- android:paddingTop="3dip"
- android:paddingBottom="6dip">
-
- <TextView
- android:id="@+id/name_and_snippet"
- android:layout_width="match_parent"
+ android:paddingBottom="20dip">
+ <LinearLayout
+ android:id="@+id/widget_container"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <FrameLayout
+ android:layout_width="70dip"
+ android:layout_height="70dip"
+ android:layout_marginTop="1dip"
+ android:layout_marginLeft="13dip">
+ <ImageView
+ android:id="@+id/image"
+ android:padding="4dip"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ <ImageButton
+ android:id="@+id/border"
+ android:background="@drawable/frame_thumbnail_contact_widget_holo"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ </FrameLayout>
+ <RelativeLayout
+ android:id="@+id/name_and_snippet_container"
+ android:layout_width="0dip"
android:layout_height="match_parent"
- android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true"
- android:maxLines="3"
- android:lineSpacingExtra="2sp"
- android:textColor="#FFFFFFFF"
- android:textSize="@dimen/widget_text_size_snippet" />
+ android:layout_weight="1"
+ android:background="@drawable/bg_status_contact_widget"
+ android:layout_marginTop="4dip"
+ android:layout_marginRight="16dip"
+ android:layout_marginBottom="7dip"
+ android:layout_marginLeft="0dip"
+ android:paddingLeft="47dip"
+ android:paddingRight="8dip"
+ android:paddingTop="3dip"
+ android:paddingBottom="6dip">
- <TextView
- android:id="@+id/name"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:textColor="#FFFFFFFF"
- android:textSize="@dimen/widget_text_size_name" />
+ <TextView
+ android:id="@+id/name_and_snippet"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentTop="true"
+ android:maxLines="3"
+ android:lineSpacingExtra="2sp"
+ android:textColor="#FFFFFFFF"
+ android:textSize="@dimen/widget_text_size_snippet" />
- <TextView
- android:id="@+id/status_date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_alignParentBottom="true"
- android:background="@drawable/statusbox_attribute_holo"
- android:textSize="13sp"
- android:textColor="#FF444444"
- android:visibility="gone" />
- </RelativeLayout>
-</LinearLayout>
+ <TextView
+ android:id="@+id/name"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:textColor="#FFFFFFFF"
+ android:textSize="@dimen/widget_text_size_name" />
+
+ <TextView
+ android:id="@+id/status_date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentBottom="true"
+ android:background="@drawable/statusbox_attribute_holo"
+ android:textSize="13sp"
+ android:textColor="#FF444444"
+ android:visibility="gone" />
+ </RelativeLayout>
+ </LinearLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 0519562..21c1f05 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"صورة جهة الاتصال"</string>
<string name="description_minus_button" msgid="387136707700230172">"علامة الطرح"</string>
<string name="description_plus_button" msgid="515164827856229880">"علامة زائد"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"وحدة تخزين USB غير متوفرة"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"وحدة التخزين غير متوفرة."</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"لا بطاقة SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"لم يتم اكتشاف وحدة تخزين USB"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"لم يتم اكتشاف أية وحدة تخزين."</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"لم يتم اكتشاف بطاقة SD"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"البحث عن vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"استيراد من بطاقة SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"استيراد من وحدة تخزين USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"استيراد من وحدة التخزين"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"استيراد من بطاقة SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"تصدير إلى وحدة تخزين USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"تصدير إلى وحدة التخزين"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"تصدير إلى بطاقة SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"مشاركة جهات الاتصال المرئية"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"استيراد ملف vCard واحد"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"استيراد ملفات vCard متعددة"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"استيراد جميع ملفات vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"البحث عن بيانات vCard في وحدة تخزين USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"جارٍ البحث عن بيانات vCard في وحدة التخزين."</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"البحث عن بيانات vCard على بطاقة SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"أخفق فحص وحدة تخزين USB"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"أخفق فحص وحدة التخزين."</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"أخفق المسح الضوئي لبطاقة SD"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"أخفق فحص وحدة تخزين USB (السبب: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"أخفق فحص وحدة التخزين (السبب: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")."</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"أخفق المسح الضوئي لبطاقة SD (السبب: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"خطأ I/O"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"الذاكرة لا تكفي (ربما يكون الملف كبير جدًا)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"أخفق تحليل vCard بسبب غير متوقع"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"التنسيق غير معتمد."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"أخفق استيراد vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"لم يتم العثور على ملف vCard على وحدة تخزين USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"لم يتم العثور على أي ملف vCard في وحدة التخزين."</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"لم يتم العثور على ملف vCard على بطاقة SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"أخفق جمع معلومات وصفية عن ملفات vCard المحددة"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"أخفق استيراد ملف أو أكثر (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"أخفق تصدير بيانات جهة الاتصال"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"أخفق تصدير بيانات جهة الاتصال."\n"سبب الإخفاق: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"ليس هناك جهة اتصال قابلة للتصدير"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"هناك ملفات vCard كثيرة جدًا في وحدة تخزين USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"هناك عدد أكبر مما يجب من ملفات vCard في وحدة التخزين."</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"هناك ملفات vCard كثيرة جدًا على بطاقة SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"اسم الملف المطلوب طويل جدًا (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"تم الانتهاء من تصدير <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index b07a17f..e069041 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"снимка на контакта"</string>
<string name="description_minus_button" msgid="387136707700230172">"минус"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Не е налице USB хранилище"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Няма хранилище"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Няма SD карта"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Няма USB хранилище"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Не бе открито хранилище"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Не е открита SD карта"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Търсене на vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Импортиране от SIM карта"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Импорт. от USB хранилище"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Импорт. от хранилището"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Импортиране от SD карта"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Експорт. в USB хранилище"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Експорт. в хранилището"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Експортиране в SD карта"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Споделяне на видимите контакти"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Импортиране на един vCard файл"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Импортиране на няколко vCard файла"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Импортиране на всички vCard файлове"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Търсят се данни за vCard в USB хранилището"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Търсят се данни за vCard в хранилището"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Търсене на vCard данни в SD картата"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Сканирането на USB хранилището не бе успешно"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Сканирането на хранилището не бе успешно"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Неуспешно сканиране на SD карта"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Сканирането на USB хранилището не бе успешно (Причина: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Сканирането на хранилището не бе успешно (Причина: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Неуспешно сканиране на SD карта ( Причина: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O грешка"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Няма достатъчно памет (файлът може да е твърде голям)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Неуспешен анализ на vCard по неизвестна причина"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Форматът не се поддържа."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Импортирането на vCard не бе успешно"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"В USB устройството за съхранение не бе намерен vCard файл"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"В хранилището не бе намерен vCard файл"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"На SD картата не бе намерен vCard файл"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Събирането на метаинформация от дадените vCard файлове не бе успешно."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Неуспешно импортиране на един или повече файлове (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Неуспешно експортиране на данни за контакти"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Неуспешно експортиране на данни за контакти."\n"Причина: „<xliff:g id="FAIL_REASON">%s</xliff:g>“"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Няма контакт за експортиране"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"В USB хранилището има твърде много vCard файлове"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Твърде много vCard файлове в хранилището"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Твърде много vCard файлове на SD картата"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Изисканото име на файла е твърде дълго („<xliff:g id="FILENAME">%s</xliff:g>“)"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Експортирането на <xliff:g id="FILENAME">%s</xliff:g> завърши"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 4b3940e..89c4d63 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"foto del contacte"</string>
<string name="description_minus_button" msgid="387136707700230172">"menys"</string>
<string name="description_plus_button" msgid="515164827856229880">"més"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Emmag. USB no disp."</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Emmagatzematge no dispon."</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"No hi ha cap targeta SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Cap emmagatzematge USB detectat"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"No s\'ha detectat cap emmagatzematge"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"No s\'ha detectat cap targeta SD"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"S\'està cercant la vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importa des de la targeta SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importa des de l\'emmagatzematge USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importa de l\'emmagatzematge"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importa des de la targeta SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Exporta a l\'emmagatzematge USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exporta a emmagatzematge"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exporta a la targeta SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Comparteix els contactes visibles"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importa un fitxer vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importa diversos fitxers vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importa tots els fitxers vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"S\'estan cercant dades de vCard a l\'emmagatzematge USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"S\'estan cercant dades de vCard a l\'emmagatzematge"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"S\'estan cercant les dades de vCard a la targeta SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"S\'ha produït un error en escanejar l\'emmagatzematge USB"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"S\'ha produït un error en examinar l\'emmagatzematge"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"No s\'ha pogut explorar la targeta SD"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"S\'ha produït un error en escanejar l\'emmagatzematge USB (motiu: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"S\'ha produït un error en examinar l\'emmagatzematge (Motiu: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"No s\'ha pogut explorar la targeta SD (motiu: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Error d\'E/S"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"La memòria és insuficient (és possible que el fitxer sigui massa gran)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"No s\'ha pogut analitzar la vCard per un motiu inesperat"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"No s\'admet aquest format."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"No s\'ha pogut importar la vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"No s\'ha trobat cap fitxer vCard a l\'emmagatzematge USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"No s\'ha trobat cap fitxer vCard a l\'emmagatzematge"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"No s\'ha trobat cap fitxer vCard a la targeta SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"S\'ha produït un error en aplegar metainformació dels fitxers vCard especificats."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"No s\'ha pogut importar un o més fitxers (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"No s\'han pogut exportar les dades de contacte"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"No s\'han pogut exportar les dades de contacte."\n"Motiu de l\'error: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"No hi ha cap contacte que es pugui exportar"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Massa fitxers vCard a l\'emmagatzematge USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Hi ha massa fitxers vCard a l\'emmagatzematge"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Hi ha massa fitxers vCard a la targeta SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"El nom de fitxer obligatori és massa llarg (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Exportació de <xliff:g id="FILENAME">%s</xliff:g> finalitzada"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 18ebfd5..77b7c8a 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"fotografie kontaktu"</string>
<string name="description_minus_button" msgid="387136707700230172">"mínus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Úložiště USB nedostupné"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Úložiště je nedostupné"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Žádná karta SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Úložiště USB nenalezeno"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Nebylo nalezeno žádné úložiště"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Nebyla zjištěna žádná karta SD"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Vyhledávání karty vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importovat z karty SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importovat z úložiště USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importovat z úložiště"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importovat z karty SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Export do úložiště USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exportovat do úložiště"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exportovat na kartu SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Sdílet viditelné kontakty"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importovat jeden soubor vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importovat několik souborů vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importovat všechny soubory vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Vyhledávání dat karty vCard v úložišti USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Vyhledávání dat karty vCard v úložišti"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Vyhledávání dat karty vCard na kartě SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Vyhledávání v úložišti USB se nezdařilo"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Vyhledávání v úložišti se nezdařilo"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Vyhledávání na kartě SD se nezdařilo"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Vyhledávání v úložišti USB se nezdařilo (Důvod: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Vyhledávání v úložišti se nezdařilo (Důvod: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Vyhledávání na kartě SD se nezdařilo. (Důvod: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Chyba V/V"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Není k dispozici dostatek paměti (soubor může být příliš velký)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Analýza karty vCard se z neznámého důvodu nezdařila."</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Formát není podporován."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Import karty vCard se nezdařil"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"V úložišti USB nebyl nalezen žádný soubor vCard"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"V úložišti nebyl nalezen žádný soubor vCard"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Na kartě SD nebyl nalezen žádný soubor vCard"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Shromáždění metainformací zadaných souborů vCard se nezdařilo."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Import jednoho nebo více souborů se nezdařil (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Export dat kontaktů se nezdařil"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Export dat kontaktů se nezdařil."\n"Příčina chyby: <xliff:g id="FAIL_REASON">%s</xliff:g>"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Žádný kontakt nelze exportovat"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"V úložišti USB je příliš mnoho souborů vCard"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"V úložišti je příliš mnoho souborů vCard."</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Na kartě SD je příliš mnoho souborů vCard"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Požadovaný název souboru (<xliff:g id="FILENAME">%s</xliff:g>) je příliš dlouhý"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Export souboru <xliff:g id="FILENAME">%s</xliff:g> byl dokončen."</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 7cc317c..a8a0930 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"kontaktpersonfoto"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB-lager utilgængeligt"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Lager ikke tilgængeligt"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Der er intet SD-kort"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Intet USB-lager blev fundet"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Intet lager fundet"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Der blev ikke fundet noget SD-kort"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Søger efter vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importer fra SIM-kort"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importer fra USB-lager"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importer fra lager"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importer fra SD-kort"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Eksporter til USB-lager"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Eksporter til lager"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Eksporter til SD-kort"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Del synlige kontaktpersoner"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importer en VCard-fil"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importer flere VCard-filer"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importer alle VCard-filer"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Søger efter vCard-data i USB-lager"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Søger efter vCard-data i lager"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Søger efter vCard-kort på SD-kortet"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Scanningen af USB-lager mislykkedes"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Scanning af lageret mislykkedes"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Scanningen af SD-kortet mislykkedes"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Scanningen af USB-lager mislykkedes (årsag: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Scanning af lager mislykkedes (Årsag: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Scanningen af SD-kortet mislykkedes: (Årsag: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O-fejl"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Der er ikke nok hukommelse (filen er muligvis for stor)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"vCard kunne ikke parses pga. en uventet årsag"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Formatet understøttes ikke."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"vCard kunne ikke importeres"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Der blev ikke fundet nogen vCard-fil i USB-lageret"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Der blev ikke fundet nogen vCard-fil i lageret"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Der blev ikke fundet nogen vCard-fil på SD-kortet"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Metaoplysninger om angivne vCard-filer kunne ikke hentes."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"En eller flere filer blev ikke importeret (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Eksport af kontaktdata mislykkedes"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Eksport af kontaktpersondata mislykkedes."\n"Årsag til fejl: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Der er ingen kontakter, der kan eksporteres"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Der er for mange vCard-filer i USB-lager"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Der er for mange vCard-filer i lageret"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Der er for mange vCard-data på SD-kortet"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Det krævede filnavn er for langt (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Eksport af <xliff:g id="FILENAME">%s</xliff:g> afsluttet"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 9bedaaf..7ea17c7 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"Kontaktbild"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB-Speicher nicht verfügbar"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Kein Speicher verfügbar"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Keine SD-Karte"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Keinen USB-Speicher gefunden"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Kein Speicher gefunden"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Keine SD-Karte gefunden"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"vCard wird gesucht."</string>
<string name="import_from_sim" msgid="3859272228033941659">"Von SIM-Karte importieren"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Aus USB-Speicher import."</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Aus Speicher importieren"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Von SD-Karte importieren"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"In USB-Speicher exportieren"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"In Speicher exportieren"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Auf SD-Karte exportieren"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Sichtbare Kontakte weiterleiten"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Eine VCard-Datei importieren"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Mehrere VCard-Dateien importieren"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Alle VCard-Dateien importieren"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Suche nach vCard-Daten in USB-Speicher"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Suche nach vCard-Daten im Speicher..."</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Suche nach einer vCard-Information auf der SD-Karte"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Scannen des USB-Speichers fehlgeschlagen"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Scannen des Speichers fehlgeschlagen"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Fehler beim Lesen der SD-Karte"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Scannen des USB-Speichers fehlgeschlagen. Grund: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Scannen des USB-Speichers fehlgeschlagen. Grund: <xliff:g id="FAIL_REASON">%s</xliff:g>"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Fehler beim Lesen der SD-Karte. Grund: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"E/A-Fehler"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Zu wenig Speicherplatz (Datei ist eventuell zu groß)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Die vCard konnte aus einem unbekannten Grund nicht geparst werden."</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Das Format wird nicht unterstützt."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"vCard kann nicht importiert werden."</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Im USB-Speicher wurde keine vCard-Datei gefunden."</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Im Speicher wurde keine vCard-Datei gefunden."</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Auf der SD-Karte wurde keine vCard-Datei gefunden."</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Metainformationen konnten nicht von den angegebenen vCards abgerufen werden."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Fehler beim Import einer oder mehrerer Dateien (%s)"</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Fehler beim Exportieren von Kontaktdaten"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Fehler beim Exportieren der Kontaktdaten."\n"Fehlerursache: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Es ist kein exportierbarer Kontakt vorhanden"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Zu viele vCard-Dateien im USB-Speicher"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Zu viele vCard-Dateien im Speicher"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Zu viele vCard-Dateien auf der SD-Karte"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Erforderlicher Dateiname ist zu lang (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Export von <xliff:g id="FILENAME">%s</xliff:g> abgeschlossen"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index a54dd00..eb1293c 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"φωτογραφία επαφής"</string>
<string name="description_minus_button" msgid="387136707700230172">"μείον"</string>
<string name="description_plus_button" msgid="515164827856229880">"συν"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Διαθέσ. αποθηκ. χώρος USB"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Μη διαθέσιμος χώρος αποθ."</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Δεν υπάρχει κάρτα SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Χωρίς εντοπ. αποθ. χώρου USB"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Δεν εντοπίστηκε χώρος αποθ."</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Δεν ανιχνεύθηκε κάρτα SD"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Αναζήτηση κάρτας vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Εισαγωγή από κάρτα SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Εισ. από αποθ. χώρο USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Εισαγωγή από τον χώρο αποθ."</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Εισαγωγή από κάρτα SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Εξαγ. σε αποθ. χώρο USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Εξαγωγή στον χώρο αποθ."</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Εξαγωγή σε κάρτα SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Κοινή χρήση ορατών επαφών"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Εισαγωγή ενός αρχείου VCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Εισαγωγή πολλαπλών αρχείων vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Εισαγωγή όλων των αρχείων vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Αναζήτηση δεδομένων vCard στον αποθηκευτικό χώρο USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Αναζήτηση δεδομένων vCard στον χώρο αποθήκευσης"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Αναζήτηση για δεδομένα vCard στην κάρτα SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Η σάρωση του αποθηκευτικού χώρου USB απέτυχε"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Η σάρωση του χώρου αποθήκευσης απέτυχε"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Η σάρωση της κάρτας SD απέτυχε"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Η σάρωση του αποθηκευτικού χώρου USB απέτυχε (Αιτία: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Η σάρωση του αποθηκευτικού χώρου απέτυχε (Αιτία: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Η σάρωση της κάρτας SD απέτυχε (Αιτία:\"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Σφάλμα I/O"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Η μνήμη είναι ανεπαρκής (το αρχείο μπορεί να είναι πολύ μεγάλο)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Η ανάλυση της κάρτας vCard απέτυχε εξαιτίας μη αναμενόμενου συμβάντος"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Η μορφή δεν υποστηρίζεται."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Αποτυχία εισαγωγής vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Δεν βρέθηκαν αρχεία vCard στον αποθηκευτικό σας χώρο USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Δεν βρέθηκαν αρχεία vCard στον χώρο αποθήκευσης"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Δεν βρέθηκε αρχείο VCard στην κάρτα SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Η συλλογή μετα-πληροφοριών του δεδομένου αρχείου(ων) vCard απέτυχε."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Η εισαγωγή ενός ή περισσοτέρων αρχείων απέτυχε (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Αποτυχία εξαγωγής δεδομένων επαφής"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Αποτυχία εξαγωγής δεδομένων επαφής."\n"Αιτία αποτυχίας: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Δεν υπάρχει επαφή με δυνατότητα εξαγωγής"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Υπερβολικά μεγάλος όγκος αρχείων VCard στον αποθηκευτικό χώρο USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Υπερβολικά πολλά αρχεία vCard στον χώρο αποθήκευσης"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Υπερβολικά μεγάλος όγκος αρχείων VCard στην κάρτα SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Το απαιτούμενο όνομα αρχείου είναι υπερβολικά μεγάλο (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Η εξαγωγή ολοκληρώθηκε<xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index a6a58cd..523703e 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"contact photo"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB storage unavailable"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Storage unavailable"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"No SD card"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"No USB storage detected"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"No storage detected"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"No SD card detected"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Searching for vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Import from SIM card"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Import from USB storage"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Import from storage"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Import from SD card"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Export to USB storage"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Export to storage"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Export to SD card"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Share visible contacts"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Import one vCard file"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Import multiple vCard files"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Import all vCard files"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Searching for vCard data in USB storage"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Searching for vCard data in storage"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Searching for vCard data on SD card"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Scanning USB storage failed"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Scanning storage failed"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Scanning SD card failed"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Scanning USB storage failed (Reason: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Scanning USB storage failed (Reason: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Scanning SD card failed (Reason: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O Error"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Memory is insufficient (the file may be too large)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Failed to parse vCard for unexpected reason"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"The format is not supported."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Failed to import vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"No vCard file found in the USB storage"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"No vCard file found in the storage"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"No vCard file found on the SD card"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Failed to collect meta information of given vCard file(s)."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"One or more files failed to be imported (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Failed to export contact data"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Failed to export contact data."\n"Reason for failure: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"There is no exportable contact"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Too many vCard files in the USB storage"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Too many vCard files in the storage"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Too many vCard files on the SD card"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Required filename is too long (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Finished exporting <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-es-rUS-xlarge/strings.xml b/res/values-es-rUS-xlarge/strings.xml
new file mode 100644
index 0000000..7586572
--- /dev/null
+++ b/res/values-es-rUS-xlarge/strings.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- XL -->
+ <string name="sharedUserLabel" msgid="6733062813475510491">"Aplicaciones del núcleo de Androide"</string>
+ <!-- XL -->
+ <string name="starredList" msgid="3934019851105368622">"Destacado"</string>
+ <!-- XL -->
+ <string name="deleteConfirmation_title" msgid="3423581820353128517">"Eliminar"</string>
+ <!-- XL -->
+ <string name="multipleContactDeleteConfirmation" msgid="3714172882797667008">"Eliminar este contacto suprimirá la información de múltiples cuentas."</string>
+ <!-- XL -->
+ <string name="menu_done" msgid="7978822668103372384">"Listo"</string>
+ <!-- XL -->
+ <string name="label_sip_address" msgid="9149168469234262919">"llamada por Internet"</string>
+ <!-- XL -->
+ <string name="emailLabelsGroup" msgid="4513376160142847138">"Dirección de correo electrónico"</string>
+ <!-- XL -->
+ <string name="photoPickerNotFoundText" product="tablet" msgid="1982682484233004829">"No hay imágenes disponibles en la tableta."</string>
+ <string name="photoPickerNotFoundText" product="default" msgid="5390095454333523517">"No hay imágenes disponibles en el teléfono."</string>
+ <!-- XL -->
+ <string name="showFilterPhones" msgid="6459420182674979308">"Solo contactos con teléfonos"</string>
+ <!-- XL -->
+ <string name="liveFolderFavorites" msgid="1365760922135657530">"Contactos destacados"</string>
+ <!-- XL -->
+ <string name="voicemail" msgid="7943319575889141725">"Buzón de voz"</string>
+ <!-- XL -->
+ <string name="dialerDialpadHintText" msgid="2997269795287604385">"Marcar para agregar llamada"</string>
+ <!-- XL -->
+ <string name="noContactsHelpTextWithSync" product="tablet" msgid="6812695978022975523">"No tienes ningún contacto para mostrar. (Si has agregado una cuenta, la sincronización de contactos puede demorar algunos minutos)."\n\n"Para agregar contactos, presiona "<font fgcolor="#ffffffff"><b>"Menú"</b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para agregar y configurar una cuenta con contactos que puedes sincronizar en la tableta "\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Mostrar opciones"</b></font>" para cambiar los contactos que sean visibles"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear tú mismo un contacto nuevo"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/Exportar"</b></font>" para importar contactos de tu tarjeta SIM o SD"\n</li></string>
+ <string name="noContactsHelpTextWithSync" product="default" msgid="7465551569096051886">"No tienes ningún contacto para mostrar. (Si has agregado una cuenta, la sincronización de contactos puede demorar algunos minutos)."\n\n"Para agregar contactos, presiona "<font fgcolor="#ffffffff"><b>"Menú"</b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para agregar y configurar una cuenta con contactos que puedes sincronizar en el teléfono"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Mostrar opciones"</b></font>" para cambiar los contactos que sean visibles"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear tú mismo un contacto nuevo"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/Exportar"</b></font>" para importar contactos de tu tarjeta SIM o SD"\n</li></string>
+ <!-- XL -->
+ <string name="noContactsNoSimHelpText" product="tablet" msgid="3674879008105643715">"No tienes ningún contacto para mostrar."\n\n"Para agregar contactos, presiona "<font fgcolor="#ffffffff"><b>"Menú"</b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para agregar o configurar una cuenta con contactos que puedes sincronizar en la tableta"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear tú mismo un contacto nuevo"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/Exportar"</b></font>" para importar contactos desde tu tarjeta SD"\n</li></string>
+ <string name="noContactsNoSimHelpText" product="default" msgid="7334546831384152525">"No tienes ningún contacto para mostrar."\n\n"Para agregar contactos, presiona "<font fgcolor="#ffffffff"><b>"Menú"</b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para agregar o configurar una cuenta con contactos que puedes sincronizar en el teléfono"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear tú mismo un contacto nuevo"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/Exportar"</b></font>" para importar contactos desde tu tarjeta SD"\n</li></string>
+ <!-- XL -->
+ <string name="noContactsNoSimHelpTextWithSync" product="tablet" msgid="760441281982248124">"No tienes ningún contacto para mostrar. (Si has agregado una cuenta, la sincronización de contactos puede demorar algunos minutos)."\n\n"Para agregar contactos, presiona "<font fgcolor="#ffffffff"><b>"Menú"</b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para agregar y configurar una cuenta con contactos que puedes sincronizar en la tableta"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Mostrar opciones"</b></font>" para cambiar los contactos que sean visibles"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear tú mismo un contacto nuevo"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/Exportar"</b></font>" para importar contactos desde tu tarjeta SD"\n</li></string>
+ <string name="noContactsNoSimHelpTextWithSync" product="default" msgid="3577762280641323609">"No tienes ningún contacto para mostrar. (Si has agregado una cuenta, la sincronización de contactos puede demorar algunos minutos)."\n\n"Para agregar contactos, presiona "<font fgcolor="#ffffffff"><b>"Menú"</b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para agregar y configurar una cuenta con contactos que puedes sincronizar en el teléfono"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Mostrar opciones"</b></font>" para cambiar los contactos que sean visibles"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear tú mismo un contacto nuevo"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/Exportar"</b></font>" para importar contactos desde tu tarjeta SD"\n</li></string>
+ <!-- XL -->
+ <string name="noFavoritesHelpText" msgid="5044577161784268410">"No tienes ningún favorito."\n\n"Para agregar un contacto a tu lista de favoritos:"\n\n" "<li>"toca la pestaña "<b>"Contactos"</b>" "\n</li>" "\n<li>"toca el contacto que deseas agregar a tus favoritos"\n</li>" "\n<li>"toca la estrella situada junto al nombre del contacto"\n</li></string>
+ <!-- XL -->
+ <string name="liveFolder_favorites_label" msgid="1643628386784288191">"Destacado"</string>
+ <!-- XL -->
+ <string name="dialer_addAnotherCall" msgid="8701417753662332966">"Agregar llamada"</string>
+ <!-- XL -->
+ <string name="callDetailTitle" msgid="3821868997465810986">"Detalles de la llamada"</string>
+ <!-- XL -->
+ <string name="callDetailsDurationFormat" msgid="4301453268710461198">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- XL -->
+ <string name="description_image_button_star" msgid="7658091418708665690">"estrella"</string>
+ <!-- XL -->
+ <string name="vcard_import_will_start_message_with_default_name" msgid="1059778205923280983">"El archivo se importará en unos instantes."</string>
+ <!-- XL -->
+ <string name="composer_has_no_exportable_contact" product="tablet" msgid="1102663976836995021">"No hay ningún contacto exportable. Si en realidad tienes contactos en tu tableta, es posible que algún proveedor de datos prohíba la exportación de todos los contactos."</string>
+ <string name="composer_has_no_exportable_contact" product="default" msgid="5486889176347496255">"No hay ningún contacto exportable. Si realmente tienes contactos en tu teléfono, es posible que algún proveedor de datos prohíba la exportación de todos los contactos."</string>
+ <!-- XL -->
+ <string name="make_primary" msgid="7433688640784481720">"Recuerda esta opción."</string>
+ <!-- XL -->
+ <string name="type_short_mobile" msgid="3506454482923171838">"L"</string>
+ <!-- XL -->
+ <string name="type_short_work" msgid="978682694336985355">"W"</string>
+ <!-- XL -->
+ <string name="type_short_other" msgid="496310126170531691">"O"</string>
+ <!-- XL -->
+ <string name="account_phone" product="tablet" msgid="5027478300767992017">"Sólo en tableta, sin sincronizar"</string>
+ <string name="account_phone" product="default" msgid="764379983385696833">"Sólo telefónicamente, no sincronizado"</string>
+ <!-- XL -->
+ <string name="call_home" msgid="3942399424982513961">"Llamar al hogar"</string>
+ <!-- XL -->
+ <string name="sms_assistant" msgid="2373428597266647440">"Texto <xliff:g id="ASSISTANT">%s</xliff:g>"</string>
+ <!-- XL -->
+ <string name="email_other" msgid="3400634654824783097">"Dirección de correo electrónico"</string>
+ <!-- XL -->
+ <string name="email" msgid="5824826790863445976">"Dirección de correo electrónico"</string>
+ <!-- XL -->
+ <string name="name_family" msgid="5612873815201424291">"Apellido"</string>
+ <!-- XL -->
+ <string name="display_options_sort_by_family_name" msgid="2371511783675506143">"Apellido"</string>
+ <!-- XL -->
+ <string name="take_photo" msgid="3550600054705371225">"Tomar una foto"</string>
+ <!-- XL -->
+ <string name="upgrade_out_of_memory" msgid="7007329580979074374">"La actualización de los contactos está en proceso. "\n\n"El proceso de actualización requiere de aproximadamente <xliff:g id="SIZE_IN_MEGABYTES">%s</xliff:g> MB de almacenamiento interno en el teléfono."\n\n" Elige una de las siguientes opciones:"</string>
+ <!-- XL -->
+ <string name="menu_select_all" msgid="6071138984118728586">"Seleccionar todos"</string>
+ <!-- XL -->
+ <string name="activity_title_settings" msgid="4768746131605303318">"Configuración"</string>
+ <!-- XL -->
+ <string name="menu_settings" msgid="1215559971114481866">"Configuración"</string>
+ <!-- XL -->
+ <string name="non_phone_caption" msgid="8339220263670193331">"Número de teléfono"</string>
+ <!-- XL -->
+ <string name="delete_group_dialog_message" msgid="6739622355328278915">"¿Estás seguro de que deseas eliminar el grupo \"<xliff:g id="GROUP_LABEL">%1$s</xliff:g>\"? (Los contactos no se eliminarán)."</string>
+ <!-- XL -->
+ <string name="fail_reason_not_supported" msgid="2869697177825996431">"El formato no está admitido."</string>
+ <!-- XL -->
+ <string name="vcard_import_failed" msgid="5030663873475156120">"Falló la importación de la vCard"</string>
+</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index b0d6479..748d4ca 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"foto de contacto"</string>
<string name="description_minus_button" msgid="387136707700230172">"negativo"</string>
<string name="description_plus_button" msgid="515164827856229880">"más"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Almacenamiento USB no disponible"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"No se dispone de espacio de almacenamiento."</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"No hay tarjeta SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"No se detectó el almacenamiento USB"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"No se detectó almacenamiento alguno."</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"No se ha detectado ninguna tarjeta SD"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Buscando vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importar de la tarjeta SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importar desde almacenamiento USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importar desde el almacenamiento"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importar de la tarjeta SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Exportar a almacenamiento USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exportar al almacenamiento"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exportar a la tarjeta SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Compartir contactos visibles"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importar un archivo de vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importar múltiples archivos de vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importar todos los archivos de vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Buscando datos de vCard en el almacenamiento USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Buscando datos de vCard en el almacenamiento"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Buscando datos de vCard en la tarjeta SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"No se pudo explorar el almacenamiento USB"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"No se pudo explorar el almacenamiento."</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"No se ha podido explorar la tarjeta SD"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"No se pudo explorar el almacenamiento USB (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"No se pudo explorar el almacenamiento (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")."</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"No se ha podido explorar la tarjeta SD. (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Error de E/S"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Memoria insuficiente (es probable que el archivo sea muy grande)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"No se ha podido analizar vCard debido a un motivo inesperado"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"El formato no es compatible."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"No se pudo importar vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"No se encontró ningún archivo vCard en el almacenamiento USB."</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"No se encontró ningún archivo de vCard en el almacenamiento."</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"No se ha encontrado un archivo de vCard en la Tarjeta SD."</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Error al recopilar metadatos de un archivo específico de la vCard."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"No se pudieron importar uno o más archivos (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"No se han podido exportar los datos de contacto"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"No se han podido exportar los datos de contacto."\n"Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"No hay ningún contacto exportable"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Demasiados archivos de vCard en el almacenamiento USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Demasiados archivos de vCard en el almacenamiento"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Demasiados archivos de vCard en la tarjeta SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"El nombre de archivo requerido es demasiado largo (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Finalizó la exportación de <xliff:g id="FILENAME">%s</xliff:g>."</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 08e8a62..ce05ca4 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -86,7 +86,7 @@
<item msgid="8287841928119937597">"Organización"</item>
<item msgid="7196592230748086755">"Nota"</item>
</string-array>
- <string name="photoPickerNotFoundText" product="tablet" msgid="6247290728908599701">"No hay ninguna imagen disponible en el tablet."</string>
+ <string name="photoPickerNotFoundText" product="tablet" msgid="6247290728908599701">"No hay ninguna imagen disponible en la tableta."</string>
<string name="photoPickerNotFoundText" product="default" msgid="431331662154342581">"No hay ninguna imagen disponible en el teléfono."</string>
<string name="attach_photo_dialog_title" msgid="5599827035558557169">"Foto de contacto"</string>
<string name="customLabelPickerTitle" msgid="1081475101983255212">"Nombre de etiqueta personalizada"</string>
@@ -161,13 +161,13 @@
<string name="simContacts_title" msgid="27341688347689769">"Contactos de tarjeta SIM"</string>
<string name="noContactsHelpTextWithSyncForCreateShortcut" msgid="801504710275614594">"No tienes ningún contacto que mostrar. (Si acabas de añadir una cuenta, es posible que la sincronización de contactos tarde algunos minutos)."</string>
<string name="noContactsHelpTextForCreateShortcut" msgid="3081286388667108335">"No tienes ningún contacto que mostrar."</string>
- <string name="noContactsHelpText" product="tablet" msgid="6450346791169710787">"No tienes contactos."\n\n"Para añadir uno, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con los contactos que puedes sincronizar con el tablet,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto, o"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SIM o SD"\n</li>"."</string>
+ <string name="noContactsHelpText" product="tablet" msgid="6450346791169710787">"No tienes contactos."\n\n"Para añadir uno, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con los contactos que puedes sincronizar con la tableta,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto, o"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SIM o SD"\n</li>"."</string>
<string name="noContactsHelpText" product="default" msgid="7633826236417884130">"No tienes contactos."\n\n"Para añadir uno, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con los contactos que puedes sincronizar,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SIM o SD"\n</li>"."</string>
- <string name="noContactsHelpTextWithSync" product="tablet" msgid="2364665535969139880">"No tienes contactos. Si acabas de añadir una cuenta, la sincronización puede tardar."\n\n"Para añadir contactos, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con contactos que puedes sincronizar con el tablet,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Opciones de visualización"</b></font>" para modificar los contactos visibles,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto, o"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SIM o SD"\n</li>"."</string>
+ <string name="noContactsHelpTextWithSync" product="tablet" msgid="2364665535969139880">"No tienes contactos. Si acabas de añadir una cuenta, la sincronización puede tardar."\n\n"Para añadir contactos, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con contactos que puedes sincronizar con la tableta,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Opciones de visualización"</b></font>" para modificar los contactos visibles,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto, o"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SIM o SD"\n</li>"."</string>
<string name="noContactsHelpTextWithSync" product="default" msgid="3017521127042216243">"No tienes contactos. Si acabas de añadir una cuenta, la sincronización puede tardar."\n\n"Para añadir contactos, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con contactos que puedes sincronizar,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Opciones de visualización"</b></font>" para modificar los contactos visibles,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SIM o SD"\n</li>"."</string>
- <string name="noContactsNoSimHelpText" product="tablet" msgid="6031363021287849874">"No tienes contactos."\n\n"Para añadir uno, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con los contactos que puedes sincronizar con el tablet,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto, o"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SD"\n</li>"."</string>
+ <string name="noContactsNoSimHelpText" product="tablet" msgid="6031363021287849874">"No tienes contactos."\n\n"Para añadir uno, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con los contactos que puedes sincronizar con la tableta,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto, o"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SD"\n</li>"."</string>
<string name="noContactsNoSimHelpText" product="default" msgid="467658807711582876">"No tienes contactos."\n\n"Para añadir uno, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con los contactos que puedes sincronizar,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SD"\n</li>"."</string>
- <string name="noContactsNoSimHelpTextWithSync" product="tablet" msgid="6222739731808897565">"No tienes contactos. Si acabas de añadir una cuenta, la sincronización de contactos puede tardar unos minutos."\n\n"Para añadir contactos, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con contactos que puedes sincronizar con el tablet,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Opciones de visualización"</b></font>" para modificar los contactos visibles,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto, o"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SD"\n</li>"."</string>
+ <string name="noContactsNoSimHelpTextWithSync" product="tablet" msgid="6222739731808897565">"No tienes contactos. Si acabas de añadir una cuenta, la sincronización de contactos puede tardar unos minutos."\n\n"Para añadir contactos, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con contactos que puedes sincronizar con la tableta,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Opciones de visualización"</b></font>" para modificar los contactos visibles,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto, o"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SD"\n</li>"."</string>
<string name="noContactsNoSimHelpTextWithSync" product="default" msgid="9040060730467973050">"No tienes contactos. Si acabas de añadir una cuenta, la sincronización puede tardar."\n\n"Para añadir contactos, pulsa la tecla de menú"<font fgcolor="#ffffffff"><b></b></font>" y toca:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Cuentas"</b></font>" para añadir o configurar una cuenta con contactos que puedes sincronizar,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Opciones de visualización"</b></font>" para modificar los contactos visibles,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Contacto nuevo"</b></font>" para crear un nuevo contacto,"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importar/exportar"</b></font>" para importar contactos desde la tarjeta SD"\n</li>"."</string>
<string name="noFavoritesHelpText" msgid="3744655776704833277">"No tienes favoritos."\n\n"Para añadir un contacto a tu lista de favoritos, sigue estos pasos:"\n\n" "<li>"Toca en la pestaña "<b>"Contactos"</b>"."\n</li>" "\n<li>"Selecciona el contacto que quieras añadir a tus favoritos."\n</li>" "\n<li>"Toca la estrella situada junto al nombre del contacto."\n</li></string>
<string name="liveFolder_all_label" msgid="5961411940473276616">"Todos los contactos"</string>
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"foto de contacto"</string>
<string name="description_minus_button" msgid="387136707700230172">"menos"</string>
<string name="description_plus_button" msgid="515164827856229880">"más"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB no disponible"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Almacenamiento no disponible"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Falta la tarjeta SD."</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"USB no detectado"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Sin almacenamiento detectado"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"No se ha detectado ninguna tarjeta SD."</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Buscando vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importar contactos desde la tarjeta SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importar de USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importar de almacenamiento"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importar contactos desde la tarjeta SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Exportar a USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exportar a almacenamiento"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exportar contactos a la tarjeta SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Compartir contactos visibles"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importar un archivo de vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importar varios archivos de vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importar todos los archivos de vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Buscando datos de vCard en USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Buscando datos de vCard en almacenamiento"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Buscando datos de vCard en la tarjeta SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Error al analizar USB"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Error al analizar almacenamiento"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Error al buscar en la tarjeta SD"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Error al analizar USB (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Error al analizar almacenamiento (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Error al buscar en la tarjeta SD (motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Error de E/S"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Memoria insuficiente (el archivo puede ser demasiado grande)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"No se ha podido analizar el archivo de vCard debido a un error inesperado."</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"No se admite este formato."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Se ha producido un error al importar vCard."</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"No se ha encontrado el archivo de vCard en el almacenamiento USB."</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"No se han encontrado archivos de vCard en el almacenamiento."</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"No se ha encontrado ningún archivo de vCard en la tarjeta SD."</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Error al recopilar metainformación de los archivos vCard"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"No ha sido posible importar uno o varios archivos (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Error al exportar los datos del contacto"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Se ha producido un error al exportar los datos del contacto."\n"Motivo del error: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"No hay contactos que exportar."</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Hay demasiados archivos de vCard en el almacenamiento USB."</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Hay demasiados archivos de vCard en el almacenamiento."</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Hay demasiados archivos de vCard en la tarjeta SD."</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"El nombre de archivo necesario es demasiado largo (\"<xliff:g id="FILENAME">%s</xliff:g>\")."</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Exportación de <xliff:g id="FILENAME">%s</xliff:g> finalizada"</string>
@@ -269,7 +269,7 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"No se ha podido inicializar el exportador: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Se ha producido un error durante la exportación: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Error al obtener información de la base de datos"</string>
- <string name="composer_has_no_exportable_contact" product="tablet" msgid="5161491059051198932">"No hay contactos que exportar. Si ya tienes contactos en el tablet, es posible que algunos proveedores de datos no permitan que se exporten todos los contactos a otros dispositivos."</string>
+ <string name="composer_has_no_exportable_contact" product="tablet" msgid="5161491059051198932">"No hay contactos que exportar. Si ya tienes contactos en la tableta, es posible que algunos proveedores de datos no permitan que se exporten todos los contactos a otros dispositivos."</string>
<string name="composer_has_no_exportable_contact" product="default" msgid="322344221706924358">"No hay contactos que exportar. Si ya tienes contactos en tu teléfono, es posible que algunos proveedores de datos no permitan que se exporten todos los contactos a otros dispositivos."</string>
<string name="composer_not_initialized" msgid="8041534450748388843">"El redactor de vCard no se ha inicializado correctamente."</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"No se ha podido abrir el archivo \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
@@ -317,7 +317,7 @@
<string name="display_ungrouped" msgid="4602580795576261158">"Todos los demás contactos"</string>
<string name="display_all_contacts" msgid="6846131371214707956">"Todos los contactos"</string>
<string name="display_warn_remove_ungrouped" msgid="2314043155909167610">"Si eliminas \"<xliff:g id="GROUP">%s</xliff:g>\" de la sincronización, también se eliminarán todos los contactos no agrupados."</string>
- <string name="account_phone" product="tablet" msgid="7946049152658522054">"Solo en el tablet (sin sincronizar)"</string>
+ <string name="account_phone" product="tablet" msgid="7946049152658522054">"Sólo en la tableta (sin sincronizar)"</string>
<string name="account_phone" product="default" msgid="3682950835276226870">"Solo en el teléfono, no sincronizado"</string>
<string name="call_custom" msgid="7756571794763171802">"Llamar a <xliff:g id="CUSTOM">%s</xliff:g>"</string>
<string name="call_home" msgid="1990519474420545392">"Llamar a casa"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index fe2d70c..57526e9 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"عکس مخاطب"</string>
<string name="description_minus_button" msgid="387136707700230172">"منها"</string>
<string name="description_plus_button" msgid="515164827856229880">"به اضافه"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"حافظه USB در دسترس نیست"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"حافظه در دسترس نیست"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"کارت SD موجود نیست"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"حافظه USB یافت نشد"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"حافظه ای شناسایی نشد"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"هیچ کارت SD شناسایی نشد"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"جستجوی کارت ویزیت"</string>
<string name="import_from_sim" msgid="3859272228033941659">"وارد کردن از سیم کارت"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"وارد کردن از حافظه USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"وارد کردن از حافظه"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"وارد کردن از کارت SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"صادر کردن به حافظه USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"صادر کردن به حافظه"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"صدور به کارت SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"اشتراک گذاری مخاطبین قابل مشاهده"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"وارد کردن یک فایل کارت ویزیت"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"وارد کردن چند فایل کارت ویزیت"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"وارد کردن همه فایل های کارت ویزیت"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"جستجوی داده کارت ویزیت در حافظه USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"جستجوی داده کارت ویزیت در حافظه"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"جستجوی داده های کارت ویزیت در کارت SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"اسکن حافظه USB ناموفق بود"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"اسکن حافظه انجام نشد"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"اسکن کارت SD انجام نشد"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"اسکن حافظه USB ناموفق بود (دلیل: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"اسکن حافظه ناموفق بود (دلیل: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"اسکن کارت SD انجام نشد (دلیل: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"خطای ورودی/خروجی"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"حافظه کافی نیست (ممکن است فایل بسیار بزرگ باشد)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"تجزیه کارت ویزیت به دلیل پیش بینی نشده انجام نشد"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"قالب پشتیبانی نمی شود."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"vCard وارد نشد"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"فایل کارت ویزیتی در دستگاه ذخیره USB یافت نشد"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"فایل کارت ویزیت در حافظه یافت نشد"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"فایل کارت ویزیتی در کارت SD یافت نشد"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"جمع آوری فوق اطلاعات فایل(های) کارت ویزیت موجود ناموفق بود."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"یک یا چند فایل وارد نشدند (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"صدور اطلاعات مخاطب انجام نشد"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"صدور اطلاعات مخاطب انجام نشد."\n"دلیل خطا: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"هیچ مخاطب قابل صدوری موجود نیست"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"تعداد فایل های کارت ویزیت در حافظه USB بسیار زیاد است"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"تعداد فایل های کارت ویزیت در حافظه بسیار زیاد است"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"فایل های کارت ویزیت بسیار زیادی در کارت SD وجود دارد"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"نام فایل ضروری خیلی طولانی است (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"صادر کردن <xliff:g id="FILENAME">%s</xliff:g> پایان یافت"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index d452d95..acf2f4d 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"yhteystiedon valokuva"</string>
<string name="description_minus_button" msgid="387136707700230172">"miinus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB-tila ei käytettävissä"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Tallennustila ei käytettävissä"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Ei SD-korttia"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Ei USB-tallennustilaa"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Tallennustilaa ei havaittu"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"SD-korttia ei havaittu"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Etsitään vCardia"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Tuo SIM-kortilta"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Tuo USB-tilasta"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Tuo tallennustilasta"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Tuo SD-kortilta"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Vie USB-tilaan"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Vie tallennustilaan"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Vie SD-kortille"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Jaa näkyvät yhteystiedot"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Tuo yksi vCard-tiedosto"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Tuo useita vCard-tiedostoja"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Tuo kaikki vCard-tiedostot"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Haetaan vCard-tietoja USB-tallennustilasta"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Etsitään vCard-tietoja tallennustilasta"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Etsitään vCard-tietoja SD-kortilta"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"USB-tallennustilan lukeminen epäonnistui"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Tallennustilan lukeminen epäonnistui"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"SD-kortin lukeminen epäonnistui"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"USB-tallennustilan lukeminen epäonnistui (syy: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Tallennustilan lukeminen epäonnistui (Syy: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"SD-kortin lukeminen epäonnistui (Syy: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O-virhe"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Muisti ei riitä (tiedosto voi olla liian suuri)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"vCardin jäsennys epäonnistui tuntemattomasta syystä"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Muotoa ei tueta."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"vCard-tietojen tuonti epäonnistui"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"USB-tallennustilasta ei löydy vCard-tiedostoa"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Tallennustilasta ei löydy vCard-tiedostoja"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"SD-kortilta ei löydy vCard-tiedostoa"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Annettujen vCard-tiedostojen sisällönkuvaustietojen noutaminen epäonnistui."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Ainakin yhden tiedoston tuominen epäonnistui (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Yhteystietojen vieminen epäonnistui"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Yhteystietojen vieminen epäonnistui."\n"Virheen syy: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Ei vietäviä yhteystietoja"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Liikaa vCard-tiedostoja USB-tallennustilassa"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Tallennustilassa on liian monta vCard-tiedostoa"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"SD-kortilla on liian monta vCard-tiedostoa"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Tarvittava tiedostonimi on liian pitkä (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Kohteen <xliff:g id="FILENAME">%s</xliff:g> vienti valmis"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 48e6982..a198122 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -161,12 +161,12 @@
<string name="simContacts_title" msgid="27341688347689769">"Contacts de carte SIM"</string>
<string name="noContactsHelpTextWithSyncForCreateShortcut" msgid="801504710275614594">"Vous n\'avez aucun contact à afficher. Si vous venez d\'ajouter un compte, la synchronisation des contacts peut prendre quelques minutes."</string>
<string name="noContactsHelpTextForCreateShortcut" msgid="3081286388667108335">"Vous n\'avez aucun contact à afficher."</string>
- <!-- syntax error in translation for noContactsHelpText (6450346791169710787) org.xmlpull.v1.XmlPullParserException: expected: /b read: font (position:END_TAG </font>@1:560 in java.io.StringReader@42b988a6) -->
- <!-- syntax error in translation for noContactsHelpText (7633826236417884130) org.xmlpull.v1.XmlPullParserException: expected: /b read: font (position:END_TAG </font>@1:567 in java.io.StringReader@22ba6c83) -->
+ <!-- syntax error in translation for noContactsHelpText (6450346791169710787) org.xmlpull.v1.XmlPullParserException: expected: /b read: font (position:END_TAG </font>@1:560 in java.io.StringReader@7bd63e39) -->
+ <!-- syntax error in translation for noContactsHelpText (7633826236417884130) org.xmlpull.v1.XmlPullParserException: expected: /b read: font (position:END_TAG </font>@1:567 in java.io.StringReader@2e8f4fb3) -->
<string name="noContactsHelpTextWithSync" product="tablet" msgid="2364665535969139880">"Vous n\'avez aucun contact à afficher (si vous venez d\'ajouter un compte, la synchronisation des contacts peut prendre quelques minutes)."\n\n"Pour ajouter des contacts, appuyez sur "<font fgcolor="#ffffffff"><b>"Menu"</b></font>", puis sur :"\n" "\n<li><font fgcolor="#ffffffff"><b>"Comptes"</b></font>" pour ajouter ou configurer un compte dont vous pourrez synchroniser les contacts vers la tablette ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Options d\'affichage"</b></font>" pour modifier les paramètres de visibilité des contacts ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Nouveau contact"</b></font>" pour créer un contact ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importer/Exporter"</b></font>" pour importer des contacts depuis votre carte SIM ou SD."\n</li></string>
<string name="noContactsHelpTextWithSync" product="default" msgid="3017521127042216243">"Vous n\'avez aucun contact à afficher (si vous venez d\'ajouter un compte, la synchronisation des contacts peut prendre quelques minutes)."\n\n"Pour ajouter des contacts, appuyez sur "<font fgcolor="#ffffffff"><b>"Menu"</b></font>" et sélectionnez :"\n" "\n<li><font fgcolor="#ffffffff"><b>"Comptes"</b></font>" pour ajouter ou configurer un compte dont vous pourrez synchroniser les contacts sur le téléphone ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Options d\'affichage"</b></font>" pour modifier le paramètre de visibilité des contacts ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Nouveau contact"</b></font>" pour créer un contact ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importer/Exporter"</b></font>" pour importer des contacts depuis votre carte SIM ou SD."\n</li></string>
- <!-- syntax error in translation for noContactsNoSimHelpText (6031363021287849874) org.xmlpull.v1.XmlPullParserException: expected: /b read: font (position:END_TAG </font>@1:565 in java.io.StringReader@7d2a1e44) -->
- <!-- syntax error in translation for noContactsNoSimHelpText (467658807711582876) org.xmlpull.v1.XmlPullParserException: expected: /b read: font (position:END_TAG </font>@1:571 in java.io.StringReader@5829428e) -->
+ <!-- syntax error in translation for noContactsNoSimHelpText (6031363021287849874) org.xmlpull.v1.XmlPullParserException: expected: /b read: font (position:END_TAG </font>@1:565 in java.io.StringReader@7cd0a5d9) -->
+ <!-- syntax error in translation for noContactsNoSimHelpText (467658807711582876) org.xmlpull.v1.XmlPullParserException: expected: /b read: font (position:END_TAG </font>@1:571 in java.io.StringReader@66388993) -->
<string name="noContactsNoSimHelpTextWithSync" product="tablet" msgid="6222739731808897565">"Vous n\'avez aucun contact à afficher (si vous venez d\'ajouter un compte, la synchronisation des contacts peut prendre quelques minutes)."\n\n"Pour ajouter des contacts, appuyez sur "<font fgcolor="#ffffffff"><b>"Menu"</b></font>", puis sur :"\n" "\n<li><font fgcolor="#ffffffff"><b>"Comptes"</b></font>" pour ajouter ou configurer un compte dont vous pourrez synchroniser les contacts vers la tablette ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Options d\'affichage"</b></font>" pour modifier les paramètres de visibilité des contacts ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Nouveau contact"</b></font>" pour créer un contact ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importer/Exporter"</b></font>" pour importer des contacts depuis votre carte SD."\n</li></string>
<string name="noContactsNoSimHelpTextWithSync" product="default" msgid="9040060730467973050">"Vous n\'avez aucun contact à afficher (si vous venez d\'ajouter un compte, la synchronisation des contacts peut prendre quelques minutes)."\n\n"Pour ajouter des contacts, appuyez sur "<font fgcolor="#ffffffff"><b>"Menu"</b></font>" et sélectionnez :"\n" "\n<li><font fgcolor="#ffffffff"><b>"Comptes"</b></font>" pour ajouter ou configurer un compte dont vous pourrez synchroniser les contacts sur le téléphone ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Options d\'affichage"</b></font>" pour modifier le paramètre de visibilité des contacts ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Nouveau contact"</b></font>" pour créer un contact ;"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importer/Exporter"</b></font>" pour importer des contacts depuis votre carte SD."\n</li></string>
<string name="noFavoritesHelpText" msgid="3744655776704833277">"Vous ne disposez d\'aucun favoris."\n\n"Pour ajouter un contact à la liste de favoris :"\n\n" "<li>"Appuyez sur l\'onglet "<b>"Contacts"</b>"."\n</li>" "\n<li>"Appuyez sur le contact à ajouter à vos favoris."\n</li>" "\n<li>"Appuyez sur l\'étoile en regard du nom du contact."\n</li></string>
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"photo du contact"</string>
<string name="description_minus_button" msgid="387136707700230172">"moins"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Mémoire de stockage USB indisponible"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Mémoire non disponible"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Aucune carte SD trouvée"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Mémoire de stockage USB non détectée"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Aucune mémoire stockage détectée"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Aucune carte SD n\'a été détectée."</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Recherche des données VCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importer à partir de la carte SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importer depuis mémoire USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importer depuis mémoire"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importer à partir de la carte SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Exporter vers mémoire USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exporter vers la mémoire"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exporter vers la carte SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Partager les contacts visibles"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importer un fichier vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importer plusieurs fichiers vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importer tous les fichiers vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Recherche de données VCard sur la mémoire de stockage USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Recherche de données vCard sur la mémoire de stockage"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Recherche de données VCard sur la carte SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Impossible d\'analyser la mémoire de stockage USB"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Échec de la recherche dans la mémoire de stockage"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Échec de l\'analyse de la carte SD"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Impossible d\'analyser la mémoire de stockage USB (Raison : \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Échec de la recherche dans la mémoire de stockage (Raison : \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Échec de l\'analyse de la carte SD (Raison : \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Erreur d\'E/S"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Mémoire insuffisante (fichier probablement trop volumineux)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Échec de l\'analyse des données VCard pour une raison inattendue"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Le format n\'est pas compatible."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Échec de l\'importation du fichier vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Aucun fichier vCard n\'a été trouvé sur la mémoire de stockage USB."</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Aucun fichier vCard trouvé sur la mémoire de stockage"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Aucun fichier vCard trouvé sur la carte SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Échec de la collecte des métadonnées contenues dans le(s) fichier(s) vCard"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Échec de l\'importation d\'un ou de plusieurs fichiers (%s)"</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Échec lors de l\'exportation des données du contact"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Échec lors de l\'exportation des données du contact."\n"Motif : \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Aucun contact exportable"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"La mémoire de stockage USB contient trop de fichiers VCard."</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"La mémoire de stockage contient trop de fichiers vCard."</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"La carte SD contient trop de fichiers VCard."</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Le nom de fichier requis est trop long (\"<xliff:g id="FILENAME">%s</xliff:g>\")."</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Fichier vCard <xliff:g id="FILENAME">%s</xliff:g> exporté"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 9a09ba6..5463184 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"fotografija kontakta"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Memorija USB nedostupna"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Prostor za pohranu nedostupan"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nema SD kartice"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Memorija USB nije otkrivena"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Pohrana nije otkrivena"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Nije pronađena SD kartica"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Traženje kartice vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Uvezi sa SIM kartice"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Uvoz s USB memorije"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Uvoz iz pohrane"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Uvezi sa SD kartice"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Izvoz na USB memoriju"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Izvoz u pohranu"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Izvoz na SD karticu"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Dijeli vidljive kontakte"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Uvezi jednu vCard datoteku"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Uvoz više vCard datoteka"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Uvezi sve vCard datoteke"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Traženje vCard podataka u USB memoriji"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Traženje podataka kartice vCard u pohrani"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Traženje vCard podataka na SD kartici"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Skeniranje memorije USB nije uspjelo"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Skeniranje pohrane nije uspjelo"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Skeniranje SD kartice nije uspjelo"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Skeniranje memorije USB nije uspjelo (razlog: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Skeniranje pohrane nije uspjelo (razlog: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Skeniranje SD kartice nije uspjelo (Razlog: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O pogreška"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Memorija je premala (datoteka je možda prevelika)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Analiza kartice vCard nije uspjela zbog neočekivanog razloga"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Format nije podržan."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Neuspješan uvoz vCarda"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"U USB pohrani nije pronađena vCard datoteka"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Datoteka kartice vCard nije pronađena u pohrani"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Na SD kartici nije pronađena datoteka vCard"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Neuspješno prikupljanje meta informacija danih datoteka vCard."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Uvoz jedne ili više datoteka nije uspio (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Izvoz podataka o kontaktu nije uspio."</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Izvoz podataka o kontaktu nije uspio."\n"Razlog neuspjeha: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Nema kontakta koji je moguće izvesti"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Previše datoteka vCard u USB memoriji"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Previše datoteka kartice vCard u pohrani"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Previše vCard datoteka na SD kartici"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Obavezan naziv datoteke je predug (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Završetak izvoza <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index a47dff7..5fa9202 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"fotó a névjegyhez"</string>
<string name="description_minus_button" msgid="387136707700230172">"mínusz"</string>
<string name="description_plus_button" msgid="515164827856229880">"plusz"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Az USB-tár nem érhető el"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"A tárhely nem érhető el"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Hiányzó SD-kártya"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Nem észlelhető USB-tár"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Nem észlelhető tárhely"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Az SD-kártya nem észlelhető"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"vCard keresése"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importálás a SIM-kártyáról"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importálás USB-tárról"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importálás a tárhelyről"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importálás az SD-kártyáról"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Exportálás USB-tárra"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exportálás a tárhelyre"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exportálás SD-kártyára"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Látható névjegyek megosztása"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Egyetlen vCard fájl importálása"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Több vCard fájl importálása"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Az összes vCard fájl importálása"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"vCard-adatok keresése az USB-táron"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"vCard-adatok keresése a tárhelyen"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"vCard-adatok keresése az SD-kártyán"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Az USB-tár beolvasása sikertelen volt"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Nem sikerült beolvasni a tárhelyet"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Az SD-kártya beolvasása sikertelen"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Az USB-tár beolvasása sikertelen volt (A hiba oka: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Nem sikerült beolvasni a tárhelyet (a hiba oka: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Az SD-kártya beolvasása nem sikerült (oka: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O hiba"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Nincs elég memória (lehet, hogy túl nagy a fájl)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Váratlan ok miatt nem sikerült a vCard szintaktikai elemzése"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"A formátum nem támogatott."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Nem sikerült a vCard importálása"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Nem található vCard fájl az USB-táron"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Nem található vCard fájl a tárhelyen"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Nem található vCard fájl az SD-kártyán"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Nem sikerült begyűjteni a vCard fájl(ok) metaadatait."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Egy vagy több fájlt nem sikerült importálni (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Nem sikerült exportálni a névjegyadatokat"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Nem sikerült exportálni a névjegyadatokat."\n"A hiba oka: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Nincs exportálható névjegy"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Túl sok vCard-fájl van az USB-táron"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Túl sok vCard fájl van a tárhelyen"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Túl sok vCard fájl van az SD-kártyán"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"A fájlnév túl hosszú (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"A(z) <xliff:g id="FILENAME">%s</xliff:g> exportálása befejeződött"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 159be21..f9a5fd8 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"foto kenalan"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Penyimpanan USB tidak tersedia"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Penyimpanan tidak tersedia"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Tidak ada kartu SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Tidak ada penyimpanan USB yang terdeteksi"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Penyimpanan tidak terdeteksi"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Tidak ada kartu SD yang terdeteksi"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Menelusuri vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Impor dari kartu SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Mengimpor dari penyimpanan USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Impor dari penyimpanan"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Impor dari kartu SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Ekspor ke penyimpanan USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Ekspor ke penyimpanan"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Ekspor ke kartu SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Bagikan kenalan yang terlihat"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Impor satu berkas vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Impor beberapa berkas vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Impor semua berkas vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Menelusuri data vCard dalam penyimpanan USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Menelusuri data vCard dalam penyimpanan"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Menelusuri data vCard pada kartu SD."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Memindai penyimpanan USB gagal"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Gagal memindai penyimpanan"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Kartu SD gagal dipindai"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Memindai penyimpanan USB gagal (Alasan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Gagal memindai penyimpanan (Alasan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Kartu SD gagal dipindai (Alasan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Galat I/O"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Memori tidak memadai (berkas mungkin terlalu besar)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Gagal melakukan parse pada vCard karena alasan yang tidak diharapkan"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Format tidak didukung."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Gagal mengimpor vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Tidak ada berkas vCard yang ditemukan pada penyimpanan USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Tidak ditemukan berkas vCard dalam penyimpanan"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Tidak ada berkas vCard yang ditemukan pada kartu SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Gagal mengumpulkan informasi meta dari berkas vCard yang diberikan."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Satu berkas atau lebih gagal diimpor (%s)"</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Gagal mengekspor data kenalan"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Gagal mengekspor data kenalan."\n"Alasan kegagalan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>:"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Tidak ada kenalan yang dapat diekspor"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Terlalu banyak berkas vCard dalam penyimpanan USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Terlalu banyak berkas vCard dalam penyimpanan"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Terlalu banyak berkas vCard pada kartu SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Nama berkas yang diperlukan terlalu panjang (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Selesai mengekspor <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index a9009ee..eba7f11 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"foto contatto"</string>
<string name="description_minus_button" msgid="387136707700230172">"meno"</string>
<string name="description_plus_button" msgid="515164827856229880">"più"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Archivio USB non disponibile"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Archivio non disponibile"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nessuna scheda SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Nessun archivio USB rilevato"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Nessun archivio rilevato"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Nessuna scheda SD rilevata"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Ricerca vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importa da scheda SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importa da archivio USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importa da archivio"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importa da scheda SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Esporta in archivio USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Esporta in archivio"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Esporta su scheda SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Condividi contatti visibili"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importa un file vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importa più file vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importa tutti i file vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Ricerca di dati vCard nell\'archivio USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Ricerca di dati vCard nell\'archivio"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Ricerca dati vCard su scheda SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Scansione dell\'archivio USB non riuscita"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Scansione dell\'archivio non riuscita"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Analisi scheda SD non riuscita"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Scansione dell\'archivio USB non riuscita (motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Scansione dell\'archivio non riuscita (motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Analisi scheda SD non riuscita (motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Errore I/O"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Memoria insufficiente (il file potrebbe essere di dimensioni eccessive)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Impossibile analizzare la vCard per motivi imprevisti"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Il formato non è supportato."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Importazione vCard non riuscita"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Nessun file vCard trovato nell\'archivio USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Nessun file vCard trovato nell\'archivio"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Nessun file vCard trovato sulla scheda SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Raccolta dei metadati dei file vCard forniti non riuscita."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Impossibile importare uno o più file (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Esportazione dati contatti non riuscita"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Esportazione dati contatti non riuscita."\n"Motivo dell\'errore: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Nessun contatto esportabile"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Troppi file vCard nell\'archivio USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Troppi file vCard nell\'archivio"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Troppi dati vCard sulla scheda SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Il nome file richiesto è troppo lungo (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Esportazione di <xliff:g id="FILENAME">%s</xliff:g> terminata"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 5fa32b3..3ea023b 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"תמונה של איש קשר"</string>
<string name="description_minus_button" msgid="387136707700230172">"חיסור"</string>
<string name="description_plus_button" msgid="515164827856229880">"ועוד"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"אמצעי אחסון מסוג USB אינו זמין"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"אמצעי אחסון אינו זמין"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"אין כרטיס SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"לא זוהה אמצעי אחסון מסוג USB"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"לא זוהה אמצעי אחסון"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"לא אותר כרטיס SD"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"מחפש vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"ייבא מכרטיס SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"ייבא מאמצעי אחסון מסוג USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"ייבא מאמצעי אחסון"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"ייבא מכרטיס SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"ייצא לאמצעי אחסון מסוג USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"ייצא לאמצעי אחסון"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"ייצא לכרטיס SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"שתף אנשי קשר גלויים"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"ייבא קובץ אחד של vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"ייבא קובצי vCard מרובים"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"ייבא את כל קובצי vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"מחפש נתוני vCard באמצעי אחסון מסוג USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"מחפש נתוני vCard באמצעי אחסון"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"מחפש נתוני vCard בכרטיס SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"סריקת אמצעי אחסון מסוג USB נכשלה"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"סריקת אמצעי אחסון נכשלה"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"נכשלה סריקת כרטיס SD"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"סריקת אמצעי אחסון מסוג USB נכשלה (סיבה: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"סריקת אמצעי אחסון נכשלה (סיבה: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"נכשלה סריקת כרטיס SD (סיבה: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"שגיאת קלט/פלט"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"אין מספיק זיכרון (ייתכן שהקובץ גדול מדי)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"נכשל ניתוח vCard עקב סיבה לא צפויה"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"הפורמט אינו נתמך."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"נכשל ייבוא vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"לא נמצא קובץ vCard באמצעי אחסון מסוג USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"לא נמצא קובץ vCard באמצעי האחסון"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"לא נמצא קובץ vCard בכרטיס ה-SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"נכשל איסוף מידע-על מקובצי vCard נתונים."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"נכשל הייבוא של קובץ אחד או יותר (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"נכשל ייצוא הנתונים של איש הקשר"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"נכשל ייצוא הנתונים של איש קשר."\n"הסיבה לכשל: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"אין איש קשר שניתן לייצא"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"קובצי vCard רבים מדי באמצעי אחסון מסוג USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"קובצי vCard רבים מדי באמצעי האחסון"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"קובצי vCard רבים מדי בכרטיס ה-SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"שם הקובץ הדרוש ארוך מדי (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"הייצוא של <xliff:g id="FILENAME">%s</xliff:g> הסתיים"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 946b813..f0a5253 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"連絡先の写真"</string>
<string name="description_minus_button" msgid="387136707700230172">"マイナス"</string>
<string name="description_plus_button" msgid="515164827856229880">"プラス"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USBストレージ使用不可"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"ストレージ使用不可"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"SDカードがありません"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"USBストレージがありません"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"ストレージがありません"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"SDカードを検出できませんでした"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"vCardを検索中"</string>
<string name="import_from_sim" msgid="3859272228033941659">"SIMカードからインポート"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"USBストレージからインポート"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"ストレージからインポート"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"SDカードからインポート"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"USBストレージにエクスポート"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"ストレージにエクスポート"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"SDカードにエクスポート"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"表示可能な連絡先を共有"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"vCardファイルを1つインポート"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"複数のvCardファイルをインポート"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"すべてのvCardファイルをインポート"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"USBストレージ内でvCardデータを検索中"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"ストレージ内でvCardデータを検索中"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"SDカードのvCardデータを検索しています"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"USBストレージのスキャンエラー"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"ストレージのスキャンエラー"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"SDカードのスキャンに失敗しました"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"USBストレージをスキャンできませんでした(理由: 「<xliff:g id="FAIL_REASON">%s</xliff:g>」)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"ストレージをスキャンできませんでした(理由: 「<xliff:g id="FAIL_REASON">%s</xliff:g>」)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"SDカードのスキャンに失敗しました(理由: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"送受信エラー"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"メモリが不足しています(ファイルが大きすぎる可能性があります)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"予期しない理由によりvCardの解析に失敗しました"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"このフォーマットはサポートされません。"</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"vCardをインポートできませんでした。"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"USBストレージ内にvCardファイルが見つかりません"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"ストレージ内にvCardファイルが見つかりません"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"SDカード内にvCardファイルが見つかりません"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"指定されたvCardファイルのメタ情報を取得できませんでした。"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"1つ以上のファイルをインポートできませんでした(%s)。"</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"連絡先データのエクスポートに失敗しました"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"連絡先データのエクスポートに失敗しました。"\n"理由: 「<xliff:g id="FAIL_REASON">%s</xliff:g>」"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"エクスポートできる連絡先がありません"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"USBストレージ内のvCardファイルが多すぎます"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"ストレージ内のvCardファイルが多すぎます"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"SDカードのvCardファイルが多すぎます"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"指定したファイル名が長すぎます(「<xliff:g id="FILENAME">%s</xliff:g>」)"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"<xliff:g id="FILENAME">%s</xliff:g>のエクスポートが終了しました"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 75ec439..f93a24f 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"주소록 사진"</string>
<string name="description_minus_button" msgid="387136707700230172">"빼기"</string>
<string name="description_plus_button" msgid="515164827856229880">"더하기"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB 저장소 사용 불가능"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"저장장치 없음"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"SD 카드 없음"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"USB 저장소가 없습니다."</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"저장장치가 없습니다."</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"SD 카드가 발견되지 않았습니다."</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"vCard 검색"</string>
<string name="import_from_sim" msgid="3859272228033941659">"SIM 카드에서 가져오기"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"USB 저장소에서 가져오기"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"저장장치에서 가져오기"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"SD 카드에서 가져오기"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"USB 저장소로 내보내기"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"저장공간으로 내보내기"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"SD 카드로 내보내기"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"표시되는 연락처 모두 공유"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"vCard 파일 한 개 가져오기"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"vCard 파일 여러 개 가져오기"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"모든 vCard 파일 가져오기"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"USB 저장소에서 vCard 데이터 검색 중"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"저장장치에서 vCard 데이터 검색"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"SD 카드의 vCard 데이터 검색"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"USB 저장소 스캔 실패"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"저장장치 스캔 실패"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"SD 카드 스캔 실패"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"USB 저장소 스캔 실패(이유: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"저장장치 스캔 실패(이유: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"SD 카드 스캔 실패(이유: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O 오류"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"메모리가 부족합니다. 파일이 너무 크기 때문일 수 있습니다."</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"예기치 못한 이유로 인해 vCard를 구문분석하지 못했습니다."</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"지원되지 않는 형식입니다."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"vCard를 가져오지 못했습니다."</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"vCard 파일이 USB 저장소에 없습니다."</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"저장공간에 vCard 파일이 없습니다."</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"SD 카드에 VCard 파일이 없습니다."</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"지정한 vCard 파일에 대한 메타 정보를 수집하지 못했습니다."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"하나 이상의 파일을 가져오지 못했습니다(%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"연락처 데이터를 내보내지 못했습니다."</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"연락처 데이터를 내보내지 못했습니다."\n"실패 이유: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\'"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"내보낼 수 있는 연락처가 없습니다."</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"USB 저장소에 vCard 파일이 너무 많습니다."</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"저장공간에 vCard 파일이 너무 많습니다."</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"SD 카드에 vCard 파일이 너무 많습니다."</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"필수 파일 이름이 너무 깁니다(\'<xliff:g id="FILENAME">%s</xliff:g>\')."</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"<xliff:g id="FILENAME">%s</xliff:g> 내보내기 완료됨"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 11c0912..c1a2dde 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"adresato nuotrauka"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plius"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB atmintinė nepasiekiama"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Saugykla neprieinama"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nėra SD kortelės"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Neaptikta jokia USB atmintinė"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Neaptikta jokių saugyklų"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"SD kortelė neaptikta"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Ieškoma „vCard“ kortelės"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importuoti iš SIM kortelės"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Import. iš USB atmintinės"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importuoti iš saugyklos"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importuoti iš SD kortelės"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Eksport. į USB atmintinę"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Eksportuoti į saugyklą"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Eksportuoti į SD kortelę"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Bendrinti matomus adresatus"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importuoti vieną „vCard“ failą"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importuoti kelis „vCard“ failus"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importuoti visus „VCard“ kortelės failus"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Ieškoma el. vizitinės kortelės duomenų USB atmintinėje"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Ieškoma el. vizitinės kortelės duomenų USB atmintinėje"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"SD kortelėje ieškoma „vCard“ duomenų"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Nepavyko nuskaityti USB atmintinės"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Nepavyko nuskaityti saugyklos"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"SD kortelės nuskaitymas nepavyko"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Nepavyko nuskaityti USB atmintinės (Priežastis: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Nepavyko nuskaityti saugyklos (priežastis: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"SD kortelės nuskaitymas nepavyko (priežastis: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Įvesties / išvesties klaida"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Nepakanka atminties (failas gali būti per didelis)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Dėl netikėtos priežasties nepavyko išanalizuoti „vCard“"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Formatas nepalaikomas."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Nepavyko import. el. vizitinės kortelės"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"USB atmintinėje nerasta jokių el. vizitinių kortelių failų"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Saugykloje nerasta el. vizitinės kortelės failų"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"SD kortelėje nerasta jokių el. vizitinių kortelių failų"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Nepavyko surinkti nurodyto (-ų) el. vizitinės kortelės failo (-ų) metainformacijos."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Nepavyko importuoti vieno ar daugiau failų (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Nepavyko eksportuoti adresatų duomenų"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Nepavyko eksportuoti adresato duomenų."\n"Trikties priežastis: „<xliff:g id="FAIL_REASON">%s</xliff:g>“"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Nėra eksportuojamo adresato"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Per daug el. vizitinės kortelės failų USB atmintinėje"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Per daug el. vizitinės kortelės failų saugykloje"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Per daug „vCard“ failų SD kortelėje"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Reikalingo failo pavadinimas per ilgas („<xliff:g id="FILENAME">%s</xliff:g>“)"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Baigta eksportuoti <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index b5d597a..e82f457 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"kontaktpersonas fotoattēls"</string>
<string name="description_minus_button" msgid="387136707700230172">"mīnuss"</string>
<string name="description_plus_button" msgid="515164827856229880">"pluss"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB atmiņa nav pieejama"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"USB atmiņa nav pieejama"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nav SD kartes"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Nav noteikta USB atmiņa"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Nav atrasta neviena USB. atm."</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"SD karte nav noteikta."</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"vCard faila meklēšana"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importēt no SIM kartes"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Import. no USB atmiņas"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importēt no USB atmiņas"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importēt no SD kartes"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Eksport. uz USB atmiņu"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Eksportēt uz USB atmiņu"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Eksportēt uz SD karti"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Kopīgot redzamās kontaktpersonas"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importēt vienu vCard failu"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importēt vairākus vCard failus"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importēt visus vCard failus"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Notiek vCard datu meklēšana USB atmiņā"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Notiek vCard datu meklēšana USB atmiņā."</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Notiek vCard datu meklēšana SD kartē"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"USB atmiņas skenēšana neizdevās"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Neizdevās skenēt USB atmiņu"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Neizdevās skenēt SD karti."</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"USB atmiņas skenēšana neizdevās (iemesls: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"USB atmiņas skenēšana neizdevās (iemesls: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"SD kartes skenēšana neizdevās (cēlonis: “<xliff:g id="FAIL_REASON">%s</xliff:g>”)."</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Ievades/izvades kļūda"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Atmiņā nepietiek vietas (iespējams, fails ir pārāk liels)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Neparedzēta iemesla dēļ neizdevās parsēt vCard failu."</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Šis formāts nav atbalstīts."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"vCard importēšana neizdevās."</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"USB atmiņā nav atrasts neviens vCard fails."</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"USB atmiņā nav atrasts neviens vCard fails."</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"SD kartē nav atrasts neviens vCard fails."</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Neizdevās iegūt meta informāciju par konkrēto(-ajiem) vCard failu(-iem)."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Neizdevās importēt vienu vai vairākus failus (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Neizdevās eksportēt kontaktpersonas datus."</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Neizdevās eksportēt kontaktpersonu datus."\n"Kļūmes cēlonis: “<xliff:g id="FAIL_REASON">%s</xliff:g>”"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Nav eksportējamu kontaktpersonas datu."</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"USB atmiņā ir pārāk daudz vCard failu."</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"USB atmiņā ir pārāk daudz vCard failu."</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"SD kartē ir pārāk daudz vCard failu."</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Faila nosaukums ir pārāk garš (“<xliff:g id="FILENAME">%s</xliff:g>”)."</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Faila <xliff:g id="FILENAME">%s</xliff:g> eksportēšana ir pabeigta"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index f97658c..8f25d09 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -161,12 +161,12 @@
<string name="simContacts_title" msgid="27341688347689769">"Kontakter på SIM-kort"</string>
<string name="noContactsHelpTextWithSyncForCreateShortcut" msgid="801504710275614594">"Du har ingen kontakter å vise. (Hvis du nettopp har lagt til en konto, kan det ta noen minutter å synkronisere kontaktene.)"</string>
<string name="noContactsHelpTextForCreateShortcut" msgid="3081286388667108335">"Du har ingen kontakter å vise."</string>
- <!-- syntax error in translation for noContactsHelpText (6450346791169710787) org.xmlpull.v1.XmlPullParserException: expected: /li read: font (position:END_TAG </font>@1:292 in java.io.StringReader@3343c8b3) -->
- <!-- syntax error in translation for noContactsHelpText (7633826236417884130) org.xmlpull.v1.XmlPullParserException: expected: /li read: font (position:END_TAG </font>@1:293 in java.io.StringReader@272d7a10) -->
+ <!-- syntax error in translation for noContactsHelpText (6450346791169710787) org.xmlpull.v1.XmlPullParserException: expected: /li read: font (position:END_TAG </font>@1:292 in java.io.StringReader@4d3f3045) -->
+ <!-- syntax error in translation for noContactsHelpText (7633826236417884130) org.xmlpull.v1.XmlPullParserException: expected: /li read: font (position:END_TAG </font>@1:293 in java.io.StringReader@6f7a29a1) -->
<string name="noContactsHelpTextWithSync" product="tablet" msgid="2364665535969139880">"Du har ingen kontakter å vise. (Hvis du nylig la til en konto, kan det ta noen minutter å synkronisere kontaktene.)"\n\n"Slik legger du til kontakter: Trykk på "<font fgcolor="#ffffffff"><b>"Meny"</b></font>", og trykk deretter på:"\n" "\n<li><font fgcolor="#ffffffff"><b>"Kontoer"</b></font>" for å legge til eller konfigurere en konto med kontakter som kan synkroniseres til nettbrettet"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Visningsalternativer"</b></font>" for å endre hvilke kontakter som vises"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Ny kontakt"</b></font>" for å opprette en ny kontakt fra grunnen av"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importer/Eksporter"</b></font>" for å importere kontakter fra SIM- eller SD-kort"\n</li></string>
<string name="noContactsHelpTextWithSync" product="default" msgid="3017521127042216243">"Du har ingen kontakter å vise. (Hvis du nylig la til en konto, kan det ta noen minutter å synkronisere kontaktene.)"\n\n"Slik legger du til kontakter: Trykk på "<font fgcolor="#ffffffff"><b>"Meny"</b></font>" og trykk deretter på: "\n" "\n<li><font fgcolor="#ffffffff"><b>"Kontoer "</b></font>" for å legge til eller konfigurere en konto med kontakter som kan synkroniseres til telefonen"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Visningsalternativer"</b></font>" for å endre hvilke kontakter som vises"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Ny kontakt"</b></font>" for å opprette en ny kontakt"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importér/Eksportér"</b></font>" for å importere kontakter fra SIM- eller SD-kort"\n</li></string>
- <!-- syntax error in translation for noContactsNoSimHelpText (6031363021287849874) org.xmlpull.v1.XmlPullParserException: expected: /li read: font (position:END_TAG </font>@1:297 in java.io.StringReader@1aa8c488) -->
- <!-- syntax error in translation for noContactsNoSimHelpText (467658807711582876) org.xmlpull.v1.XmlPullParserException: expected: /li read: font (position:END_TAG </font>@1:297 in java.io.StringReader@3dfeca64) -->
+ <!-- syntax error in translation for noContactsNoSimHelpText (6031363021287849874) org.xmlpull.v1.XmlPullParserException: expected: /li read: font (position:END_TAG </font>@1:297 in java.io.StringReader@3d434234) -->
+ <!-- syntax error in translation for noContactsNoSimHelpText (467658807711582876) org.xmlpull.v1.XmlPullParserException: expected: /li read: font (position:END_TAG </font>@1:297 in java.io.StringReader@4d125127) -->
<string name="noContactsNoSimHelpTextWithSync" product="tablet" msgid="6222739731808897565">"Du har ingen kontakter å vise. (Hvis du nylig la til en konto, kan det ta noen minutter å synkronisere kontaktene.)"\n\n"Slik legger du til kontakter: Trykk på "<font fgcolor="#ffffffff"><b>"Meny"</b></font>", og trykk deretter på: "\n" "\n<li><font fgcolor="#ffffffff"><b>"Kontoer"</b></font>" for å legge til eller konfigurere en konto med kontakter som kan synkroniseres til nettbrettet"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Visningsalternativer"</b></font>" for å endre hvilke kontakter som vises"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Ny kontakt"</b></font>" for å opprette en ny kontakt fra grunnen av"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importer/eksporter"</b></font>" for å importere kontakter fra SD-kortet"\n</li></string>
<string name="noContactsNoSimHelpTextWithSync" product="default" msgid="9040060730467973050">"Du har ingen kontakter å vise. (Hvis du nylig la til en konto, kan det ta noen minutter å synkronisere kontaktene.)"\n\n"Slik legger du til kontakter: Trykk på "<font fgcolor="#ffffffff"><b>"Meny"</b></font>" og trykk deretter på: "\n" "\n<li><font fgcolor="#ffffffff"><b>"Kontoer "</b></font>" for å legge til eller konfigurere en konto med kontakter som kan synkroniseres til telefonen"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Visningsalternativer"</b></font>" for å endre hvilke kontakter som vises"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Ny kontakt"</b></font>" for å opprette en ny kontakt"\n</li>" "\n<li><font fgcolor="#ffffffff"><b>"Importér/eksportér"</b></font>" for å importere kontakter fra SD-kortet"\n</li></string>
<string name="noFavoritesHelpText" msgid="3744655776704833277">"Du har ingen favoritter."\n\n"Slik legger du til en kontakt i favorittlisten:"\n\n" "<li>"Trykk på fanen "<b>"Kontakter"</b>" "\n</li>" "\n<li>"Trykk på kontakten du vil legge til i favoritter"\n</li>" "\n<li>"Trykk på stjernen ved siden av kontaktnavnet"\n</li></string>
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"kontaktens bilde"</string>
<string name="description_minus_button" msgid="387136707700230172">"minusknapp"</string>
<string name="description_plus_button" msgid="515164827856229880">"plussknapp"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB-lagring utilgj."</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Lagring utilgjengelig"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Mangler minnekort"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Finner ikke USB-lagring"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Ingen lagring oppdaget"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Fant ikke noe minnekort"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Leter etter VCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importér fra SIM-kort"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importér fra USB-lagr."</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importér fra lagring"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importér fra minnekort"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Eksportér til USB-lagr."</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Eksportér til lagring"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Eksportér til minnekort"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Del synlige kontakter"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importer én VCard-fil"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importer flere vCard-filer"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importer alle vCard-filer"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Søker etter vCard-data i USB-lagring"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Søker etter vCard-data i lagring"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Leter etter VCard-data på minnekort"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Skanning av USB-lagring mislyktes"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Skanning av lagring mislyktes"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Kunne ikke scanne minnekort"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Skanning av USB-lagring mislyktes (årsak: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Skanning av lagring mislyktes (årsak: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Kunne ikke skanne minnekort (grunn: «<xliff:g id="FAIL_REASON">%s</xliff:g>»)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Inn/ut-feil (årsak: «FAIL_REASON»)"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Ikke tilstrekkelig minne (filen kan være for stor)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Kan ikke analysere VCard av uventet årsak"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Formatet støttes ikke."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Kunne ikke importere vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Finner ingen vCard-fil i USB-lagring"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Finner ingen vCard-fil på lagringsenheten"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Fant ingen vCard-fil på SD-kortet"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Kan ikke hente inn metainformasjon for de(n) aktuelle vCard-filen(e)."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Importeringen av én eller flere filer mislyktes (%s)"</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Kunne ikke eksportere kontaktlisten"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Eksport av kontaktdata mislyktes"\n"Årsak til feil: «<xliff:g id="FAIL_REASON">%s</xliff:g>»"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Det finnes ingen eksporterbar kontakt."</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"For mange vCard-filer på USB-lagring"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"For mange vCard-filer på lagringsenheten"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"For mange VCard-datafiler på minnekortet"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"For langt filnavn kreves («<xliff:g id="FILENAME">%s</xliff:g>»)"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Eksport av <xliff:g id="FILENAME">%s</xliff:g> er fullført"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index d538d34..7074755 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"contactfoto"</string>
<string name="description_minus_button" msgid="387136707700230172">"min"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB-opslag niet beschikb."</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Opslag niet beschikbaar"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Geen SD-kaart"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Geen USB-opslag gevonden"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Geen opslag gedetecteerd"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Geen SD-kaart gedetecteerd"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Zoeken naar vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importeren van SIM-kaart"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Import. uit USB-opslag"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importeren uit opslag"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importeren van SD-kaart"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Export. naar USB-opslag"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exporteren naar opslag"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exporteren naar SD-kaart"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Zichtbare contacten delen"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Eén vCard-bestand importeren"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Meerdere vCard-bestanden importeren"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Alle vCard-bestanden importeren"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Zoeken naar vCard-gegevens in USB-opslag"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Zoeken naar vCard-gegevens in opslag"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Zoeken naar vCard-gegevens op SD-kaart"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Scannen van USB-opslag is mislukt"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Scannen van opslag is mislukt"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Scannen van SD-kaart is mislukt"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Scannen van USB-opslag is mislukt (reden: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Scannen van USB-opslag is mislukt (reden: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Scannen van SD-kaart is mislukt: (Reden: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O-fout"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Onvoldoende geheugen (het bestand is mogelijk te groot)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Parseren van vCard is mislukt om onbekende reden"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"De indeling wordt niet ondersteund."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Kan vCard niet importeren"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Geen vCard-bestand gevonden in USB-opslag"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Geen vCard-bestand gevonden in opslag"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Geen vCard-bestand gevonden op SD-kaart"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Verzamelen van metagegevens van betreffende vCard-bestanden is mislukt."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Een of meer bestanden kunnen niet worden geïmporteerd (%s)"</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Exporteren van contactgegevens mislukt"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Exporteren van contactgegevens mislukt."\n"Reden voor de fout: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\'"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Er is geen contact dat geëxporteerd kan worden"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Te veel vCard-bestanden in de USB-opslag"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Te veel vCard-bestanden in opslag"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Te veel vCard-gegevens op de SD-kaart"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Vereiste bestandsnaam is te lang (\'<xliff:g id="FILENAME">%s</xliff:g>\')"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Exporteren van <xliff:g id="FILENAME">%s</xliff:g> voltooid"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 40aa3b2..2563581 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"zdjęcie kontaktu"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Nośnik USB niedostępny"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Nośnik nie jest dostępny"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Brak karty SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Nie wykryto nośnika USB"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Nie wykryto nośnika"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Nie wykryto karty SD"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Wyszukiwanie danych vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importuj z karty SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importuj z nośnika USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importuj z nośnika"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importuj z karty SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Eksportuj na nośnik USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Eksportuj na nośnik"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Eksportuj na kartę SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Udostępnij widoczne kontakty"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importuj jeden plik vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importuj wiele plików vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importuj wszystkie pliki vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Wyszukiwanie danych vCard na nośniku USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Wyszukiwanie danych vCard na nośniku"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Wyszukiwanie danych vCard na karcie SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Skanowanie nośnika USB nie powiodło się"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Skanowanie nośnika nie powiodło się"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Skanowanie karty SD nie powiodło się"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Skanowanie nośnika USB nie powiodło się (przyczyna: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Skanowanie nośnika nie powiodło się (przyczyna: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Skanowanie karty SD nie powiodło się (przyczyna: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Błąd wejścia/wyjścia"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Niewystarczająca ilość pamięci (plik może być zbyt duży)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Nie można zanalizować pliku vCard z nieoczekiwanego powodu"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Ten format nie jest obsługiwany."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Nie można zaimportować karty vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Na nośniku USB nie znaleziono żadnego pliku vCard"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Na nośniku nie znaleziono żadnego pliku vCard"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Na karcie SD nie znaleziono żadnego pliku vCard"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Nie można zebrać metainformacji z podanych plików vCard."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Nie można zaimportować co najmniej jednego pliku (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Nie można wyeksportować danych kontaktu"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Nie można wyeksportować danych kontaktu."\n"Przyczyna niepowodzenia: „<xliff:g id="FAIL_REASON">%s</xliff:g>”."</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Brak kontaktów, które można wyeksportować"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Zbyt wiele plików vCard na nośniku USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Zbyt wiele plików vCard na nośniku"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Zbyt dużo plików vCard na karcie SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Wymagana nazwa pliku jest zbyt długa („<xliff:g id="FILENAME">%s</xliff:g>”)"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Zakończono eksportowanie pliku <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 4d1a10c..747f120 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"fotografia do contacto"</string>
<string name="description_minus_button" msgid="387136707700230172">"menos"</string>
<string name="description_plus_button" msgid="515164827856229880">"mais"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Armaz. USB não disponível"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Armazen. indisponível"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nenhum cartão SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Armaz. USB não detectado"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Não há armazenamento detectado"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Não foi detectado nenhum cartão SD"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"A procurar vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importar do cartão SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importar do armaz. USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importar do armazenamento"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importar do cartão SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Exportar para armaz. USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exportar para o armazen."</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exportar para cartão SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Partilhar contactos visíveis"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importar um ficheiro VCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importar vários ficheiros vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importar todos os ficheiros VCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"A pesquisar dados do vCard no armazenamento USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"A pesquisar dados do vCard no armazenamento"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Procurar dados do vCard no cartão SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Falha ao analisar armazenamento USB"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Falha ao digitalizar armazenamento"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Falha na análise do cartão SD"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Falha ao analisar armazenamento USB (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Falha ao analisar o armazenamento (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Falha na análise do cartão SD (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Erro de E/S"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"A memória não é suficiente (o ficheiro pode ser demasiado grande)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Falha na análise do vCard por motivo inesperado"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"O formato não é suportado."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Falha ao importar vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Não foi encontrado nenhum ficheiro vCard no armazenamento USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Não foi encontrado nenhum ficheiro vCard no armazenamento"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Não foi encontrado nenhum ficheiro vCard no cartão SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"A recolha de meta informações de ficheiro(s) vCard específicado(s) falhou."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"A importação de um ou vários ficheiros falhou (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Falha ao exportar dados de contacto"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Falha na exportação de dados de contacto."\n"Motivo da falha: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Não existe um contacto exportável"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Existem demasiados ficheiros vCard no armazenamento USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Existem demasiados ficheiros vCard no armazenamento"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Demasiados ficheiros vCard no cartão SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Nome de ficheiro demasiado longo (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"A exportação do <xliff:g id="FILENAME">%s</xliff:g> terminou"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 809adb6..6aef3a6 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"foto do contato"</string>
<string name="description_minus_button" msgid="387136707700230172">"menos"</string>
<string name="description_plus_button" msgid="515164827856229880">"mais"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Armaz. USB não disponível"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Armazenamento não disponível"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nenhum cartão SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Nenhum armaz. USB detectado"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Nenhum armazenamento detectado"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Nenhum cartão SD detectado"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Pesquisando vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importar do cartão SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importar do armaz. USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importar do armazenamento"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importar do cartão SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Exportar para armaz. USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exportar para o armazenamento"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exportar para cartão SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Compartilhar contatos visíveis"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importar um arquivo do vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importar vários arquivos do vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importar todos os arquivos do vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Procurando dados do vCard no armazenamento USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Procurando dados do vCard no armazenamento"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Procurando dados do vCard no cartão SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Falha na verificação do armazenamento USB"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Falha na verificação do armazenamento"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Falha na verificação do cartão SD"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Falha na verificação do armazenamento USB (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Falha na verificação do armazenamento (Motivo: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Falha na verificação do cartão SD (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Erro E/S"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Memória insuficiente (o arquivo talvez seja muito grande)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Falha ao analisar o vCard por razão inesperada"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"O formato não é suportado."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Falha ao importar vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Nenhum arquivo de vCard encontrado no armazenamento USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Nenhum arquivo de vCard encontrado no armazenamento"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Nenhum arquivo de vCard encontrado no cartão SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Falha ao coletar metainformações dos arquivos de vCard fornecidos."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Falha na importação de um ou mais arquivos (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Falha ao exportar dados do contato"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Falha ao exportar dados dos contatos."\n"Motivo da falha: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Não há contatos exportáveis"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Muitos arquivos do vCard no armazenamento USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Muitos arquivos de vCard no armazenamento"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Muitos arquivos do vCard no cartão SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"O nome de arquivo exigido é muito longo (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Exportação concluída <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index c2ea934..4bc8ae4 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -212,25 +212,25 @@
<string name="description_contact_photo" msgid="3387458082667894062">"foto dal contact"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <!-- outdated translation 5911758680339949273 --> <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Nagina carta SD"</string>
+ <!-- outdated translation 5911758680339949273 --> <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Nagina carta SD"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nagina carta SD"</string>
- <!-- outdated translation 6019391476490445358 --> <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Betg chattà ina carta SD."</string>
+ <!-- outdated translation 6019391476490445358 --> <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Betg chattà ina carta SD."</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Betg chattà ina carta SD."</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Tschertgar datas vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importar da la carta SIM"</string>
- <!-- outdated translation 8550360976693202816 --> <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importar da la carta SD"</string>
+ <!-- outdated translation 8550360976693202816 --> <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importar da la carta SD"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importar da la carta SD"</string>
- <!-- outdated translation 2597105442616166277 --> <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Exportar sin la carta SD"</string>
+ <!-- outdated translation 2597105442616166277 --> <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exportar sin la carta SD"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exportar sin la carta SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Cundivider ils contacts visibels"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importar ina datoteca vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importar pliras datotecas vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importar tut las datotecas vCard"</string>
- <!-- outdated translation 6917522333561434546 --> <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Tschertgar datas vCard sin la carta SD"</string>
+ <!-- outdated translation 6917522333561434546 --> <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Tschertgar datas vCard sin la carta SD"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Tschertgar datas vCard sin la carta SD"</string>
- <!-- outdated translation 3506782007953167180 --> <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Errur cun leger la carta SD"</string>
+ <!-- outdated translation 3506782007953167180 --> <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Errur cun leger la carta SD"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Errur cun leger la carta SD"</string>
- <!-- no translation found for scanning_sdcard_failed_message (5645544323676912703) -->
+ <!-- no translation found for scanning_sdcard_failed_message (4106156155205860626) -->
<skip />
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Errur cun leger la carta SD. Il motiv: «<xliff:g id="FAIL_REASON">%s</xliff:g>»"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Errur I/O"</string>
@@ -240,7 +240,7 @@
<skip />
<!-- no translation found for vcard_import_failed (7718330063493653085) -->
<skip />
- <!-- no translation found for import_failure_no_vcard_file (8809370398968655782) -->
+ <!-- no translation found for import_failure_no_vcard_file (6339234836196984924) -->
<skip />
<!-- no translation found for import_failure_no_vcard_file (1730986357514922756) -->
<skip />
@@ -276,7 +276,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Errur cun exportar las datas da contact"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Errur cun exportar las datas da contact. "\n"Il motiv: «<xliff:g id="FAIL_REASON">%s</xliff:g>»"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Nagin contact exportabel"</string>
- <!-- outdated translation 7084146295639672658 --> <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"La carta SD cuntegna memia bleras datotecas vCard"</string>
+ <!-- outdated translation 7084146295639672658 --> <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"La carta SD cuntegna memia bleras datotecas vCard"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"La carta SD cuntegna memia bleras datotecas vCard"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Il num da datoteca necessari è memia lung («<xliff:g id="FILENAME">%s</xliff:g>»)"</string>
<!-- no translation found for exporting_vcard_finished_title (4259736138838583213) -->
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 6726ee5..f1a2f1d 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"fotografia persoanei din agendă"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Stoc. USB nu este disp."</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Stocare indisponibilă"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Niciun card SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Stocare USB nedetectată"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Nicio stocare detectată"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Niciun card SD detectat"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Se caută date în format vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importaţi de pe cardul SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Import. din stocarea USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importaţi din stocare"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importaţi de pe cardul SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Exportaţi în stocarea USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exportaţi în stocare"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exportaţi pe cardul SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Distribuiţi persoanele vizibile din agendă"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importaţi un fişier vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importaţi fişiere multiple vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importaţi toate fişierele vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Se caută date vCard în spaţiul de stocare USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Se caută date vCard în spaţiul de stocare"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Se caută date vCard pe cardul SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Scanarea stocării USB a eşuat"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Scanarea stocării nu a reuşit"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Scanarea cardului SD a eşuat"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Scanarea stocării USB a eşuat (Motiv: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Scanarea stocării nu a reuşit (Motiv: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Scanarea cardului SD eşuată (Motiv: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Eroare I/E"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Memoria este insuficientă (probabil fişierul este prea mare)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Analiza vCard a eşuat dintr-un motiv necunoscut"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Formatul nu este acceptat."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Nu a reuşit să importe vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Niciun fişier vCard găsit în stocarea USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Nu a fost găsit niciun fişier vCard în spaţiul de stocare"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Niciun fişier vCard găsit pe cardul SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Colectarea metainformaţiilor pentru fişierele vCard indicate a eşuat."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Unul sau mai multe fişiere nu s-au putut importa (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Exportul datelor persoanei din agendă a eşuat"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Exportul datelor din agendă a eşuat."\n" Motivul erorii: „<xliff:g id="FAIL_REASON">%s</xliff:g>”"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Nicio persoană în agendă exportabilă"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Prea multe fişiere vCard pe spaţiul de stocare USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Prea multe fişiere vCard în spaţiul de stocare"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Prea multe fişiere de tip vCard pe cardul SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Numele de fişier este prea lung („<xliff:g id="FILENAME">%s</xliff:g>”)"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"S-a finalizat exportul <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 9272e68..40a1133 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"фотография контакта"</string>
<string name="description_minus_button" msgid="387136707700230172">"минус"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB-накопитель недоступен"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Накопитель недоступен"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Нет SD-карты"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"USB-накопитель не найден"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Накопитель не найден"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"SD-карта не обнаружена"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Поиск vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Импортировать с SIM-карты"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Импорт с USB-накопителя"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Импорт из накопителя"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Импортировать с SD-карты"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Экспорт на USB-накопитель"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Экспорт на накопитель"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Экспортировать на SD-карту"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Передать видимые контакты"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Импорт одного файла VCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Импорт нескольких файлов vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Импорт всех файлов VCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Поиск данных vCard на USB-накопителе"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Поиск данных vCard на накопителе..."</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Поиск данных vCard на SD-карте"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Не удалось просканировать USB-накопитель"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Не удалось просканировать накопитель"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Не удалось сканировать SD-карту."</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Не удалось просканировать USB-накопитель (<xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Не удалось просканировать накопитель (<xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Не удалось просканировать SD-карту (причина: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Ошибка ввода-вывода"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Недостаточно памяти (возможно, файл слишком велик)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Не удалось обработать vCard по неизвестной причине."</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Формат не поддерживается."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Не удалось импортировать vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"На USB-накопителе отсутствуют файлы vCard"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"На накопителе отсутствуют файлы vCard"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"На SD-карте не найдены файлы VCard"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Не удалось собрать метаинформацию файлов VCard."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Не удалось импортировать один или несколько файлов (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Не удалось экспортировать данные контакта."</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Не удалось экспортировать данные контакта."\n"Причина: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Нет контактов, которые можно экспортировать."</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Слишком много файлов vCard на USB-накопителе"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Слишком много файлов vCard на накопителе"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Слишком много файлов VCard на SD-карте."</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Название файла слишком длинное (<xliff:g id="FILENAME">%s</xliff:g>)."</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Экспорт <xliff:g id="FILENAME">%s</xliff:g> завершен"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 28ce643..db2ab3e 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"fotografia kontaktu"</string>
<string name="description_minus_button" msgid="387136707700230172">"mínus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Ukl. priestor USB nedostup."</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Uklad. pr. je nedostupný"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Žiadna karta SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Nebol rozpoznaný ukl. priestor USB"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Ukladací priestor sa nenašiel"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Nebola zistená žiadna karta SD"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Vyhľadávanie karty vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importovať z karty SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Import z ukl. priestoru USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Import z ukl. priestoru"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importovať z karty SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Export do ukl. priestoru USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Export do uklad. priest."</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exportovať na kartu SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Zdieľať viditeľné kontakty"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importovať jeden súbor vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importovať niekoľko súborov vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importovať všetky súbory vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Vyhľadávanie údajov karty vCard v ukladacom priestore USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Vyhľadávanie údajov karty vCard v ukladacom priestore"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Prebieha hľadanie údajov karty vCard na karte SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Vyhľadávanie v ukladacom priestore USB zlyhalo"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Skenovanie ukladacieho priestoru zlyhalo"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Vyhľadávanie na karte SD zlyhalo"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Vyhľadávanie v ukladacom priestore USB zlyhalo (Dôvod: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Vyhľadávanie v ukladacom priestore zlyhalo (Dôvod: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Vyhľadávanie na karte SD zlyhalo. (Dôvod: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Chyba I/O"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Nie je k dispozícii dostatok pamäte (súbor môže byť príliš veľký)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Analýza karty vCard z neznámeho dôvodu zlyhala."</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Formát nie je podporovaný."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Importovanie vizitky vCard zlyhalo"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"V ukladacom priestore USB nebola nájdená žiadna karta vCard"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"V ukladacom priestore sa nenašiel žiadny súbor vCard"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Na karte SD nebol nájdený žiadny súbor vCard"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Zhromaždenie metainformácií zadaných súborov vCard zlyhalo."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Import jedného alebo viacerých súborov zlyhal (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Export údajov kontaktov zlyhal"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Export údajov kontaktov zlyhal."\n"Príčina chyby: <xliff:g id="FAIL_REASON">%s</xliff:g>"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Nedá sa exportovať nijaký kontakt"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"V ukladacom priestore USB je príliš veľa súborov vCard"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"V ukladacom priestore je príliš veľa súborov vCard"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Na karte SD sa nachádza príliš veľa súborov vCard"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Požadovaný názov súboru (<xliff:g id="FILENAME">%s</xliff:g>) je príliš dlhý"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Export vizitky <xliff:g id="FILENAME">%s</xliff:g> bol dokončený"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index b44a10e..f199e47 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"fotografija stika"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Pomnilnik USB ni na voljo"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Pomnilnik ni na voljo"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Ni kartice SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Pomnilnik USB ni zaznan"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Ni pomnilnika"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Kartica SD ni bila zaznana"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Iskanje vizitke vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Uvozi s kartice SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Uvozi iz pomnilnika USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Uvoz iz pomnilnika"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Uvozi s kartice SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Izvozi v pomnilnik USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Izvoz v pomnilnik"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Izvozi na kartico SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Vidne stike deli z drugimi"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Uvozi eno datoteko z vizitko vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Uvozi več datotek z vizitko vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Uvozi vse datoteke vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Iskanje podatkov vCard v pomnilniku USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Iskanje podatkov vCard v pomnilniku"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Iskanje podatkov vCard na kartici SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Pregledovanje pomnilnika USB ni uspelo"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Pregled pomnilnika ni uspel"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Pregledovanje kartice SD ni bilo uspešno"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Pregledovanje pomnilnika USB ni uspelo (Vzrok: »<xliff:g id="FAIL_REASON">%s</xliff:g>«)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Pregled pomnilnika ni uspel (Vzrok: »<xliff:g id="FAIL_REASON">%s</xliff:g>«)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Pregledovanje kartice SD ni bilo uspešno (Razlog: »<xliff:g id="FAIL_REASON">%s</xliff:g>«)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Vhodno/izhodna napaka"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Ni dovolj pomnilnika (morda je datoteka prevelika)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Iz neznanega razloga razčlenjevanje vizitke vCard ni bilo uspešno"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Oblika zapisa ni podprta."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Uvoz kartice vCard ni uspel"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Na disku USB ni datotek vCard"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"V pomnilniku ni datotek vCard"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Na kartici SD ni datotek vCard"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Metapodatkov datotek(e) vCard ni bilo mogoče zbrati."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Ene ali več datotek ni bilo mogoče uvoziti (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Podatkov o stiku ni bilo mogoče izvoziti"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Izvoz podatkov o stiku ni bil uspešen."\n"Razlog: »<xliff:g id="FAIL_REASON">%s</xliff:g>«"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Ni stikov za izvoz"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Preveč datotek vCard v pomnilniku USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"V pomnilniku je preveč datotek vCard"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Preveč datotek vCard na kartici SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Zahtevano ime datoteke je predolgo (<xliff:g id="FILENAME">%s</xliff:g>)"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Končan izvoz datoteke <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index ace95b4..76a6406 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"фотографија контакта"</string>
<string name="description_minus_button" msgid="387136707700230172">"минус"</string>
<string name="description_plus_button" msgid="515164827856229880">"плус"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB меморија је недоступна"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Меморија је недоступна"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Нема SD картице"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Није откривена USB меморија"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Није откривена меморија"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Није изабрана ниједна SD картица"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Претрага дигиталне визиткарте"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Увези са SIM картице"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Увоз из USB меморије"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Увези из меморије"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Увези са SD картице"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Извези у USB меморију"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Извези у меморију"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Извези на SD картицу"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Дели видљиве контакте"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Увези једну датотеку дигиталне визиткарте"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Увези више датотека дигиталних визиткарата"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Увези све датотеке дигиталних визиткарата"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Тражење података дигиталне визиткарте у USB меморији"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Тражење vCard података у меморији"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"У току је претрага података о дигиталним визиткартама на SD картици"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Неуспешно скенирање USB меморије"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Скенирање меморије није успело"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Скенирање SD картице није успело"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Неуспешно скенирање USB меморије (Разлог: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Скенирање меморије није успело (разлог: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Скенирање SD картице није успело (разлог: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O грешка"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Нема довољно меморије (датотека је можда превелика)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Рашчлањивање дигиталне визиткарте није успело из неочекиваног разлога"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Формат није подржан."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Увоз vCard датотеке није успео"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"У USB меморији није пронађена ниједна vCard датотека"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"У меморији није пронађена ниједна vCard датотека"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"На SD картици није пронађена ниједна vCard датотека"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Неуспешно прикупљање мета података за дате датотеке дигиталне визиткарте."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Увоз неких датотека није успео (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Извоз података о контактима није успео"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Извоз података о контактима није успео."\n"Разлог неуспеха: „<xliff:g id="FAIL_REASON">%s</xliff:g>“"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Нема контаката за извоз"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Превише датотека дигиталне визиткарте у USB меморији"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Превише је vCard датотека у меморији"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"SD картица садржи превише датотека дигиталних визиткарата"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Захтевани назив датотеке је предугачак („<xliff:g id="FILENAME">%s</xliff:g>“)"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Извоз датотеке <xliff:g id="FILENAME">%s</xliff:g> је завршен"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index b13bd3f..d4af9de 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"kontaktbild"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB-enhet ej tillgänglig"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Lagring otillgänglig"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Inget SD-kort"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Ingen USB-enhet hittades"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Ingen lagringsenhet hittades"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Inget SD-kort hittades"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Söker efter vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importera från SIM-kort"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Importera från USB-enhet"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Importera från lagring"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Importera från SD-kort"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Exportera till USB-enhet"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Exportera till lagring"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Exportera till SD-kort"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Dela synliga kontakter"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Importera en vCard-fil"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Importera flera vCard-filer"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importera alla vCard-filer"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Söker efter vCard-data på USB-lagringsenhet"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Sökning efter vCard-data på lagringsenheten pågår"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Söker efter vCard-data på SD-kort"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Det gick inte att söka igenom USB-lagringsenheten"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Det gick inte att söka igenom lagringsenheten"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Det gick inte att läsa SD-kort"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Det gick inte att söka igenom USB-lagringsenheten (orsak: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Det gick inte att söka igenom lagringsenheten (orsak: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Det gick inte att skanna SD-kortet (orsak: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O-fel"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Det finns för lite minne (filen kan vara för stor)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Det gick inte att analysera vCard av okänd anledning"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Formatet stöds inte."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Det gick inte att importera vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Det finns ingen vCard-fil på USB-lagringsenheten"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Det finns ingen vCard-fil på lagringsenheten"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Det finns ingen vCard-fil på SD-kortet"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Det går inte att samla in metainformation för den eller de givna vCard-filerna."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"En eller flera filer kunde inte importeras: (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Det gick inte att exportera kontaktdata"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Det gick inte att exportera kontaktdata."\n"Orsak: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Det finns ingen kontakt som kan exporteras"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"För många vCard-filer på USB-lagringsenheten"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"För många vCard-filer på lagringsenheten"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"För många vCard-filer på SD-kortet"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Det obligatoriska filnamnet är för långt (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"<xliff:g id="FILENAME">%s</xliff:g> har exporterats"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 64e7bde..98b3869 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"ภาพของรายชื่อ"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"ที่เก็บข้อมูล USB ใช้งานไม่ได้"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"ไม่มีที่เก็บข้อมูล"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"ไม่มีการ์ด SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"ไม่พบที่เก็บข้อมูล USB"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"ไม่พบที่เก็บข้อมูล"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"ไม่พบการ์ด SD"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"กำลังค้นหา vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"นำเข้าจากซิมการ์ด"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"นำเข้าจากที่เก็บข้อมูล USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"นำเข้าจากที่เก็บข้อมูล"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"นำเข้าจากการ์ด SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"ส่งออกไปยังที่เก็บข้อมูล USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"ส่งออกไปยังที่เก็บข้อมูล"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"ส่งออกไปยังการ์ด SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"แบ่งปันสมุดโทรศัพท์ที่มองเห็น"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"นำเข้าไฟล์ vCard หนึ่งไฟล์"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"นำเข้าไฟล์ vCard หลายไฟล์"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"นำเข้าไฟล์ vCard ทั้งหมด"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"กำลังค้นหาข้อมูล vCard ในที่เก็บข้อมูล USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"กำลังค้นหาข้อมูล vCard ในที่เก็บข้อมูล"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"กำลังค้นหาข้อมูล vCard บนการ์ด SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"การสแกนที่เก็บข้อมูล USB ล้มเหลว"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"การสแกนที่เก็บข้อมูลล้มเหลว"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"การสแกนการ์ด SD ล้มเหลว"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"การสแกนที่เก็บข้อมูล USB ล้มเหลว (เหตุผล: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"การสแกนที่เก็บข้อมูลล้มเหลว (เหตุผล: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"การสแกนการ์ด SD ล้มเหลว (เหตุผล: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"ข้อผิดพลาด I/O"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"หน่วยความจำไม่เพียงพอ (ไฟล์อาจใหญ่เกินไป)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"แยกวิเคราะห์ vCard ไม่สำเร็จด้วยเหตุผลที่ไม่คาดคิด"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"รูปแบบไม่ได้รับการสนับสนุน"</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"ไม่สามารถนำเข้า vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"ไม่พบไฟล์ vCard ในที่เก็บข้อมูล USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"ไม่พบไฟล์ vCard ในที่เก็บข้อมูล"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"ไม่พบไฟล์ vCard บนการ์ด SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"รวบรวมข้อมูลเมตาของไฟล์ vCard ที่ระบุไม่สำเร็จ"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"นำเข้าไฟล์ตั้งแต่หนึ่งไฟล์ขึ้นไปไม่สำเร็จ (%s)"</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"ส่งออกข้อมูลรายชื่อในสมุดโทรศัพท์ไม่สำเร็จ"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"ส่งออกข้อมูลรายชื่อไม่สำเร็จ"\n"เหตุผลที่ล้มเหลว: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"ไม่มีรายชื่อในสมุดโทรศัพท์ที่สามารถส่งออกได้"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"มีไฟล์ vCard มากเกินไปในที่เก็บข้อมูล USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"มีไฟล์ vCard มากเกินไปในที่เก็บข้อมูล"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"มีไฟล์ vCard บนการ์ด SD มากเกินไป"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"ชื่อไฟล์ที่ต้องใช้ยาวเกินไป (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"ส่งออก <xliff:g id="FILENAME">%s</xliff:g> เรียบร้อยแล้ว"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index db502e9..baf53b0 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"larawan ng contact"</string>
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Di available USB storage"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Hindi available ang imbakan"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Walang SD card"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Walang nakitang imbakan na USB"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Walang natukoy na imbakan"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Walang natukoy na SD card"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Paghahanap ng vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"I-import mula sa SIM card"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Import sa imbakan na USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"I-import mula sa imbakan"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Mag-import mula sa SD card"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Export sa imbakan na USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"I-export sa imbakan"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Mag-export sa SD card"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Magbahagi ng mga nakikitang contact"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Mag-import nang isang vCard file"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Mag-import ng maramihang vCard file"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"I-import ang lahat ng mga vCard file"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Naghahanap ng vCard data sa imbakan na USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Naghahanap para sa data ng vCard sa imbakan"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Naghahanap ng data ng vCard sa SD card"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Nabigo ang pag-scan ng imbakan na USB"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Nabigo ang pag-scan ng imbakan"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Nabigo ang pag-scan sa SD card"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Nabigo ang pag-scan ng imbakan na USB (Dahilan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Nabigo ang pag-scan ng imbakan (Dahilan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Nabigo ang pag-scan sa SD card (Dahilan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Error na I/O"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Hindi sapat ang memorya (maaaring masyadong malaki ang file)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Nabigong i-parse ang vCard para sa di-inaasahang dahilan"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Hindi suportado ang format."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Nabigong i-import ang vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Walang nakitang vCard file sa imabakan ng USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Walang nakitang vCard file sa imbakan"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Walang nakitang vCard file sa SD card"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Nabigong kumolekta ng impormasyon na meta ng ibinigay na (mga) vCard."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Nabigo ang isa o higit pang file upang ma-import (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Nabigong i-export ang data ng contact"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Nabigong i-export ang data ng contact."\n"Dahilan sa pagkabigo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Walang nae-export na contact"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Masyadong maraming vCard file sa imbakan na USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Masyadong maraming vCard file sa imbakan"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Masyadong maraming vCard file sa SD card"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Ang kinakailangang filename ay masyadong mahaba (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Tapos na ang pag-export ng <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 299d36d..3c23eb2 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"kişi fotoğrafı"</string>
<string name="description_minus_button" msgid="387136707700230172">"eksi"</string>
<string name="description_plus_button" msgid="515164827856229880">"artı"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"USB depl birimi kullnlmyr"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Depolama birimi yok"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"SD kart yok"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"USB deplm birimi algılanmadı"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Hiçbir depl birimi algılanmadı"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Hiçbir SD kart tespit edilmedi"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"vCard aranıyor"</string>
<string name="import_from_sim" msgid="3859272228033941659">"SIM karttan içe aktar"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"USB depl birmndn içe aktr"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Depl biriminden içe aktar"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"SD karttan içe aktar"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"USB deplm birmn dışa aktr"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Depolama birimine aktar"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"SD karta dışa aktar"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Görülebilir kişileri paylaş"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Bir vCard dosyasını içe aktar"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Birden fazla vCard dosyasını içe aktar"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Tüm vCard dosyalarını içe aktar"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"USB depolama birimindeki vCard verileri aranıyor"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Depolama birimindeki vCard verileri aranıyor"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"SD kartta vCard verileri aranıyor"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"USB depolama birimi taraması başarısız oldu"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Depolama birimi taraması başarısız oldu"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"SD kart taranamadı"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"USB depolama birimi taraması başarısız oldu (Nedeni: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Depolama birimi taraması başarısız oldu (Nedeni: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"SD kart taraması başarısız oldu (Neden: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"G/Ç Hatası"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Bellek yetersiz (dosya çok büyük olabilir)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Beklenmedik bir nedenden dolayı vCard ayrıştırılamadı"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Biçim desteklenmiyor."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"vCard içe aktarılamadı"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"USB depolama biriminde herhangi bir vCard dosyası bulunamadı"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Depolama biriminde hiçbir vCard dosyası bulunamadı"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"SD kartta hiçbir vCard dosyası bulunamadı"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Belirtilen vCard dosyalarının meta bilgileri toplanamıyor."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"İçe aktarılamayan bir veya birden fazla dosya (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Kişi verileri dışa aktarılamadı"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Kişi verileri dışa aktarılamadı."\n"Hata nedeni: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Dışa aktarılabilen hiçbir kişi yok"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"USB depolama biriminde çok fazla vCard dosyası var"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Depolama biriminde çok fazla vCard dosyası var"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"SD kartta çok fazla vCard dosyası var"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Gereken dosya adı çok uzun (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"<xliff:g id="FILENAME">%s</xliff:g> dosyasını dışa aktarma tamamlandı"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 5cc6575..ebda338 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"фото контакту"</string>
<string name="description_minus_button" msgid="387136707700230172">"мінус"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Носій USB недоступний"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Пам’ять недоступна"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Нема карти SD"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Носій USB не виявлено"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Пам’яті не виявлено"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Карту SD не виявлено"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Пошук даних vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Імортув. з SIM-карти"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Імпортувати з носія USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Імпорт із пам’яті"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Імортув. з карти SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Експортувати на носій USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Експорт у пам’ять"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Експорт. на карту SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Надісл. видимі контакти"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Імпортув. 1 файл vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Імпортув. кілька файлів vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Імпортув. всі файли vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Пошук даних vCard на носії USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Пошук даних vCard у пам’яті"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Пошук даних vCard на карті SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Помилка сканування носія USB"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Помилка сканування пам’яті"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Помилка сканув-ня SD карти"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Помилка сканування носія USB (причина: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Помилка сканування пам’яті (причина: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Помилка сканув. SD карти (Причина: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Помилка I/O"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Недостатньо пам\'яті (можливо, файл завеликий)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Не вдал. проаналіз. vCard через неочік. прич."</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Формат не підтримується."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Помилка імпорту vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"На носії USB не знайдено файлів vCard"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"У пам’яті не знайдено файли vCard"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"На карті SD не знайдено файлів vCard"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Помилка отримання мета-інформації файлів даної vCard."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Не вдалося імпорт. один чи кілька файлів (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Не вдал. експорт. контактні дані"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Не вдал. експорт. контактні дані."\n"Причина помилки: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Немає доступу до експорту конт."</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Забагато файлів vCard на носії USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Забагато файлів vCard у пам’яті"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"На карті SD забагато файлів vCard"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Потрібна назва файлу задовга (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Експорт файлу <xliff:g id="FILENAME">%s</xliff:g> завершено"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 32002de..11779ff 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"ảnh của liên hệ"</string>
<string name="description_minus_button" msgid="387136707700230172">"trừ"</string>
<string name="description_plus_button" msgid="515164827856229880">"cộng"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"Bộ nhớ USB không khả dụng"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Bộ nhớ không khả dụng"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Không có thẻ SD nào"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"Không phát hiện bộ nhớ USB nào"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"Không phát hiện bộ nhớ nào"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"Không phát hiện thẻ SD nào"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"Đang tìm kiếm vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Nhập từ thẻ SIM"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"Nhập từ bộ nhớ USB"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"Nhập từ bộ nhớ"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"Nhập từ thẻ SD"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"Xuất sang bộ nhớ USB"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"Xuất sang bộ nhớ"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"Xuất sang thẻ SD"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"Chia sẻ liên hệ hiển thị"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"Nhập một tệp vCard"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"Nhập nhiều tệp vCard"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"Nhập tất cả tệp vCard"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"Đang tìm kiếm dữ liệu vCard trong bộ nhớ USB"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"Đang tìm kiếm dữ liệu vCard trong bộ nhớ"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"Đang tìm dữ liệu vCard trên thẻ SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"Quét bộ nhớ USB không thành công"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"Quét bộ nhớ không thành công"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"Quét thẻ SD không thành công"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"Quét bộ nhớ USB không thành công (Lý do: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"Quét bộ nhớ không thành công (Lý do: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"Quét thẻ SD không thành công (Lý do: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"Lỗi I/O"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"Bộ nhớ không đủ (tệp có thể quá lớn)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Không thể phân tích cú pháp vCard vì lý do không mong muốn"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"Định dạng không được hỗ trợ."</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"Không thể nhập vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"Không tìm thấy tệp vCard trong bộ lưu trữ USB"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"Không tìm thấy tệp vCard nào trong bộ nhớ"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"Không tìm thấy tệp vCard trên thẻ SD"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"Không thể thu thập siêu thông tin của (các) tệp vCard cho trước."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Không thể nhập một hoặc nhiều tệp (%s)."</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"Không thể xuất dữ liệu liên hệ"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"Không thể xuất dữ liệu liên hệ."\n"Lý do không thành công: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"Không có liên hệ có thể xuất nào"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"Quá nhiều tệp vCard trong bộ nhớ USB"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"Quá nhiều tệp vCard trong bộ nhớ"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"Quá nhiều tệp vCard trên thẻ SD"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"Tên tệp yêu cầu quá dài (\"<xliff:g id="FILENAME">%s</xliff:g>\")"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"Đã xuất xong <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values-xlarge/dimens.xml b/res/values-xlarge/dimens.xml
index 6ffbb31..d29eba2 100644
--- a/res/values-xlarge/dimens.xml
+++ b/res/values-xlarge/dimens.xml
@@ -22,4 +22,5 @@
<dimen name="action_bar_filter_max_width">120dip</dimen>
<dimen name="action_bar_search_max_width">300dip</dimen>
<dimen name="action_bar_search_spacing">12dip</dimen>
+ <dimen name="shortcut_icon_size">64dip</dimen>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 1bfed1d..eaebeb7 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"联系人照片"</string>
<string name="description_minus_button" msgid="387136707700230172">"删除"</string>
<string name="description_plus_button" msgid="515164827856229880">"添加"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"不存在 USB 存储设备"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"存储设备不存在"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"无 SD 卡"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"未检测到 USB 存储设备"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"未检测到存储设备"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"未检测到 SD 卡"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"正在搜索 vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"从 SIM 卡导入"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"从 USB 存储设备导入"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"从存储设备导入"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"从 SD 卡导入"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"导出到 USB 存储设备"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"导出到存储设备"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"导出到 SD 卡"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"分享可见的联系人"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"导入一个 vCard 文件"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"导入多个 vCard 文件"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"导入所有 vCard 文件"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"正在 USB 存储设备中搜索 vCard 文件"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"正在存储设备中搜索 vCard 文件"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"正在 SD 卡中搜索 vCard 数据"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"扫描 USB 存储设备时失败"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"扫描存储设备时失败"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"扫描 SD 卡失败"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"扫描 USB 存储设备时失败(原因:“<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"扫描存储设备时失败(原因:“<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"扫描 SD 卡失败(原因:“<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O 错误"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"存储器空间不足(文件可能过大)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"由于意外原因而无法解析 vCard"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"不支持此格式。"</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"未能导入 vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"未在 USB 存储设备中找到 vCard 文件"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"未在存储设备中找到 vCard 文件"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"未在 SD 卡上找到 vCard 文件"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"无法收集指定的 vCard 文件的元信息。"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"一个或多个文件导入失败 (%s)。"</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"导出联系人数据失败"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"导出联系人数据失败。"\n"失败原因:“<xliff:g id="FAIL_REASON">%s</xliff:g>”"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"没有可导出的联系人"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"USB 存储设备中的 vCard 文件太多"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"存储设备中的 vCard 文件过多"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"SD 卡中的 vCard 文件太多"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"所需文件名太长(“<xliff:g id="FILENAME">%s</xliff:g>”)"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"导出 <xliff:g id="FILENAME">%s</xliff:g> 已完成"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 0341597..f562604 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -208,32 +208,32 @@
<string name="description_contact_photo" msgid="3387458082667894062">"聯絡人相片"</string>
<string name="description_minus_button" msgid="387136707700230172">"負號"</string>
<string name="description_plus_button" msgid="515164827856229880">"加號"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="5362631473262100989">"沒有可用的 USB 儲存裝置"</string>
+ <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"儲存裝置無法使用"</string>
<string name="no_sdcard_title" product="default" msgid="5911758680339949273">"無 SD 卡"</string>
- <string name="no_sdcard_message" product="nosdcard" msgid="8045830739790534254">"未偵測到 USB 儲存裝置"</string>
+ <string name="no_sdcard_message" product="nosdcard" msgid="1334170151822669976">"未偵測到儲存裝置"</string>
<string name="no_sdcard_message" product="default" msgid="6019391476490445358">"未偵測到 SD 卡"</string>
<string name="searching_vcard_title" msgid="4970508055399376813">"正在搜尋 VCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"從 SIM 卡匯入"</string>
- <string name="import_from_sdcard" product="nosdcard" msgid="8294728696808674154">"從 USB 儲存裝置匯入"</string>
+ <string name="import_from_sdcard" product="nosdcard" msgid="8668347930577565175">"從儲存裝置匯入"</string>
<string name="import_from_sdcard" product="default" msgid="8550360976693202816">"從 SD 卡匯入"</string>
- <string name="export_to_sdcard" product="nosdcard" msgid="7201274701382901259">"匯出到 USB 儲存裝置"</string>
+ <string name="export_to_sdcard" product="nosdcard" msgid="6092815580965201089">"匯出到儲存裝置"</string>
<string name="export_to_sdcard" product="default" msgid="2597105442616166277">"匯出至 SD 卡"</string>
<string name="share_visible_contacts" msgid="890150378880783797">"分享正常顯示的聯絡人"</string>
<string name="import_one_vcard_string" msgid="9059163467020328433">"匯入一個 vCard 檔案"</string>
<string name="import_multiple_vcard_string" msgid="3810226492811062392">"匯入多個 vCard 檔案"</string>
<string name="import_all_vcard_string" msgid="5518136113853448474">"匯入所有 vCard 檔案"</string>
- <string name="searching_vcard_message" product="nosdcard" msgid="8214795338181412751">"正在 USB 儲存裝置中搜尋 vCard 資料"</string>
+ <string name="searching_vcard_message" product="nosdcard" msgid="996170203695743981">"正在搜尋儲存裝置中的 vCard 資料"</string>
<string name="searching_vcard_message" product="default" msgid="6917522333561434546">"在 SD 卡上搜尋 VCard 資料"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="7447077516493667568">"掃描 USB 儲存裝置失敗"</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="6957414493948497249">"無法掃描儲存裝置"</string>
<string name="scanning_sdcard_failed_title" product="default" msgid="3506782007953167180">"無法掃描 SD 卡"</string>
- <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="5645544323676912703">"掃描 USB 儲存裝置失敗 (原因:「<xliff:g id="FAIL_REASON">%s</xliff:g>」)"</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard" msgid="4106156155205860626">"無法掃描儲存裝置 (原因:「<xliff:g id="FAIL_REASON">%s</xliff:g>」)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="3761992500690182922">"無法掃描 SD 卡 (原因:「<xliff:g id="FAIL_REASON">%s</xliff:g>」)"</string>
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O 錯誤"</string>
<string name="fail_reason_low_memory_during_import" msgid="7514918659342886381">"記憶體不足 (檔案可能過大)"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"因未預期原因,無法剖析 VCard"</string>
<string name="fail_reason_not_supported" msgid="294499264620201243">"不支援這種格式。"</string>
<string name="vcard_import_failed" msgid="7718330063493653085">"無法匯入 vCard"</string>
- <string name="import_failure_no_vcard_file" product="nosdcard" msgid="8809370398968655782">"在 USB 儲存裝置中找不到 vCard 檔案"</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard" msgid="6339234836196984924">"在儲存裝置中找不到 vCard 檔案"</string>
<string name="import_failure_no_vcard_file" product="default" msgid="1730986357514922756">"在 SD 卡上找不到 vCard 檔案"</string>
<string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="4154492282316067754">"無法從指定的 vCard 檔案收集中繼資料。"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"無法匯入一或多個檔案 (%s)。"</string>
@@ -259,7 +259,7 @@
<string name="exporting_contact_failed_title" msgid="585823094820602526">"無法匯出聯絡人資料"</string>
<string name="exporting_contact_failed_message" msgid="4151348002470298092">"匯出聯絡人資料失敗。"\n"失敗原因:「<xliff:g id="FAIL_REASON">%s</xliff:g>」"</string>
<string name="fail_reason_no_exportable_contact" msgid="4919714086648344495">"沒有可匯出的聯絡人"</string>
- <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="2638638826954895225">"USB 儲存裝置中的 vCard 檔案過多"</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard" msgid="3745507837635270265">"儲存裝置中的 vCard 檔案過多"</string>
<string name="fail_reason_too_many_vcard" product="default" msgid="7084146295639672658">"SD 卡中的 VCard 檔案過多"</string>
<string name="fail_reason_too_long_filename" msgid="1915716071321839166">"要求的檔案名稱過長 (「<xliff:g id="FILENAME">%s</xliff:g>」)"</string>
<string name="exporting_vcard_finished_title" msgid="4259736138838583213">"已完成匯出 <xliff:g id="FILENAME">%s</xliff:g>"</string>
diff --git a/res/values/config.xml b/res/values/config.xml
new file mode 100644
index 0000000..6ebaa1f
--- /dev/null
+++ b/res/values/config.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+
+ <!-- Amount of memory in bytes allocated for photo cache -->
+ <integer name="config_photo_cache_max_bytes">2000000</integer>
+
+ <!-- Number of decoded photo bitmaps retained in an LRU cache -->
+ <integer name="config_photo_cache_max_bitmaps">48</integer>
+</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 0b2cffd..47150b4 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -73,4 +73,6 @@
<!-- Spacing on the left the search field in the action bar -->
<dimen name="action_bar_search_spacing">12dip</dimen>
+ <!-- Size of the shortcut icon. 0dip means: use the system default -->
+ <dimen name="shortcut_icon_size">0dip</dimen>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d09904a..4c75705 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -680,13 +680,13 @@
-->
<string name="description_plus_button">plus</string>
- <!-- Dialog title shown when USB storage does not exist [CHAR LIMIT=25] -->
- <string name="no_sdcard_title" product="nosdcard">USB storage unavailable</string>
+ <!-- Dialog title shown when (USB) storage does not exist [CHAR LIMIT=25] -->
+ <string name="no_sdcard_title" product="nosdcard">Storage unavailable</string>
<!-- Dialog title shown when SD Card does not exist -->
<string name="no_sdcard_title" product="default">No SD card</string>
- <!-- Dialog message shown when USB storage does not exist [CHAR LIMIT=30] -->
- <string name="no_sdcard_message" product="nosdcard">No USB storage detected</string>
+ <!-- Dialog message shown when (USB) storage does not exist [CHAR LIMIT=30] -->
+ <string name="no_sdcard_message" product="nosdcard">No storage detected</string>
<!-- Dialog message shown when SDcard does not exist -->
<string name="no_sdcard_message" product="default">No SD card detected</string>
@@ -696,13 +696,13 @@
<!-- Action string for selecting SIM for importing contacts -->
<string name="import_from_sim">Import from SIM card</string>
- <!-- Action string for selecting USB storage for importing contacts [CHAR LIMIT=25] -->
- <string name="import_from_sdcard" product="nosdcard">Import from USB storage</string>
+ <!-- Action string for selecting (USB) storage for importing contacts [CHAR LIMIT=25] -->
+ <string name="import_from_sdcard" product="nosdcard">Import from storage</string>
<!-- Action string for selecting SD Card for importing contacts -->
<string name="import_from_sdcard" product="default">Import from SD card</string>
- <!-- Action that exports all contacts to USB storage [CHAR LIMIT=25] -->
- <string name="export_to_sdcard" product="nosdcard">Export to USB storage</string>
+ <!-- Action that exports all contacts to (USB) storage [CHAR LIMIT=25] -->
+ <string name="export_to_sdcard" product="nosdcard">Export to storage</string>
<!-- Action that exports all contacts to SD Card -->
<string name="export_to_sdcard" product="default">Export to SD card</string>
@@ -724,19 +724,19 @@
than one vCard files available in the system. -->
<string name="import_all_vcard_string">Import all vCard files</string>
- <!-- Dialog message shown when searching VCard data from SD Card [CHAR LIMIT=NONE] -->
- <string name="searching_vcard_message" product="nosdcard">Searching for vCard data in USB storage</string>
+ <!-- Dialog message shown when searching VCard data from (USB) storage [CHAR LIMIT=NONE] -->
+ <string name="searching_vcard_message" product="nosdcard">Searching for vCard data in storage</string>
<!-- Dialog message shown when searching VCard data from SD Card -->
<string name="searching_vcard_message" product="default">Searching for vCard data on SD card</string>
<!-- Dialog title shown when scanning VCard data failed. [CHAR LIMIT=NONE] -->
- <string name="scanning_sdcard_failed_title" product="nosdcard">Scanning USB storage failed</string>
+ <string name="scanning_sdcard_failed_title" product="nosdcard">Scanning storage failed</string>
<!-- Dialog title shown when scanning VCard data failed. -->
<string name="scanning_sdcard_failed_title" product="default">Scanning SD card failed</string>
<!-- Dialog message shown when searching VCard data failed.
An exact reason for the failure should [CHAR LIMIT=NONE] -->
- <string name="scanning_sdcard_failed_message" product="nosdcard">Scanning USB storage failed (Reason: \"<xliff:g id="fail_reason">%s</xliff:g>\")</string>
+ <string name="scanning_sdcard_failed_message" product="nosdcard">Scanning storage failed (Reason: \"<xliff:g id="fail_reason">%s</xliff:g>\")</string>
<!-- Dialog message shown when searching VCard data failed.
An exact reason for the failure should -->
<string name="scanning_sdcard_failed_message" product="default">Scanning SD card failed (Reason: \"<xliff:g id="fail_reason">%s</xliff:g>\")</string>
@@ -762,9 +762,9 @@
<string name="vcard_import_failed">Failed to import vCard</string>
<!-- The failure message shown when the system could not find any vCard file.
- (with extension ".vcf" in USB storage.)
+ (with extension ".vcf" in (USB) storage.)
[CHAR LIMIT=128] -->
- <string name="import_failure_no_vcard_file" product="nosdcard">No vCard file found in the USB storage</string>
+ <string name="import_failure_no_vcard_file" product="nosdcard">No vCard file found in the storage</string>
<!-- The failure message shown when the system could not find any vCard file.
(with extension ".vcf" in SDCard.)
[CHAR LIMIT=128] -->
@@ -864,7 +864,7 @@
<!-- The failed reason shown when vCard exporter could not create a file for the vCard since
there are too many files relevant to vCard. [CHAR LIMIT=NONE] -->
- <string name="fail_reason_too_many_vcard" product="nosdcard">Too many vCard files in the USB storage</string>
+ <string name="fail_reason_too_many_vcard" product="nosdcard">Too many vCard files in the storage</string>
<!-- The failed reason shown when vCard exporter could not create a file for the vCard since
there are too many files relevant to vCard. -->
<string name="fail_reason_too_many_vcard" product="default">Too many vCard files on the SD card</string>
diff --git a/src/com/android/contacts/CallContactActivity.java b/src/com/android/contacts/CallContactActivity.java
index 38e890d..77bf20c 100644
--- a/src/com/android/contacts/CallContactActivity.java
+++ b/src/com/android/contacts/CallContactActivity.java
@@ -44,7 +44,8 @@
finish();
}
- // If we are being invoked with a saved state, rely on Activity to restore it
+ // If this method is being invoked with a saved state, rely on Activity
+ // to restore it
if (savedInstanceState != null) {
return;
}
@@ -57,6 +58,7 @@
}
}
+ @Override
public void onDismiss(DialogInterface dialog) {
if (!isChangingConfigurations()) {
finish();
diff --git a/src/com/android/contacts/ContactPhotoManager.java b/src/com/android/contacts/ContactPhotoManager.java
new file mode 100644
index 0000000..914b697
--- /dev/null
+++ b/src/com/android/contacts/ContactPhotoManager.java
@@ -0,0 +1,746 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts;
+
+import com.android.contacts.model.AccountTypeManager;
+import com.google.android.collect.Lists;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Handler.Callback;
+import android.os.HandlerThread;
+import android.os.Message;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Contacts.Photo;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.Directory;
+import android.util.Log;
+import android.util.LruCache;
+import android.widget.ImageView;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.lang.ref.SoftReference;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Asynchronously loads contact photos and maintains a cache of photos.
+ */
+public abstract class ContactPhotoManager {
+
+ static final String TAG = "ContactPhotoManager";
+
+ public static final String CONTACT_PHOTO_SERVICE = "contactPhotos";
+
+ /**
+ * The resource ID of the image to be used when the photo is unavailable or being
+ * loaded.
+ */
+ protected final int mDefaultResourceId = R.drawable.ic_contact_picture;
+
+ /**
+ * Requests the singleton instance of {@link AccountTypeManager} with data bound from
+ * the available authenticators. This method can safely be called from the UI thread.
+ */
+ public static ContactPhotoManager getInstance(Context context) {
+ ContactPhotoManager service =
+ (ContactPhotoManager) context.getSystemService(CONTACT_PHOTO_SERVICE);
+ if (service == null) {
+ service = createContactPhotoManager(context);
+ Log.e(TAG, "No contact photo service in context: " + context);
+ }
+ return service;
+ }
+
+ public static synchronized ContactPhotoManager createContactPhotoManager(Context context) {
+ return new ContactPhotoManagerImpl(context);
+ }
+
+ /**
+ * Load photo into the supplied image view. If the photo is already cached,
+ * it is displayed immediately. Otherwise a request is sent to load the photo
+ * from the database.
+ */
+ public abstract void loadPhoto(ImageView view, long photoId);
+
+ /**
+ * Load photo into the supplied image view. If the photo is already cached,
+ * it is displayed immediately. Otherwise a request is sent to load the photo
+ * from the location specified by the URI.
+ */
+ public abstract void loadPhoto(ImageView view, Uri photoUri);
+
+ /**
+ * Temporarily stops loading photos from the database.
+ */
+ public abstract void pause();
+
+ /**
+ * Resumes loading photos from the database.
+ */
+ public abstract void resume();
+
+ /**
+ * Marks all cached photos for reloading. We can continue using cache but should
+ * also make sure the photos haven't changed in the background and notify the views
+ * if so.
+ */
+ public abstract void refreshCache();
+
+ /**
+ * Initiates a background process that over time will fill up cache with
+ * preload photos.
+ */
+ public abstract void preloadPhotosInBackground();
+}
+
+class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback {
+ private static final String LOADER_THREAD_NAME = "ContactPhotoLoader";
+
+ /**
+ * Type of message sent by the UI thread to itself to indicate that some photos
+ * need to be loaded.
+ */
+ private static final int MESSAGE_REQUEST_LOADING = 1;
+
+ /**
+ * Type of message sent by the loader thread to indicate that some photos have
+ * been loaded.
+ */
+ private static final int MESSAGE_PHOTOS_LOADED = 2;
+
+ private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
+ private static final String[] COLUMNS = new String[] { Photo._ID, Photo.PHOTO };
+
+ /**
+ * Maintains the state of a particular photo.
+ */
+ private static class BitmapHolder {
+ final byte[] bytes;
+
+ volatile boolean fresh;
+ Bitmap bitmap;
+ SoftReference<Bitmap> bitmapRef;
+
+ public BitmapHolder(byte[] bytes) {
+ this.bytes = bytes;
+ this.fresh = true;
+ }
+ }
+
+ private final Context mContext;
+
+ /**
+ * An LRU cache for bitmap holders. The cache contains bytes for photos just
+ * as they come from the database. Each holder has a soft reference to the
+ * actual bitmap.
+ */
+ private final LruCache<Object, BitmapHolder> mBitmapHolderCache;
+
+ /**
+ * Cache size threshold at which bitmaps will not be preloaded.
+ */
+ private final int mBitmapHolderCacheRedZoneBytes;
+
+ /**
+ * Level 2 LRU cache for bitmaps. This is a smaller cache that holds
+ * the most recently used bitmaps to save time on decoding
+ * them from bytes (the bytes are stored in {@link #mBitmapHolderCache}.
+ */
+ private final LruCache<Object, Bitmap> mBitmapCache;
+
+ /**
+ * A map from ImageView to the corresponding photo ID. Please note that this
+ * photo ID may change before the photo loading request is started.
+ */
+ private final ConcurrentHashMap<ImageView, Object> mPendingRequests =
+ new ConcurrentHashMap<ImageView, Object>();
+
+ /**
+ * Handler for messages sent to the UI thread.
+ */
+ private final Handler mMainThreadHandler = new Handler(this);
+
+ /**
+ * Thread responsible for loading photos from the database. Created upon
+ * the first request.
+ */
+ private LoaderThread mLoaderThread;
+
+ /**
+ * A gate to make sure we only send one instance of MESSAGE_PHOTOS_NEEDED at a time.
+ */
+ private boolean mLoadingRequested;
+
+ /**
+ * Flag indicating if the image loading is paused.
+ */
+ private boolean mPaused;
+
+ public ContactPhotoManagerImpl(Context context) {
+ mContext = context;
+
+ Resources resources = context.getResources();
+ mBitmapCache = new LruCache<Object, Bitmap>(
+ resources.getInteger(R.integer.config_photo_cache_max_bitmaps));
+ int maxBytes = resources.getInteger(R.integer.config_photo_cache_max_bytes);
+ mBitmapHolderCache = new LruCache<Object, BitmapHolder>(maxBytes) {
+ @Override protected int sizeOf(Object key, BitmapHolder value) {
+ return value.bytes != null ? value.bytes.length : 0;
+ }
+ };
+ mBitmapHolderCacheRedZoneBytes = (int) (maxBytes * 0.75);
+ }
+
+ @Override
+ public void preloadPhotosInBackground() {
+ ensureLoaderThread();
+ mLoaderThread.requestPreloading();
+ }
+
+ @Override
+ public void loadPhoto(ImageView view, long photoId) {
+ if (photoId == 0) {
+ // No photo is needed
+ view.setImageResource(mDefaultResourceId);
+ mPendingRequests.remove(view);
+ } else {
+ loadPhotoByIdOrUri(view, photoId);
+ }
+ }
+
+ @Override
+ public void loadPhoto(ImageView view, Uri photoUri) {
+ if (photoUri == null) {
+ // No photo is needed
+ view.setImageResource(mDefaultResourceId);
+ mPendingRequests.remove(view);
+ } else {
+ loadPhotoByIdOrUri(view, photoUri);
+ }
+ }
+
+ private void loadPhotoByIdOrUri(ImageView view, Object key) {
+ boolean loaded = loadCachedPhoto(view, key);
+ if (loaded) {
+ mPendingRequests.remove(view);
+ } else {
+ mPendingRequests.put(view, key);
+ if (!mPaused) {
+ // Send a request to start loading photos
+ requestLoading();
+ }
+ }
+ }
+
+ @Override
+ public void refreshCache() {
+ for (BitmapHolder holder : mBitmapHolderCache.snapshot().values()) {
+ holder.fresh = false;
+ }
+ }
+
+ /**
+ * Checks if the photo is present in cache. If so, sets the photo on the view.
+ *
+ * @return false if the photo needs to be (re)loaded from the provider.
+ */
+ private boolean loadCachedPhoto(ImageView view, Object key) {
+ BitmapHolder holder = mBitmapHolderCache.get(key);
+ if (holder == null) {
+ // The bitmap has not been loaded - should display the placeholder image.
+ view.setImageResource(mDefaultResourceId);
+ return false;
+ }
+
+ if (holder.bytes == null) {
+ view.setImageResource(mDefaultResourceId);
+ return holder.fresh;
+ }
+
+ // Optionally decode bytes into a bitmap
+ inflateBitmap(holder);
+
+ view.setImageBitmap(holder.bitmap);
+
+ // Put the bitmap in the LRU cache
+ mBitmapCache.put(key, holder.bitmap);
+
+ // Soften the reference
+ holder.bitmap = null;
+
+ return holder.fresh;
+ }
+
+ /**
+ * If necessary, decodes bytes stored in the holder to Bitmap. As long as the
+ * bitmap is held either by {@link #mBitmapCache} or by a soft reference in
+ * the holder, it will not be necessary to decode the bitmap.
+ */
+ private void inflateBitmap(BitmapHolder holder) {
+ byte[] bytes = holder.bytes;
+ if (bytes == null || bytes.length == 0) {
+ return;
+ }
+
+ // Check the soft reference. If will be retained if the bitmap is also
+ // in the LRU cache, so we don't need to check the LRU cache explicitly.
+ if (holder.bitmapRef != null) {
+ holder.bitmap = holder.bitmapRef.get();
+ if (holder.bitmap != null) {
+ return;
+ }
+ }
+
+ try {
+ Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null);
+ holder.bitmap = bitmap;
+ holder.bitmapRef = new SoftReference<Bitmap>(bitmap);
+ } catch (OutOfMemoryError e) {
+ // Do nothing - the photo will appear to be missing
+ }
+ }
+
+ public void clear() {
+ mPendingRequests.clear();
+ mBitmapHolderCache.evictAll();
+ }
+
+ @Override
+ public void pause() {
+ mPaused = true;
+ }
+
+ @Override
+ public void resume() {
+ mPaused = false;
+ if (!mPendingRequests.isEmpty()) {
+ requestLoading();
+ }
+ }
+
+ /**
+ * Sends a message to this thread itself to start loading images. If the current
+ * view contains multiple image views, all of those image views will get a chance
+ * to request their respective photos before any of those requests are executed.
+ * This allows us to load images in bulk.
+ */
+ private void requestLoading() {
+ if (!mLoadingRequested) {
+ mLoadingRequested = true;
+ mMainThreadHandler.sendEmptyMessage(MESSAGE_REQUEST_LOADING);
+ }
+ }
+
+ /**
+ * Processes requests on the main thread.
+ */
+ public boolean handleMessage(Message msg) {
+ switch (msg.what) {
+ case MESSAGE_REQUEST_LOADING: {
+ mLoadingRequested = false;
+ if (!mPaused) {
+ ensureLoaderThread();
+ mLoaderThread.requestLoading();
+ }
+ return true;
+ }
+
+ case MESSAGE_PHOTOS_LOADED: {
+ if (!mPaused) {
+ processLoadedImages();
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void ensureLoaderThread() {
+ if (mLoaderThread == null) {
+ mLoaderThread = new LoaderThread(mContext.getContentResolver());
+ mLoaderThread.start();
+ }
+ }
+
+ /**
+ * Goes over pending loading requests and displays loaded photos. If some of the
+ * photos still haven't been loaded, sends another request for image loading.
+ */
+ private void processLoadedImages() {
+ Iterator<ImageView> iterator = mPendingRequests.keySet().iterator();
+ while (iterator.hasNext()) {
+ ImageView view = iterator.next();
+ Object key = mPendingRequests.get(view);
+ boolean loaded = loadCachedPhoto(view, key);
+ if (loaded) {
+ iterator.remove();
+ }
+ }
+
+ softenCache();
+
+ if (!mPendingRequests.isEmpty()) {
+ requestLoading();
+ }
+ }
+
+ /**
+ * Removes strong references to loaded bitmaps to allow them to be garbage collected
+ * if needed. Some of the bitmaps will still be retained by {@link #mBitmapCache}.
+ */
+ private void softenCache() {
+ for (BitmapHolder holder : mBitmapHolderCache.snapshot().values()) {
+ holder.bitmap = null;
+ }
+ }
+
+ /**
+ * Stores the supplied bitmap in cache.
+ */
+ private void cacheBitmap(Object key, byte[] bytes, boolean preloading) {
+ BitmapHolder holder = new BitmapHolder(bytes);
+ holder.fresh = true;
+
+ // Unless this image is being preloaded, decode it right away while
+ // we are still on the background thread.
+ if (!preloading) {
+ inflateBitmap(holder);
+ }
+
+ mBitmapHolderCache.put(key, holder);
+ }
+
+ /**
+ * Populates an array of photo IDs that need to be loaded.
+ */
+ private void obtainPhotoIdsAndUrisToLoad(ArrayList<Long> photoIds,
+ ArrayList<String> photoIdsAsStrings, ArrayList<Uri> uris) {
+ photoIds.clear();
+ photoIdsAsStrings.clear();
+ uris.clear();
+
+ /*
+ * Since the call is made from the loader thread, the map could be
+ * changing during the iteration. That's not really a problem:
+ * ConcurrentHashMap will allow those changes to happen without throwing
+ * exceptions. Since we may miss some requests in the situation of
+ * concurrent change, we will need to check the map again once loading
+ * is complete.
+ */
+ Iterator<Object> iterator = mPendingRequests.values().iterator();
+ while (iterator.hasNext()) {
+ Object key = iterator.next();
+ BitmapHolder holder = mBitmapHolderCache.get(key);
+ if (holder == null || !holder.fresh) {
+ if (key instanceof Long) {
+ photoIds.add((Long)key);
+ photoIdsAsStrings.add(key.toString());
+ } else {
+ uris.add((Uri)key);
+ }
+ }
+ }
+ }
+
+ /**
+ * The thread that performs loading of photos from the database.
+ */
+ private class LoaderThread extends HandlerThread implements Callback {
+ private static final int BUFFER_SIZE = 1024*16;
+ private static final int MESSAGE_PRELOAD_PHOTOS = 0;
+ private static final int MESSAGE_LOAD_PHOTOS = 1;
+
+ /**
+ * A pause between preload batches that yields to the UI thread.
+ */
+ private static final int PHOTO_PRELOAD_DELAY = 50;
+
+ /**
+ * Number of photos to preload per batch.
+ */
+ private static final int PRELOAD_BATCH = 25;
+
+ /**
+ * Maximum number of photos to preload. If the cache size is 2Mb and
+ * the expected average size of a photo is 4kb, then this number should be 2Mb/4kb = 500.
+ */
+ private static final int MAX_PHOTOS_TO_PRELOAD = 500;
+
+ private final ContentResolver mResolver;
+ private final StringBuilder mStringBuilder = new StringBuilder();
+ private final ArrayList<Long> mPhotoIds = Lists.newArrayList();
+ private final ArrayList<String> mPhotoIdsAsStrings = Lists.newArrayList();
+ private final ArrayList<Uri> mPhotoUris = Lists.newArrayList();
+ private ArrayList<Long> mPreloadPhotoIds = Lists.newArrayList();
+
+ private Handler mLoaderThreadHandler;
+ private byte mBuffer[];
+
+ private static final int PRELOAD_STATUS_NOT_STARTED = 0;
+ private static final int PRELOAD_STATUS_IN_PROGRESS = 1;
+ private static final int PRELOAD_STATUS_DONE = 2;
+
+ private int mPreloadStatus = PRELOAD_STATUS_NOT_STARTED;
+
+ public LoaderThread(ContentResolver resolver) {
+ super(LOADER_THREAD_NAME);
+ mResolver = resolver;
+ }
+
+ public void ensureHandler() {
+ if (mLoaderThreadHandler == null) {
+ mLoaderThreadHandler = new Handler(getLooper(), this);
+ }
+ }
+
+ /**
+ * Kicks off preloading of the next batch of photos on the background thread.
+ * Preloading will happen after a delay: we want to yield to the UI thread
+ * as much as possible.
+ * <p>
+ * If preloading is already complete, does nothing.
+ */
+ public void requestPreloading() {
+ if (mPreloadStatus == PRELOAD_STATUS_DONE) {
+ return;
+ }
+
+ ensureHandler();
+ if (mLoaderThreadHandler.hasMessages(MESSAGE_LOAD_PHOTOS)) {
+ return;
+ }
+
+ mLoaderThreadHandler.sendEmptyMessageDelayed(
+ MESSAGE_PRELOAD_PHOTOS, PHOTO_PRELOAD_DELAY);
+ }
+
+ /**
+ * Sends a message to this thread to load requested photos. Cancels a preloading
+ * request, if any: we don't want preloading to impede loading of the photos
+ * we need to display now.
+ */
+ public void requestLoading() {
+ ensureHandler();
+ mLoaderThreadHandler.removeMessages(MESSAGE_PRELOAD_PHOTOS);
+ mLoaderThreadHandler.sendEmptyMessage(MESSAGE_LOAD_PHOTOS);
+ }
+
+ /**
+ * Receives the above message, loads photos and then sends a message
+ * to the main thread to process them.
+ */
+ public boolean handleMessage(Message msg) {
+ switch (msg.what) {
+ case MESSAGE_PRELOAD_PHOTOS:
+ preloadPhotosInBackground();
+ break;
+ case MESSAGE_LOAD_PHOTOS:
+ loadPhotosInBackground();
+ break;
+ }
+ return true;
+ }
+
+ /**
+ * The first time it is called, figures out which photos need to be preloaded.
+ * Each subsequent call preloads the next batch of photos and requests
+ * another cycle of preloading after a delay. The whole process ends when
+ * we either run out of photos to preload or fill up cache.
+ */
+ private void preloadPhotosInBackground() {
+ if (mPreloadStatus == PRELOAD_STATUS_DONE) {
+ return;
+ }
+
+ if (mPreloadStatus == PRELOAD_STATUS_NOT_STARTED) {
+ queryPhotosForPreload();
+ if (mPreloadPhotoIds.isEmpty()) {
+ mPreloadStatus = PRELOAD_STATUS_DONE;
+ } else {
+ mPreloadStatus = PRELOAD_STATUS_IN_PROGRESS;
+ }
+ requestPreloading();
+ return;
+ }
+
+ if (mBitmapHolderCache.size() > mBitmapHolderCacheRedZoneBytes) {
+ mPreloadStatus = PRELOAD_STATUS_DONE;
+ return;
+ }
+
+ mPhotoIds.clear();
+ mPhotoIdsAsStrings.clear();
+
+ int count = 0;
+ int preloadSize = mPreloadPhotoIds.size();
+ while(preloadSize > 0 && mPhotoIds.size() < PRELOAD_BATCH) {
+ preloadSize--;
+ count++;
+ Long photoId = mPreloadPhotoIds.get(preloadSize);
+ mPhotoIds.add(photoId);
+ mPhotoIdsAsStrings.add(photoId.toString());
+ mPreloadPhotoIds.remove(preloadSize);
+ }
+
+ loadPhotosFromDatabase(false);
+
+ if (preloadSize == 0) {
+ mPreloadStatus = PRELOAD_STATUS_DONE;
+ }
+
+ Log.v(TAG, "Preloaded " + count + " photos. Photos in cache: "
+ + mBitmapHolderCache.size()
+ + ". Total size: " + mBitmapHolderCache.size());
+
+ requestPreloading();
+ }
+
+ private void queryPhotosForPreload() {
+ Cursor cursor = null;
+ try {
+ Uri uri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(
+ ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
+ .build();
+ cursor = mResolver.query(uri, new String[] { Contacts.PHOTO_ID },
+ Contacts.PHOTO_ID + " NOT NULL AND " + Contacts.PHOTO_ID + "!=0",
+ null,
+ Contacts.STARRED + " DESC, " + Contacts.LAST_TIME_CONTACTED + " DESC"
+ + " LIMIT " + MAX_PHOTOS_TO_PRELOAD);
+
+ if (cursor != null) {
+ while (cursor.moveToNext()) {
+ // Insert them in reverse order, because we will be taking
+ // them from the end of the list for loading.
+ mPreloadPhotoIds.add(0, cursor.getLong(0));
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+ }
+
+ private void loadPhotosInBackground() {
+ obtainPhotoIdsAndUrisToLoad(mPhotoIds, mPhotoIdsAsStrings, mPhotoUris);
+ loadPhotosFromDatabase(true);
+ loadRemotePhotos();
+ requestPreloading();
+ }
+
+ private void loadPhotosFromDatabase(boolean preloading) {
+ int count = mPhotoIds.size();
+ if (count == 0) {
+ return;
+ }
+
+ // Remove loaded photos from the preload queue: we don't want
+ // the preloading process to load them again.
+ if (!preloading && mPreloadStatus == PRELOAD_STATUS_IN_PROGRESS) {
+ for (int i = 0; i < count; i++) {
+ mPreloadPhotoIds.remove(mPhotoIds.get(i));
+ }
+ if (mPreloadPhotoIds.isEmpty()) {
+ mPreloadStatus = PRELOAD_STATUS_DONE;
+ }
+ }
+
+ mStringBuilder.setLength(0);
+ mStringBuilder.append(Photo._ID + " IN(");
+ for (int i = 0; i < count; i++) {
+ if (i != 0) {
+ mStringBuilder.append(',');
+ }
+ mStringBuilder.append('?');
+ }
+ mStringBuilder.append(')');
+
+ Cursor cursor = null;
+ try {
+ cursor = mResolver.query(Data.CONTENT_URI,
+ COLUMNS,
+ mStringBuilder.toString(),
+ mPhotoIdsAsStrings.toArray(EMPTY_STRING_ARRAY),
+ null);
+
+ if (cursor != null) {
+ while (cursor.moveToNext()) {
+ Long id = cursor.getLong(0);
+ byte[] bytes = cursor.getBlob(1);
+ cacheBitmap(id, bytes, preloading);
+ mPhotoIds.remove(id);
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+
+ // Remaining photos were not found in the database - mark the cache accordingly.
+ count = mPhotoIds.size();
+ for (int i = 0; i < count; i++) {
+ cacheBitmap(mPhotoIds.get(i), null, preloading);
+ }
+
+ mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
+ }
+
+ private void loadRemotePhotos() {
+ int count = mPhotoUris.size();
+ for (int i = 0; i < count; i++) {
+ Uri uri = mPhotoUris.get(i);
+ if (mBuffer == null) {
+ mBuffer = new byte[BUFFER_SIZE];
+ }
+ try {
+ InputStream is = mResolver.openInputStream(uri);
+ if (is != null) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try {
+ int size;
+ while ((size = is.read(mBuffer)) != -1) {
+ baos.write(mBuffer, 0, size);
+ }
+ } finally {
+ is.close();
+ }
+ cacheBitmap(uri, baos.toByteArray(), false);
+ mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
+ } else {
+ Log.v(TAG, "Cannot load photo " + uri);
+ cacheBitmap(uri, null, false);
+ }
+ } catch (Exception ex) {
+ Log.v(TAG, "Cannot load photo " + uri, ex);
+ cacheBitmap(uri, null, false);
+ }
+ }
+ }
+ }
+}
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index c07dd68..f7ede90 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -16,7 +16,9 @@
package com.android.contacts;
-import com.android.contacts.R;
+import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.EntityDeltaList;
+import com.android.contacts.model.EntityModifier;
import com.google.android.collect.Lists;
import com.google.android.collect.Sets;
@@ -35,6 +37,7 @@
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
+import android.os.Parcelable;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.provider.ContactsContract.AggregationExceptions;
@@ -63,7 +66,9 @@
public static final String EXTRA_CONTENT_VALUES = "contentValues";
public static final String EXTRA_CALLBACK_INTENT = "callbackIntent";
- public static final String EXTRA_OPERATIONS = "Operations";
+ public static final String ACTION_SAVE_CONTACT = "saveContact";
+ public static final String EXTRA_CONTACT_STATE = "state";
+ public static final String EXTRA_SAVE_MODE = "saveMode";
public static final String ACTION_CREATE_GROUP = "createGroup";
public static final String ACTION_RENAME_GROUP = "renameGroup";
@@ -105,16 +110,30 @@
Data.DATA15
);
+ private static final int PERSIST_TRIES = 3;
+
public ContactSaveService() {
super(TAG);
setIntentRedelivery(true);
}
@Override
+ public Object getSystemService(String name) {
+ Object service = super.getSystemService(name);
+ if (service != null) {
+ return service;
+ }
+
+ return getApplicationContext().getSystemService(name);
+ }
+
+ @Override
protected void onHandleIntent(Intent intent) {
String action = intent.getAction();
if (ACTION_NEW_RAW_CONTACT.equals(action)) {
createRawContact(intent);
+ } else if (ACTION_SAVE_CONTACT.equals(action)) {
+ saveContact(intent);
} else if (ACTION_CREATE_GROUP.equals(action)) {
createGroup(intent);
} else if (ACTION_RENAME_GROUP.equals(action)) {
@@ -199,6 +218,121 @@
}
/**
+ * Creates an intent that can be sent to this service to create a new raw contact
+ * using data presented as a set of ContentValues.
+ */
+ public static Intent createSaveContactIntent(Context context, EntityDeltaList state,
+ String saveModeExtraKey, int saveMode, Class<?> callbackActivity,
+ String callbackAction) {
+ Intent serviceIntent = new Intent(
+ context, ContactSaveService.class);
+ serviceIntent.setAction(ContactSaveService.ACTION_SAVE_CONTACT);
+ serviceIntent.putExtra(EXTRA_CONTACT_STATE, (Parcelable) state);
+
+ // Callback intent will be invoked by the service once the contact is
+ // saved. The service will put the URI of the new contact as "data" on
+ // the callback intent.
+ Intent callbackIntent = new Intent(context, callbackActivity);
+ callbackIntent.putExtra(saveModeExtraKey, saveMode);
+ callbackIntent.setAction(callbackAction);
+ callbackIntent.setFlags(
+ Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ serviceIntent.putExtra(ContactSaveService.EXTRA_CALLBACK_INTENT, callbackIntent);
+ return serviceIntent;
+ }
+
+ private void saveContact(Intent intent) {
+ EntityDeltaList state = intent.getParcelableExtra(EXTRA_CONTACT_STATE);
+ Intent callbackIntent = intent.getParcelableExtra(EXTRA_CALLBACK_INTENT);
+
+ // Trim any empty fields, and RawContacts, before persisting
+ final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
+ EntityModifier.trimEmpty(state, accountTypes);
+
+ Uri lookupUri = null;
+
+ final ContentResolver resolver = getContentResolver();
+
+ // Attempt to persist changes
+ int tries = 0;
+ while (tries++ < PERSIST_TRIES) {
+ try {
+ // Build operations and try applying
+ final ArrayList<ContentProviderOperation> diff = state.buildDiff();
+ ContentProviderResult[] results = null;
+ if (!diff.isEmpty()) {
+ results = resolver.applyBatch(ContactsContract.AUTHORITY, diff);
+ }
+
+ final long rawContactId = getRawContactId(state, diff, results);
+ if (rawContactId == -1) {
+ throw new IllegalStateException("Could not determine RawContact ID after save");
+ }
+ final Uri rawContactUri = ContentUris.withAppendedId(
+ RawContacts.CONTENT_URI, rawContactId);
+ lookupUri = RawContacts.getContactLookupUri(resolver, rawContactUri);
+ Log.v(TAG, "Saved contact. New URI: " + lookupUri);
+ break;
+
+ } catch (RemoteException e) {
+ // Something went wrong, bail without success
+ Log.e(TAG, "Problem persisting user edits", e);
+ break;
+
+ } catch (OperationApplicationException e) {
+ // Version consistency failed, re-parent change and try again
+ Log.w(TAG, "Version consistency failed, re-parenting: " + e.toString());
+ final StringBuilder sb = new StringBuilder(RawContacts._ID + " IN(");
+ boolean first = true;
+ final int count = state.size();
+ for (int i = 0; i < count; i++) {
+ Long rawContactId = state.getRawContactId(i);
+ if (rawContactId != null && rawContactId != -1) {
+ if (!first) {
+ sb.append(',');
+ }
+ sb.append(rawContactId);
+ first = false;
+ }
+ }
+ sb.append(")");
+
+ if (first) {
+ throw new IllegalStateException("Version consistency failed for a new contact");
+ }
+
+ final EntityDeltaList newState = EntityDeltaList.fromQuery(resolver,
+ sb.toString(), null, null);
+ state = EntityDeltaList.mergeAfter(newState, state);
+ }
+ }
+
+ callbackIntent.setData(lookupUri);
+
+ startActivity(callbackIntent);
+ }
+
+ private long getRawContactId(EntityDeltaList state,
+ final ArrayList<ContentProviderOperation> diff,
+ final ContentProviderResult[] results) {
+ long rawContactId = state.findRawContactId();
+ if (rawContactId != -1) {
+ return rawContactId;
+ }
+
+ final int diffSize = diff.size();
+ for (int i = 0; i < diffSize; i++) {
+ ContentProviderOperation operation = diff.get(i);
+ if (operation.getType() == ContentProviderOperation.TYPE_INSERT
+ && operation.getUri().getEncodedPath().contains(
+ RawContacts.CONTENT_URI.getEncodedPath())) {
+ return ContentUris.parseId(results[i].uri);
+ }
+ }
+ return -1;
+ }
+
+ /**
* Creates an intent that can be sent to this service to create a new group.
*/
public static Intent createNewGroupIntent(Context context, Account account, String label,
diff --git a/src/com/android/contacts/ContactsApplication.java b/src/com/android/contacts/ContactsApplication.java
index 8346c04..c925ec0 100644
--- a/src/com/android/contacts/ContactsApplication.java
+++ b/src/com/android/contacts/ContactsApplication.java
@@ -31,6 +31,7 @@
private static InjectedServices sInjectedServices;
private AccountTypeManager mAccountTypeManager;
+ private ContactPhotoManager mContactPhotoManager;
/**
* Overrides the system services with mocks for testing.
@@ -82,6 +83,14 @@
return mAccountTypeManager;
}
+ if (ContactPhotoManager.CONTACT_PHOTO_SERVICE.equals(name)) {
+ if (mContactPhotoManager == null) {
+ mContactPhotoManager = ContactPhotoManager.createContactPhotoManager(this);
+ mContactPhotoManager.preloadPhotosInBackground();
+ }
+ return mContactPhotoManager;
+ }
+
return super.getSystemService(name);
}
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 9943e2d..7ca5921 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -29,7 +29,6 @@
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.View.OnFocusChangeListener;
import android.widget.SearchView;
import android.widget.SearchView.OnCloseListener;
import android.widget.SearchView.OnQueryTextListener;
@@ -38,8 +37,8 @@
/**
* Adapter for the action bar at the top of the Contacts activity.
*/
-public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener,
- ContactListFilterListener, OnFocusChangeListener {
+public class ActionBarAdapter
+ implements OnQueryTextListener, OnCloseListener, ContactListFilterListener {
public interface Listener {
void onAction();
@@ -95,7 +94,6 @@
mSearchView.setOnQueryTextListener(this);
mSearchView.setOnCloseListener(this);
- mSearchView.setOnQueryTextFocusChangeListener(this);
mSearchView.setQuery(mQueryString, false);
mSearchView.setQueryHint(mContext.getString(R.string.hint_findContacts));
@@ -117,13 +115,6 @@
mFilterController.addListener(this);
}
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (v == mSearchView && hasFocus) {
- setSearchMode(true);
- }
- }
-
public boolean isSearchMode() {
return mSearchMode;
}
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 4c2411c..e888bc0 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -498,7 +498,7 @@
@Override
public void onDeleteContactAction(Uri contactUri) {
- ContactDeletionInteraction.start(ContactBrowserActivity.this, contactUri);
+ ContactDeletionInteraction.start(ContactBrowserActivity.this, contactUri, false);
}
@Override
@@ -545,7 +545,7 @@
@Override
public void onDeleteRequested(Uri contactUri) {
- ContactDeletionInteraction.start(ContactBrowserActivity.this, contactUri);
+ ContactDeletionInteraction.start(ContactBrowserActivity.this, contactUri, false);
}
@Override
diff --git a/src/com/android/contacts/activities/ContactDetailActivity.java b/src/com/android/contacts/activities/ContactDetailActivity.java
index ca26280..56e8353 100644
--- a/src/com/android/contacts/activities/ContactDetailActivity.java
+++ b/src/com/android/contacts/activities/ContactDetailActivity.java
@@ -94,7 +94,7 @@
@Override
public void onDeleteRequested(Uri contactUri) {
- ContactDeletionInteraction.start(ContactDetailActivity.this, contactUri);
+ ContactDeletionInteraction.start(ContactDetailActivity.this, contactUri, true);
}
@Override
diff --git a/src/com/android/contacts/activities/ContactEditorActivity.java b/src/com/android/contacts/activities/ContactEditorActivity.java
index 00e0ab0..35f7413 100644
--- a/src/com/android/contacts/activities/ContactEditorActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorActivity.java
@@ -50,6 +50,7 @@
private static final String TAG = "ContactEditorActivity";
public static final String ACTION_JOIN_COMPLETED = "joinCompleted";
+ public static final String ACTION_SAVE_COMPLETED = "saveCompleted";
private ContactEditorFragment mFragment;
private Button mDoneButton;
@@ -70,6 +71,11 @@
return;
}
+ if (ACTION_SAVE_COMPLETED.equals(action)) {
+ finish();
+ return;
+ }
+
setContentView(R.layout.contact_editor_activity);
// This Activity will always fall back to the "top" Contacts screen when touched on the
@@ -113,6 +119,10 @@
String action = intent.getAction();
if (Intent.ACTION_EDIT.equals(action)) {
mFragment.setIntentExtras(intent.getExtras());
+ } else if (ACTION_SAVE_COMPLETED.equals(action)) {
+ mFragment.onSaveCompleted(true,
+ intent.getIntExtra(ContactEditorFragment.SAVE_MODE_EXTRA_KEY, SaveMode.CLOSE),
+ intent.getData());
} else if (ACTION_JOIN_COMPLETED.equals(action)) {
mFragment.onJoinCompleted(intent.getData());
}
@@ -195,7 +205,7 @@
@Override
public void onDeleteRequested(Uri contactUri) {
- ContactDeletionInteraction.start(ContactEditorActivity.this, contactUri);
+ ContactDeletionInteraction.start(ContactEditorActivity.this, contactUri, true);
}
@Override
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index 5dde900..42b3293 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -60,6 +60,7 @@
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Event;
import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
@@ -409,7 +410,8 @@
if (kind == null) continue;
final ViewEntry entry = ViewEntry.fromValues(mContext, mimeType, kind, dataId,
- entryValues);
+ entryValues, mContactData.isDirectoryEntry(),
+ mContactData.getDirectoryId());
final boolean hasData = !TextUtils.isEmpty(entry.data);
Integer superPrimary = entryValues.getAsInteger(Data.IS_SUPER_PRIMARY);
@@ -444,7 +446,6 @@
entry.actionIcon = -1;
}
-
// Remember super-primary phone
if (isSuperPrimary) mPrimaryPhoneUri = entry.uri;
@@ -463,8 +464,9 @@
final String imMime = Im.CONTENT_ITEM_TYPE;
final DataKind imKind = accountTypes.getKindOrFallback(accountType,
imMime);
- final ViewEntry imEntry = ViewEntry.fromValues(mContext,
- imMime, imKind, dataId, entryValues);
+ final ViewEntry imEntry = ViewEntry.fromValues(mContext, imMime, imKind,
+ dataId, entryValues, mContactData.isDirectoryEntry(),
+ mContactData.getDirectoryId());
buildImActions(imEntry, entryValues);
imEntry.applyStatus(status, false);
mImEntries.add(imEntry);
@@ -472,7 +474,8 @@
} else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
// Build postal entries
entry.maxLines = 4;
- entry.intent = new Intent(Intent.ACTION_VIEW, entry.uri);
+ entry.intent = new Intent(
+ Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=" + Uri.encode(entry.data)));
mPostalEntries.add(entry);
} else if (Im.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
// Build IM entries
@@ -546,7 +549,8 @@
mRelationEntries.add(entry);
} else {
// Handle showing custom rows
- entry.intent = new Intent(Intent.ACTION_VIEW, entry.uri);
+ entry.intent = new Intent(Intent.ACTION_VIEW);
+ entry.intent.setDataAndType(entry.uri, entry.mimetype);
// Use social summary when requested by external source
final DataStatus status = mContactData.getStatuses().get(entry.id);
@@ -720,11 +724,15 @@
* Build new {@link ViewEntry} and populate from the given values.
*/
public static ViewEntry fromValues(Context context, String mimeType, DataKind kind,
- long dataId, ContentValues values) {
+ long dataId, ContentValues values, boolean isDirectoryEntry, long directoryId) {
final ViewEntry entry = new ViewEntry();
entry.context = context;
entry.id = dataId;
entry.uri = ContentUris.withAppendedId(Data.CONTENT_URI, entry.id);
+ if (isDirectoryEntry) {
+ entry.uri = entry.uri.buildUpon().appendQueryParameter(
+ ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(directoryId)).build();
+ }
entry.mimetype = mimeType;
entry.kind = (kind.titleRes == -1 || kind.titleRes == 0) ? ""
: context.getString(kind.titleRes);
diff --git a/src/com/android/contacts/editor/AggregationSuggestionView.java b/src/com/android/contacts/editor/AggregationSuggestionView.java
index 5403731..af8e7f8 100644
--- a/src/com/android/contacts/editor/AggregationSuggestionView.java
+++ b/src/com/android/contacts/editor/AggregationSuggestionView.java
@@ -136,7 +136,7 @@
@Override
public boolean performClick() {
- if (mListener != null) {
+ if (mListener != null && isEnabled()) {
if (canEditSuggestedContact()) {
mListener.onEditAction(Contacts.getLookupUri(mContactId, mLookupKey));
} else {
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index b117d77..67eb564 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -31,8 +31,6 @@
import com.android.contacts.model.EntityDeltaList;
import com.android.contacts.model.EntityModifier;
import com.android.contacts.model.GoogleAccountType;
-import com.android.contacts.util.EmptyService;
-import com.android.contacts.util.WeakAsyncTask;
import android.accounts.Account;
import android.app.Activity;
@@ -43,9 +41,6 @@
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.ActivityNotFoundException;
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
-import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
@@ -54,7 +49,6 @@
import android.content.Entity;
import android.content.Intent;
import android.content.Loader;
-import android.content.OperationApplicationException;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Rect;
@@ -62,22 +56,18 @@
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
-import android.os.RemoteException;
import android.os.SystemClock;
-import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Event;
import android.provider.ContactsContract.CommonDataKinds.Note;
import android.provider.ContactsContract.CommonDataKinds.Organization;
import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Intents;
import android.provider.ContactsContract.RawContacts;
import android.provider.MediaStore;
-import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -115,10 +105,12 @@
private static final String KEY_RAW_CONTACT_ID_REQUESTING_PHOTO = "photorequester";
private static final String KEY_VIEW_ID_GENERATOR = "viewidgenerator";
private static final String KEY_CURRENT_PHOTO_FILE = "currentphotofile";
- private static final String KEY_QUERY_SELECTION = "queryselection";
private static final String KEY_CONTACT_ID_FOR_JOIN = "contactidforjoin";
private static final String KEY_SHOW_JOIN_SUGGESTIONS = "showJoinSuggestions";
private static final String KEY_ENABLED = "enabled";
+ private static final String KEY_STATUS = "status";
+
+ public static final String SAVE_MODE_EXTRA_KEY = "saveMode";
/**
* An intent extra that forces the editor to add the edited contact
@@ -168,15 +160,21 @@
public static final int EDITING = 1;
/**
- * The data is currently being saved. This is used to prevent more auto-saves (they shouldn't
- * overlap)
+ * The data is currently being saved. This is used to prevent more
+ * auto-saves (they shouldn't overlap)
*/
public static final int SAVING = 2;
/**
- * Prevents any more savings (this is used if Save/Close or Revert was executed by the user)
+ * Prevents any more savings (this is used if Save/Close or Revert was
+ * executed by the user)
*/
public static final int CLOSING = 3;
+
+ /**
+ * Prevents saving while running a child activity.
+ */
+ public static final int SUB_ACTIVITY = 4;
}
private static final int REQUEST_CODE_JOIN = 0;
@@ -215,8 +213,6 @@
private Bundle mIntentExtras;
private Listener mListener;
- private String mQuerySelection;
-
private long mContactIdForJoin;
private LinearLayout mContent;
@@ -227,7 +223,6 @@
private long mLoaderStartTime;
private int mStatus;
- private boolean mSaveOnStop = true;
private AggregationSuggestionEngine mAggregationSuggestionEngine;
private long mAggregationSuggestionsRawContactId;
@@ -236,6 +231,7 @@
private boolean mAutoAddToDefaultGroup;
private boolean mEnabled = true;
+ private boolean mRequestFocus;
public ContactEditorFragment() {
}
@@ -249,6 +245,7 @@
mContent.getChildAt(i).setEnabled(enabled);
}
}
+ setAggregationSuggestionViewEnabled(enabled);
final Activity activity = getActivity();
if (activity != null) activity.invalidateOptionsMenu();
}
@@ -268,7 +265,7 @@
}
// If anything was left unsaved, save it now but keep the editor open.
- if (!getActivity().isChangingConfigurations() && mStatus == Status.EDITING && mSaveOnStop) {
+ if (!getActivity().isChangingConfigurations() && mStatus == Status.EDITING) {
save(SaveMode.RELOAD);
}
}
@@ -316,6 +313,8 @@
// Load Accounts async so that we can present them
selectAccountAndCreateContact();
}
+ } else if (ContactEditorActivity.ACTION_SAVE_COMPLETED.equals(mAction)) {
+ // do nothing
} else throw new IllegalArgumentException("Unknown Action String " + mAction +
". Only support " + Intent.ACTION_EDIT + " or " + Intent.ACTION_INSERT);
}
@@ -323,7 +322,6 @@
@Override
public void onStart() {
- mSaveOnStop = true;
getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupLoaderListener);
super.onStart();
}
@@ -364,11 +362,10 @@
if (fileName != null) {
mCurrentPhotoFile = new File(fileName);
}
- mQuerySelection = savedState.getString(KEY_QUERY_SELECTION);
mContactIdForJoin = savedState.getLong(KEY_CONTACT_ID_FOR_JOIN);
mAggregationSuggestionsRawContactId = savedState.getLong(KEY_SHOW_JOIN_SUGGESTIONS);
mEnabled = savedState.getBoolean(KEY_ENABLED);
- mStatus = Status.EDITING;
+ mStatus = savedState.getInt(KEY_STATUS);
}
}
@@ -409,22 +406,12 @@
private void bindEditorsForExistingContact(ContactLoader.Result data) {
setEnabled(true);
- // Build Filter mQuerySelection
- final ArrayList<Entity> entities = data.getEntities();
- final StringBuilder sb = new StringBuilder(RawContacts._ID + " IN(");
- final int count = entities.size();
- for (int i = 0; i < count; i++) {
- if (i > 0) {
- sb.append(',');
- }
- sb.append(entities.get(i).getEntityValues().get(RawContacts._ID));
- }
- sb.append(")");
- mQuerySelection = sb.toString();
- mState = EntityDeltaList.fromIterator(entities.iterator());
+ mState = EntityDeltaList.fromIterator(data.getEntities().iterator());
setIntentExtras(mIntentExtras);
mIntentExtras = null;
+ mRequestFocus = true;
+
bindEditors();
}
@@ -488,6 +475,8 @@
}
private void bindEditorsForNewContact(Account account, final AccountType accountType) {
+ mStatus = Status.EDITING;
+
final ContentValues values = new ContentValues();
if (account != null) {
values.put(RawContacts.ACCOUNT_NAME, account.name);
@@ -519,6 +508,8 @@
mState.add(insert);
}
+ mRequestFocus = true;
+
bindEditors();
}
@@ -563,11 +554,17 @@
if (editor instanceof RawContactEditorView) {
final RawContactEditorView rawContactEditor = (RawContactEditorView) editor;
final TextFieldsEditorView nameEditor = rawContactEditor.getNameEditor();
+ if (mRequestFocus) {
+ nameEditor.requestFocus();
+ mRequestFocus = false;
+ }
nameEditor.setEditorListener(new EditorListener() {
@Override
public void onRequest(int request) {
- onContactNameChange(request, rawContactEditor, nameEditor);
+ if (request == EditorListener.FIELD_CHANGED) {
+ acquireAggregationSuggestions(rawContactEditor);
+ }
}
@Override
@@ -583,6 +580,8 @@
}
}
+ mRequestFocus = false;
+
bindGroupMetaData();
// Show editor now that we've loaded state
@@ -592,6 +591,7 @@
// Activity can be null if we have been detached from the Activity
final Activity activity = getActivity();
if (activity != null) activity.invalidateOptionsMenu();
+
}
private void bindGroupMetaData() {
@@ -671,14 +671,12 @@
// If we just started creating a new contact and haven't added any data, it's too
// early to do a join
- if (mState.size() == 1 && mState.get(0).isContactInsert()) {
- final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
- EntityModifier.trimEmpty(mState, accountTypes);
- if (mState.buildDiff().isEmpty()) {
- Toast.makeText(getActivity(), R.string.toast_join_with_empty_contact,
- Toast.LENGTH_LONG).show();
- return true;
- }
+ final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
+ if (mState.size() == 1 && mState.get(0).isContactInsert()
+ && !EntityModifier.hasChanges(mState, accountTypes)) {
+ Toast.makeText(getActivity(), R.string.toast_join_with_empty_contact,
+ Toast.LENGTH_LONG).show();
+ return true;
}
return save(SaveMode.JOIN);
@@ -739,7 +737,7 @@
// Launch gallery to crop the photo
final Intent intent = getCropImageIntent(Uri.fromFile(f));
- mSaveOnStop = false;
+ mStatus = Status.SUB_ACTIVITY;
startActivityForResult(intent, REQUEST_CODE_PHOTO_PICKED_WITH_DATA);
} catch (Exception e) {
Log.e(TAG, "Cannot crop image", e);
@@ -767,29 +765,29 @@
* finishes the activity.
*/
public boolean save(int saveMode) {
- if (!hasValidState()) {
+ if (!hasValidState() || mStatus != Status.EDITING) {
return false;
}
// If we are about to close the editor - there is no need to refresh the data
- if (saveMode == SaveMode.CLOSE) {
+ if (saveMode == SaveMode.CLOSE || saveMode == SaveMode.SPLIT) {
getLoaderManager().destroyLoader(LOADER_DATA);
}
mStatus = Status.SAVING;
- // Trim any empty fields, and RawContacts, before persisting
final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
- EntityModifier.trimEmpty(mState, accountTypes);
-
- if (mState.buildDiff().isEmpty()) {
- onSaveCompleted(true, saveMode, mLookupUri);
+ if (!EntityModifier.hasChanges(mState, accountTypes)) {
+ onSaveCompleted(false, saveMode, mLookupUri);
return true;
}
- final PersistTask task = new PersistTask(this, saveMode);
- task.execute(mState);
+ setEnabled(false);
+ Intent intent = ContactSaveService.createSaveContactIntent(getActivity(), mState,
+ SAVE_MODE_EXTRA_KEY, saveMode, getActivity().getClass(),
+ ContactEditorActivity.ACTION_SAVE_COMPLETED);
+ getActivity().startService(intent);
return true;
}
@@ -822,7 +820,8 @@
}
private boolean revert() {
- if (mState == null || mState.buildDiff().isEmpty()) {
+ final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
+ if (mState == null || !EntityModifier.hasChanges(mState, accountTypes)) {
doRevertAction();
} else {
CancelEditDialogFragment.show(this);
@@ -837,11 +836,21 @@
}
public void onJoinCompleted(Uri uri) {
- onSaveCompleted(uri != null, SaveMode.RELOAD, uri);
+ onSaveCompleted(false, SaveMode.RELOAD, uri);
}
- public void onSaveCompleted(boolean success, int saveMode, Uri contactLookupUri) {
- Log.d(TAG, "onSaveCompleted(" + success + ", " + saveMode + ", " + contactLookupUri);
+ public void onSaveCompleted(boolean hadChanges, int saveMode, Uri contactLookupUri) {
+ boolean success = contactLookupUri != null;
+ Log.d(TAG, "onSaveCompleted(" + saveMode + ", " + contactLookupUri);
+ if (hadChanges) {
+ if (success) {
+ if (saveMode != SaveMode.JOIN) {
+ Toast.makeText(mContext, R.string.contactSavedToast, Toast.LENGTH_SHORT).show();
+ }
+ } else {
+ Toast.makeText(mContext, R.string.contactSavedErrorToast, Toast.LENGTH_LONG).show();
+ }
+ }
switch (saveMode) {
case SaveMode.CLOSE:
case SaveMode.HOME:
@@ -877,6 +886,7 @@
if (mListener != null) mListener.onSaveFinished(resultCode, resultIntent,
saveMode == SaveMode.HOME);
break;
+
case SaveMode.RELOAD:
case SaveMode.JOIN:
if (success && contactLookupUri != null) {
@@ -893,14 +903,14 @@
}
}
break;
+
case SaveMode.SPLIT:
- setEnabled(true);
+ mStatus = Status.CLOSING;
if (mListener != null) {
mListener.onContactSplit(contactLookupUri);
} else {
Log.d(TAG, "No listener registered, can not call onSplitFinished");
}
- mStatus = Status.EDITING;
break;
}
}
@@ -1096,110 +1106,6 @@
return 0;
}
-
- private void onContactNameChange(int request, final RawContactEditorView rawContactEditor,
- TextFieldsEditorView nameEditor) {
-
- switch (request) {
- case EditorListener.EDITOR_FORM_CHANGED:
- if (nameEditor.hasShortAndLongForms()) {
- if (nameEditor.areOptionalFieldsVisible()) {
- switchFromFullNameToStructuredName(nameEditor);
- } else {
- switchFromStructuredNameToFullName(nameEditor);
- }
- }
- break;
-
- case EditorListener.FIELD_CHANGED:
- if (nameEditor.hasShortAndLongForms()) {
- if (nameEditor.areOptionalFieldsVisible()) {
- eraseFullName(nameEditor.getValues());
- } else {
- eraseStructuredName(nameEditor.getValues());
- }
- }
- acquireAggregationSuggestions(rawContactEditor);
- break;
- }
- }
-
- private void switchFromFullNameToStructuredName(LabeledEditorView nameEditor) {
- ValuesDelta values = nameEditor.getValues();
-
- String displayName = values.getAsString(StructuredName.DISPLAY_NAME);
- if (displayName == null) {
- displayName = "";
- }
-
- Uri uri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name")
- .appendQueryParameter(StructuredName.DISPLAY_NAME, displayName).build();
- Cursor cursor = getActivity().getContentResolver().query(uri, new String[]{
- StructuredName.PREFIX,
- StructuredName.GIVEN_NAME,
- StructuredName.MIDDLE_NAME,
- StructuredName.FAMILY_NAME,
- StructuredName.SUFFIX,
- }, null, null, null);
-
- try {
- if (cursor.moveToFirst()) {
- eraseFullName(values);
- values.put(StructuredName.PREFIX, cursor.getString(0));
- values.put(StructuredName.GIVEN_NAME, cursor.getString(1));
- values.put(StructuredName.MIDDLE_NAME, cursor.getString(2));
- values.put(StructuredName.FAMILY_NAME, cursor.getString(3));
- values.put(StructuredName.SUFFIX, cursor.getString(4));
- }
- } finally {
- cursor.close();
- }
- }
-
- private void switchFromStructuredNameToFullName(LabeledEditorView nameEditor) {
- ValuesDelta values = nameEditor.getValues();
-
- Uri.Builder builder = ContactsContract.AUTHORITY_URI.buildUpon().appendPath(
- "complete_name");
- appendQueryParameter(builder, values, StructuredName.PREFIX);
- appendQueryParameter(builder, values, StructuredName.GIVEN_NAME);
- appendQueryParameter(builder, values, StructuredName.MIDDLE_NAME);
- appendQueryParameter(builder, values, StructuredName.FAMILY_NAME);
- appendQueryParameter(builder, values, StructuredName.SUFFIX);
- Uri uri = builder.build();
- Cursor cursor = getActivity().getContentResolver().query(uri, new String[]{
- StructuredName.DISPLAY_NAME,
- }, null, null, null);
-
- try {
- if (cursor.moveToFirst()) {
- eraseStructuredName(values);
- values.put(StructuredName.DISPLAY_NAME, cursor.getString(0));
- }
- } finally {
- cursor.close();
- }
- }
-
- private void eraseFullName(ValuesDelta values) {
- values.putNull(StructuredName.DISPLAY_NAME);
- }
-
- private void eraseStructuredName(ValuesDelta values) {
- values.putNull(StructuredName.PREFIX);
- values.putNull(StructuredName.GIVEN_NAME);
- values.putNull(StructuredName.MIDDLE_NAME);
- values.putNull(StructuredName.FAMILY_NAME);
- values.putNull(StructuredName.SUFFIX);
- }
-
- private void appendQueryParameter(Uri.Builder builder, ValuesDelta values, String field) {
- String value = values.getAsString(field);
- if (!TextUtils.isEmpty(value)) {
- builder.appendQueryParameter(field, value);
- }
- }
-
/**
* Triggers an asynchronous search for aggregation suggestions.
*/
@@ -1228,7 +1134,7 @@
@Override
public void onAggregationSuggestionChange() {
- if (!isAdded() || mState == null) {
+ if (!isAdded() || mState == null || mStatus != Status.EDITING) {
return;
}
@@ -1275,6 +1181,7 @@
}
adjustAggregationSuggestionViewLayout(rawContactView);
+ setAggregationSuggestionViewEnabled(mEnabled);
mAggregationSuggestionView.setVisibility(View.VISIBLE);
if (requestOnScreen) {
@@ -1351,6 +1258,10 @@
* contacts), save all changes, and stay in the editor.
*/
protected void doJoinSuggestedContact(long[] rawContactIds) {
+ if (!hasValidState() || mStatus != Status.EDITING) {
+ return;
+ }
+
mState.setJoinWithRawContacts(rawContactIds);
save(SaveMode.RELOAD);
}
@@ -1415,6 +1326,19 @@
mContent.requestRectangleOnScreen(rect);
}
+ public void setAggregationSuggestionViewEnabled(boolean enabled) {
+ if (mAggregationSuggestionView == null) {
+ return;
+ }
+
+ LinearLayout itemList = (LinearLayout) mAggregationSuggestionView.findViewById(
+ R.id.aggregation_suggestions);
+ int count = itemList.getChildCount();
+ for (int i = 0; i < count; i++) {
+ itemList.getChildAt(i).setEnabled(enabled);
+ }
+ }
+
/**
* Computes bounds of the supplied view relative to its ascendant.
*/
@@ -1430,133 +1354,6 @@
return rect;
}
- // TODO: There has to be a nicer way than this WeakAsyncTask...? Maybe call a service?
- /**
- * Background task for persisting edited contact data, using the changes
- * defined by a set of {@link EntityDelta}. This task starts
- * {@link EmptyService} to make sure the background thread can finish
- * persisting in cases where the system wants to reclaim our process.
- */
- public static class PersistTask extends
- WeakAsyncTask<EntityDeltaList, Void, Integer, ContactEditorFragment> {
- private static final int PERSIST_TRIES = 3;
-
- private static final int RESULT_UNCHANGED = 0;
- private static final int RESULT_SUCCESS = 1;
- private static final int RESULT_FAILURE = 2;
-
- private final Context mContext;
-
- private int mSaveMode;
- private Uri mContactLookupUri = null;
-
- public PersistTask(ContactEditorFragment target, int saveMode) {
- super(target);
- mSaveMode = saveMode;
- mContext = target.mContext;
- }
-
- /** {@inheritDoc} */
- @Override
- protected void onPreExecute(ContactEditorFragment target) {
- target.setEnabled(false);
-
- // Before starting this task, start an empty service to protect our
- // process from being reclaimed by the system.
- mContext.startService(new Intent(mContext, EmptyService.class));
- }
-
- /** {@inheritDoc} */
- @Override
- protected Integer doInBackground(ContactEditorFragment target, EntityDeltaList... params) {
- final ContentResolver resolver = mContext.getContentResolver();
-
- EntityDeltaList state = params[0];
-
- // Attempt to persist changes
- int tries = 0;
- Integer result = RESULT_FAILURE;
- while (tries++ < PERSIST_TRIES) {
- try {
- // Build operations and try applying
- final ArrayList<ContentProviderOperation> diff = state.buildDiff();
- ContentProviderResult[] results = null;
- if (!diff.isEmpty()) {
- results = resolver.applyBatch(ContactsContract.AUTHORITY, diff);
- }
-
- final long rawContactId = getRawContactId(state, diff, results);
- if (rawContactId != -1) {
- final Uri rawContactUri = ContentUris.withAppendedId(
- RawContacts.CONTENT_URI, rawContactId);
-
- // convert the raw contact URI to a contact URI
- mContactLookupUri = RawContacts.getContactLookupUri(resolver,
- rawContactUri);
- Log.d(TAG, "Looked up RawContact Uri " + rawContactUri +
- " into ContactLookupUri " + mContactLookupUri);
- } else {
- Log.w(TAG, "Could not determine RawContact ID after save");
- }
- result = (diff.size() > 0) ? RESULT_SUCCESS : RESULT_UNCHANGED;
- break;
-
- } catch (RemoteException e) {
- // Something went wrong, bail without success
- Log.e(TAG, "Problem persisting user edits", e);
- break;
-
- } catch (OperationApplicationException e) {
- // Version consistency failed, re-parent change and try again
- Log.w(TAG, "Version consistency failed, re-parenting: " + e.toString());
- final EntityDeltaList newState = EntityDeltaList.fromQuery(resolver,
- target.mQuerySelection, null, null);
- state = EntityDeltaList.mergeAfter(newState, state);
- }
- }
-
- return result;
- }
-
- private long getRawContactId(EntityDeltaList state,
- final ArrayList<ContentProviderOperation> diff,
- final ContentProviderResult[] results) {
- long rawContactId = state.findRawContactId();
- if (rawContactId != -1) {
- return rawContactId;
- }
-
-
- // we gotta do some searching for the id
- final int diffSize = diff.size();
- for (int i = 0; i < diffSize; i++) {
- ContentProviderOperation operation = diff.get(i);
- if (operation.getType() == ContentProviderOperation.TYPE_INSERT
- && operation.getUri().getEncodedPath().contains(
- RawContacts.CONTENT_URI.getEncodedPath())) {
- return ContentUris.parseId(results[i].uri);
- }
- }
- return -1;
- }
-
- /** {@inheritDoc} */
- @Override
- protected void onPostExecute(ContactEditorFragment target, Integer result) {
- Log.d(TAG, "onPostExecute(something," + result + "). mSaveMode=" + mSaveMode);
- if (result == RESULT_SUCCESS && mSaveMode != SaveMode.JOIN) {
- Toast.makeText(mContext, R.string.contactSavedToast, Toast.LENGTH_SHORT).show();
- } else if (result == RESULT_FAILURE) {
- Toast.makeText(mContext, R.string.contactSavedErrorToast, Toast.LENGTH_LONG).show();
- }
-
- // Stop the service that was protecting us
- mContext.stopService(new Intent(mContext, EmptyService.class));
-
- target.onSaveCompleted(result != RESULT_FAILURE, mSaveMode, mContactLookupUri);
- }
- }
-
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putParcelable(KEY_URI, mLookupUri);
@@ -1572,15 +1369,19 @@
if (mCurrentPhotoFile != null) {
outState.putString(KEY_CURRENT_PHOTO_FILE, mCurrentPhotoFile.toString());
}
- outState.putString(KEY_QUERY_SELECTION, mQuerySelection);
outState.putLong(KEY_CONTACT_ID_FOR_JOIN, mContactIdForJoin);
outState.putLong(KEY_SHOW_JOIN_SUGGESTIONS, mAggregationSuggestionsRawContactId);
outState.putBoolean(KEY_ENABLED, mEnabled);
+ outState.putInt(KEY_STATUS, mStatus);
super.onSaveInstanceState(outState);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mStatus == Status.SUB_ACTIVITY) {
+ mStatus = Status.EDITING;
+ }
+
// Ignore failed requests
if (resultCode != Activity.RESULT_OK) return;
switch (requestCode) {
@@ -1825,7 +1626,7 @@
mCurrentPhotoFile = new File(PHOTO_DIR, getPhotoFileName());
final Intent intent = getTakePickIntent(mCurrentPhotoFile);
- mSaveOnStop = false;
+ mStatus = Status.SUB_ACTIVITY;
startActivityForResult(intent, REQUEST_CODE_CAMERA_WITH_DATA);
} catch (ActivityNotFoundException e) {
Toast.makeText(mContext, R.string.photoPickerNotFoundText,
@@ -1842,7 +1643,7 @@
try {
// Launch picker to choose photo for selected contact
final Intent intent = getPhotoPickIntent();
- mSaveOnStop = false;
+ mStatus = Status.SUB_ACTIVITY;
startActivityForResult(intent, REQUEST_CODE_PHOTO_PICKED_WITH_DATA);
} catch (ActivityNotFoundException e) {
Toast.makeText(mContext, R.string.photoPickerNotFoundText,
diff --git a/src/com/android/contacts/editor/KindSectionView.java b/src/com/android/contacts/editor/KindSectionView.java
index 4ce8dda..aaeafac 100644
--- a/src/com/android/contacts/editor/KindSectionView.java
+++ b/src/com/android/contacts/editor/KindSectionView.java
@@ -269,7 +269,13 @@
}
final View newField = createEditorView(values);
- newField.requestFocus();
+ post(new Runnable() {
+
+ @Override
+ public void run() {
+ newField.requestFocus();
+ }
+ });
// For non-lists (e.g. Notes we can only have one field. in that case we need to disable
// the add button
diff --git a/src/com/android/contacts/editor/LabeledEditorView.java b/src/com/android/contacts/editor/LabeledEditorView.java
index 971a023..ebd35f9 100644
--- a/src/com/android/contacts/editor/LabeledEditorView.java
+++ b/src/com/android/contacts/editor/LabeledEditorView.java
@@ -35,6 +35,7 @@
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
+import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
@@ -326,11 +327,9 @@
}
}
- /** {@inheritDoc} */
@Override
public void onFieldChanged(String column, String value) {
- String oldValue = mEntry.getAsString(column);
- if (oldValue == null && value.equals("") || oldValue != null && oldValue.equals(value)) {
+ if (!isFieldChanged(column, value)) {
return;
}
@@ -341,6 +340,11 @@
}
}
+ protected boolean isFieldChanged(String column, String value) {
+ String oldValue = mEntry.getAsString(column);
+ return !TextUtils.equals(oldValue, value);
+ }
+
protected void rebuildValues() {
setValues(mKind, mEntry, mState, mReadOnly, mViewIdGenerator);
}
diff --git a/src/com/android/contacts/editor/PhotoActionPopup.java b/src/com/android/contacts/editor/PhotoActionPopup.java
index ae76afe..bc50da9 100644
--- a/src/com/android/contacts/editor/PhotoActionPopup.java
+++ b/src/com/android/contacts/editor/PhotoActionPopup.java
@@ -101,6 +101,7 @@
listPopupWindow.setWidth(context.getResources().getDimensionPixelSize(
R.dimen.photo_action_popup_width));
listPopupWindow.setModal(true);
+ listPopupWindow.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
return listPopupWindow;
}
diff --git a/src/com/android/contacts/editor/StructuredNameEditorView.java b/src/com/android/contacts/editor/StructuredNameEditorView.java
new file mode 100644
index 0000000..5c9e04b
--- /dev/null
+++ b/src/com/android/contacts/editor/StructuredNameEditorView.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.editor;
+
+import com.android.contacts.model.AccountType.DataKind;
+import com.android.contacts.model.EntityDelta;
+import com.android.contacts.model.EntityDelta.ValuesDelta;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.net.Uri.Builder;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+
+/**
+ * A dedicated editor for structured name. When the user collapses/expands
+ * the structured name, it will reparse or recompose the name, but only
+ * if the user has made changes. This distinction will be particularly
+ * obvious if the name has a non-standard structure. Consider this structure:
+ * first name="John Doe", family name="". As long as the user does not change
+ * the full name, expand and collapse will preserve this. However, if the user
+ * changes "John Doe" to "Jane Doe" and then expands the view, we will reparse
+ * and show first name="Jane", family name="Doe".
+ */
+public class StructuredNameEditorView extends TextFieldsEditorView {
+
+ private ContentValues mSnapshot;
+ private boolean mChanged;
+
+ public StructuredNameEditorView(Context context) {
+ super(context);
+ }
+
+ public StructuredNameEditorView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public StructuredNameEditorView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ public void setValues(DataKind kind, ValuesDelta entry, EntityDelta state, boolean readOnly,
+ ViewIdGenerator vig) {
+ super.setValues(kind, entry, state, readOnly, vig);
+ if (mSnapshot == null) {
+ mSnapshot = new ContentValues(getValues().getCompleteValues());
+ mChanged = entry.isInsert();
+ } else {
+ mChanged = false;
+ }
+ }
+
+ @Override
+ public void onFieldChanged(String column, String value) {
+ if (!isFieldChanged(column, value)) {
+ return;
+ }
+
+ mChanged = true;
+
+ if (hasShortAndLongForms()) {
+ if (areOptionalFieldsVisible()) {
+ eraseFullName(getValues());
+ } else {
+ eraseStructuredName(getValues());
+ }
+ }
+
+ super.onFieldChanged(column, value);
+ }
+
+ @Override
+ protected void onOptionalFieldVisibilityChange() {
+ if (hasShortAndLongForms()) {
+ if (areOptionalFieldsVisible()) {
+ switchFromFullNameToStructuredName();
+ } else {
+ switchFromStructuredNameToFullName();
+ }
+ }
+
+ super.onOptionalFieldVisibilityChange();
+ }
+
+ private void switchFromFullNameToStructuredName() {
+ ValuesDelta values = getValues();
+
+ if (!mChanged) {
+ values.put(StructuredName.PREFIX,
+ mSnapshot.getAsString(StructuredName.PREFIX));
+ values.put(StructuredName.GIVEN_NAME,
+ mSnapshot.getAsString(StructuredName.GIVEN_NAME));
+ values.put(StructuredName.MIDDLE_NAME,
+ mSnapshot.getAsString(StructuredName.MIDDLE_NAME));
+ values.put(StructuredName.FAMILY_NAME,
+ mSnapshot.getAsString(StructuredName.FAMILY_NAME));
+ values.put(StructuredName.SUFFIX,
+ mSnapshot.getAsString(StructuredName.SUFFIX));
+ return;
+ }
+
+ String displayName = values.getAsString(StructuredName.DISPLAY_NAME);
+ Builder builder = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name");
+ appendQueryParameter(builder, StructuredName.DISPLAY_NAME, displayName);
+ Cursor cursor = getContext().getContentResolver().query(builder.build(), new String[]{
+ StructuredName.PREFIX,
+ StructuredName.GIVEN_NAME,
+ StructuredName.MIDDLE_NAME,
+ StructuredName.FAMILY_NAME,
+ StructuredName.SUFFIX,
+ }, null, null, null);
+
+ try {
+ if (cursor.moveToFirst()) {
+ eraseFullName(values);
+ values.put(StructuredName.PREFIX, cursor.getString(0));
+ values.put(StructuredName.GIVEN_NAME, cursor.getString(1));
+ values.put(StructuredName.MIDDLE_NAME, cursor.getString(2));
+ values.put(StructuredName.FAMILY_NAME, cursor.getString(3));
+ values.put(StructuredName.SUFFIX, cursor.getString(4));
+ }
+ } finally {
+ cursor.close();
+ }
+
+ mSnapshot.clear();
+ mSnapshot.putAll(values.getCompleteValues());
+ mSnapshot.put(StructuredName.DISPLAY_NAME, displayName);
+ }
+
+ private void switchFromStructuredNameToFullName() {
+ ValuesDelta values = getValues();
+
+ if (!mChanged) {
+ values.put(StructuredName.DISPLAY_NAME,
+ mSnapshot.getAsString(StructuredName.DISPLAY_NAME));
+ return;
+ }
+
+ String prefix = values.getAsString(StructuredName.PREFIX);
+ String givenName = values.getAsString(StructuredName.GIVEN_NAME);
+ String middleName = values.getAsString(StructuredName.MIDDLE_NAME);
+ String familyName = values.getAsString(StructuredName.FAMILY_NAME);
+ String suffix = values.getAsString(StructuredName.SUFFIX);
+
+ Uri.Builder builder = ContactsContract.AUTHORITY_URI.buildUpon().appendPath(
+ "complete_name");
+ appendQueryParameter(builder, StructuredName.PREFIX, prefix);
+ appendQueryParameter(builder, StructuredName.GIVEN_NAME, givenName);
+ appendQueryParameter(builder, StructuredName.MIDDLE_NAME, middleName);
+ appendQueryParameter(builder, StructuredName.FAMILY_NAME, familyName);
+ appendQueryParameter(builder, StructuredName.SUFFIX, suffix);
+ Cursor cursor = getContext().getContentResolver().query(builder.build(), new String[]{
+ StructuredName.DISPLAY_NAME,
+ }, null, null, null);
+
+ try {
+ if (cursor.moveToFirst()) {
+ eraseStructuredName(values);
+ values.put(StructuredName.DISPLAY_NAME, cursor.getString(0));
+ }
+ } finally {
+ cursor.close();
+ }
+
+ mSnapshot.clear();
+ mSnapshot.put(StructuredName.DISPLAY_NAME, values.getAsString(StructuredName.DISPLAY_NAME));
+ mSnapshot.put(StructuredName.PREFIX, prefix);
+ mSnapshot.put(StructuredName.GIVEN_NAME, givenName);
+ mSnapshot.put(StructuredName.MIDDLE_NAME, middleName);
+ mSnapshot.put(StructuredName.FAMILY_NAME, familyName);
+ mSnapshot.put(StructuredName.SUFFIX, suffix);
+ }
+
+ private void eraseFullName(ValuesDelta values) {
+ values.putNull(StructuredName.DISPLAY_NAME);
+ }
+
+ private void eraseStructuredName(ValuesDelta values) {
+ values.putNull(StructuredName.PREFIX);
+ values.putNull(StructuredName.GIVEN_NAME);
+ values.putNull(StructuredName.MIDDLE_NAME);
+ values.putNull(StructuredName.FAMILY_NAME);
+ values.putNull(StructuredName.SUFFIX);
+ }
+
+ private void appendQueryParameter(Uri.Builder builder, String field, String value) {
+ if (!TextUtils.isEmpty(value)) {
+ builder.appendQueryParameter(field, value);
+ }
+ }
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ SavedState state = new SavedState(super.onSaveInstanceState());
+ state.mChanged = mChanged;
+ state.mSnapshot = mSnapshot;
+ return state;
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ SavedState ss = (SavedState) state;
+ super.onRestoreInstanceState(ss.getSuperState());
+
+ mChanged = ss.mChanged;
+ mSnapshot = ss.mSnapshot;
+ }
+
+ private static class SavedState extends BaseSavedState {
+ public boolean mChanged;
+ public ContentValues mSnapshot;
+
+ SavedState(Parcelable superState) {
+ super(superState);
+ }
+
+ private SavedState(Parcel in) {
+ super(in);
+ mChanged = in.readInt() != 0;
+ mSnapshot = in.readParcelable(SavedState.class.getClassLoader());
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeInt(mChanged ? 1 : 0);
+ out.writeParcelable(mSnapshot, 0);
+ }
+
+ @SuppressWarnings({"unused", "hiding" })
+ public static final Parcelable.Creator<SavedState> CREATOR
+ = new Parcelable.Creator<SavedState>() {
+ @Override
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+
+ @Override
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+ }
+}
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index bc78e87..08f8d00 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -50,6 +50,7 @@
private static final String KEY_ACTIVE = "active";
private static final String KEY_CONTACT_URI = "contactUri";
+ private static final String KEY_FINISH_WHEN_DONE = "finishWhenDone";
public static final String ARG_CONTACT_URI = "contactUri";
private static final String[] ENTITY_PROJECTION = new String[] {
@@ -66,6 +67,7 @@
private boolean mActive;
private Uri mContactUri;
+ private boolean mFinishActivityWhenDone;
private Context mContext;
private AlertDialog mDialog;
@@ -73,16 +75,23 @@
// Visible for testing
int mMessageId;
- public static ContactDeletionInteraction start(Activity activity, Uri contactUri) {
+ public static ContactDeletionInteraction start(
+ Activity activity, Uri contactUri, boolean finishActivityWhenDone) {
+ if (contactUri == null) {
+ return null;
+ }
+
FragmentManager fragmentManager = activity.getFragmentManager();
ContactDeletionInteraction fragment =
(ContactDeletionInteraction) fragmentManager.findFragmentByTag(FRAGMENT_TAG);
if (fragment == null) {
fragment = new ContactDeletionInteraction();
fragment.setContactUri(contactUri);
+ fragment.setFinishActivityWhenDone(finishActivityWhenDone);
fragmentManager.beginTransaction().add(fragment, FRAGMENT_TAG).commit();
} else {
fragment.setContactUri(contactUri);
+ fragment.setFinishActivityWhenDone(finishActivityWhenDone);
}
return fragment;
}
@@ -93,6 +102,16 @@
mContext = activity;
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ if (mDialog != null && mDialog.isShowing()) {
+ mDialog.setOnDismissListener(null);
+ mDialog.dismiss();
+ mDialog = null;
+ }
+ }
+
public void setContactUri(Uri contactUri) {
mContactUri = contactUri;
mActive = true;
@@ -103,6 +122,11 @@
}
}
+ private void setFinishActivityWhenDone(boolean finishActivityWhenDone) {
+ this.mFinishActivityWhenDone = finishActivityWhenDone;
+
+ }
+
/* Visible for testing */
boolean isStarted() {
return isAdded();
@@ -119,6 +143,14 @@
}
@Override
+ public void onStop() {
+ super.onStop();
+ if (mDialog != null) {
+ mDialog.hide();
+ }
+ }
+
+ @Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri contactUri = args.getParcelable(ARG_CONTACT_URI);
return new CursorLoader(mContext,
@@ -211,6 +243,7 @@
super.onSaveInstanceState(outState);
outState.putBoolean(KEY_ACTIVE, mActive);
outState.putParcelable(KEY_CONTACT_URI, mContactUri);
+ outState.putBoolean(KEY_FINISH_WHEN_DONE, mFinishActivityWhenDone);
}
@Override
@@ -219,10 +252,14 @@
if (savedInstanceState != null) {
mActive = savedInstanceState.getBoolean(KEY_ACTIVE);
mContactUri = savedInstanceState.getParcelable(KEY_CONTACT_URI);
+ mFinishActivityWhenDone = savedInstanceState.getBoolean(KEY_FINISH_WHEN_DONE);
}
}
protected void doDeleteContact(Uri contactUri) {
mContext.startService(ContactSaveService.createDeleteContactIntent(mContext, contactUri));
+ if (isAdded() && mFinishActivityWhenDone) {
+ getActivity().finish();
+ }
}
}
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 9b99639..be920db 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -520,12 +520,18 @@
protected void selectDefaultContact() {
Uri contactUri = null;
+ ContactListAdapter adapter = getAdapter();
if (mLastSelectedPosition != -1) {
- contactUri = getAdapter().getContactUri(mLastSelectedPosition);
+ int count = adapter.getCount();
+ int pos = mLastSelectedPosition;
+ if (pos >= count && count > 0) {
+ pos = count - 1;
+ }
+ contactUri = adapter.getContactUri(pos);
}
if (contactUri == null) {
- contactUri = getAdapter().getFirstContactUri();
+ contactUri = adapter.getFirstContactUri();
}
setSelectedContactUri(contactUri, false, mSmoothScrollRequested, false, false);
diff --git a/src/com/android/contacts/list/ContactEntryListAdapter.java b/src/com/android/contacts/list/ContactEntryListAdapter.java
index 44e09b0..a2b264b 100644
--- a/src/com/android/contacts/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/list/ContactEntryListAdapter.java
@@ -15,6 +15,7 @@
*/
package com.android.contacts.list;
+import com.android.contacts.ContactPhotoManager;
import com.android.contacts.R;
import com.android.contacts.widget.IndexerListAdapter;
import com.android.contacts.widget.TextWithHighlightingFactory;
@@ -61,7 +62,7 @@
private boolean mDisplayPhotos;
private boolean mQuickContactEnabled;
- private ContactPhotoLoader mPhotoLoader;
+ private ContactPhotoManager mPhotoLoader;
private String mQueryString;
private char[] mUpperCaseQueryString;
@@ -225,11 +226,11 @@
return mTextWithHighlightingFactory;
}
- public void setPhotoLoader(ContactPhotoLoader photoLoader) {
+ public void setPhotoLoader(ContactPhotoManager photoLoader) {
mPhotoLoader = photoLoader;
}
- protected ContactPhotoLoader getPhotoLoader() {
+ protected ContactPhotoManager getPhotoLoader() {
return mPhotoLoader;
}
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 70eb0db..c85f582 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -18,6 +18,7 @@
import com.android.common.widget.CompositeCursorAdapter.Partition;
import com.android.contacts.ContactListEmptyView;
+import com.android.contacts.ContactPhotoManager;
import com.android.contacts.ContactsSearchManager;
import com.android.contacts.R;
import com.android.contacts.preference.ContactsPreferences;
@@ -124,7 +125,7 @@
private int mDirectoryResultLimit = DEFAULT_DIRECTORY_RESULT_LIMIT;
private ContextMenuAdapter mContextMenuAdapter;
- private ContactPhotoLoader mPhotoLoader;
+ private ContactPhotoManager mPhotoManager;
private ContactListEmptyView mEmptyView;
private ProviderStatusLoader mProviderStatusLoader;
private ContactsPreferences mContactsPrefs;
@@ -544,6 +545,7 @@
if (mVerticalScrollbarPosition == View.SCROLLBAR_POSITION_LEFT) {
leftPadding = mContext.getResources().getDimensionPixelOffset(
R.dimen.list_visible_scrollbar_padding);
+ mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
} else if (hasScrollbar){
rightPadding = mContext.getResources().getDimensionPixelOffset(
R.dimen.list_visible_scrollbar_padding);
@@ -711,7 +713,7 @@
boolean searchMode = isSearchMode();
mAdapter.setSearchMode(searchMode);
mAdapter.configureDefaultPartition(false, searchMode);
- mAdapter.setPhotoLoader(mPhotoLoader);
+ mAdapter.setPhotoLoader(mPhotoManager);
mListView.setAdapter(mAdapter);
if (!isSearchMode()) {
@@ -762,14 +764,14 @@
protected void configurePhotoLoader() {
if (isPhotoLoaderEnabled() && mContext != null) {
- if (mPhotoLoader == null) {
- mPhotoLoader = new ContactPhotoLoader(mContext, R.drawable.ic_contact_picture);
+ if (mPhotoManager == null) {
+ mPhotoManager = ContactPhotoManager.getInstance(mContext);
}
if (mListView != null) {
mListView.setOnScrollListener(this);
}
if (mAdapter != null) {
- mAdapter.setPhotoLoader(mPhotoLoader);
+ mAdapter.setPhotoLoader(mPhotoManager);
}
}
}
@@ -813,29 +815,12 @@
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == OnScrollListener.SCROLL_STATE_FLING) {
- mPhotoLoader.pause();
+ mPhotoManager.pause();
} else if (isPhotoLoaderEnabled()) {
- mPhotoLoader.resume();
+ mPhotoManager.resume();
}
}
- @Override
- public void onResume() {
- super.onResume();
-
- if (isPhotoLoaderEnabled()) {
- mPhotoLoader.resume();
- }
- }
-
- @Override
- public void onDestroy() {
- if (isPhotoLoaderEnabled()) {
- mPhotoLoader.stop();
- }
- super.onDestroy();
- }
-
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
hideSoftKeyboard();
diff --git a/src/com/android/contacts/list/ContactListAdapter.java b/src/com/android/contacts/list/ContactListAdapter.java
index a6db641..cfacc85 100644
--- a/src/com/android/contacts/list/ContactListAdapter.java
+++ b/src/com/android/contacts/list/ContactListAdapter.java
@@ -79,9 +79,7 @@
Contacts.LOOKUP_KEY, // 9
Contacts.PHONETIC_NAME, // 10
Contacts.HAS_PHONE_NUMBER, // 11
- SearchSnippetColumns.SNIPPET_MIMETYPE, // 12
- SearchSnippetColumns.SNIPPET_DATA1, // 13
- SearchSnippetColumns.SNIPPET_DATA4, // 14
+ SearchSnippetColumns.SNIPPET, // 12
};
protected static final int CONTACT_ID_COLUMN_INDEX = 0;
@@ -96,9 +94,7 @@
protected static final int CONTACT_LOOKUP_KEY_COLUMN_INDEX = 9;
protected static final int CONTACT_PHONETIC_NAME_COLUMN_INDEX = 10;
protected static final int CONTACT_HAS_PHONE_COLUMN_INDEX = 11;
- protected static final int CONTACT_SNIPPET_MIMETYPE_COLUMN_INDEX = 12;
- protected static final int CONTACT_SNIPPET_DATA1_COLUMN_INDEX = 13;
- protected static final int CONTACT_SNIPPET_DATA4_COLUMN_INDEX = 14;
+ protected static final int CONTACT_SNIPPET_COLUMN_INDEX = 12;
private CharSequence mUnknownNameText;
private int mDisplayNameColumnIndex;
@@ -289,8 +285,7 @@
}
protected void bindSearchSnippet(final ContactListItemView view, Cursor cursor) {
- view.showSnippet(cursor, CONTACT_SNIPPET_MIMETYPE_COLUMN_INDEX,
- CONTACT_SNIPPET_DATA1_COLUMN_INDEX, CONTACT_SNIPPET_DATA4_COLUMN_INDEX);
+ view.showSnippet(cursor, CONTACT_SNIPPET_COLUMN_INDEX);
}
public int getSelectedContactPosition() {
diff --git a/src/com/android/contacts/list/ContactListItemView.java b/src/com/android/contacts/list/ContactListItemView.java
index c943534..fe5f8e2 100644
--- a/src/com/android/contacts/list/ContactListItemView.java
+++ b/src/com/android/contacts/list/ContactListItemView.java
@@ -30,10 +30,6 @@
import android.graphics.Rect;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.Nickname;
-import android.provider.ContactsContract.CommonDataKinds.Organization;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
import android.text.SpannableString;
import android.text.TextUtils;
@@ -863,36 +859,43 @@
/**
* Shows search snippet.
*/
- public void showSnippet(Cursor cursor, int summarySnippetMimetypeColumnIndex,
- int summarySnippetData1ColumnIndex, int summarySnippetData4ColumnIndex) {
- if (cursor.getColumnCount() <= summarySnippetMimetypeColumnIndex) {
+ public void showSnippet(Cursor cursor, int summarySnippetColumnIndex) {
+ if (cursor.getColumnCount() <= summarySnippetColumnIndex) {
setSnippet(null);
return;
}
- String snippet = null;
- String snippetMimeType = cursor.getString(summarySnippetMimetypeColumnIndex);
- if (Email.CONTENT_ITEM_TYPE.equals(snippetMimeType)
- || Nickname.CONTENT_ITEM_TYPE.equals(snippetMimeType)
- || Phone.CONTENT_ITEM_TYPE.equals(snippetMimeType)) {
- String value = cursor.getString(summarySnippetData1ColumnIndex);
- if (!TextUtils.isEmpty(value)) {
- snippet = value;
- }
- } else if (Organization.CONTENT_ITEM_TYPE.equals(snippetMimeType)) {
- String company = cursor.getString(summarySnippetData1ColumnIndex);
- String title = cursor.getString(summarySnippetData4ColumnIndex);
- if (!TextUtils.isEmpty(company)) {
- if (!TextUtils.isEmpty(title)) {
- snippet = company + " / " + title;
- } else {
- snippet = company;
+ String snippet = cursor.getString(summarySnippetColumnIndex);
+ if (snippet != null) {
+ int from = 0;
+ int to = snippet.length();
+ int start = snippet.indexOf(DefaultContactListAdapter.SNIPPET_START_MATCH);
+ if (start == -1) {
+ snippet = null;
+ } else {
+ int firstNl = snippet.lastIndexOf('\n', start);
+ if (firstNl != -1) {
+ from = firstNl + 1;
}
- } else if (!TextUtils.isEmpty(title)) {
- snippet = title;
+ int end = snippet.lastIndexOf(DefaultContactListAdapter.SNIPPET_END_MATCH);
+ if (end != -1) {
+ int lastNl = snippet.indexOf('\n', end);
+ if (lastNl != -1) {
+ to = lastNl;
+ }
+ }
+
+ StringBuilder sb = new StringBuilder();
+ for (int i = from; i < to; i++) {
+ char c = snippet.charAt(i);
+ if (c != DefaultContactListAdapter.SNIPPET_START_MATCH &&
+ c != DefaultContactListAdapter.SNIPPET_END_MATCH) {
+ sb.append(c);
+ }
+ }
+ snippet = sb.toString();
}
}
-
setSnippet(snippet);
}
diff --git a/src/com/android/contacts/list/ContactPhotoLoader.java b/src/com/android/contacts/list/ContactPhotoLoader.java
deleted file mode 100644
index a6f40b6..0000000
--- a/src/com/android/contacts/list/ContactPhotoLoader.java
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.list;
-
-import com.google.android.collect.Lists;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Handler.Callback;
-import android.os.HandlerThread;
-import android.os.Message;
-import android.provider.ContactsContract.Contacts.Photo;
-import android.provider.ContactsContract.Data;
-import android.util.Log;
-import android.widget.ImageView;
-
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.lang.ref.SoftReference;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Asynchronously loads contact photos and maintains cache of photos. The class is
- * mostly single-threaded. The only two methods accessed by the loader thread are
- * {@link #cacheBitmap} and {@link #obtainPhotoIdsAndUrisToLoad}. Those methods access concurrent
- * hash maps shared with the main thread.
- */
-public class ContactPhotoLoader implements Callback {
- private static final String TAG = "ContactPhotoLoader";
- private static final String LOADER_THREAD_NAME = "ContactPhotoLoader";
-
- /**
- * Type of message sent by the UI thread to itself to indicate that some photos
- * need to be loaded.
- */
- private static final int MESSAGE_REQUEST_LOADING = 1;
-
- /**
- * Type of message sent by the loader thread to indicate that some photos have
- * been loaded.
- */
- private static final int MESSAGE_PHOTOS_LOADED = 2;
-
- private static final String[] EMPTY_STRING_ARRAY = new String[0];
-
- private final String[] COLUMNS = new String[] { Photo._ID, Photo.PHOTO };
-
- /**
- * The resource ID of the image to be used when the photo is unavailable or being
- * loaded.
- */
- private final int mDefaultResourceId;
-
- /**
- * Maintains the state of a particular photo.
- */
- private static class BitmapHolder {
- private static final int NEEDED = 0;
- private static final int LOADING = 1;
- private static final int LOADED = 2;
- private static final int LOADED_NEEDS_RELOAD = 3;
-
- int state;
- Bitmap bitmap;
- SoftReference<Bitmap> bitmapRef;
- }
-
- /**
- * A soft cache for photos.
- */
- private final ConcurrentHashMap<Object, BitmapHolder> mBitmapCache =
- new ConcurrentHashMap<Object, BitmapHolder>();
-
- /**
- * A map from ImageView to the corresponding photo ID. Please note that this
- * photo ID may change before the photo loading request is started.
- */
- private final ConcurrentHashMap<ImageView, Object> mPendingRequests =
- new ConcurrentHashMap<ImageView, Object>();
-
- /**
- * Handler for messages sent to the UI thread.
- */
- private final Handler mMainThreadHandler = new Handler(this);
-
- /**
- * Thread responsible for loading photos from the database. Created upon
- * the first request.
- */
- private LoaderThread mLoaderThread;
-
- /**
- * A gate to make sure we only send one instance of MESSAGE_PHOTOS_NEEDED at a time.
- */
- private boolean mLoadingRequested;
-
- /**
- * Flag indicating if the image loading is paused.
- */
- private boolean mPaused;
-
- private final Context mContext;
-
- /**
- * Constructor.
- *
- * @param context content context
- * @param defaultResourceId the image resource ID to be used when there is
- * no photo for a contact
- */
- public ContactPhotoLoader(Context context, int defaultResourceId) {
- mDefaultResourceId = defaultResourceId;
- mContext = context;
- }
-
- /**
- * Load photo into the supplied image view. If the photo is already cached,
- * it is displayed immediately. Otherwise a request is sent to load the photo
- * from the database.
- */
- public void loadPhoto(ImageView view, long photoId) {
- if (photoId == 0) {
- // No photo is needed
- view.setImageResource(mDefaultResourceId);
- mPendingRequests.remove(view);
- } else {
- loadPhotoByIdOrUri(view, photoId);
- }
- }
-
- /**
- * Load photo into the supplied image view. If the photo is already cached,
- * it is displayed immediately. Otherwise a request is sent to load the photo
- * from the location specified by the URI.
- */
- public void loadPhoto(ImageView view, Uri photoUri) {
- if (photoUri == null) {
- // No photo is needed
- view.setImageResource(mDefaultResourceId);
- mPendingRequests.remove(view);
- } else {
- loadPhotoByIdOrUri(view, photoUri);
- }
- }
-
- private void loadPhotoByIdOrUri(ImageView view, Object key) {
- boolean loaded = loadCachedPhoto(view, key);
- if (loaded) {
- mPendingRequests.remove(view);
- } else {
- mPendingRequests.put(view, key);
- if (!mPaused) {
- // Send a request to start loading photos
- requestLoading();
- }
- }
- }
-
- /**
- * Mark all cached photos for reloading. We can continue using cache but should
- * also make sure the photos haven't changed in the background and notify the views
- * if so.
- */
- public void refreshCache() {
- for (BitmapHolder holder : mBitmapCache.values()) {
- if (holder.state == BitmapHolder.LOADED) {
- holder.state = BitmapHolder.LOADED_NEEDS_RELOAD;
- }
- }
- }
-
- /**
- * Checks if the photo is present in cache. If so, sets the photo on the view,
- * otherwise sets the state of the photo to {@link BitmapHolder#NEEDED} and
- * temporarily set the image to the default resource ID.
- */
- private boolean loadCachedPhoto(ImageView view, Object key) {
- BitmapHolder holder = mBitmapCache.get(key);
- if (holder == null) {
- holder = new BitmapHolder();
- mBitmapCache.put(key, holder);
- } else {
- boolean loaded = (holder.state == BitmapHolder.LOADED);
- boolean loadedNeedsReload = (holder.state == BitmapHolder.LOADED_NEEDS_RELOAD);
- if (loadedNeedsReload) {
- holder.state = BitmapHolder.NEEDED;
- }
-
- // Null bitmap reference means that database contains no bytes for the photo
- if ((loaded || loadedNeedsReload) && holder.bitmapRef == null) {
- view.setImageResource(mDefaultResourceId);
- return loaded;
- }
-
- if (holder.bitmapRef != null) {
- Bitmap bitmap = holder.bitmapRef.get();
- if (bitmap != null) {
- view.setImageBitmap(bitmap);
- return loaded;
- }
-
- // Null bitmap means that the soft reference was released by the GC
- // and we need to reload the photo.
- holder.bitmapRef = null;
- }
- }
-
- // The bitmap has not been loaded - should display the placeholder image.
- view.setImageResource(mDefaultResourceId);
- holder.state = BitmapHolder.NEEDED;
- return false;
- }
-
- /**
- * Stops loading images, kills the image loader thread and clears all caches.
- */
- public void stop() {
- pause();
-
- if (mLoaderThread != null) {
- mLoaderThread.quit();
- mLoaderThread = null;
- }
-
- mPendingRequests.clear();
- mBitmapCache.clear();
- }
-
- public void clear() {
- mPendingRequests.clear();
- mBitmapCache.clear();
- }
-
- /**
- * Temporarily stops loading photos from the database.
- */
- public void pause() {
- mPaused = true;
- }
-
- /**
- * Resumes loading photos from the database.
- */
- public void resume() {
- mPaused = false;
- if (!mPendingRequests.isEmpty()) {
- requestLoading();
- }
- }
-
- /**
- * Sends a message to this thread itself to start loading images. If the current
- * view contains multiple image views, all of those image views will get a chance
- * to request their respective photos before any of those requests are executed.
- * This allows us to load images in bulk.
- */
- private void requestLoading() {
- if (!mLoadingRequested) {
- mLoadingRequested = true;
- mMainThreadHandler.sendEmptyMessage(MESSAGE_REQUEST_LOADING);
- }
- }
-
- /**
- * Processes requests on the main thread.
- */
- public boolean handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_REQUEST_LOADING: {
- mLoadingRequested = false;
- if (!mPaused) {
- if (mLoaderThread == null) {
- mLoaderThread = new LoaderThread(mContext.getContentResolver());
- mLoaderThread.start();
- }
-
- mLoaderThread.requestLoading();
- }
- return true;
- }
-
- case MESSAGE_PHOTOS_LOADED: {
- if (!mPaused) {
- processLoadedImages();
- }
- return true;
- }
- }
- return false;
- }
-
- /**
- * Goes over pending loading requests and displays loaded photos. If some of the
- * photos still haven't been loaded, sends another request for image loading.
- */
- private void processLoadedImages() {
- Iterator<ImageView> iterator = mPendingRequests.keySet().iterator();
- while (iterator.hasNext()) {
- ImageView view = iterator.next();
- Object key = mPendingRequests.get(view);
- boolean loaded = loadCachedPhoto(view, key);
- if (loaded) {
- iterator.remove();
- }
- }
-
- softenCache();
-
- if (!mPendingRequests.isEmpty()) {
- requestLoading();
- }
- }
-
- /**
- * Removes strong references to loaded bitmaps to allow them to be garbage collected
- * if needed.
- */
- private void softenCache() {
- for (BitmapHolder holder : mBitmapCache.values()) {
- holder.bitmap = null;
- }
- }
-
- /**
- * Stores the supplied bitmap in cache.
- */
- private void cacheBitmap(Object key, byte[] bytes) {
- if (mPaused) {
- return;
- }
-
- BitmapHolder holder = new BitmapHolder();
- holder.state = BitmapHolder.LOADED;
- if (bytes != null) {
- try {
- Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null);
- holder.bitmap = bitmap;
- holder.bitmapRef = new SoftReference<Bitmap>(bitmap);
- } catch (OutOfMemoryError e) {
- // Do nothing - the photo will appear to be missing
- }
- }
- mBitmapCache.put(key, holder);
- }
-
- /**
- * Populates an array of photo IDs that need to be loaded.
- */
- private void obtainPhotoIdsAndUrisToLoad(ArrayList<Long> photoIds,
- ArrayList<String> photoIdsAsStrings, ArrayList<Uri> uris) {
- photoIds.clear();
- photoIdsAsStrings.clear();
- uris.clear();
-
- /*
- * Since the call is made from the loader thread, the map could be
- * changing during the iteration. That's not really a problem:
- * ConcurrentHashMap will allow those changes to happen without throwing
- * exceptions. Since we may miss some requests in the situation of
- * concurrent change, we will need to check the map again once loading
- * is complete.
- */
- Iterator<Object> iterator = mPendingRequests.values().iterator();
- while (iterator.hasNext()) {
- Object key = iterator.next();
- BitmapHolder holder = mBitmapCache.get(key);
- if (holder != null && holder.state == BitmapHolder.NEEDED) {
- // Assuming atomic behavior
- holder.state = BitmapHolder.LOADING;
- if (key instanceof Long) {
- photoIds.add((Long)key);
- photoIdsAsStrings.add(key.toString());
- } else {
- uris.add((Uri)key);
- }
- }
- }
- }
-
- /**
- * The thread that performs loading of photos from the database.
- */
- private class LoaderThread extends HandlerThread implements Callback {
- private static final int BUFFER_SIZE = 1024*16;
-
- private final ContentResolver mResolver;
- private final StringBuilder mStringBuilder = new StringBuilder();
- private final ArrayList<Long> mPhotoIds = Lists.newArrayList();
- private final ArrayList<String> mPhotoIdsAsStrings = Lists.newArrayList();
- private final ArrayList<Uri> mPhotoUris = Lists.newArrayList();
- private Handler mLoaderThreadHandler;
- private byte mBuffer[];
-
- public LoaderThread(ContentResolver resolver) {
- super(LOADER_THREAD_NAME);
- mResolver = resolver;
- }
-
- /**
- * Sends a message to this thread to load requested photos.
- */
- public void requestLoading() {
- if (mLoaderThreadHandler == null) {
- mLoaderThreadHandler = new Handler(getLooper(), this);
- }
- mLoaderThreadHandler.sendEmptyMessage(0);
- }
-
- /**
- * Receives the above message, loads photos and then sends a message
- * to the main thread to process them.
- */
- public boolean handleMessage(Message msg) {
- loadPhotosFromDatabase();
- return true;
- }
-
- private void loadPhotosFromDatabase() {
- obtainPhotoIdsAndUrisToLoad(mPhotoIds, mPhotoIdsAsStrings, mPhotoUris);
-
- int count = mPhotoIds.size();
- if (count != 0) {
- mStringBuilder.setLength(0);
- mStringBuilder.append(Photo._ID + " IN(");
- for (int i = 0; i < count; i++) {
- if (i != 0) {
- mStringBuilder.append(',');
- }
- mStringBuilder.append('?');
- }
- mStringBuilder.append(')');
-
- Cursor cursor = null;
- try {
- cursor = mResolver.query(Data.CONTENT_URI,
- COLUMNS,
- mStringBuilder.toString(),
- mPhotoIdsAsStrings.toArray(EMPTY_STRING_ARRAY),
- null);
-
- if (cursor != null) {
- while (cursor.moveToNext()) {
- Long id = cursor.getLong(0);
- byte[] bytes = cursor.getBlob(1);
- cacheBitmap(id, bytes);
- mPhotoIds.remove(id);
- }
- }
- } finally {
- if (cursor != null) {
- cursor.close();
- }
- }
-
- // Remaining photos were not found in the database - mark the cache accordingly.
- count = mPhotoIds.size();
- for (int i = 0; i < count; i++) {
- cacheBitmap(mPhotoIds.get(i), null);
- }
- mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
- }
-
- count = mPhotoUris.size();
- for (int i = 0; i < count; i++) {
- Uri uri = mPhotoUris.get(i);
- if (mBuffer == null) {
- mBuffer = new byte[BUFFER_SIZE];
- }
- try {
- InputStream is = mResolver.openInputStream(uri);
- if (is != null) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try {
- int size;
- while ((size = is.read(mBuffer)) != -1) {
- baos.write(mBuffer, 0, size);
- }
- } finally {
- is.close();
- }
- cacheBitmap(uri, baos.toByteArray());
- mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
- } else {
- Log.v(TAG, "Cannot load photo " + uri);
- cacheBitmap(uri, null);
- }
- } catch (Exception ex) {
- Log.v(TAG, "Cannot load photo " + uri, ex);
- cacheBitmap(uri, null);
- }
- }
- }
- }
-}
diff --git a/src/com/android/contacts/list/CustomContactListFilterActivity.java b/src/com/android/contacts/list/CustomContactListFilterActivity.java
index 0f3fafd..dae7233 100644
--- a/src/com/android/contacts/list/CustomContactListFilterActivity.java
+++ b/src/com/android/contacts/list/CustomContactListFilterActivity.java
@@ -26,6 +26,7 @@
import com.android.contacts.preference.ContactsPreferences;
import com.android.contacts.util.EmptyService;
import com.android.contacts.util.LocalizedNameResolver;
+import com.android.contacts.util.PhoneCapabilityTester;
import com.android.contacts.util.WeakAsyncTask;
import com.google.android.collect.Lists;
@@ -113,8 +114,10 @@
createWithPhonesOnlyPreferenceView(inflater);
createDisplayGroupHeader(inflater);
- mList.addHeaderView(mHeaderPhones, null, true);
- mList.addHeaderView(mHeaderSeparator, null, false);
+ if (mHeaderPhones != null) {
+ mList.addHeaderView(mHeaderPhones, null, true);
+ mList.addHeaderView(mHeaderSeparator, null, false);
+ }
findViewById(R.id.btn_done).setOnClickListener(this);
findViewById(R.id.btn_discard).setOnClickListener(this);
@@ -127,12 +130,18 @@
}
private void createWithPhonesOnlyPreferenceView(LayoutInflater inflater) {
+ boolean optionSelected = mPrefs.getBoolean(ContactsPreferences.PREF_DISPLAY_ONLY_PHONES,
+ ContactsPreferences.PREF_DISPLAY_ONLY_PHONES_DEFAULT);
+
+ if (!optionSelected && !PhoneCapabilityTester.isPhone(this)) {
+ return;
+ }
+
// Add the "Only contacts with phones" header modifier.
mHeaderPhones = inflater.inflate(R.layout.contact_list_filter_phones_only, mList, false);
mHeaderPhones.setId(R.id.header_phones);
mDisplayPhones = (CheckBox) mHeaderPhones.findViewById(android.R.id.checkbox);
- mDisplayPhones.setChecked(mPrefs.getBoolean(ContactsPreferences.PREF_DISPLAY_ONLY_PHONES,
- ContactsPreferences.PREF_DISPLAY_ONLY_PHONES_DEFAULT));
+ mDisplayPhones.setChecked(optionSelected);
final TextView text1 = (TextView) mHeaderPhones.findViewById(android.R.id.text1);
text1.setText(R.string.showFilterPhones);
final TextView text2 = (TextView) mHeaderPhones.findViewById(android.R.id.text2);
@@ -871,7 +880,10 @@
return;
}
- setDisplayOnlyPhones(mDisplayPhones.isChecked());
+ if (mDisplayPhones != null) {
+ setDisplayOnlyPhones(mDisplayPhones.isChecked());
+ }
+
setResult(RESULT_OK);
final ArrayList<ContentProviderOperation> diff = mAdapter.mAccounts.buildDiff();
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index 164a2cd..3e8c6f1 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -31,6 +31,7 @@
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Directory;
import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.SearchSnippetColumns;
import android.text.TextUtils;
import android.view.View;
@@ -42,6 +43,14 @@
*/
public class DefaultContactListAdapter extends ContactListAdapter {
+ public static final char SNIPPET_START_MATCH = '\u0001';
+ public static final char SNIPPET_END_MATCH = '\u0001';
+ public static final String SNIPPET_ELLIPSIS = "\u2026";
+ public static final int SNIPPET_MAX_TOKENS = 5;
+
+ public static final String SNIPPET_ARGS = SNIPPET_START_MATCH + "," + SNIPPET_END_MATCH + ","
+ + SNIPPET_ELLIPSIS + "," + SNIPPET_MAX_TOKENS;
+
public DefaultContactListAdapter(Context context) {
super(context);
}
@@ -71,6 +80,8 @@
builder.appendQueryParameter(ContactsContract.LIMIT_PARAM_KEY,
String.valueOf(getDirectoryResultLimit()));
}
+ builder.appendQueryParameter(SearchSnippetColumns.SNIPPET_ARGS_PARAM_KEY,
+ SNIPPET_ARGS);
applyDataRestriction(builder);
loader.setUri(builder.build());
loader.setProjection(FILTER_PROJECTION);
diff --git a/src/com/android/contacts/list/ShortcutIntentBuilder.java b/src/com/android/contacts/list/ShortcutIntentBuilder.java
index 101b6d5..43a6c1e 100644
--- a/src/com/android/contacts/list/ShortcutIntentBuilder.java
+++ b/src/com/android/contacts/list/ShortcutIntentBuilder.java
@@ -75,7 +75,7 @@
private final OnShortcutIntentCreatedListener mListener;
private final Context mContext;
- private final int mIconSize;
+ private int mIconSize;
private final int mIconDensity;
/**
@@ -99,7 +99,10 @@
final ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
- mIconSize = am.getLauncherLargeIconSize();
+ mIconSize = context.getResources().getDimensionPixelSize(R.dimen.shortcut_icon_size);
+ if (mIconSize == 0) {
+ mIconSize = am.getLauncherLargeIconSize();
+ }
mIconDensity = am.getLauncherLargeIconDensity();
}
diff --git a/src/com/android/contacts/model/BaseAccountType.java b/src/com/android/contacts/model/BaseAccountType.java
index dbfeae4..70cfa55 100644
--- a/src/com/android/contacts/model/BaseAccountType.java
+++ b/src/com/android/contacts/model/BaseAccountType.java
@@ -121,12 +121,6 @@
FLAGS_PERSON_NAME).setLongForm(true));
kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
FLAGS_PERSON_NAME).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
- R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
- R.string.name_phonetic_middle, FLAGS_PHONETIC).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
- R.string.name_phonetic_given, FLAGS_PHONETIC).setLongForm(true));
} else {
kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
FLAGS_PERSON_NAME).setLongForm(true));
@@ -138,13 +132,13 @@
FLAGS_PERSON_NAME).setLongForm(true));
kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
FLAGS_PERSON_NAME).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
- R.string.name_phonetic_given, FLAGS_PHONETIC).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
- R.string.name_phonetic_middle, FLAGS_PHONETIC).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
- R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true));
}
+ kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
+ R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true));
+ kind.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
+ R.string.name_phonetic_middle, FLAGS_PHONETIC).setLongForm(true));
+ kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
+ R.string.name_phonetic_given, FLAGS_PHONETIC).setLongForm(true));
return kind;
}
diff --git a/src/com/android/contacts/model/EntityDeltaList.java b/src/com/android/contacts/model/EntityDeltaList.java
index a998a37..9b7bdc6 100644
--- a/src/com/android/contacts/model/EntityDeltaList.java
+++ b/src/com/android/contacts/model/EntityDeltaList.java
@@ -340,10 +340,18 @@
mSplitRawContacts = true;
}
+ public boolean isMarkedForSplitting() {
+ return mSplitRawContacts;
+ }
+
public void setJoinWithRawContacts(long[] rawContactIds) {
mJoinWithRawContactIds = rawContactIds;
}
+ public boolean isMarkedForJoining() {
+ return mJoinWithRawContactIds != null && mJoinWithRawContactIds.length > 0;
+ }
+
/** {@inheritDoc} */
public int describeContents() {
// Nothing special about this parcel
@@ -358,6 +366,7 @@
dest.writeParcelable(delta, flags);
}
dest.writeLongArray(mJoinWithRawContactIds);
+ dest.writeInt(mSplitRawContacts ? 1 : 0);
}
@SuppressWarnings("unchecked")
@@ -368,6 +377,7 @@
this.add(source.<EntityDelta> readParcelable(loader));
}
mJoinWithRawContactIds = source.createLongArray();
+ mSplitRawContacts = source.readInt() != 0;
}
public static final Parcelable.Creator<EntityDeltaList> CREATOR =
diff --git a/src/com/android/contacts/model/EntityModifier.java b/src/com/android/contacts/model/EntityModifier.java
index c58d813..ab19a35 100644
--- a/src/com/android/contacts/model/EntityModifier.java
+++ b/src/com/android/contacts/model/EntityModifier.java
@@ -26,13 +26,12 @@
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
+import android.net.Uri;
import android.os.Bundle;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.Intents;
-import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.BaseTypes;
import android.provider.ContactsContract.CommonDataKinds.Email;
+import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
import android.provider.ContactsContract.CommonDataKinds.Im;
import android.provider.ContactsContract.CommonDataKinds.Note;
import android.provider.ContactsContract.CommonDataKinds.Organization;
@@ -40,7 +39,10 @@
import android.provider.ContactsContract.CommonDataKinds.Photo;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.Intents;
import android.provider.ContactsContract.Intents.Insert;
+import android.provider.ContactsContract.RawContacts;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseIntArray;
@@ -344,7 +346,7 @@
}
final ValuesDelta child = ValuesDelta.fromAfter(after);
- state.addEntry(child);
+ state.addEntry(child);
return child;
}
@@ -357,11 +359,26 @@
public static void trimEmpty(EntityDeltaList set, AccountTypeManager accountTypes) {
for (EntityDelta state : set) {
final String accountType = state.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
- final AccountType source = accountTypes.getAccountType(accountType);
- trimEmpty(state, source);
+ final AccountType type = accountTypes.getAccountType(accountType);
+ trimEmpty(state, type);
}
}
+ public static boolean hasChanges(EntityDeltaList set, AccountTypeManager accountTypes) {
+ if (set.isMarkedForSplitting() || set.isMarkedForJoining()) {
+ return true;
+ }
+
+ for (EntityDelta state : set) {
+ final String accountType = state.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
+ final AccountType type = accountTypes.getAccountType(accountType);
+ if (hasChanges(state, type)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Processing to trim any empty {@link ValuesDelta} rows from the given
* {@link EntityDelta}, assuming the given {@link AccountType} dictates
@@ -406,24 +423,43 @@
}
}
+ private static boolean hasChanges(EntityDelta state, AccountType accountType) {
+ for (DataKind kind : accountType.getSortedDataKinds()) {
+ final String mimeType = kind.mimeType;
+ final ArrayList<ValuesDelta> entries = state.getMimeEntries(mimeType);
+ if (entries == null) continue;
+
+ for (ValuesDelta entry : entries) {
+ if ((entry.isInsert() || entry.isUpdate() || entry.isDelete())
+ && !isEmpty(entry, kind)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
/**
* Test if the given {@link ValuesDelta} would be considered "empty" in
* terms of {@link DataKind#fieldList}.
*/
public static boolean isEmpty(ValuesDelta values, DataKind kind) {
+ if (Photo.CONTENT_ITEM_TYPE.equals(kind.mimeType)) {
+ return values.isInsert() && values.getAsByteArray(Photo.PHOTO) == null;
+ }
+
// No defined fields mean this row is always empty
if (kind.fieldList == null) return true;
- boolean hasValues = false;
for (EditField field : kind.fieldList) {
// If any field has values, we're not empty
final String value = values.getAsString(field.column);
if (ContactsUtils.isGraphic(value)) {
- hasValues = true;
+ return false;
}
}
- return !hasValues;
+ return true;
}
/**
@@ -455,28 +491,8 @@
return;
}
- {
- // StructuredName
- EntityModifier.ensureKindExists(state, accountType, StructuredName.CONTENT_ITEM_TYPE);
- final ValuesDelta child = state.getPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE);
-
- final String name = extras.getString(Insert.NAME);
- if (ContactsUtils.isGraphic(name)) {
- child.put(StructuredName.DISPLAY_NAME, name);
- }
-
- final String phoneticName = extras.getString(Insert.PHONETIC_NAME);
- if (ContactsUtils.isGraphic(phoneticName)) {
- child.put(StructuredName.PHONETIC_GIVEN_NAME, phoneticName);
- }
- }
-
- {
- // StructuredPostal
- final DataKind kind = accountType.getKindForMimetype(StructuredPostal.CONTENT_ITEM_TYPE);
- parseExtras(state, kind, extras, Insert.POSTAL_TYPE, Insert.POSTAL,
- StructuredPostal.FORMATTED_ADDRESS);
- }
+ parseStructuredNameExtra(context, accountType, state, extras);
+ parseStructuredPostalExtra(accountType, state, extras);
{
// Phone
@@ -542,6 +558,87 @@
}
}
+ private static void parseStructuredNameExtra(
+ Context context, AccountType accountType, EntityDelta state, Bundle extras) {
+ // StructuredName
+ EntityModifier.ensureKindExists(state, accountType, StructuredName.CONTENT_ITEM_TYPE);
+ final ValuesDelta child = state.getPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE);
+
+ final String name = extras.getString(Insert.NAME);
+ if (ContactsUtils.isGraphic(name)) {
+ final DataKind kind = accountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE);
+ boolean supportsDisplayName = false;
+ if (kind.fieldList != null) {
+ for (EditField field : kind.fieldList) {
+ if (StructuredName.DISPLAY_NAME.equals(field.column)) {
+ supportsDisplayName = true;
+ break;
+ }
+ }
+ }
+
+ if (supportsDisplayName) {
+ child.put(StructuredName.DISPLAY_NAME, name);
+ } else {
+ Uri uri = ContactsContract.AUTHORITY_URI.buildUpon()
+ .appendPath("complete_name")
+ .appendQueryParameter(StructuredName.DISPLAY_NAME, name)
+ .build();
+ Cursor cursor = context.getContentResolver().query(uri,
+ new String[]{
+ StructuredName.PREFIX,
+ StructuredName.GIVEN_NAME,
+ StructuredName.MIDDLE_NAME,
+ StructuredName.FAMILY_NAME,
+ StructuredName.SUFFIX,
+ }, null, null, null);
+
+ try {
+ if (cursor.moveToFirst()) {
+ child.put(StructuredName.PREFIX, cursor.getString(0));
+ child.put(StructuredName.GIVEN_NAME, cursor.getString(1));
+ child.put(StructuredName.MIDDLE_NAME, cursor.getString(2));
+ child.put(StructuredName.FAMILY_NAME, cursor.getString(3));
+ child.put(StructuredName.SUFFIX, cursor.getString(4));
+ }
+ } finally {
+ cursor.close();
+ }
+ }
+ }
+
+ final String phoneticName = extras.getString(Insert.PHONETIC_NAME);
+ if (ContactsUtils.isGraphic(phoneticName)) {
+ child.put(StructuredName.PHONETIC_GIVEN_NAME, phoneticName);
+ }
+ }
+
+ private static void parseStructuredPostalExtra(
+ AccountType accountType, EntityDelta state, Bundle extras) {
+ // StructuredPostal
+ final DataKind kind = accountType.getKindForMimetype(StructuredPostal.CONTENT_ITEM_TYPE);
+ final ValuesDelta child = parseExtras(state, kind, extras, Insert.POSTAL_TYPE,
+ Insert.POSTAL, StructuredPostal.FORMATTED_ADDRESS);
+ String address = child == null ? null
+ : child.getAsString(StructuredPostal.FORMATTED_ADDRESS);
+ if (!TextUtils.isEmpty(address)) {
+ boolean supportsFormatted = false;
+ if (kind.fieldList != null) {
+ for (EditField field : kind.fieldList) {
+ if (StructuredPostal.FORMATTED_ADDRESS.equals(field.column)) {
+ supportsFormatted = true;
+ break;
+ }
+ }
+ }
+
+ if (!supportsFormatted) {
+ child.put(StructuredPostal.STREET, address);
+ child.putNull(StructuredPostal.FORMATTED_ADDRESS);
+ }
+ }
+ }
+
private static void parseValues(
EntityDelta state, AccountType accountType, ArrayList<ContentValues> dataValueList) {
for (ContentValues values : dataValueList) {
@@ -721,6 +818,7 @@
* Attempt to parse legacy {@link Insert#IM_PROTOCOL} values, replacing them
* with updated values.
*/
+ @SuppressWarnings("deprecation")
private static void fixupLegacyImType(Bundle bundle) {
final String encodedString = bundle.getString(Insert.IM_PROTOCOL);
if (encodedString == null) return;
@@ -748,17 +846,17 @@
* @param valueExtra {@link Bundle} key that holds the incoming value.
* @param valueColumn Column to write value into {@link ValuesDelta}.
*/
- public static void parseExtras(EntityDelta state, DataKind kind, Bundle extras,
+ public static ValuesDelta parseExtras(EntityDelta state, DataKind kind, Bundle extras,
String typeExtra, String valueExtra, String valueColumn) {
final CharSequence value = extras.getCharSequence(valueExtra);
// Bail early if account type doesn't handle this MIME type
- if (kind == null) return;
+ if (kind == null) return null;
// Bail when can't insert type, or value missing
final boolean canInsert = EntityModifier.canInsert(state, kind);
final boolean validValue = (value != null && TextUtils.isGraphic(value));
- if (!validValue || !canInsert) return;
+ if (!validValue || !canInsert) return null;
// Find exact type when requested, otherwise best available type
final boolean hasType = extras.containsKey(typeExtra);
@@ -775,5 +873,7 @@
final String customType = extras.getString(typeExtra);
child.put(editType.customColumn, customType);
}
+
+ return child;
}
}
diff --git a/src/com/android/contacts/model/ExchangeAccountType.java b/src/com/android/contacts/model/ExchangeAccountType.java
index 4442a70..9779e70 100644
--- a/src/com/android/contacts/model/ExchangeAccountType.java
+++ b/src/com/android/contacts/model/ExchangeAccountType.java
@@ -80,10 +80,6 @@
R.string.name_given, FLAGS_PERSON_NAME));
kind.fieldList.add(new EditField(StructuredName.SUFFIX,
R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
- R.string.name_phonetic_family, FLAGS_PHONETIC).setOptional(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
- R.string.name_phonetic_given, FLAGS_PHONETIC).setOptional(true));
} else {
kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
R.string.name_given, FLAGS_PERSON_NAME));
@@ -93,12 +89,13 @@
R.string.name_family, FLAGS_PERSON_NAME));
kind.fieldList.add(new EditField(StructuredName.SUFFIX,
R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
- R.string.name_phonetic_given, FLAGS_PHONETIC).setOptional(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
- R.string.name_phonetic_family, FLAGS_PHONETIC).setOptional(true));
}
+ kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
+ R.string.name_phonetic_family, FLAGS_PHONETIC).setOptional(true));
+ kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
+ R.string.name_phonetic_given, FLAGS_PHONETIC).setOptional(true));
+
return kind;
}
diff --git a/src/com/android/contacts/quickcontact/QuickContactWindow.java b/src/com/android/contacts/quickcontact/QuickContactWindow.java
index 063d446..147e364 100644
--- a/src/com/android/contacts/quickcontact/QuickContactWindow.java
+++ b/src/com/android/contacts/quickcontact/QuickContactWindow.java
@@ -32,7 +32,6 @@
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.ActivityNotFoundException;
-import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -100,6 +99,7 @@
NotifyingAsyncQueryHandler.AsyncQueryListener, View.OnClickListener,
AbsListView.OnItemClickListener, KeyEvent.Callback, OnGlobalLayoutListener,
QuickContactRootLayout.Listener {
+
private static final String TAG = "QuickContactWindow";
/**
@@ -115,6 +115,12 @@
private final static int ANIMATION_EXPAND_TIME = 100;
private final static int ANIMATION_COLLAPSE_TIME = 100;
+ /**
+ * If the anchor is wider than (quick contact width * this constant) then
+ * center quick contact. Otherwise, left-align.
+ */
+ private static final double MIN_RELATIVE_ANCHOR_WIDTH_TO_CENTER = 0.5;
+
private final Context mContext;
private final LayoutInflater mInflater;
private final WindowManager mWindowManager;
@@ -379,20 +385,7 @@
* {@link Contacts#CONTENT_LOOKUP_URI} style {@link Uri}.
*/
private Uri getDataUri(Uri lookupUri) {
- // TODO: Formalize method of extracting LOOKUP_KEY
- final List<String> path = lookupUri.getPathSegments();
- final boolean validLookup = path.size() >= 3 && "lookup".equals(path.get(1));
- if (!validLookup) {
- // We only accept valid lookup-style Uris
- throw new IllegalArgumentException("Expecting lookup-style Uri");
- } else if (path.size() == 3) {
- // No direct _ID provided, so force a lookup
- lookupUri = Contacts.lookupContact(mContext.getContentResolver(), lookupUri);
- }
-
- final long contactId = ContentUris.parseId(lookupUri);
- return Uri.withAppendedPath(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId),
- Contacts.Data.CONTENT_DIRECTORY);
+ return Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY);
}
/**
@@ -415,9 +408,13 @@
R.dimen.quick_contact_width);
layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
- // Try to left align with the anchor control
+ // Try to left align with the anchor control or center if the anchor is wide
if (mAnchor.left + layoutParams.width <= mScreenWidth) {
- layoutParams.x = mAnchor.left;
+ if (mAnchor.width() > layoutParams.width * MIN_RELATIVE_ANCHOR_WIDTH_TO_CENTER) {
+ layoutParams.x = mAnchor.left + (mAnchor.width() - layoutParams.width) / 2;
+ } else {
+ layoutParams.x = mAnchor.left;
+ }
} else {
// Not enough space. Try to right align to the anchor
if (mAnchor.right - layoutParams.width >= 0) {
@@ -637,7 +634,7 @@
* Handle the result from the {@link #TOKEN_DATA} query.
*/
private void handleData(Cursor cursor) {
- final ResolveCache cache = ResolveCache.getInstance(mContext.getPackageManager());
+ final ResolveCache cache = ResolveCache.getInstance(mContext);
if (cursor == null) return;
if (cursor.getCount() == 0) {
Toast.makeText(mContext, R.string.invalidContactMessage, Toast.LENGTH_LONG).show();
@@ -733,7 +730,17 @@
}
}
- if (mDefaultsMap.size() != 0) {
+ // Make sure that we only display the "clear default" action if there
+ // are actually several items to chose from
+ boolean shouldDisplayClearDefaults = false;
+ for (String mimetype : mDefaultsMap.keySet()) {
+ if (mActions.get(mimetype).size() > 1) {
+ shouldDisplayClearDefaults = true;
+ break;
+ }
+ }
+
+ if (shouldDisplayClearDefaults) {
final Action action = new ClearDefaultsAction();
mActions.put(action.getMimeType(), action);
}
@@ -1303,6 +1310,12 @@
/** {@inheritDoc} */
@Override
+ public boolean dispatchGenericMotionEvent(MotionEvent event) {
+ return mWindow.superDispatchGenericMotionEvent(event);
+ }
+
+ /** {@inheritDoc} */
+ @Override
public void onContentChanged() {
}
diff --git a/src/com/android/contacts/quickcontact/ResolveCache.java b/src/com/android/contacts/quickcontact/ResolveCache.java
index 5d84253..2b9e92f 100644
--- a/src/com/android/contacts/quickcontact/ResolveCache.java
+++ b/src/com/android/contacts/quickcontact/ResolveCache.java
@@ -16,14 +16,17 @@
package com.android.contacts.quickcontact;
+import com.android.contacts.util.PhoneCapabilityTester;
import com.google.android.collect.Sets;
+import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.text.TextUtils;
import java.lang.ref.SoftReference;
@@ -51,6 +54,7 @@
"com.android.phone",
"com.android.browser");
+ private final Context mContext;
private final PackageManager mPackageManager;
private static ResolveCache sInstance;
@@ -59,9 +63,9 @@
* Returns an instance of the ResolveCache. Only one internal instance is kept, so
* the argument packageManagers is ignored for all but the first call
*/
- public synchronized static ResolveCache getInstance(PackageManager packageManager) {
+ public synchronized static ResolveCache getInstance(Context context) {
if (sInstance == null) {
- return sInstance = new ResolveCache(packageManager);
+ return sInstance = new ResolveCache(context.getApplicationContext());
}
return sInstance;
}
@@ -81,8 +85,10 @@
private HashMap<String, Entry> mCache = new HashMap<String, Entry>();
- private ResolveCache(PackageManager packageManager) {
- mPackageManager = packageManager;
+
+ private ResolveCache(Context context) {
+ mContext = context;
+ mPackageManager = context.getPackageManager();
}
/**
@@ -95,7 +101,12 @@
if (entry != null) return entry;
entry = new Entry();
- final Intent intent = action.getIntent();
+ Intent intent = action.getIntent();
+ if (SipAddress.CONTENT_ITEM_TYPE.equals(mimeType)
+ && !PhoneCapabilityTester.isSipPhone(mContext)) {
+ intent = null;
+ }
+
if (intent != null) {
final List<ResolveInfo> matches = mPackageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
diff --git a/src/com/android/contacts/socialwidget/SocialWidgetConfigureActivity.java b/src/com/android/contacts/socialwidget/SocialWidgetConfigureActivity.java
index 4201cee..98812d9 100644
--- a/src/com/android/contacts/socialwidget/SocialWidgetConfigureActivity.java
+++ b/src/com/android/contacts/socialwidget/SocialWidgetConfigureActivity.java
@@ -51,7 +51,7 @@
// Update the widget
SocialWidgetProvider.loadWidgetData(
- context, AppWidgetManager.getInstance(this), widgetId);
+ context, AppWidgetManager.getInstance(this), widgetId, true);
// Return OK so that the system won't remove the widget
final Intent resultValue = new Intent();
diff --git a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
index 0330c89..92118c0 100644
--- a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
+++ b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
@@ -19,10 +19,12 @@
import com.android.contacts.ContactLoader;
import com.android.contacts.R;
import com.android.contacts.util.ContactBadgeUtil;
+import com.android.contacts.util.DataStatus;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
+import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.Loader;
@@ -30,6 +32,7 @@
import android.graphics.BitmapFactory;
import android.graphics.Typeface;
import android.net.Uri;
+import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.QuickContact;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
@@ -40,6 +43,8 @@
import android.view.View;
import android.widget.RemoteViews;
+import java.util.HashMap;
+
public class SocialWidgetProvider extends AppWidgetProvider {
private static final String TAG = "SocialWidgetProvider";
@@ -58,7 +63,7 @@
}
for (int appWidgetId : appWidgetIds) {
- loadWidgetData(context, appWidgetManager, appWidgetId);
+ loadWidgetData(context, appWidgetManager, appWidgetId, false);
}
}
@@ -75,41 +80,46 @@
SocialWidgetSettings.getInstance().remove(context, appWidgetIds);
}
- public static void loadWidgetData(
- final Context context, final AppWidgetManager appWidgetManager, final int widgetId) {
- final ContactLoader previousLoader = sLoaders.get(widgetId);
+ public static void loadWidgetData(final Context context,
+ final AppWidgetManager appWidgetManager, final int widgetId, boolean forceLoad) {
+ ContactLoader previousLoader = sLoaders.get(widgetId);
+
+ if (previousLoader != null && !forceLoad) {
+ previousLoader.startLoading();
+ return;
+ }
if (previousLoader != null) {
- previousLoader.startLoading();
- } else {
- // Show that we are loading
- final RemoteViews loadingViews =
- new RemoteViews(context.getPackageName(), R.layout.social_widget);
- loadingViews.setTextViewText(R.id.name,
- context.getString(R.string.social_widget_loading));
- loadingViews.setViewVisibility(R.id.name, View.VISIBLE);
- loadingViews.setViewVisibility(R.id.name_and_snippet, View.GONE);
- appWidgetManager.updateAppWidget(widgetId, loadingViews);
-
- // Load
- final Uri contactUri =
- SocialWidgetSettings.getInstance().getContactUri(context, widgetId);
- if (contactUri == null) {
- // Not yet set-up (this can happen while the Configuration activity is visible)
- return;
- }
- final ContactLoader contactLoader = new ContactLoader(context, contactUri);
- contactLoader.registerListener(0,
- new ContactLoader.OnLoadCompleteListener<ContactLoader.Result>() {
- @Override
- public void onLoadComplete(Loader<ContactLoader.Result> loader,
- ContactLoader.Result contactData) {
- bindRemoteViews(context, widgetId, appWidgetManager, contactData);
- }
- });
- contactLoader.startLoading();
- sLoaders.append(widgetId, contactLoader);
+ previousLoader.reset();
}
+
+ // Show that we are loading
+ final RemoteViews loadingViews =
+ new RemoteViews(context.getPackageName(), R.layout.social_widget);
+ loadingViews.setTextViewText(R.id.name,
+ context.getString(R.string.social_widget_loading));
+ loadingViews.setViewVisibility(R.id.name, View.VISIBLE);
+ loadingViews.setViewVisibility(R.id.name_and_snippet, View.GONE);
+ appWidgetManager.updateAppWidget(widgetId, loadingViews);
+
+ // Load
+ final Uri contactUri =
+ SocialWidgetSettings.getInstance().getContactUri(context, widgetId);
+ if (contactUri == null) {
+ // Not yet set-up (this can happen while the Configuration activity is visible)
+ return;
+ }
+ final ContactLoader contactLoader = new ContactLoader(context, contactUri);
+ contactLoader.registerListener(0,
+ new ContactLoader.OnLoadCompleteListener<ContactLoader.Result>() {
+ @Override
+ public void onLoadComplete(Loader<ContactLoader.Result> loader,
+ ContactLoader.Result contactData) {
+ bindRemoteViews(context, widgetId, appWidgetManager, contactData);
+ }
+ });
+ contactLoader.startLoading();
+ sLoaders.append(widgetId, contactLoader);
}
private static void bindRemoteViews(final Context context, final int widgetId,
@@ -122,13 +132,10 @@
if (contactData == ContactLoader.Result.ERROR ||
contactData == ContactLoader.Result.NOT_FOUND) {
setDisplayNameAndSnippet(context, views,
- context.getString(R.string.invalidContactMessage), null, null);
+ context.getString(R.string.invalidContactMessage), null, null, null);
setPhoto(views, ContactBadgeUtil.loadPlaceholderPhoto(context));
setStatusAttribution(views, null);
} else {
- setDisplayNameAndSnippet(context, views, contactData.getDisplayName(),
- contactData.getPhoneticName(), contactData.getSocialSnippet());
-
byte[] photo = contactData.getPhotoBinaryData();
setPhoto(views, photo != null
? BitmapFactory.decodeByteArray(photo, 0, photo.length)
@@ -148,6 +155,9 @@
final PendingIntent pendingIntent = PendingIntent.getActivity(context,
0, intent, 0);
views.setOnClickPendingIntent(R.id.border, pendingIntent);
+
+ setDisplayNameAndSnippet(context, views, contactData.getDisplayName(),
+ contactData.getPhoneticName(), contactData.getStatuses(), pendingIntent);
}
// Configure UI
@@ -164,7 +174,7 @@
*/
private static void setDisplayNameAndSnippet(Context context, RemoteViews views,
CharSequence displayName, CharSequence phoneticName,
- CharSequence snippet) {
+ HashMap<Long, DataStatus> statuses, PendingIntent defaultIntent) {
SpannableStringBuilder sb = new SpannableStringBuilder();
CharSequence name = displayName;
@@ -180,20 +190,41 @@
sb.setSpan(sizeSpan, 0, name.length(), 0);
sb.setSpan(styleSpan, 0, name.length(), 0);
- if (TextUtils.isEmpty(snippet)) {
+ long latestStatusId = 0;
+ DataStatus latestStatus = null;
+ if (statuses != null) {
+ for (HashMap.Entry<Long, DataStatus> entry : statuses.entrySet()) {
+ DataStatus status = entry.getValue();
+ if (!TextUtils.isEmpty(status.getStatus())
+ && (latestStatus == null
+ || latestStatus.getTimestamp() < status.getTimestamp())) {
+ latestStatusId = entry.getKey();
+ latestStatus = status;
+ }
+ }
+ }
+
+ if (latestStatus == null) {
views.setTextViewText(R.id.name, sb);
views.setViewVisibility(R.id.name, View.VISIBLE);
views.setViewVisibility(R.id.name_and_snippet, View.GONE);
+ views.setOnClickPendingIntent(R.id.widget_container, defaultIntent);
} else {
- if (snippet.length() <= SHORT_SNIPPET_LENGTH) {
+ CharSequence status = latestStatus.getStatus();
+ if (status.length() <= SHORT_SNIPPET_LENGTH) {
sb.append("\n");
} else {
sb.append(" ");
}
- sb.append(snippet);
+ sb.append(status);
views.setTextViewText(R.id.name_and_snippet, sb);
views.setViewVisibility(R.id.name, View.GONE);
views.setViewVisibility(R.id.name_and_snippet, View.VISIBLE);
+ final Intent intent = new Intent(Intent.ACTION_VIEW,
+ ContentUris.withAppendedId(Data.CONTENT_URI, latestStatusId));
+
+ views.setOnClickPendingIntent(R.id.name_and_snippet_container,
+ PendingIntent.getActivity(context, 0, intent, 0));
}
}
diff --git a/src/com/android/contacts/util/DataStatus.java b/src/com/android/contacts/util/DataStatus.java
index ec3c1e5..f267615 100644
--- a/src/com/android/contacts/util/DataStatus.java
+++ b/src/com/android/contacts/util/DataStatus.java
@@ -94,6 +94,10 @@
return mStatus;
}
+ public long getTimestamp() {
+ return mTimestamp;
+ }
+
/**
* Build any timestamp and label into a single string.
*/
diff --git a/src/com/android/contacts/util/PhoneCapabilityTester.java b/src/com/android/contacts/util/PhoneCapabilityTester.java
index 961e3c9..23319aa 100644
--- a/src/com/android/contacts/util/PhoneCapabilityTester.java
+++ b/src/com/android/contacts/util/PhoneCapabilityTester.java
@@ -58,7 +58,7 @@
private static void initialize(Context context) {
final TelephonyManager telephonyManager = new TelephonyManager(context);
sIsPhone = telephonyManager.isVoiceCapable();
- sIsSipPhone = SipManager.isVoipSupported(context);
+ sIsSipPhone = sIsPhone && SipManager.isVoipSupported(context);
sIsInitialized = true;
}
diff --git a/src/com/android/contacts/vcard/ExportProcessor.java b/src/com/android/contacts/vcard/ExportProcessor.java
index c5f293b..67c9c4a 100644
--- a/src/com/android/contacts/vcard/ExportProcessor.java
+++ b/src/com/android/contacts/vcard/ExportProcessor.java
@@ -109,7 +109,7 @@
final String errorReason =
mService.getString(R.string.fail_reason_could_not_open_file,
uri, e.getMessage());
- doFinishNotification(errorReason, "");
+ doFinishNotification(errorReason, null);
return;
}
@@ -139,7 +139,7 @@
final String title =
mService.getString(R.string.fail_reason_could_not_initialize_exporter,
translatedErrorReason);
- doFinishNotification(title, "");
+ doFinishNotification(title, null);
return;
}
@@ -147,7 +147,7 @@
if (total == 0) {
final String title =
mService.getString(R.string.fail_reason_no_exportable_contact);
- doFinishNotification(title, "");
+ doFinishNotification(title, null);
return;
}
@@ -165,7 +165,7 @@
final String title =
mService.getString(R.string.fail_reason_error_occurred_during_export,
translatedErrorReason);
- doFinishNotification(title, "");
+ doFinishNotification(title, null);
return;
}
@@ -178,11 +178,16 @@
}
Log.i(LOG_TAG, "Successfully finished exporting vCard " + request.destUri);
+ if (DEBUG) {
+ Log.d(LOG_TAG, "Ask MediaScanner to scan the file: " + request.destUri.getPath());
+ }
+ mService.updateMediaScanner(request.destUri.getPath());
+
successful = true;
final String filename = uri.getLastPathSegment();
final String title = mService.getString(R.string.exporting_vcard_finished_title,
filename);
- doFinishNotification(title, "");
+ doFinishNotification(title, null);
} finally {
if (composer != null) {
composer.terminate();
diff --git a/src/com/android/contacts/vcard/ImportProcessor.java b/src/com/android/contacts/vcard/ImportProcessor.java
index 1b70025..4ea1ead 100644
--- a/src/com/android/contacts/vcard/ImportProcessor.java
+++ b/src/com/android/contacts/vcard/ImportProcessor.java
@@ -198,7 +198,7 @@
}
final Notification notification =
VCardService.constructFinishNotification(mService,
- description, description, intent);
+ description, null, intent);
mNotificationManager.notify(mJobId, notification);
}
diff --git a/src/com/android/contacts/vcard/ProcessorBase.java b/src/com/android/contacts/vcard/ProcessorBase.java
index 833090d..073bcbb 100644
--- a/src/com/android/contacts/vcard/ProcessorBase.java
+++ b/src/com/android/contacts/vcard/ProcessorBase.java
@@ -39,6 +39,7 @@
*/
public abstract int getType();
+ @Override
public abstract void run();
/**
@@ -49,8 +50,11 @@
*
* @see Future#cancel(boolean)
*/
+ @Override
public abstract boolean cancel(boolean mayInterruptIfRunning);
+ @Override
public abstract boolean isCancelled();
+ @Override
public abstract boolean isDone();
/**
diff --git a/src/com/android/contacts/vcard/VCardService.java b/src/com/android/contacts/vcard/VCardService.java
index 6422163..a4c0480 100644
--- a/src/com/android/contacts/vcard/VCardService.java
+++ b/src/com/android/contacts/vcard/VCardService.java
@@ -24,6 +24,8 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
+import android.media.MediaScannerConnection;
+import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
@@ -36,8 +38,10 @@
import android.widget.Toast;
import java.io.File;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
@@ -101,6 +105,33 @@
}
});
+ private class CustomMediaScannerConnectionClient implements MediaScannerConnectionClient {
+ final MediaScannerConnection mConnection;
+ final String mPath;
+
+ public CustomMediaScannerConnectionClient(String path) {
+ mConnection = new MediaScannerConnection(VCardService.this, this);
+ mPath = path;
+ }
+
+ public void start() {
+ mConnection.connect();
+ }
+
+ @Override
+ public void onMediaScannerConnected() {
+ if (DEBUG) { Log.d(LOG_TAG, "Connected to MediaScanner. Start scanning."); }
+ mConnection.scanFile(mPath, null);
+ }
+
+ @Override
+ public void onScanCompleted(String path, Uri uri) {
+ if (DEBUG) { Log.d(LOG_TAG, "scan completed: " + path); }
+ mConnection.disconnect();
+ removeConnectionClient(this);
+ }
+ }
+
private NotificationManager mNotificationManager;
// Should be single thread, as we don't want to simultaneously handle import and export
@@ -113,6 +144,11 @@
// Key is jobId.
private final Map<Integer, ProcessorBase> mRunningJobMap =
new HashMap<Integer, ProcessorBase>();
+ // Stores ScannerConnectionClient objects until they finish scanning requested files.
+ // Uses List class for simplicity. It's not costly as we won't have multiple objects in
+ // almost all cases.
+ private final List<CustomMediaScannerConnectionClient> mRemainingScannerConnections =
+ new ArrayList<CustomMediaScannerConnectionClient>();
/* ** vCard exporter params ** */
// If true, VCardExporter is able to emits files longer than 8.3 format.
@@ -286,7 +322,7 @@
} else {
Log.w(LOG_TAG, String.format("Tried to remove unknown job (id: %d)", jobId));
}
- stopServiceWhenNoJob();
+ stopServiceIfAppropriate();
}
private synchronized void handleRequestAvailableExportDestination(Message msg) {
@@ -310,10 +346,11 @@
}
/**
- * Checks job list and call {@link #stopSelf()} when there's no job now.
- * A new job cannot be submitted any more after this call.
+ * Checks job list and call {@link #stopSelf()} when there's no job and no scanner connection
+ * is remaining.
+ * A new job (import/export) cannot be submitted any more after this call.
*/
- private synchronized void stopServiceWhenNoJob() {
+ private synchronized void stopServiceIfAppropriate() {
if (mRunningJobMap.size() > 0) {
for (final Map.Entry<Integer, ProcessorBase> entry : mRunningJobMap.entrySet()) {
final int jobId = entry.getKey();
@@ -327,11 +364,41 @@
}
}
+ if (!mRemainingScannerConnections.isEmpty()) {
+ Log.i(LOG_TAG, "MediaScanner update is in progress.");
+ return;
+ }
+
Log.i(LOG_TAG, "No unfinished job. Stop this service.");
mExecutorService.shutdown();
stopSelf();
}
+ /* package */ synchronized void updateMediaScanner(String path) {
+ if (DEBUG) {
+ Log.d(LOG_TAG, "MediaScanner is being updated: " + path);
+ }
+
+ if (mExecutorService.isShutdown()) {
+ Log.w(LOG_TAG, "MediaScanner update is requested after executor's being shut down. " +
+ "Ignoring the update request");
+ return;
+ }
+ final CustomMediaScannerConnectionClient client =
+ new CustomMediaScannerConnectionClient(path);
+ mRemainingScannerConnections.add(client);
+ client.start();
+ }
+
+ private synchronized void removeConnectionClient(
+ CustomMediaScannerConnectionClient client) {
+ if (DEBUG) {
+ Log.d(LOG_TAG, "Removing custom MediaScannerConnectionClient.");
+ }
+ mRemainingScannerConnections.remove(client);
+ stopServiceIfAppropriate();
+ }
+
/* package */ synchronized void handleFinishImportNotification(
int jobId, boolean successful) {
if (DEBUG) {
@@ -341,7 +408,7 @@
if (mRunningJobMap.remove(jobId) == null) {
Log.w(LOG_TAG, String.format("Tried to remove unknown job (id: %d)", jobId));
}
- stopServiceWhenNoJob();
+ stopServiceIfAppropriate();
}
/* package */ synchronized void handleFinishExportNotification(
@@ -362,7 +429,7 @@
mReservedDestination.remove(path);
}
- stopServiceWhenNoJob();
+ stopServiceIfAppropriate();
}
/**
diff --git a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
index 4514e1e..1db0f4c 100644
--- a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
+++ b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
@@ -132,7 +132,7 @@
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
- mFragment = ContactDeletionInteraction.start(activity, CONTACT_URI);
+ mFragment = ContactDeletionInteraction.start(activity, CONTACT_URI, false);
}
});