OSDN Git Service

Code drop from //branches/cupcake/...@124589
authorThe Android Open Source Project <initial-contribution@android.com>
Thu, 18 Dec 2008 02:05:55 +0000 (18:05 -0800)
committerThe Android Open Source Project <initial-contribution@android.com>
Thu, 18 Dec 2008 02:05:55 +0000 (18:05 -0800)
53 files changed:
Android.mk
AndroidManifest.xml
res/drawable-finger/backpanel_bottom_white.9.png [deleted file]
res/drawable-finger/btn_dial_textfield_activated_full.9.png [deleted file]
res/drawable-finger/btn_dial_textfield_normal_full.9.png [deleted file]
res/drawable-finger/btn_dial_textfield_pressed_full.9.png [deleted file]
res/drawable-finger/btn_dial_textfield_selected_full.9.png [deleted file]
res/drawable-finger/header_bottom_white.9.png [deleted file]
res/drawable-finger/ic_btn_write_sms.png [deleted file]
res/drawable-finger/ic_dialer_fork_add_call.png [new file with mode: 0644]
res/drawable-finger/ic_dialer_fork_current_call.png [new file with mode: 0644]
res/drawable-finger/ic_dialer_fork_tt_keypad.png [new file with mode: 0644]
res/drawable-finger/ic_menu_add_picture.png [new file with mode: 0644]
res/drawable-finger/ic_menu_contact.png [deleted file]
res/drawable-finger/ic_menu_dialer.png [deleted file]
res/drawable-finger/ic_menu_import_contact.png [new file with mode: 0755]
res/drawable-finger/ic_menu_refresh.png [new file with mode: 0755]
res/drawable-finger/ic_menu_send.png [deleted file]
res/drawable-finger/ic_menu_show_barcode.png [new file with mode: 0755]
res/drawable/dialog_full_dark.9.png [deleted file]
res/drawable/ic_launcher_contacts_phones.png [new file with mode: 0644]
res/drawable/ic_launcher_contacts_starred.png [new file with mode: 0644]
res/layout-finger/contacts_list_content.xml
res/layout-finger/dialpad_chooser_list_item.xml [new file with mode: 0644]
res/layout-finger/edit_contact.xml
res/layout-finger/sync_settings.xml [new file with mode: 0644]
res/layout-finger/twelve_key_dialer.xml
res/layout-land-finger/twelve_key_dialer.xml
res/values-cs/strings.xml
res/values-de-rDE/strings.xml [deleted file]
res/values-de/strings.xml [new file with mode: 0644]
res/values-en-rGB/strings.xml
res/values-es-rUS/strings.xml
res/values-fr-rFR/strings.xml [deleted file]
res/values-it-rIT/strings.xml [deleted file]
res/values-ja/strings.xml [new file with mode: 0644]
res/values-nl-rNL/strings.xml
res/values-zh-rTW/strings.xml [deleted file]
res/values/strings.xml
res/values/styles.xml [deleted file]
res/xml/preferences.xml [deleted file]
src/com/android/contacts/AlphabetIndexer.java [deleted file]
src/com/android/contacts/AttachImage.java
src/com/android/contacts/ContactsGroupSyncSelector.java
src/com/android/contacts/ContactsListActivity.java
src/com/android/contacts/ContactsLiveFolders.java [new file with mode: 0644]
src/com/android/contacts/ContactsPreferenceActivity.java [deleted file]
src/com/android/contacts/EditContactActivity.java
src/com/android/contacts/FastScrollView.java [deleted file]
src/com/android/contacts/RecentCallsListActivity.java
src/com/android/contacts/SpecialCharSequenceMgr.java
src/com/android/contacts/TwelveKeyDialer.java
src/com/android/contacts/ViewContactActivity.java

index 777b053..6a84c0c 100644 (file)
@@ -5,9 +5,13 @@ LOCAL_MODULE_TAGS := user development
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
+LOCAL_STATIC_JAVA_LIBRARIES := googlelogin-client
+
 LOCAL_PACKAGE_NAME := Contacts
 LOCAL_CERTIFICATE := shared
 
+LOCAL_STATIC_JAVA_LIBRARIES := googlelogin-client
+
 include $(BUILD_PACKAGE)
 
 # Use the folloing include to make our test apk.
index 8445355..949bfc8 100644 (file)
@@ -24,6 +24,7 @@
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
+    <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH.mail" />
 
     <application
         android:label="@string/contactsList"
         </activity>
 
         <!-- Edits the details of a single contact -->
-        <activity android:name="EditContactActivity">
+        <activity android:name="EditContactActivity"
+                android:windowSoftInputMode="stateVisible|adjustResize">
             <intent-filter android:label="@string/editContactDescription">
                 <action android:name="android.intent.action.EDIT" />
                 <category android:name="android.intent.category.DEFAULT" />
             />
         </activity>        
 
-        <!-- Preferences activity -->
-        <activity android:name="ContactsPreferenceActivity" />
-
         <!-- Activity used to select the groups that should be synced -->
-        <activity android:name="ContactsGroupSyncSelector" />
+        <activity android:name="ContactsGroupSyncSelector"
+            android:label="@string/seclectSyncGroups_title"
+        />
 
         <!-- Makes .ContactsListActivity the search target for any activity in Contacts -->
         <meta-data android:name="android.app.default_searchable" 
                    android:value=".ContactsListActivity" />
-        
+
+
+        <!-- LIVE FOLDERS -->
+        <activity
+            android:name=".ContactsLiveFolders$AllContacts"
+            android:label="@string/liveFolderAll"
+            android:icon="@drawable/ic_launcher_contacts">
+            <intent-filter>
+                <action android:name="android.intent.action.CREATE_LIVE_FOLDER" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:name=".ContactsLiveFolders$StarredContacts"
+            android:label="@string/liveFolderFavorites"
+            android:icon="@drawable/ic_launcher_contacts_starred">
+            <intent-filter>
+                <action android:name="android.intent.action.CREATE_LIVE_FOLDER" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:name=".ContactsLiveFolders$PhoneContacts"
+            android:label="@string/liveFolderPhone"
+            android:icon="@drawable/ic_launcher_contacts_phones">
+            <intent-filter>
+                <action android:name="android.intent.action.CREATE_LIVE_FOLDER" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
     </application>
 </manifest>
 
diff --git a/res/drawable-finger/backpanel_bottom_white.9.png b/res/drawable-finger/backpanel_bottom_white.9.png
deleted file mode 100644 (file)
index ffcc228..0000000
Binary files a/res/drawable-finger/backpanel_bottom_white.9.png and /dev/null differ
diff --git a/res/drawable-finger/btn_dial_textfield_activated_full.9.png b/res/drawable-finger/btn_dial_textfield_activated_full.9.png
deleted file mode 100644 (file)
index f0a571c..0000000
Binary files a/res/drawable-finger/btn_dial_textfield_activated_full.9.png and /dev/null differ
diff --git a/res/drawable-finger/btn_dial_textfield_normal_full.9.png b/res/drawable-finger/btn_dial_textfield_normal_full.9.png
deleted file mode 100644 (file)
index 261d130..0000000
Binary files a/res/drawable-finger/btn_dial_textfield_normal_full.9.png and /dev/null differ
diff --git a/res/drawable-finger/btn_dial_textfield_pressed_full.9.png b/res/drawable-finger/btn_dial_textfield_pressed_full.9.png
deleted file mode 100644 (file)
index 7db856b..0000000
Binary files a/res/drawable-finger/btn_dial_textfield_pressed_full.9.png and /dev/null differ
diff --git a/res/drawable-finger/btn_dial_textfield_selected_full.9.png b/res/drawable-finger/btn_dial_textfield_selected_full.9.png
deleted file mode 100644 (file)
index 2667868..0000000
Binary files a/res/drawable-finger/btn_dial_textfield_selected_full.9.png and /dev/null differ
diff --git a/res/drawable-finger/header_bottom_white.9.png b/res/drawable-finger/header_bottom_white.9.png
deleted file mode 100644 (file)
index 5d06aec..0000000
Binary files a/res/drawable-finger/header_bottom_white.9.png and /dev/null differ
diff --git a/res/drawable-finger/ic_btn_write_sms.png b/res/drawable-finger/ic_btn_write_sms.png
deleted file mode 100644 (file)
index 0f2cf07..0000000
Binary files a/res/drawable-finger/ic_btn_write_sms.png and /dev/null differ
diff --git a/res/drawable-finger/ic_dialer_fork_add_call.png b/res/drawable-finger/ic_dialer_fork_add_call.png
new file mode 100644 (file)
index 0000000..5a1555b
Binary files /dev/null and b/res/drawable-finger/ic_dialer_fork_add_call.png differ
diff --git a/res/drawable-finger/ic_dialer_fork_current_call.png b/res/drawable-finger/ic_dialer_fork_current_call.png
new file mode 100644 (file)
index 0000000..1be783e
Binary files /dev/null and b/res/drawable-finger/ic_dialer_fork_current_call.png differ
diff --git a/res/drawable-finger/ic_dialer_fork_tt_keypad.png b/res/drawable-finger/ic_dialer_fork_tt_keypad.png
new file mode 100644 (file)
index 0000000..4e3dd82
Binary files /dev/null and b/res/drawable-finger/ic_dialer_fork_tt_keypad.png differ
diff --git a/res/drawable-finger/ic_menu_add_picture.png b/res/drawable-finger/ic_menu_add_picture.png
new file mode 100644 (file)
index 0000000..35f10b8
Binary files /dev/null and b/res/drawable-finger/ic_menu_add_picture.png differ
diff --git a/res/drawable-finger/ic_menu_contact.png b/res/drawable-finger/ic_menu_contact.png
deleted file mode 100644 (file)
index 29b7cd9..0000000
Binary files a/res/drawable-finger/ic_menu_contact.png and /dev/null differ
diff --git a/res/drawable-finger/ic_menu_dialer.png b/res/drawable-finger/ic_menu_dialer.png
deleted file mode 100644 (file)
index db21f96..0000000
Binary files a/res/drawable-finger/ic_menu_dialer.png and /dev/null differ
diff --git a/res/drawable-finger/ic_menu_import_contact.png b/res/drawable-finger/ic_menu_import_contact.png
new file mode 100755 (executable)
index 0000000..fcb16db
Binary files /dev/null and b/res/drawable-finger/ic_menu_import_contact.png differ
diff --git a/res/drawable-finger/ic_menu_refresh.png b/res/drawable-finger/ic_menu_refresh.png
new file mode 100755 (executable)
index 0000000..77d70dd
Binary files /dev/null and b/res/drawable-finger/ic_menu_refresh.png differ
diff --git a/res/drawable-finger/ic_menu_send.png b/res/drawable-finger/ic_menu_send.png
deleted file mode 100644 (file)
index 74c096d..0000000
Binary files a/res/drawable-finger/ic_menu_send.png and /dev/null differ
diff --git a/res/drawable-finger/ic_menu_show_barcode.png b/res/drawable-finger/ic_menu_show_barcode.png
new file mode 100755 (executable)
index 0000000..cb66ae5
Binary files /dev/null and b/res/drawable-finger/ic_menu_show_barcode.png differ
diff --git a/res/drawable/dialog_full_dark.9.png b/res/drawable/dialog_full_dark.9.png
deleted file mode 100755 (executable)
index 18914b3..0000000
Binary files a/res/drawable/dialog_full_dark.9.png and /dev/null differ
diff --git a/res/drawable/ic_launcher_contacts_phones.png b/res/drawable/ic_launcher_contacts_phones.png
new file mode 100644 (file)
index 0000000..822cc31
Binary files /dev/null and b/res/drawable/ic_launcher_contacts_phones.png differ
diff --git a/res/drawable/ic_launcher_contacts_starred.png b/res/drawable/ic_launcher_contacts_starred.png
new file mode 100644 (file)
index 0000000..328761e
Binary files /dev/null and b/res/drawable/ic_launcher_contacts_starred.png differ
index 23f8521..32b7ffc 100644 (file)
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:orientation="vertical">
-<!-- The group banner isn't used anymore
-    <TextView 
-            android:id="@+id/contact_group"
-            android:text="@string/noContacts"
+
+    <ListView android:id="@android:id/list"
+            android:layout_width="fill_parent" 
+            android:layout_height="fill_parent"
+            android:fastScrollEnabled="true"
+    />
+
+    <ScrollView android:id="@android:id/empty"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:fillViewport="true"
+    >
+        <TextView android:id="@+id/emptyText"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
-            android:background="@android:drawable/title_bar"
-            style="@android:style/TextAppearance.WindowTitle"/>
--->
-    <com.android.contacts.FastScrollView 
-            android:layout_width="fill_parent"
-            android:layout_height="fill_parent">
-        <ListView android:id="@android:id/list"
-                android:layout_width="fill_parent" 
-                android:layout_height="fill_parent"
-        />
-
-        <TextView android:id="@android:id/empty"
-                android:layout_width="fill_parent"
-                android:layout_height="fill_parent"
-                android:gravity="center"
-                android:text="@string/noContacts"
-                android:textAppearance="?android:attr/textAppearanceLarge"
+            android:text="@string/noContacts"
+            android:textSize="20sp"
+            android:textColor="?android:attr/textColorSecondary"
+            android:paddingLeft="10dip"
+            android:paddingRight="10dip"
+            android:paddingTop="10dip"
+            android:lineSpacingMultiplier="0.92"
         />
-    </com.android.contacts.FastScrollView>
+    </ScrollView>
 </LinearLayout>
diff --git a/res/layout-finger/dialpad_chooser_list_item.xml b/res/layout-finger/dialpad_chooser_list_item.xml
new file mode 100644 (file)
index 0000000..c5abeac
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<!-- Layout of a single item in the Dialer's "Dialpad chooser" UI. -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <ImageView android:id="@+id/icon"
+        android:layout_width="64px"
+        android:layout_height="64px"
+        android:scaleType="center" />
+
+    <TextView android:id="@+id/text"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:layout_gravity="center_vertical"
+        android:layout_width="0dip"
+        android:layout_weight="1"
+        android:layout_height="wrap_content" />
+
+</LinearLayout>
index 858d654..7d0f449 100644 (file)
                 android:layout_marginLeft="6dip"
                 android:layout_marginRight="10dip"
             >
-                <Button android:id="@+id/photoButton"
+                <ImageButton android:id="@+id/photoButton"
                     android:layout_width="fill_parent"
                     android:layout_height="fill_parent"
-                    android:text="@string/addPicture"
+                    android:src="@drawable/ic_menu_add_picture"
                     android:gravity="center"
                 />
 
@@ -66,8 +66,7 @@
                 android:layout_height="wrap_content"
                 android:layout_marginRight="4dip"
                 android:gravity="center_vertical"
-                android:singleLine="true"
-                android:capitalize="words"
+                android:inputType="textPersonName|textCapWords"
                 android:hint="@string/ghostData_name"
                 android:nextFocusDown="@id/data"
             />
diff --git a/res/layout-finger/sync_settings.xml b/res/layout-finger/sync_settings.xml
new file mode 100644 (file)
index 0000000..50d0d47
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 Google Inc.
+ *
+ * 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.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical"
+>
+
+    <ListView android:id="@android:id/list"
+        android:layout_width="fill_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1"
+    />
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:background="@android:drawable/bottom_bar"
+        android:orientation="horizontal"
+        android:gravity="center_vertical"
+    >
+        <Button android:id="@+id/ok"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:text="@android:string/ok"
+        />
+
+        <Button android:id="@+id/cancel"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:text="@android:string/cancel"
+        />
+    </LinearLayout>
+</LinearLayout>
index 84f2517..172a4ba 100644 (file)
@@ -20,7 +20,7 @@
     android:layout_height="fill_parent"
     android:orientation="vertical"
 >
-    <LinearLayout
+    <LinearLayout android:id="@+id/digitsAndBackspace"
         android:layout_width="fill_parent"
         android:layout_height="66px"
         android:layout_marginTop="3px"
 
     <!-- Keypad section -->
     <include layout="@layout/dialpad" />
+
+    <!-- "Dialpad chooser" UI, shown only when the user brings up the
+         Dialer while a call is already in progress.
+         When this UI is visible, the other Dialer elements
+         (the textfield/button and the dialpad) are hidden. -->
+    <ListView android:id="@+id/dialpadChooser"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:footerDividersEnabled="true"
+    />
+
 </LinearLayout>
index 3daf6d2..2b436b8 100644 (file)
@@ -20,7 +20,7 @@
     android:layout_height="fill_parent"
     android:orientation="vertical"
 >
-    <LinearLayout
+    <LinearLayout android:id="@+id/digitsAndBackspace"
         android:layout_width="fill_parent"
         android:layout_height="66px"
         android:addStatesFromChildren="true"
         />
 
     </LinearLayout>
+
+    <!-- "Dialpad chooser" UI, shown only when the user brings up the
+         Dialer while a call is already in progress.
+         When this UI is visible, the other Dialer elements
+         (the textfield and button) are hidden. -->
+    <ListView android:id="@+id/dialpadChooser"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:footerDividersEnabled="true"
+    />
+
 </LinearLayout>
index ac39f7d..9b8f033 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="attachToContact">Obrázek kontaktu</string>
-  <string name="button_discard">Zrušit změny</string>
-  <string name="button_save">Uložit</string>
-  <string name="cancelButtonText">Storno</string>
-  <string name="contactsList">Kontakty</string>
-  <string name="continueEditing">Pokračovat v úpravách</string>
-  <string name="customLabelPickerTitle">Vlastní štítek</string>
-  <string name="deleteConfirmation">Odstranit tento kontakt?</string>
-  <string name="discardChanges">Zrušit změny</string>
-  <string name="displayAllPreference">Zobrazit všechny kontakty</string>
-  <string name="displayAllPreference_summary">Zobrazit všechny kontakty nebo jen kontakty s telefonními čísly</string>
-  <string name="editContact_title_edit">Upravit kontakt</string>
-  <string name="editContact_title_insert">Nový kontakt</string>
-  <string name="emailLabelsGroup">E-mail</string>
-  <string name="errorDialogTitle">Upozornění!</string>
-  <string name="frequentList">Časté</string>
-  <string name="ghostData_company">Společnost</string>
-  <string name="ghostData_email">E-mailová adresa</string>
-  <string name="ghostData_im">Jméno pro zasílání rychlých zpráv</string>
-  <string name="ghostData_name">První a poslední</string>
-  <string name="ghostData_notes">Poznámka</string>
-  <string name="ghostData_phone">Telefonní číslo</string>
-  <string name="ghostData_postal">"Ulice\nMěsto, stát, PSČ\nZemě"</string>
-  <string name="ghostData_title">Poloha</string>
-  <string name="imLabelsGroup">Rych. zpr.</string>
-  <string name="importFromSim">Importovat z karty SIM</string>
-  <string name="invalidContactMessage">Kontakty musí mít názvy</string>
-  <string name="label_company">Společnost</string>
-  <string name="label_notes">Poznámky</string>
-  <string name="label_title">Funkce</string>
-  <string name="menu_addItem">a další</string>
-  <string name="menu_addStar">Přidat hvězdičku</string>
-  <string name="menu_call">Volat</string>
-  <string name="menu_callNumber">Volat<xliff:g id="contact">%s</xliff:g></string>
-  <string name="menu_deleteContact">Odstranit kontakt</string>
-  <string name="menu_dialer">Telefon</string>
-  <string name="menu_doNotSave">Zrušit změny</string>
-  <string name="menu_done">Uložit</string>
-  <string name="menu_editContact">Upravit kontakt</string>
-  <string name="menu_editNumberBeforeCall">Upravit číslo před voláním</string>
-  <string name="menu_makeDefaultNumber">Vytvořit výchozí číslo</string>
-  <string name="menu_newContact">Nový kontakt</string>
-  <string name="menu_preferences">Nastavení</string>
-  <string name="menu_removeStar">Odebrat hvězdičku</string>
-  <string name="menu_sendEmail">Odeslat e-mail</string>
-  <string name="menu_sendSMS">Odeslat text</string>
-  <string name="menu_viewAddress">Adresa na mapě</string>
-  <string name="menu_viewContact">Zobrazit kontakt</string>
-  <string name="noButton">Storno</string>
-  <string name="okButtonText">OK</string>
-  <string name="otherLabelsGroup">Jiné</string>
-  <string name="phoneLabelsGroup">Telefon</string>
-  <string name="photoPickerNotFoundText">Žádné obrázky nejsou k dispozici.</string>
-  <string name="pickerNewContactHeader">Vytvořit nový kontakt</string>
-  <string name="postalLabelsGroup">Poštovní adresa</string>
-  <string name="searchHint">Hledat v kontaktech</string>
-  <string name="selectLabel">Vybrat štítek</string>
-  <string name="sms_entry_label">Odeslat SMS</string>
-  <string name="starredList">Hlavní</string>
-  <string name="strequentList">Oblíbené položky</string>
-  <string name="yesButton">OK</string>
+    <string name="contactsList">"Kontakty"</string>
+    <!-- no translation found for shortcutContact (1520089872483067797) -->
+    <skip />
+    <string name="starredList">"Hlavní"</string>
+    <string name="frequentList">"Časté"</string>
+    <string name="strequentList">"Oblíbené položky"</string>
+    <!-- no translation found for viewContactTitle (5340316765801746261) -->
+    <skip />
+    <!-- no translation found for viewContactDesription (5593543465183236254) -->
+    <skip />
+    <!-- no translation found for editContactDescription (207393633337592309) -->
+    <skip />
+    <!-- no translation found for insertContactDescription (8392185611221432248) -->
+    <skip />
+    <string name="searchHint">"Hledat v kontaktech"</string>
+    <string name="menu_newContact">"Nový kontakt"</string>
+    <string name="menu_viewContact">"Zobrazit kontakt"</string>
+    <!-- unknown placeholder CONTACT in menu_callNumber -->
+    <skip />
+    <string name="menu_addStar">"Přidat hvězdičku"</string>
+    <string name="menu_removeStar">"Odebrat hvězdičku"</string>
+    <!-- no translation found for menu_showBarcode (4627916987700748636) -->
+    <skip />
+    <string name="menu_editContact">"Upravit kontakt"</string>
+    <string name="menu_deleteContact">"Odstranit kontakt"</string>
+    <string name="menu_call">"Volat"</string>
+    <string name="menu_sendSMS">"Odeslat text"</string>
+    <string name="menu_sendEmail">"Odeslat e-mail"</string>
+    <string name="menu_viewAddress">"Adresa na mapě"</string>
+    <string name="menu_makeDefaultNumber">"Vytvořit výchozí číslo"</string>
+    <!-- no translation found for deleteConfirmation_title (1628057421142368583) -->
+    <skip />
+    <string name="deleteConfirmation">"Odstranit tento kontakt?"</string>
+    <string name="menu_done">"Uložit"</string>
+    <string name="menu_doNotSave">"Zrušit změny"</string>
+    <string name="button_save">"Uložit"</string>
+    <string name="button_discard">"Zrušit změny"</string>
+    <string name="editContact_title_edit">"Upravit kontakt"</string>
+    <string name="editContact_title_insert">"Nový kontakt"</string>
+    <string name="menu_addItem">"a další"</string>
+    <string name="label_notes">"Poznámky"</string>
+    <!-- no translation found for label_ringtone (1269538172838343970) -->
+    <skip />
+    <string name="ghostData_name">"První a poslední"</string>
+    <string name="ghostData_company">"Společnost"</string>
+    <string name="ghostData_title">"Poloha"</string>
+    <string name="ghostData_im">"Jméno pro zasílání rychlých zpráv"</string>
+    <string name="ghostData_notes">"Poznámka"</string>
+    <string name="ghostData_phone">"Telefonní číslo"</string>
+    <string name="ghostData_email">"E-mailová adresa"</string>
+    <!-- unknown placeholder BREAK_0 in ghostData_postal -->
+    <skip />
+    <string name="invalidContactMessage">"Kontakty musí mít názvy"</string>
+    <string name="pickerNewContactHeader">"Vytvořit nový kontakt"</string>
+    <string name="selectLabel">"Vybrat štítek"</string>
+    <string name="phoneLabelsGroup">"Telefon"</string>
+    <string name="emailLabelsGroup">"E-mail"</string>
+    <string name="imLabelsGroup">"Rych. zpr."</string>
+    <string name="postalLabelsGroup">"Poštovní adresa"</string>
+    <string name="otherLabelsGroup">"Jiné"</string>
+    <!-- no translation found for otherLabels:0 (3318569574569948132) -->
+    <!-- no translation found for otherLabels:1 (3325413568383685728) -->
+    <string name="errorDialogTitle">"Upozornění!"</string>
+    <string name="photoPickerNotFoundText">"Žádné obrázky nejsou k dispozici."</string>
+    <string name="attachToContact">"Obrázek kontaktu"</string>
+    <string name="customLabelPickerTitle">"Vlastní štítek"</string>
+    <!-- no translation found for menu_displayGroup (2835746769742496686) -->
+    <skip />
+    <!-- no translation found for syncGroupPreference (759121296595419145) -->
+    <skip />
+    <string name="importFromSim">"Importovat z karty SIM"</string>
+    <!-- no translation found for alphabet (4977128516779796464) -->
+    <skip />
+    <!-- no translation found for send_to_voicemail_checkbox (1699633783417579410) -->
+    <skip />
+    <!-- no translation found for send_to_voicemail_view (4299389800446371057) -->
+    <skip />
+    <!-- no translation found for default_ringtone (3998437793418131562) -->
+    <skip />
+    <!-- no translation found for addPicture (7010902051370875352) -->
+    <skip />
+    <!-- no translation found for removePicture (2322840177008417519) -->
+    <skip />
+    <!-- no translation found for noContacts (7515781671301309298) -->
+    <skip />
+    <!-- no translation found for noContactsWithPhoneNumbers (3105170743499016241) -->
+    <skip />
+    <!-- no translation found for noFavorites (7957536428532225634) -->
+    <skip />
+    <!-- no translation found for select_group_title (8821785850959403592) -->
+    <skip />
+    <!-- no translation found for groupEmpty (1733723844723885242) -->
+    <skip />
+    <!-- no translation found for showAllGroups (4524662887308889400) -->
+    <skip />
+    <!-- no translation found for syncAllGroups (8415112909188430211) -->
+    <skip />
+    <!-- no translation found for groupNameMyContacts (1298661863710879264) -->
+    <skip />
+    <!-- no translation found for groupNameWithPhones (4051877952712463294) -->
+    <skip />
+    <!-- no translation found for contactCreatedToast (5309869712901550955) -->
+    <skip />
+    <!-- no translation found for contactSavedToast (1228932477738680325) -->
+    <skip />
+    <!-- no translation found for listSeparatorCallNumber (9142725721395758026) -->
+    <skip />
+    <!-- no translation found for listSeparatorSendSmsMms (8878062000446372333) -->
+    <skip />
+    <!-- no translation found for listSeparatorSendEmail (3813935531061488274) -->
+    <skip />
+    <!-- no translation found for listSeparatorSendIm (3885045096980470847) -->
+    <skip />
+    <!-- no translation found for listSeparatorMapAddress (7749519405208811410) -->
+    <skip />
+    <!-- no translation found for listSeparatorOrganizations (5731454670822188295) -->
+    <skip />
+    <!-- no translation found for listSeparatorOtherInformation (3399084175925138065) -->
+    <skip />
+    <!-- no translation found for contactsIconLabel (392729648321810378) -->
+    <skip />
+    <!-- no translation found for contactsFavoritesLabel (6274307000699136596) -->
+    <skip />
+    <!-- no translation found for dialerIconLabel (396765298398417139) -->
+    <skip />
+    <!-- no translation found for recentCallsIconLabel (7432201162713288826) -->
+    <skip />
+    <!-- no translation found for liveFolderAll (5991510762804226223) -->
+    <skip />
+    <!-- no translation found for liveFolderFavorites (8755759874416875970) -->
+    <skip />
+    <!-- no translation found for liveFolderPhone (3440101264360244544) -->
+    <skip />
+    <!-- no translation found for menu_sendTextMessage (3055919380461974147) -->
+    <skip />
+    <!-- no translation found for recentCalls_callNumber (924407199258234369) -->
+    <skip />
+    <!-- no translation found for recentCalls_editNumberBeforeCall (7859145185424954030) -->
+    <skip />
+    <!-- no translation found for recentCalls_addToContact (6950267092567953305) -->
+    <skip />
+    <!-- no translation found for recentCalls_removeFromRecentList (5273789011391059975) -->
+    <skip />
+    <!-- no translation found for recentCalls_deleteAll (425798199678070888) -->
+    <skip />
+    <!-- no translation found for recentCalls_empty (7787624895504983911) -->
+    <skip />
+    <!-- no translation found for imei (1052536402066249452) -->
+    <skip />
+    <!-- no translation found for voicemail (1135686231023059817) -->
+    <skip />
+    <!-- no translation found for unknown (6231893925212017656) -->
+    <skip />
+    <!-- no translation found for private_num (3065614133902647350) -->
+    <skip />
+    <!-- no translation found for dialerKeyboardHintText (2013777173021862941) -->
+    <skip />
+    <!-- no translation found for simContacts_emptyLoading (4828419758306519589) -->
+    <skip />
+    <!-- no translation found for simContacts_title (4162577066960174009) -->
+    <skip />
+    <!-- no translation found for contactsSyncPlug (1549212649158409469) -->
+    <skip />
+    <!-- no translation found for noContactsHelpText (6155730972704522463) -->
+    <skip />
+    <!-- no translation found for seclectSyncGroups_title (7675331949118054911) -->
+    <skip />
+    <!-- no translation found for liveFolder_all_label (3716551598022430019) -->
+    <skip />
+    <!-- no translation found for liveFolder_favorites_label (9053985659909059395) -->
+    <skip />
+    <!-- no translation found for liveFolder_phones_label (8943901400107401868) -->
+    <skip />
 </resources>
diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml
deleted file mode 100644 (file)
index dc2aa59..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="addPicture">Symbol hinzufügen</string>
-  <string name="allContacts">Alle Kontakte</string>
-  <string name="alphabet">\u0020ABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
-  <string name="attachToContact">Kontaktsymbol</string>
-  <string name="button_discard">Änderungen verwerfen</string>
-  <string name="button_save">Speichern</string>
-  <string name="cancelButtonText">Abbrechen</string>
-  <string name="contactCreatedToast">Kontakt erstellt.</string>
-  <string name="contactSavedToast">Kontakt gespeichert.</string>
-  <string name="contactsFavoritesLabel">Favoriten</string>
-  <string name="contactsIconLabel">Kontakte</string>
-  <string name="contactsList">Kontakte</string>
-  <string name="customLabelPickerTitle">Benutzerdefiniertes Etikett</string>
-  <string name="default_ringtone">Standard</string>
-  <string name="deleteConfirmation">Dieser Kontakt wird gelöscht.</string>
-  <string name="deleteConfirmation_title">Löschen</string>
-  <string name="dialerIconLabel">Wähltastatur</string>
-  <string name="dialerKeyboardHintText">Feste Tastatur zum Wählen verwenden</string>
-  <string name="doneButton">Fertig</string>
-  <string name="editContactDescription">Kontakt bearbeiten</string>
-  <string name="editContact_title_edit">Kontakt bearbeiten</string>
-  <string name="editContact_title_insert">Neuer Kontakt</string>
-  <string name="emailLabelsGroup">E-Mail</string>
-  <string name="errorDialogTitle">Keine Bilder</string>
-  <string name="frequentList">Häufig</string>
-  <string name="ghostData_company">Firma</string>
-  <string name="ghostData_email">E-Mail-Adresse</string>
-  <string name="ghostData_im">IM-Name</string>
-  <string name="ghostData_name">Vor- und Nachname</string>
-  <string name="ghostData_notes">Eigene Notiz</string>
-  <string name="ghostData_phone">Telefonnummer</string>
-  <string name="ghostData_postal">Postadresse</string>
-  <string name="ghostData_title">Position</string>
-  <string name="groupEmpty">Die \"<xliff:g id="groupName">%s</xliff:g>\" Gruppe ist leer.</string>
-  <string name="groupNameMyContacts">Eigene Kontakte</string>
-  <string name="groupNameWithPhones">Kontakte mit Telefonnummern</string>
-  <string name="imLabelsGroup">IM</string>
-  <string name="imei">IMEI</string>
-  <string name="importFromSim">SIM-Kontakt-Import</string>
-  <string name="insertContactDescription">Kontakt erstellen</string>
-  <string name="invalidContactMessage">Der Kontakt existiert nicht.</string>
-  <string name="label_company">Firma</string>
-  <string name="label_notes">Notizen</string>
-  <string name="label_ringtone">Klingelton</string>
-  <string name="label_title">Arbeitsbezeichnung</string>
-  <string name="listSeparatorCallNumber">Nummer wählen</string>
-  <string name="listSeparatorMapAddress">Kartenansicht Adresse</string>
-  <string name="listSeparatorOrganizations">Organisationen</string>
-  <string name="listSeparatorOtherInformation">Andere Informationen</string>
-  <string name="listSeparatorSendEmail">E-Mail senden</string>
-  <string name="listSeparatorSendIm">Sofortnachricht senden</string>
-  <string name="listSeparatorSendSmsMms">SMS/MMS senden</string>
-  <string name="menu_addItem">Weitere Info</string>
-  <string name="menu_addStar">Zu Favoriten hinzufügen</string>
-  <string name="menu_call">Anrufen</string>
-  <string name="menu_callNumber"><xliff:g id="contact">%s</xliff:g> anrufen</string>
-  <string name="menu_deleteContact">Kontakt löschen</string>
-  <string name="menu_dialer">Wähltastatur</string>
-  <string name="menu_displayGroup">Gruppe anzeigen</string>
-  <string name="menu_doNotSave">Änderungen verwerfen</string>
-  <string name="menu_done">Speichern</string>
-  <string name="menu_editContact">Kontakt bearbeiten</string>
-  <string name="menu_editNumberBeforeCall">Nummer vor Anruf bearbeiten</string>
-  <string name="menu_makeDefaultNumber">Standardnummer erstellen</string>
-  <string name="menu_newContact">Neuer Kontakt</string>
-  <string name="menu_newFavortie">Neuer Favorit</string>
-  <string name="menu_preferences">Einstellungen</string>
-  <string name="menu_removeStar">Aus Favoriten entfernen</string>
-  <string name="menu_sendEmail">E-Mail senden</string>
-  <string name="menu_sendSMS">SMS/MMS senden</string>
-  <string name="menu_sendTextMessage">SMS-Nachricht senden</string>
-  <string name="menu_viewAddress">Kartenansicht Adresse</string>
-  <string name="menu_viewContact">Kontakt anzeigen</string>
-  <string name="noButton">Abbrechen</string>
-  <string name="noContacts">Keine Kontakte.</string>
-  <string name="noContactsWithPhoneNumbers">Keine Kontakte mit Telefonnummern.</string>
-  <string name="noFavorites">Keine Favoriten.</string>
-  <string name="no_imei">Unbekannte IMEI</string>
-  <string name="ok">OK</string>
-  <string name="okButtonText">OK</string>
-  <string name="otherLabelsGroup">Andere</string>
-  <string name="phoneIconLabel">Telefon</string>
-  <string name="phoneLabelsGroup">Telefon</string>
-  <string name="photoPickerNotFoundText">Für Telefon stehen keine Bilder zur Verfügung.</string>
-  <string name="pickerNewContactHeader">Neuen Kontakt erstellen</string>
-  <string name="postalLabelsGroup">Postanschrift</string>
-  <string name="private_num">Privatnummer</string>
-  <string name="recentCallsIconLabel">Anrufliste</string>
-  <string name="recentCalls_addToContact">Zu Kontakten hinzufügen</string>
-  <string name="recentCalls_callNumber"><xliff:g id="who">%s</xliff:g> anrufen</string>
-  <string name="recentCalls_deleteAll">Anrufliste löschen</string>
-  <string name="recentCalls_editNumberBeforeCall">Nummer vor Anruf bearbeiten</string>
-  <string name="recentCalls_empty">Anrufliste ist leer.</string>
-  <string name="recentCalls_removeFromRecentList">Aus Anrufliste entfernen</string>
-  <string name="removePicture">Symbol entfernen</string>
-  <string name="searchHint">Kontakte suchen</string>
-  <string name="selectGroupsToSync">Gruppen synchronisieren</string>
-  <string name="selectLabel">Etikett auswählen</string>
-  <string name="select_group_title">Gruppe zur Anzeige auswählen</string>
-  <string name="send_to_voicemail_checkbox">Anrufe direkt zur Mobilbox suchen.</string>
-  <string name="send_to_voicemail_view">Anrufe werden direkt zur Mobilbox gesendet.</string>
-  <string name="shortcutContact">Kontakt</string>
-  <string name="showAllGroups">Alle Kontakte</string>
-  <string name="showingGroupTitle">
-                                       <xliff:g id="groupName">%s</xliff:g>
-                               </string>
-  <string name="simContacts_emptyLoading">Laden von SIM-Karte\u2026</string>
-  <string name="simContacts_title">SIM-Karten-Kontakte</string>
-  <string name="sms_entry_label">SMS/MMS senden</string>
-  <string name="starredList">Mit Stern</string>
-  <string name="strequentList">Favoriten</string>
-  <string name="syncAllGroups">Alle Kontakte synchronisieren</string>
-  <string name="syncGroupChooserTitle">Gruppe für Synchronisierung auswählen</string>
-  <string name="syncGroupPreference">Gruppen synchronisieren</string>
-  <string name="syncGroupPreference_summary">Gruppen für Synchronisierung auswählen</string>
-  <string name="unknown">Unbekannt</string>
-  <string name="viewContactDesription">Kontakt anzeigen</string>
-  <string name="viewContactTitle">Kontaktdetails</string>
-  <string name="voicemail">Mobilbox</string>
-  <string name="yesButton">OK</string>
-</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
new file mode 100644 (file)
index 0000000..0b98318
--- /dev/null
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="contactsList">"Kontakte"</string>
+    <string name="shortcutContact">"Kontakt"</string>
+    <string name="starredList">"Markiert"</string>
+    <string name="frequentList">"Häufig"</string>
+    <string name="strequentList">"Favoriten"</string>
+    <string name="viewContactTitle">"Kontaktinformationen"</string>
+    <string name="viewContactDesription">"Kontakt anzeigen"</string>
+    <string name="editContactDescription">"Kontakt bearbeiten"</string>
+    <string name="insertContactDescription">"Kontakt erstellen"</string>
+    <string name="searchHint">"Kontakte durchsuchen"</string>
+    <string name="menu_newContact">"Neuer Kontakt"</string>
+    <string name="menu_viewContact">"Kontakt anzeigen"</string>
+    <string name="menu_callNumber">"<xliff:g id="NAME">%s</xliff:g> anrufen"</string>
+    <string name="menu_addStar">"Zu Favoriten hinzufügen"</string>
+    <string name="menu_removeStar">"Aus Favoriten entfernen"</string>
+    <!-- no translation found for menu_showBarcode (309973637178814132) -->
+    <skip />
+    <string name="menu_editContact">"Kontakt bearbeiten"</string>
+    <string name="menu_deleteContact">"Kontakt löschen"</string>
+    <string name="menu_call">"Anruf"</string>
+    <string name="menu_sendSMS">"SMS/MMS senden"</string>
+    <string name="menu_sendEmail">"E-Mail senden"</string>
+    <string name="menu_viewAddress">"Adresse auf der Karte"</string>
+    <string name="menu_makeDefaultNumber">"Als Standardnummer festlegen"</string>
+    <string name="deleteConfirmation_title">"Löschen"</string>
+    <string name="deleteConfirmation">"Dieser Kontakt wird gelöscht."</string>
+    <string name="menu_done">"Speichern"</string>
+    <string name="menu_doNotSave">"Änderungen löschen"</string>
+    <string name="button_save">"Speichern"</string>
+    <string name="button_discard">"Änderungen löschen"</string>
+    <string name="editContact_title_edit">"Kontakt bearbeiten"</string>
+    <string name="editContact_title_insert">"Neuer Kontakt"</string>
+    <string name="menu_addItem">"Weitere Informationen"</string>
+    <string name="label_notes">"Notizen"</string>
+    <string name="label_ringtone">"Klingelton"</string>
+    <string name="ghostData_name">"Vor- und Nachname"</string>
+    <string name="ghostData_company">"Unternehmen"</string>
+    <string name="ghostData_title">"Position"</string>
+    <string name="ghostData_im">"IM-Name"</string>
+    <string name="ghostData_notes">"Meine Notiz"</string>
+    <string name="ghostData_phone">"Telefonnummer"</string>
+    <string name="ghostData_email">"E-Mail-Adresse"</string>
+    <string name="ghostData_postal">"Postanschrift"</string>
+    <string name="invalidContactMessage">"Dieser Kontakt existiert nicht."</string>
+    <string name="pickerNewContactHeader">"Neuen Kontakt erstellen"</string>
+    <string name="selectLabel">"Wählen Sie ein Label aus."</string>
+    <string name="phoneLabelsGroup">"Telefon"</string>
+    <string name="emailLabelsGroup">"E-Mail"</string>
+    <string name="imLabelsGroup">"IM"</string>
+    <string name="postalLabelsGroup">"Postanschrift"</string>
+    <string name="otherLabelsGroup">"Sonstiges"</string>
+  <string-array name="otherLabels">
+    <item>"Organisation"</item>
+    <item>"Notiz"</item>
+  </string-array>
+    <string name="errorDialogTitle">"Keine Bilder"</string>
+    <string name="photoPickerNotFoundText">"Auf dem Telefon sind keine Bilder verfügbar."</string>
+    <string name="attachToContact">"Kontaktsymbol"</string>
+    <!-- no translation found for customLabelPickerTitle (1081475101983255212) -->
+    <skip />
+    <string name="menu_displayGroup">"Gruppe anzeigen"</string>
+    <string name="syncGroupPreference">"Synchron. bearbeiten"</string>
+    <string name="importFromSim">"Kontakte importieren"</string>
+    <string name="alphabet">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="send_to_voicemail_checkbox">"Anrufe direkt an Mailbox senden"</string>
+    <string name="send_to_voicemail_view">"Anrufe werden direkt an Mailbox gesendet"</string>
+    <string name="default_ringtone">"Standard"</string>
+    <string name="addPicture">"Symbol hinzufügen"</string>
+    <string name="removePicture">"Symbol entfernen"</string>
+    <string name="noContacts">"Keine Kontakte"</string>
+    <string name="noContactsWithPhoneNumbers">"Keine Kontakte mit Telefonnummern"</string>
+    <string name="noFavorites">"Keine Favoriten"</string>
+    <!-- no translation found for select_group_title (7955698611959835612) -->
+    <skip />
+    <string name="groupEmpty">"Ihre Gruppe \"<xliff:g id="GROUPNAME">%s</xliff:g>\" ist leer."</string>
+    <string name="showAllGroups">"Alle Kontakte"</string>
+    <string name="syncAllGroups">"Alle Kontakte synchronisieren"</string>
+    <string name="groupNameMyContacts">"Meine Kontakte"</string>
+    <string name="groupNameWithPhones">"Kontakte mit Telefonnummern"</string>
+    <string name="contactCreatedToast">"Kontakt erstellt"</string>
+    <string name="contactSavedToast">"Kontakt gespeichert"</string>
+    <string name="listSeparatorCallNumber">"Rufnummer"</string>
+    <string name="listSeparatorSendSmsMms">"SMS/MMS senden"</string>
+    <string name="listSeparatorSendEmail">"E-Mail senden"</string>
+    <string name="listSeparatorSendIm">"Per Chat (IM) kontaktieren"</string>
+    <string name="listSeparatorMapAddress">"Adresse in Maps"</string>
+    <string name="listSeparatorOrganizations">"Organisationen"</string>
+    <string name="listSeparatorOtherInformation">"Mehr Informationen"</string>
+    <string name="contactsIconLabel">"Kontakte"</string>
+    <string name="contactsFavoritesLabel">"Favoriten"</string>
+    <string name="dialerIconLabel">"Telefon"</string>
+    <string name="recentCallsIconLabel">"Anrufe"</string>
+    <!-- no translation found for liveFolderAll (4789010460767506206) -->
+    <skip />
+    <!-- no translation found for liveFolderFavorites (3100957542927222282) -->
+    <skip />
+    <!-- no translation found for liveFolderPhone (3739376066610926780) -->
+    <skip />
+    <string name="menu_sendTextMessage">"SMS-Nachricht senden"</string>
+    <string name="recentCalls_callNumber">"<xliff:g id="NAME">%s</xliff:g> anrufen"</string>
+    <string name="recentCalls_editNumberBeforeCall">"Nummer vor Anruf bearbeiten"</string>
+    <string name="recentCalls_addToContact">"Kontakten hinzufügen"</string>
+    <string name="recentCalls_removeFromRecentList">"Aus Anrufliste entfernen"</string>
+    <string name="recentCalls_deleteAll">"Anrufliste löschen"</string>
+    <string name="recentCalls_empty">"Anrufliste ist leer"</string>
+    <string name="imei">"IMEI"</string>
+    <string name="voicemail">"Mailbox"</string>
+    <string name="unknown">"Unbekannt"</string>
+    <string name="private_num">"Private Nummer"</string>
+    <string name="dialerKeyboardHintText">"Mit Tastatur wählen"</string>
+    <!-- no translation found for dialerDialpadHintText (5824490365898349041) -->
+    <skip />
+    <string name="simContacts_emptyLoading">"Ladevorgang von SIM-Karte läuft..."</string>
+    <string name="simContacts_title">"Kontakte auf SIM-Karte"</string>
+    <string name="contactsSyncPlug"><font fgcolor="#ffffffff">"Synchronisieren Sie Ihre Google-Kontakte!"</font>" "\n"Nach der Synchronisierung stehen Ihnen Ihre Kontakte überall zur Verfügung."</string>
+    <string name="noContactsHelpText">"Sie haben keine Kontakte."\n\n"Um Kontakte hinzuzufügen, klicken Sie auf "<font fgcolor="#ffffffff"><b>"Menü"</b></font>" und wählen Sie "\n\n" "\n<li><font fgcolor="#ffffffff"><b>"Synchronisierte Gruppen bearbeiten"</b></font>", um Kontakte aus einem neuen oder bestehenden Google-Konto hinzuzufügen,"\n</li>\n" "\n<li><font fgcolor="#ffffffff"><b>"Neuer Kontakt"</b></font>", um einen ganz neuen Kontakt hinzuzufügen"\n</li>\n" "\n<li><font fgcolor="#ffffffff"><b>"Kontakte importieren"</b></font>", um Kontakte von Ihrer SIM-Karte hinzuzufügen"\n</li></string>
+    <string name="seclectSyncGroups_title">"Zu synchronisierende Gruppen auswählen"</string>
+    <!-- no translation found for liveFolder_all_label (1552523730090319259) -->
+    <skip />
+    <!-- no translation found for liveFolder_favorites_label (2674341514070517105) -->
+    <skip />
+    <!-- no translation found for liveFolder_phones_label (1709786878793436245) -->
+    <skip />
+    <!-- no translation found for dialer_useDtmfDialpad (1707548397435075040) -->
+    <skip />
+    <!-- no translation found for dialer_returnToInCallScreen (3719386377550913067) -->
+    <skip />
+    <!-- no translation found for dialer_addAnotherCall (4205688819890074468) -->
+    <skip />
+</resources>
index fdd1323..07b51da 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="addPicture">Add icon</string>
-  <string name="allContacts">All contacts</string>
-  <string name="alphabet">\u0020ABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
-  <string name="attachToContact">Contact icon</string>
-  <string name="button_discard">Discard changes</string>
-  <string name="button_save">Save</string>
-  <string name="cancelButtonText">Cancel</string>
-  <string name="contactCreatedToast">Contact created.</string>
-  <string name="contactSavedToast">Contact saved.</string>
-  <string name="contactsFavoritesLabel">Favourites</string>
-  <string name="contactsIconLabel">Contacts</string>
-  <string name="contactsList">Contacts</string>
-  <string name="customLabelPickerTitle">Custom label</string>
-  <string name="default_ringtone">Default</string>
-  <string name="deleteConfirmation">This contact will be deleted.</string>
-  <string name="deleteConfirmation_title">Delete</string>
-  <string name="dialerIconLabel">Dialer</string>
-  <string name="dialerKeyboardHintText">Use keyboard to dial</string>
-  <string name="doneButton">Done</string>
-  <string name="editContactDescription">Edit contact</string>
-  <string name="editContact_title_edit">Edit contact</string>
-  <string name="editContact_title_insert">New contact</string>
-  <string name="emailLabelsGroup">Email</string>
-  <string name="errorDialogTitle">No pictures</string>
-  <string name="frequentList">Frequent</string>
-  <string name="ghostData_company">Company</string>
-  <string name="ghostData_email">Email address</string>
-  <string name="ghostData_im">IM name</string>
-  <string name="ghostData_name">First and Last</string>
-  <string name="ghostData_notes">My note</string>
-  <string name="ghostData_phone">Phone number</string>
-  <string name="ghostData_postal">Postal address</string>
-  <string name="ghostData_title">Position</string>
-  <string name="groupEmpty">Your \"<xliff:g id="groupName">%s</xliff:g>\" group is empty.</string>
-  <string name="groupNameMyContacts">My Contacts</string>
-  <string name="groupNameWithPhones">Contacts with phone numbers</string>
-  <string name="imLabelsGroup">IM</string>
-  <string name="imei">IMEI</string>
-  <string name="importFromSim">Import from SIM card</string>
-  <string name="insertContactDescription">Create contact</string>
-  <string name="invalidContactMessage">The contact does not exist.</string>
-  <string name="label_company">Company</string>
-  <string name="label_notes">Notes</string>
-  <string name="label_ringtone">Ringtone</string>
-  <string name="label_title">Job title</string>
-  <string name="listSeparatorCallNumber">Dial number</string>
-  <string name="listSeparatorMapAddress">Map address</string>
-  <string name="listSeparatorOrganizations">Organisations</string>
-  <string name="listSeparatorOtherInformation">Other information</string>
-  <string name="listSeparatorSendEmail">Send email</string>
-  <string name="listSeparatorSendIm">Send instant message</string>
-  <string name="listSeparatorSendSmsMms">Send SMS/MMS</string>
-  <string name="menu_addItem">More info</string>
-  <string name="menu_addStar">Add to favourites</string>
-  <string name="menu_call">Call</string>
-  <string name="menu_callNumber">Call <xliff:g id="contact">%s</xliff:g></string>
-  <string name="menu_deleteContact">Delete contact</string>
-  <string name="menu_dialer">Dialer</string>
-  <string name="menu_displayGroup">Display group</string>
-  <string name="menu_doNotSave">Discard changes</string>
-  <string name="menu_done">Save</string>
-  <string name="menu_editContact">Edit contact</string>
-  <string name="menu_editNumberBeforeCall">Edit number before call</string>
-  <string name="menu_makeDefaultNumber">Make default number</string>
-  <string name="menu_newContact">New contact</string>
-  <string name="menu_newFavortie">New favourite</string>
-  <string name="menu_preferences">Settings</string>
-  <string name="menu_removeStar">Remove from favourites</string>
-  <string name="menu_sendEmail">Send email</string>
-  <string name="menu_sendSMS">Send SMS/MMS</string>
-  <string name="menu_sendTextMessage">Send SMS message</string>
-  <string name="menu_viewAddress">Map address</string>
-  <string name="menu_viewContact">View contact</string>
-  <string name="noButton">Cancel</string>
-  <string name="noContacts">No contacts.</string>
-  <string name="noContactsWithPhoneNumbers">No contacts with phone numbers.</string>
-  <string name="noFavorites">No favourites.</string>
-  <string name="no_imei">Unknown IMEI</string>
-  <string name="ok">OK</string>
-  <string name="okButtonText">OK</string>
-  <string name="otherLabelsGroup">Other</string>
-  <string name="phoneIconLabel">Phone</string>
-  <string name="phoneLabelsGroup">Phone</string>
-  <string name="photoPickerNotFoundText">No pictures are available on the phone.</string>
-  <string name="pickerNewContactHeader">Create new contact</string>
-  <string name="postalLabelsGroup">Postal address</string>
-  <string name="private_num">Private number</string>
-  <string name="recentCallsIconLabel">Call log</string>
-  <string name="recentCalls_addToContact">Add to contacts</string>
-  <string name="recentCalls_callNumber">Call <xliff:g id="who">%s</xliff:g></string>
-  <string name="recentCalls_deleteAll">Clear call log</string>
-  <string name="recentCalls_editNumberBeforeCall">Edit number before call</string>
-  <string name="recentCalls_empty">Call log is empty.</string>
-  <string name="recentCalls_removeFromRecentList">Remove from call log</string>
-  <string name="removePicture">Remove icon</string>
-  <string name="searchHint">Search contacts</string>
-  <string name="selectGroupsToSync">Sync groups</string>
-  <string name="selectLabel">Select label</string>
-  <string name="select_group_title">Select group to display</string>
-  <string name="send_to_voicemail_checkbox">Send calls directly to voicemail.</string>
-  <string name="send_to_voicemail_view">Calls are sent directly to voicemail.</string>
-  <string name="shortcutContact">Contact</string>
-  <string name="showAllGroups">All contacts</string>
-  <string name="showingGroupTitle"><xliff:g id="groupName">%s</xliff:g></string>
-  <string name="simContacts_emptyLoading">Loading from SIM card\u2026</string>
-  <string name="simContacts_title">SIM card contacts</string>
-  <string name="sms_entry_label">Send SMS/MMS</string>
-  <string name="starredList">Starred</string>
-  <string name="strequentList">Favourites</string>
-  <string name="syncAllGroups">Sync all contacts</string>
-  <string name="syncGroupChooserTitle">Select groups to sync</string>
-  <string name="syncGroupPreference">Sync groups</string>
-  <string name="syncGroupPreference_summary">Select groups to synchronize</string>
-  <string name="unknown">Unknown</string>
-  <string name="viewContactDesription">View contact</string>
-  <string name="viewContactTitle">Contact details</string>
-  <string name="voicemail">Voicemail</string>
-  <string name="yesButton">OK</string>
+    <string name="contactsList">"Contacts"</string>
+    <string name="shortcutContact">"Contact"</string>
+    <string name="starredList">"Starred"</string>
+    <string name="frequentList">"Frequent"</string>
+    <string name="strequentList">"Favourites"</string>
+    <string name="viewContactTitle">"Contact details"</string>
+    <string name="viewContactDesription">"View contact"</string>
+    <string name="editContactDescription">"Edit contact"</string>
+    <string name="insertContactDescription">"Create contact"</string>
+    <string name="searchHint">"Search contacts"</string>
+    <string name="menu_newContact">"New contact"</string>
+    <string name="menu_viewContact">"View contact"</string>
+    <!-- unknown placeholder CONTACT in menu_callNumber -->
+    <skip />
+    <string name="menu_addStar">"Add to favourites"</string>
+    <string name="menu_removeStar">"Remove from favourites"</string>
+    <!-- no translation found for menu_showBarcode (4627916987700748636) -->
+    <skip />
+    <string name="menu_editContact">"Edit contact"</string>
+    <string name="menu_deleteContact">"Delete contact"</string>
+    <string name="menu_call">"Call"</string>
+    <string name="menu_sendSMS">"Send SMS/MMS"</string>
+    <string name="menu_sendEmail">"Send email"</string>
+    <string name="menu_viewAddress">"Map address"</string>
+    <string name="menu_makeDefaultNumber">"Make default number"</string>
+    <string name="deleteConfirmation_title">"Delete"</string>
+    <string name="deleteConfirmation">"This contact will be deleted."</string>
+    <string name="menu_done">"Save"</string>
+    <string name="menu_doNotSave">"Discard changes"</string>
+    <string name="button_save">"Save"</string>
+    <string name="button_discard">"Discard changes"</string>
+    <string name="editContact_title_edit">"Edit contact"</string>
+    <string name="editContact_title_insert">"New contact"</string>
+    <string name="menu_addItem">"More info"</string>
+    <string name="label_notes">"Notes"</string>
+    <string name="label_ringtone">"Ringtone"</string>
+    <string name="ghostData_name">"First and Last"</string>
+    <string name="ghostData_company">"Company"</string>
+    <string name="ghostData_title">"Position"</string>
+    <string name="ghostData_im">"IM name"</string>
+    <string name="ghostData_notes">"My note"</string>
+    <string name="ghostData_phone">"Phone number"</string>
+    <string name="ghostData_email">"Email address"</string>
+    <string name="ghostData_postal">"Postal address"</string>
+    <string name="invalidContactMessage">"The contact does not exist."</string>
+    <string name="pickerNewContactHeader">"Create new contact"</string>
+    <string name="selectLabel">"Select label"</string>
+    <string name="phoneLabelsGroup">"Phone"</string>
+    <string name="emailLabelsGroup">"Email"</string>
+    <string name="imLabelsGroup">"IM"</string>
+    <string name="postalLabelsGroup">"Postal address"</string>
+    <string name="otherLabelsGroup">"Other"</string>
+    <!-- no translation found for otherLabels:0 (3318569574569948132) -->
+    <!-- no translation found for otherLabels:1 (3325413568383685728) -->
+    <string name="errorDialogTitle">"No pictures"</string>
+    <string name="photoPickerNotFoundText">"No pictures are available on the phone."</string>
+    <string name="attachToContact">"Contact icon"</string>
+    <string name="customLabelPickerTitle">"Custom label"</string>
+    <string name="menu_displayGroup">"Display group"</string>
+    <string name="syncGroupPreference">"Sync groups"</string>
+    <string name="importFromSim">"Import from SIM card"</string>
+    <string name="alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="send_to_voicemail_checkbox">"Send calls directly to voicemail."</string>
+    <string name="send_to_voicemail_view">"Calls are sent directly to voicemail."</string>
+    <string name="default_ringtone">"Default"</string>
+    <string name="addPicture">"Add icon"</string>
+    <string name="removePicture">"Remove icon"</string>
+    <string name="noContacts">"No contacts."</string>
+    <string name="noContactsWithPhoneNumbers">"No contacts with phone numbers."</string>
+    <string name="noFavorites">"No favourites."</string>
+    <string name="select_group_title">"Select group to display"</string>
+    <string name="groupEmpty">"Your \"<xliff:g id="GROUPNAME">%s</xliff:g>\" group is empty."</string>
+    <string name="showAllGroups">"All contacts"</string>
+    <string name="syncAllGroups">"Sync all contacts"</string>
+    <string name="groupNameMyContacts">"My Contacts"</string>
+    <string name="groupNameWithPhones">"Contacts with phone numbers"</string>
+    <string name="contactCreatedToast">"Contact created."</string>
+    <string name="contactSavedToast">"Contact saved."</string>
+    <string name="listSeparatorCallNumber">"Dial number"</string>
+    <string name="listSeparatorSendSmsMms">"Send SMS/MMS"</string>
+    <string name="listSeparatorSendEmail">"Send email"</string>
+    <string name="listSeparatorSendIm">"Send instant message"</string>
+    <string name="listSeparatorMapAddress">"Map address"</string>
+    <string name="listSeparatorOrganizations">"Organisations"</string>
+    <string name="listSeparatorOtherInformation">"Other information"</string>
+    <string name="contactsIconLabel">"Contacts"</string>
+    <string name="contactsFavoritesLabel">"Favourites"</string>
+    <string name="dialerIconLabel">"Dialer"</string>
+    <string name="recentCallsIconLabel">"Call log"</string>
+    <!-- no translation found for liveFolderAll (5991510762804226223) -->
+    <skip />
+    <!-- no translation found for liveFolderFavorites (8755759874416875970) -->
+    <skip />
+    <!-- no translation found for liveFolderPhone (3440101264360244544) -->
+    <skip />
+    <string name="menu_sendTextMessage">"Send SMS message"</string>
+    <!-- unknown placeholder WHO in recentCalls_callNumber -->
+    <skip />
+    <string name="recentCalls_editNumberBeforeCall">"Edit number before call"</string>
+    <string name="recentCalls_addToContact">"Add to contacts"</string>
+    <string name="recentCalls_removeFromRecentList">"Remove from call log"</string>
+    <string name="recentCalls_deleteAll">"Clear call log"</string>
+    <string name="recentCalls_empty">"Call log is empty."</string>
+    <string name="imei">"IMEI"</string>
+    <string name="voicemail">"Voicemail"</string>
+    <string name="unknown">"Unknown"</string>
+    <string name="private_num">"Private number"</string>
+    <string name="dialerKeyboardHintText">"Use keyboard to dial"</string>
+    <string name="simContacts_emptyLoading">"Loading from SIM card…"</string>
+    <string name="simContacts_title">"SIM card contacts"</string>
+    <!-- no translation found for contactsSyncPlug (1549212649158409469) -->
+    <skip />
+    <!-- no translation found for noContactsHelpText (6155730972704522463) -->
+    <skip />
+    <!-- no translation found for seclectSyncGroups_title (7675331949118054911) -->
+    <skip />
+    <!-- no translation found for liveFolder_all_label (3716551598022430019) -->
+    <skip />
+    <!-- no translation found for liveFolder_favorites_label (9053985659909059395) -->
+    <skip />
+    <!-- no translation found for liveFolder_phones_label (8943901400107401868) -->
+    <skip />
 </resources>
