am a43b1c77: (-s ours) Import revised translations. DO NOT MERGE
Merge commit 'a43b1c7740df90faf4b59f7447a3fde2e4c79710' into eclair-mr2
* commit 'a43b1c7740df90faf4b59f7447a3fde2e4c79710':
Import revised translations. DO NOT MERGE
diff --git a/Android.mk b/Android.mk
index 2632f47..804072e 100644
--- a/Android.mk
+++ b/Android.mk
@@ -5,7 +5,8 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := googlelogin-client
+LOCAL_STATIC_JAVA_LIBRARIES := googlelogin-client \
+ com.android.phone.common
LOCAL_PACKAGE_NAME := Contacts
LOCAL_CERTIFICATE := shared
diff --git a/res/drawable/ic_launcher_folder_live_contacts.png b/res/drawable/ic_launcher_folder_live_contacts.png
deleted file mode 100644
index 5e222ec..0000000
--- a/res/drawable/ic_launcher_folder_live_contacts.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_launcher_folder_live_contacts_phone.png b/res/drawable/ic_launcher_folder_live_contacts_phone.png
deleted file mode 100644
index 02637da..0000000
--- a/res/drawable/ic_launcher_folder_live_contacts_phone.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_launcher_folder_live_contacts_starred.png b/res/drawable/ic_launcher_folder_live_contacts_starred.png
deleted file mode 100644
index 927b343..0000000
--- a/res/drawable/ic_launcher_folder_live_contacts_starred.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_launcher_phone.png b/res/drawable/ic_launcher_phone.png
deleted file mode 100644
index 4e613ec..0000000
--- a/res/drawable/ic_launcher_phone.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_launcher_shortcut_contact.png b/res/drawable/ic_launcher_shortcut_contact.png
deleted file mode 100644
index ed7025c..0000000
--- a/res/drawable/ic_launcher_shortcut_contact.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/quickcontact.9.png b/res/drawable/quickcontact.9.png
deleted file mode 100644
index fa0b917..0000000
--- a/res/drawable/quickcontact.9.png
+++ /dev/null
Binary files differ
diff --git a/res/layout-finger/dialpad.xml b/res/layout-finger/dialpad.xml
index 1eb653d..2c14877 100644
--- a/res/layout-finger/dialpad.xml
+++ b/res/layout-finger/dialpad.xml
@@ -17,7 +17,7 @@
<!-- Dialpad in the Contact app.
-->
-<com.android.contacts.ButtonGridLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.phone.ButtonGridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialpad"
android:paddingLeft="7dp"
android:paddingRight="7dp"
@@ -135,4 +135,4 @@
android:soundEffectsEnabled="false"
android:contentDescription="@string/description_image_button_pound"
/>
-</com.android.contacts.ButtonGridLayout>
+</com.android.phone.ButtonGridLayout>
diff --git a/res/layout-finger/list_separator.xml b/res/layout-finger/list_separator.xml
index 2ab4859..1257935 100644
--- a/res/layout-finger/list_separator.xml
+++ b/res/layout-finger/list_separator.xml
@@ -4,9 +4,9 @@
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.
@@ -18,5 +18,5 @@
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="?android:attr/listSeparatorTextViewStyle"
android:textColor="@*android:color/dim_foreground_dark"
- android:gravity="center_horizontal"
+ android:gravity="left|center_vertical"
/>
diff --git a/res/layout-long-finger/dialpad.xml b/res/layout-long-finger/dialpad.xml
index 9fea6d2..066392d 100644
--- a/res/layout-long-finger/dialpad.xml
+++ b/res/layout-long-finger/dialpad.xml
@@ -18,7 +18,7 @@
Tall screen version with taller buttons.
-->
-<com.android.contacts.ButtonGridLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.phone.ButtonGridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialpad"
android:paddingLeft="7dp"
android:paddingRight="7dp"
@@ -136,4 +136,4 @@
android:soundEffectsEnabled="false"
android:contentDescription="@string/description_image_button_pound"
/>
-</com.android.contacts.ButtonGridLayout>
+</com.android.phone.ButtonGridLayout>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 1bd32b5..0cdb86d 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -264,7 +264,6 @@
<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_vcard_not_supported_error" msgid="655208100451286027">"Analýza karty vCard se nezdařila. Přestože se zřejmě jedná o správný formát, aktuální implementace jej nepodporuje."</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"Na kartě SD nebyl nalezen žádný soubor vCard"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Ve vašem výběru nebyla nalezena žádná platná položka karty vCard"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Import jednoho nebo více souborů se nezdařil (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Neznámá chyba"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Výběr souboru vCard"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Nelze spustit exportní program: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Při exportu došlo k chybě: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Načtení informací z databáze se nezdařilo"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Nelze exportovat žádný kontakt. Pravděpodobně jste zvolili data, která nelze exportovat."</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"Editor karty vCard není správně inicializován"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"Soubor <xliff:g id="FILE_NAME">%s</xliff:g> nelze otevřít: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> z <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontaktů"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index dc4e61b..ea81717 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"vCard kunne ikke parses pga. en uventet årsag"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"vCard kunne ikke parses, selv om det ser ud til at være et gyldigt format, da den nuværende implementering ikke understøtter det"</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"Der blev ikke fundet nogen VCard-fil på SD-kortet"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Der blev ikke fundet nogen gyldig vCard-post for dit valg"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"En eller flere filer blev ikke importeret (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Ukendt fejl"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Vælg vCard-fil"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Eksportfunktionen kunne ikke startes: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Der opstod en fejl under eksport: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Kunne ikke hente databaseoplysninger"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Der er ingen kontaktpersoner, som kan eksporteres. Du har måske valgt data, som ikke kan eksporteres"</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"vCard-oprettelse ikke korrekt initialiseret"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"\"<xliff:g id="FILE_NAME">%s</xliff:g>\" kunne ikke åbnes: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> af <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontakter"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index b22b883..95ef7d3 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Die vCard konnte aus einem unbekannten Grund nicht geparst werden."</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"Beim Parsen der vCard ist ein Fehler aufgetreten. Obwohl die vCard anscheinend ein gültiges Format aufweist, wird sie von der aktuellen Implementierung nicht unterstützt."</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"Keine VCard-Datei auf der SD-Karte gefunden"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Es wurde kein gültiger vCard-Eintrag für Ihre Auswahl gefunden."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Fehler beim Import einer oder mehrerer Dateien (%s)"</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Unbekannter Fehler"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"vCard-Datei auswählen"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Exportprogramm konnte nicht initialisiert werden: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Fehler beim Exportieren: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Fehler bei der Ermittlung von Datenbank-Informationen"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Es ist kein exportierbarer Kontakt vorhanden. Möglicherweise können Sie nicht exportierbare Daten auswählen."</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"Das Programm zum Erstellen der vCard wurde nicht richtig initialisiert."</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"\"<xliff:g id="FILE_NAME">%s</xliff:g>\" konnte nicht geöffnet werden: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> von <xliff:g id="TOTAL_NUMBER">%s</xliff:g> Kontakten"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 099912d..01faa52 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -113,7 +113,8 @@
<string name="send_to_voicemail_view" msgid="9124400414311776864">"Οι κλήσεις στέλνονται απευθείας στον αυτόματο τηλεφωνητή."</string>
<string name="default_ringtone" msgid="9099988849649827972">"Προεπιλογή"</string>
<string name="addPicture" msgid="1594679312161537678">"Προσθήκη εικονιδίου"</string>
- <string name="changePicture" msgid="2943329047610967714">"Αλλαγή εικονιδίου"</string>
+ <!-- no translation found for changePicture (2943329047610967714) -->
+ <skip />
<string name="removePicture" msgid="3041230993155966350">"Κατάργηση εικονιδίου"</string>
<string name="noContacts" msgid="8579310973261953559">"Δεν υπάρχουν επαφές."</string>
<string name="noMatchingContacts" msgid="4266283206853990471">"Δεν βρέθηκαν επαφές που να αντιστοιχούν."</string>
@@ -264,7 +265,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Η ανάλυση της κάρτας vCard απέτυχε εξαιτίας μη αναμενόμενου συμβάντος"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"Αν και το VCard φαίνεται να βρίσκεται σε έγκυρη μορφή, η ανάλυσή του απέτυχε, εφόσον η τρέχουσα εφαρμογή δεν το υποστηρίζει"</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"Δεν βρέθηκε αρχείο VCard στην κάρτα SD"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Δεν βρέθηκε έγκυρη καταχώρηση VCard για την επιλογή σας"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Η εισαγωγή ενός ή περισσοτέρων αρχείων απέτυχε (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Άγνωστο σφάλμα"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Επιλογή αρχείου vCard"</string>
@@ -293,7 +293,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Δεν ήταν δυνατή η εκκίνηση της εξαγωγής: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Προέκυψε σφάλμα κατά την εξαγωγή: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Αποτυχία λήψης πληροφοριών βάσης δεδομένων"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Δεν υπάρχει επαφή με δυνατότητα εξαγωγής. Ενδέχεται να επιλέξατε μη εξαγώγιμα δεδομένα"</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"Δεν έχει γίνει σωστή εκκίνηση του προγράμματος σύνθεσης της vCard"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"Δεν ήταν δυνατό το άνοιγμα του \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> από <xliff:g id="TOTAL_NUMBER">%s</xliff:g> επαφές"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 07ffe85..60f69ec 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -264,7 +264,6 @@
<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_vcard_not_supported_error" msgid="655208100451286027">"No se ha podido analizar vCard aunque el formato parece válido, ya que la implementación actual no lo admite"</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"No se ha encontrado un archivo de vCard en la Tarjeta SD."</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"No se ha encontrado ninguna entrada válida de vCard para tu selección"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"No se pudieron importar uno o más archivos (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Error desconocido"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Seleccionar archivo de vCard"</string>
@@ -293,7 +292,8 @@
<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 produjo 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">"No se ha podido obtener información de la base de datos"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"No hay ningún contacto exportable. Puedes elegir datos no exportables"</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<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 pudo abrir \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> de <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contactos"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index d929f9d..63c0ce3 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -264,7 +264,6 @@
<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_vcard_not_supported_error" msgid="655208100451286027">"No se ha podido analizar el archivo de vCard (a pesar de que su formato parece ser válido) porque no es compatible con la implementación actual."</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"No se ha encontrado ningún archivo de vCard en la tarjeta SD."</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"No se ha encontrado ninguna entrada de vCard válida para la selección realizada."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"No ha sido posible importar uno o varios archivos (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Error desconocido"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Seleccionar archivo de vCard"</string>
@@ -293,7 +292,8 @@
<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" msgid="2239503301380653777">"No hay contactos que exportar. Puedes seleccionar datos no exportables."</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<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>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> de <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contactos"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 75ecd6a..d32b8f6 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Impossibile analizzare la vCard per motivi imprevisti"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"Impossibile analizzare la vCard nonostante sembri avere un formato valido perché l\'implementazione corrente non la supporta"</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"Nessun file vCard trovato sulla scheda SD"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Nessuna voce vCard valida trovata per la tua selezione"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Impossibile importare uno o più file (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Errore sconosciuto"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Seleziona file vCard"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Impossibile inizializzare l\'utilità di esportazione: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Si è verificato un errore durante l\'esportazione: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Recupero informazioni database non riuscito"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Nessun contatto esportabile. Potresti scegliere dati non esportabili"</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"Il compositore di vCard non è correttamente inizializzato"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"Impossibile aprire \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> contatti su <xliff:g id="TOTAL_NUMBER">%s</xliff:g>"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index fdb7858..611f25f 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"予期しない理由によりvCardの解析に失敗しました"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"vCardの解析に失敗しました。正しいフォーマットですが、現在サポートされていません。"</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"SDカードでvCardファイルが見つかりません"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"選択した内容の有効なvCardエントリが見つかりません"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"1つ以上のファイルをインポートできませんでした(%s)。"</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"不明なエラー"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"vCardファイルの選択"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"エクスポータを初期化できませんでした: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"エクスポート中にエラーが発生しました: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"データベース情報の取得に失敗しました"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"エクスポートできる連絡先がありません。エクスポートできないデータを選択している可能性があります。"</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"vCardコンポーザーが正しく初期化されていません"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"\"<xliff:g id="FILE_NAME">%s</xliff:g>\"を開けませんでした: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g>/<xliff:g id="TOTAL_NUMBER">%s</xliff:g>件のファイル"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 0057e0d..d35bc91 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"예기치 못한 이유로 인해 vCard를 구문분석하지 못했습니다."</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"올바른 형식처럼 보이지만 현재 구현 환경에서는 VCard를 지원하지 않기 때문에 VCard 구문 분석에 실패했습니다."</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"SD 카드에 VCard 파일이 없습니다."</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"선택한 항목에 유효한 VCard 항목이 없습니다."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"하나 이상의 파일을 가져오지 못했습니다(%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"알 수 없는 오류"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"vCard 파일 선택"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"내보내기를 초기화하지 못했습니다. \'<xliff:g id="EXACT_REASON">%s</xliff:g>\'"</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"내보내는 중에 오류가 발생했습니다. \'<xliff:g id="EXACT_REASON">%s</xliff:g>\'"</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"데이터베이스 정보를 가져오지 못했습니다."</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"내보낼 수 있는 연락처가 없습니다. 내보낼 수 없는 데이터를 선택할 수 있습니다."</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"vCard 작성기가 바르게 초기화되지 않았습니다."</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"\'<xliff:g id="FILE_NAME">%s</xliff:g>\'을(를) 열 수 없습니다. <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"연락처 <xliff:g id="CURRENT_NUMBER">%s</xliff:g>개(총 <xliff:g id="TOTAL_NUMBER">%s</xliff:g>개) 내보내는 중"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 6c41e23..e47266e 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -56,9 +56,12 @@
<string name="menu_hideSources" msgid="71367585820555477">"Bronnen verbergen"</string>
<string name="titleJoinAggregate" msgid="6970566008563147202">"Contact samenvoegen"</string>
<string name="titleJoinContactDataWith" msgid="7684875775798635354">"Contacten samenvoegen"</string>
- <string name="blurbJoinContactDataWith" msgid="995870557595050304">"Selecteer het contact dat u met <xliff:g id="NAME">%s</xliff:g> wilt samenvoegen."</string>
- <string name="showAllContactsJoinItem" msgid="2189695051430392383">"Alle contacten weergeven"</string>
- <string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Mogelijke contacten"</string>
+ <!-- no translation found for blurbJoinContactDataWith (995870557595050304) -->
+ <skip />
+ <!-- no translation found for showAllContactsJoinItem (2189695051430392383) -->
+ <skip />
+ <!-- no translation found for separatorJoinAggregateSuggestions (2831414448851313345) -->
+ <skip />
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle contacten"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Contacten zijn samengevoegd"</string>
<string name="menu_contactOptions" msgid="1957061455705020617">"Opties"</string>
@@ -66,7 +69,8 @@
<string name="deleteConfirmation_title" msgid="6394309508930335204">"Verwijderen"</string>
<string name="readOnlyContactWarning" msgid="1390849295342594265">"U kunt contacten niet verwijderen uit alleen-lezen accounts, maar u kunt ze verbergen in uw contactenlijst."</string>
<string name="readOnlyContactDeleteConfirmation" msgid="2137170726670196909">"Dit contact bevat gegevens uit meerdere accounts. Gegevens uit alleen-lezen accounts worden verborgen in uw contactenlijst, maar niet verwijderd."</string>
- <string name="multipleContactDeleteConfirmation" msgid="938900978442960800">"Als u dit contact verwijdert, worden gegevens van meerdere accounts verwijderd."</string>
+ <!-- no translation found for multipleContactDeleteConfirmation (938900978442960800) -->
+ <skip />
<string name="deleteConfirmation" msgid="811706994761610640">"Dit contact wordt verwijderd."</string>
<string name="menu_done" msgid="796017761764190697">"Gereed"</string>
<string name="menu_doNotSave" msgid="2174577548513895144">"Terugkeren"</string>
@@ -113,7 +117,8 @@
<string name="send_to_voicemail_view" msgid="9124400414311776864">"Oproepen worden rechtstreeks naar voicemail verzonden."</string>
<string name="default_ringtone" msgid="9099988849649827972">"Standaard"</string>
<string name="addPicture" msgid="1594679312161537678">"Pictogram toevoegen"</string>
- <string name="changePicture" msgid="2943329047610967714">"Pictogram wijzigen"</string>
+ <!-- no translation found for changePicture (2943329047610967714) -->
+ <skip />
<string name="removePicture" msgid="3041230993155966350">"Pictogram verwijderen"</string>
<string name="noContacts" msgid="8579310973261953559">"Geen contacten."</string>
<string name="noMatchingContacts" msgid="4266283206853990471">"Kan geen overeenkomende contacten vinden."</string>
@@ -259,12 +264,13 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Alle vCard-bestanden importeren"</string>
<string name="searching_vcard_message" msgid="6917522333561434546">"Zoeken naar vCard-gegevens op SD-kaart"</string>
<string name="scanning_sdcard_failed_title" msgid="3506782007953167180">"Scannen van SD-kaart is mislukt"</string>
- <string name="scanning_sdcard_failed_message" msgid="3761992500690182922">"Scannen van SD-kaart is mislukt: (Reden: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')"</string>
+ <!-- no translation found for scanning_sdcard_failed_message (3761992500690182922) -->
+ <skip />
<string name="fail_reason_io_error" msgid="5922864781066136340">"I/O-fout"</string>
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Parseren van vCard is mislukt om onbekende reden"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"Kan vCard niet parseren, ook al lijkt de indeling geldig. vCard wordt niet ondersteund door de huidige implementatie"</string>
- <string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"Geen vCard-bestand gevonden op SD-kaart"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Geen geldig vCard-item gevonden voor uw selectie"</string>
+ <!-- no translation found for fail_reason_no_vcard_file (6376516175882881595) -->
+ <skip />
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Een of meer bestanden kunnen niet worden geïmporteerd (%s)"</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Onbekende fout"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"vCard-bestand selecteren"</string>
@@ -293,7 +299,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Kan het exportprogramma niet initialiseren: \'<xliff:g id="EXACT_REASON">%s</xliff:g>\'"</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Fout opgetreden tijdens export: \'<xliff:g id="EXACT_REASON">%s</xliff:g>\'"</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Databasegegevens ophalen mislukt"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Er is geen contact dat geëxporteerd kan worden. Mogelijk heeft u niet-exporteerbare gegevens gekozen."</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"De vCard-editor is niet juist geïnitialiseerd"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"Kan \'<xliff:g id="FILE_NAME">%s</xliff:g>\' niet openen: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> van <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contacten"</string>
@@ -304,9 +311,12 @@
<string name="call_disambig_title" msgid="1911302597959335178">"Bellen met"</string>
<string name="sms_disambig_title" msgid="4675399294513152364">"Sms\'en met"</string>
<string name="make_primary" msgid="5829291915305113983">"Deze keuze onthouden"</string>
- <string name="quickcontact_missing_app" msgid="4600366393134289038">"Er is geen toepassing gevonden om deze actie uit te voeren"</string>
- <string name="quickcontact_remember_choice" msgid="5964536411579749424">"Deze keuze onthouden"</string>
- <string name="quickcontact_missing_name" msgid="5590266114306996632">"Onbekend"</string>
+ <!-- no translation found for quickcontact_missing_app (4600366393134289038) -->
+ <skip />
+ <!-- no translation found for quickcontact_remember_choice (5964536411579749424) -->
+ <skip />
+ <!-- no translation found for quickcontact_missing_name (5590266114306996632) -->
+ <skip />
<string name="menu_accounts" msgid="8499114602017077970">"Accounts"</string>
<string name="menu_import_export" msgid="3765725645491577190">"Importeren/exporteren"</string>
<string name="dialog_import_export" msgid="4771877268244096596">"Contacten importeren/exporteren"</string>
@@ -317,21 +327,25 @@
<string name="nicknameLabelsGroup" msgid="2891682101053358010">"Bijnaam"</string>
<string name="organizationLabelsGroup" msgid="2478611760751832035">"Organisatie"</string>
<string name="websiteLabelsGroup" msgid="4202998982804009261">"Website"</string>
- <string name="eventLabelsGroup" msgid="8069912895912714412">"Afspraak"</string>
+ <!-- no translation found for eventLabelsGroup (8069912895912714412) -->
+ <skip />
<string name="type_short_home" msgid="7770424864090605384">"H"</string>
<string name="type_short_mobile" msgid="1655473281466676216">"M"</string>
<string name="type_short_work" msgid="4925330752504537861">"W"</string>
<string name="type_short_pager" msgid="2613818970827594238">"P"</string>
<string name="type_short_other" msgid="5669407180177236769">"O"</string>
<string name="edit_read_only" msgid="8158629550655830981">"Dit contact is alleen-lezen"</string>
- <string name="edit_secondary_collapse" msgid="5371618426594477103">"Meer"</string>
+ <!-- no translation found for edit_secondary_collapse (5371618426594477103) -->
+ <skip />
<string name="dialog_primary_name" msgid="5521591005692614833">"Primaire naam"</string>
<string name="dialog_new_contact_account" msgid="9044704073286262197">"Contact in account maken"</string>
<string name="menu_sync_remove" msgid="3266725887008450161">"Synchronisatiegroep verwijderen"</string>
<string name="dialog_sync_add" msgid="8267045393119375803">"Synchronisatiegroep toevoegen"</string>
<string name="display_more_groups" msgid="2682547080423434170">"Meer groepen…"</string>
- <string name="display_ungrouped" msgid="4602580795576261158">"Alle andere contacten"</string>
- <string name="display_all_contacts" msgid="6846131371214707956">"Alle contacten"</string>
+ <!-- no translation found for display_ungrouped (4602580795576261158) -->
+ <skip />
+ <!-- no translation found for display_all_contacts (6846131371214707956) -->
+ <skip />
<string name="display_warn_remove_ungrouped" msgid="2314043155909167610">"Als u \'<xliff:g id="GROUP">%s</xliff:g>\' verwijdert uit de synchronisatie, worden ook contacten die niet bij een groep horen uit de synchronisatie verwijderd."</string>
<string name="account_phone" msgid="4025734638492419713">"Alleen voor telefoon (niet gesynchroniseerd)"</string>
<string name="label_email_display_name" msgid="5537802602754309600">"Weergavenaam"</string>
@@ -413,7 +427,8 @@
<string name="name_phonetic_family" msgid="462095502140180305">"Fonetische achternaam"</string>
<string name="split_label" msgid="8262112659919449087">"Splitsen"</string>
<string name="split_explanation" msgid="1824739956426973592">"Maak van deze gegevens een nieuw contact."</string>
- <string name="account_name_format" msgid="4421123930035299208">"Van <xliff:g id="SOURCE">%1$s</xliff:g>-account: <xliff:g id="ACCOUNT">%2$s</xliff:g>"</string>
+ <!-- no translation found for account_name_format (4421123930035299208) -->
+ <skip />
<string name="account_type_format" msgid="718948015590343010">"<xliff:g id="SOURCE">%1$s</xliff:g> contact"</string>
<string name="from_account_format" msgid="687567483928582084">"van <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="use_photo_as_primary" msgid="8807110122951157246">"Deze foto gebruiken"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 0592b5d..c4cf8d1 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Nie można zanalizować pliku vCard z nieoczekiwanego powodu"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"Nie można zanalizować pliku vCard, mimo że prawdopodobnie ma on prawidłowy format. Bieżąca wersja go nie obsługuje."</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"Na karcie SD nie znaleziono żadnego pliku vCard"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"W wybranym zakresie nie znaleziono prawidłowego wpisu vCard"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Nie można zaimportować co najmniej jednego pliku (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Nieznany błąd"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Wybierz plik vCard"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Nie można zainicjować programu eksportującego: „<xliff:g id="EXACT_REASON">%s</xliff:g>”"</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Wystąpił błąd podczas eksportowania: „<xliff:g id="EXACT_REASON">%s</xliff:g>”"</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Nie można pobrać informacji o bazie danych"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Brak kontaktów, które można wyeksportować. Być może wybrano dane, których nie można eksportować."</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"Obiekt tworzenia danych vCard nie został poprawnie zainicjowany"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"Nie można otworzyć pliku „<xliff:g id="FILE_NAME">%s</xliff:g>”: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"Kontakt <xliff:g id="CURRENT_NUMBER">%s</xliff:g> z <xliff:g id="TOTAL_NUMBER">%s</xliff:g>"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index ae35da1..8133070 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Falha na análise do vCard por motivo inesperado"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"Falha na análise do vCard embora o formato pareça válido, uma vez que não é suportado pela implementação actual"</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"Não foi encontrado nenhum ficheiro vCard no cartão SD"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Não foi encontrada nenhuma entrada vCard válida para a sua selecção"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"A importação de um ou vários ficheiros falhou (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Erro desconhecido"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Seleccionar ficheiro vCard"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Não foi possível iniciar o exportador: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Erro ocorrido durante a exportação: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Falha na obtenção de informações da base de dados"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Não existe nenhum contacto exportável. Pode ter escolhido dados não exportáveis"</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"O compositor vCard não foi inicializado correctamente"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"Não foi possível abrir \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> de <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contactos"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 9bb4911..a0d169e 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Falha ao analisar o vCard por razão inesperada"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"Falha ao analisar o vCard. Embora o formato pareça ser válido, a implementação atual não oferece suporte a ele."</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"Nenhum arquivo de vCard encontrado no cartão SD"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Nenhuma entrada válida no vCard foi encontrada para a sua seleção"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Falha na importação de um ou mais arquivos (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Erro desconhecido"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Selecionar arquivo do vCard"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Não foi possível iniciar o exportador: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Ocorreu um erro durante a exportação: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Falha ao acessar informações do banco de dados"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Não há contatos exportáveis. Você precisa escolher dados não exportáveis."</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"O vCard não foi iniciado corretamente"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"Não foi possível abrir \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> de <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contatos"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index dc18632..2207e24 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Не удалось обработать vCard по неизвестной причине."</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"Не удалось обработать vCard. Файл правильного формата, но не поддерживается в текущей реализации."</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"На SD-карте не найдены файлы VCard"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Не найдено правильных записей vCard."</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"Не удалось импортировать один или несколько файлов (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Неизвестная ошибка"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Выберите файл vCard"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Не удается запустить функцию экспорта: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Ошибка при экспорте: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Не удалось получить информацию из базы данных."</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Нет контактов, пригодных для экспорта. Можно выбрать неэкспортируемые данные."</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"Редактор vCard запущен некорректно"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"Не удается открыть \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"Контакт <xliff:g id="CURRENT_NUMBER">%s</xliff:g> из <xliff:g id="TOTAL_NUMBER">%s</xliff:g>"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 17fe14e..dcb38a8 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Det gick inte att analysera vCard av okänd anledning"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"Det gick inte att analysera vCard trots att formatet verkar vara giltigt. Den aktuella implementeringen stöder inte det."</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"Ingen vCard-fil hittades på SD-kortet"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Det finns ingen vCard-post i den valda filen"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"En eller flera filer kunde inte importeras: (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Okänt fel"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"Välj vCard-fil"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Det gick inte att starta exportverktyget: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Ett fel uppstod under export: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Det gick inte att hämta databasinformation"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Det finns ingen kontakt som kan exporteras. Du kan välja data som inte kan exporteras"</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"vCard-kompositören är inte korrekt initierad"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"Det gick inte att öppna <xliff:g id="FILE_NAME">%s</xliff:g>: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> av <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontakter"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index d55306b..dff342f 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"Beklenmedik bir nedenden dolayı vCard ayrıştırılamadı"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"Geçerli biçimde görünmesine rağmen vCard ayrıştırılamadı, çünkü şu anki uygulama vCard\'ı desteklemiyor"</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"SD kartta hiçbir vCard dosyası bulunamadı"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"Seçiminiz için geçerli vCard girdisi bulunamadı"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"İçe aktarılamayan bir veya birden fazla dosya (%s)."</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"Bilinmeyen hata"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"vCard dosyasını seç"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"Dışa aktarıcı başlatılamadı: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"Dışa aktarma sırasında hata oluştu: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\""</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"Veri tabanı bilgileri alınamadı"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"Dışa aktarılabilen hiçbir kişi yok. Dışa aktarılamayan veriler seçmiş olabilirsiniz"</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"vCard oluşturucu doğru bir şekilde başlatılmamış"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"\"<xliff:g id="FILE_NAME">%s</xliff:g>\" dosyası açılamadı: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"Toplam <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kişiden <xliff:g id="CURRENT_NUMBER">%s</xliff:g> kişi"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index fee1bf9..bc0801f 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"由于意外原因而无法解析 vCard"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"虽然 vCard 似乎使用了有效的格式,但系统无法对其进行解析,因为当前的实现方案不支持该格式。"</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"未在 SD 卡上找到 vCard 文件"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"未找到与所选内容对应的有效 vCard 条目"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"一个或多个文件导入失败 (%s)。"</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"未知错误"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"选择 vCard 文件"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"无法初始化导出程序:“<xliff:g id="EXACT_REASON">%s</xliff:g>”"</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"导出时出错:“<xliff:g id="EXACT_REASON">%s</xliff:g>”"</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"获取数据库信息失败"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"没有可导出的联系人。您可能选择了无法导出的数据。"</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"vCard 制作程序未正确初始化"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"无法打开“<xliff:g id="FILE_NAME">%s</xliff:g>”:<xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"第 <xliff:g id="CURRENT_NUMBER">%s</xliff:g> 个联系人(共 <xliff:g id="TOTAL_NUMBER">%s</xliff:g> 个)"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 601583a..649f120 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -264,7 +264,6 @@
<string name="fail_reason_vcard_parse_error" msgid="1201233722762680214">"因未預期原因,無法剖析 VCard"</string>
<string name="fail_reason_vcard_not_supported_error" msgid="655208100451286027">"VCard 格式正確,但目前的實作系統不支援此格式,因此無法剖析"</string>
<string name="fail_reason_no_vcard_file" msgid="6376516175882881595">"SD 卡上沒有 vCard 檔案"</string>
- <string name="fail_reason_no_vcard_entry" msgid="4733290752474073143">"所選的檔案中沒有有效的 VCard 項目"</string>
<string name="fail_reason_failed_to_read_files" msgid="3659521123567134029">"無法匯入一或多個檔案 (%s)。"</string>
<string name="fail_reason_unknown" msgid="999034019513096768">"未知的錯誤"</string>
<string name="select_vcard_title" msgid="3968948173786172468">"選取 VCard 檔案"</string>
@@ -293,7 +292,8 @@
<string name="fail_reason_could_not_initialize_exporter" msgid="4943708332700987376">"無法初始化匯出程式:「<xliff:g id="EXACT_REASON">%s</xliff:g>」"</string>
<string name="fail_reason_error_occurred_during_export" msgid="2151165129433831202">"匯出時發生錯誤:「<xliff:g id="EXACT_REASON">%s</xliff:g>」"</string>
<string name="composer_failed_to_get_database_infomation" msgid="3723109558155169053">"無法取得資料庫資訊"</string>
- <string name="composer_has_no_exportable_contact" msgid="2239503301380653777">"沒有可匯出的聯絡人,您可能選擇了不可匯出的資料。"</string>
+ <!-- no translation found for composer_has_no_exportable_contact (754734132189369094) -->
+ <skip />
<string name="composer_not_initialized" msgid="8041534450748388843">"VCard 編輯器並未正確初始化"</string>
<string name="fail_reason_could_not_open_file" msgid="4013520943128739511">"無法開啟「<xliff:g id="FILE_NAME">%s</xliff:g>」:<xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"第 <xliff:g id="CURRENT_NUMBER">%s</xliff:g> 位聯絡人,共 <xliff:g id="TOTAL_NUMBER">%s</xliff:g> 位"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e37c118..120d996 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -797,44 +797,55 @@
<!-- Action that exports all contacts to SD Card -->
<string name="export_to_sdcard">Export to SD card</string>
- <!-- "Import one vCard file" -->
+ <!-- One of alternatives shown when the system allows a user to select how many vCard files
+ should be imported. This message shows only when the system is certain that there's more
+ than one vCard files available in the system. -->
<string name="import_one_vcard_string">Import one vCard file</string>
- <!-- "Import more than one vCard -->
+ <!-- One of alternatives shown when the system allows a user to select how many vCard files
+ should be imported. This message shows only when the system is certain that there's more
+ than one vCard files available in the system. -->
<string name="import_multiple_vcard_string">Import multiple vCard files</string>
- <!-- "Import all vCard files" -->
+ <!-- One of alternatives shown when the system allows a user to select how many vCard files
+ should be imported. This message shows only when the system is certain that there's more
+ 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 -->
<string name="searching_vcard_message">Searching for vCard data on SD card</string>
- <!-- Dialog title shown when searching VCard data failed. -->
+ <!-- Dialog title shown when scanning VCard data failed. -->
<string name="scanning_sdcard_failed_title">Scanning SD card failed</string>
- <!-- Dialog message shown when searching VCard data failed. -->
+ <!-- Dialog message shown when searching VCard data failed.
+ An exact reason for the failure should -->
<string name="scanning_sdcard_failed_message">Scanning SD card failed (Reason: \"<xliff:g id="fail_reason">%s</xliff:g>\")</string>
- <!-- The failed reason: "I/O Error" -->
+ <!-- The failed reason shown when Contacts app (especially vCard importer/exporter)
+ emitted some I/O error. Exact reason will be appended by the system. -->
<string name="fail_reason_io_error">I/O Error</string>
- <!-- The failed reason: "Failed to parse VCard data" -->
+ <!-- The failed reason shown when vCard parser was not able to be parsed by the current vCard
+ implementation. This might happen even when the input vCard is completely valid, though
+ we believe it is rather rare in the actual world. -->
<string name="fail_reason_vcard_parse_error">Failed to parse vCard for unexpected reason</string>
- <!-- The failed reason: "The VCard is not supported right now, but may be supported in the future" -->
+ <!-- The failed reason shown when the current vCard importer cannot parse the file since the
+ parser is incomplete (actually, there's missing part in the current vCard parser, though
+ our understanding is that the functionality missed by the current vCard parser
+ is rarely needed in the actual vCard...). -->
<string name="fail_reason_vcard_not_supported_error">Failed to parse vCard though it seems in valid format, since the current implementation does not support it</string>
- <!-- The failed reason: "There is no VCard file" -->
+ <!-- The failed reason shown when the system could not find any vCard file
+ (with extension ".vcf" in SDCard.) -->
<string name="fail_reason_no_vcard_file">No vCard file found on the SD card</string>
- <!-- The failed reason: "There is no valid VCard entry in the file(s)" -->
- <string name="fail_reason_no_vcard_entry">No valid vCard entry found for your selection</string>
-
- <!-- The failed reason: "One or more files failed to be imported. (<a list of file names>)" -->
+ <!-- The failed reason shown when the import of some of vCard files failed during multiple vCard
+ files import. It includes the case where all files were failed to be imported. -->
<string name="fail_reason_failed_to_read_files">One or more files failed to be imported (%s).</string>
- <!-- The failed reason: "Unknown error". This message should not be shown
- but it may in some buggy condition. -->
+ <!-- The failed reason which should not be shown but it may in some buggy condition. -->
<string name="fail_reason_unknown">Unknown error</string>
<!-- Dialog title shown when a user is asked to select VCard file -->
@@ -890,16 +901,22 @@
<!-- Dialog message shown when exporting Contact data failed -->
<string name="exporting_contact_failed_message">Failed to export contact data.\nReason for failure: \"<xliff:g id="fail_reason">%s</xliff:g>\"</string>
- <!-- The failed reason: "There is no exportable contact" -->
+ <!-- The failed reason shown when there's no contact which is allowed to be exported.
+ Note that user may have contacts data but all of them are probably not allowed to be
+ exported because of security/permission reasons. -->
<string name="fail_reason_no_exportable_contact">There is no exportable contact</string>
- <!-- The failed reason: "Too many vcard files on the SD Card" -->
+ <!-- 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">Too many vCard files on the SD card</string>
- <!-- The failed reason: "Too long filename". This error usually does not happen. -->
+ <!-- The failed reason shown when the given file name is too long for the system.
+ The length limit of each file is different in each Android device, so we don't need to
+ mention it here. -->
<string name="fail_reason_too_long_filename">Required filename is too long (\"<xliff:g id="filename">%s</xliff:g>\")</string>
- <!-- The failed reason: "Cannot open or create the destination directory" -->
+ <!-- The reason why the contacts import/export failed, meaning a designated file or directory
+ cannot be opened/created because of some permission, security, or any other reasons. -->
<string name="fail_reason_cannot_open_destination_dir">Cannot open or create the destination directory\"<xliff:g id="dir_name">%s</xliff:g>\"</string>
<!-- Dialog title shown when the application is exporting contact data outside -->
@@ -908,22 +925,30 @@
<!-- Message shown when the application is exporting contact data outside -->
<string name="exporting_contact_list_message">Exporting contact data to \"<xliff:g id="file_name">%s</xliff:g>\"</string>
- <!-- The failed reason: "Could not initialize the exporter" -->
+ <!-- The failed reason shown when contacts exporter fails to be initialized.
+ Some exact reason must follow this. -->
<string name="fail_reason_could_not_initialize_exporter">Could not initialize the exporter: \"<xliff:g id="exact_reason">%s</xliff:g>\"</string>
- <!-- The failed reason: "Error occured during export" -->
+ <!-- The failed reason shown when some error happend during contacts export.
+ Some exact reason must follow this. -->
<string name="fail_reason_error_occurred_during_export">Error occured during export: \"<xliff:g id="exact_reason">%s</xliff:g>\"</string>
- <!-- The error reason the vCard composer emits: "Failed to get database information" -->
+ <!-- The error reason the vCard composer "may" emit when database is corrupted or
+ something is going wrong. Usually users should not see this text. -->
<string name="composer_failed_to_get_database_infomation">Failed to get database information</string>
- <!-- The error reason the vCard composer emits: "There is no exportable contact. You might choose un-exportable data" -->
- <string name="composer_has_no_exportable_contact">There is no exportable contact. You might choose un-exportable data</string>
+ <!-- This error message shown when the user actually have no contact
+ (e.g. just after data-wiping), or, data providers of the contact list prohibits their
+ contacts from being exported to outside world via vcard exporter, etc. -->
+ <string name="composer_has_no_exportable_contact">There is no exportable contact. If you have actualy have contacts on your phone, all the contacts may be prohibited from being exported to outside the phone by some data provider.</string>
- <!-- The error reason the vCard composer emits: "The vCard composer object is not correctly initialized" -->
+ <!-- The error reason the vCard composer may emit when vCard composer is not initialized
+ even when needed.
+ Users should not usually see this error message. -->
<string name="composer_not_initialized">The vCard composer is not correctly initialized</string>
- <!-- The failed reason: "Could not open a specific file" -->
+ <!-- The failed reason shown when vCard importer/exporter could not open the file
+ specified by a user. The file name should be in the message. -->
<string name="fail_reason_could_not_open_file">Could not open \"<xliff:g id="file_name">%s</xliff:g>\": <xliff:g id="exact_reason">%s</xliff:g></string>
<!-- Message in progress bar while exporting contact list to a file "(current number) of (total number) contacts" The order of "current number" and "total number" cannot be changed (like "total: (total number), current: (current number)")-->
diff --git a/src/com/android/contacts/ButtonGridLayout.java b/src/com/android/contacts/ButtonGridLayout.java
deleted file mode 100644
index 6ce3e71..0000000
--- a/src/com/android/contacts/ButtonGridLayout.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.content.Context;
-import android.util.AttributeSet;
-import android.view.View.MeasureSpec;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * Create a 4x3 grid of dial buttons.
- *
- * It was easier and more efficient to do it this way than use
- * standard layouts. It's perfectly fine (and actually encouraged) to
- * use custom layouts rather than piling up standard layouts.
- *
- * The horizontal and vertical spacings between buttons are controlled
- * by the amount of padding (attributes on the ButtonGridLayout element):
- * - horizontal = left + right padding and
- * - vertical = top + bottom padding.
- *
- * This class assumes that all the buttons have the same size.
- * The buttons will be bottom aligned in their view on layout.
- *
- * Invocation: onMeasure is called first by the framework to know our
- * size. Then onLayout is invoked to layout the buttons.
- */
-// TODO: Blindly layout the buttons w/o checking if we overrun the
-// bottom-right corner.
-public class ButtonGridLayout extends ViewGroup {
- private final int COLUMNS = 3;
- private final int ROWS = 4;
-
- // Width and height of a button
- private int mButtonWidth;
- private int mButtonHeight;
-
- // Width and height of a button + padding.
- private int mWidthInc;
- private int mHeightInc;
-
- // Height of the dialpad. Used to align it at the bottom of the
- // view.
- private int mHeight;
-
- public ButtonGridLayout(Context context) {
- super(context);
- }
-
- public ButtonGridLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public ButtonGridLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- int i = 0;
- // The last row is bottom aligned.
- int y = (b - t) - mHeight + mPaddingTop;
- for (int row = 0; row < ROWS; row++) {
- int x = mPaddingLeft;
- for (int col = 0; col < COLUMNS; col++) {
- View child = getChildAt(i);
-
- child.layout(x, y, x + mButtonWidth, y + mButtonHeight);
-
- x += mWidthInc;
- i++;
- }
- y += mHeightInc;
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- // Measure the first child and get it's size
- View child = getChildAt(0);
- child.measure(MeasureSpec.UNSPECIFIED , MeasureSpec.UNSPECIFIED);
-
- // Make sure the other children are measured as well, to initialize
- for (int i = 1; i < getChildCount(); i++) {
- getChildAt(i).measure(MeasureSpec.UNSPECIFIED , MeasureSpec.UNSPECIFIED);
- }
-
- // Store these to be reused in onLayout.
- mButtonWidth = child.getMeasuredWidth();
- mButtonHeight = child.getMeasuredHeight();
- mWidthInc = mButtonWidth + mPaddingLeft + mPaddingRight;
- mHeightInc = mButtonHeight + mPaddingTop + mPaddingBottom;
- mHeight = ROWS * mHeightInc;
-
- final int width = resolveSize(COLUMNS * mWidthInc, widthMeasureSpec);
- final int height = resolveSize(mHeight, heightMeasureSpec);
-
- setMeasuredDimension(width, height);
- }
-}
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index 5613794..b1a124d 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -217,11 +217,11 @@
static final int MODE_PICK_OR_CREATE_CONTACT = 42 | MODE_MASK_PICKER | MODE_MASK_CREATE_NEW
| MODE_MASK_SHOW_PHOTOS | MODE_MASK_DISABLE_QUIKCCONTACT;
/** Show all people through the legacy provider and pick them when clicking */
- static final int MODE_LEGACY_PICK_PERSON = 43 | MODE_MASK_PICKER | MODE_MASK_SHOW_PHOTOS
+ static final int MODE_LEGACY_PICK_PERSON = 43 | MODE_MASK_PICKER
| MODE_MASK_DISABLE_QUIKCCONTACT;
/** Show all people through the legacy provider as well as the option to create a new one */
static final int MODE_LEGACY_PICK_OR_CREATE_PERSON = 44 | MODE_MASK_PICKER
- | MODE_MASK_CREATE_NEW | MODE_MASK_SHOW_PHOTOS | MODE_MASK_DISABLE_QUIKCCONTACT;
+ | MODE_MASK_CREATE_NEW | MODE_MASK_DISABLE_QUIKCCONTACT;
/** Show all contacts and pick them when clicking, and allow creating a new contact */
static final int MODE_INSERT_OR_EDIT_CONTACT = 45 | MODE_MASK_PICKER | MODE_MASK_CREATE_NEW;
/** Show all phone numbers and pick them when clicking */
@@ -414,6 +414,9 @@
getContentResolver().delete(mSelectedContactUri, null, null);
}
}
+
+ // The size of a home screen shortcut icon.
+ private int mIconSize;
@Override
protected void onCreate(Bundle icicle) {
@@ -421,6 +424,8 @@
// Resolve the intent
final Intent intent = getIntent();
+
+ mIconSize = getResources().getDimensionPixelSize(android.R.dimen.app_icon_size);
// Allow the title to be set to a custom String using an extra on the intent
String title = intent.getStringExtra(UI.TITLE_EXTRA_KEY);
@@ -1309,9 +1314,9 @@
if (Intent.ACTION_VIEW.equals(mShortcutAction)) {
// This is a simple shortcut to view a contact.
shortcutIntent = new Intent(mShortcutAction, uri);
- final Bitmap icon = loadContactPhoto(id, null);
+ Bitmap icon = loadContactPhoto(id, null);
if (icon != null) {
- intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon);
+ intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, scaleToAppIconSize(icon));
} else {
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(this,
@@ -1375,10 +1380,9 @@
return null;
}
}
-
+
// Setup the drawing classes
- int iconSize = (int) r.getDimension(android.R.dimen.app_icon_size);
- Bitmap icon = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_8888);
+ Bitmap icon = createShortcutBitmap();
Canvas canvas = new Canvas(icon);
// Copy in the photo
@@ -1386,7 +1390,7 @@
photoPaint.setDither(true);
photoPaint.setFilterBitmap(true);
Rect src = new Rect(0,0, photo.getWidth(),photo.getHeight());
- Rect dst = new Rect(0,0, iconSize,iconSize);
+ Rect dst = new Rect(0,0, mIconSize, mIconSize);
canvas.drawBitmap(photo, src, dst, photoPaint);
// Create an overlay for the phone number type
@@ -1435,6 +1439,26 @@
return icon;
}
+
+ private Bitmap scaleToAppIconSize(Bitmap photo) {
+ // Setup the drawing classes
+ Bitmap icon = createShortcutBitmap();
+ Canvas canvas = new Canvas(icon);
+
+ // Copy in the photo
+ Paint photoPaint = new Paint();
+ photoPaint.setDither(true);
+ photoPaint.setFilterBitmap(true);
+ Rect src = new Rect(0,0, photo.getWidth(),photo.getHeight());
+ Rect dst = new Rect(0,0, mIconSize, mIconSize);
+ canvas.drawBitmap(photo, src, dst, photoPaint);
+
+ return icon;
+ }
+
+ private Bitmap createShortcutBitmap() {
+ return Bitmap.createBitmap(mIconSize, mIconSize, Bitmap.Config.ARGB_8888);
+ }
/**
* Returns the icon for the phone call action.
@@ -2334,7 +2358,7 @@
}
View v;
- if (convertView == null) {
+ if (convertView == null || convertView.getTag() == null) {
v = newView(mContext, cursor, parent);
} else {
v = convertView;
@@ -2472,8 +2496,11 @@
cache.nameView.setText(mUnknownNameText);
}
+ boolean hasPhone = cursor.getColumnCount() >= SUMMARY_HAS_PHONE_COLUMN_INDEX
+ && cursor.getInt(SUMMARY_HAS_PHONE_COLUMN_INDEX) != 0;
+
// Make the call button visible if requested.
- if (mDisplayCallButton) {
+ if (mDisplayCallButton && hasPhone) {
int pos = cursor.getPosition();
cache.callView.setVisibility(View.VISIBLE);
cache.callButton.setTag(pos);
diff --git a/src/com/android/contacts/ContactsUtils.java b/src/com/android/contacts/ContactsUtils.java
index 1e3b8ad..24f683f 100644
--- a/src/com/android/contacts/ContactsUtils.java
+++ b/src/com/android/contacts/ContactsUtils.java
@@ -37,6 +37,7 @@
import android.provider.ContactsContract.CommonDataKinds.Photo;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.Im.ProviderNames;
+import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -50,7 +51,6 @@
import java.util.ArrayList;
public class ContactsUtils {
-
private static final String TAG = "ContactsUtils";
/**
* Build the display title for the {@link Data#CONTENT_URI} entry in the
@@ -386,7 +386,6 @@
/**
* Utility for creating a standard tab indicator view.
*
- * @param context The label to display in the tab indicator. If null, not label will be displayed.
* @param parent The parent ViewGroup to attach the new view to.
* @param source The {@link ContactsSource} to build the tab view from.
* @return The tab indicator View.
@@ -401,6 +400,9 @@
/**
* Kick off an intent to initiate a call.
+ *
+ * @param phoneNumber must not be null.
+ * @throws NullPointerException when the given argument is null.
*/
public static void initiateCall(Context context, CharSequence phoneNumber) {
Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
@@ -410,6 +412,9 @@
/**
* Kick off an intent to initiate an Sms/Mms message.
+ *
+ * @param phoneNumber must not be null.
+ * @throws NullPointerException when the given argument is null.
*/
public static void initiateSms(Context context, CharSequence phoneNumber) {
Intent intent = new Intent(Intent.ACTION_SENDTO,
@@ -424,4 +429,47 @@
public static boolean isGraphic(CharSequence str) {
return !TextUtils.isEmpty(str) && TextUtils.isGraphic(str);
}
+
+ /**
+ * Returns true if two objects are considered equal. Two null references are equal here.
+ */
+ public static boolean areObjectsEqual(Object a, Object b) {
+ return a == b || (a != null && a.equals(b));
+ }
+
+ /**
+ * Returns true if two data with mimetypes which represent values in contact entries are
+ * considered equal.
+ */
+ public static final boolean areDataEqual(Context context, CharSequence mimetype1,
+ CharSequence data1, CharSequence mimetype2, CharSequence data2) {
+ if (TextUtils.equals(Phone.CONTENT_ITEM_TYPE, mimetype1)
+ && TextUtils.equals(Phone.CONTENT_ITEM_TYPE, mimetype2)) {
+ if (data1 == data2) {
+ return true;
+ }
+ if (data1 == null || data2 == null) {
+ return false;
+ }
+ return PhoneNumberUtils.compare(context, data1.toString(), data2.toString());
+ } else {
+ if (mimetype1 == mimetype2 && data1 == data2) {
+ return true;
+ }
+ return TextUtils.equals(mimetype1, mimetype2) && TextUtils.equals(data1, data2);
+ }
+ }
+
+ /**
+ * Returns true if two {@link Intent}s are both null, or have the same action.
+ */
+ public static final boolean areIntentActionEqual(Intent a, Intent b) {
+ if (a == b) {
+ return true;
+ }
+ if (a == null || b == null) {
+ return false;
+ }
+ return TextUtils.equals(a.getAction(), b.getAction());
+ }
}
diff --git a/src/com/android/contacts/ExportVCardActivity.java b/src/com/android/contacts/ExportVCardActivity.java
index baf2371..5bccc7a 100644
--- a/src/com/android/contacts/ExportVCardActivity.java
+++ b/src/com/android/contacts/ExportVCardActivity.java
@@ -36,6 +36,14 @@
import java.util.HashSet;
import java.util.Set;
+/**
+ * Class for exporting vCard.
+ *
+ * Note that this Activity assumes that the instance is a "one-shot Activity", which will be
+ * finished (with the method {@link Activity#finish()}) after the export and never reuse
+ * any Dialog in the instance. So this code is careless about the management around managed
+ * dialogs stuffs (like how onCreateDialog() is used).
+ */
public class ExportVCardActivity extends Activity {
private static final String LOG_TAG = "ExportVCardActivity";
@@ -102,7 +110,6 @@
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
mActualExportThread = new ActualExportThread(mFileName);
- mActualExportThread.start();
showDialog(R.id.dialog_exporting_vcard);
}
}
@@ -287,26 +294,23 @@
return builder.create();
}
case R.id.dialog_exporting_vcard: {
- return getExportingVCardDialog();
+ if (mProgressDialog == null) {
+ String title = getString(R.string.exporting_contact_list_title);
+ String message = getString(R.string.exporting_contact_list_message,
+ mExportingFileName);
+ mProgressDialog = new ProgressDialog(ExportVCardActivity.this);
+ mProgressDialog.setTitle(title);
+ mProgressDialog.setMessage(message);
+ mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ mProgressDialog.setOnCancelListener(mActualExportThread);
+ mActualExportThread.start();
+ }
+ return mProgressDialog;
}
}
return super.onCreateDialog(id);
}
- private Dialog getExportingVCardDialog() {
- if (mProgressDialog == null) {
- String title = getString(R.string.exporting_contact_list_title);
- String message = getString(R.string.exporting_contact_list_message,
- mExportingFileName);
- mProgressDialog = new ProgressDialog(ExportVCardActivity.this);
- mProgressDialog.setTitle(title);
- mProgressDialog.setMessage(message);
- mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- mProgressDialog.setOnCancelListener(mActualExportThread);
- }
- return mProgressDialog;
- }
-
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
if (id == R.id.dialog_fail_to_export_with_reason) {
diff --git a/src/com/android/contacts/ImportVCardActivity.java b/src/com/android/contacts/ImportVCardActivity.java
index 8fd9c0d..eb99c95 100644
--- a/src/com/android/contacts/ImportVCardActivity.java
+++ b/src/com/android/contacts/ImportVCardActivity.java
@@ -90,6 +90,11 @@
/**
* Class for importing vCard. Several user interaction will be required while reading
* (selecting a file, waiting a moment, etc.)
+ *
+ * Note that this Activity assumes that the instance is a "one-shot Activity", which will be
+ * finished (with the method {@link Activity#finish()}) after the import and never reuse
+ * any Dialog in the instance. So this code is careless about the management around managed
+ * dialogs stuffs (like how onCreateDialog() is used).
*/
public class ImportVCardActivity extends Activity {
private static final String LOG_TAG = "ImportVCardActivity";
@@ -334,6 +339,10 @@
is.close();
} catch (IOException e) {
}
+ if (builder instanceof VCardDataBuilder) {
+ // Let the object clean up internal temporal objects,
+ ((VCardDataBuilder)builder).clear();
+ }
is = new FileInputStream(canonicalPath);
try {
@@ -673,20 +682,6 @@
return builder.create();
}
- private Dialog getReadingVCardDialog() {
- if (mProgressDialogForReadVCard == null) {
- String title = getString(R.string.reading_vcard_title);
- String message = getString(R.string.reading_vcard_message);
- mProgressDialogForReadVCard = new ProgressDialog(this);
- mProgressDialogForReadVCard.setTitle(title);
- mProgressDialogForReadVCard.setMessage(message);
- mProgressDialogForReadVCard.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- mProgressDialogForReadVCard.setOnCancelListener(mVCardReadThread);
- mVCardReadThread.start();
- }
- return mProgressDialogForReadVCard;
- }
-
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
@@ -748,7 +743,17 @@
return getVCardFileSelectDialog(false);
}
case R.id.dialog_reading_vcard: {
- return getReadingVCardDialog();
+ if (mProgressDialogForReadVCard == null) {
+ String title = getString(R.string.reading_vcard_title);
+ String message = getString(R.string.reading_vcard_message);
+ mProgressDialogForReadVCard = new ProgressDialog(this);
+ mProgressDialogForReadVCard.setTitle(title);
+ mProgressDialogForReadVCard.setMessage(message);
+ mProgressDialogForReadVCard.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ mProgressDialogForReadVCard.setOnCancelListener(mVCardReadThread);
+ mVCardReadThread.start();
+ }
+ return mProgressDialogForReadVCard;
}
case R.id.dialog_io_exception: {
String message = (getString(R.string.scanning_sdcard_failed_message,
diff --git a/src/com/android/contacts/PhoneDisambigDialog.java b/src/com/android/contacts/PhoneDisambigDialog.java
index b727c77..e0295e3 100644
--- a/src/com/android/contacts/PhoneDisambigDialog.java
+++ b/src/com/android/contacts/PhoneDisambigDialog.java
@@ -136,11 +136,11 @@
private class PhoneItem implements Collapsible<PhoneItem> {
- String phoneNumber;
- long id;
+ final String phoneNumber;
+ final long id;
public PhoneItem(String newPhoneNumber, long newId) {
- phoneNumber = newPhoneNumber;
+ phoneNumber = (newPhoneNumber != null ? newPhoneNumber : "");
id = newId;
}
@@ -160,6 +160,7 @@
return false;
}
+ @Override
public String toString() {
return phoneNumber;
}
diff --git a/src/com/android/contacts/ViewContactActivity.java b/src/com/android/contacts/ViewContactActivity.java
index ca3c08a..909cf51 100644
--- a/src/com/android/contacts/ViewContactActivity.java
+++ b/src/com/android/contacts/ViewContactActivity.java
@@ -46,7 +46,9 @@
import android.database.ContentObserver;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
+import android.net.ParseException;
import android.net.Uri;
+import android.net.WebAddress;
import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
@@ -65,6 +67,7 @@
import android.provider.ContactsContract.CommonDataKinds.Organization;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
+import android.provider.ContactsContract.CommonDataKinds.Website;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
@@ -893,6 +896,18 @@
entry.uri = null;
entry.maxLines = 10;
mOtherEntries.add(entry);
+ } else if (Website.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
+ // Build note entries
+ entry.uri = null;
+ entry.maxLines = 10;
+ try {
+ WebAddress webAddress = new WebAddress(entry.data);
+ entry.intent = new Intent(Intent.ACTION_VIEW,
+ Uri.parse(webAddress.toString()));
+ } catch (ParseException e) {
+ Log.e(TAG, "Couldn't parse website: " + entry.data);
+ }
+ mOtherEntries.add(entry);
} else {
// Handle showing custom rows
entry.intent = new Intent(Intent.ACTION_VIEW, entry.uri);
@@ -1040,39 +1055,19 @@
return false;
}
- if (Phone.CONTENT_ITEM_TYPE.equals(mimetype)
- && Phone.CONTENT_ITEM_TYPE.equals(entry.mimetype)) {
- if (!PhoneNumberUtils.compare(this.context, data, entry.data)) {
- return false;
- }
- } else {
- if (!equals(data, entry.data)) {
- return false;
- }
+ if (!ContactsUtils.areDataEqual(context, mimetype, data, entry.mimetype, entry.data)) {
+ return false;
}
- if (!equals(mimetype, entry.mimetype)
- || !intentCollapsible(intent, entry.intent)
- || !intentCollapsible(secondaryIntent, entry.secondaryIntent)
+ if (!TextUtils.equals(mimetype, entry.mimetype)
+ || !ContactsUtils.areIntentActionEqual(intent, entry.intent)
+ || !ContactsUtils.areIntentActionEqual(secondaryIntent, entry.secondaryIntent)
|| actionIcon != entry.actionIcon) {
return false;
}
return true;
}
-
- private boolean equals(Object a, Object b) {
- return a==b || (a != null && a.equals(b));
- }
-
- private boolean intentCollapsible(Intent a, Intent b) {
- if (a == b) {
- return true;
- } else if ((a != null && b != null) && equals(a.getAction(), b.getAction())) {
- return true;
- }
- return false;
- }
}
/** Cache of the children views of a row */
diff --git a/src/com/android/contacts/model/Editor.java b/src/com/android/contacts/model/Editor.java
index b3e8443..473f0d3 100644
--- a/src/com/android/contacts/model/Editor.java
+++ b/src/com/android/contacts/model/Editor.java
@@ -18,6 +18,7 @@
import com.android.contacts.model.ContactsSource.DataKind;
import com.android.contacts.model.EntityDelta.ValuesDelta;
+import com.android.contacts.ui.ViewIdGenerator;
import android.provider.ContactsContract.Data;
@@ -50,7 +51,8 @@
* builds any needed views. Any changes performed by the user will be
* written back to that same object.
*/
- public void setValues(DataKind kind, ValuesDelta values, EntityDelta state, boolean readOnly);
+ public void setValues(DataKind kind, ValuesDelta values, EntityDelta state, boolean readOnly,
+ ViewIdGenerator vig);
/**
* Add a specific {@link EditorListener} to this {@link Editor}.
diff --git a/src/com/android/contacts/model/EntityDelta.java b/src/com/android/contacts/model/EntityDelta.java
index ae30806..1f152e1 100644
--- a/src/com/android/contacts/model/EntityDelta.java
+++ b/src/com/android/contacts/model/EntityDelta.java
@@ -571,14 +571,6 @@
return getAsLong(mIdColumn);
}
- /**
- * Return a valid integer value suitable for {@link View#setId(int)}.
- */
- public int getViewId() {
- final Long id = this.getId();
- return (id == null) ? View.NO_ID : id.intValue();
- }
-
public void setIdColumn(String idColumn) {
mIdColumn = idColumn;
}
diff --git a/src/com/android/contacts/ui/DisplayGroupsActivity.java b/src/com/android/contacts/ui/DisplayGroupsActivity.java
index ce68dcb..9ac46ce 100644
--- a/src/com/android/contacts/ui/DisplayGroupsActivity.java
+++ b/src/com/android/contacts/ui/DisplayGroupsActivity.java
@@ -334,7 +334,15 @@
*/
private static Comparator<GroupDelta> sIdComparator = new Comparator<GroupDelta>() {
public int compare(GroupDelta object1, GroupDelta object2) {
- return object1.getViewId() - object2.getViewId();
+ final long id1 = object1.getId();
+ final long id2 = object2.getId();
+ if (id1 < id2) {
+ return -1;
+ } else if (id1 > id2) {
+ return 1;
+ } else {
+ return 0;
+ }
}
};
diff --git a/src/com/android/contacts/ui/EditContactActivity.java b/src/com/android/contacts/ui/EditContactActivity.java
index 914a2e8..6172c33 100644
--- a/src/com/android/contacts/ui/EditContactActivity.java
+++ b/src/com/android/contacts/ui/EditContactActivity.java
@@ -30,6 +30,7 @@
import com.android.contacts.model.Editor.EditorListener;
import com.android.contacts.model.EntityDelta.ValuesDelta;
import com.android.contacts.ui.widget.BaseContactEditorView;
+import com.android.contacts.ui.widget.ContactEditorView;
import com.android.contacts.ui.widget.PhotoEditorView;
import com.android.contacts.util.EmptyService;
import com.android.contacts.util.WeakAsyncTask;
@@ -99,6 +100,7 @@
private static final String KEY_EDIT_STATE = "state";
private static final String KEY_RAW_CONTACT_ID_REQUESTING_PHOTO = "photorequester";
+ private static final String KEY_VIEW_ID_GENERATOR = "viewidgenerator";
/** The result code when view activity should close after edit returns */
public static final int RESULT_CLOSE_VIEW_ACTIVITY = 777;
@@ -124,6 +126,8 @@
private ArrayList<Dialog> mManagedDialogs = Lists.newArrayList();
+ private ViewIdGenerator mViewIdGenerator;
+
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -149,6 +153,11 @@
// Trigger dialog to pick account type
doAddAction();
}
+
+ if (icicle == null) {
+ // If icicle is non-null, onRestoreInstanceState() will restore the generator.
+ mViewIdGenerator = new ViewIdGenerator();
+ }
}
private static class QueryEntitiesTask extends
@@ -223,6 +232,7 @@
}
outState.putLong(KEY_RAW_CONTACT_ID_REQUESTING_PHOTO, mRawContactIdRequestingPhoto);
+ outState.putParcelable(KEY_VIEW_ID_GENERATOR, mViewIdGenerator);
super.onSaveInstanceState(outState);
}
@@ -232,6 +242,7 @@
mState = savedInstanceState.<EntitySet> getParcelable(KEY_EDIT_STATE);
mRawContactIdRequestingPhoto = savedInstanceState.getLong(
KEY_RAW_CONTACT_ID_REQUESTING_PHOTO);
+ mViewIdGenerator = savedInstanceState.getParcelable(KEY_VIEW_ID_GENERATOR);
bindEditors();
super.onRestoreInstanceState(savedInstanceState);
@@ -357,7 +368,7 @@
photoEditor));
mContent.addView(editor);
- editor.setState(entity, source);
+ editor.setState(entity, source, mViewIdGenerator);
}
// Show editor now that we've loaded state
diff --git a/src/com/android/contacts/ui/QuickContactWindow.java b/src/com/android/contacts/ui/QuickContactWindow.java
index e787987..f43c17e 100644
--- a/src/com/android/contacts/ui/QuickContactWindow.java
+++ b/src/com/android/contacts/ui/QuickContactWindow.java
@@ -16,6 +16,7 @@
package com.android.contacts.ui;
+import com.android.contacts.Collapser;
import com.android.contacts.ContactsUtils;
import com.android.contacts.R;
import com.android.contacts.model.ContactsSource;
@@ -87,6 +88,7 @@
import android.widget.Toast;
import java.lang.ref.SoftReference;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
@@ -658,7 +660,7 @@
* Abstract definition of an action that could be performed, along with
* string description and icon.
*/
- private interface Action {
+ private interface Action extends Collapser.Collapsible<Action> {
public CharSequence getHeader();
public CharSequence getBody();
@@ -844,6 +846,39 @@
public Intent getIntent() {
return mIntent;
}
+
+ /** {@inheritDoc} */
+ public boolean collapseWith(Action other) {
+ if (!shouldCollapseWith(other)) {
+ return false;
+ }
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ public boolean shouldCollapseWith(Action t) {
+ if (t == null) {
+ return false;
+ }
+ if (!(t instanceof DataAction)) {
+ Log.e(TAG, "t must be DataAction");
+ return false;
+ }
+ DataAction other = (DataAction)t;
+ if (!ContactsUtils.areObjectsEqual(mKind, other.mKind)) {
+ return false;
+ }
+ if (!ContactsUtils.areDataEqual(mContext, mMimeType, mBody, other.mMimeType,
+ other.mBody)) {
+ return false;
+ }
+ if (!TextUtils.equals(mMimeType, other.mMimeType)
+ || !ContactsUtils.areIntentActionEqual(mIntent, other.mIntent)
+ ) {
+ return false;
+ }
+ return true;
+ }
}
/**
@@ -895,6 +930,15 @@
return null;
}
+ /** {@inheritDoc} */
+ public boolean collapseWith(Action t) {
+ return false; // Never dup.
+ }
+
+ /** {@inheritDoc} */
+ public boolean shouldCollapseWith(Action t) {
+ return false; // Never dup.
+ }
}
/**
@@ -1039,7 +1083,7 @@
* Provide a strongly-typed {@link LinkedList} that holds a list of
* {@link Action} objects.
*/
- private class ActionList extends LinkedList<Action> {
+ private class ActionList extends ArrayList<Action> {
}
/**
@@ -1219,8 +1263,8 @@
}
/**
- * Inflate the in-track view for the action of the given MIME-type. Will use
- * the icon provided by the {@link DataKind}.
+ * Inflate the in-track view for the action of the given MIME-type, collapsing duplicate values.
+ * Will use the icon provided by the {@link DataKind}.
*/
private View inflateAction(String mimeType) {
final CheckableImageView view = (CheckableImageView)obtainView();
@@ -1228,6 +1272,9 @@
// Add direct intent if single child, otherwise flag for multiple
ActionList children = mActions.get(mimeType);
+ if (children.size() > 1) {
+ Collapser.collapseList(children);
+ }
Action firstInfo = children.get(0);
if (children.size() == 1) {
view.setTag(firstInfo);
diff --git a/src/com/android/contacts/ui/ViewIdGenerator.java b/src/com/android/contacts/ui/ViewIdGenerator.java
new file mode 100644
index 0000000..f7281d4
--- /dev/null
+++ b/src/com/android/contacts/ui/ViewIdGenerator.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2009 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.ui;
+
+import com.android.contacts.model.EntityDelta;
+import com.android.contacts.model.ContactsSource.DataKind;
+import com.android.contacts.model.EntityDelta.ValuesDelta;
+import com.android.contacts.ui.widget.GenericEditorView;
+import com.android.contacts.ui.widget.KindSectionView;
+
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * A class that provides unique view ids for {@link ContentEditorView}, {@link KindSectionView},
+ * {@link GenericEditorView} and {@link EditView} on {@link EditContactActivity}.
+ * It is used to assign a unique but consistent id to each view across {@link EditContactActivity}'s
+ * lifecycle, so that we can re-construct view state (e.g. focused view) when the screen rotates.
+ *
+ * <p>This class is not thread safe.
+ */
+public final class ViewIdGenerator implements Parcelable {
+ private static final int INVALID_VIEW_ID = 0;
+ private static final int INITIAL_VIEW_ID = 1;
+
+ public static final int NO_VIEW_INDEX = -1;
+
+ private int mNextId;
+
+ /**
+ * Used as a map from the "key" of the views to actual ids. {@link #getId()} generates keys for
+ * the views.
+ */
+ private Bundle mIdMap = new Bundle();
+
+ private static final char KEY_SEPARATOR = '*';
+
+ private final static StringBuilder sWorkStringBuilder = new StringBuilder();
+
+ public ViewIdGenerator() {
+ mNextId = INITIAL_VIEW_ID;
+ }
+
+ /** {@inheritDoc} */
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * Returns an id for a view associated with specified contact field.
+ *
+ * @param entity {@link EntityDelta} associated with the view
+ * @param kind {@link DataKind} associated with the view, or null if none exists.
+ * @param values {@link ValuesDelta} associated with the view, or null if none exists.
+ * @param viewIndex index of the view in the parent {@link Editor}, if it's a leave view.
+ * Otherwise, pass {@link #NO_VIEW_INDEX}.
+ */
+ public int getId(EntityDelta entity, DataKind kind, ValuesDelta values,
+ int viewIndex) {
+ final String k = getMapKey(entity, kind, values, viewIndex);
+
+ int id = mIdMap.getInt(k, INVALID_VIEW_ID);
+ if (id == INVALID_VIEW_ID) {
+ // Make sure the new id won't conflict with auto-generated ids by masking with 0xffff.
+ id = (mNextId++) & 0xFFFF;
+ mIdMap.putInt(k, id);
+ }
+ return id;
+ }
+
+ private static String getMapKey(EntityDelta entity, DataKind kind, ValuesDelta values,
+ int viewIndex) {
+ sWorkStringBuilder.setLength(0);
+ if (entity != null) {
+ sWorkStringBuilder.append(entity.getValues().getId());
+
+ if (kind != null) {
+ sWorkStringBuilder.append(KEY_SEPARATOR);
+ sWorkStringBuilder.append(kind.mimeType);
+
+ if (values != null) {
+ sWorkStringBuilder.append(KEY_SEPARATOR);
+ sWorkStringBuilder.append(values.getId());
+
+ if (viewIndex != NO_VIEW_INDEX) {
+ sWorkStringBuilder.append(KEY_SEPARATOR);
+ sWorkStringBuilder.append(viewIndex);
+ }
+ }
+ }
+ }
+ return sWorkStringBuilder.toString();
+ }
+
+ /** {@Override} */
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mNextId);
+ dest.writeBundle(mIdMap);
+ }
+
+ private void readFromParcel(Parcel src) {
+ mNextId = src.readInt();
+ mIdMap = src.readBundle();
+ }
+
+ public static final Parcelable.Creator<ViewIdGenerator> CREATOR =
+ new Parcelable.Creator<ViewIdGenerator>() {
+ public ViewIdGenerator createFromParcel(Parcel in) {
+ final ViewIdGenerator vig = new ViewIdGenerator();
+ vig.readFromParcel(in);
+ return vig;
+ }
+
+ public ViewIdGenerator[] newArray(int size) {
+ return new ViewIdGenerator[size];
+ }
+ };
+}
diff --git a/src/com/android/contacts/ui/widget/BaseContactEditorView.java b/src/com/android/contacts/ui/widget/BaseContactEditorView.java
index 189e2d5..c2f9136 100644
--- a/src/com/android/contacts/ui/widget/BaseContactEditorView.java
+++ b/src/com/android/contacts/ui/widget/BaseContactEditorView.java
@@ -22,6 +22,7 @@
import com.android.contacts.model.ContactsSource.EditType;
import com.android.contacts.model.Editor.EditorListener;
import com.android.contacts.model.EntityDelta.ValuesDelta;
+import com.android.contacts.ui.ViewIdGenerator;
import android.content.Context;
import android.content.Entity;
@@ -95,7 +96,7 @@
* {@link EntityDelta} state and the {@link ContactsSource} that
* apply to that state.
*/
- public abstract void setState(EntityDelta state, ContactsSource source);
+ public abstract void setState(EntityDelta state, ContactsSource source, ViewIdGenerator vig);
/**
* Sets the {@link EditorListener} on the name field
diff --git a/src/com/android/contacts/ui/widget/ContactEditorView.java b/src/com/android/contacts/ui/widget/ContactEditorView.java
index 1720822..2de9ec6 100644
--- a/src/com/android/contacts/ui/widget/ContactEditorView.java
+++ b/src/com/android/contacts/ui/widget/ContactEditorView.java
@@ -24,6 +24,7 @@
import com.android.contacts.model.ContactsSource.EditType;
import com.android.contacts.model.Editor.EditorListener;
import com.android.contacts.model.EntityDelta.ValuesDelta;
+import com.android.contacts.ui.ViewIdGenerator;
import android.content.Context;
import android.content.Entity;
@@ -149,7 +150,7 @@
* apply to that state.
*/
@Override
- public void setState(EntityDelta state, ContactsSource source) {
+ public void setState(EntityDelta state, ContactsSource source, ViewIdGenerator vig) {
// Remove any existing sections
mGeneral.removeAllViews();
mSecondary.removeAllViews();
@@ -157,6 +158,8 @@
// Bail if invalid state or source
if (state == null || source == null) return;
+ setId(vig.getId(state, null, null, ViewIdGenerator.NO_VIEW_INDEX));
+
// Make sure we have StructuredName
EntityModifier.ensureKindExists(state, source, StructuredName.CONTENT_ITEM_TYPE);
@@ -208,7 +211,7 @@
// Handle special case editor for structured name
final ValuesDelta primary = state.getPrimaryEntry(mimeType);
if (!readOnly) {
- mName.setValues(kind, primary, state, source.readOnly);
+ mName.setValues(kind, primary, state, source.readOnly, vig);
} else {
String displayName = primary.getAsString(StructuredName.DISPLAY_NAME);
mReadOnlyName.setText(displayName);
@@ -216,7 +219,7 @@
} else if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
// Handle special case editor for photos
final ValuesDelta primary = state.getPrimaryEntry(mimeType);
- mPhoto.setValues(kind, primary, state, source.readOnly);
+ mPhoto.setValues(kind, primary, state, source.readOnly, vig);
if (readOnly && !mPhoto.hasSetPhoto()) {
mPhotoStub.setVisibility(View.GONE);
} else {
@@ -228,8 +231,7 @@
final ViewGroup parent = kind.secondary ? mSecondary : mGeneral;
final KindSectionView section = (KindSectionView)mInflater.inflate(
R.layout.item_kind_section, parent, false);
- section.setState(kind, state, source.readOnly);
- section.setId(kind.weight);
+ section.setState(kind, state, source.readOnly, vig);
parent.addView(section);
}
}
diff --git a/src/com/android/contacts/ui/widget/GenericEditorView.java b/src/com/android/contacts/ui/widget/GenericEditorView.java
index e1fdd71..c9b9c50 100644
--- a/src/com/android/contacts/ui/widget/GenericEditorView.java
+++ b/src/com/android/contacts/ui/widget/GenericEditorView.java
@@ -25,6 +25,7 @@
import com.android.contacts.model.ContactsSource.EditField;
import com.android.contacts.model.ContactsSource.EditType;
import com.android.contacts.model.EntityDelta.ValuesDelta;
+import com.android.contacts.ui.ViewIdGenerator;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -79,6 +80,8 @@
// Used only when a user tries to use custom label.
private EditType mPendingType;
+ private ViewIdGenerator mViewIdGenerator;
+
public GenericEditorView(Context context) {
super(context);
}
@@ -160,18 +163,21 @@
}
private void rebuildValues() {
- setValues(mKind, mEntry, mState, mReadOnly);
+ setValues(mKind, mEntry, mState, mReadOnly, mViewIdGenerator);
}
/**
* Prepare this editor using the given {@link DataKind} for defining
* structure and {@link ValuesDelta} describing the content to edit.
*/
- public void setValues(DataKind kind, ValuesDelta entry, EntityDelta state, boolean readOnly) {
+ public void setValues(DataKind kind, ValuesDelta entry, EntityDelta state, boolean readOnly,
+ ViewIdGenerator vig) {
mKind = kind;
mEntry = entry;
mState = state;
mReadOnly = readOnly;
+ mViewIdGenerator = vig;
+ setId(vig.getId(state, kind, entry, ViewIdGenerator.NO_VIEW_INDEX));
final boolean enabled = !readOnly;
@@ -195,9 +201,11 @@
// Build out set of fields
mFields.removeAllViews();
boolean hidePossible = false;
+ int n = 0;
for (EditField field : kind.fieldList) {
// Inflate field from definition
EditText fieldView = (EditText)mInflater.inflate(RES_FIELD, mFields, false);
+ fieldView.setId(vig.getId(state, kind, entry, n++));
if (field.titleRes > 0) {
fieldView.setHint(field.titleRes);
}
diff --git a/src/com/android/contacts/ui/widget/KindSectionView.java b/src/com/android/contacts/ui/widget/KindSectionView.java
index b52cfd0..e379b69 100644
--- a/src/com/android/contacts/ui/widget/KindSectionView.java
+++ b/src/com/android/contacts/ui/widget/KindSectionView.java
@@ -23,6 +23,7 @@
import com.android.contacts.model.ContactsSource.DataKind;
import com.android.contacts.model.Editor.EditorListener;
import com.android.contacts.model.EntityDelta.ValuesDelta;
+import com.android.contacts.ui.ViewIdGenerator;
import android.content.Context;
import android.provider.ContactsContract.Data;
@@ -52,6 +53,8 @@
private EntityDelta mState;
private boolean mReadOnly;
+ private ViewIdGenerator mViewIdGenerator;
+
public KindSectionView(Context context) {
super(context);
}
@@ -88,10 +91,13 @@
// Ignore requests
}
- public void setState(DataKind kind, EntityDelta state, boolean readOnly) {
+ public void setState(DataKind kind, EntityDelta state, boolean readOnly, ViewIdGenerator vig) {
mKind = kind;
mState = state;
mReadOnly = readOnly;
+ mViewIdGenerator = vig;
+
+ setId(mViewIdGenerator.getId(state, kind, null, ViewIdGenerator.NO_VIEW_INDEX));
// TODO: handle resources from remote packages
mTitle.setText(kind.titleRes);
@@ -116,9 +122,8 @@
final GenericEditorView editor = (GenericEditorView)mInflater.inflate(
R.layout.item_generic_editor, mEditors, false);
- editor.setValues(mKind, entry, mState, mReadOnly);
+ editor.setValues(mKind, entry, mState, mReadOnly, mViewIdGenerator);
editor.setEditorListener(this);
- editor.setId(entry.getViewId());
mEditors.addView(editor);
}
}
@@ -138,9 +143,16 @@
/** {@inheritDoc} */
public void onClick(View v) {
// Insert a new child and rebuild
- EntityModifier.insertChild(mState, mKind);
+ final ValuesDelta newValues = EntityModifier.insertChild(mState, mKind);
this.rebuildFromState();
this.updateAddEnabled();
this.updateEditorsVisible();
+
+ // Find the newly added EditView and set focus.
+ final int newFieldId = mViewIdGenerator.getId(mState, mKind, newValues, 0);
+ final View newField = findViewById(newFieldId);
+ if (newField != null) {
+ newField.requestFocus();
+ }
}
}
diff --git a/src/com/android/contacts/ui/widget/PhotoEditorView.java b/src/com/android/contacts/ui/widget/PhotoEditorView.java
index f117091..eff39d0 100644
--- a/src/com/android/contacts/ui/widget/PhotoEditorView.java
+++ b/src/com/android/contacts/ui/widget/PhotoEditorView.java
@@ -21,6 +21,7 @@
import com.android.contacts.model.ContactsSource.DataKind;
import com.android.contacts.model.EntityDelta.ValuesDelta;
import com.android.contacts.model.Editor;
+import com.android.contacts.ui.ViewIdGenerator;
import android.content.Context;
import android.graphics.Bitmap;
@@ -75,9 +76,13 @@
}
/** {@inheritDoc} */
- public void setValues(DataKind kind, ValuesDelta values, EntityDelta state, boolean readOnly) {
+ public void setValues(DataKind kind, ValuesDelta values, EntityDelta state, boolean readOnly,
+ ViewIdGenerator vig) {
mEntry = values;
mReadOnly = readOnly;
+
+ setId(vig.getId(state, kind, values, 0));
+
if (values != null) {
// Try decoding photo if actual entry
final byte[] photoBytes = values.getAsByteArray(Photo.PHOTO);
diff --git a/src/com/android/contacts/ui/widget/ReadOnlyContactEditorView.java b/src/com/android/contacts/ui/widget/ReadOnlyContactEditorView.java
index a5f8eb6..4635f6a 100644
--- a/src/com/android/contacts/ui/widget/ReadOnlyContactEditorView.java
+++ b/src/com/android/contacts/ui/widget/ReadOnlyContactEditorView.java
@@ -24,6 +24,7 @@
import com.android.contacts.model.ContactsSource.EditType;
import com.android.contacts.model.Editor.EditorListener;
import com.android.contacts.model.EntityDelta.ValuesDelta;
+import com.android.contacts.ui.ViewIdGenerator;
import android.content.Context;
import android.content.Entity;
@@ -101,7 +102,7 @@
* TODO: make this more generic using data from the source
*/
@Override
- public void setState(EntityDelta state, ContactsSource source) {
+ public void setState(EntityDelta state, ContactsSource source, ViewIdGenerator vig) {
// Remove any existing sections
mGeneral.removeAllViews();
@@ -135,7 +136,7 @@
EntityModifier.ensureKindExists(state, source, Photo.CONTENT_ITEM_TYPE);
mHasPhotoEditor = (source.getKindForMimetype(Photo.CONTENT_ITEM_TYPE) != null);
primary = state.getPrimaryEntry(Photo.CONTENT_ITEM_TYPE);
- mPhoto.setValues(kind, primary, state, source.readOnly);
+ mPhoto.setValues(kind, primary, state, source.readOnly, vig);
if (!mHasPhotoEditor || !mPhoto.hasSetPhoto()) {
mPhotoStub.setVisibility(View.GONE);
} else {
diff --git a/tests/src/com/android/contacts/ContactsUtilsTests.java b/tests/src/com/android/contacts/ContactsUtilsTests.java
index 01a1ef4..d4d4e5b 100644
--- a/tests/src/com/android/contacts/ContactsUtilsTests.java
+++ b/tests/src/com/android/contacts/ContactsUtilsTests.java
@@ -21,6 +21,7 @@
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Im;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
@@ -98,4 +99,61 @@
public void testIsGraphicPunctuation() throws Exception {
assertTrue(ContactsUtils.isGraphic("."));
}
+
+ public void testAreObjectsEqual() throws Exception {
+ assertTrue("null:null", ContactsUtils.areObjectsEqual(null, null));
+ assertTrue("1:1", ContactsUtils.areObjectsEqual(1, 1));
+
+ assertFalse("null:1", ContactsUtils.areObjectsEqual(null, 1));
+ assertFalse("1:null", ContactsUtils.areObjectsEqual(1, null));
+ assertFalse("1:2", ContactsUtils.areObjectsEqual(1, 2));
+ }
+
+ public void testAreDataEqual() throws Exception {
+ checkAreDataEqual("1", true, null, null, null, null);
+ checkAreDataEqual("2", true, "a", "b", "a", "b");
+
+ checkAreDataEqual("11", false, "a", null, null, null);
+ checkAreDataEqual("12", false, null, "a", null, null);
+ checkAreDataEqual("13", false, null, null, "a", null);
+ checkAreDataEqual("14", false, null, null, null, "a");
+
+ checkAreDataEqual("21", false, "a", "b", null, null);
+ checkAreDataEqual("22", false, "a", "b", "a", null);
+ checkAreDataEqual("23", false, "a", "b", null, "b");
+ checkAreDataEqual("24", false, "a", "b", "a", "x");
+ checkAreDataEqual("25", false, "a", "b", "x", "b");
+
+ checkAreDataEqual("31", false, null, null, "a", "b");
+ checkAreDataEqual("32", false, "a", null, "a", "b");
+ checkAreDataEqual("33", false, null, "b", "a", "b");
+ checkAreDataEqual("34", false, "a", "x", "a", "b");
+ checkAreDataEqual("35", false, "x", "b", "a", "b");
+
+ checkAreDataEqual("41", true, Phone.CONTENT_ITEM_TYPE, null, Phone.CONTENT_ITEM_TYPE,
+ null);
+ checkAreDataEqual("42", true, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, "1");
+
+ checkAreDataEqual("51", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, "2");
+ checkAreDataEqual("52", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, null);
+ checkAreDataEqual("53", false, Phone.CONTENT_ITEM_TYPE, null, Phone.CONTENT_ITEM_TYPE, "2");
+ }
+
+ private void checkAreDataEqual(String message, boolean expected, CharSequence mimetype1,
+ CharSequence data1, CharSequence mimetype2, CharSequence data2) {
+ assertEquals(message, expected,
+ ContactsUtils.areDataEqual(mContext, mimetype1, data1, mimetype2, data2));
+ }
+
+ public void testAreIntentActionEqual() throws Exception {
+ assertTrue("1", ContactsUtils.areIntentActionEqual(null, null));
+ assertTrue("1", ContactsUtils.areIntentActionEqual(new Intent("a"), new Intent("a")));
+
+ assertFalse("11", ContactsUtils.areIntentActionEqual(new Intent("a"), null));
+ assertFalse("12", ContactsUtils.areIntentActionEqual(null, new Intent("a")));
+
+ assertFalse("21", ContactsUtils.areIntentActionEqual(new Intent("a"), new Intent()));
+ assertFalse("22", ContactsUtils.areIntentActionEqual(new Intent(), new Intent("b")));
+ assertFalse("23", ContactsUtils.areIntentActionEqual(new Intent("a"), new Intent("b")));
+ }
}
diff --git a/tests/src/com/android/contacts/RecentCallsListActivityTests.java b/tests/src/com/android/contacts/RecentCallsListActivityTests.java
index 2cdd8d7..afa1a7a 100644
--- a/tests/src/com/android/contacts/RecentCallsListActivityTests.java
+++ b/tests/src/com/android/contacts/RecentCallsListActivityTests.java
@@ -276,7 +276,7 @@
duration = mRnd.nextInt(10 * 60); // 0 - 10 minutes random.
}
row.add(duration); // duration
- if (mVoicemail.equals(number)) {
+ if (mVoicemail != null && mVoicemail.equals(number)) {
assertEquals(Calls.OUTGOING_TYPE, type);
}
row.add(type); // type
@@ -309,7 +309,10 @@
* @param duration In seconds of the call. Use RAND_DURATION to pick a random one.
*/
private void insertVoicemail(long date, int duration) {
- insert(mVoicemail, date, duration, Calls.OUTGOING_TYPE);
+ // mVoicemail may be null
+ if (mVoicemail != null) {
+ insert(mVoicemail, date, duration, Calls.OUTGOING_TYPE);
+ }
}
/**