index db7617e..2f8a286 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="addPicture">Agregar icono</string>
-  <string name="allContacts">Todos los contactos</string>
-  <string name="alphabet">\u0020ABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
-  <string name="attachToContact">Icono de Contacto</string>
-  <string name="button_discard">Rechazar cambios</string>
-  <string name="button_save">Guardar</string>
-  <string name="cancelButtonText">Cancelar</string>
-  <string name="contactCreatedToast">Contacto creado.</string>
-  <string name="contactSavedToast">Contacto guardado.</string>
-  <string name="contactsFavoritesLabel">Favoritos</string>
-  <string name="contactsIconLabel">Contactos</string>
-  <string name="contactsList">Contactos</string>
-  <string name="customLabelPickerTitle">Etiqueta personalizada</string>
-  <string name="default_ringtone">Predeterminado</string>
-  <string name="deleteConfirmation">Se eliminará este contacto.</string>
-  <string name="deleteConfirmation_title">Eliminar</string>
-  <string name="dialerIconLabel">Marcador</string>
-  <string name="dialerKeyboardHintText">Utilizar teclado para marcar</string>
-  <string name="doneButton">Listo</string>
-  <string name="editContactDescription">Editar contacto</string>
-  <string name="editContact_title_edit">Editar contacto</string>
-  <string name="editContact_title_insert">Nuevo contacto</string>
-  <string name="emailLabelsGroup">Correo electrónico</string>
-  <string name="errorDialogTitle">Ninguna imagen</string>
-  <string name="frequentList">Frecuente</string>
-  <string name="ghostData_company">Organización</string>
-  <string name="ghostData_email">Dirección de correo electrónico</string>
-  <string name="ghostData_im">Nombre MI</string>
-  <string name="ghostData_name">Nombre y apellido</string>
-  <string name="ghostData_notes">Mi nota</string>
-  <string name="ghostData_phone">Número de teléfono</string>
-  <string name="ghostData_postal">Dirección postal</string>
-  <string name="ghostData_title">Puesto</string>
-  <string name="groupEmpty">Su \"<xliff:g id="groupName">%s</xliff:g>\" grupo está vacío.</string>
-  <string name="groupNameMyContacts">Mis contactos</string>
-  <string name="groupNameWithPhones">Contactos con números de teléfono</string>
-  <string name="imLabelsGroup">MI</string>
-  <string name="imei">IMEI</string>
-  <string name="importFromSim">Importador de contactos de la SIM</string>
-  <string name="insertContactDescription">Crear contacto</string>
-  <string name="invalidContactMessage">El contacto no existe. </string>
-  <string name="label_company">Organización</string>
-  <string name="label_notes">Notas</string>
-  <string name="label_ringtone">Tono de timbre</string>
-  <string name="label_title">Título</string>
-  <string name="listSeparatorCallNumber">Marcar número</string>
-  <string name="listSeparatorMapAddress">Dirección en el mapa</string>
-  <string name="listSeparatorOrganizations">Organizaciones</string>
-  <string name="listSeparatorOtherInformation">Otra información</string>
-  <string name="listSeparatorSendEmail">Enviar correo electrónico</string>
-  <string name="listSeparatorSendIm">Enviar mensaje instantáneo</string>
-  <string name="listSeparatorSendSmsMms">Enviar SMS/MMS</string>
-  <string name="menu_addItem">Más información</string>
-  <string name="menu_addStar">Agregar a favoritos</string>
-  <string name="menu_call">Llamar</string>
-  <string name="menu_callNumber">Llamar a <xliff:g id="contact">%s</xliff:g></string>
-  <string name="menu_deleteContact">Eliminar contacto</string>
-  <string name="menu_dialer">Marcador</string>
-  <string name="menu_displayGroup">Mostrar grupo</string>
-  <string name="menu_doNotSave">Rechazar cambios</string>
-  <string name="menu_done">Guardar</string>
-  <string name="menu_editContact">Editar contacto</string>
-  <string name="menu_editNumberBeforeCall">Editar número antes de llamar</string>
-  <string name="menu_makeDefaultNumber">Convertir en número predeterminado</string>
-  <string name="menu_newContact">Nuevo contacto</string>
-  <string name="menu_newFavortie">Nuevo favorito</string>
-  <string name="menu_preferences">Configuración</string>
-  <string name="menu_removeStar">Quitar de favoritos</string>
-  <string name="menu_sendEmail">Enviar correo electrónico</string>
-  <string name="menu_sendSMS">Enviar SMS/MMS</string>
-  <string name="menu_sendTextMessage">Enviar mensaje SMS </string>
-  <string name="menu_viewAddress">Dirección en el mapa</string>
-  <string name="menu_viewContact">Ver contacto</string>
-  <string name="noButton">Cancelar</string>
-  <string name="noContacts">No hay contactos. </string>
-  <string name="noContactsWithPhoneNumbers">Sin contactos con números de teléfono. </string>
-  <string name="noFavorites">Sin favoritos.</string>
-  <string name="no_imei">IMEI desconocido</string>
-  <string name="ok">Aceptar</string>
-  <string name="okButtonText">Aceptar</string>
-  <string name="otherLabelsGroup">Otros</string>
-  <string name="phoneIconLabel">Teléfono</string>
-  <string name="phoneLabelsGroup">Teléfono</string>
-  <string name="photoPickerNotFoundText">No se dispone de imágenes en el teléfono. </string>
-  <string name="pickerNewContactHeader">Crear nuevo contacto</string>
-  <string name="postalLabelsGroup">Dirección postal</string>
-  <string name="private_num">Número privado</string>
-  <string name="recentCallsIconLabel">Registro de llamadas</string>
-  <string name="recentCalls_addToContact">Agregar a contactos</string>
-  <string name="recentCalls_callNumber">Llamar a <xliff:g id="who">%s</xliff:g></string>
-  <string name="recentCalls_deleteAll">Borrar registro de llamadas</string>
-  <string name="recentCalls_editNumberBeforeCall">Editar número antes de llamar</string>
-  <string name="recentCalls_empty">El registro de la llamada está vacío.</string>
-  <string name="recentCalls_removeFromRecentList">Eliminar del registro de llamadas</string>
-  <string name="removePicture">Eliminar icono</string>
-  <string name="searchHint">Buscar contactos</string>
-  <string name="selectGroupsToSync">Grupos de sincronización</string>
-  <string name="selectLabel">Seleccionar etiqueta</string>
-  <string name="select_group_title">Seleccionar grupo a visualizar</string>
-  <string name="send_to_voicemail_checkbox">Enviar las llamadas directamente al correo de voz.</string>
-  <string name="send_to_voicemail_view">Las llamadas se envían directamente al correo de voz.</string>
-  <string name="shortcutContact">Contacto</string>
-  <string name="showAllGroups">Todos los contactos</string>
-  <string name="showingGroupTitle">
-                                       <xliff:g id="groupName">%s</xliff:g>
-                               </string>
-  <string name="simContacts_emptyLoading">Cargando de tarjeta SIM\u2026</string>
-  <string name="simContacts_title">Contactos de la tarjeta SIM</string>
-  <string name="sms_entry_label">Enviar SMS/MMS</string>
-  <string name="starredList">Con estrella</string>
-  <string name="strequentList">Favoritos</string>
-  <string name="syncAllGroups">Sincronizar todos los contactos</string>
-  <string name="syncGroupChooserTitle">Seleccionar grupos a sincronizar</string>
-  <string name="syncGroupPreference">Grupos de sincronización</string>
-  <string name="syncGroupPreference_summary">Seleccionar grupos a sincronizar</string>
-  <string name="unknown">Desconocido</string>
-  <string name="viewContactDesription">Ver contacto</string>
-  <string name="viewContactTitle">Detalles del contacto</string>
-  <string name="voicemail">Correo de voz</string>
-  <string name="yesButton">Aceptar</string>
+    <string name="contactsList">"Contactos"</string>
+    <!-- no translation found for shortcutContact (1520089872483067797) -->
+    <skip />
+    <string name="starredList">"Con estrella"</string>
+    <string name="frequentList">"Frecuente"</string>
+    <string name="strequentList">"Favoritos"</string>
+    <!-- no translation found for viewContactTitle (5340316765801746261) -->
+    <skip />
+    <!-- no translation found for viewContactDesription (5593543465183236254) -->
+    <skip />
+    <!-- no translation found for editContactDescription (207393633337592309) -->
+    <skip />
+    <!-- no translation found for insertContactDescription (8392185611221432248) -->
+    <skip />
+    <string name="searchHint">"Buscar contactos"</string>
+    <string name="menu_newContact">"Nuevo contacto"</string>
+    <string name="menu_viewContact">"Ver contacto"</string>
+    <!-- unknown placeholder CONTACT in menu_callNumber -->
+    <skip />
+    <string name="menu_addStar">"Agregar estrella"</string>
+    <string name="menu_removeStar">"Quitar estrella"</string>
+    <!-- no translation found for menu_showBarcode (4627916987700748636) -->
+    <skip />
+    <string name="menu_editContact">"Editar contacto"</string>
+    <string name="menu_deleteContact">"Eliminar contacto"</string>
+    <string name="menu_call">"Llamar"</string>
+    <string name="menu_sendSMS">"Enviar texto"</string>
+    <string name="menu_sendEmail">"Enviar correo electrónico"</string>
+    <string name="menu_viewAddress">"Dirección en el mapa"</string>
+    <string name="menu_makeDefaultNumber">"Convertir en número predeterminado"</string>
+    <!-- no translation found for deleteConfirmation_title (1628057421142368583) -->
+    <skip />
+    <string name="deleteConfirmation">"¿Eliminar este contacto?"</string>
+    <string name="menu_done">"Guardar"</string>
+    <string name="menu_doNotSave">"Rechazar cambios"</string>
+    <string name="button_save">"Guardar"</string>
+    <string name="button_discard">"Rechazar cambios"</string>
+    <string name="editContact_title_edit">"Editar contacto"</string>
+    <string name="editContact_title_insert">"Nuevo contacto"</string>
+    <string name="menu_addItem">"Agregar más"</string>
+    <string name="label_notes">"Notas"</string>
+    <!-- no translation found for label_ringtone (1269538172838343970) -->
+    <skip />
+    <string name="ghostData_name">"Nombre y apellido"</string>
+    <string name="ghostData_company">"Organización"</string>
+    <string name="ghostData_title">"Puesto"</string>
+    <string name="ghostData_im">"Nombre MI"</string>
+    <string name="ghostData_notes">"Mi nota"</string>
+    <string name="ghostData_phone">"Número de teléfono"</string>
+    <string name="ghostData_email">"Dirección de correo electrónico"</string>
+    <!-- unknown placeholder BREAK_0 in ghostData_postal -->
+    <skip />
+    <string name="invalidContactMessage">"Los contactos deben tener nombres"</string>
+    <string name="pickerNewContactHeader">"Crear nuevo contacto"</string>
+    <string name="selectLabel">"Seleccionar etiqueta"</string>
+    <string name="phoneLabelsGroup">"Teléfono"</string>
+    <string name="emailLabelsGroup">"C. electrónico"</string>
+    <string name="imLabelsGroup">"MI"</string>
+    <string name="postalLabelsGroup">"Dirección postal"</string>
+    <string name="otherLabelsGroup">"Otros"</string>
+    <!-- no translation found for otherLabels:0 (3318569574569948132) -->
+    <!-- no translation found for otherLabels:1 (3325413568383685728) -->
+    <string name="errorDialogTitle">"¡Atención!"</string>
+    <string name="photoPickerNotFoundText">"Ninguna imagen disponible."</string>
+    <string name="attachToContact">"Foto de los contactos"</string>
+    <string name="customLabelPickerTitle">"Etiqueta personalizada"</string>
+    <!-- no translation found for menu_displayGroup (2835746769742496686) -->
+    <skip />
+    <!-- no translation found for syncGroupPreference (759121296595419145) -->
+    <skip />
+    <string name="importFromSim">"Importar de tarjeta SIM"</string>
+    <!-- no translation found for alphabet (4977128516779796464) -->
+    <skip />
+    <!-- no translation found for send_to_voicemail_checkbox (1699633783417579410) -->
+    <skip />
+    <!-- no translation found for send_to_voicemail_view (4299389800446371057) -->
+    <skip />
+    <!-- no translation found for default_ringtone (3998437793418131562) -->
+    <skip />
+    <!-- no translation found for addPicture (7010902051370875352) -->
+    <skip />
+    <!-- no translation found for removePicture (2322840177008417519) -->
+    <skip />
+    <!-- no translation found for noContacts (7515781671301309298) -->
+    <skip />
+    <!-- no translation found for noContactsWithPhoneNumbers (3105170743499016241) -->
+    <skip />
+    <!-- no translation found for noFavorites (7957536428532225634) -->
+    <skip />
+    <!-- no translation found for select_group_title (8821785850959403592) -->
+    <skip />
+    <!-- no translation found for groupEmpty (1733723844723885242) -->
+    <skip />
+    <!-- no translation found for showAllGroups (4524662887308889400) -->
+    <skip />
+    <!-- no translation found for syncAllGroups (8415112909188430211) -->
+    <skip />
+    <!-- no translation found for groupNameMyContacts (1298661863710879264) -->
+    <skip />
+    <!-- no translation found for groupNameWithPhones (4051877952712463294) -->
+    <skip />
+    <!-- no translation found for contactCreatedToast (5309869712901550955) -->
+    <skip />
+    <!-- no translation found for contactSavedToast (1228932477738680325) -->
+    <skip />
+    <!-- no translation found for listSeparatorCallNumber (9142725721395758026) -->
+    <skip />
+    <!-- no translation found for listSeparatorSendSmsMms (8878062000446372333) -->
+    <skip />
+    <!-- no translation found for listSeparatorSendEmail (3813935531061488274) -->
+    <skip />
+    <!-- no translation found for listSeparatorSendIm (3885045096980470847) -->
+    <skip />
+    <!-- no translation found for listSeparatorMapAddress (7749519405208811410) -->
+    <skip />
+    <!-- no translation found for listSeparatorOrganizations (5731454670822188295) -->
+    <skip />
+    <!-- no translation found for listSeparatorOtherInformation (3399084175925138065) -->
+    <skip />
+    <!-- no translation found for contactsIconLabel (392729648321810378) -->
+    <skip />
+    <!-- no translation found for contactsFavoritesLabel (6274307000699136596) -->
+    <skip />
+    <!-- no translation found for dialerIconLabel (396765298398417139) -->
+    <skip />
+    <!-- no translation found for recentCallsIconLabel (7432201162713288826) -->
+    <skip />
+    <!-- no translation found for liveFolderAll (5991510762804226223) -->
+    <skip />
+    <!-- no translation found for liveFolderFavorites (8755759874416875970) -->
+    <skip />
+    <!-- no translation found for liveFolderPhone (3440101264360244544) -->
+    <skip />
+    <!-- no translation found for menu_sendTextMessage (3055919380461974147) -->
+    <skip />
+    <!-- no translation found for recentCalls_callNumber (924407199258234369) -->
+    <skip />
+    <!-- no translation found for recentCalls_editNumberBeforeCall (7859145185424954030) -->
+    <skip />
+    <!-- no translation found for recentCalls_addToContact (6950267092567953305) -->
+    <skip />
+    <!-- no translation found for recentCalls_removeFromRecentList (5273789011391059975) -->
+    <skip />
+    <!-- no translation found for recentCalls_deleteAll (425798199678070888) -->
+    <skip />
+    <!-- no translation found for recentCalls_empty (7787624895504983911) -->
+    <skip />
+    <!-- no translation found for imei (1052536402066249452) -->
+    <skip />
+    <!-- no translation found for voicemail (1135686231023059817) -->
+    <skip />
+    <!-- no translation found for unknown (6231893925212017656) -->
+    <skip />
+    <!-- no translation found for private_num (3065614133902647350) -->
+    <skip />
+    <!-- no translation found for dialerKeyboardHintText (2013777173021862941) -->
+    <skip />
+    <!-- no translation found for simContacts_emptyLoading (4828419758306519589) -->
+    <skip />
+    <!-- no translation found for simContacts_title (4162577066960174009) -->
+    <skip />
+    <!-- no translation found for contactsSyncPlug (1549212649158409469) -->
+    <skip />
+    <!-- no translation found for noContactsHelpText (6155730972704522463) -->
+    <skip />
+    <!-- no translation found for seclectSyncGroups_title (7675331949118054911) -->
+    <skip />
+    <!-- no translation found for liveFolder_all_label (3716551598022430019) -->
+    <skip />
+    <!-- no translation found for liveFolder_favorites_label (9053985659909059395) -->
+    <skip />
+    <!-- no translation found for liveFolder_phones_label (8943901400107401868) -->
+    <skip />
 </resources>
diff --git a/res/values-fr-rFR/strings.xml b/res/values-fr-rFR/strings.xml
deleted file mode 100644 (file)
index 649348f..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="addPicture">Ajouter une icône</string>
-  <string name="allContacts">Tous les contacts</string>
-  <string name="alphabet">\u0020ABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
-  <string name="attachToContact">Icône de contact</string>
-  <string name="button_discard">Abandonner les modifications</string>
-  <string name="button_save">Enregistrer</string>
-  <string name="cancelButtonText">Annuler</string>
-  <string name="contactCreatedToast">Contact créé.</string>
-  <string name="contactSavedToast">Contact enregistré.</string>
-  <string name="contactsFavoritesLabel">Favoris</string>
-  <string name="contactsIconLabel">Contacts</string>
-  <string name="contactsList">Contacts</string>
-  <string name="customLabelPickerTitle">Étiquette personnalisée</string>
-  <string name="default_ringtone">Par défaut</string>
-  <string name="deleteConfirmation">Ce contact sera supprimé.</string>
-  <string name="deleteConfirmation_title">Supprimer</string>
-  <string name="dialerIconLabel">Numéroteur</string>
-  <string name="dialerKeyboardHintText">Utiliser le clavier pour numéroter</string>
-  <string name="doneButton">Terminé</string>
-  <string name="editContactDescription">Modifier le contact</string>
-  <string name="editContact_title_edit">Modifier le contact</string>
-  <string name="editContact_title_insert">Nouveau contact</string>
-  <string name="emailLabelsGroup">Email</string>
-  <string name="errorDialogTitle">Aucune image</string>
-  <string name="frequentList">Fréquent</string>
-  <string name="ghostData_company">Société</string>
-  <string name="ghostData_email">Adresse de messagerie</string>
-  <string name="ghostData_im">Nom IM</string>
-  <string name="ghostData_name">Prénom et Nom</string>
-  <string name="ghostData_notes">Ma note</string>
-  <string name="ghostData_phone">Numéro de téléphone</string>
-  <string name="ghostData_postal">Adresse postale</string>
-  <string name="ghostData_title">Position</string>
-  <string name="groupEmpty">Votre groupe \"<xliff:g id="groupName">%s</xliff:g>\" est vide.</string>
-  <string name="groupNameMyContacts">Mes contacts</string>
-  <string name="groupNameWithPhones">Contacts avec numéros de téléphone</string>
-  <string name="imLabelsGroup">IM</string>
-  <string name="imei">IMEI</string>
-  <string name="importFromSim">Importateur de contacts SIM</string>
-  <string name="insertContactDescription">Créer un contact</string>
-  <string name="invalidContactMessage">Le contact n\'existe pas.</string>
-  <string name="label_company">Société</string>
-  <string name="label_notes">Notes</string>
-  <string name="label_ringtone">Sonnerie</string>
-  <string name="label_title">Titre</string>
-  <string name="listSeparatorCallNumber">Composer le numéro</string>
-  <string name="listSeparatorMapAddress">Adresse carte</string>
-  <string name="listSeparatorOrganizations">Organisations</string>
-  <string name="listSeparatorOtherInformation">Autres informations</string>
-  <string name="listSeparatorSendEmail">Envoyer e-mail</string>
-  <string name="listSeparatorSendIm">Envoyer message instantané</string>
-  <string name="listSeparatorSendSmsMms">Envoyer SMS/MMS</string>
-  <string name="menu_addItem">Plus d\'infos</string>
-  <string name="menu_addStar">Ajouter aux favoris</string>
-  <string name="menu_call">Appeler</string>
-  <string name="menu_callNumber">Appeler <xliff:g id="contact">%s</xliff:g></string>
-  <string name="menu_deleteContact">Supprimer le contact</string>
-  <string name="menu_dialer">Numéroteur</string>
-  <string name="menu_displayGroup">Afficher le groupe</string>
-  <string name="menu_doNotSave">Abandonner les modifications</string>
-  <string name="menu_done">Enregistrer</string>
-  <string name="menu_editContact">Modifier le contact</string>
-  <string name="menu_editNumberBeforeCall">Modifier le numéro avant l\'appel</string>
-  <string name="menu_makeDefaultNumber">Définir numéro par défaut</string>
-  <string name="menu_newContact">Nouveau contact</string>
-  <string name="menu_newFavortie">Nouveau favori</string>
-  <string name="menu_preferences">Paramètres</string>
-  <string name="menu_removeStar">Supprimer des favoris</string>
-  <string name="menu_sendEmail">Envoyer e-mail</string>
-  <string name="menu_sendSMS">Envoyer SMS/MMS</string>
-  <string name="menu_sendTextMessage">Envoyer SMS</string>
-  <string name="menu_viewAddress">Adresse carte</string>
-  <string name="menu_viewContact">Afficher le contact</string>
-  <string name="noButton">Annuler</string>
-  <string name="noContacts">Aucun contact.</string>
-  <string name="noContactsWithPhoneNumbers">Aucun contact avec numéros de téléphone.</string>
-  <string name="noFavorites">Aucun favori.</string>
-  <string name="no_imei">IMEI inconnu</string>
-  <string name="ok">OK</string>
-  <string name="okButtonText">OK</string>
-  <string name="otherLabelsGroup">Autre</string>
-  <string name="phoneIconLabel">Téléphone</string>
-  <string name="phoneLabelsGroup">Téléphone</string>
-  <string name="photoPickerNotFoundText">Aucune image disponible sur le téléphone.</string>
-  <string name="pickerNewContactHeader">Créer un nouveau contact</string>
-  <string name="postalLabelsGroup">Adresse postale</string>
-  <string name="private_num">Numéro privé</string>
-  <string name="recentCallsIconLabel">Journal d\'appel</string>
-  <string name="recentCalls_addToContact">Ajouter aux contacts</string>
-  <string name="recentCalls_callNumber">Appeler <xliff:g id="who">%s</xliff:g></string>
-  <string name="recentCalls_deleteAll">Effacer le journal d\'appel</string>
-  <string name="recentCalls_editNumberBeforeCall">Modifier le numéro avant l\'appel</string>
-  <string name="recentCalls_empty">Le journal d\'appel est vide.</string>
-  <string name="recentCalls_removeFromRecentList">Supprimer du journal d\'appel</string>
-  <string name="removePicture">Supprimer l\'icône</string>
-  <string name="searchHint">Rechercher les contacts</string>
-  <string name="selectGroupsToSync">Synchroniser les groupes</string>
-  <string name="selectLabel">Sélectionner étiquette</string>
-  <string name="select_group_title">Sélectionner un groupe à afficher</string>
-  <string name="send_to_voicemail_checkbox">Envoyez les appels directement à la messagerie.</string>
-  <string name="send_to_voicemail_view">Les appels sont envoyés directement à la messagerie.</string>
-  <string name="shortcutContact">Contact</string>
-  <string name="showAllGroups">Tous les contacts</string>
-  <string name="showingGroupTitle">
-                                       <xliff:g id="groupName">%s</xliff:g>
-                               </string>
-  <string name="simContacts_emptyLoading">Chargement depuis la carte SIM\u2026</string>
-  <string name="simContacts_title">Contacts de la carte SIM</string>
-  <string name="sms_entry_label">Envoyer SMS/MMS</string>
-  <string name="starredList">Étoilé</string>
-  <string name="strequentList">Favoris</string>
-  <string name="syncAllGroups">Synchroniser tous les contacts</string>
-  <string name="syncGroupChooserTitle">Sélectionner les groupes à synchroniser</string>
-  <string name="syncGroupPreference">Synchroniser les groupes</string>
-  <string name="syncGroupPreference_summary">Sélectionner les groupes à synchroniser</string>
-  <string name="unknown">Inconnu</string>
-  <string name="viewContactDesription">Afficher le contact</string>
-  <string name="viewContactTitle">Détails du contact</string>
-  <string name="voicemail">Messagerie vocale</string>
-  <string name="yesButton">OK</string>
-</resources>
diff --git a/res/values-it-rIT/strings.xml b/res/values-it-rIT/strings.xml
deleted file mode 100644 (file)
index 24e3e17..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="addPicture">Aggiungi icona</string>
-  <string name="allContacts">Tutti i contatti</string>
-  <string name="alphabet">\u0020ABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
-  <string name="attachToContact">Icona Contatti</string>
-  <string name="button_discard">Ignora modifiche</string>
-  <string name="button_save">Salva</string>
-  <string name="cancelButtonText">Annulla</string>
-  <string name="contactCreatedToast">Creazione contatto completata.</string>
-  <string name="contactSavedToast">Salvataggio contatto completato.</string>
-  <string name="contactsFavoritesLabel">Preferiti</string>
-  <string name="contactsIconLabel">Contatti</string>
-  <string name="contactsList">Contatti</string>
-  <string name="customLabelPickerTitle">Etichetta personalizzata</string>
-  <string name="default_ringtone">Predefinito</string>
-  <string name="deleteConfirmation">Il contatto verrà eliminato.</string>
-  <string name="deleteConfirmation_title">Elimina</string>
-  <string name="dialerIconLabel">Dialer</string>
-  <string name="dialerKeyboardHintText">Utilizzare la tastiera per comporre il numero</string>
-  <string name="doneButton">Completato</string>
-  <string name="editContactDescription">Modifica contatto</string>
-  <string name="editContact_title_edit">Modifica contatto</string>
-  <string name="editContact_title_insert">Nuovo contatto</string>
-  <string name="emailLabelsGroup">Email</string>
-  <string name="errorDialogTitle">Nessuna immagine</string>
-  <string name="frequentList">Frequente</string>
-  <string name="ghostData_company">Società</string>
-  <string name="ghostData_email">Indirizzo e-mail</string>
-  <string name="ghostData_im">Nome IM</string>
-  <string name="ghostData_name">Nome e cognome</string>
-  <string name="ghostData_notes">Nota</string>
-  <string name="ghostData_phone">Numero di telefono</string>
-  <string name="ghostData_postal">Indirizzo postale</string>
-  <string name="ghostData_title">Posizione</string>
-  <string name="groupEmpty">Il gruppo \"<xliff:g id="groupName">%s</xliff:g>\" è vuoto.</string>
-  <string name="groupNameMyContacts">Contatti</string>
-  <string name="groupNameWithPhones">Contatti con numeri di telefono</string>
-  <string name="imLabelsGroup">IM</string>
-  <string name="imei">IMEI</string>
-  <string name="importFromSim">Importazione contati SIM</string>
-  <string name="insertContactDescription">Crea contatto</string>
-  <string name="invalidContactMessage">Il contatto non esiste.</string>
-  <string name="label_company">Società</string>
-  <string name="label_notes">Note</string>
-  <string name="label_ringtone">Suoneria</string>
-  <string name="label_title">Posizione</string>
-  <string name="listSeparatorCallNumber">Componi numero</string>
-  <string name="listSeparatorMapAddress">Indirizzo su cartina</string>
-  <string name="listSeparatorOrganizations">Organizzazioni</string>
-  <string name="listSeparatorOtherInformation">Altre informazioni</string>
-  <string name="listSeparatorSendEmail">Invia messaggio e-mail</string>
-  <string name="listSeparatorSendIm">Invia messaggio immediato</string>
-  <string name="listSeparatorSendSmsMms">Invia SMS/MMS</string>
-  <string name="menu_addItem">Ulteriori informazioni</string>
-  <string name="menu_addStar">Aggiungi a Preferiti</string>
-  <string name="menu_call">Chiama</string>
-  <string name="menu_callNumber">Chiama <xliff:g id="contact">%s</xliff:g></string>
-  <string name="menu_deleteContact">Elimina contatto</string>
-  <string name="menu_dialer">Dialer</string>
-  <string name="menu_displayGroup">Visualizza gruppo</string>
-  <string name="menu_doNotSave">Ignora modifiche</string>
-  <string name="menu_done">Salva</string>
-  <string name="menu_editContact">Modifica contatto</string>
-  <string name="menu_editNumberBeforeCall">Modifica numero prima di chiamare</string>
-  <string name="menu_makeDefaultNumber">Imposta come numero predefinito</string>
-  <string name="menu_newContact">Nuovo contatto</string>
-  <string name="menu_newFavortie">Nuovo preferito</string>
-  <string name="menu_preferences">Impostazioni</string>
-  <string name="menu_removeStar">Rimuovi da Preferiti</string>
-  <string name="menu_sendEmail">Invia messaggio e-mail</string>
-  <string name="menu_sendSMS">Invia SMS/MMS</string>
-  <string name="menu_sendTextMessage">Invia messaggio SMS</string>
-  <string name="menu_viewAddress">Indirizzo su cartina</string>
-  <string name="menu_viewContact">Visualizza contatto</string>
-  <string name="noButton">Annulla</string>
-  <string name="noContacts">Nessun contatto.</string>
-  <string name="noContactsWithPhoneNumbers">Nessun contatto con numeri di telefono.</string>
-  <string name="noFavorites">Nessun preferito.</string>
-  <string name="no_imei">IMEI sconosciuto</string>
-  <string name="ok">OK</string>
-  <string name="okButtonText">OK</string>
-  <string name="otherLabelsGroup">Altro</string>
-  <string name="phoneIconLabel">Telefono</string>
-  <string name="phoneLabelsGroup">Telefono</string>
-  <string name="photoPickerNotFoundText">Nessuna immagine disponibile sul telefono.</string>
-  <string name="pickerNewContactHeader">Crea nuovo contatto</string>
-  <string name="postalLabelsGroup">Indirizzo postale</string>
-  <string name="private_num">Numero privato</string>
-  <string name="recentCallsIconLabel">Registro chiamate</string>
-  <string name="recentCalls_addToContact">Aggiungi a Contatti</string>
-  <string name="recentCalls_callNumber">Chiama <xliff:g id="who">%s</xliff:g></string>
-  <string name="recentCalls_deleteAll">Cancella registro chiamate</string>
-  <string name="recentCalls_editNumberBeforeCall">Modifica numero prima di chiamare</string>
-  <string name="recentCalls_empty">Il registro chiamate è vuoto.</string>
-  <string name="recentCalls_removeFromRecentList">Rimuovi da registro chiamate</string>
-  <string name="removePicture">Icona Rimuovi</string>
-  <string name="searchHint">Cerca contatti</string>
-  <string name="selectGroupsToSync">Sincronizza gruppi</string>
-  <string name="selectLabel">Seleziona etichetta</string>
-  <string name="select_group_title">Seleziona gruppo da visualizzare</string>
-  <string name="send_to_voicemail_checkbox">Invia le chiamate direttamente alla casella vocale.</string>
-  <string name="send_to_voicemail_view">Le chiamate vengono inviate direttamente alla casella vocale.</string>
-  <string name="shortcutContact">Contatto</string>
-  <string name="showAllGroups">Tutti i contatti</string>
-  <string name="showingGroupTitle">
-                                       <xliff:g id="groupName">%s</xliff:g>
-                               </string>
-  <string name="simContacts_emptyLoading">Caricamento dalla scheda SIM in corso\u2026</string>
-  <string name="simContacts_title">Contatti scheda SIM</string>
-  <string name="sms_entry_label">Invia SMS/MMS</string>
-  <string name="starredList">Primo piano</string>
-  <string name="strequentList">Preferiti</string>
-  <string name="syncAllGroups">Sincronizza tutti i contatti</string>
-  <string name="syncGroupChooserTitle">Selezionare i gruppi da sincronizzare</string>
-  <string name="syncGroupPreference">Sincronizza gruppi</string>
-  <string name="syncGroupPreference_summary">Selezionare i gruppi da sincronizzare</string>
-  <string name="unknown">Sconosciuto</string>
-  <string name="viewContactDesription">Visualizza contatto</string>
-  <string name="viewContactTitle">Dettagli contatto</string>
-  <string name="voicemail">Posta vocale</string>
-  <string name="yesButton">OK</string>
-</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
new file mode 100644 (file)
index 0000000..cb8c49c
--- /dev/null
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="contactsList">"連絡先"</string>
+    <string name="shortcutContact">"連絡先"</string>
+    <string name="starredList">"スター付き"</string>
+    <string name="frequentList">"よく連絡する連絡先"</string>
+    <string name="strequentList">"お気に入り"</string>
+    <string name="viewContactTitle">"連絡先情報"</string>
+    <string name="viewContactDesription">"連絡先を表示"</string>
+    <string name="editContactDescription">"連絡先を編集"</string>
+    <string name="insertContactDescription">"連絡先を作成"</string>
+    <string name="searchHint">"連絡先を検索"</string>
+    <string name="menu_newContact">"新しい連絡先"</string>
+    <string name="menu_viewContact">"連絡先を表示"</string>
+    <string name="menu_callNumber">"<xliff:g id="NAME">%s</xliff:g>さんに発信"</string>
+    <!-- no translation found for menu_addStar (2908478235715404876) -->
+    <skip />
+    <!-- no translation found for menu_removeStar (5844227078364227030) -->
+    <skip />
+    <!-- no translation found for menu_showBarcode (309973637178814132) -->
+    <skip />
+    <string name="menu_editContact">"連絡先を編集"</string>
+    <string name="menu_deleteContact">"連絡先を削除"</string>
+    <string name="menu_call">"発信"</string>
+    <string name="menu_sendSMS">"SMS/MMSを送信"</string>
+    <string name="menu_sendEmail">"メールを送信"</string>
+    <string name="menu_viewAddress">"地図の住所"</string>
+    <string name="menu_makeDefaultNumber">"デフォルトの番号に設定"</string>
+    <string name="deleteConfirmation_title">"削除"</string>
+    <string name="deleteConfirmation">"この連絡先を削除します。"</string>
+    <string name="menu_done">"保存"</string>
+    <string name="menu_doNotSave">"変更を破棄"</string>
+    <string name="button_save">"保存"</string>
+    <string name="button_discard">"変更を破棄"</string>
+    <string name="editContact_title_edit">"連絡先を編集"</string>
+    <string name="editContact_title_insert">"新しい連絡先"</string>
+    <string name="menu_addItem">"詳細情報"</string>
+    <string name="label_notes">"メモ"</string>
+    <string name="label_ringtone">"着信音"</string>
+    <string name="ghostData_name">"氏名を入力してください"</string>
+    <string name="ghostData_company">"会社"</string>
+    <string name="ghostData_title">"役職"</string>
+    <string name="ghostData_im">"IM名"</string>
+    <string name="ghostData_notes">"メモ"</string>
+    <string name="ghostData_phone">"電話番号"</string>
+    <string name="ghostData_email">"メールアドレス"</string>
+    <string name="ghostData_postal">"住所"</string>
+    <string name="invalidContactMessage">"連絡先が存在しません。"</string>
+    <string name="pickerNewContactHeader">"新しい連絡先を登録"</string>
+    <string name="selectLabel">"ラベルを選択"</string>
+    <string name="phoneLabelsGroup">"電話番号"</string>
+    <string name="emailLabelsGroup">"メール"</string>
+    <string name="imLabelsGroup">"IM"</string>
+    <string name="postalLabelsGroup">"住所"</string>
+    <string name="otherLabelsGroup">"その他"</string>
+  <string-array name="otherLabels">
+    <item>"組織"</item>
+    <item>"メモ"</item>
+  </string-array>
+    <string name="errorDialogTitle">"写真なし"</string>
+    <string name="photoPickerNotFoundText">"使用できる写真が携帯電話にありません。"</string>
+    <string name="attachToContact">"連絡先のアイコン"</string>
+    <!-- no translation found for customLabelPickerTitle (1081475101983255212) -->
+    <skip />
+    <string name="menu_displayGroup">"グループを表示"</string>
+    <string name="syncGroupPreference">"同期グループを編集"</string>
+    <string name="importFromSim">"連絡先をインポート"</string>
+    <string name="alphabet">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="send_to_voicemail_checkbox">"着信を直接ボイスメールに転送する"</string>
+    <string name="send_to_voicemail_view">"着信はボイスメールに直接転送されます。"</string>
+    <string name="default_ringtone">"デフォルト"</string>
+    <string name="addPicture">"アイコンを追加"</string>
+    <string name="removePicture">"アイコンを削除"</string>
+    <string name="noContacts">"連絡先がありません。"</string>
+    <string name="noContactsWithPhoneNumbers">"電話番号のある連絡先がありません。"</string>
+    <string name="noFavorites">"お気に入りがありません。"</string>
+    <!-- no translation found for select_group_title (7955698611959835612) -->
+    <skip />
+    <string name="groupEmpty">"「<xliff:g id="GROUPNAME">%s</xliff:g>」グループには何も登録されていません。"</string>
+    <string name="showAllGroups">"すべての連絡先"</string>
+    <string name="syncAllGroups">"全連絡先の同期を取る"</string>
+    <string name="groupNameMyContacts">"連絡先リスト"</string>
+    <string name="groupNameWithPhones">"電話番号のある連絡先"</string>
+    <string name="contactCreatedToast">"連絡先を作成しました。"</string>
+    <string name="contactSavedToast">"連絡先を保存しました。"</string>
+    <string name="listSeparatorCallNumber">"電話をかける"</string>
+    <string name="listSeparatorSendSmsMms">"SMS/MMSを送信"</string>
+    <string name="listSeparatorSendEmail">"メールを送信"</string>
+    <string name="listSeparatorSendIm">"インスタントメッセージを送信"</string>
+    <string name="listSeparatorMapAddress">"地図の住所"</string>
+    <string name="listSeparatorOrganizations">"組織"</string>
+    <string name="listSeparatorOtherInformation">"その他の情報"</string>
+    <string name="contactsIconLabel">"連絡先"</string>
+    <string name="contactsFavoritesLabel">"お気に入り"</string>
+    <string name="dialerIconLabel">"ダイヤラ"</string>
+    <string name="recentCallsIconLabel">"通話ログ"</string>
+    <!-- no translation found for liveFolderAll (4789010460767506206) -->
+    <skip />
+    <!-- no translation found for liveFolderFavorites (3100957542927222282) -->
+    <skip />
+    <!-- no translation found for liveFolderPhone (3739376066610926780) -->
+    <skip />
+    <string name="menu_sendTextMessage">"SMSメッセージを送信"</string>
+    <string name="recentCalls_callNumber">"<xliff:g id="NAME">%s</xliff:g>さんに発信"</string>
+    <string name="recentCalls_editNumberBeforeCall">"番号を編集して発信"</string>
+    <string name="recentCalls_addToContact">"連絡先に追加"</string>
+    <string name="recentCalls_removeFromRecentList">"通話ログを削除"</string>
+    <string name="recentCalls_deleteAll">"すべてのログをクリア"</string>
+    <string name="recentCalls_empty">"通話ログはありません。"</string>
+    <string name="imei">"IMEI"</string>
+    <string name="voicemail">"ボイスメール"</string>
+    <string name="unknown">"不明"</string>
+    <string name="private_num">"非通知番号"</string>
+    <string name="dialerKeyboardHintText">"番号をキーボードから入力してください"</string>
+    <!-- no translation found for dialerDialpadHintText (5824490365898349041) -->
+    <skip />
+    <string name="simContacts_emptyLoading">"SIMカードからロードしています..."</string>
+    <string name="simContacts_title">"SIMカードの連絡先"</string>
+    <string name="contactsSyncPlug"><font fgcolor="#ffffffff">"Googleコンタクトと同期を取ります。"</font>" "\n"同期が終わると、いつでもこの携帯電話で連絡先を使用できます。"</string>
+    <string name="noContactsHelpText">"登録されている連絡先がありません。"\n\n"連絡先を追加するには["<font fgcolor="#ffffffff"><b>"メニュー"</b></font>"]を押して、次のどれかを選択します。"\n\n"        "\n<li>"["<font fgcolor="#ffffffff"><b>"同期グループを編集"</b></font>"]-新規または既存のGoogleアカウントから追加する場合"\n</li>\n"        "\n<li>"["<font fgcolor="#ffffffff"><b>"新しい連絡先"</b></font>"]-最初から新しい連絡先を作成する場合"\n</li>\n"        "\n<li>"["<font fgcolor="#ffffffff"><b>"連絡先をインポート"</b></font>"]-SIMカードから連絡先を追加する場合"\n</li></string>
+    <string name="seclectSyncGroups_title">"同期を取るグループを選択"</string>
+    <!-- no translation found for liveFolder_all_label (1552523730090319259) -->
+    <skip />
+    <!-- no translation found for liveFolder_favorites_label (2674341514070517105) -->
+    <skip />
+    <!-- no translation found for liveFolder_phones_label (1709786878793436245) -->
+    <skip />
+    <!-- no translation found for dialer_useDtmfDialpad (1707548397435075040) -->
+    <skip />
+    <!-- no translation found for dialer_returnToInCallScreen (3719386377550913067) -->
+    <skip />
+    <!-- no translation found for dialer_addAnotherCall (4205688819890074468) -->
+    <skip />
+</resources>
index 9955277..09ce1bb 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="attachToContact">Afbeelding contactpersoon </string>
-  <string name="button_discard">Wijzigingen negeren</string>
-  <string name="button_save">Opslaan</string>
-  <string name="cancelButtonText">Annuleren</string>
-  <string name="contactsList">Contacten</string>
-  <string name="continueEditing">Bewerken hervatten</string>
-  <string name="customLabelPickerTitle">Aangepast label</string>
-  <string name="deleteConfirmation">Deze contact verwijderen?</string>
-  <string name="discardChanges">Wijzigingen negeren</string>
-  <string name="displayAllPreference">Alle contacten weergeven</string>
-  <string name="displayAllPreference_summary">Alle contacten weergeven, of alleen die met telefoonnummers</string>
-  <string name="editContact_title_edit">Contact bewerken</string>
-  <string name="editContact_title_insert">Nieuw contact</string>
-  <string name="emailLabelsGroup">E-mail</string>
-  <string name="errorDialogTitle">Let op!</string>
-  <string name="frequentList">Regelmatig</string>
-  <string name="ghostData_company">Bedrijf</string>
-  <string name="ghostData_email">E-mailadres</string>
-  <string name="ghostData_im">IM-naam</string>
-  <string name="ghostData_name">Eerste en laatste</string>
-  <string name="ghostData_notes">Mijn opmerking</string>
-  <string name="ghostData_phone">Telefoonnummer</string>
-  <string name="ghostData_postal">"Straat\nPlaats, staat postcode\nland"</string>
-  <string name="ghostData_title">Positie</string>
-  <string name="imLabelsGroup">Expresbericht</string>
-  <string name="importFromSim">Importeren van sim-kaart</string>
-  <string name="invalidContactMessage">Contacten moeten namen hebben</string>
-  <string name="label_company">Bedrijf</string>
-  <string name="label_notes">Opmerkingen</string>
-  <string name="label_title">Functie</string>
-  <string name="menu_addItem">Meer toevoegen</string>
-  <string name="menu_addStar">Ster toevoegen</string>
-  <string name="menu_call">Bellen</string>
-  <string name="menu_callNumber">Bellen<xliff:g id="contact">%s</xliff:g></string>
-  <string name="menu_deleteContact">Contact verwijderen</string>
-  <string name="menu_dialer">Kiezer</string>
-  <string name="menu_doNotSave">Wijzigingen negeren</string>
-  <string name="menu_done">Opslaan</string>
-  <string name="menu_editContact">Contact bewerken</string>
-  <string name="menu_editNumberBeforeCall">Nummer bewerken voor bellen</string>
-  <string name="menu_makeDefaultNumber">Standaardnummer maken</string>
-  <string name="menu_newContact">Nieuw contact</string>
-  <string name="menu_preferences">Instellingen</string>
-  <string name="menu_removeStar">Ster verwijderen</string>
-  <string name="menu_sendEmail">E-mail verzenden</string>
-  <string name="menu_sendSMS">Tekst verzenden</string>
-  <string name="menu_viewAddress">Kaartadres</string>
-  <string name="menu_viewContact">Contact weergeven</string>
-  <string name="noButton">Annuleren</string>
-  <string name="okButtonText">OK</string>
-  <string name="otherLabelsGroup">Overig</string>
-  <string name="phoneLabelsGroup">Telefoon</string>
-  <string name="photoPickerNotFoundText">Geen afbeeldingen beschikbaar.</string>
-  <string name="pickerNewContactHeader">Nieuwe contact maken</string>
-  <string name="postalLabelsGroup">Postadres</string>
-  <string name="searchHint">Contacten zoeken</string>
-  <string name="selectLabel">Label selecteren</string>
-  <string name="sms_entry_label">SMS verzenden</string>
-  <string name="starredList">Met ster</string>
-  <string name="strequentList">Favorieten</string>
-  <string name="yesButton">OK</string>
+    <string name="contactsList">"Contacten"</string>
+    <!-- no translation found for shortcutContact (1520089872483067797) -->
+    <skip />
+    <string name="starredList">"Met ster"</string>
+    <string name="frequentList">"Regelmatig"</string>
+    <string name="strequentList">"Favorieten"</string>
+    <!-- no translation found for viewContactTitle (5340316765801746261) -->
+    <skip />
+    <!-- no translation found for viewContactDesription (5593543465183236254) -->
+    <skip />
+    <!-- no translation found for editContactDescription (207393633337592309) -->
+    <skip />
+    <!-- no translation found for insertContactDescription (8392185611221432248) -->
+    <skip />
+    <string name="searchHint">"Contacten zoeken"</string>
+    <string name="menu_newContact">"Nieuw contact"</string>
+    <string name="menu_viewContact">"Contact weergeven"</string>
+    <!-- unknown placeholder CONTACT in menu_callNumber -->
+    <skip />
+    <string name="menu_addStar">"Ster toevoegen"</string>
+    <string name="menu_removeStar">"Ster verwijderen"</string>
+    <!-- no translation found for menu_showBarcode (4627916987700748636) -->
+    <skip />
+    <string name="menu_editContact">"Contact bewerken"</string>
+    <string name="menu_deleteContact">"Contact verwijderen"</string>
+    <string name="menu_call">"Bellen"</string>
+    <string name="menu_sendSMS">"Tekst verzenden"</string>
+    <string name="menu_sendEmail">"E-mail verzenden"</string>
+    <string name="menu_viewAddress">"Kaartadres"</string>
+    <string name="menu_makeDefaultNumber">"Standaardnummer maken"</string>
+    <!-- no translation found for deleteConfirmation_title (1628057421142368583) -->
+    <skip />
+    <string name="deleteConfirmation">"Deze contact verwijderen?"</string>
+    <string name="menu_done">"Opslaan"</string>
+    <string name="menu_doNotSave">"Wijzigingen negeren"</string>
+    <string name="button_save">"Opslaan"</string>
+    <string name="button_discard">"Wijzigingen negeren"</string>
+    <string name="editContact_title_edit">"Contact bewerken"</string>
+    <string name="editContact_title_insert">"Nieuw contact"</string>
+    <string name="menu_addItem">"Meer toevoegen"</string>
+    <string name="label_notes">"Opmerkingen"</string>
+    <!-- no translation found for label_ringtone (1269538172838343970) -->
+    <skip />
+    <string name="ghostData_name">"Eerste en laatste"</string>
+    <string name="ghostData_company">"Bedrijf"</string>
+    <string name="ghostData_title">"Positie"</string>
+    <string name="ghostData_im">"IM-naam"</string>
+    <string name="ghostData_notes">"Mijn opmerking"</string>
+    <string name="ghostData_phone">"Telefoonnummer"</string>
+    <string name="ghostData_email">"E-mailadres"</string>
+    <!-- unknown placeholder BREAK_0 in ghostData_postal -->
+    <skip />
+    <string name="invalidContactMessage">"Contacten moeten namen hebben"</string>
+    <string name="pickerNewContactHeader">"Nieuwe contact maken"</string>
+    <string name="selectLabel">"Label selecteren"</string>
+    <string name="phoneLabelsGroup">"Telefoon"</string>
+    <string name="emailLabelsGroup">"E-mail"</string>
+    <string name="imLabelsGroup">"Expresbericht"</string>
+    <string name="postalLabelsGroup">"Postadres"</string>
+    <string name="otherLabelsGroup">"Overig"</string>
+    <!-- no translation found for otherLabels:0 (3318569574569948132) -->
+    <!-- no translation found for otherLabels:1 (3325413568383685728) -->
+    <string name="errorDialogTitle">"Let op!"</string>
+    <string name="photoPickerNotFoundText">"Geen afbeeldingen beschikbaar."</string>
+    <string name="attachToContact">"Afbeelding contactpersoon "</string>
+    <string name="customLabelPickerTitle">"Aangepast label"</string>
+    <!-- no translation found for menu_displayGroup (2835746769742496686) -->
+    <skip />
+    <!-- no translation found for syncGroupPreference (759121296595419145) -->
+    <skip />
+    <string name="importFromSim">"Importeren van sim-kaart"</string>
+    <!-- no translation found for alphabet (4977128516779796464) -->
+    <skip />
+    <!-- no translation found for send_to_voicemail_checkbox (1699633783417579410) -->
+    <skip />
+    <!-- no translation found for send_to_voicemail_view (4299389800446371057) -->
+    <skip />
+    <!-- no translation found for default_ringtone (3998437793418131562) -->
+    <skip />
+    <!-- no translation found for addPicture (7010902051370875352) -->
+    <skip />
+    <!-- no translation found for removePicture (2322840177008417519) -->
+    <skip />
+    <!-- no translation found for noContacts (7515781671301309298) -->
+    <skip />
+    <!-- no translation found for noContactsWithPhoneNumbers (3105170743499016241) -->
+    <skip />
+    <!-- no translation found for noFavorites (7957536428532225634) -->
+    <skip />
+    <!-- no translation found for select_group_title (8821785850959403592) -->
+    <skip />
+    <!-- no translation found for groupEmpty (1733723844723885242) -->
+    <skip />
+    <!-- no translation found for showAllGroups (4524662887308889400) -->
+    <skip />
+    <!-- no translation found for syncAllGroups (8415112909188430211) -->
+    <skip />
+    <!-- no translation found for groupNameMyContacts (1298661863710879264) -->
+    <skip />
+    <!-- no translation found for groupNameWithPhones (4051877952712463294) -->
+    <skip />
+    <!-- no translation found for contactCreatedToast (5309869712901550955) -->
+    <skip />
+    <!-- no translation found for contactSavedToast (1228932477738680325) -->
+    <skip />
+    <!-- no translation found for listSeparatorCallNumber (9142725721395758026) -->
+    <skip />
+    <!-- no translation found for listSeparatorSendSmsMms (8878062000446372333) -->
+    <skip />
+    <!-- no translation found for listSeparatorSendEmail (3813935531061488274) -->
+    <skip />
+    <!-- no translation found for listSeparatorSendIm (3885045096980470847) -->
+    <skip />
+    <!-- no translation found for listSeparatorMapAddress (7749519405208811410) -->
+    <skip />
+    <!-- no translation found for listSeparatorOrganizations (5731454670822188295) -->
+    <skip />
+    <!-- no translation found for listSeparatorOtherInformation (3399084175925138065) -->
+    <skip />
+    <!-- no translation found for contactsIconLabel (392729648321810378) -->
+    <skip />
+    <!-- no translation found for contactsFavoritesLabel (6274307000699136596) -->
+    <skip />
+    <!-- no translation found for dialerIconLabel (396765298398417139) -->
+    <skip />
+    <!-- no translation found for recentCallsIconLabel (7432201162713288826) -->
+    <skip />
+    <!-- no translation found for liveFolderAll (5991510762804226223) -->
+    <skip />
+    <!-- no translation found for liveFolderFavorites (8755759874416875970) -->
+    <skip />
+    <!-- no translation found for liveFolderPhone (3440101264360244544) -->
+    <skip />
+    <!-- no translation found for menu_sendTextMessage (3055919380461974147) -->
+    <skip />
+    <!-- no translation found for recentCalls_callNumber (924407199258234369) -->
+    <skip />
+    <!-- no translation found for recentCalls_editNumberBeforeCall (7859145185424954030) -->
+    <skip />
+    <!-- no translation found for recentCalls_addToContact (6950267092567953305) -->
+    <skip />
+    <!-- no translation found for recentCalls_removeFromRecentList (5273789011391059975) -->
+    <skip />
+    <!-- no translation found for recentCalls_deleteAll (425798199678070888) -->
+    <skip />
+    <!-- no translation found for recentCalls_empty (7787624895504983911) -->
+    <skip />
+    <!-- no translation found for imei (1052536402066249452) -->
+    <skip />
+    <!-- no translation found for voicemail (1135686231023059817) -->
+    <skip />
+    <!-- no translation found for unknown (6231893925212017656) -->
+    <skip />
+    <!-- no translation found for private_num (3065614133902647350) -->
+    <skip />
+    <!-- no translation found for dialerKeyboardHintText (2013777173021862941) -->
+    <skip />
+    <!-- no translation found for simContacts_emptyLoading (4828419758306519589) -->
+    <skip />
+    <!-- no translation found for simContacts_title (4162577066960174009) -->
+    <skip />
+    <!-- no translation found for contactsSyncPlug (1549212649158409469) -->
+    <skip />
+    <!-- no translation found for noContactsHelpText (6155730972704522463) -->
+    <skip />
+    <!-- no translation found for seclectSyncGroups_title (7675331949118054911) -->
+    <skip />
+    <!-- no translation found for liveFolder_all_label (3716551598022430019) -->
+    <skip />
+    <!-- no translation found for liveFolder_favorites_label (9053985659909059395) -->
+    <skip />
+    <!-- no translation found for liveFolder_phones_label (8943901400107401868) -->
+    <skip />
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
deleted file mode 100644 (file)
index 8d527f5..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="addPicture">新增圖示</string>
-  <string name="allContacts">所有連絡人</string>
-  <string name="alphabet">\u0020ABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
-  <string name="attachToContact">連絡人圖示</string>
-  <string name="button_discard">放棄變更</string>
-  <string name="button_save">儲存</string>
-  <string name="cancelButtonText">取消</string>
-  <string name="contactCreatedToast">已經建立連絡人。</string>
-  <string name="contactSavedToast">已經儲存連絡人。</string>
-  <string name="contactsFavoritesLabel">我的最愛</string>
-  <string name="contactsIconLabel">連絡人</string>
-  <string name="contactsList">連絡人</string>
-  <string name="customLabelPickerTitle">自訂標籤</string>
-  <string name="default_ringtone">預設值</string>
-  <string name="deleteConfirmation">將會刪除此連絡人。</string>
-  <string name="deleteConfirmation_title">刪除</string>
-  <string name="dialerIconLabel">撥號員</string>
-  <string name="dialerKeyboardHintText">使用鍵盤撥號</string>
-  <string name="doneButton">完成</string>
-  <string name="editContactDescription">編輯連絡人</string>
-  <string name="editContact_title_edit">編輯連絡人</string>
-  <string name="editContact_title_insert">新增連絡人</string>
-  <string name="emailLabelsGroup">電子郵件</string>
-  <string name="errorDialogTitle">無圖片</string>
-  <string name="frequentList">經常</string>
-  <string name="ghostData_company">公司</string>
-  <string name="ghostData_email">電子郵件地址</string>
-  <string name="ghostData_im">立即訊息名稱</string>
-  <string name="ghostData_name">姓名</string>
-  <string name="ghostData_notes">我的記事</string>
-  <string name="ghostData_phone">電話號碼</string>
-  <string name="ghostData_postal">郵遞地址</string>
-  <string name="ghostData_title">職位</string>
-  <string name="groupEmpty">\"<xliff:g id="groupName">%s</xliff:g>\" 群組空白。</string>
-  <string name="groupNameMyContacts">我的連絡人</string>
-  <string name="groupNameWithPhones">含有電話號碼的連絡人</string>
-  <string name="imLabelsGroup">立即訊息</string>
-  <string name="imei">IMEI</string>
-  <string name="importFromSim">SIM 卡連絡人匯入工具</string>
-  <string name="insertContactDescription">建立連絡人</string>
-  <string name="invalidContactMessage">此連絡人不存在。</string>
-  <string name="label_company">公司</string>
-  <string name="label_notes">記事</string>
-  <string name="label_ringtone">響鈴音調</string>
-  <string name="label_title">職稱</string>
-  <string name="listSeparatorCallNumber">撥號</string>
-  <string name="listSeparatorMapAddress">地圖地址</string>
-  <string name="listSeparatorOrganizations">組織</string>
-  <string name="listSeparatorOtherInformation">其它資訊</string>
-  <string name="listSeparatorSendEmail">傳送電子郵件</string>
-  <string name="listSeparatorSendIm">傳送立即訊息</string>
-  <string name="listSeparatorSendSmsMms">傳送簡訊/多媒體簡訊</string>
-  <string name="menu_addItem">其它資訊</string>
-  <string name="menu_addStar">加到我的最愛</string>
-  <string name="menu_call">撥號</string>
-  <string name="menu_callNumber">撥打到 <xliff:g id="contact">%s</xliff:g></string>
-  <string name="menu_deleteContact">刪除連絡人</string>
-  <string name="menu_dialer">撥號員</string>
-  <string name="menu_displayGroup">顯示群組</string>
-  <string name="menu_doNotSave">放棄變更</string>
-  <string name="menu_done">儲存</string>
-  <string name="menu_editContact">編輯連絡人</string>
-  <string name="menu_editNumberBeforeCall">撥號之前編輯號碼</string>
-  <string name="menu_makeDefaultNumber">設成預設號碼</string>
-  <string name="menu_newContact">新增連絡人</string>
-  <string name="menu_newFavortie">新增我的最愛</string>
-  <string name="menu_preferences">設定</string>
-  <string name="menu_removeStar">從我的最愛中移除</string>
-  <string name="menu_sendEmail">傳送電子郵件</string>
-  <string name="menu_sendSMS">傳送簡訊/多媒體簡訊</string>
-  <string name="menu_sendTextMessage">傳送簡訊</string>
-  <string name="menu_viewAddress">地圖地址</string>
-  <string name="menu_viewContact">檢視連絡人</string>
-  <string name="noButton">取消</string>
-  <string name="noContacts">無連絡人。</string>
-  <string name="noContactsWithPhoneNumbers">無含有電話號碼的連絡人。</string>
-  <string name="noFavorites">無我的最愛。</string>
-  <string name="no_imei">未知的 IMEI</string>
-  <string name="ok">確定</string>
-  <string name="okButtonText">確定</string>
-  <string name="otherLabelsGroup">其他</string>
-  <string name="phoneIconLabel">電話</string>
-  <string name="phoneLabelsGroup">電話</string>
-  <string name="photoPickerNotFoundText">電話上無可用圖片。</string>
-  <string name="pickerNewContactHeader">建立新連絡人</string>
-  <string name="postalLabelsGroup">郵遞地址</string>
-  <string name="private_num">私人號碼</string>
-  <string name="recentCallsIconLabel">撥號記錄</string>
-  <string name="recentCalls_addToContact">新增到連絡人</string>
-  <string name="recentCalls_callNumber">撥打到 <xliff:g id="who">%s</xliff:g></string>
-  <string name="recentCalls_deleteAll">清除撥號記錄</string>
-  <string name="recentCalls_editNumberBeforeCall">撥號之前編輯號碼</string>
-  <string name="recentCalls_empty">撥號記錄空白。</string>
-  <string name="recentCalls_removeFromRecentList">從撥號記錄中移除</string>
-  <string name="removePicture">移除圖示</string>
-  <string name="searchHint">搜尋連絡人</string>
-  <string name="selectGroupsToSync">同步群組</string>
-  <string name="selectLabel">選取標籤</string>
-  <string name="select_group_title">選取要顯示的群組</string>
-  <string name="send_to_voicemail_checkbox">直接撥號到語音信箱。</string>
-  <string name="send_to_voicemail_view">如此便會直接撥號到語音信箱。</string>
-  <string name="shortcutContact">連絡人</string>
-  <string name="showAllGroups">所有連絡人</string>
-  <string name="showingGroupTitle">
-                                       <xliff:g id="groupName">%s</xliff:g>
-                               </string>
-  <string name="simContacts_emptyLoading">正在從 SIM 卡載入\u2026</string>
-  <string name="simContacts_title">SIM 卡連絡人</string>
-  <string name="sms_entry_label">傳送簡訊/多媒體簡訊</string>
-  <string name="starredList">附加星號</string>
-  <string name="strequentList">我的最愛</string>
-  <string name="syncAllGroups">同步所有連絡人</string>
-  <string name="syncGroupChooserTitle">選取要同步的群組</string>
-  <string name="syncGroupPreference">同步群組</string>
-  <string name="syncGroupPreference_summary">選取要同步的群組</string>
-  <string name="unknown">無法辨識</string>
-  <string name="viewContactDesription">檢視連絡人</string>
-  <string name="viewContactTitle">連絡人詳細資料</string>
-  <string name="voicemail">語音信箱</string>
-  <string name="yesButton">確定</string>
-</resources>
index c09d213..450b3fa 100644 (file)
 -->
 
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Strings for ContactsActivity and tabs -->
+    <!-- Title for the activity that shows contacts -->
     <string name="contactsList">Contacts</string>
+
+    <!-- Name of activity that allows users to create shortcuts on the home screen to a contact.
+         This shows up in a list of things like bookmark, folder, music playlist, etc -->
     <string name="shortcutContact">Contact</string>
+
+    <!-- Title for the activity that shows only starred contacts -->
     <string name="starredList">Starred</string>
+
+    <!-- Title for the activity that shows only frequently contacted contacts -->
     <string name="frequentList">Frequent</string>
+
+    <!-- Title for the activity that shows a mix of starred contacts and frequently contacted
+         contacts. -->
     <string name="strequentList">Favorites</string>
 
     <!-- The title bar when viewing the contact details activity -->
     <string name="viewContactTitle">Contact details</string>
     
-    <!-- Individual contact context menu item -->
+    <!-- The description presented to the user in the Intent choose when there are multiple activities that allow
+         viewing a contact. This string represents the built in way to view the contact. -->
     <string name="viewContactDesription">View contact</string>
     
-    <!-- Individual contact context menu item. The description of the activity that edits a contact -->
+    <!-- The description presented to the user in the Intent choose when there are multiple activities that allow
+         editing a contact. This string represents the built in way to edit the contact. -->
     <string name="editContactDescription">Edit contact</string>
 
-    <!-- The description of the activity that creates a contact -->
+    <!-- The description presented to the user in the Intent choose when there are multiple activities that allow
+         creating a new contact. This string represents the built in way to create the contact. -->
     <string name="insertContactDescription">Create contact</string>
-    <!-- title of drop-down menu after user presses the Search key -->
+
+    <!-- Hint text in the search box when the user hits the Search key while in the contacts app -->
     <string name="searchHint">Search contacts</string>
 
     <!-- Menu item to create a new contact -->
     <string name="menu_newContact">New contact</string>
-    <!-- Menu item to create a new contact that is a "favorite" contact -->
-    <string name="menu_newFavortie">New favorite</string>
-    <string name="menu_dialer">Dialer</string>
-    <!-- Individual contact context menu item. -->
+
+    <!-- Menu item used to view the details for a specific contact -->
     <string name="menu_viewContact">View contact</string>
-    <string name="menu_callNumber">Call <xliff:g id="contact">%s</xliff:g></string>
-    <string name="menu_editNumberBeforeCall">Edit number before call</string>
-    <!-- Individual contact context menu item. -->
+
+    <!-- Menu item used to call a contact, containing the name of the contact to call -->
+    <string name="menu_callNumber">Call <xliff:g id="name">%s</xliff:g></string>
+
+    <!-- Menu item used to add a star to a contact, which makes that contact show up at the top of favorites -->
     <string name="menu_addStar">Add to favorites</string>
-    <!-- Individual contact context menu item. -->
+
+    <!-- Menu item used to remove a star from a contact, making the contact no longer show up at the top of favorites -->
     <string name="menu_removeStar">Remove from favorites</string>
 
-    <!-- Strings for ViewContactActivity. -->
+    <!-- Optional menu item to encode the current contact as a QR Code using Barcode Scanner. -->
+    <string name="menu_showBarcode">Show barcode</string>
+
+    <!-- Menu item used to edit a specific contact -->
     <string name="menu_editContact">Edit contact</string>
-    <!-- Individual contact context menu item & View contact screen menu item. -->
+
+    <!-- Menu item used to delete a specific contact -->
     <string name="menu_deleteContact">Delete contact</string>
+
+    <!-- Menu item used to call a specific contact when viewing the details of that contact. -->
     <string name="menu_call">Call</string>
+
+    <!-- Menu item used to send an SMS or MMS message to a specific phone number or a contacts default phone number -->
     <string name="menu_sendSMS">Send SMS/MMS</string>
-    <!-- Email address context menu item. -->
+
+    <!-- Menu item used to send an email message to a specific email address -->
     <string name="menu_sendEmail">Send email</string>
-    <!-- Physical address context menu item. -->
+
+    <!-- Menu item used to view a contact's address on a map -->
     <string name="menu_viewAddress">Map address</string>
-    <!-- Phone number context menu item. -->
+
+    <!-- Menu item that makes a phone the default for a contact. The default number used when you
+         try to call a contact without specifying a specific number. -->
     <string name="menu_makeDefaultNumber">Make default number</string>
-    <!-- Confirmation dialog after users selects to delete a contact. -->
+
+    <!-- Confirmation dialog title after users selects to delete a contact. -->
     <string name="deleteConfirmation_title">Delete</string>
-    <string name="deleteConfirmation">This contact will be deleted.</string>
-    <string name="yesButton">OK</string>
-    <string name="noButton">Cancel</string>
 
-    <!-- The label next to phone numbers in the contact details screen when clicking the number
-         will send an SMS to it. 
-    -->
-    <string name="sms_entry_label">Send SMS/MMS</string>
+    <!-- Confirmation dialog contents after users selects to delete a contact. -->
+    <string name="deleteConfirmation">This contact will be deleted.</string>
 
-    <!-- Strings for EditContact screen -->
+    <!-- Menu item to indicate you are done editing a contact and want to save the changes you've made -->
     <string name="menu_done">Save</string>
+
+    <!-- Menu item to indicate you want to stop editing a contact and NOT save the changes you've made -->
     <string name="menu_doNotSave">Discard changes</string>
 
+    <!-- Button to indicate you are done editing a contact and want to save the changes you've made -->
     <string name="button_save">Save</string>
+
+    <!-- Button to indicate you want to stop editing a contact and NOT save the changes you've made -->
     <string name="button_discard">Discard changes</string>
 
+    <!-- The title of the activity that edits and existing contact -->
     <string name="editContact_title_edit">Edit contact</string>
+
+    <!-- The title of the activity that creates a new contact -->
     <string name="editContact_title_insert">New contact</string>
 
+    <!-- Button that adds more info to a contact, like a new phone number, email address, or postal address -->
     <string name="menu_addItem">More info</string>
 
-    <string name="label_company">Company</string>
-    <string name="label_title">Job title</string>
+    <!-- The label describing the Notes field of a contact. This field allows free form text entry about a contact -->
     <string name="label_notes">Notes</string>
+
+    <!-- The label describing the custom ringtone for a contact -->
     <string name="label_ringtone">Ringtone</string>
-    <!-- Ghost data that appears in the field by default in light font. -->
+
+    <!-- Hint text for the contact name when editing -->
     <string name="ghostData_name">First and Last</string>
+
+    <!-- Hint text for the organization name when editing -->
     <string name="ghostData_company">Company</string>
+
+    <!-- Hint text for the organization position when editing -->
     <string name="ghostData_title">Position</string>
+
+    <!-- Hint text for an IM account when editing -->
     <string name="ghostData_im">IM name</string>
+
+    <!-- Hint text for the notes field when editing -->
     <string name="ghostData_notes">My note</string>
+
+    <!-- Hint text for the phone number field when editing -->
     <string name="ghostData_phone">Phone number</string>
+
+    <!-- Hint text for the email address field when editing -->
     <string name="ghostData_email">Email address</string>
+
+    <!-- Hint text for the postal address field when editing -->
     <string name="ghostData_postal">Postal address</string>
 
     <!-- Message displayed in a toast when you try to view the details of a contact that
          for some reason doesn't exist anymore. -->
     <string name="invalidContactMessage">The contact does not exist.</string>
 
+    <!-- When picking a contact from a list of all contacts there is an entry at the top of the
+         list that allows the user to create a new contact, which this string is used for -->
     <string name="pickerNewContactHeader">Create new contact</string>
-    <!-- New contact screen, dialog title when you select a label. -->
+
+    <!-- Dialog title when you select a label when creating or edit a contact -->
     <string name="selectLabel">Select label</string>
 
+    <!-- Header that expands to list all of the types of phone numbers when editing or creating a phone number for a contact -->
     <string name="phoneLabelsGroup">Phone</string>
+
+    <!-- Header that expands to list all of the types of email addresses when editing or creating an email address for a contact -->
     <string name="emailLabelsGroup">Email</string>
+
+    <!-- Header that expands to list all of the types of IM account when editing or creating an IM account for a contact -->
     <string name="imLabelsGroup">IM</string>
+
+    <!-- Header that expands to list all of the types of postal addresses when editing or creating an postal address for a contact -->
     <string name="postalLabelsGroup">Postal address</string>
+
+    <!-- Header that expands to list other types of data you can add to a contact, like notes and organizations -->
     <string name="otherLabelsGroup">Other</string>
 
+    <!-- The order of the items below is important, don't reorder without changing EditContactActivity.java -->
+    <skip/>
+    <!-- The labels that are under the otherLabelsGroup when editing a contact. -->
     <string-array name="otherLabels">
-        <!-- The order of these is important, don't reorder without changing EditContactActivity.java -->
+        <!-- An organization associated with a contact -->
         <item>Organization</item>
+        <!-- A note associated with a contact -->
         <item>Note</item>
     </string-array>
 
-
-    <!-- Dialog that appears if there are no pictures from which to create an icon -->
+    <!-- Title of the dialog that appears if there are no pictures from which to create an icon for a contact -->
     <string name="errorDialogTitle">No pictures</string>
+
+    <!-- Description in the dialog that appears if there are no pictures from which to create an icon for a contact -->
     <string name="photoPickerNotFoundText">No pictures are available on the phone.</string>
-    <string name="okButtonText">OK</string>
-    <string name="cancelButtonText">Cancel</string>
 
-    <!-- Strings for AttachImage. -->
+    <!-- Description of the activity used to set a photo in the pictures application as the icon for a contact -->
     <string name="attachToContact">Contact icon</string>
 
-    <!-- unreviewed strings -->
-    <string name="customLabelPickerTitle">Custom label</string>
-    <!-- The menu item to open the preferences -->
-    <string name="menu_preferences">Settings</string>
+    <!-- Title of the dialog used to set a custom label for a contact detail, like a phone number or email address.
+         For example, this may be used to set a phone number's label to "Vaction house" -->
+    <string name="customLabelPickerTitle">Custom label name</string>
+
     <!-- The menu item to open the list of groups to display -->
     <string name="menu_displayGroup">Display group</string>
 
-    <!-- The title of the preference to display which groups to sync -->
-    <string name="syncGroupPreference">Sync groups</string>
-    <!-- The summary of the preference to choose sync groups. -->
-    <string name="syncGroupPreference_summary">Select groups to synchronize</string>
+    <!-- The menu item that leads to the settings for contact syncing -->
+    <string name="syncGroupPreference">Edit sync groups</string>
     
-    <!-- The description of the preference that launches the SIM import activity -->
-    <string name="importFromSim">SIM contacts importer</string>
-
-    <!-- Characters that are used for each of the fast-scroll widget that skips directly
-         to names starting with this letter.  If your language sorts differently than this,
-         please rearrange the alphabet here to be whatever is correct (e.g. Norwegian
-         has the three additional letters at the end). -->
-    <string name="alphabet">\u0020ABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
-    <!-- New contact screen, check box label. -->
+    <!-- The menu item that launches the SIM card import activity -->
+    <string name="importFromSim">Import contacts</string>
+
+    <!-- Check box label that allows calls to the contact to be sent directly to voicemail -->
     <string name="send_to_voicemail_checkbox">Send calls directly to voicemail.</string>
-    <!-- View contact screen, string identifying state. -->
+
+    <!-- String letting the user know that calls from the contact they're viewing will be sent directly to voicemail -->
     <string name="send_to_voicemail_view">Calls are sent directly to voicemail.</string>
-    <!-- New contact screen, default ringtone value. -->
+
+    <!-- String used to indicate that a contact doesn't have a custom ringtone -->
     <string name="default_ringtone">Default</string>
 
     <!-- The button/menu item that allows you to add a picture to a contact -->
     <!-- The text displayed when the contacts list is empty while displaying favorite contacts -->
     <string name="noFavorites">No favorites.</string>
 
-    <!-- Title for group selection menu -->
-    <string name="select_group_title">Select group to display</string>
-    
-    <!-- Group name for all contacts -->
-    <string name="allContacts">All contacts</string>
+    <!-- Title for group selection dialog. The dialog contains a list of contact groups that the
+         user can pick from, indicating they only want to see the contacts in that group. -->
+    <string name="select_group_title">Groups</string>
     
-    <!-- Title for Contacts group that is currently showing -->
-    <string name="showingGroupTitle"><xliff:g id="groupName">%s</xliff:g></string>
-    
-    <!-- The text displayed when the contacts list is empty while displaying a single group -->
+    <!-- The text displayed when the contacts list is empty while displaying a single group of contacts -->
     <string name="groupEmpty">Your \"<xliff:g id="groupName">%s</xliff:g>\" group is empty.</string>
 
     <!-- The description of all groups when asking the user what they want to display -->
     <!-- The group type that displays only contacts with phone numbers -->
     <string name="groupNameWithPhones">Contacts with phone numbers</string>
     
-    <!-- Title of the dialog the user uses to choose which contacts groups to sync from the server -->
-    <string name="syncGroupChooserTitle">Select groups to sync</string>
-
-    <!-- The menu item allowing you to select which groups you want to sync. -->
-    <string name="selectGroupsToSync">Sync groups</string>
-
     <!-- Toast displayed when a contact is created -->
     <string name="contactCreatedToast">Contact created.</string>
     
     <!-- Separator in the contact details list describing that the items below are random other non-actionable information about a contact -->
     <string name="listSeparatorOtherInformation">Other information</string>
 
-
-
-    <!-- Launcher tab labels -->
+    <!-- The description text for the contacts tab. Space is limited for this string, so the shorter the better -->
     <string name="contactsIconLabel">Contacts</string>
+
+    <!-- The description text for the favorites tab. Space is limited for this string, so the shorter the better -->
     <string name="contactsFavoritesLabel">Favorites</string>
+
+    <!-- The description text for the dialer tab. Space is limited for this string, so the shorter the better -->
     <string name="dialerIconLabel">Dialer</string>
-    <string name="phoneIconLabel">Phone</string>
+
+    <!-- The description text for the call log tab. Space is limited for this string, so the shorter the better -->
     <string name="recentCallsIconLabel">Call log</string>
+    <string name="liveFolderAll">All contacts</string>
+    <string name="liveFolderFavorites">Starred contacts</string>
+    <string name="liveFolderPhone">Contacts with phone numbers</string>
 
-    <!-- menu items for Dialer  -->
+    <!-- Menu item used to send an SMS or MMS message to a phone number  -->
     <string name="menu_sendTextMessage">Send SMS message</string>
 
-    <!-- Recent calls strings -->
-    <string name="recentCalls_callNumber">Call <xliff:g id="who">%s</xliff:g></string>
+    <!-- Menu item used to call a contact from the call log -->
+    <string name="recentCalls_callNumber">Call <xliff:g id="name">%s</xliff:g></string>
+
+    <!-- Menu item used to copy a number from the call log to the dialer so it can be edited before calling it -->
     <string name="recentCalls_editNumberBeforeCall">Edit number before call</string>
+
+    <!-- Menu item used to add a number from the call log to contacts -->
     <string name="recentCalls_addToContact">Add to contacts</string>
+
+    <!-- Menu item used to remove a single call from the call log -->
     <string name="recentCalls_removeFromRecentList">Remove from call log</string>
+
+    <!-- Menu item used to remove all calls from the call log -->
     <string name="recentCalls_deleteAll">Clear call log</string>
+
+    <!-- Text displayed when the call log is empty -->
     <string name="recentCalls_empty">Call log is empty.</string>
 
-    <!-- IMEI strings -->
+    <!-- The title of a dialog that displays the IMEI of the phone -->
     <string name="imei">IMEI</string>
-    <string name="no_imei">Unknown IMEI</string>
-
-    <string name="doneButton">Done</string>
-
-    <string name="ok">OK</string>
 
+    <!-- String used for displaying calls to the voicemail number in the call log -->
     <string name="voicemail">Voicemail</string>
+
+    <!-- String used to display calls from unknown numbers in the call log -->
     <string name="unknown">Unknown</string>
+
+    <!-- String used to display calls from private numbers in the call log -->
     <string name="private_num">Private number</string>
 
     <!-- Displayed in the text entry box in the dialer when in landscape mode to guide the user
          to dial using the physical keyboard -->
     <string name="dialerKeyboardHintText">Use keyboard to dial</string>
 
-    <!-- ADN related strings -->
+    <!-- Hint text displayed in the "digits" field above the dialer's
+         dialpad, if there's already a call in progress.  (This hint
+         reminds the user that the dialer will add a new call, as opposed
+         to sending DTMF tones over the current call.) -->
+    <string name="dialerDialpadHintText">Dial to add a call</string>
+
+    <!-- Dialog text displayed when loading a phone number from the SIM card for speed dial -->
     <string name="simContacts_emptyLoading">Loading from SIM card\u2026</string>
+
+    <!-- Dialog title displayed when loading a phone number from the SIM card for speed dial -->
     <string name="simContacts_title">SIM card contacts</string>
+
+    <!-- Displayed when a user is prompted to setup a Google account for syncing -->
+    <string name="contactsSyncPlug"><font fgcolor="#ffffffff">Sync your Google contacts!</font>
+    \nAfter syncing to your phone, your contacts will be available to you wherever you go.</string>
+
+    <!-- Displayed full screen when the user has no contacts and they are displaying the My Contacts group -->
+    <string name="noContactsHelpText">"You don't have any contacts.\n\nTo add contacts, press <font fgcolor="#ffffffff"><b>Menu</b></font> and select:\n
+        \n<li><font fgcolor="#ffffffff"><b>Edit sync groups</b></font> to add from a new or existing Google account\n</li>
+        \n<li><font fgcolor="#ffffffff"><b>New contact</b></font> to create a new contact from scratch\n</li>
+        \n<li><font fgcolor="#ffffffff"><b>Import contacts</b></font> to add contacts from your SIM card\n</li>"
+    </string>
+    
+    <!-- Activity title for the activity that lets the user choose which groups of contacts to sync from the server -->
+    <string name="seclectSyncGroups_title">Select groups to sync</string>
+
+    <!-- Live folder label for all contacts -->
+    <string name="liveFolder_all_label">All Contacts</string>
+
+    <!-- Live folder label for only starred contacts -->
+    <string name="liveFolder_favorites_label">Starred</string>
+
+    <!-- Live folder label for all contacts with phone numbers -->
+    <string name="liveFolder_phones_label">Phones</string>    
+
+    <!-- Item label: jump to the in-call DTMF dialpad.
+         (Part of a list of options shown in the dialer when another call
+         is already in progress.) -->
+    <string name="dialer_useDtmfDialpad">Use touch tone keypad</string>
+
+    <!-- Item label: jump to the in-call UI.
+         (Part of a list of options shown in the dialer when another call
+         is already in progress.) -->
+    <string name="dialer_returnToInCallScreen">Return to call in progress</string>
+
+    <!-- Item label: use the Dialer's dialpad to add another call.
+         (Part of a list of options shown in the dialer when another call
+         is already in progress.) -->
+    <string name="dialer_addAnotherCall">Add call</string>
+
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
deleted file mode 100644 (file)
index 0648441..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<resources>
-    <style name="TextAppearance.DialerLine1" parent="@android:style/TextAppearance.Widget.Button">
-        <item name="android:textSize">32sp</item>
-        <item name="android:textColor">@color/dialer_button_text</item>
-        <item name="android:textStyle">bold</item>
-    </style>
-
-    <style name="TextAppearance.DialerLine2" parent="@android:style/TextAppearance.Widget.Button">
-        <item name="android:textSize">18sp</item>
-        <item name="android:textColor">@color/dialer_button_text</item>
-    </style>
-</resources>
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
deleted file mode 100644 (file)
index dd18137..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <PreferenceScreen
-            android:key="sync_groups"
-            android:title="@string/syncGroupPreference"
-            android:summary="@string/syncGroupPreference_summary">
-        <intent
-                android:action="android.intent.action.VIEW"
-                android:targetPackage="com.android.contacts"
-                android:targetClass="com.android.contacts.ContactsGroupSyncSelector"
-        />
-    </PreferenceScreen>
-
-    <PreferenceScreen
-        android:title="@string/importFromSim"
-    >
-
-        <intent
-            android:action="android.intent.action.VIEW"
-            android:mimeType="vnd.android.cursor.item/sim-contact"
-            android:targetPackage="com.android.phone"
-            android:targetClass="com.android.phone.SimContacts"
-        />
-    </PreferenceScreen>
-</PreferenceScreen>
diff --git a/src/com/android/contacts/AlphabetIndexer.java b/src/com/android/contacts/AlphabetIndexer.java
deleted file mode 100644 (file)
index 4e5fb0f..0000000
+++ /dev/null
@@ -1,197 +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.database.Cursor;
-import android.database.DataSetObserver;
-import android.util.SparseIntArray;
-
-/**
- * This class essentially helps in building an index of section boundaries of a
- * sorted column of a cursor. For instance, if a cursor contains a data set 
- * sorted by first name of a person or the title of a song, this class will 
- * perform a binary search to identify the first row that begins with a 
- * particular letter. The search is case-insensitive. The class caches the index 
- * such that subsequent queries for the same letter will return right away.
- */
-public class AlphabetIndexer extends DataSetObserver {
-
-    protected Cursor mDataCursor;
-    protected int mColumnIndex;
-    protected Object[] mAlphabetArray;
-    private SparseIntArray mAlphaMap;
-    private java.text.Collator mCollator;
-
-    /**
-     * Constructs the indexer.
-     * @param cursor the cursor containing the data set
-     * @param columnIndex the column number in the cursor that is sorted 
-     *        alphabetically
-     * @param sections the array of objects that represent the sections. The
-     * toString() method of each item is called and the first letter of the 
-     * String is used as the letter to search for.
-     */
-    public AlphabetIndexer(Cursor cursor, int columnIndex, Object[] sections) {
-        mDataCursor = cursor;
-        mColumnIndex = columnIndex;
-        mAlphabetArray = sections;
-        mAlphaMap = new SparseIntArray(26 /* Optimize for English */);
-        if (cursor != null) {
-            cursor.registerDataSetObserver(this);
-        }
-        // Get a Collator for the current locale for string comparisons.
-        mCollator = java.text.Collator.getInstance();
-        mCollator.setStrength(java.text.Collator.PRIMARY);
-    }
-
-    /**
-     * Sets a new cursor as the data set and resets the cache of indices.
-     * @param cursor the new cursor to use as the data set
-     */
-    public void setCursor(Cursor cursor) {
-        if (mDataCursor != null) {
-            mDataCursor.unregisterDataSetObserver(this);
-        }
-        mDataCursor = cursor;
-        if (cursor != null) {
-            mDataCursor.registerDataSetObserver(this);
-        }
-        mAlphaMap.clear();
-    }
-
-    /**
-     * Performs a binary search or cache lookup to find the first row that
-     * matches a given section's starting letter.
-     * @param sectionIndex the section to search for
-     * @return the row index of the first occurrence, or the nearest next letter.
-     * For instance, if searching for "T" and no "T" is found, then the first
-     * row starting with "U" or any higher letter is returned. If there is no
-     * data following "T" at all, then the list size is returned.
-     */
-    public int indexOf(int sectionIndex) {
-        final SparseIntArray alphaMap = mAlphaMap;
-        final Cursor cursor = mDataCursor;
-
-        if (cursor == null || mAlphabetArray == null) {
-            return 0;
-        }
-        
-        // Check bounds
-        if (sectionIndex <= 0) {
-            return 0;
-        }
-        if (sectionIndex >= mAlphabetArray.length) {
-            sectionIndex = mAlphabetArray.length - 1;
-        }
-
-        int savedCursorPos = cursor.getPosition();
-
-        int count = cursor.getCount();
-        int start = 0;
-        int end = count;
-        int pos;
-
-        String letter = mAlphabetArray[sectionIndex].toString();
-        letter = letter.toUpperCase();
-        int key = letter.charAt(0);
-        // Check map
-        if (Integer.MIN_VALUE != (pos = alphaMap.get(key, Integer.MIN_VALUE))) {
-            // Is it approximate? Using negative value to indicate that it's 
-            // an approximation and positive value when it is the accurate
-            // position.
-            if (pos < 0) {
-                pos = -pos;
-                end = pos;
-            } else {
-                // Not approximate, this is the confirmed start of section, return it
-                return pos;
-            }
-        }
-
-        // Do we have the position of the previous section?
-        if (sectionIndex > 0) {
-            int prevLetter =
-                    mAlphabetArray[sectionIndex - 1].toString().charAt(0);
-            int prevLetterPos = alphaMap.get(prevLetter, Integer.MIN_VALUE);
-            if (prevLetterPos != Integer.MIN_VALUE) {
-                start = Math.abs(prevLetterPos);
-            }
-        }
-
-        // Now that we have a possibly optimized start and end, let's binary search
-
-        pos = (end + start) / 2;
-
-        while (pos < end) {
-            // Get letter at pos
-            cursor.moveToPosition(pos);
-            String curName = cursor.getString(mColumnIndex);
-            if (curName == null) {
-                if (pos == 0) {
-                    break;
-                } else {
-                    pos--;
-                    continue;
-                }
-            }
-            int curLetter = Character.toUpperCase(curName.charAt(0));
-
-            if (curLetter != key) {
-                // Enter approximation in hash if a better solution doesn't exist
-                int curPos = alphaMap.get(curLetter, Integer.MIN_VALUE);
-                if (curPos == Integer.MIN_VALUE || Math.abs(curPos) > pos) {
-                    // Negative pos indicates that it is an approximation
-                    alphaMap.put(curLetter, -pos);
-                }
-                if (mCollator.compare(curName, letter) < 0) {
-                    start = pos + 1;
-                    if (start >= count) {
-                        pos = count;
-                        break;
-                    }
-                } else {
-                    end = pos;
-                }
-            } else {
-                // They're the same, but that doesn't mean it's the start
-                if (start == pos) {
-                    // This is it
-                    break;
-                } else {
-                    // Need to go further lower to find the starting row
-                    end = pos;
-                }
-            }
-            pos = (start + end) / 2;
-        }
-        alphaMap.put(key, pos);
-        cursor.moveToPosition(savedCursorPos);
-        return pos;
-    }
-
-    @Override
-    public void onChanged() {
-        super.onChanged();
-        mAlphaMap.clear();
-    }
-
-    @Override
-    public void onInvalidated() {
-        super.onInvalidated();
-        mAlphaMap.clear();
-    }
-}
index 6346031..8c91722 100644 (file)
@@ -28,22 +28,22 @@ import java.io.ByteArrayOutputStream;
 
 /**
  * Provides an external interface for other applications to attach images
- * to contacts. It will first present a contact picker and then run the 
+ * to contacts. It will first present a contact picker and then run the
  * image that is handed to it through the cropper to make the image the proper
  * size and give the user a chance to use the face detector.
  */
-class AttachImage extends Activity {
+public class AttachImage extends Activity {
     private static final int REQUEST_PICK_CONTACT = 1;
     private static final int REQUEST_CROP_PHOTO = 2;
 
     private static final String CONTACT_URI_KEY = "contact_uri";
 
     public AttachImage() {
-        
+
     }
 
     Uri mContactUri;
-    
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
index 1043299..6081c79 100644 (file)
 
 package com.android.contacts;
 
+import com.google.android.googlelogin.GoogleLoginServiceConstants;
+import com.google.android.googlelogin.GoogleLoginServiceHelper;
+
+import android.app.ListActivity;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
-import android.content.DialogInterface;
+import android.content.Intent;
 import android.database.Cursor;
 import android.os.Bundle;
 import android.provider.Contacts;
+import android.provider.Gmail;
 import android.provider.Contacts.Groups;
 import android.provider.Contacts.Settings;
 import android.text.TextUtils;
-import android.view.ContextThemeWrapper;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;
 
-import com.android.internal.app.AlertActivity;
-import com.android.internal.app.AlertController;
-
-public final class ContactsGroupSyncSelector extends AlertActivity implements 
-        ListView.OnItemClickListener, DialogInterface.OnClickListener {
+public final class ContactsGroupSyncSelector extends ListActivity implements View.OnClickListener {
 
     private static final String[] PROJECTION = new String[] {
             Groups._ID, // 0
@@ -50,9 +49,7 @@ public final class ContactsGroupSyncSelector extends AlertActivity implements
     private static final int COLUMN_INDEX_SHOULD_SYNC = 2;
     private static final int COLUMN_INDEX_SYSTEM_ID = 3;
 
-    private ContentResolver mResolver;
-    private ListView mListView;
-    private GroupsAdapter mAdapter;
+    private static final int SUBACTIVITY_GET_ACCOUNT = 1;
 
     boolean[] mChecked;
     boolean mSyncAllGroups;
@@ -60,8 +57,7 @@ public final class ContactsGroupSyncSelector extends AlertActivity implements
     
     private final class GroupsAdapter extends ArrayAdapter<CharSequence> {
         public GroupsAdapter(CharSequence[] items) {
-            super(new ContextThemeWrapper(ContactsGroupSyncSelector.this,
-                    android.R.style.Theme_Light),
+            super(ContactsGroupSyncSelector.this,
                     android.R.layout.simple_list_item_checked,
                     android.R.id.text1, items);
         }
@@ -95,8 +91,9 @@ public final class ContactsGroupSyncSelector extends AlertActivity implements
     /**
      * Handles clicks on the list items
      */
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        boolean isChecked = mListView.isItemChecked(position);
+    @Override
+    protected void onListItemClick(ListView list, View view, int position, long id) {
+        boolean isChecked = list.isItemChecked(position);
         mChecked[position] = isChecked;
         if (position == 0) {
             mSyncAllGroups = isChecked;
@@ -105,58 +102,85 @@ public final class ContactsGroupSyncSelector extends AlertActivity implements
     }
 
     /**
-     * Handles clicks on the OK button
+     * Handles clicks on the OK and cancel buttons
      */
-    public void onClick(DialogInterface dialog, int which) {
-        if (mSyncAllGroups) {
-            // For now we only support a single account and the UI doesn't know what
-            // the account name is, so we're using a global setting for SYNC_EVERYTHING.
-            // Some day when we add multiple accounts to the UI this should use the per
-            // account setting.
-            Settings.setSetting(mResolver, null, Settings.SYNC_EVERYTHING, "1");
-        } else {
-            final ContentResolver resolver = mResolver;
-            ContentValues values = new ContentValues();
-            int count = mChecked.length;
-            for (int i = 1; i < count; i++) {
-                values.clear();
-                values.put(Groups.SHOULD_SYNC, mChecked[i]);
-                resolver.update(ContentUris.withAppendedId(Groups.CONTENT_URI, mGroupIds[i]),
-                        values, null, null);
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.cancel: {
+                finish();
+                break;
+            }
+            
+            case R.id.ok: {
+                final ContentResolver resolver = getContentResolver();
+                if (mSyncAllGroups) {
+                    // For now we only support a single account and the UI doesn't know what
+                    // the account name is, so we're using a global setting for SYNC_EVERYTHING.
+                    // Some day when we add multiple accounts to the UI this should use the per
+                    // account setting.
+                    Settings.setSetting(resolver, null, Settings.SYNC_EVERYTHING, "1");
+                } else {
+                    ContentValues values = new ContentValues();
+                    int count = mChecked.length;
+                    for (int i = 1; i < count; i++) {
+                        values.clear();
+                        values.put(Groups.SHOULD_SYNC, mChecked[i]);
+                        resolver.update(ContentUris.withAppendedId(Groups.CONTENT_URI, mGroupIds[i]),
+                                values, null, null);
+                    }
+                    // For now we only support a single account and the UI doesn't know what
+                    // the account name is, so we're using a global setting for SYNC_EVERYTHING.
+                    // Some day when we add multiple accounts to the UI this should use the per
+                    // account setting.
+                    Settings.setSetting(resolver, null, Settings.SYNC_EVERYTHING, "0");
+                }
+                finish();
+                break;
             }
-            // For now we only support a single account and the UI doesn't know what
-            // the account name is, so we're using a global setting for SYNC_EVERYTHING.
-            // Some day when we add multiple accounts to the UI this should use the per
-            // account setting.
-            Settings.setSetting(resolver, null, Settings.SYNC_EVERYTHING, "0");
         }
     }
 
     @Override
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
-        mResolver = getContentResolver();
-
-        // Set the alert parameters
-        AlertController.AlertParams params = mAlertParams;
-        params.mTitle = getText(R.string.syncGroupChooserTitle);
-        params.mIcon = getResources().getDrawable(R.drawable.ic_tab_unselected_contacts);
-        params.mPositiveButtonText = getText(R.string.okButtonText);
-        params.mPositiveButtonListener = this;
-        params.mNegativeButtonText = getText(R.string.cancelButtonText);
-        buildItems(params);
-
-        // Takes the info in mAlertParams and creates the layout
-        setupAlert();
-
-        mListView = mAlert.getListView();
-        mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
-        mListView.setOnItemClickListener(this);
-        adjustChecks();
+
+        // Only look for an account on first run.
+        if (savedState == null) {
+            // This will request a Gmail account and if none are present, it will
+            // invoke SetupWizard to login or create one. The result is returned
+            // through onActivityResult().
+            Bundle bundle = new Bundle();
+            bundle.putCharSequence("optional_message", getText(R.string.contactsSyncPlug));
+            GoogleLoginServiceHelper.getCredentials(this, SUBACTIVITY_GET_ACCOUNT,
+                    bundle, GoogleLoginServiceConstants.PREFER_HOSTED, Gmail.GMAIL_AUTH_SERVICE,
+                    true);
+        }
+
+        setContentView(R.layout.sync_settings);
+
+        findViewById(R.id.ok).setOnClickListener(this);
+        findViewById(R.id.cancel).setOnClickListener(this);
+        
+        getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
+        super.onActivityResult(requestCode, resultCode, intent);
+        if (requestCode == SUBACTIVITY_GET_ACCOUNT) {
+            if (resultCode == RESULT_OK) {
+                // There is an account setup, build the group list
+                buildItems();
+                adjustChecks();
+            } else {
+                finish();
+            }
+        }
     }
 
-    private void buildItems(AlertController.AlertParams params) {
-        Cursor cursor = mResolver.query(Groups.CONTENT_URI, PROJECTION, null, null, Groups.NAME);
+    private void buildItems() {
+        final ContentResolver resolver = getContentResolver();
+        Cursor cursor = resolver.query(Groups.CONTENT_URI, PROJECTION, null, null, Groups.NAME);
         if (cursor != null) {
             try {
                 int count = cursor.getCount() + 1;
@@ -183,13 +207,12 @@ public final class ContactsGroupSyncSelector extends AlertActivity implements
                     }
                 }
                 mChecked = checked;
-                mSyncAllGroups = getShouldSyncEverything(mResolver);
+                mSyncAllGroups = getShouldSyncEverything(resolver);
                 checked[0] = mSyncAllGroups;
                 mGroupIds = groupIds;
     
                 // Setup the adapter
-                mAdapter = new GroupsAdapter(items);
-                params.mAdapter = mAdapter;
+                setListAdapter(new GroupsAdapter(items));
             } finally {
                 cursor.close();
             }
@@ -197,7 +220,7 @@ public final class ContactsGroupSyncSelector extends AlertActivity implements
     }
 
     private void adjustChecks() {
-        ListView list = mListView;
+        final ListView list = getListView();
         if (mSyncAllGroups) {
             int count = list.getCount();
             for (int i = 0; i < count; i++) {
index 0ffa786..5e1fd63 100644 (file)
@@ -28,8 +28,8 @@ import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.database.Cursor;
 import android.database.CharArrayBuffer;
+import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.net.Uri;
 import android.os.Bundle;
@@ -43,10 +43,10 @@ import android.provider.Contacts.People;
 import android.provider.Contacts.Phones;
 import android.provider.Contacts.Presence;
 import android.provider.Contacts.Intents.UI;
-import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.ContextMenu;
+import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -55,11 +55,14 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.widget.AdapterView;
+import android.widget.AlphabetIndexer;
 import android.widget.ListView;
 import android.widget.ResourceCursorAdapter;
+import android.widget.SectionIndexer;
 import android.widget.TextView;
 
 import java.util.ArrayList;
+import java.lang.ref.WeakReference;
 
 /**
  * Displays a list of contacts. Usually is embedded into the ContactsActivity.
@@ -125,6 +128,31 @@ public final class ContactsListActivity extends ListActivity
 
     static final int DEFAULT_MODE = MODE_ALL_CONTACTS;
 
+    /**
+     * The type of data to display in the main contacts list. 
+     */
+    static final String PREF_DISPLAY_TYPE = "display_system_group";
+
+    /** Unknown display type. */
+    static final int DISPLAY_TYPE_UNKNOWN = -1;
+    /** Display all contacts */
+    static final int DISPLAY_TYPE_ALL = 0;
+    /** Display all contacts that have phone numbers */
+    static final int DISPLAY_TYPE_ALL_WITH_PHONES = 1;
+    /** Display a system group */
+    static final int DISPLAY_TYPE_SYSTEM_GROUP = 2;
+    /** Display a user group */
+    static final int DISPLAY_TYPE_USER_GROUP = 3;
+
+    /**
+     * Info about what to display. If {@link #PREF_DISPLAY_TYPE}
+     * is {@link #DISPLAY_TYPE_SYSTEM_GROUP} then this will be the system id.
+     * If {@link #PREF_DISPLAY_TYPE} is {@link #DISPLAY_TYPE_USER_GROUP} then this will
+     * be the group name.
+     */ 
+    static final String PREF_DISPLAY_INFO = "display_group";
+
+    
     static final String NAME_COLUMN = People.DISPLAY_NAME;
     
     static final String[] CONTACTS_PROJECTION = new String[] {
@@ -244,9 +272,6 @@ public final class ContactsListActivity extends ListActivity
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
-        // Make sure the preferences are setup
-        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
-
         // Resolve the intent
         final Intent intent = getIntent();
 
@@ -255,7 +280,7 @@ public final class ContactsListActivity extends ListActivity
         if (title != null) {
             setTitle(title);
         }
-
+        
         final String action = intent.getAction();
         mMode = MODE_UNKNOWN;
         
@@ -355,12 +380,6 @@ public final class ContactsListActivity extends ListActivity
             mMode = DEFAULT_MODE;
         }
 
-/*
-        if (!mDefaultMode) {
-            findViewById(R.id.contact_group).banner.setVisibility(View.GONE);
-        }
-*/
-
         // Setup the UI
         final ListView list = getListView();
         list.setFocusable(true);
@@ -392,12 +411,14 @@ public final class ContactsListActivity extends ListActivity
     }
 
     private void setEmptyText() {
-        TextView empty = (TextView) findViewById(android.R.id.empty);
+        TextView empty = (TextView) findViewById(R.id.emptyText);
+        // Center the text by default
+        int gravity = Gravity.CENTER;
         switch (mMode) {
             case MODE_GROUP:
                 if (Groups.GROUP_MY_CONTACTS.equals(mDisplayInfo)) {
-                    empty.setText(getString(R.string.groupEmpty,
-                            getText(R.string.groupNameMyContacts)));
+                    empty.setText(getText(R.string.noContactsHelpText));
+                    gravity = Gravity.NO_GRAVITY;
                 } else {
                     empty.setText(getString(R.string.groupEmpty, mDisplayInfo));
                 }
@@ -417,6 +438,7 @@ public final class ContactsListActivity extends ListActivity
                 empty.setText(getText(R.string.noContacts));
                 break;
         }
+        empty.setGravity(gravity);
     }
 
     /**
@@ -449,18 +471,17 @@ public final class ContactsListActivity extends ListActivity
         SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
         
         // Lookup the group to display
-        mDisplayType = prefs.getInt(ContactsPreferenceActivity.PREF_DISPLAY_TYPE,
-                ContactsPreferenceActivity.DISPLAY_TYPE_UNKNOWN);
+        mDisplayType = prefs.getInt(PREF_DISPLAY_TYPE, DISPLAY_TYPE_UNKNOWN);
         switch (mDisplayType) {
-            case ContactsPreferenceActivity.DISPLAY_TYPE_ALL_WITH_PHONES: {
+            case DISPLAY_TYPE_ALL_WITH_PHONES: {
                 mMode = MODE_WITH_PHONES;
                 mDisplayInfo = null;
                 break;
             }
 
-            case ContactsPreferenceActivity.DISPLAY_TYPE_SYSTEM_GROUP: {
+            case DISPLAY_TYPE_SYSTEM_GROUP: {
                 String systemId = prefs.getString(
-                        ContactsPreferenceActivity.PREF_DISPLAY_INFO, null);
+                        PREF_DISPLAY_INFO, null);
                 if (!TextUtils.isEmpty(systemId)) {
                     // Display the selected system group
                     mMode = MODE_GROUP;
@@ -470,14 +491,14 @@ public final class ContactsListActivity extends ListActivity
                     // No valid group is present, display everything
                     mMode = MODE_WITH_PHONES;
                     mDisplayInfo = null;
-                    mDisplayType = ContactsPreferenceActivity.DISPLAY_TYPE_ALL;
+                    mDisplayType = DISPLAY_TYPE_ALL;
                 }
                 break;
             }
 
-            case ContactsPreferenceActivity.DISPLAY_TYPE_USER_GROUP: {
+            case DISPLAY_TYPE_USER_GROUP: {
                 String displayGroup = prefs.getString(
-                        ContactsPreferenceActivity.PREF_DISPLAY_INFO, null);
+                        PREF_DISPLAY_INFO, null);
                 if (!TextUtils.isEmpty(displayGroup)) {
                     // Display the selected user group
                     mMode = MODE_GROUP;
@@ -487,12 +508,12 @@ public final class ContactsListActivity extends ListActivity
                     // No valid group is present, display everything
                     mMode = MODE_WITH_PHONES;
                     mDisplayInfo = null;
-                    mDisplayType = ContactsPreferenceActivity.DISPLAY_TYPE_ALL;
+                    mDisplayType = DISPLAY_TYPE_ALL;
                 }
                 break;
             }
 
-            case ContactsPreferenceActivity.DISPLAY_TYPE_ALL: {
+            case DISPLAY_TYPE_ALL: {
                 mMode = MODE_ALL_CONTACTS;
                 mDisplayInfo = null;
                 break;
@@ -501,7 +522,7 @@ public final class ContactsListActivity extends ListActivity
             default: {
                 // We don't know what to display, default to My Contacts
                 mMode = MODE_GROUP;
-                mDisplayType = ContactsPreferenceActivity.DISPLAY_TYPE_SYSTEM_GROUP;
+                mDisplayType = DISPLAY_TYPE_SYSTEM_GROUP;
                 buildSystemGroupUris(Groups.GROUP_MY_CONTACTS);
                 mDisplayInfo = Groups.GROUP_MY_CONTACTS;
                 break;
@@ -596,19 +617,33 @@ public final class ContactsListActivity extends ListActivity
             return false;
         }
 
+        // New contact
         menu.add(0, MENU_NEW_CONTACT, 0, R.string.menu_newContact)
                 .setIcon(android.R.drawable.ic_menu_add)
                 .setIntent(new Intent(Intents.Insert.ACTION, People.CONTENT_URI))
                 .setAlphabeticShortcut('n');
-        if (isChild()) {
-            menu.add(0, 0, 0, R.string.menu_preferences)
-                    .setIcon(android.R.drawable.ic_menu_preferences)
-                    .setIntent(new Intent(this, ContactsPreferenceActivity.class));
-        }
+
+        // Display group
         if (mDefaultMode) {
             menu.add(0, MENU_DISPLAY_GROUP, 0, R.string.menu_displayGroup)
                     .setIcon(R.drawable.ic_menu_allfriends);
         }
+
+        // Sync settings
+        Intent syncIntent = new Intent(Intent.ACTION_VIEW);
+        syncIntent.setClass(this, ContactsGroupSyncSelector.class);
+        menu.add(0, 0, 0, R.string.syncGroupPreference)
+                .setIcon(R.drawable.ic_menu_refresh)
+                .setIntent(syncIntent);
+        
+        // SIM import
+        Intent importIntent = new Intent(Intent.ACTION_VIEW);
+        importIntent.setType("vnd.android.cursor.item/sim-contact");
+        importIntent.setClassName("com.android.phone", "com.android.phone.SimContacts");
+        menu.add(0, 0, 0, R.string.importFromSim)
+                .setIcon(R.drawable.ic_menu_import_contact)
+                .setIntent(importIntent);
+
         return super.onCreateOptionsMenu(menu);
     }
 
@@ -622,27 +657,27 @@ public final class ContactsListActivity extends ListActivity
                 // Set the group to display
                 if (mDisplayGroupCurrentSelection == DISPLAY_GROUP_INDEX_ALL_CONTACTS) {
                     // Display all
-                    mDisplayType = ContactsPreferenceActivity.DISPLAY_TYPE_ALL;
+                    mDisplayType = DISPLAY_TYPE_ALL;
                     mDisplayInfo = null;
                 } else if (mDisplayGroupCurrentSelection
                         == DISPLAY_GROUP_INDEX_ALL_CONTACTS_WITH_PHONES) {
                     // Display all with phone numbers
-                    mDisplayType = ContactsPreferenceActivity.DISPLAY_TYPE_ALL_WITH_PHONES;
+                    mDisplayType = DISPLAY_TYPE_ALL_WITH_PHONES;
                     mDisplayInfo = null;
                 } else if (mDisplayGroupsIncludesMyContacts &&
                         mDisplayGroupCurrentSelection == DISPLAY_GROUP_INDEX_MY_CONTACTS) {
-                    mDisplayType = ContactsPreferenceActivity.DISPLAY_TYPE_SYSTEM_GROUP;
+                    mDisplayType = DISPLAY_TYPE_SYSTEM_GROUP;
                     mDisplayInfo = Groups.GROUP_MY_CONTACTS;
                 } else {
-                    mDisplayType = ContactsPreferenceActivity.DISPLAY_TYPE_USER_GROUP;
+                    mDisplayType = DISPLAY_TYPE_USER_GROUP;
                     mDisplayInfo = mDisplayGroups[mDisplayGroupCurrentSelection].toString();
                 }
 
                 // Save the changes to the preferences
                 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
                 prefs.edit()
-                        .putInt(ContactsPreferenceActivity.PREF_DISPLAY_TYPE, mDisplayType)
-                        .putString(ContactsPreferenceActivity.PREF_DISPLAY_INFO, mDisplayInfo)
+                        .putInt(PREF_DISPLAY_TYPE, mDisplayType)
+                        .putString(PREF_DISPLAY_INFO, mDisplayInfo)
                         .commit();
 
                 // Update the display state
@@ -778,8 +813,8 @@ public final class ContactsListActivity extends ListActivity
                     .setTitle(R.string.deleteConfirmation_title)
                     .setIcon(android.R.drawable.ic_dialog_alert)
                     .setMessage(R.string.deleteConfirmation)
-                    .setNegativeButton(R.string.noButton, null)
-                    .setPositiveButton(R.string.yesButton, new DeleteClickListener(uri))
+                    .setNegativeButton(android.R.string.cancel, null)
+                    .setPositiveButton(android.R.string.ok, new DeleteClickListener(uri))
                     .setCancelable(false)
                     .show();
                 return true;
@@ -810,8 +845,8 @@ public final class ContactsListActivity extends ListActivity
                         .setTitle(R.string.deleteConfirmation_title)
                         .setIcon(android.R.drawable.ic_dialog_alert)
                         .setMessage(R.string.deleteConfirmation)
-                        .setNegativeButton(R.string.noButton, null)
-                        .setPositiveButton(R.string.yesButton, new DeleteClickListener(uri))
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .setPositiveButton(android.R.string.ok, new DeleteClickListener(uri))
                         .setCancelable(false)
                         .show();
                     return true;
@@ -1159,7 +1194,7 @@ public final class ContactsListActivity extends ListActivity
                     // The My Contacts group
                     groups.add(DISPLAY_GROUP_INDEX_MY_CONTACTS,
                             getString(R.string.groupNameMyContacts));
-                    if (mDisplayType == ContactsPreferenceActivity.DISPLAY_TYPE_SYSTEM_GROUP
+                    if (mDisplayType == DISPLAY_TYPE_SYSTEM_GROUP
                             && Groups.GROUP_MY_CONTACTS.equals(mDisplayInfo)) {
                         currentIndex = DISPLAY_GROUP_INDEX_MY_CONTACTS;
                     }
@@ -1180,25 +1215,29 @@ public final class ContactsListActivity extends ListActivity
         }
     }
 
-    private final class QueryHandler extends AsyncQueryHandler {
+    private static final class QueryHandler extends AsyncQueryHandler {
+        private final WeakReference<ContactsListActivity> mActivity;
+
         public QueryHandler(Context context) {
             super(context.getContentResolver());
+            mActivity = new WeakReference<ContactsListActivity>((ContactsListActivity) context);
         }
 
         @Override
         protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
-            if (!isFinishing()) {
-                mAdapter.setLoading(false);
-                mAdapter.changeCursor(cursor);
+            final ContactsListActivity activity = mActivity.get();
+            if (activity != null && !activity.isFinishing()) {
+                activity.mAdapter.setLoading(false);
+                activity.mAdapter.changeCursor(cursor);
     
                 // Now that the cursor is populated again, it's possible to restore the list state
-                if (mListState != null) {
-                    mList.onRestoreInstanceState(mListState);
-                    if (mListHasFocus) {
-                        mList.requestFocus();
+                if (activity.mListState != null) {
+                    activity.mList.onRestoreInstanceState(activity.mListState);
+                    if (activity.mListHasFocus) {
+                        activity.mList.requestFocus();
                     }
-                    mListHasFocus = false;
-                    mListState = null;
+                    activity.mListHasFocus = false;
+                    activity.mListState = null;
                 }
             } else {
                 cursor.close();
@@ -1216,20 +1255,22 @@ public final class ContactsListActivity extends ListActivity
     }
 
     private final class ContactItemListAdapter extends ResourceCursorAdapter 
-            implements FastScrollView.SectionIndexer {
+            implements SectionIndexer {
         
-        private String [] mAlphabet;
         private AlphabetIndexer mIndexer;
+        private String mAlphabet;
         private boolean mLoading = true;
         private CharSequence mUnknownNameText;
         private CharSequence[] mLocalizedLabels;
 
         public ContactItemListAdapter(Context context, int resource, Cursor cursor) {
             super(context, resource, cursor);
-            getAlphabet(context);
+            
+            mAlphabet = context.getString(com.android.internal.R.string.fast_scroll_alphabet);
             if (cursor != null) {
                 mIndexer = new AlphabetIndexer(cursor, NAME_COLUMN_INDEX, mAlphabet);
             }
+            
             mUnknownNameText = context.getText(android.R.string.unknownName);
             switch (mMode) {
                 case MODE_PICK_POSTAL:
@@ -1249,22 +1290,20 @@ public final class ContactsListActivity extends ListActivity
 
         @Override
         public boolean isEmpty() {
-            if (mLoading) {
-                // We don't want the empty state to show when loading.
+            if ((mMode & MODE_MASK_CREATE_NEW) == MODE_MASK_CREATE_NEW) {
+                // This mode mask adds a header and we always want it to show up, even
+                // if the list is empty, so always claim the list is not empty.
                 return false;
             } else {
-                return super.isEmpty();
+                if (mLoading) {
+                    // We don't want the empty state to show when loading.
+                    return false;
+                } else {
+                    return super.isEmpty();
+                }
             }
         }
         
-        private void getAlphabet(Context context) {
-            String alphabetString = context.getResources().getString(R.string.alphabet);
-            mAlphabet = new String[alphabetString.length()];
-            for (int i = 0; i < mAlphabet.length; i++) {
-                mAlphabet[i] = String.valueOf(alphabetString.charAt(i));
-            }
-        }
-
         @Override
         public View newView(Context context, Cursor cursor, ViewGroup parent) {
             final View view = super.newView(context, cursor, parent);
@@ -1377,8 +1416,8 @@ public final class ContactsListActivity extends ListActivity
             if (mMode == MODE_STREQUENT) {
                 return new String[] { " " };
             } else {
-                return mAlphabet;
-            }
+                return mIndexer.getSections();
+           }
         }
         
         public int getPositionForSection(int sectionIndex) {
@@ -1395,7 +1434,7 @@ public final class ContactsListActivity extends ListActivity
                 mIndexer = new AlphabetIndexer(cursor, NAME_COLUMN_INDEX, mAlphabet);
             }
 
-            return mIndexer.indexOf(sectionIndex);
+            return mIndexer.getPositionForSection(sectionIndex);
         }
         
         public int getSectionForPosition(int position) {
diff --git a/src/com/android/contacts/ContactsLiveFolders.java b/src/com/android/contacts/ContactsLiveFolders.java
new file mode 100644 (file)
index 0000000..8ca199a
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * 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.Intent;
+import android.content.Context;
+import android.net.Uri;
+import android.app.Activity;
+import android.os.Bundle;
+import android.provider.LiveFolders;
+import android.provider.Contacts;
+
+public class ContactsLiveFolders {
+    public static class StarredContacts extends Activity {
+        public static final Uri CONTENT_URI =
+                Uri.parse("content://contacts/live_folders/favorites");
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+            final Intent intent = getIntent();
+            final String action = intent.getAction();
+
+            if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) {
+                setResult(RESULT_OK, createLiveFolder(this, CONTENT_URI,
+                        getString(R.string.liveFolder_favorites_label),
+                        R.drawable.ic_launcher_contacts_starred));
+            } else {
+                setResult(RESULT_CANCELED);
+            }
+
+            finish();
+        }
+    }
+
+    public static class PhoneContacts extends Activity {
+        public static final Uri CONTENT_URI =
+                Uri.parse("content://contacts/live_folders/people_with_phones");
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+            final Intent intent = getIntent();
+            final String action = intent.getAction();
+
+            if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) {
+                setResult(RESULT_OK, createLiveFolder(this, CONTENT_URI,
+                        getString(R.string.liveFolder_phones_label),
+                        R.drawable.ic_launcher_contacts_phones));
+            } else {
+                setResult(RESULT_CANCELED);
+            }
+
+            finish();
+        }
+    }
+
+    public static class AllContacts extends Activity {
+        public static final Uri CONTENT_URI =
+                Uri.parse("content://contacts/live_folders/people");
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+            final Intent intent = getIntent();
+            final String action = intent.getAction();
+
+            if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) {
+                setResult(RESULT_OK, createLiveFolder(this, CONTENT_URI,
+                        getString(R.string.liveFolder_all_label),
+                        R.drawable.ic_launcher_contacts));
+            } else {
+                setResult(RESULT_CANCELED);
+            }
+
+            finish();
+        }
+    }
+
+    private static Intent createLiveFolder(Context context, Uri uri, String name,
+            int icon) {
+
+        final Intent intent = new Intent();
+
+        intent.setData(uri);
+        intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT, new Intent(Intent.ACTION_VIEW,
+                Contacts.People.CONTENT_URI));
+        intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME, name);
+        intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON,
+                Intent.ShortcutIconResource.fromContext(context, icon));
+        intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, LiveFolders.DISPLAY_MODE_LIST);
+
+        return intent;
+    }
+}
diff --git a/src/com/android/contacts/ContactsPreferenceActivity.java b/src/com/android/contacts/ContactsPreferenceActivity.java
deleted file mode 100644 (file)
index b625fe5..0000000
+++ /dev/null
@@ -1,55 +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.os.Bundle;
-import android.preference.PreferenceActivity;
-
-public final class ContactsPreferenceActivity extends PreferenceActivity {
-    /**
-     * The type of data to display in the main contacts list. 
-     */
-    static final String PREF_DISPLAY_TYPE = "display_system_group";
-
-    /** Unknown display type. */
-    static final int DISPLAY_TYPE_UNKNOWN = -1;
-    /** Display all contacts */
-    static final int DISPLAY_TYPE_ALL = 0;
-    /** Display all contacts that have phone numbers */
-    static final int DISPLAY_TYPE_ALL_WITH_PHONES = 1;
-    /** Display a system group */
-    static final int DISPLAY_TYPE_SYSTEM_GROUP = 2;
-    /** Display a user group */
-    static final int DISPLAY_TYPE_USER_GROUP = 3;
-
-    /**
-     * Info about what to display. If {@link #PREF_DISPLAY_TYPE}
-     * is {@link #DISPLAY_TYPE_SYSTEM_GROUP} then this will be the system id.
-     * If {@link #PREF_DISPLAY_TYPE} is {@link #DISPLAY_TYPE_USER_GROUP} then this will
-     * be the group name.
-     */ 
-    static final String PREF_DISPLAY_INFO = "display_group";
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        
-        // Load the preferences from an XML resource
-        addPreferencesFromResource(R.xml.preferences);
-    }
-
-}
index c301473..3a7610d 100644 (file)
@@ -86,6 +86,7 @@ import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewParent;
+import android.view.inputmethod.EditorInfo;
 import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.EditText;
@@ -144,12 +145,6 @@ public final class EditContactActivity extends Activity implements View.OnClickL
     public static final int MENU_ITEM_ADD = 5;
     public static final int MENU_ITEM_PHOTO = 6;
     
-    // Key listener types
-    final static int INPUT_TEXT = 1;
-    final static int INPUT_TEXT_WORDS = 2;
-    final static int INPUT_TEXT_SENTENCES = 3;
-    final static int INPUT_DIALER = 4;
-
     /** Used to represent an invalid type for a contact entry */
     private static final int INVALID_TYPE = -1;
     
@@ -171,7 +166,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
     
     private EditText mNameView;
     private ImageView mPhotoImageView;
-    private Button mPhotoButton;
+    private View mPhotoButton;
     private CheckBox mSendToVoicemailCheckBox;
     private LinearLayout mLayout;
     private LayoutInflater mInflater;
@@ -258,7 +253,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
                 mPhotoMenuItem.setIcon(android.R.drawable.ic_menu_delete);
             } else {
                 mPhotoMenuItem.setTitle(R.string.addPicture);
-                mPhotoMenuItem.setIcon(android.R.drawable.ic_menu_add);
+                mPhotoMenuItem.setIcon(R.drawable.ic_menu_add_picture);
             }
         }
     }
@@ -310,7 +305,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
         mPhotoImageView = (ImageView) findViewById(R.id.photoImage);
         mPhotoImageView.setOnClickListener(this);
         mPhotoImageView.setVisibility(View.GONE);
-        mPhotoButton = (Button) findViewById(R.id.photoButton);
+        mPhotoButton = findViewById(R.id.photoButton);
         mPhotoButton.setOnClickListener(this);
         mSendToVoicemailCheckBox = (CheckBox) findViewById(R.id.send_to_voicemail);
 
@@ -532,7 +527,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
             new AlertDialog.Builder(EditContactActivity.this)
                 .setTitle(R.string.errorDialogTitle)
                 .setMessage(R.string.photoPickerNotFoundText)
-                .setPositiveButton(R.string.okButtonText, null)
+                .setPositiveButton(android.R.string.ok, null)
                 .show();
         }
     }
@@ -607,8 +602,8 @@ public final class EditContactActivity extends Activity implements View.OnClickL
                         .setTitle(R.string.deleteConfirmation_title)
                         .setIcon(android.R.drawable.ic_dialog_alert)
                         .setMessage(R.string.deleteConfirmation)
-                        .setNegativeButton(R.string.noButton, null)
-                        .setPositiveButton(R.string.yesButton, mDeleteContactDialogListener)
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .setPositiveButton(android.R.string.ok, mDeleteContactDialogListener)
                         .setCancelable(false)
                         .create();
         }
@@ -713,7 +708,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
                     case OTHER_ORGANIZATION:
                         entry = EditEntry.newOrganizationEntry(EditContactActivity.this,
                                 Uri.withAppendedPath(mUri, Organizations.CONTENT_DIRECTORY),
-                                ContactMethods.TYPE_WORK);
+                                Organizations.TYPE_WORK);
                         mOtherEntries.add(entry);
                         break;
 
@@ -874,7 +869,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
         new AlertDialog.Builder(this)
                 .setView(label)
                 .setTitle(R.string.customLabelPickerTitle)
-                .setPositiveButton(R.string.okButtonText, new DialogInterface.OnClickListener() {
+                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int which) {
                         entry.setLabel(EditContactActivity.this, ContactMethods.TYPE_CUSTOM,
                                 label.getText().toString());
@@ -885,7 +880,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
                         }
                     }
                 })
-                .setNegativeButton(R.string.cancelButtonText, null)
+                .setNegativeButton(android.R.string.cancel, null)
                 .show();
     }
     
@@ -1004,10 +999,10 @@ public final class EditContactActivity extends Activity implements View.OnClickL
 
         // Add the contact to the group that is being displayed in the contact list
         SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-        int displayType = prefs.getInt(ContactsPreferenceActivity.PREF_DISPLAY_TYPE,
-                ContactsPreferenceActivity.DISPLAY_TYPE_UNKNOWN);
-        if (displayType == ContactsPreferenceActivity.DISPLAY_TYPE_USER_GROUP) {
-            String displayGroup = prefs.getString(ContactsPreferenceActivity.PREF_DISPLAY_INFO,
+        int displayType = prefs.getInt(ContactsListActivity.PREF_DISPLAY_TYPE,
+                ContactsListActivity.DISPLAY_TYPE_UNKNOWN);
+        if (displayType == ContactsListActivity.DISPLAY_TYPE_USER_GROUP) {
+            String displayGroup = prefs.getString(ContactsListActivity.PREF_DISPLAY_INFO,
                     null);
             if (!TextUtils.isEmpty(displayGroup)) {
                 People.addToGroup(mResolver, ContentUris.parseId(contactUri), displayGroup);
@@ -1311,16 +1306,54 @@ public final class EditContactActivity extends Activity implements View.OnClickL
         }
 
         // Email entries from extras
-        CharSequence email = extras.getCharSequence(Insert.EMAIL);
-        int emailType = extras.getInt(Insert.EMAIL_TYPE, INVALID_TYPE);
+        addEmailFromExtras(extras, methodsUri, Insert.EMAIL, Insert.EMAIL_TYPE,
+                Insert.EMAIL_ISPRIMARY);
+        addEmailFromExtras(extras, methodsUri, Insert.SECONDARY_EMAIL, Insert.SECONDARY_EMAIL_TYPE,
+                null);
+        addEmailFromExtras(extras, methodsUri, Insert.TERTIARY_EMAIL, Insert.TERTIARY_EMAIL_TYPE,
+                null);
+   
+        // Phone entries from extras
+        addPhoneFromExtras(extras, phonesUri, Insert.PHONE, Insert.PHONE_TYPE,
+                Insert.PHONE_ISPRIMARY);
+        addPhoneFromExtras(extras, phonesUri, Insert.SECONDARY_PHONE, Insert.SECONDARY_PHONE_TYPE,
+                null);
+        addPhoneFromExtras(extras, phonesUri, Insert.TERTIARY_PHONE, Insert.TERTIARY_PHONE_TYPE,
+                null);
+
+        // IM entries from extras
+        CharSequence imHandle = extras.getCharSequence(Insert.IM_HANDLE);
+        CharSequence imProtocol = extras.getCharSequence(Insert.IM_PROTOCOL);
+   
+        if (imHandle != null && imProtocol != null) {
+            Object protocolObj = ContactMethods.decodeImProtocol(imProtocol.toString());
+            if (protocolObj instanceof Number) {
+                int protocol = ((Number) protocolObj).intValue();
+                entry = EditEntry.newImEntry(this,
+                        getLabelsForKind(this, Contacts.KIND_IM)[protocol], protocol, 
+                        imHandle.toString(), null, 0);
+            } else {
+                entry = EditEntry.newImEntry(this, protocolObj.toString(), -1, imHandle.toString(),
+                        null, 0);
+            }
+            entry.isPrimary = extras.getBoolean(Insert.IM_ISPRIMARY);
+            mImEntries.add(entry);
+        }
+    }
+
+    private void addEmailFromExtras(Bundle extras, Uri methodsUri, String emailField,
+            String typeField, String primaryField) {
+        CharSequence email = extras.getCharSequence(emailField);
+        int emailType = extras.getInt(typeField, INVALID_TYPE);
         if (!TextUtils.isEmpty(email) && emailType == INVALID_TYPE) {
             emailType = DEFAULT_EMAIL_TYPE;
             mPrimaryEmailAdded = true;
         }
-   
+
         if (emailType != INVALID_TYPE) {
-            entry = EditEntry.newEmailEntry(this, null, emailType, email.toString(), methodsUri, 0);
-            entry.isPrimary = extras.getBoolean(Insert.EMAIL_ISPRIMARY);
+            EditEntry entry = EditEntry.newEmailEntry(this, null, emailType, email.toString(),
+                    methodsUri, 0);
+            entry.isPrimary = (primaryField == null) ? false : extras.getBoolean(primaryField);
             mEmailEntries.add(entry);
 
             // Keep track of which primary types have been added
@@ -1328,18 +1361,20 @@ public final class EditContactActivity extends Activity implements View.OnClickL
                 mPrimaryEmailAdded = true;
             }
         }
-   
-        // Phone entries from extras 
-        CharSequence phoneNumber = extras.getCharSequence(Insert.PHONE);
-        int phoneType = extras.getInt(Insert.PHONE_TYPE, INVALID_TYPE);
+    }
+
+    private void addPhoneFromExtras(Bundle extras, Uri phonesUri, String phoneField,
+            String typeField, String primaryField) {
+        CharSequence phoneNumber = extras.getCharSequence(phoneField);
+        int phoneType = extras.getInt(typeField, INVALID_TYPE);
         if (!TextUtils.isEmpty(phoneNumber) && phoneType == INVALID_TYPE) {
             phoneType = DEFAULT_PHONE_TYPE;
         }
-   
+
         if (phoneType != INVALID_TYPE) {
-            entry = EditEntry.newPhoneEntry(this, null, phoneType,
+            EditEntry entry = EditEntry.newPhoneEntry(this, null, phoneType,
                     phoneNumber.toString(), phonesUri, 0);
-            entry.isPrimary = extras.getBoolean(Insert.PHONE_ISPRIMARY);
+            entry.isPrimary = (primaryField == null) ? false : extras.getBoolean(primaryField);
             mPhoneEntries.add(entry);
 
             // Keep track of which primary types have been added
@@ -1347,25 +1382,6 @@ public final class EditContactActivity extends Activity implements View.OnClickL
                 mMobilePhoneAdded = true;
             }
         }
-
-        // IM entries from extras
-        CharSequence imHandle = extras.getCharSequence(Insert.IM_HANDLE);
-        CharSequence imProtocol = extras.getCharSequence(Insert.IM_PROTOCOL);
-   
-        if (imHandle != null && imProtocol != null) {
-            Object protocolObj = ContactMethods.decodeImProtocol(imProtocol.toString());
-            if (protocolObj instanceof Number) {
-                int protocol = ((Number) protocolObj).intValue();
-                entry = EditEntry.newImEntry(this,
-                        getLabelsForKind(this, Contacts.KIND_IM)[protocol], protocol, 
-                        imHandle.toString(), null, 0);
-            } else {
-                entry = EditEntry.newImEntry(this, protocolObj.toString(), -1, imHandle.toString(),
-                        null, 0);
-            }
-            entry.isPrimary = extras.getBoolean(Insert.IM_ISPRIMARY);
-            mImEntries.add(entry);
-        }
     }
 
     /**
@@ -1475,42 +1491,20 @@ public final class EditContactActivity extends Activity implements View.OnClickL
                 data2.setLines(entry.lines);
                 data2.setMaxLines(entry.maxLines);
             }
-        } else if (entry.lines >= 0) {
-            data.setSingleLine();
+        }
+        int contentType = entry.contentType;
+        if (contentType != EditorInfo.TYPE_NULL) {
+            data.setInputType(contentType);
             if (data2 != null) {
-                data2.setSingleLine();
+                data2.setInputType(contentType);
             }
-        }
-        switch (entry.keyListener) {
-            case INPUT_TEXT:
-                data.setKeyListener(TextKeyListener.getInstance());
-                if (data2 != null) {
-                    data2.setKeyListener(TextKeyListener.getInstance());
-                }
-                break;
-                
-            case INPUT_TEXT_WORDS:
-                data.setKeyListener(TextKeyListener.getInstance(true, Capitalize.WORDS));
-                if (data2 != null) {
-                    data2.setKeyListener(TextKeyListener.getInstance(true, Capitalize.WORDS));
-                }
-                break;
-                
-            case INPUT_TEXT_SENTENCES:
-                data.setKeyListener(TextKeyListener.getInstance(true, Capitalize.SENTENCES));
-                if (data2 != null) {
-                    data2.setKeyListener(TextKeyListener.getInstance(true, Capitalize.SENTENCES));
-                }
-                break;
-                
-            case INPUT_DIALER:
-                data.setKeyListener(DialerKeyListener.getInstance());
+            if ((contentType&EditorInfo.TYPE_MASK_CLASS)
+                    == EditorInfo.TYPE_CLASS_PHONE) {
                 data.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
                 if (data2 != null) {
-                    data2.setKeyListener(DialerKeyListener.getInstance());
                     data2.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
                 }
-                break;
+            }
         }
 
         // Hook up the delete button
@@ -1569,7 +1563,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
         public String column;
         public String contentDirectory;
         public String data2;
-        public int keyListener;
+        public int contentType;
         public int type;
         /**
          * If 0 or 1, setSingleLine will be called. If negative, setSingleLine
@@ -1614,7 +1608,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
             parcel.writeString(column);
             parcel.writeString(contentDirectory);
             parcel.writeString(data2);
-            parcel.writeInt(keyListener);
+            parcel.writeInt(contentType);
             parcel.writeInt(type);
             parcel.writeInt(lines);
             parcel.writeInt(isPrimary ? 1 : 0);
@@ -1637,7 +1631,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
                 entry.column = in.readString();
                 entry.contentDirectory = in.readString();
                 entry.data2 = in.readString();
-                entry.keyListener = in.readInt();
+                entry.contentType = in.readInt();
                 entry.type = in.readInt();
                 entry.lines = in.readInt();
                 entry.isPrimary = in.readInt() == 1;
@@ -1834,7 +1828,8 @@ public final class EditContactActivity extends Activity implements View.OnClickL
             entry.column = Organizations.COMPANY;
             entry.contentDirectory = Organizations.CONTENT_DIRECTORY;
             entry.kind = Contacts.KIND_ORGANIZATION;
-            entry.keyListener = INPUT_TEXT_WORDS;
+            entry.contentType = EditorInfo.TYPE_CLASS_TEXT
+                    | EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS;
             return entry;
         }
 
@@ -1853,7 +1848,9 @@ public final class EditContactActivity extends Activity implements View.OnClickL
             entry.lines = 2;
             entry.id = 0;
             entry.kind = KIND_CONTACT;
-            entry.keyListener = INPUT_TEXT_SENTENCES;
+            entry.contentType = EditorInfo.TYPE_CLASS_TEXT
+                    | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES
+                    | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE;
             entry.isStaticLabel = true;
             return entry;
         }
@@ -1894,7 +1891,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
             entry.column = People.Phones.NUMBER;
             entry.contentDirectory = People.Phones.CONTENT_DIRECTORY;
             entry.kind = Contacts.KIND_PHONE;
-            entry.keyListener = INPUT_DIALER;
+            entry.contentType = EditorInfo.TYPE_CLASS_PHONE;
             return entry;
         }
 
@@ -1917,7 +1914,8 @@ public final class EditContactActivity extends Activity implements View.OnClickL
             entry.column = ContactMethods.DATA;
             entry.contentDirectory = People.ContactMethods.CONTENT_DIRECTORY;
             entry.kind = Contacts.KIND_EMAIL;
-            entry.keyListener = INPUT_TEXT;
+            entry.contentType = EditorInfo.TYPE_CLASS_TEXT
+                    | EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
             return entry;
         }
 
@@ -1946,7 +1944,10 @@ public final class EditContactActivity extends Activity implements View.OnClickL
             entry.column = ContactMethods.DATA;
             entry.contentDirectory = People.ContactMethods.CONTENT_DIRECTORY;
             entry.kind = Contacts.KIND_POSTAL;
-            entry.keyListener = INPUT_TEXT_WORDS;
+            entry.contentType = EditorInfo.TYPE_CLASS_TEXT
+                    | EditorInfo.TYPE_TEXT_VARIATION_POSTAL_ADDRESS
+                    | EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS
+                    | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE;
             entry.maxLines = 4;
             entry.lines = 2;
             return entry;
@@ -1969,7 +1970,7 @@ public final class EditContactActivity extends Activity implements View.OnClickL
             entry.column = ContactMethods.DATA;
             entry.contentDirectory = People.ContactMethods.CONTENT_DIRECTORY;
             entry.kind = Contacts.KIND_IM;
-            entry.keyListener = INPUT_TEXT;
+            entry.contentType = EditorInfo.TYPE_CLASS_TEXT;
             return entry;
         }
     }
diff --git a/src/com/android/contacts/FastScrollView.java b/src/com/android/contacts/FastScrollView.java
deleted file mode 100644 (file)
index f45e947..0000000
+++ /dev/null
@@ -1,450 +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.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.RectF;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.SystemClock;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup.OnHierarchyChangeListener;
-import android.widget.AbsListView;
-import android.widget.Adapter;
-import android.widget.BaseAdapter;
-import android.widget.FrameLayout;
-import android.widget.HeaderViewListAdapter;
-import android.widget.ListView;
-import android.widget.AbsListView.OnScrollListener;
-
-/**
- * FastScrollView is meant for embedding {@link ListView}s that contain a large number of 
- * items that can be indexed in some fashion. It displays a special scroll bar that allows jumping
- * quickly to indexed sections of the list in touch-mode. Only one child can be added to this 
- * view group and it must be a {@link ListView}, with an adapter that is derived from 
- * {@link BaseAdapter}.
- */
-public class FastScrollView extends FrameLayout 
-        implements OnScrollListener, OnHierarchyChangeListener {
-
-    private Drawable mCurrentThumb;
-    private Drawable mOverlayDrawable;
-
-    private int mThumbH;
-    private int mThumbW;
-    private int mThumbY;
-
-    private RectF mOverlayPos;
-    
-    // Hard coding these for now
-    private int mOverlaySize = 104;
-
-    private boolean mDragging;
-    private ListView mList;
-    private boolean mScrollCompleted;
-    private boolean mThumbVisible;
-    private int mVisibleItem;
-    private Paint mPaint;
-    private int mListOffset;
-    
-    private Object [] mSections;
-    private String mSectionText;
-    private boolean mDrawOverlay;
-    private ScrollFade mScrollFade;
-    
-    private Handler mHandler = new Handler();
-    
-    private BaseAdapter mListAdapter;
-
-    private boolean mChangedBounds;
-
-    interface SectionIndexer {
-        Object[] getSections();
-        
-        int getPositionForSection(int section);
-        
-        int getSectionForPosition(int position);
-    }
-    
-    public FastScrollView(Context context) {
-        super(context);
-
-        init(context);
-    }
-
-
-    public FastScrollView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        
-        init(context);
-    }
-
-    public FastScrollView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        init(context);
-    }
-
-    private void useThumbDrawable(Drawable drawable) {
-        mCurrentThumb = drawable;
-        mThumbW = 64; //mCurrentThumb.getIntrinsicWidth();
-        mThumbH = 52; //mCurrentThumb.getIntrinsicHeight();
-        mChangedBounds = true;
-    }
-
-    private void init(Context context) {
-        // Get both the scrollbar states drawables
-        final Resources res = context.getResources();
-        useThumbDrawable(res.getDrawable(
-                com.android.internal.R.drawable.scrollbar_handle_accelerated_anim2));
-        
-        mOverlayDrawable = res.getDrawable(R.drawable.dialog_full_dark);
-        
-        mScrollCompleted = true;
-        setWillNotDraw(false);
-        
-        // Need to know when the ListView is added
-        setOnHierarchyChangeListener(this);
-        
-        mOverlayPos = new RectF();
-        mScrollFade = new ScrollFade();
-        mPaint = new Paint();
-        mPaint.setAntiAlias(true);
-        mPaint.setTextAlign(Paint.Align.CENTER);
-        mPaint.setTextSize(mOverlaySize / 2);
-        mPaint.setColor(0xFFFFFFFF);
-        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
-    }
-    
-    private void removeThumb() {
-        
-        mThumbVisible = false;
-        // Draw one last time to remove thumb
-        invalidate();
-    }
-    
-    @Override
-    public void draw(Canvas canvas) {
-        super.draw(canvas);
-        
-        if (!mThumbVisible) {
-            // No need to draw the rest
-            return;
-        }
-
-        final int y = mThumbY;
-        final int viewWidth = getWidth();
-        final FastScrollView.ScrollFade scrollFade = mScrollFade;
-
-        int alpha = -1;
-        if (scrollFade.mStarted) {
-            alpha = scrollFade.getAlpha();
-            if (alpha < ScrollFade.ALPHA_MAX / 2) {
-                mCurrentThumb.setAlpha(alpha * 2);
-            }
-            int left = viewWidth - (mThumbW * alpha) / ScrollFade.ALPHA_MAX;
-            mCurrentThumb.setBounds(left, 0, viewWidth, mThumbH);
-            mChangedBounds = true;
-        }
-
-        canvas.translate(0, y);
-        mCurrentThumb.draw(canvas);
-        canvas.translate(0, -y);
-
-        // If user is dragging the scroll bar, draw the alphabet overlay
-        if (mDragging && mDrawOverlay) {
-            mOverlayDrawable.draw(canvas);
-            final Paint paint = mPaint;
-            float descent = paint.descent();
-            final RectF rectF = mOverlayPos;
-            canvas.drawText(mSectionText, (int) (rectF.left + rectF.right) / 2,
-                    (int) (rectF.bottom + rectF.top) / 2 + mOverlaySize / 4 - descent, paint);
-        } else if (alpha == 0) {
-            scrollFade.mStarted = false;
-            removeThumb();
-        } else {
-            invalidate(viewWidth - mThumbW, y, viewWidth, y + mThumbH);            
-        }
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        if (mCurrentThumb != null) {
-            mCurrentThumb.setBounds(w - mThumbW, 0, w, mThumbH);
-        }
-        final RectF pos = mOverlayPos;
-        pos.left = (w - mOverlaySize) / 2;
-        pos.right = pos.left + mOverlaySize;
-        pos.top = h / 10; // 10% from top
-        pos.bottom = pos.top + mOverlaySize;
-        mOverlayDrawable.setBounds((int) pos.left, (int) pos.top,
-                (int) pos.right, (int) pos.bottom);
-    }
-    
-    public void onScrollStateChanged(AbsListView view, int scrollState) {
-    }
-    
-    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 
-            int totalItemCount) {
-        
-        if (totalItemCount - visibleItemCount > 0 && !mDragging) {
-            mThumbY = ((getHeight() - mThumbH) * firstVisibleItem) / (totalItemCount - visibleItemCount);
-            if (mChangedBounds) {
-                final int viewWidth = getWidth();
-                mCurrentThumb.setBounds(viewWidth - mThumbW, 0, viewWidth, mThumbH);
-                mChangedBounds = false;
-            }
-        }
-        mScrollCompleted = true;
-        if (firstVisibleItem == mVisibleItem) {
-            return;
-        }
-        mVisibleItem = firstVisibleItem;
-        if (!mThumbVisible || mScrollFade.mStarted) {
-            mThumbVisible = true;
-            mCurrentThumb.setAlpha(ScrollFade.ALPHA_MAX);
-        }
-        mHandler.removeCallbacks(mScrollFade);
-        mScrollFade.mStarted = false;
-        if (!mDragging) {
-            mHandler.postDelayed(mScrollFade, 1500);
-        }
-    }
-
-    
-    private void getSections() {
-        Adapter adapter = mList.getAdapter();
-        if (adapter instanceof HeaderViewListAdapter) {
-            mListOffset = ((HeaderViewListAdapter)adapter).getHeadersCount();
-            adapter = ((HeaderViewListAdapter)adapter).getWrappedAdapter();
-        }
-        if (adapter instanceof SectionIndexer) {
-            mListAdapter = (BaseAdapter) adapter;
-            mSections = ((SectionIndexer) mListAdapter).getSections();
-        }
-    }
-    
-    public void onChildViewAdded(View parent, View child) {
-        if (child instanceof ListView) {
-            mList = (ListView)child;
-            
-            mList.setOnScrollListener(this);
-            getSections();
-        }
-    }
-
-    public void onChildViewRemoved(View parent, View child) {
-        if (child == mList) {
-            mList = null;
-            mListAdapter = null;
-            mSections = null;
-        }
-    }
-    
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        if (mThumbVisible && ev.getAction() == MotionEvent.ACTION_DOWN) {
-            if (ev.getX() > getWidth() - mThumbW && ev.getY() >= mThumbY &&
-                    ev.getY() <= mThumbY + mThumbH) {
-                mDragging = true;
-                return true;
-            }            
-        }
-        return false;
-    }
-
-    private void scrollTo(float position) {
-        int count = mList.getCount();
-        mScrollCompleted = false;
-        final Object[] sections = mSections;
-        int sectionIndex;
-        if (sections != null && sections.length > 1) {
-            final int nSections = sections.length;
-            int section = (int) (position * nSections);
-            if (section >= nSections) {
-                section = nSections - 1;
-            }
-            sectionIndex = section;
-            final SectionIndexer baseAdapter = (SectionIndexer) mListAdapter;
-            int index = baseAdapter.getPositionForSection(section);
-            
-            // Given the expected section and index, the following code will
-            // try to account for missing sections (no names starting with..)
-            // It will compute the scroll space of surrounding empty sections
-            // and interpolate the currently visible letter's range across the
-            // available space, so that there is always some list movement while
-            // the user moves the thumb.
-            int nextIndex = count;
-            int prevIndex = index;
-            int prevSection = section;
-            int nextSection = section + 1;
-            // Assume the next section is unique
-            if (section < nSections - 1) {
-                nextIndex = baseAdapter.getPositionForSection(section + 1);
-            }
-            
-            // Find the previous index if we're slicing the previous section
-            if (nextIndex == index) {
-                // Non-existent letter
-                while (section > 0) {
-                    section--;
-                     prevIndex = baseAdapter.getPositionForSection(section);
-                     if (prevIndex != index) {
-                         prevSection = section;
-                         sectionIndex = section;
-                         break;
-                     }
-                }
-            }
-            // Find the next index, in case the assumed next index is not
-            // unique. For instance, if there is no P, then request for P's 
-            // position actually returns Q's. So we need to look ahead to make
-            // sure that there is really a Q at Q's position. If not, move 
-            // further down...
-            int nextNextSection = nextSection + 1;
-            while (nextNextSection < nSections &&
-                    baseAdapter.getPositionForSection(nextNextSection) == nextIndex) {
-                nextNextSection++;
-                nextSection++;
-            }
-            // Compute the beginning and ending scroll range percentage of the
-            // currently visible letter. This could be equal to or greater than
-            // (1 / nSections). 
-            float fPrev = (float) prevSection / nSections;
-            float fNext = (float) nextSection / nSections;
-            index = prevIndex + (int) ((nextIndex - prevIndex) * (position - fPrev) 
-                    / (fNext - fPrev));
-            // Don't overflow
-            if (index > count - 1) index = count - 1;
-            
-            mList.setSelectionFromTop(index + mListOffset, 0);
-        } else {
-            int index = (int) (position * count);
-            mList.setSelectionFromTop(index + mListOffset, 0);
-            sectionIndex = -1;
-        }
-
-        if (sectionIndex >= 0) {
-            String text = mSectionText = sections[sectionIndex].toString();
-            mDrawOverlay = (text.length() != 1 || text.charAt(0) != ' ') &&
-                    sectionIndex < sections.length;
-        } else {
-            mDrawOverlay = false;
-        }
-    }
-
-    private void cancelFling() {
-        // Cancel the list fling
-        MotionEvent cancelFling = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0, 0, 0);
-        mList.onTouchEvent(cancelFling);
-        cancelFling.recycle();
-    }
-    
-    @Override
-    public boolean onTouchEvent(MotionEvent me) {
-        if (me.getAction() == MotionEvent.ACTION_DOWN) {
-            if (me.getX() > getWidth() - mThumbW
-                    && me.getY() >= mThumbY 
-                    && me.getY() <= mThumbY + mThumbH) {
-                
-                mDragging = true;
-                if (mListAdapter == null && mList != null) {
-                    getSections();
-                }
-
-                cancelFling();
-                return true;
-            }
-        } else if (me.getAction() == MotionEvent.ACTION_UP) {
-            if (mDragging) {
-                mDragging = false;
-                final Handler handler = mHandler;
-                handler.removeCallbacks(mScrollFade);
-                handler.postDelayed(mScrollFade, 1000);
-                return true;
-            }
-        } else if (me.getAction() == MotionEvent.ACTION_MOVE) {
-            if (mDragging) {
-                final int viewHeight = getHeight();
-                mThumbY = (int) me.getY() - mThumbH + 10;
-                if (mThumbY < 0) {
-                    mThumbY = 0;
-                } else if (mThumbY + mThumbH > viewHeight) {
-                    mThumbY = viewHeight - mThumbH;
-                }
-                // If the previous scrollTo is still pending
-                if (mScrollCompleted) {
-                    scrollTo((float) mThumbY / (viewHeight - mThumbH));
-                }
-                return true;
-            }
-        }
-        
-        return super.onTouchEvent(me);
-    }
-    
-    public class ScrollFade implements Runnable {
-        
-        long mStartTime;
-        long mFadeDuration;
-        boolean mStarted;
-        static final int ALPHA_MAX = 255;
-        static final long FADE_DURATION = 200;
-        
-        void startFade() {
-            mFadeDuration = FADE_DURATION;
-            mStartTime = SystemClock.uptimeMillis();
-            mStarted = true;
-        }
-        
-        int getAlpha() {
-            if (!mStarted) {
-                return ALPHA_MAX;
-            }
-            int alpha;
-            long now = SystemClock.uptimeMillis();
-            if (now > mStartTime + mFadeDuration) {
-                alpha = 0;
-            } else {
-                alpha = (int) (ALPHA_MAX - ((now - mStartTime) * ALPHA_MAX) / mFadeDuration); 
-            }
-            return alpha;
-        }
-        
-        public void run() {
-            if (!mStarted) {
-                startFade();
-                invalidate();
-            }
-            
-            if (getAlpha() > 0) {
-                final int y = mThumbY;
-                final int viewWidth = getWidth();
-                invalidate(viewWidth - mThumbW, y, viewWidth, y + mThumbH);
-            } else {
-                mStarted = false;
-                removeThumb();
-            }
-        }
-    }
-}
index 32ecd97..550a385 100644 (file)
@@ -32,13 +32,13 @@ import android.os.Message;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemClock;
-import android.pim.DateUtils;
 import android.provider.CallLog.Calls;
 import android.provider.Contacts.People;
 import android.provider.Contacts.Phones;
 import android.provider.Contacts.Intents.Insert;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
+import android.text.format.DateUtils;
 import android.util.Log;
 import android.view.ContextMenu;
 import android.view.KeyEvent;
@@ -60,14 +60,15 @@ import com.android.internal.telephony.ITelephony;
 
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.lang.ref.WeakReference;
 
 /**
  * Displays a list of call log entries.
  */
-public class RecentCallsListActivity extends ListActivity 
+public class RecentCallsListActivity extends ListActivity
         implements View.OnCreateContextMenuListener {
     private static final String TAG = "RecentCallsList";
-    
+
     /** The projection to use when querying the call log table */
     static final String[] CALL_LOG_PROJECTION = new String[] {
             Calls._ID,
@@ -79,7 +80,7 @@ public class RecentCallsListActivity extends ListActivity
             Calls.CACHED_NUMBER_TYPE,
             Calls.CACHED_NUMBER_LABEL
     };
-    
+
     static final int ID_COLUMN_INDEX = 0;
     static final int NUMBER_COLUMN_INDEX = 1;
     static final int DATE_COLUMN_INDEX = 2;
@@ -97,7 +98,7 @@ public class RecentCallsListActivity extends ListActivity
             Phones.LABEL,
             Phones.NUMBER
     };
-    
+
     static final int PERSON_ID_COLUMN_INDEX = 0;
     static final int NAME_COLUMN_INDEX = 1;
     static final int PHONE_TYPE_COLUMN_INDEX = 2;
@@ -107,20 +108,20 @@ public class RecentCallsListActivity extends ListActivity
     private static final int MENU_ITEM_DELETE = 1;
     private static final int MENU_ITEM_DELETE_ALL = 2;
     private static final int MENU_ITEM_VIEW_CONTACTS = 3;
-    
+
     private static final int QUERY_TOKEN = 53;
     private static final int UPDATE_TOKEN = 54;
 
     private RecentCallsAdapter mAdapter;
     private QueryHandler mQueryHandler;
     private String mVoiceMailNumber;
-    
+
     private CharSequence[] mLabelArray;
-    
+
     private Drawable mDrawableIncoming;
     private Drawable mDrawableOutgoing;
-    private Drawable mDrawableMissed;    
-    
+    private Drawable mDrawableMissed;
+
     private static final class ContactInfo {
         public long personId;
         public String name;
@@ -137,8 +138,8 @@ public class RecentCallsListActivity extends ListActivity
         TextView durationView;
         TextView dateView;
         ImageView iconView;
-    }    
-    
+    }
+
     private static final class CallerInfoQuery {
         String number;
         int position;
@@ -148,25 +149,26 @@ public class RecentCallsListActivity extends ListActivity
     }
 
     /** Adapter class to fill in data for the Call Log */
-    private final class RecentCallsAdapter extends ResourceCursorAdapter 
+    private final class RecentCallsAdapter extends ResourceCursorAdapter
             implements Runnable, ViewTreeObserver.OnPreDrawListener {
         HashMap<String,ContactInfo> mContactInfo;
-        private LinkedList<CallerInfoQuery> mRequests;
-        private boolean mDone;
+        private final LinkedList<CallerInfoQuery> mRequests;
+        private volatile boolean mDone;
         private boolean mLoading = true;
         ViewTreeObserver.OnPreDrawListener mPreDrawListener;
         private static final int REDRAW = 1;
         private static final int START_THREAD = 2;
         private boolean mFirst;
-        
+        private Thread mCallerIdThread;
+
         public boolean onPreDraw() {
             if (mFirst) {
                 mHandler.sendEmptyMessageDelayed(START_THREAD, 1000);
                 mFirst = false;
             }
-            return true;            
+            return true;
         }
-        
+
         private Handler mHandler = new Handler() {
             @Override
             public void handleMessage(Message msg) {
@@ -180,7 +182,7 @@ public class RecentCallsListActivity extends ListActivity
                 }
             }
         };
-        
+
         public RecentCallsAdapter() {
             super(RecentCallsListActivity.this, R.layout.recent_calls_list_item, null);
 
@@ -192,7 +194,7 @@ public class RecentCallsListActivity extends ListActivity
         void setLoading(boolean loading) {
             mLoading = loading;
         }
-        
+
         @Override
         public boolean isEmpty() {
             if (mLoading) {
@@ -209,13 +211,14 @@ public class RecentCallsListActivity extends ListActivity
 
         public void startRequestProcessing() {
             mDone = false;
-            Thread callerIdThread = new Thread(this);
-            callerIdThread.setPriority(Thread.MIN_PRIORITY);
-            callerIdThread.start();
+            mCallerIdThread = new Thread(this);
+            mCallerIdThread.setPriority(Thread.MIN_PRIORITY);
+            mCallerIdThread.start();
         }
 
         public void stopRequestProcessing() {
             mDone = true;
+            if (mCallerIdThread != null) mCallerIdThread.interrupt();
         }
 
         public void clearCache() {
@@ -226,7 +229,7 @@ public class RecentCallsListActivity extends ListActivity
 
         private void updateCallLog(CallerInfoQuery ciq, ContactInfo ci) {
             // Check if they are different. If not, don't update.
-            if (TextUtils.equals(ciq.name, ci.name) 
+            if (TextUtils.equals(ciq.name, ci.name)
                     && TextUtils.equals(ciq.numberLabel, ci.label)
                     && ciq.numberType == ci.type) {
                 return;
@@ -236,10 +239,10 @@ public class RecentCallsListActivity extends ListActivity
             values.put(Calls.CACHED_NUMBER_TYPE, ci.type);
             values.put(Calls.CACHED_NUMBER_LABEL, ci.label);
             RecentCallsListActivity.this.getContentResolver().update(
-                    Calls.CONTENT_URI, 
+                    Calls.CONTENT_URI,
                     values, Calls.NUMBER + "='" + ciq.number + "'", null);
         }
-        
+
         private void enqueueRequest(String number, int position,
                 String name, int numberType, String numberLabel) {
             CallerInfoQuery ciq = new CallerInfoQuery();
@@ -253,7 +256,7 @@ public class RecentCallsListActivity extends ListActivity
                 mRequests.notifyAll();
             }
         }
-        
+
         private void queryContactInfo(CallerInfoQuery ciq) {
             // First check if there was a prior request for the same number
             // that was already satisfied
@@ -265,9 +268,9 @@ public class RecentCallsListActivity extends ListActivity
                     }
                 }
             } else {
-                Cursor phonesCursor = 
+                Cursor phonesCursor =
                     RecentCallsListActivity.this.getContentResolver().query(
-                            Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, 
+                            Uri.withAppendedPath(Phones.CONTENT_FILTER_URL,
                                     ciq.number),
                     PHONES_PROJECTION, null, null, null);
                 if (phonesCursor != null) {
@@ -278,7 +281,7 @@ public class RecentCallsListActivity extends ListActivity
                         info.type = phonesCursor.getInt(PHONE_TYPE_COLUMN_INDEX);
                         info.label = phonesCursor.getString(LABEL_COLUMN_INDEX);
                         info.number = phonesCursor.getString(MATCHED_NUMBER_COLUMN_INDEX);
-                        
+
                         mContactInfo.put(ciq.number, info);
                         // Inform list to update this item, if in view
                         synchronized (mRequests) {
@@ -310,7 +313,7 @@ public class RecentCallsListActivity extends ListActivity
                             mRequests.wait(1000);
                         } catch (InterruptedException ie) {
                             // Ignore and continue processing requests
-                        }                        
+                        }
                     }
                 }
                 if (ciq != null) {
@@ -318,11 +321,11 @@ public class RecentCallsListActivity extends ListActivity
                 }
             }
         }
-        
+
         @Override
         public View newView(Context context, Cursor cursor, ViewGroup parent) {
             View view = super.newView(context, cursor, parent);
-            
+
             // Get the views to bind to
             RecentCallsListItemViews views = new RecentCallsListItemViews();
             views.line1View = (TextView) view.findViewById(R.id.line1);
@@ -336,7 +339,7 @@ public class RecentCallsListActivity extends ListActivity
             return view;
         }
 
-        
+
         @Override
         public void bindView(View view, Context context, Cursor c) {
             final RecentCallsListItemViews views = (RecentCallsListItemViews) view.getTag();
@@ -345,7 +348,7 @@ public class RecentCallsListActivity extends ListActivity
             String callerName = c.getString(CALLER_NAME_COLUMN_INDEX);
             int callerNumberType = c.getInt(CALLER_NUMBERTYPE_COLUMN_INDEX);
             String callerNumberLabel = c.getString(CALLER_NUMBERLABEL_COLUMN_INDEX);
-            
+
             // Lookup contacts with this number
             ContactInfo info = mContactInfo.get(number);
             if (info == null) {
@@ -359,11 +362,11 @@ public class RecentCallsListActivity extends ListActivity
                 // Check if any data is different from the data cached in the
                 // calls db. If so, queue the request so that we can update
                 // the calls db.
-                if (!TextUtils.equals(info.name, callerName) 
+                if (!TextUtils.equals(info.name, callerName)
                         || info.type != callerNumberType
                         || !TextUtils.equals(info.label, callerNumberLabel)) {
                     // Something is amiss, so sync up.
-                    enqueueRequest(number, c.getPosition(), 
+                    enqueueRequest(number, c.getPosition(),
                             callerName, callerNumberType, callerNumberLabel);
                 }
             }
@@ -382,7 +385,7 @@ public class RecentCallsListActivity extends ListActivity
             // Set the text lines
             if (!TextUtils.isEmpty(name)) {
                 views.line1View.setText(name);
-                CharSequence numberLabel = Phones.getDisplayLabel(context, ntype, label, 
+                CharSequence numberLabel = Phones.getDisplayLabel(context, ntype, label,
                         mLabelArray);
                 if (!TextUtils.isEmpty(numberLabel)) {
                     views.line2View.setText(numberLabel);
@@ -447,7 +450,7 @@ public class RecentCallsListActivity extends ListActivity
                     views.iconView.setImageDrawable(mDrawableMissed);
                     break;
             }
-            // Listen for the first draw 
+            // Listen for the first draw
             if (mPreDrawListener == null) {
                 mFirst = true;
                 mPreDrawListener = this;
@@ -455,17 +458,23 @@ public class RecentCallsListActivity extends ListActivity
             }
         }
     }
-    
-    private final class QueryHandler extends AsyncQueryHandler {
+
+    private static final class QueryHandler extends AsyncQueryHandler {
+        private final WeakReference<RecentCallsListActivity> mActivity;
+
         public QueryHandler(Context context) {
             super(context.getContentResolver());
+            mActivity = new WeakReference<RecentCallsListActivity>(
+                    (RecentCallsListActivity) context);
         }
 
         @Override
         protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
-            if (!isFinishing()) {
-                mAdapter.setLoading(false);
-                mAdapter.changeCursor(cursor);    
+            final RecentCallsListActivity activity = mActivity.get();
+            if (activity != null && !activity.isFinishing()) {
+                final RecentCallsListActivity.RecentCallsAdapter callsAdapter = activity.mAdapter;
+                callsAdapter.setLoading(false);
+                callsAdapter.changeCursor(cursor);
             } else {
                 cursor.close();
             }
@@ -477,12 +486,12 @@ public class RecentCallsListActivity extends ListActivity
         super.onCreate(state);
 
         setContentView(R.layout.recent_calls);
-        
+
         mDrawableIncoming = getResources().getDrawable(android.R.drawable.sym_call_incoming);
         mDrawableOutgoing = getResources().getDrawable(android.R.drawable.sym_call_outgoing);
         mDrawableMissed = getResources().getDrawable(android.R.drawable.sym_call_missed);
         mLabelArray = getResources().getTextArray(com.android.internal.R.array.phoneTypes);
-        
+
         // Typing here goes to the dialer
         setDefaultKeyMode(DEFAULT_KEYS_DIALER);
 
@@ -505,21 +514,25 @@ public class RecentCallsListActivity extends ListActivity
 
         startQuery();
         resetNewCallsFlag();
-        
+
         super.onResume();
         try {
-            ITelephony.Stub.asInterface(ServiceManager.getService("phone"))
-                    .cancelMissedCallsNotification();
+            ITelephony iTelephony = ITelephony.Stub.asInterface(ServiceManager.getService("phone"));
+            if (iTelephony != null) {
+                iTelephony.cancelMissedCallsNotification();
+            } else {
+                Log.w(TAG, "Telephony service is null, can't call cancelMissedCallsNotification");
+            }
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to clear missed calls notification due to remote excetpion");
         }
         mAdapter.mPreDrawListener = null; // Let it restart the thread after next draw
     }
-    
+
     @Override
     protected void onPause() {
         super.onPause();
-        
+
         // Kill the requests thread
         mAdapter.stopRequestProcessing();
     }
@@ -527,6 +540,7 @@ public class RecentCallsListActivity extends ListActivity
     @Override
     protected void onDestroy() {
         super.onDestroy();
+        mAdapter.stopRequestProcessing();
         Cursor cursor = mAdapter.getCursor();
         if (cursor != null && !cursor.isClosed()) {
             cursor.close();
@@ -541,19 +555,19 @@ public class RecentCallsListActivity extends ListActivity
 
         ContentValues values = new ContentValues(1);
         values.put(Calls.NEW, "0");
-        mQueryHandler.startUpdate(UPDATE_TOKEN, null, Calls.CONTENT_URI, 
+        mQueryHandler.startUpdate(UPDATE_TOKEN, null, Calls.CONTENT_URI,
                 values, where.toString(), null);
     }
 
     private void startQuery() {
         mAdapter.setLoading(true);
-        
+
         // Cancel any pending queries
         mQueryHandler.cancelOperation(QUERY_TOKEN);
-        mQueryHandler.startQuery(QUERY_TOKEN, null, Calls.CONTENT_URI, 
+        mQueryHandler.startQuery(QUERY_TOKEN, null, Calls.CONTENT_URI,
                 CALL_LOG_PROJECTION, null, null, Calls.DEFAULT_SORT_ORDER);
     }
-    
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         menu.add(0, MENU_ITEM_DELETE_ALL, 0, R.string.recentCalls_deleteAll)
@@ -589,7 +603,7 @@ public class RecentCallsListActivity extends ListActivity
         }
 
         ContactInfo info = mAdapter.getContactInfo(number);
-        boolean contactInfoPresent = (info != null && info != ContactInfo.EMPTY); 
+        boolean contactInfoPresent = (info != null && info != ContactInfo.EMPTY);
         if (contactInfoPresent) {
             menu.setHeaderTitle(info.name);
         } else {
@@ -631,7 +645,7 @@ public class RecentCallsListActivity extends ListActivity
             case MENU_ITEM_DELETE_ALL: {
                 getContentResolver().delete(Calls.CONTENT_URI, null, null);
                 //TODO The change notification should do this automatically, but it isn't working
-                // right now. Remove this when the change notification is working properly. 
+                // right now. Remove this when the change notification is working properly.
                 startQuery();
                 return true;
             }
@@ -704,17 +718,17 @@ public class RecentCallsListActivity extends ListActivity
                 } catch (RemoteException re) {
                     // Fall through and try to call the contact
                 }
-                
+
                 callEntry(getListView().getSelectedItemPosition());
                 return true;
         }
         return super.onKeyUp(keyCode, event);
     }
-    
+
     /*
      * Get the number from the Contacts, if available, since sometimes
      * the number provided by caller id may not be formatted properly
-     * depending on the carrier (roaming) in use at the time of the 
+     * depending on the carrier (roaming) in use at the time of the
      * incoming call.
      * Logic : If the caller-id number starts with a "+", use it
      *         Else if the number in the contacts starts with a "+", use that one
@@ -728,9 +742,9 @@ public class RecentCallsListActivity extends ListActivity
             matchingNumber = ci.number;
         } else {
             try {
-                Cursor phonesCursor = 
+                Cursor phonesCursor =
                     RecentCallsListActivity.this.getContentResolver().query(
-                            Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, 
+                            Uri.withAppendedPath(Phones.CONTENT_FILTER_URL,
                                     number),
                     PHONES_PROJECTION, null, null, null);
                 if (phonesCursor != null) {
@@ -743,14 +757,14 @@ public class RecentCallsListActivity extends ListActivity
                 // Use the number from the call log
             }
         }
-        if (!TextUtils.isEmpty(matchingNumber) && 
-                (matchingNumber.startsWith("+") 
+        if (!TextUtils.isEmpty(matchingNumber) &&
+                (matchingNumber.startsWith("+")
                         || matchingNumber.length() > number.length())) {
             number = matchingNumber;
         }
         return number;
     }
-    
+
     private void callEntry(int position) {
         if (position < 0) {
             // In touch mode you may often not have something selected, so
@@ -769,8 +783,8 @@ public class RecentCallsListActivity extends ListActivity
             }
 
             int callType = cursor.getInt(CALL_TYPE_COLUMN_INDEX);
-            if (!number.startsWith("+") && 
-                    (callType == Calls.INCOMING_TYPE 
+            if (!number.startsWith("+") &&
+                    (callType == Calls.INCOMING_TYPE
                             || callType == Calls.MISSED_TYPE)) {
                 // If the caller-id matches a contact with a better qualified number, use it
                 number = getBetterNumberFromContacts(number);
index e23d460..38bc93d 100644 (file)
@@ -193,7 +193,7 @@ public class SpecialCharSequenceMgr {
         AlertDialog alert = new AlertDialog.Builder(context)
                 .setTitle(R.string.imei)
                 .setMessage(imeiStr)
-                .setPositiveButton(R.string.ok, null)
+                .setPositiveButton(android.R.string.ok, null)
                 .setCancelable(false)
                 .show();
         alert.getWindow().setType(WindowManager.LayoutParams.TYPE_PRIORITY_PHONE);
index caa77a1..41adc5a 100644 (file)
@@ -18,10 +18,12 @@ package com.android.contacts;
 
 import android.app.Activity;
 import android.content.ActivityNotFoundException;
-
+import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
 import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.drawable.Drawable;
 import android.media.AudioManager;
 import android.media.ToneGenerator;
@@ -29,32 +31,45 @@ import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.SystemClock;
-import android.provider.Settings;
+import android.provider.Contacts.Intents.Insert;
 import android.provider.Contacts.People;
 import android.provider.Contacts.Phones;
 import android.provider.Contacts.PhonesColumns;
-import android.provider.Contacts.Intents.Insert;
+import android.provider.Settings;
 import android.telephony.PhoneNumberFormattingTextWatcher;
 import android.telephony.PhoneNumberUtils;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
 import android.text.Editable;
-import android.text.Selection;
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.text.method.DialerKeyListener;
 import android.util.Log;
 import android.view.KeyEvent;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
 import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.android.internal.telephony.ITelephony;
 
 /**
  * Dialer activity that displays the typical twelve key interface.
  */
 public class TwelveKeyDialer extends Activity implements View.OnClickListener,
-        View.OnLongClickListener, View.OnKeyListener, TextWatcher {
+        View.OnLongClickListener, View.OnKeyListener,
+        AdapterView.OnItemClickListener, TextWatcher {
 
     private static final String TAG = "TwelveKeyDialer";
     
@@ -75,7 +90,11 @@ public class TwelveKeyDialer extends Activity implements View.OnClickListener,
     private Drawable mDigitsEmptyBackground;
     private Drawable mDeleteBackground;
     private Drawable mDeleteEmptyBackground;
-    
+    private View mDigitsAndBackspace;
+    private View mDialpad;
+    private ListView mDialpadChooser;
+    private DialpadChooserAdapter mDialpadChooserAdapter;
+
     // determines if we want to playback local DTMF tones.
     private boolean mDTMFToneEnabled;
     
@@ -84,6 +103,29 @@ public class TwelveKeyDialer extends Activity implements View.OnClickListener,
     /** Indicates if we are opening this dialer to add a call from the InCallScreen. */
     private boolean mIsAddCallMode;
 
+    PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+            /**
+             * Listen for phone state changes so that we can take down the
+             * "dialpad chooser" if the phone becomes idle while the
+             * chooser UI is visible.
+             */
+            @Override
+            public void onCallStateChanged(int state, String incomingNumber) {
+                // Log.i(TAG, "PhoneStateListener.onCallStateChanged: "
+                //       + state + ", '" + incomingNumber + "'");
+                if ((state == TelephonyManager.CALL_STATE_IDLE) && dialpadChooserVisible()) {
+                    // Log.i(TAG, "Call ended with dialpad chooser visible!  Taking it down...");
+                    // Note there's a race condition in the UI here: the
+                    // dialpad chooser could conceivably disappear (on its
+                    // own) at the exact moment the user was trying to select
+                    // one of the choices, which would be confusing.  (But at
+                    // least that's better than leaving the dialpad chooser
+                    // onscreen, but useless...)
+                    showDialpadChooser(false);
+                }
+            }
+        };
+
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         // Do nothing
     }
@@ -148,6 +190,17 @@ public class TwelveKeyDialer extends Activity implements View.OnClickListener,
         view.setOnLongClickListener(this);
         mDelete = view;
 
+        mDigitsAndBackspace = (View) findViewById(R.id.digitsAndBackspace);
+        mDialpad = (View) findViewById(R.id.dialpad);  // This is null in landscape mode
+
+        // Set up the "dialpad chooser" UI; see showDialpadChooser().
+        mDialpadChooser = (ListView) findViewById(R.id.dialpadChooser);
+        mDialpadChooser.setOnItemClickListener(this);
+        // Add a dummy "footer" view so that the divider under the bottom
+        // item will be visible.
+        // (We set android:footerDividersEnabled="true" on this ListView in XML.)
+        mDialpadChooser.addFooterView(new View(this), null, false);
+
         if (!resolveIntent() && icicle != null) {
             super.onRestoreInstanceState(icicle);
         }
@@ -206,10 +259,14 @@ public class TwelveKeyDialer extends Activity implements View.OnClickListener,
         } else {
             intent = getIntent();
         }
+        // Log.i(TAG, "==> resolveIntent(): intent: " + intent);
 
         // by default we are not adding a call.
         mIsAddCallMode = false;
-        
+
+        // By default we don't show the "dialpad chooser" UI.
+        boolean needToShowDialpadChooser = false;
+
         // Resolve the intent
         final String action = intent.getAction();
         if (Intent.ACTION_DIAL.equals(action) || Intent.ACTION_VIEW.equals(action)) {
@@ -238,8 +295,26 @@ public class TwelveKeyDialer extends Activity implements View.OnClickListener,
                     }
                 }
             }
+        } else if (Intent.ACTION_MAIN.equals(action)) {
+            // The MAIN action means we're bringing up a blank dialer
+            // (e.g. by selecting the Home shortcut, or tabbing over from
+            // Contacts or Call log.)
+            //
+            // At this point, IF there's already an active call, there's a
+            // good chance that the user got here accidentally (but really
+            // wanted the in-call dialpad instead).  So we bring up an
+            // intermediate UI to make the user confirm what they really
+            // want to do.
+            if (phoneIsInUse()) {
+                // Log.i(TAG, "resolveIntent(): phone is in use; showing dialpad chooser!");
+                needToShowDialpadChooser = true;
+            }
         }
 
+        // Bring up the "dialpad chooser" IFF we need to make the user
+        // confirm which dialpad they really want.
+        showDialpadChooser(needToShowDialpadChooser);
+
         return ignoreState;
     }
 
@@ -326,12 +401,42 @@ public class TwelveKeyDialer extends Activity implements View.OnClickListener,
                 resolveIntent();
             }
         }
+
+        // While we're in the foreground, listen for phone state changes,
+        // purely so that we can take down the "dialpad chooser" if the
+        // phone becomes idle while the chooser UI is visible.
+        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
+        telephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+
+        // Potentially show hint text in the mDigits field when the user
+        // hasn't typed any digits yet.  (If there's already an active call,
+        // this hint text will remind the user that he's about to add a new
+        // call.)
+        //
+        // TODO: consider adding better UI for the case where *both* lines
+        // are currently in use.  (Right now we let the user try to add
+        // another call, but that call is guaranteed to fail.  Perhaps the
+        // entire dialer UI should be disabled instead.)
+        if (phoneIsInUse()) {
+            mDigits.setHint(R.string.dialerDialpadHintText);
+        } else {
+            // Common case; no hint necessary.
+            mDigits.setHint(null);
+
+            // Also, a sanity-check: the "dialpad chooser" UI should NEVER
+            // be visible if the phone is idle!
+            showDialpadChooser(false);
+        }
     }
 
     @Override
     protected void onPause() {
         super.onPause();
 
+        // Stop listening for phone state changes.
+        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
+        telephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+
         synchronized(mToneGeneratorLock) {
             if (mToneGenerator != null) {
                 mToneStopper.removeMessages(STOP_TONE);
@@ -351,6 +456,11 @@ public class TwelveKeyDialer extends Activity implements View.OnClickListener,
 
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
+        // We never show a menu if the "choose dialpad" UI is up.
+        if (dialpadChooserVisible()) {
+            return false;
+        }
+
         CharSequence digits = mDigits.getText();
         if (digits == null || !TextUtils.isGraphic(digits)) {
             mAddToContactMenuItem.setVisible(false);
@@ -591,5 +701,217 @@ public class TwelveKeyDialer extends Activity implements View.OnClickListener,
             mToneStopper.sendEmptyMessageDelayed(STOP_TONE, TONE_LENGTH_MS);
         }
     }
-}
 
+    /**
+     * Brings up the "dialpad chooser" UI in place of the usual Dialer
+     * elements (the textfield/button and the dialpad underneath).
+     *
+     * We show this UI if the user brings up the Dialer while a call is
+     * already in progress, since there's a good chance we got here
+     * accidentally (and the user really wanted the in-call dialpad instead).
+     * So in this situation we display an intermediate UI that lets the user
+     * explicitly choose between the in-call dialpad ("Use touch tone
+     * keypad") and the regular Dialer ("Add call").  (Or, the option "Return
+     * to call in progress" just goes back to the in-call UI with no dialpad
+     * at all.)
+     *
+     * @param enabled If true, show the "dialpad chooser" instead
+     *                of the regular Dialer UI
+     */
+    private void showDialpadChooser(boolean enabled) {
+        if (enabled) {
+            // Log.i(TAG, "Showing dialpad chooser!");
+            mDigitsAndBackspace.setVisibility(View.GONE);
+            if (mDialpad != null) mDialpad.setVisibility(View.GONE);
+            mDialpadChooser.setVisibility(View.VISIBLE);
+
+            // Instantiate the DialpadChooserAdapter and hook it up to the
+            // ListView.  We do this only once.
+            if (mDialpadChooserAdapter == null) {
+                mDialpadChooserAdapter = new DialpadChooserAdapter(this);
+                mDialpadChooser.setAdapter(mDialpadChooserAdapter);
+            }
+        } else {
+            // Log.i(TAG, "Displaying normal Dialer UI.");
+            mDigitsAndBackspace.setVisibility(View.VISIBLE);
+            if (mDialpad != null) mDialpad.setVisibility(View.VISIBLE);
+            mDialpadChooser.setVisibility(View.GONE);
+        }
+    }
+
+    /**
+     * @return true if we're currently showing the "dialpad chooser" UI.
+     */
+    private boolean dialpadChooserVisible() {
+        return mDialpadChooser.getVisibility() == View.VISIBLE;
+    }
+
+    /**
+     * Simple list adapter, binding to an icon + text label
+     * for each item in the "dialpad chooser" list.
+     */
+    private static class DialpadChooserAdapter extends BaseAdapter {
+        private LayoutInflater mInflater;
+
+        // Simple struct for a single "choice" item.
+        static class ChoiceItem {
+            String text;
+            Bitmap icon;
+            int id;
+
+            public ChoiceItem(String s, Bitmap b, int i) {
+                text = s;
+                icon = b;
+                id = i;
+            }
+        }
+
+        // IDs for the possible "choices":
+        static final int DIALPAD_CHOICE_USE_DTMF_DIALPAD = 101;
+        static final int DIALPAD_CHOICE_RETURN_TO_CALL = 102;
+        static final int DIALPAD_CHOICE_ADD_NEW_CALL = 103;
+
+        private static final int NUM_ITEMS = 3;
+        private ChoiceItem mChoiceItems[] = new ChoiceItem[NUM_ITEMS];
+
+        public DialpadChooserAdapter(Context context) {
+            // Cache the LayoutInflate to avoid asking for a new one each time.
+            mInflater = LayoutInflater.from(context);
+
+            // Initialize the possible choices.
+            // TODO: could this be specified entirely in XML?
+
+            // - "Use touch tone keypad"
+            mChoiceItems[0] = new ChoiceItem(
+                    context.getString(R.string.dialer_useDtmfDialpad),
+                    BitmapFactory.decodeResource(context.getResources(),
+                                                 R.drawable.ic_dialer_fork_tt_keypad),
+                    DIALPAD_CHOICE_USE_DTMF_DIALPAD);
+
+            // - "Return to call in progress"
+            mChoiceItems[1] = new ChoiceItem(
+                    context.getString(R.string.dialer_returnToInCallScreen),
+                    BitmapFactory.decodeResource(context.getResources(),
+                                                 R.drawable.ic_dialer_fork_current_call),
+                    DIALPAD_CHOICE_RETURN_TO_CALL);
+
+            // - "Add call"
+            mChoiceItems[2] = new ChoiceItem(
+                    context.getString(R.string.dialer_addAnotherCall),
+                    BitmapFactory.decodeResource(context.getResources(),
+                                                 R.drawable.ic_dialer_fork_add_call),
+                    DIALPAD_CHOICE_ADD_NEW_CALL);
+        }
+
+        public int getCount() {
+            return NUM_ITEMS;
+        }
+
+        /**
+         * Return the ChoiceItem for a given position.
+         */
+        public Object getItem(int position) {
+            return mChoiceItems[position];
+        }
+
+        /**
+         * Return a unique ID for each possible choice.
+         */
+        public long getItemId(int position) {
+            return position;
+        }
+
+        /**
+         * Make a view for each row.
+         */
+        public View getView(int position, View convertView, ViewGroup parent) {
+            // When convertView is non-null, we can reuse it (there's no need
+            // to reinflate it.)
+            if (convertView == null) {
+                convertView = mInflater.inflate(R.layout.dialpad_chooser_list_item, null);
+            }
+
+            TextView text = (TextView) convertView.findViewById(R.id.text);
+            text.setText(mChoiceItems[position].text);
+
+            ImageView icon = (ImageView) convertView.findViewById(R.id.icon);
+            icon.setImageBitmap(mChoiceItems[position].icon);
+
+            return convertView;
+        }
+    }
+
+    /**
+     * Handle clicks from the dialpad chooser.
+     */
+    public void onItemClick(AdapterView parent, View v, int position, long id) {
+        DialpadChooserAdapter.ChoiceItem item =
+                (DialpadChooserAdapter.ChoiceItem) parent.getItemAtPosition(position);
+        int itemId = item.id;
+        switch (itemId) {
+            case DialpadChooserAdapter.DIALPAD_CHOICE_USE_DTMF_DIALPAD:
+                // Log.i(TAG, "DIALPAD_CHOICE_USE_DTMF_DIALPAD");
+                // Fire off an intent to go back to the in-call UI
+                // with the dialpad visible.
+                returnToInCallScreen(true);
+                break;
+
+            case DialpadChooserAdapter.DIALPAD_CHOICE_RETURN_TO_CALL:
+                // Log.i(TAG, "DIALPAD_CHOICE_RETURN_TO_CALL");
+                // Fire off an intent to go back to the in-call UI
+                // (with the dialpad hidden).
+                returnToInCallScreen(false);
+                break;
+
+            case DialpadChooserAdapter.DIALPAD_CHOICE_ADD_NEW_CALL:
+                // Log.i(TAG, "DIALPAD_CHOICE_ADD_NEW_CALL");
+                // Ok, guess the user really did want to be here (in the
+                // regular Dialer) after all.  Bring back the normal Dialer UI.
+                showDialpadChooser(false);
+                break;
+
+            default:
+                Log.w(TAG, "onItemClick: unexpected itemId: " + itemId);
+                break;
+        }
+    }
+
+    /**
+     * Returns to the in-call UI (where there's presumably a call in
+     * progress) in response to the user selecting "use touch tone keypad"
+     * or "return to call" from the dialpad chooser.
+     */
+    private void returnToInCallScreen(boolean showDialpad) {
+        try {
+            ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
+            if (phone != null) phone.showCallScreenWithDialpad(showDialpad);
+        } catch (RemoteException e) {
+            Log.w(TAG, "phone.showCallScreenWithDialpad() failed", e);
+        }
+
+        // Finally, finish() ourselves so that we don't stay on the
+        // activity stack.
+        // Note that we do this whether or not the showCallScreenWithDialpad()
+        // call above had any effect or not!  (That call is a no-op if the
+        // phone is idle, which can happen if the current call ends while
+        // the dialpad chooser is up.  In this case we can't show the
+        // InCallScreen, and there's no point staying here in the Dialer,
+        // so we just take the user back where he came from...)
+        finish();
+    }
+
+    /**
+     * @return true if the phone is "in use", meaning that at least one line
+     *              is active (ie. off hook or ringing or dialing).
+     */
+    private boolean phoneIsInUse() {
+        boolean phoneInUse = false;
+        try {
+            ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
+            if (phone != null) phoneInUse = !phone.isIdle();
+        } catch (RemoteException e) {
+            Log.w(TAG, "phone.isIdle() failed", e);
+        }
+        return phoneInUse;
+    }
+}
index c1e9bc5..9a11f76 100644 (file)
@@ -55,6 +55,8 @@ import android.content.ContentValues;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.database.Cursor;
@@ -91,6 +93,7 @@ import android.widget.TextView;
 import android.widget.Toast;
 
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Displays the details of a specific contact.
@@ -99,11 +102,25 @@ public class ViewContactActivity extends ListActivity
         implements View.OnCreateContextMenuListener, View.OnClickListener,
         DialogInterface.OnClickListener {
     private static final String TAG = "ViewContact";
+    private static final String SHOW_BARCODE_INTENT = "com.google.zxing.client.android.ENCODE";
+
+    private static final String[] PHONE_KEYS = {
+        Contacts.Intents.Insert.PHONE,
+        Contacts.Intents.Insert.SECONDARY_PHONE,
+        Contacts.Intents.Insert.TERTIARY_PHONE
+    };
+
+    private static final String[] EMAIL_KEYS = {
+        Contacts.Intents.Insert.EMAIL,
+        Contacts.Intents.Insert.SECONDARY_EMAIL,
+        Contacts.Intents.Insert.TERTIARY_EMAIL
+    };
 
     private static final int DIALOG_CONFIRM_DELETE = 1;
 
     public static final int MENU_ITEM_DELETE = 1;
     public static final int MENU_ITEM_MAKE_DEFAULT = 2;
+    public static final int MENU_ITEM_SHOW_BARCODE = 3;
 
     private Uri mUri;
     private ContentResolver mResolver;
@@ -256,8 +273,8 @@ public class ViewContactActivity extends ListActivity
                         .setTitle(R.string.deleteConfirmation_title)
                         .setIcon(android.R.drawable.ic_dialog_alert)
                         .setMessage(R.string.deleteConfirmation)
-                        .setNegativeButton(R.string.noButton, null)
-                        .setPositiveButton(R.string.yesButton, this)
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .setPositiveButton(android.R.string.ok, this)
                         .setCancelable(false)
                         .create();
         }
@@ -310,6 +327,29 @@ public class ViewContactActivity extends ListActivity
     }
 
     @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        super.onPrepareOptionsMenu(menu);
+        // Perform this check each time the menu is about to be shown, because the Barcode Scanner
+        // could be installed or uninstalled at any time.
+        if (isBarcodeScannerInstalled()) {
+            if (menu.findItem(MENU_ITEM_SHOW_BARCODE) == null) {
+                menu.add(0, MENU_ITEM_SHOW_BARCODE, 0, R.string.menu_showBarcode)
+                        .setIcon(R.drawable.ic_menu_show_barcode);
+            }
+        } else {
+            menu.removeItem(MENU_ITEM_SHOW_BARCODE);
+        }
+        return true;
+    }
+
+    private boolean isBarcodeScannerInstalled() {
+        final Intent intent = new Intent(SHOW_BARCODE_INTENT);
+        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
+                PackageManager.MATCH_DEFAULT_ONLY);
+        return list.size() > 0;
+    }
+
+    @Override
     public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
         AdapterView.AdapterContextMenuInfo info;
         try {
@@ -356,6 +396,44 @@ public class ViewContactActivity extends ListActivity
                 showDialog(DIALOG_CONFIRM_DELETE);
                 return true;
             }
+            case MENU_ITEM_SHOW_BARCODE:
+                if (mCursor.moveToFirst()) {
+                    Intent intent = new Intent(SHOW_BARCODE_INTENT);
+                    intent.putExtra("ENCODE_TYPE", "CONTACT_TYPE");
+                    Bundle bundle = new Bundle();
+                    String name = mCursor.getString(CONTACT_NAME_COLUMN);
+                    if (!TextUtils.isEmpty(name)) {
+                        bundle.putString(Contacts.Intents.Insert.NAME, name);
+                        // The 0th ViewEntry in each ArrayList below is a separator item
+                        int entriesToAdd = Math.min(mPhoneEntries.size() - 1, PHONE_KEYS.length);
+                        for (int x = 0; x < entriesToAdd; x++) {
+                            ViewEntry entry = mPhoneEntries.get(x + 1);
+                            bundle.putString(PHONE_KEYS[x], entry.data);
+                        }
+                        entriesToAdd = Math.min(mEmailEntries.size() - 1, EMAIL_KEYS.length);
+                        for (int x = 0; x < entriesToAdd; x++) {
+                            ViewEntry entry = mEmailEntries.get(x + 1);
+                            bundle.putString(EMAIL_KEYS[x], entry.data);
+                        }
+                        if (mPostalEntries.size() >= 2) {
+                            ViewEntry entry = mPostalEntries.get(1);
+                            bundle.putString(Contacts.Intents.Insert.POSTAL, entry.data);
+                        }
+                        intent.putExtra("ENCODE_DATA", bundle);
+                        try {
+                            startActivity(intent);
+                        } catch (ActivityNotFoundException e) {
+                            // The check in onPrepareOptionsMenu() should make this impossible, but
+                            // for safety I'm catching the exception rather than crashing. Ideally
+                            // I'd call Menu.removeItem() here too, but I don't see a way to get
+                            // the options menu.
+                            Log.e(TAG, "Show barcode menu item was clicked but Barcode Scanner " +
+                                    "was not installed.");
+                        }
+                        return true;
+                    }
+                }
+                break;
         }
         return super.onOptionsItemSelected(item);
     }