am 090bad1b: am fdc37767: Reconcile with ics-mr1-release
* commit '090bad1be66b003e052911a6ff915170f26694aa':
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d06fe1d..43fd693 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -545,7 +545,13 @@
<data android:mimeType="image/*" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
- />
+ </activity>
+
+ <!-- Internal photo selection activity -->
+ <activity android:name=".activities.PhotoSelectionActivity"
+ android:theme="@style/Theme.PhotoSelector"
+ android:launchMode="singleTop"
+ android:windowSoftInputMode="stateUnchanged">
</activity>
<!-- Interstitial activity that shows a phone disambig dialog -->
@@ -562,7 +568,6 @@
<data android:mimeType="text/directory" />
<data android:mimeType="text/vcard" />
<data android:mimeType="text/x-vcard" />
- <data android:mimeType="text/x-vCard" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
@@ -574,7 +579,6 @@
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<data android:mimeType="text/vcard" />
<data android:mimeType="text/x-vcard" />
- <data android:mimeType="text/x-vCard" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
diff --git a/proguard.flags b/proguard.flags
index f4ec4b2..79378e6 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -9,24 +9,10 @@
public void *(android.view.MenuItem);
}
-# TODO: Instead of keeping the following two functions we could as well just remove them completely
-# as they are only used in test code
-
--keep class com.android.contacts.model.EntityDelta {
- public com.android.contacts.model.EntityDelta$ValuesDelta getSuperPrimaryEntry(java.lang.String,boolean);
-}
-
--keep class com.android.contacts.model.EntityDelta$ValuesDelta {
- public android.content.ContentValues getAfter();
-}
-
-# Any methods whose name is '*ForTest' are preserved.
--keep class ** {
- *** *ForTest(...);
-}
-
# Any class or method annotated with NeededForTesting.
-keep @com.android.contacts.test.NeededForTesting class *
-keepclassmembers class * {
@com.android.contacts.test.NeededForTesting *;
}
+
+-verbose
diff --git a/res/drawable-hdpi/btn_star_off_normal_holo_light.png b/res/drawable-hdpi/btn_star_off_normal_holo_light.png
new file mode 100644
index 0000000..cc17004
--- /dev/null
+++ b/res/drawable-hdpi/btn_star_off_normal_holo_light.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_star_on_normal_holo_light.png b/res/drawable-hdpi/btn_star_on_normal_holo_light.png
new file mode 100644
index 0000000..ce97262
--- /dev/null
+++ b/res/drawable-hdpi/btn_star_on_normal_holo_light.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_2sec_pause.png b/res/drawable-hdpi/ic_menu_2sec_pause.png
deleted file mode 100644
index 3951948..0000000
--- a/res/drawable-hdpi/ic_menu_2sec_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_accounts_holo_light.png b/res/drawable-hdpi/ic_menu_accounts_holo_light.png
deleted file mode 100644
index 59496c9..0000000
--- a/res/drawable-hdpi/ic_menu_accounts_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_display_all_holo_light.png b/res/drawable-hdpi/ic_menu_display_all_holo_light.png
deleted file mode 100644
index 59631f0..0000000
--- a/res/drawable-hdpi/ic_menu_display_all_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_import_export_holo_light.png b/res/drawable-hdpi/ic_menu_import_export_holo_light.png
deleted file mode 100644
index a67386f..0000000
--- a/res/drawable-hdpi/ic_menu_import_export_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_mark.png b/res/drawable-hdpi/ic_menu_mark.png
deleted file mode 100755
index 1c09175..0000000
--- a/res/drawable-hdpi/ic_menu_mark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_merge_holo_light.png b/res/drawable-hdpi/ic_menu_merge_holo_light.png
deleted file mode 100644
index eaf32d2..0000000
--- a/res/drawable-hdpi/ic_menu_merge_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_share_holo_light.png b/res/drawable-hdpi/ic_menu_share_holo_light.png
deleted file mode 100644
index 2ba6fb7..0000000
--- a/res/drawable-hdpi/ic_menu_share_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_split_holo_light.png b/res/drawable-hdpi/ic_menu_split_holo_light.png
deleted file mode 100644
index 3784544..0000000
--- a/res/drawable-hdpi/ic_menu_split_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_trash_holo_light.png b/res/drawable-hdpi/ic_menu_trash_holo_light.png
deleted file mode 100644
index 481eb65..0000000
--- a/res/drawable-hdpi/ic_menu_trash_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_wait.png b/res/drawable-hdpi/ic_menu_wait.png
deleted file mode 100644
index 6886e5d..0000000
--- a/res/drawable-hdpi/ic_menu_wait.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_star_off_normal_holo_light.png b/res/drawable-mdpi/btn_star_off_normal_holo_light.png
new file mode 100644
index 0000000..70483d9
--- /dev/null
+++ b/res/drawable-mdpi/btn_star_off_normal_holo_light.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_star_on_normal_holo_light.png b/res/drawable-mdpi/btn_star_on_normal_holo_light.png
new file mode 100644
index 0000000..3a52c18
--- /dev/null
+++ b/res/drawable-mdpi/btn_star_on_normal_holo_light.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_2sec_pause.png b/res/drawable-mdpi/ic_menu_2sec_pause.png
deleted file mode 100644
index dcaa5ff..0000000
--- a/res/drawable-mdpi/ic_menu_2sec_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_accounts_holo_light.png b/res/drawable-mdpi/ic_menu_accounts_holo_light.png
deleted file mode 100644
index ae291d8..0000000
--- a/res/drawable-mdpi/ic_menu_accounts_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_display_all_holo_light.png b/res/drawable-mdpi/ic_menu_display_all_holo_light.png
deleted file mode 100644
index 9781312..0000000
--- a/res/drawable-mdpi/ic_menu_display_all_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_import_export_holo_light.png b/res/drawable-mdpi/ic_menu_import_export_holo_light.png
deleted file mode 100644
index e31ec6b..0000000
--- a/res/drawable-mdpi/ic_menu_import_export_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_mark.png b/res/drawable-mdpi/ic_menu_mark.png
deleted file mode 100644
index 41ccddf..0000000
--- a/res/drawable-mdpi/ic_menu_mark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_merge_holo_light.png b/res/drawable-mdpi/ic_menu_merge_holo_light.png
deleted file mode 100644
index a650c4d..0000000
--- a/res/drawable-mdpi/ic_menu_merge_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_share_holo_light.png b/res/drawable-mdpi/ic_menu_share_holo_light.png
deleted file mode 100644
index 6b42585..0000000
--- a/res/drawable-mdpi/ic_menu_share_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_split_holo_light.png b/res/drawable-mdpi/ic_menu_split_holo_light.png
deleted file mode 100644
index 56afbc9..0000000
--- a/res/drawable-mdpi/ic_menu_split_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_trash_holo_light.png b/res/drawable-mdpi/ic_menu_trash_holo_light.png
deleted file mode 100644
index 29801b4..0000000
--- a/res/drawable-mdpi/ic_menu_trash_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_wait.png b/res/drawable-mdpi/ic_menu_wait.png
deleted file mode 100644
index c20457a..0000000
--- a/res/drawable-mdpi/ic_menu_wait.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/btn_star_off_normal_holo_light.png b/res/drawable-xhdpi/btn_star_off_normal_holo_light.png
new file mode 100644
index 0000000..ff718a7
--- /dev/null
+++ b/res/drawable-xhdpi/btn_star_off_normal_holo_light.png
Binary files differ
diff --git a/res/drawable-xhdpi/btn_star_on_normal_holo_light.png b/res/drawable-xhdpi/btn_star_on_normal_holo_light.png
new file mode 100644
index 0000000..282145f
--- /dev/null
+++ b/res/drawable-xhdpi/btn_star_on_normal_holo_light.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_2sec_pause.png b/res/drawable-xhdpi/ic_menu_2sec_pause.png
deleted file mode 100644
index 56f68b3..0000000
--- a/res/drawable-xhdpi/ic_menu_2sec_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_accounts_holo_light.png b/res/drawable-xhdpi/ic_menu_accounts_holo_light.png
deleted file mode 100644
index e58c7c8..0000000
--- a/res/drawable-xhdpi/ic_menu_accounts_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_display_all_holo_light.png b/res/drawable-xhdpi/ic_menu_display_all_holo_light.png
deleted file mode 100644
index 0aa4cad..0000000
--- a/res/drawable-xhdpi/ic_menu_display_all_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_import_export_holo_light.png b/res/drawable-xhdpi/ic_menu_import_export_holo_light.png
deleted file mode 100644
index 7b7d9da..0000000
--- a/res/drawable-xhdpi/ic_menu_import_export_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_mark.png b/res/drawable-xhdpi/ic_menu_mark.png
deleted file mode 100644
index a24adc5..0000000
--- a/res/drawable-xhdpi/ic_menu_mark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_merge_holo_light.png b/res/drawable-xhdpi/ic_menu_merge_holo_light.png
deleted file mode 100644
index 31bc346..0000000
--- a/res/drawable-xhdpi/ic_menu_merge_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_share_holo_light.png b/res/drawable-xhdpi/ic_menu_share_holo_light.png
deleted file mode 100644
index 1c88e0e..0000000
--- a/res/drawable-xhdpi/ic_menu_share_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_split_holo_light.png b/res/drawable-xhdpi/ic_menu_split_holo_light.png
deleted file mode 100644
index 16c6ade..0000000
--- a/res/drawable-xhdpi/ic_menu_split_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_trash_holo_light.png b/res/drawable-xhdpi/ic_menu_trash_holo_light.png
deleted file mode 100644
index d234d73..0000000
--- a/res/drawable-xhdpi/ic_menu_trash_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_wait.png b/res/drawable-xhdpi/ic_menu_wait.png
deleted file mode 100644
index ee5ee68..0000000
--- a/res/drawable-xhdpi/ic_menu_wait.png
+++ /dev/null
Binary files differ
diff --git a/res/layout-sw580dp-w1000dp/contact_editor_activity.xml b/res/layout-sw580dp-w1000dp/contact_editor_activity.xml
index d2e0d22..cb4067e 100644
--- a/res/layout-sw580dp-w1000dp/contact_editor_activity.xml
+++ b/res/layout-sw580dp-w1000dp/contact_editor_activity.xml
@@ -23,7 +23,8 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:baselineAligned="false">
<!-- Empty view to represent the left margin -->
<View
diff --git a/res/layout-sw580dp/detail_header_contact_with_updates.xml b/res/layout-sw580dp/detail_header_contact_with_updates.xml
index 43cf4c0..f732b23 100644
--- a/res/layout-sw580dp/detail_header_contact_with_updates.xml
+++ b/res/layout-sw580dp/detail_header_contact_with_updates.xml
@@ -27,14 +27,14 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="30dip"
- android:paddingBottom="8dip">
+ android:paddingBottom="16dip">
<!-- Add a first item that gives us enough space to show the carousel -->
<view
class="com.android.contacts.widget.ProportionalLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- ex:ratio="0.66"
+ ex:ratio="0.6667"
ex:direction="widthToHeight">
<!-- Put a dummy view here because the ProportionalLayout requires one -->
diff --git a/res/layout-sw580dp/detail_header_contact_without_updates.xml b/res/layout-sw580dp/detail_header_contact_without_updates.xml
index 9261f11..3c01b16 100644
--- a/res/layout-sw580dp/detail_header_contact_without_updates.xml
+++ b/res/layout-sw580dp/detail_header_contact_without_updates.xml
@@ -32,7 +32,7 @@
class="com.android.contacts.widget.ProportionalLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- ex:ratio="0.66"
+ ex:ratio="0.6667"
ex:direction="widthToHeight">
<LinearLayout
@@ -40,9 +40,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
- <ImageView
- android:id="@+id/photo"
- android:scaleType="centerCrop"
+ <include layout="@layout/photo_selector_view"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="2" />
diff --git a/res/layout-sw580dp/favorites_star.xml b/res/layout-sw580dp/favorites_star.xml
index 7959df3..22b9339 100644
--- a/res/layout-sw580dp/favorites_star.xml
+++ b/res/layout-sw580dp/favorites_star.xml
@@ -14,19 +14,12 @@
limitations under the License.
-->
-<FrameLayout
+<!-- The favorite star, shown outside of the ActionBar -->
+<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:minHeight="50dip">
-
- <CheckBox
- android:id="@+id/star"
- android:duplicateParentState="true"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_gravity="center_vertical"
- android:contentDescription="@string/description_star"
- style="?android:attr/starStyle"/>
-
-</FrameLayout>
+ android:id="@+id/star"
+ android:layout_width="48dip"
+ android:layout_height="48dip"
+ android:scaleType="center"
+ android:background="?android:attr/selectableItemBackground"
+ android:src="@drawable/btn_star_off_normal_holo_light" />
diff --git a/res/layout-sw580dp/join_contact_picker.xml b/res/layout-sw580dp/join_contact_picker.xml
new file mode 100644
index 0000000..3d9127b
--- /dev/null
+++ b/res/layout-sw580dp/join_contact_picker.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<view xmlns:android="http://schemas.android.com/apk/res/android"
+ class="com.android.contacts.widget.FullHeightLinearLayout"
+ style="@style/ContactPickerLayout"
+ android:orientation="vertical">
+ <!-- See also comments in contact_picker.xml -->
+ <view
+ class="android.widget.SearchView"
+ android:id="@+id/search_view"
+ android:layout_width="match_parent"
+ android:maxWidth="@dimen/contact_picker_search_view_max_width"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="0dip"
+ android:layout_marginRight="@dimen/list_visible_scrollbar_padding"
+ android:paddingRight="0dip"
+ android:iconifiedByDefault="false" />
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:id="@+id/list_container" />
+</view>
diff --git a/res/layout-sw580dp/people_activity.xml b/res/layout-sw580dp/people_activity.xml
index 59a218d..9cf695d 100644
--- a/res/layout-sw580dp/people_activity.xml
+++ b/res/layout-sw580dp/people_activity.xml
@@ -25,14 +25,14 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
- android:splitMotionEvents="true">
+ android:splitMotionEvents="true"
+ android:baselineAligned="false">
- <LinearLayout
+ <FrameLayout
android:id="@+id/browse_view"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1"
- android:orientation="vertical"
android:background="@drawable/list_background_holo"
android:visibility="gone">
@@ -40,9 +40,8 @@
<fragment
android:id="@+id/all_fragment"
class="com.android.contacts.list.DefaultContactBrowseListFragment"
- android:layout_height="0dip"
- android:layout_width="match_parent"
- android:layout_weight="1" />
+ android:layout_height="match_parent"
+ android:layout_width="match_parent" />
<!-- Groups -->
<fragment
@@ -50,7 +49,7 @@
class="com.android.contacts.group.GroupBrowseListFragment"
android:layout_height="match_parent"
android:layout_width="match_parent" />
- </LinearLayout>
+ </FrameLayout>
<view
class="com.android.contacts.widget.TransitionAnimationView"
@@ -111,7 +110,8 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@drawable/list_background_holo">
+ android:background="@drawable/list_background_holo"
+ android:baselineAligned="false">
<!-- Starred -->
<FrameLayout
diff --git a/res/layout-sw580dp/updates_header_contact.xml b/res/layout-sw580dp/updates_header_contact.xml
index 00e3d1b..cb55a2d 100644
--- a/res/layout-sw580dp/updates_header_contact.xml
+++ b/res/layout-sw580dp/updates_header_contact.xml
@@ -30,7 +30,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dip"
- ex:ratio="0.66"
+ ex:ratio="0.6667"
ex:direction="widthToHeight">
<!-- Put a dummy view here because the ProportionalLayout requires one -->
diff --git a/res/layout-sw680dp-w1000dp/contact_detail_container.xml b/res/layout-sw680dp-w1000dp/contact_detail_container.xml
index 6b1d094..9e1eb33 100644
--- a/res/layout-sw680dp-w1000dp/contact_detail_container.xml
+++ b/res/layout-sw680dp-w1000dp/contact_detail_container.xml
@@ -24,7 +24,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:baselineAligned="false">
<!--
Container for the "About" fragment on the contact card for a contact
diff --git a/res/layout-sw680dp-w1000dp/contact_detail_fragment.xml b/res/layout-sw680dp-w1000dp/contact_detail_fragment.xml
index ecf8130..890a81c 100644
--- a/res/layout-sw680dp-w1000dp/contact_detail_fragment.xml
+++ b/res/layout-sw680dp-w1000dp/contact_detail_fragment.xml
@@ -36,14 +36,15 @@
android:orientation="horizontal"
android:layout_weight="1"
android:layout_width="match_parent"
- android:layout_height="0dip">
+ android:layout_height="0dip"
+ android:baselineAligned="false">
- <ImageView android:id="@+id/photo"
- android:scaleType="centerCrop"
+ <include android:id="@+id/static_photo_container"
+ layout="@layout/photo_selector_view"
android:layout_width="@dimen/detail_contact_photo_size"
android:layout_height="@dimen/detail_contact_photo_size"
android:layout_marginTop="@dimen/detail_contact_photo_margin"
- android:layout_marginRight="@dimen/detail_contact_photo_margin"/>
+ android:layout_marginRight="@dimen/detail_contact_photo_margin" />
<ListView android:id="@android:id/list"
android:layout_width="0dip"
diff --git a/res/layout-sw680dp-w1000dp/contact_detail_list_item.xml b/res/layout-sw680dp-w1000dp/contact_detail_list_item.xml
index 98ffce6..2016131 100644
--- a/res/layout-sw680dp-w1000dp/contact_detail_list_item.xml
+++ b/res/layout-sw680dp-w1000dp/contact_detail_list_item.xml
@@ -50,15 +50,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" />
-
- <TextView
- android:id="@+id/footer"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorSecondary"
- android:visibility="gone" />
-
</LinearLayout>
<ImageView
diff --git a/res/layout-sw680dp-w1000dp/detail_header_contact_with_updates.xml b/res/layout-sw680dp-w1000dp/detail_header_contact_with_updates.xml
index dfba659..7758a21 100644
--- a/res/layout-sw680dp-w1000dp/detail_header_contact_with_updates.xml
+++ b/res/layout-sw680dp-w1000dp/detail_header_contact_with_updates.xml
@@ -27,9 +27,7 @@
android:paddingBottom="8dip"
android:orientation="horizontal">
- <ImageView
- android:id="@+id/photo"
- android:scaleType="centerCrop"
+ <include layout="@layout/photo_selector_view"
android:layout_width="@dimen/detail_contact_photo_size"
android:layout_height="@dimen/detail_contact_photo_size" />
diff --git a/res/layout-sw680dp-w1000dp/detail_header_contact_without_updates.xml b/res/layout-sw680dp-w1000dp/detail_header_contact_without_updates.xml
index f9dcf3d..9e53df0 100644
--- a/res/layout-sw680dp-w1000dp/detail_header_contact_without_updates.xml
+++ b/res/layout-sw680dp-w1000dp/detail_header_contact_without_updates.xml
@@ -50,7 +50,6 @@
android:id="@+id/company"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingTop="16dip"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorSecondary" />
diff --git a/res/layout-sw680dp-w1000dp/people_activity.xml b/res/layout-sw680dp-w1000dp/people_activity.xml
index a288ff0..e34ec21 100644
--- a/res/layout-sw680dp-w1000dp/people_activity.xml
+++ b/res/layout-sw680dp-w1000dp/people_activity.xml
@@ -26,11 +26,10 @@
android:layout_height="match_parent"
android:splitMotionEvents="true">
- <LinearLayout
+ <FrameLayout
android:id="@+id/browse_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:orientation="vertical"
android:minWidth="100dip"
ex:layout_narrowParentWidth="1000dip"
ex:layout_narrowWidth="276dip"
@@ -43,9 +42,8 @@
<fragment
android:id="@+id/all_fragment"
class="com.android.contacts.list.DefaultContactBrowseListFragment"
- android:layout_height="0dip"
- android:layout_width="match_parent"
- android:layout_weight="1" />
+ android:layout_height="match_parent"
+ android:layout_width="match_parent" />
<!-- Groups -->
<fragment
@@ -53,7 +51,7 @@
class="com.android.contacts.group.GroupBrowseListFragment"
android:layout_height="match_parent"
android:layout_width="match_parent" />
- </LinearLayout>
+ </FrameLayout>
<view
class="com.android.contacts.widget.TransitionAnimationView"
@@ -115,7 +113,8 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@drawable/list_background_holo">
+ android:background="@drawable/list_background_holo"
+ android:baselineAligned="false">
<!-- Starred -->
<FrameLayout
diff --git a/res/layout-w470dp/contact_detail_fragment.xml b/res/layout-w470dp/contact_detail_fragment.xml
index 415bb56..5de063f 100644
--- a/res/layout-w470dp/contact_detail_fragment.xml
+++ b/res/layout-w470dp/contact_detail_fragment.xml
@@ -35,14 +35,15 @@
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_above="@id/contact_quick_fix"
- android:layout_height="match_parent" >
+ android:layout_height="match_parent"
+ android:baselineAligned="false" >
- <ImageView android:id="@+id/photo"
- android:scaleType="centerCrop"
+ <include android:id="@+id/static_photo_container"
+ layout="@layout/photo_selector_view"
android:layout_width="128dip"
android:layout_height="128dip"
android:layout_marginLeft="@dimen/detail_contact_photo_margin"
- android:layout_marginTop="@dimen/detail_contact_photo_margin"/>
+ android:layout_marginTop="@dimen/detail_contact_photo_margin" />
<ListView android:id="@android:id/list"
android:layout_width="0dip"
diff --git a/res/layout/account_filter_header.xml b/res/layout/account_filter_header.xml
index ef0a9c2..0ffb7e1 100644
--- a/res/layout/account_filter_header.xml
+++ b/res/layout/account_filter_header.xml
@@ -23,7 +23,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:paddingTop="@dimen/account_filter_header_top_padding"
+ android:paddingTop="@dimen/list_header_extra_top_padding"
android:layout_marginLeft="@dimen/contact_browser_list_header_left_margin"
android:layout_marginRight="@dimen/contact_browser_list_header_right_margin"
android:background="?android:attr/selectableItemBackground"
diff --git a/res/layout/call_detail.xml b/res/layout/call_detail.xml
index 13124f2..7498f5a 100644
--- a/res/layout/call_detail.xml
+++ b/res/layout/call_detail.xml
@@ -162,16 +162,22 @@
<TextView android:id="@+id/call_and_sms_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:paddingRight="@dimen/call_log_icon_margin"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?attr/call_log_primary_text_color"
+ android:singleLine="true"
+ android:ellipsize="end"
/>
<TextView android:id="@+id/call_and_sms_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:paddingRight="@dimen/call_log_icon_margin"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?attr/call_log_primary_text_color"
android:textAllCaps="true"
+ android:singleLine="true"
+ android:ellipsize="end"
/>
</LinearLayout>
diff --git a/res/layout/call_log_list_item.xml b/res/layout/call_log_list_item.xml
index 777c7af..4040c28 100644
--- a/res/layout/call_log_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -69,18 +69,38 @@
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginRight="@dimen/call_log_icon_margin"
android:textColor="?attr/call_log_primary_text_color"
android:textSize="18sp"
android:singleLine="true"
/>
- <TextView
- android:id="@+id/number"
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="14sp"
- android:singleLine="true"
- />
+ android:orientation="horizontal"
+ >
+ <TextView
+ android:id="@+id/number"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="@dimen/call_log_icon_margin"
+ android:textColor="?attr/call_log_secondary_text_color"
+ android:textSize="14sp"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ />
+ <TextView
+ android:id="@+id/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="@dimen/call_log_icon_margin"
+ android:textColor="?attr/call_log_secondary_text_color"
+ android:textStyle="bold"
+ android:textSize="14sp"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ />
+ </LinearLayout>
<LinearLayout
android:id="@+id/call_type"
android:layout_width="wrap_content"
@@ -99,6 +119,7 @@
android:id="@+id/call_count_and_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginRight="@dimen/call_log_icon_margin"
android:layout_gravity="center_vertical"
android:textColor="?attr/call_log_secondary_text_color"
android:textSize="14sp"
diff --git a/res/layout/carousel_about_tab.xml b/res/layout/carousel_about_tab.xml
index c5d4114..0f93482 100644
--- a/res/layout/carousel_about_tab.xml
+++ b/res/layout/carousel_about_tab.xml
@@ -30,7 +30,7 @@
<!-- Transparent view to overlay on the contact's photo
(to allow white text to appear over a white photo). -->
- <View
+ <View android:id="@+id/label_background"
android:layout_width="match_parent"
android:layout_height="@dimen/detail_tab_carousel_tab_label_height"
android:layout_alignParentLeft="true"
diff --git a/res/layout/carousel_updates_tab.xml b/res/layout/carousel_updates_tab.xml
index d23f650..e4b61b9 100644
--- a/res/layout/carousel_updates_tab.xml
+++ b/res/layout/carousel_updates_tab.xml
@@ -36,7 +36,7 @@
<!-- Transparent view to overlay on the update photo
(to allow white text to appear over a white photo). -->
- <View
+ <View android:id="@+id/label_background"
android:layout_width="match_parent"
android:layout_height="@dimen/detail_tab_carousel_tab_label_height"
android:layout_alignParentLeft="true"
diff --git a/res/layout/contact_detail_fragment_carousel.xml b/res/layout/contact_detail_fragment_carousel.xml
index 2572cc4..d01a18e 100644
--- a/res/layout/contact_detail_fragment_carousel.xml
+++ b/res/layout/contact_detail_fragment_carousel.xml
@@ -19,7 +19,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:baselineAligned="false">
<!--
Container for the "About" page fragment on the contact card for a contact
diff --git a/res/layout/contact_detail_list_item.xml b/res/layout/contact_detail_list_item.xml
index 44f5a53..666b67c 100644
--- a/res/layout/contact_detail_list_item.xml
+++ b/res/layout/contact_detail_list_item.xml
@@ -82,15 +82,6 @@
</LinearLayout>
- <TextView
- android:id="@+id/footer"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorSecondary"
- android:visibility="gone" />
-
</LinearLayout>
<View
diff --git a/res/layout/contact_detail_list_padding.xml b/res/layout/contact_detail_list_padding.xml
index 8095731..c5dbd06 100644
--- a/res/layout/contact_detail_list_padding.xml
+++ b/res/layout/contact_detail_list_padding.xml
@@ -23,6 +23,5 @@
<View
android:id="@+id/contact_detail_list_padding"
android:layout_width="match_parent"
- android:layout_height="@dimen/contact_browser_list_top_margin" />
+ android:layout_height="@dimen/list_header_extra_top_padding" />
</FrameLayout>
-
diff --git a/res/layout/contact_detail_tab_carousel.xml b/res/layout/contact_detail_tab_carousel.xml
index 28463a2..711a6c3 100644
--- a/res/layout/contact_detail_tab_carousel.xml
+++ b/res/layout/contact_detail_tab_carousel.xml
@@ -23,26 +23,48 @@
android:fadingEdge="none">
<LinearLayout
- android:id="@+id/tab_container"
+ android:id="@+id/tab_and_shadow_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="horizontal">
+ android:orientation="vertical">
- <!-- "About" tab -->
- <include
- android:id="@+id/tab_about"
- layout="@layout/carousel_about_tab" />
+ <LinearLayout
+ android:id="@+id/tab_container"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:orientation="horizontal"
+ android:baselineAligned="false">
- <!-- Vertical divider -->
+ <!-- "About" tab -->
+ <include
+ android:id="@+id/tab_about"
+ layout="@layout/carousel_about_tab" />
+
+ <!-- Vertical divider -->
+ <View
+ android:id="@+id/tab_divider"
+ android:layout_width="1dip"
+ android:layout_height="match_parent"
+ android:background="@android:color/white"/>
+
+ <!-- "Updates" tab -->
+ <include
+ android:id="@+id/tab_update"
+ layout="@layout/carousel_updates_tab" />
+
+ </LinearLayout>
+
+ <!--
+ Shadow below the carousel. The ContactDetailTabCarousel increases its height to
+ account for this shadow, and the class assumes the height of this shadow to be
+ @dimen/detail_contact_photo_shadow_height.
+ -->
<View
- android:layout_width="1dip"
- android:layout_height="match_parent"
- android:background="@android:color/white"/>
-
- <!-- "Updates" tab -->
- <include
- android:id="@+id/tab_update"
- layout="@layout/carousel_updates_tab" />
+ android:id="@+id/shadow"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/detail_contact_photo_shadow_height"
+ android:background="?android:attr/windowContentOverlay"/>
</LinearLayout>
diff --git a/res/layout/contact_list_filter_item.xml b/res/layout/contact_list_filter_item.xml
index b27cab8..7814565 100644
--- a/res/layout/contact_list_filter_item.xml
+++ b/res/layout/contact_list_filter_item.xml
@@ -17,29 +17,50 @@
<view
xmlns:android="http://schemas.android.com/apk/res/android"
class="com.android.contacts.list.ContactListFilterView"
+ android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="@dimen/contact_filter_item_min_height">
-
- <View
- android:id="@+id/indent"
- android:layout_width="32dip"
- android:layout_height="fill_parent" />
+ android:minHeight="@dimen/contact_filter_item_min_height"
+ android:gravity="center_vertical">
<ImageView
android:id="@+id/icon"
android:scaleType="fitCenter"
android:layout_width="@dimen/contact_filter_icon_size"
- android:layout_height="@dimen/contact_filter_icon_size"
- android:layout_gravity="center_vertical" />
+ android:layout_height="@dimen/contact_filter_icon_size"/>
- <TextView
- android:id="@+id/label"
+ <LinearLayout
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:layout_marginLeft="8dip">
+
+ <TextView
+ android:id="@+id/accountType"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:singleLine="true"
+ android:ellipsize="end"/>
+
+ <TextView
+ android:id="@+id/accountUserName"
+ android:layout_marginTop="-3dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/textColorTertiary"
+ android:singleLine="true"
+ android:ellipsize="end"/>
+ </LinearLayout>
+
+ <RadioButton
+ android:id="@+id/radioButton"
+ android:clickable="false"
+ android:layout_marginTop="1dip"
android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_marginLeft="8dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:gravity="center_vertical"
- android:ellipsize="end" />
+ android:layout_height="wrap_content"
+ android:layout_gravity="right|center_vertical" />
</view>
diff --git a/res/layout/contact_tile_frequent_phone.xml b/res/layout/contact_tile_frequent_phone.xml
index aa2d9a8..5c7b7e2 100644
--- a/res/layout/contact_tile_frequent_phone.xml
+++ b/res/layout/contact_tile_frequent_phone.xml
@@ -18,7 +18,7 @@
<view
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/contact_tile_frequent_phone"
- class="com.android.contacts.list.ContactTileDarkFrequentView"
+ class="com.android.contacts.list.ContactTilePhoneFrequentView"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:nextFocusLeft="@+id/contact_tile_quick">
diff --git a/res/layout/contact_tile_starred.xml b/res/layout/contact_tile_starred.xml
index 4116157..91438e9 100644
--- a/res/layout/contact_tile_starred.xml
+++ b/res/layout/contact_tile_starred.xml
@@ -73,7 +73,7 @@
</LinearLayout>
- <View
+ <View
android:id="@+id/contact_tile_push_state"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/res/layout/contacts_unavailable_fragment.xml b/res/layout/contacts_unavailable_fragment.xml
index 9f28a55..1abc020 100644
--- a/res/layout/contacts_unavailable_fragment.xml
+++ b/res/layout/contacts_unavailable_fragment.xml
@@ -62,13 +62,12 @@
android:layout_marginBottom="15dip"
android:text="@string/contacts_unavailable_add_account" />
- <!-- TODO: Use a string that says "Import" instead of "Import/export contacts"-->
<Button
android:id="@+id/import_contacts_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dip"
- android:text="@string/dialog_import_export" />
+ android:text="@string/contacts_unavailable_import_contacts" />
<Button
android:id="@+id/import_failure_uninstall_button"
diff --git a/res/layout/detail_header_contact_with_updates.xml b/res/layout/detail_header_contact_with_updates.xml
index 8d18963..39f0582 100644
--- a/res/layout/detail_header_contact_with_updates.xml
+++ b/res/layout/detail_header_contact_with_updates.xml
@@ -18,16 +18,22 @@
This is a header entry in the contact details list for when the contact has social updates. The
entry maintains vertical padding to ensure that the first contact detail is visible (and below
the tab carousel). No information has to be displayed in this header.
+ The FrameLayout is used to apply additional padding which is needed for the shadow
-->
-<view
+<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ex="http://schemas.android.com/apk/res/com.android.contacts"
- class="com.android.contacts.widget.ProportionalLayout"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- ex:ratio="0.5"
- ex:direction="widthToHeight">
- <FrameLayout
+ android:layout_height="wrap_content">
+ <view
+ class="com.android.contacts.widget.ProportionalLayout"
android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-</view>
\ No newline at end of file
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/detail_contact_photo_shadow_height"
+ ex:ratio="0.5"
+ ex:direction="widthToHeight">
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+ </view>
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/detail_header_contact_without_updates.xml b/res/layout/detail_header_contact_without_updates.xml
index 2de7711..7e5037e 100644
--- a/res/layout/detail_header_contact_without_updates.xml
+++ b/res/layout/detail_header_contact_without_updates.xml
@@ -18,17 +18,29 @@
This is a header entry in the contact details list for when the contact does not have social
updates, which means that the contact's photo will scroll with the list of details.
-->
-<view
+<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ex="http://schemas.android.com/apk/res/com.android.contacts"
- class="com.android.contacts.widget.ProportionalLayout"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- ex:ratio="0.5"
- ex:direction="widthToHeight">
- <ImageView
- android:id="@+id/photo"
- android:scaleType="centerCrop"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <!-- Contact photo -->
+ <view
+ class="com.android.contacts.widget.ProportionalLayout"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
-</view>
\ No newline at end of file
+ android:layout_height="wrap_content"
+ ex:ratio="0.5"
+ ex:direction="widthToHeight">
+
+ <include layout="@layout/photo_selector_view" />
+
+ </view>
+
+ <!-- Shadow -->
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/detail_contact_photo_shadow_height"
+ android:background="?android:attr/windowContentOverlay"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/dialpad.xml b/res/layout/dialpad.xml
index 45f40f6..247bd5a 100644
--- a/res/layout/dialpad.xml
+++ b/res/layout/dialpad.xml
@@ -31,13 +31,16 @@
<TableRow
android:layout_height="0px"
android:layout_weight="1">
- <ImageButton android:id="@+id/one" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/one" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_1"
android:contentDescription="@string/description_image_button_one" />
- <ImageButton android:id="@+id/two" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/two" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_2"
android:contentDescription="@string/description_image_button_two" />
- <ImageButton android:id="@+id/three" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/three" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_3"
android:contentDescription="@string/description_image_button_three" />
</TableRow>
@@ -45,13 +48,16 @@
<TableRow
android:layout_height="0px"
android:layout_weight="1">
- <ImageButton android:id="@+id/four" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/four" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_4"
android:contentDescription="@string/description_image_button_four" />
- <ImageButton android:id="@+id/five" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/five" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_5"
android:contentDescription="@string/description_image_button_five" />
- <ImageButton android:id="@+id/six" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/six" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_6"
android:contentDescription="@string/description_image_button_six" />
</TableRow>
@@ -59,13 +65,16 @@
<TableRow
android:layout_height="0px"
android:layout_weight="1">
- <ImageButton android:id="@+id/seven" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/seven" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_7"
android:contentDescription="@string/description_image_button_seven" />
- <ImageButton android:id="@+id/eight" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/eight" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_8"
android:contentDescription="@string/description_image_button_eight" />
- <ImageButton android:id="@+id/nine" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/nine" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_9"
android:contentDescription="@string/description_image_button_nine" />
</TableRow>
@@ -73,13 +82,16 @@
<TableRow
android:layout_height="0px"
android:layout_weight="1">
- <ImageButton android:id="@+id/star" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/star" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_star"
android:contentDescription="@string/description_image_button_star" />
- <ImageButton android:id="@+id/zero" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/zero" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_0"
android:contentDescription="@string/description_image_button_zero" />
- <ImageButton android:id="@+id/pound" style="@style/DialtactsDialpadButtonStyle"
+ <com.android.contacts.dialpad.DialpadImageButton
+ android:id="@+id/pound" style="@style/DialtactsDialpadButtonStyle"
android:src="@drawable/dial_num_pound"
android:contentDescription="@string/description_image_button_pound" />
</TableRow>
diff --git a/res/layout/directory_header.xml b/res/layout/directory_header.xml
index a2adf48..8e845e0 100644
--- a/res/layout/directory_header.xml
+++ b/res/layout/directory_header.xml
@@ -15,23 +15,21 @@
-->
<!-- Layout used for list section separators. -->
-<RelativeLayout
+<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/DirectoryHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:gravity="center_vertical"
android:minHeight="@dimen/list_section_divider_min_height"
android:background="@drawable/list_section_divider_holo_custom"
- android:paddingTop="@dimen/contact_browser_list_top_margin"
+ android:layout_marginTop="@dimen/list_header_extra_top_padding"
android:paddingLeft="?attr/list_item_padding_left"
android:paddingRight="?attr/list_item_padding_right">
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
android:layout_marginLeft="8dip"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/people_app_theme_color"
@@ -39,21 +37,9 @@
android:textStyle="bold"
android:textAllCaps="true" />
<TextView
- android:id="@+id/count"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_alignBaseline="@id/label"
- android:singleLine="true"
- android:textSize="12sp"
- android:textColor="@color/contact_count_text_color" />
- <TextView
android:id="@+id/display_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_toRightOf="@id/label"
- android:layout_toLeftOf="@id/count"
- android:layout_alignBaseline="@id/label"
android:layout_marginLeft="8dip"
android:layout_marginRight="8dip"
android:textAppearance="?android:attr/textAppearanceSmall"
@@ -61,4 +47,14 @@
android:singleLine="true"
android:textStyle="bold"
android:textAllCaps="true" />
-</RelativeLayout>
+ <TextView
+ android:id="@+id/count"
+ android:paddingTop="1dip"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:gravity="right"
+ android:singleLine="true"
+ android:textSize="12sp"
+ android:textColor="@color/contact_count_text_color" />
+</LinearLayout>
diff --git a/res/layout/group_browse_list_account_header.xml b/res/layout/group_browse_list_account_header.xml
index 709c276..78e0639 100644
--- a/res/layout/group_browse_list_account_header.xml
+++ b/res/layout/group_browse_list_account_header.xml
@@ -24,7 +24,7 @@
<View
android:id="@+id/header_extra_top_padding"
android:layout_width="match_parent"
- android:layout_height="@dimen/contact_browser_list_top_margin" />
+ android:layout_height="@dimen/list_header_extra_top_padding" />
<LinearLayout
android:layout_width="match_parent"
diff --git a/res/layout/join_contact_picker.xml b/res/layout/join_contact_picker.xml
index ea0deaf..ee30525 100644
--- a/res/layout/join_contact_picker.xml
+++ b/res/layout/join_contact_picker.xml
@@ -14,23 +14,13 @@
limitations under the License.
-->
-<view
- xmlns:android="http://schemas.android.com/apk/res/android"
+<view xmlns:android="http://schemas.android.com/apk/res/android"
class="com.android.contacts.widget.FullHeightLinearLayout"
style="@style/ContactPickerLayout"
android:orientation="vertical">
-
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:id="@+id/list_container" />
-
- <View
- android:id="@+id/divider"
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:layout_marginLeft="?attr/contact_browser_list_padding_left"
- android:layout_marginRight="?attr/contact_browser_list_padding_right"
- android:background="?android:attr/dividerHorizontal" />
</view>
diff --git a/res/layout/photo_selector_view.xml b/res/layout/photo_selector_view.xml
new file mode 100644
index 0000000..0006559
--- /dev/null
+++ b/res/layout/photo_selector_view.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+ View for displaying photos that show a photo selector when clicked.
+-->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ImageView
+ android:id="@+id/photo"
+ android:scaleType="centerCrop"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <View
+ android:id="@+id/photo_touch_intercept_overlay"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="?android:attr/selectableItemBackground"
+ android:visibility="gone" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/favorites_star.xml b/res/layout/photoselection_activity.xml
similarity index 63%
rename from res/layout/favorites_star.xml
rename to res/layout/photoselection_activity.xml
index 2ac3039..75f729b 100644
--- a/res/layout/favorites_star.xml
+++ b/res/layout/photoselection_activity.xml
@@ -13,21 +13,20 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingLeft="10dip"
- android:paddingRight="10dip">
-
- <CheckBox
- android:id="@+id/star"
- android:duplicateParentState="true"
+ xmlns:ex="http://schemas.android.com/apk/res/com.android.contacts"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <View
+ android:id="@+id/backdrop"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#000000" />
+ <view
+ android:id="@+id/photo"
+ class="com.android.contacts.detail.TransformableImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:contentDescription="@string/description_star"
- android:visibility="invisible"
- android:button="@drawable/btn_star_holo_dark"/>
-</FrameLayout>
+ android:scaleType="centerCrop" />
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/quickcontact_list_fragment.xml b/res/layout/quickcontact_list_fragment.xml
index 5ade104..e542f7a 100755
--- a/res/layout/quickcontact_list_fragment.xml
+++ b/res/layout/quickcontact_list_fragment.xml
@@ -14,28 +14,19 @@
limitations under the License.
-->
-<LinearLayout
+<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
- <!-- Line that looks like a list divider -->
- <View
+ <ListView
+ android:id="@+id/list"
android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="@color/quickcontact_list_divider" />
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <ListView
- android:id="@+id/list"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:divider="@drawable/quickcontact_list_item_divider"
- android:dividerHeight="1dip"
- android:background="@color/quickcontact_list_background"
- android:cacheColorHint="@null"
- android:layout_alignParentTop="true" />
- <include layout="@layout/quickcontact_list_fragment_bottom"/>
- </RelativeLayout>
-</LinearLayout>
+ android:layout_height="wrap_content"
+ android:divider="@drawable/quickcontact_list_item_divider"
+ android:dividerHeight="1dip"
+ android:background="@color/quickcontact_list_background"
+ android:cacheColorHint="@null"
+ android:layout_alignParentTop="true"
+ />
+ <include layout="@layout/quickcontact_list_fragment_bottom"/>
+</RelativeLayout>
diff --git a/res/layout/quickcontact_list_item.xml b/res/layout/quickcontact_list_item.xml
index ee3a89f..1b66ec3 100755
--- a/res/layout/quickcontact_list_item.xml
+++ b/res/layout/quickcontact_list_item.xml
@@ -27,13 +27,27 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:singleLine="true"
android:ellipsize="end" />
- <TextView
- android:id="@android:id/text2"
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/secondary_text_color"
- android:textAllCaps="true"
- android:textAppearance="?android:attr/textAppearanceSmall" />
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+id/presence_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="1dip"
+ android:layout_marginRight="4dip"
+ android:layout_gravity="center_vertical"
+ android:gravity="center"
+ android:scaleType="centerInside" />
+ <TextView
+ android:id="@android:id/text2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/secondary_text_color"
+ android:textAllCaps="true"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+ </LinearLayout>
</LinearLayout>
<include layout="@layout/quickcontact_list_item_base"/>
</LinearLayout>
diff --git a/res/layout/quickcontact_list_item_address.xml b/res/layout/quickcontact_list_item_address.xml
index 9773b10..cb99673 100755
--- a/res/layout/quickcontact_list_item_address.xml
+++ b/res/layout/quickcontact_list_item_address.xml
@@ -28,13 +28,27 @@
android:layout_height="wrap_content"
android:textColor="@color/primary_text_color"
android:textAppearance="?android:attr/textAppearanceMedium" />
- <TextView
- android:id="@android:id/text2"
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/secondary_text_color"
- android:textAllCaps="true"
- android:textAppearance="?android:attr/textAppearanceSmall" />
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+id/presence_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="1dip"
+ android:layout_marginRight="4dip"
+ android:layout_gravity="center_vertical"
+ android:gravity="center"
+ android:scaleType="centerInside" />
+ <TextView
+ android:id="@android:id/text2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/secondary_text_color"
+ android:textAllCaps="true"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+ </LinearLayout>
</LinearLayout>
<include layout="@layout/quickcontact_list_item_base"/>
</LinearLayout>
diff --git a/res/layout/raw_contact_editor_view.xml b/res/layout/raw_contact_editor_view.xml
index 5180557..1ea781e 100644
--- a/res/layout/raw_contact_editor_view.xml
+++ b/res/layout/raw_contact_editor_view.xml
@@ -77,7 +77,8 @@
android:id="@+id/sect_fields"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"/>
+ android:orientation="vertical"
+ android:layout_marginBottom="16dip"/>
<Button
android:id="@+id/button_add_field"
@@ -85,7 +86,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:layout_marginTop="16dip"
android:layout_marginBottom="32dip"/>
</LinearLayout>
diff --git a/res/layout/updates_header_contact.xml b/res/layout/updates_header_contact.xml
index 774fa7b..bfcd6e0 100644
--- a/res/layout/updates_header_contact.xml
+++ b/res/layout/updates_header_contact.xml
@@ -29,6 +29,7 @@
class="com.android.contacts.widget.ProportionalLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/detail_contact_photo_shadow_height"
ex:ratio="0.5"
ex:direction="widthToHeight">
diff --git a/res/layout/user_profile_header.xml b/res/layout/user_profile_header.xml
index 6867dea..67b64d5 100644
--- a/res/layout/user_profile_header.xml
+++ b/res/layout/user_profile_header.xml
@@ -17,49 +17,42 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/user_profile_header"
- android:orientation="vertical"
+ android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="?attr/list_item_header_height"
- android:paddingTop="@dimen/contact_browser_list_top_margin"
+ android:paddingTop="@dimen/list_header_extra_top_padding"
android:paddingLeft="?attr/list_item_padding_left"
- android:paddingRight="?attr/list_item_padding_right" >
+ android:paddingRight="?attr/list_item_padding_right"
+ android:background="@drawable/list_section_divider_holo_custom"
+ android:minHeight="?attr/list_item_header_height"
+ >
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ <TextView
+ android:id="@+id/profile_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:text="@string/user_profile_contacts_list_header"
+ android:textStyle="bold"
+ android:ellipsize="end"
+ android:layout_gravity="left|bottom"
+ android:layout_marginBottom="2dip"
+ android:layout_weight="1"
+ android:textAllCaps="true"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:paddingLeft="?attr/list_item_text_indent"
+ android:textColor="@color/people_app_theme_color" />
- <TextView
- android:id="@+id/profile_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:text="@string/user_profile_contacts_list_header"
- android:textStyle="bold"
- android:ellipsize="end"
- android:gravity="left|center_vertical"
- android:layout_weight="1"
- android:textAllCaps="true"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:paddingLeft="?attr/list_item_text_indent"
- android:textColor="@color/people_app_theme_color" />
-
- <TextView
- android:id="@+id/contacts_count"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:ellipsize="end"
- android:layout_gravity="right|center_vertical"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textSize="12sp"
- android:textColor="@color/contact_count_text_color" />
- </LinearLayout>
-
- <View
- android:background="@color/people_app_theme_color"
- android:layout_width="match_parent"
- android:layout_height="?attr/list_item_header_underline_height" />
+ <TextView
+ android:id="@+id/contacts_count"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:layout_gravity="right|bottom"
+ android:layout_marginBottom="2dip"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textSize="12sp"
+ android:textColor="@color/contact_count_text_color" />
</LinearLayout>
diff --git a/res/menu-sw580dp-w720dp/actions.xml b/res/menu-sw580dp-w720dp/people_options.xml
similarity index 88%
rename from res/menu-sw580dp-w720dp/actions.xml
rename to res/menu-sw580dp-w720dp/people_options.xml
index 8735d89..5f939cc 100644
--- a/res/menu-sw580dp-w720dp/actions.xml
+++ b/res/menu-sw580dp-w720dp/people_options.xml
@@ -34,25 +34,21 @@
<item
android:id="@+id/menu_contacts_filter"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:orderInCategory="1"
android:title="@string/menu_contacts_filter" />
<item
android:id="@+id/menu_import_export"
- android:icon="@drawable/ic_menu_import_export_holo_light"
android:orderInCategory="2"
android:title="@string/menu_import_export" />
<item
android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
android:orderInCategory="3"
android:title="@string/menu_accounts" />
<item
android:id="@+id/menu_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:orderInCategory="4"
android:title="@string/menu_settings" />
</menu>
diff --git a/res/menu-sw580dp-w720dp/view_contact.xml b/res/menu-sw580dp-w720dp/view_contact.xml
index 734e6b2..c1f99a8 100644
--- a/res/menu-sw580dp-w720dp/view_contact.xml
+++ b/res/menu-sw580dp-w720dp/view_contact.xml
@@ -24,13 +24,11 @@
<item
android:id="@+id/menu_share"
- android:icon="@drawable/ic_menu_share_holo_light"
android:title="@string/menu_share"
android:alphabeticShortcut="s" />
<item
android:id="@+id/menu_delete"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteContact" />
</menu>
diff --git a/res/menu-sw580dp-w720dp/view_group.xml b/res/menu-sw580dp-w720dp/view_group.xml
index 1348d84..3836c0f 100644
--- a/res/menu-sw580dp-w720dp/view_group.xml
+++ b/res/menu-sw580dp-w720dp/view_group.xml
@@ -24,6 +24,5 @@
<item
android:id="@+id/menu_delete_group"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteGroup" />
</menu>
diff --git a/res/menu-sw580dp/actions.xml b/res/menu-sw580dp/people_options.xml
similarity index 89%
rename from res/menu-sw580dp/actions.xml
rename to res/menu-sw580dp/people_options.xml
index 35a9c0a..c8c114a 100644
--- a/res/menu-sw580dp/actions.xml
+++ b/res/menu-sw580dp/people_options.xml
@@ -37,25 +37,21 @@
-->
<item
android:id="@+id/menu_contacts_filter"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:orderInCategory="1"
android:title="@string/menu_contacts_filter" />
<item
android:id="@+id/menu_import_export"
- android:icon="@drawable/ic_menu_import_export_holo_light"
android:orderInCategory="2"
android:title="@string/menu_import_export" />
<item
android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
android:orderInCategory="3"
android:title="@string/menu_accounts" />
<item
android:id="@+id/menu_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:orderInCategory="4"
android:title="@string/menu_settings" />
</menu>
diff --git a/res/menu-sw580dp/view_contact.xml b/res/menu-sw580dp/view_contact.xml
index 1279601..0f285db 100644
--- a/res/menu-sw580dp/view_contact.xml
+++ b/res/menu-sw580dp/view_contact.xml
@@ -23,13 +23,11 @@
<item
android:id="@+id/menu_share"
- android:icon="@drawable/ic_menu_share_holo_light"
android:title="@string/menu_share"
android:alphabeticShortcut="s" />
<item
android:id="@+id/menu_delete"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteContact" />
</menu>
diff --git a/res/menu-sw580dp/view_group.xml b/res/menu-sw580dp/view_group.xml
index cd52030..d01c167 100644
--- a/res/menu-sw580dp/view_group.xml
+++ b/res/menu-sw580dp/view_group.xml
@@ -23,6 +23,5 @@
<item
android:id="@+id/menu_delete_group"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteGroup" />
</menu>
diff --git a/res/menu/call_details_options.xml b/res/menu/call_details_options.xml
index ed0111b..63ce8f5 100644
--- a/res/menu/call_details_options.xml
+++ b/res/menu/call_details_options.xml
@@ -23,7 +23,6 @@
/>
<item
android:id="@+id/menu_remove_from_call_log"
- android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:title="@string/recentCalls_removeFromRecentList"
android:onClick="onMenuRemoveFromCallLog"
/>
diff --git a/res/menu/call_log_options.xml b/res/menu/call_log_options.xml
index 3d0fb6a..c41f9da 100644
--- a/res/menu/call_log_options.xml
+++ b/res/menu/call_log_options.xml
@@ -29,7 +29,6 @@
<item
android:id="@+id/delete_all"
- android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:title="@string/recentCalls_deleteAll"
android:showAsAction="withText"
android:orderInCategory="1" />
diff --git a/res/menu/dialpad_options.xml b/res/menu/dialpad_options.xml
index 02b1f7f..6dda8fc 100644
--- a/res/menu/dialpad_options.xml
+++ b/res/menu/dialpad_options.xml
@@ -16,20 +16,17 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_add_contacts"
- android:icon="@android:drawable/ic_menu_add"
android:title="@string/recentCalls_addToContact"
android:showAsAction="withText"
android:orderInCategory="1" />
<item
android:id="@+id/menu_2s_pause"
- android:icon="@drawable/ic_menu_2sec_pause"
android:title="@string/add_2sec_pause"
android:showAsAction="withText"
android:orderInCategory="1" />
<item
android:id="@+id/menu_add_wait"
- android:icon="@drawable/ic_menu_wait"
android:title="@string/add_wait"
android:showAsAction="withText"
android:orderInCategory="1" />
@@ -37,7 +34,6 @@
<item
android:id="@+id/menu_call_settings_dialpad"
android:title="@string/call_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:showAsAction="withText"
android:orderInCategory="1" />
</menu>
diff --git a/res/menu/dialtacts_options.xml b/res/menu/dialtacts_options.xml
index d8c79e4..3158598 100644
--- a/res/menu/dialtacts_options.xml
+++ b/res/menu/dialtacts_options.xml
@@ -16,7 +16,7 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/search_on_action_bar"
- android:title="@string/menu_all_contacts"
+ android:title="@string/menu_search"
android:icon="@drawable/ic_dial_action_search"
android:showAsAction="ifRoom" />
@@ -24,7 +24,6 @@
<item
android:id="@+id/menu_call_settings"
android:title="@string/call_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:showAsAction="withText"
android:orderInCategory="2" />
@@ -35,8 +34,9 @@
<item
android:id="@+id/add_contact"
+ android:icon="@drawable/ic_add_contact_holo_dark"
android:title="@string/menu_newContact"
- android:showAsAction="withText" />
+ android:showAsAction="ifRoom" />
<!-- Ugly hack: empty item never clickable.
This is for forcing search icon on left even when there's a single item
diff --git a/res/menu/edit_contact.xml b/res/menu/edit_contact.xml
index 26b89df..93c19dc 100644
--- a/res/menu/edit_contact.xml
+++ b/res/menu/edit_contact.xml
@@ -22,12 +22,10 @@
<item
android:id="@+id/menu_split"
- android:icon="@drawable/ic_menu_split_holo_light"
android:title="@string/menu_splitAggregate" />
<item
android:id="@+id/menu_join"
- android:icon="@drawable/ic_menu_merge_holo_light"
android:title="@string/menu_joinAggregate" />
<item
diff --git a/res/menu/list.xml b/res/menu/list.xml
index 56d92f8..f4a8751 100644
--- a/res/menu/list.xml
+++ b/res/menu/list.xml
@@ -28,17 +28,14 @@
<item
android:id="@+id/menu_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:title="@string/menu_settings" />
<item
android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
android:title="@string/menu_accounts" />
<item
android:id="@+id/menu_import_export"
- android:icon="@drawable/ic_menu_import_export_holo_light"
android:title="@string/menu_import_export" />
</menu>
diff --git a/res/menu/actions.xml b/res/menu/people_options.xml
similarity index 87%
rename from res/menu/actions.xml
rename to res/menu/people_options.xml
index 9067a46..0c82f99 100644
--- a/res/menu/actions.xml
+++ b/res/menu/people_options.xml
@@ -34,21 +34,17 @@
<item
android:id="@+id/menu_contacts_filter"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:title="@string/menu_contacts_filter" />
<item
android:id="@+id/menu_import_export"
- android:icon="@drawable/ic_menu_import_export_holo_light"
android:title="@string/menu_import_export" />
<item
android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
android:title="@string/menu_accounts" />
<item
android:id="@+id/menu_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:title="@string/menu_settings" />
</menu>
diff --git a/res/menu/phone_favorite_options.xml b/res/menu/phone_favorite_options.xml
new file mode 100644
index 0000000..ac67d6e
--- /dev/null
+++ b/res/menu/phone_favorite_options.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:id="@+id/menu_import_export"
+ android:title="@string/menu_import_export" />
+
+ <item
+ android:id="@+id/menu_accounts"
+ android:title="@string/menu_accounts" />
+</menu>
diff --git a/res/menu/view_contact.xml b/res/menu/view_contact.xml
index 2ae4806..6712cb6 100644
--- a/res/menu/view_contact.xml
+++ b/res/menu/view_contact.xml
@@ -17,24 +17,20 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_edit"
- android:icon="@drawable/ic_menu_compose_holo_dark"
android:title="@string/menu_editContact"
android:alphabeticShortcut="e" />
<item
android:id="@+id/menu_share"
- android:icon="@drawable/ic_menu_share_holo_light"
android:title="@string/menu_share"
android:alphabeticShortcut="s" />
<item
android:id="@+id/menu_delete"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteContact" />
<item
android:id="@+id/menu_set_ringtone"
- android:icon="@drawable/ic_menu_mark"
android:title="@string/menu_set_ring_tone" />
<item
diff --git a/res/menu/view_group.xml b/res/menu/view_group.xml
index cd52030..669f401 100644
--- a/res/menu/view_group.xml
+++ b/res/menu/view_group.xml
@@ -17,12 +17,10 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_edit_group"
- android:icon="@drawable/ic_menu_compose_holo_dark"
android:title="@string/menu_editGroup"
android:alphabeticShortcut="e" />
<item
android:id="@+id/menu_delete_group"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteGroup" />
</menu>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 428fed8..8ee0547 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Soek"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Nuwe kontak"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Bekyk kontak"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Bel <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Bel <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Voeg by gunstelinge"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Verwyder van gunstelinge"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Redigeer"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Voorgestelde kontakte"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle kontakte"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kontakte saamgevoeg"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Vee kontak uit?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Stel luitoon op"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Alle oproepe na stempos"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Jy kan nie kontakte uit leesalleen-rekeninge uitvee nie, maar jy kan hulle wel in jou kontaklyste versteek."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Gereeld gekontak"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Gereeld gebel"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Voeg kontak by"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Voeg \"<xliff:g id="EMAIL">%s</xliff:g>\" by kontakte?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"een"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"twee"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Bekyk kontak"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Berging nie beskikbaar nie"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Geen SD-kaart nie"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Geen berging gevind nie."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Geen SD-kaart gevind nie."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Soek vir vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Voer in van SIM-kaart"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Voer in uit berging"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Voer uit na berging"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Voer alle vCard-lêers in"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Soek tans vir vCard-data in berging..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Soek tans vir vCard-data op SD-kaart..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Kon berging nie skandeer nie."</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Kon nie SD-kaart skandeer nie"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Die berging kon nie geskandeer word nie. (Rede: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Die SD-kaart kon nie geskandeer word nie. (Rede: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"T/A-fout"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> sal binnekort uitgevoer word."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"vCard-uitvoerversoek is verwerp. Probeer asseblief later."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontak"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Voer kontakte uit?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Jou kontaklys sal uitgevoer word na die lêer: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Kon nie uitvoer nie"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Die vCard-opsteller het nie behoorlik begin nie."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Kon nie \"<xliff:g id="FILE_NAME">%s</xliff:g>\" open nie: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> van <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontakte"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Kanselleer vCard-invoer"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Kanselleer invoer van <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Kanselleer vCard-uitvoer"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Kanselleer uitvoer van <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Kon nie vCard invoer/uitvoer kanselleer nie"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Name van jou kontakte"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakte om te wys"</string>
<string name="menu_import_export" msgid="26217871113229507">"Voer in/uit"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Voer kontakte in/uit"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Voer kontakte in"</string>
<string name="menu_share" msgid="943789700636542260">"Deel"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Alle kontakte"</string>
<string name="share_via" msgid="563121028023030093">"Deel kontak met"</string>
<string name="share_error" msgid="948429331673358107">"Hierdie kontak kan nie gedeel word nie."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Naam"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"saamgevoeg uit <xliff:g id="COUNT">%0$d</xliff:g> bronne"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Ander"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Voeg kontakte saam"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Voeg die huidige kontak by die gekose kontak saam?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Redigeer gekose kontakte"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Wissel na redigering van die gekose kontak? Inligting wat jy tot dusver ingevoer het, sal gekopieer word."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopieer na My kontakte"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Voeg by My kontakte"</string>
@@ -453,7 +442,7 @@
<string name="toast_making_personal_copy" msgid="288549957278065542">"Skep tans \'n persoonlike kopie..."</string>
<string name="list_filter_all_accounts" msgid="8908683398914322369">"Alle kontakte"</string>
<string name="list_filter_all_starred" msgid="5031734941601931356">"Gester"</string>
- <string name="list_filter_custom" msgid="8910173055702057002">"Gepasmaakte"</string>
+ <string name="list_filter_custom" msgid="8910173055702057002">"Gepasmaak"</string>
<string name="list_filter_customize" msgid="4789963356004169321">"Pasmaak"</string>
<string name="list_filter_phones" msgid="735313795643493365">"Alle kontakte met telefoonnommers"</string>
<string name="list_filter_single" msgid="5871400283515893087">"Kontak"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Laai tans…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Skep \'n nuwe kontak"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Meld aan by \'n rekening"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Voer kontakte van \'n lêer in"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Voer kontakte in"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Skep nuwe groep"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Skep nuwe groep]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Vee groep uit"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 groep"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> groepe"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Stel verstek op"</string>
<string name="clear_default" msgid="7193185801596678067">"Vee verstek uit"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Teks gekopieer"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Ontdoen wysigings"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Verwerp jou veranderings?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Stel my profiel op"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Hou plaaslik"</string>
<string name="add_account" msgid="8201790677994503186">"Voeg rekening by"</string>
<string name="add_new_account" msgid="5748627740680940264">"Voeg nuwe rekening by"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Oproep nie gestuur nie."</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Stemboodskapnommer nie beskikbaar nie"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Oproep nie gestuur nie"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Om stemboodskapdiens op te stel, gaan na Kieslys > Instellings."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Om stemboodskapdiens te bel, skakel eers vliegtuigmodus af."</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index c338395..0ccb1fc 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"ፍለጋ"</string>
<string name="menu_newContact" msgid="1209922412763274638">"አዲስ ዕውቅያ"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"ዕውቂያ ዕይ"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"ጥሪ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"ደውል<xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"ወደ ተወዳጅ አክል"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"ከተወዳጆች አስወግድ"</string>
<string name="menu_editContact" msgid="9042415603857662633">"አርትዕ"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"አስተያየት የተሰጠባቸው እውቅያዎች"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"ሁሉም እውቅያዎች"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"ዕውቂያዎች ተገናኝተዋል"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"ዕውቅያ ሰርዝ?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"የጥሪ ድምፅ አዘጋጅ"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"ሁሉንም ጥሪዎች ወደ ድምፅ መልዕክት"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"ዕውቂያዎችን ከንባብ-ብቻ መለያዎች መሰረዝ አትችልም፤ ነገር ግን በዕውቂያ ዝርዝሮች ውስጥ መደበቅ ትችላለህ።"</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g>ደቂቃዎች <xliff:g id="SECONDS">%s</xliff:g> ሰከንዶች"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"በተደጋጋሚ የሚገናኙ"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"በተደጋጋሚ የተደወለ"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"እውቅያዎች አክል"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"<xliff:g id="EMAIL">%s</xliff:g> ወደ እውቅያዎች ዝርዝር ይታከል"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"አንድ"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"ሁለት"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"ሲቀነስ"</string>
<string name="description_plus_button" msgid="515164827856229880">"ተጨማሪ"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"ዕውቂያ ዕይ"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"ማከማቻ አልተገኘም"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"ምንምSD ካርድ የለም"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"ምንም ማከማቻ አልተገኘም፡፡"</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"ምንም SD ካርድ አልተገኘም፡፡"</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"vCard ፍለጋ"</string>
<string name="import_from_sim" msgid="3859272228033941659">"ከSIM ካርድ አስመጣ"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"ከማከማቻ አስገባ"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"ወደማከማቻ ላክ"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"ሁሉም vCard ፋይሎችን አስገባ"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"በማከማቻ ውስጥ የvCard ውሂብ በመፈለግ ላይ"</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"በSD ካርድ ላይ vCard ፍለጋ"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"ማከማቻን መቃኘት አልተቻለም"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"SD ካርድን መቃኘት አልተቻለም"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"ማከማቻው ሊቀረጽ አልተቻለም:: (ምክንያት: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD ካርዱ ሊቀረጽ አልተቻለም:: (ምክንያት: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O ስህተት"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> ከአፍታ ቆይታ በኋላ ይላካል።"</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"የvCard ላክ ጥየቃ ውድቅ ተደርጓል። እባክህ ትንሽ ቆይተህ ሞክር።"</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"እውቅያ"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"እውቅያዎች ላክ"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"የእውቂያ ዝርዝርህ ወደዚህ ፋይል ይላካል: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"ወደ ውጭ መላክ አልተቻለም"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"የ vCard አቀናባሪው በትክክል አልጀመረም::"</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"\"<xliff:g id="FILE_NAME">%s</xliff:g>\" ፡<xliff:g id="EXACT_REASON">%s</xliff:g> መክፈት አልተቻለም"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> ከ <xliff:g id="TOTAL_NUMBER">%s</xliff:g> እውቂያዎች"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"vCard አስመጣ በመሰረዝ ላይ"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"የ<xliff:g id="FILENAME">%s</xliff:g>ወደ ውስጥ ማስገባት ይተው?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"vCard ላክበመሰረዝላይ"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"የ<xliff:g id="FILENAME">%s</xliff:g> ወደ ውጭ መላክ ይተው?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"vCard ማስመጣት/ወደ ውጪ መላክ መተው አልተቻለም"</string>
<string name="search_settings_description" msgid="2675223022992445813">"የዕውቂያዎችዎ ስሞች"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"ዕውቂያዎች አሳይ"</string>
<string name="menu_import_export" msgid="26217871113229507">"አስመጣ/ላክ"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"ዕውቂያዎች አስመጣ/ላክ"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"እውቅያዎችን ከውጭ አስመጣ"</string>
<string name="menu_share" msgid="943789700636542260">"መጋሪያ"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"ሁሉም እውቅያዎች"</string>
<string name="share_via" msgid="563121028023030093">"ዕውቂያበ በኩል አጋራ"</string>
<string name="share_error" msgid="948429331673358107">"ይህ ዕውቂያ መጋራት አይችልም።"</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"ስም"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"ከ<xliff:g id="COUNT">%0$d</xliff:g> ምንጮች የተዋሃደ"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"ሌላ"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"ዕውቂያዎችን አገናኝ"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"የአሁኑ ዕውቂያ ከተመረጠው ዕውቂያ ጋር ይገናኝ?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"የተመረጡ ዕውቂያዎችን አርትዕ"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"የተመረጠው ዕውቂያ ወደ አርትዕ ይቀየር? እስከ አሁን ያስገቡት መረጃ ይገለበጣል።"</string>
<string name="menu_copyContact" msgid="1573960845106822639">"ወደ ዕውቂያዎቼ ቅዳ"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"ወደ እኔ ዕውቂያዎች አክል"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"በመስቀል ላይ…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"አዲስ ዕውቂያ ፍጠር"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"ወደ መለያ ግባ"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"ከፋይል ዕውቂያዎች አስመጣ"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"እውቅያዎችን ከውጭ አስመጣ"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"አዲስ ቡድን ፍጠር"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[አዲስ ቡድን ፍጠር]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"ቡድን ሰርዝ"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 ቡድን"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g>ቡድኖች"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"ነባሪ አዘጋጅ"</string>
<string name="clear_default" msgid="7193185801596678067">"ነባሪ አጥራ"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"ፅሁፍ ገልብጧል"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"ለውጦች አስወግድ"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">" ለውጦችህ ይወገዱ?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g><xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"መገለጫዬን አዘጋጅ"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"በአካባቢው አቆይ"</string>
<string name="add_account" msgid="8201790677994503186">"መለያ አክል"</string>
<string name="add_new_account" msgid="5748627740680940264">"አዲስ መለያ አክል"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"ጥሪ አልተላከም።"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"የድምጽ መልዕክት ቁጥር አይገኝም::"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"ጥሪ አልተላከም"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ድምጽ መልዕክትን ለማደራጀት ወደ ምናሌ > ቅንጅቶች ሂድ::"</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"የድምጽ መልዕክት ጥሪ ለማድረግ፣ በመጀመሪያ የአውሮፕላን ሁነታን አጥፋ።"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 7e9db74..d69b061 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"بحث"</string>
<string name="menu_newContact" msgid="1209922412763274638">"جهة اتصال جديدة"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"عرض جهة الاتصال"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"الاتصال بـ <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"الاتصال بالرقم <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"إضافة إلى المفضلة"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"إزالة من المفضلة"</string>
<string name="menu_editContact" msgid="9042415603857662633">"تعديل"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"جهات الاتصال المقترحة"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"جميع جهات الاتصال"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"جهات الاتصال المنضمة"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"حذف جهة الاتصال؟"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"تعيين نغمة رنين"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"جميع المكالمات إلى البريد الصوتي"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"لا يمكنك حذف جهات الاتصال من حسابات للقراءة فقط، ولكن يمكنك إخفاؤها في قوائم جهات الاتصال."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"عدد الدقائق:<xliff:g id="MINUTES">%s</xliff:g>، عددالثواني: <xliff:g id="SECONDS">%s</xliff:g>"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"يتم الاتصال بهم بشكل متكرر"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"الأكثر اتصالاً"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"إضافة جهة اتصال"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"هل ترغب في إضافة \"<xliff:g id="EMAIL">%s</xliff:g>\" إلى جهات الاتصال؟"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"واحد"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"اثنان"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"علامة الطرح"</string>
<string name="description_plus_button" msgid="515164827856229880">"علامة زائد"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"عرض جهة الاتصال"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"وحدة التخزين غير متوفرة."</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"لا بطاقة SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"لم يتم العثور على وحدة تخزين."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"لم يتم العثور على بطاقة SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"البحث عن vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"استيراد من بطاقة SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"استيراد من وحدة التخزين"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"تصدير إلى وحدة التخزين"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"استيراد جميع ملفات vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"جارٍ البحث عن بيانات vCard في وحدة التخزين..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"جارٍ البحث عن بيانات vCard على بطاقة SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"تعذر فحص وحدة التخزين"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"تعذر فحص بطاقة SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"تعذر فحص وحدة التخزين. (السبب: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"تعذر فحص بطاقة SD. (السبب: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"خطأ I/O"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"سيتم تصدير <xliff:g id="FILENAME">%s</xliff:g> بعد قليل."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"تم رفض طلب تصدير vCard. أعد المحاولة لاحقًا."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"جهة اتصال"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"تصدير جهات الاتصال؟"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"سيتم تصدير قائمة جهات الاتصال إلى الملف: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"تعذر التصدير"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"لم يبدأ مؤلف vCard بشكل صحيح."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"تعذر فتح \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> من <xliff:g id="TOTAL_NUMBER">%s</xliff:g> من جهات الاتصال"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"إلغاء استيراد ملف vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"هل تريد إلغاء استيراد <xliff:g id="FILENAME">%s</xliff:g>؟"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"إلغاء تصدير ملف vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"هل تريد إلغاء تصدير <xliff:g id="FILENAME">%s</xliff:g>؟"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"تعذر إلغاء استيراد/تصدير vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"أسماء جهات الاتصال"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"جهات الاتصال التي يتم عرضها"</string>
<string name="menu_import_export" msgid="26217871113229507">"استيراد/تصدير"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"استيراد/تصدير جهات اتصال"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"استيراد جهات الاتصال"</string>
<string name="menu_share" msgid="943789700636542260">"مشاركة"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"جميع جهات الاتصال"</string>
<string name="share_via" msgid="563121028023030093">"مشاركة جهة الاتصال عبر"</string>
<string name="share_error" msgid="948429331673358107">"لا يمكن مشاركة جهة الاتصال هذه."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"الاسم"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"تم دمجها من <xliff:g id="COUNT">%0$d</xliff:g> من المصادر"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"غير ذلك"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"ضم جهات الاتصال"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"هل تريد ضم جهة الاتصال الحالية إلى جهة الاتصال المحددة؟"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"تعديل جهات الاتصال المحددة"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"هل تريد التبديل إلى تعديل جهة الاتصال المحددة؟ سيتم نسخ المعلومات التي أدخلتها حتى الآن."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"نسخ إلى جهات الاتصال الخاصة بي"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"إضافة إلى \"جهات الاتصال الخاصة بي\""</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"جارٍ التحميل…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"إنشاء جهة اتصال جديدة"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"تسجيل الدخول إلى حساب"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"استيراد جهات الاتصال من ملف"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"استيراد جهات الاتصال"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"إنشاء مجموعة جديدة"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[إنشاء مجموعة جديدة]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"حذف المجموعة"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"مجموعة واحدة"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> من المجموعات"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"تعيين كافتراضي"</string>
<string name="clear_default" msgid="7193185801596678067">"محو الإعدادات الافتراضية"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"تم نسخ النص"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"إلغاء التغييرات"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"هل تريد تجاهل التغييرات؟"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"إعداد الملف الشخصي"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"الاحتفاظ بها محليًا"</string>
<string name="add_account" msgid="8201790677994503186">"إضافة حساب"</string>
<string name="add_new_account" msgid="5748627740680940264">"إضافة حساب جديد"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"لم يتم إرسال المكالمة"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"رقم البريد الصوتي غير متاح"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"لم يتم إرسال المكالمة"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"لإعداد البريد الصوتي، انتقل إلى القائمة > الإعدادات."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"للاتصال بالبريد الصوتي، يجب أولاً إيقاف وضع الطائرة."</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 6441565..48e2d00 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Пошук"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Новы кантакт"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Прагледзець кантакт"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Выклік карыст. <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Выклікаць <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Дадаць да любімых"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Выдаліць з Выбранага"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Рэдагаваць"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Прапанаваныя кантакты"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Усе кантакты"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Кантакты аб\'яднаныя"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Выдаліць кантакт?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Устал. рынгтон"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Усе выклікі на гал. пошту"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Вы не можаце выдаляць кантакты з улiковых запiсаў толькі для чытання, але вы можаце хаваць іх у спісах кантактаў."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> хв. <xliff:g id="SECONDS">%s</xliff:g> с."</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Частая сувязь"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Частыя званкi"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Дадаць кантакт"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Дадаць адрас \"<xliff:g id="EMAIL">%s</xliff:g>\" у кантакты?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"адзін"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"два"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"мінус"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Прагледзець кантакт"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Назапашвальнік недаступны"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Няма SD-карты"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Назапашвальнiк не знойдзены."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"SD-карта не знойдзена"</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Пошук файла vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Імпарт з SIM-карты"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Імпарт з назапашвальніка"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Экспарт на назапашвальнік"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Імпарт усіх файлаў vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Пошук дадзеных vCard на назапашвальніку..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Пошук дадзеных vCard на SD-карце..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Немагчыма сканаваць сховішча"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Немагчыма сканаваць SD-карту"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Не атрымалася праверыць назапашвальнiк. (Прычына: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Не атрымалася праверыць SD-карту. (Прычына: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Памылка ўводу/вываду"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Файл <xliff:g id="FILENAME">%s</xliff:g> будзе экспартаваны ў бліжэйшы час."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Запыт экспарту vCard адхілены. Паспрабуйце пазней."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"кантакт"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Экспартаваць кантакты?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Спіс кантактаў будзе экспартавацца ў файл <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Не атрымалася экспартаваць"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Памылка запуску складальнiка файлаў vCard."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Немагчыма адкрыць файл \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> з <xliff:g id="TOTAL_NUMBER">%s</xliff:g> кантактаў"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Адмена імпарту vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Адмянiць iмпарт файла <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Адмена экспарту vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Адмянiць экспарт файла <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Немагчыма адмяніць імпарт/экспарт vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Імёны вашых кантактаў"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Паказаць кантакты"</string>
<string name="menu_import_export" msgid="26217871113229507">"Імпарт/экспарт"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Імпарт/экспарт кантактаў"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Імпартаваць кантакты"</string>
<string name="menu_share" msgid="943789700636542260">"Апублікаваць"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Усе кантакты"</string>
<string name="share_via" msgid="563121028023030093">"Апублікаваць кантакт з дапамогай"</string>
<string name="share_error" msgid="948429331673358107">"Нельга падзялiцца гэтым кантактам."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Імя"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"аб\'яднаныя з розных крыніц (<xliff:g id="COUNT">%0$d</xliff:g>)"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Іншае"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Аб\'яднаць кантакты"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Аб\'яднаць бягучы кантакт з выбраным кантактам?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Рэдагаваць выбраныя кантакты"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Пераключыцца ў рэжым рэдагавання выбранага кантакту? Інфармацыя, якую вы ўвялі да гэтага часу, будзе скапіявана."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Капіяваць у мае кантакты"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Дадаць да Маіх кантактаў"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Загрузка..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Стварыць новы кантакт"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Увайсці ва ўліковы запіс"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Імпартаваць кантакты з файла?"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Імпартаваць кантакты"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Стварыць новую групу"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Стварыць новую групу]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Выдаліць групу"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 група"</item>
<item quantity="other" msgid="1276758425904917367">"Груп: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Усталяваць па змаўчанні"</string>
<string name="clear_default" msgid="7193185801596678067">"Скінуць налады па змаўчанні"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Тэкст скапіяваны"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Скасаваць змены"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Адмяніць змены?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g><xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Наладзіць мой профіль"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Захоўваць лакальна"</string>
<string name="add_account" msgid="8201790677994503186">"Дадаць уліковы запіс"</string>
<string name="add_new_account" msgid="5748627740680940264">"Дадаць новы ўліковы запіс"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Выклік не зроблены"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Нумар галасавой пошты недаступны"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Выклік не зроблены"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Каб наладзіць галасавую пошту, націсніце \"Меню\" i перайдзiце ў налады."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Каб зрабiць выклік галасавой пошты, спачатку адключыце рэжым палёту."</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index ab14f83..0ee7060 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Търсене"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Нов контакт"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Преглед на контакт"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Обаждане на <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Обаждане на <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Добавяне към предпочитани"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Премахване от любими"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Редактиране"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Предлагани контакти"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Всички контакти"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Контактите са слети"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Да се изтрие ли контактът?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Мелодия: Задав."</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Всички обаждания до гл. поща"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Не можете да изтриете контакти от профили само за четене, но можете да ги скриете в списъците си с контакти."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> мин <xliff:g id="SECONDS">%s</xliff:g> сек"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Често търсени"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Чести обаждания"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Добавяне на контакт"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Да се добави ли „<xliff:g id="EMAIL">%s</xliff:g>“ към контакти?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"едно"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"две"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"минус"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Преглед на контакта"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Няма хранилище"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Няма SD карта"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Не бе намерено хранилище."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Не бе намерена SD карта."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Търсене на vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Импортиране от SIM карта"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Импорт. от хранилището"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Експорт. в хранилището"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Импортиране на всички vCard файлове"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Търсят се данни за vCard в хранилището..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Търсят се данни за vCard в SD картата..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Хранилището не можа да бъде сканирано"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"SD картата не можа да бъде сканирана"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Хранилището не можа да бъде сканирано. (Причина: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD картата не можа да бъде сканирана. (Причина: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O грешка"</string>
@@ -252,7 +245,8 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> ще се експортира скоро."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Заявката за експортиране на vCard бе отхвърлена. Опитайте отново по-късно."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"контакт"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <!-- no translation found for percentage (1887004062152632812) -->
+ <skip />
<string name="confirm_export_title" msgid="6834385377255286349">"Да се експортират ли контактите?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Списъкът ви с контакти ще се експортира във файла: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Не се експортира"</string>
@@ -273,9 +267,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Създателят на vCard не се стартира правилно."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"„<xliff:g id="FILE_NAME">%s</xliff:g>“ не можа да се отвори: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> от <xliff:g id="TOTAL_NUMBER">%s</xliff:g> контакта"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Анулиране на импортирането на vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Да се анулира ли импортирането на <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Анулиране на експортирането на vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Да се анулира ли експортирането на <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Импорт./експорт. не можа да се анулира"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Имена на контактите ви"</string>
@@ -291,8 +283,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Контакти за показване"</string>
<string name="menu_import_export" msgid="26217871113229507">"Импортиране/Експортиране"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Импортиране/Експортиране на контакти"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Импортиране на контактите"</string>
<string name="menu_share" msgid="943789700636542260">"Споделяне"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Всички контакти"</string>
<string name="share_via" msgid="563121028023030093">"Споделяне на контакт чрез"</string>
<string name="share_error" msgid="948429331673358107">"Този контакт не може да бъде споделен."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Име"</string>
@@ -441,9 +433,7 @@
<item quantity="other" msgid="425683718017380845">"обединено от <xliff:g id="COUNT">%0$d</xliff:g> източник/а"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Други"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Сливане на контакти"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Да се слее ли текущият контакт с избрания?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Редактиране на избраните контакти"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Да се превключи ли към редактиране на избрания контакт? Въведената досега информация ще бъде копирана."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Копиране в моите контакти"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Добавяне в „Моите контакти“"</string>
@@ -475,10 +465,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Зарежда се…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Създаване на нов контакт"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Вход в профил"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Импортиране на контакти от файл"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Импортиране на контактите"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Създаване на нова група"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Създаване на нова група]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Изтриване на групата"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 група"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> групи"</item>
@@ -497,7 +486,6 @@
<string name="set_default" msgid="4417505153468300351">"Задаване като стандартна настройка"</string>
<string name="clear_default" msgid="7193185801596678067">"Изчистване на стандартната настройка"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Текстът бе копиран"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Отхвърляне на промените"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Да се отхвърлят ли направените от вас промени?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Настройка на потребителския ми профил"</string>
@@ -561,7 +549,7 @@
<string name="keep_local" msgid="1258761699192993322">"Съхраняване локално"</string>
<string name="add_account" msgid="8201790677994503186">"Добавяне на профил"</string>
<string name="add_new_account" msgid="5748627740680940264">"Добавяне на нов профил"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Обаждането не е извършено"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Номерът за гласова поща не е налице"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Обаждането не е извършено"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"За да настроите гласовата поща, отворете „Меню“ > „Настройки“."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"За да чуете гласовата си поща, първо изключете самолетния режим."</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 59127b0..825f4c4 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Cerca"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Contacte nou"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Visualitza el contacte"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Truca a <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Truca al <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Afegeix als preferits"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Elimina dels preferits"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Edita"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contactes suggerits"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tots els contactes"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Contactes units"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Vols suprimir el contacte?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Est. to trucada"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Trucades a la bústia de veu"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"No pots suprimir cap contacte dels comptes de només lectura, però pots amagar-los a les llistes de contactes."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Contactats sovint"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Trucats sovint"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Addició d\'un contacte"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Voleu afegir \"<xliff:g id="EMAIL">%s</xliff:g>\" als contactes?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"un"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dos"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"menys"</string>
<string name="description_plus_button" msgid="515164827856229880">"més"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Mostra el contacte"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Emmagatzematge no dispon."</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"No hi ha cap targeta SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"No s\'ha trobat emmagatzematge."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"No s\'ha trobat cap targeta SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"S\'està cercant la vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importa des de la targeta SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importa de l\'emmagatzematge"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exporta a emmagatzematge"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importa tots els fitxers vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"S\'estan cercant dades de vCard a l\'emmagatzematge..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"S\'estan cercant les dades de vCard a la targeta SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"No s\'ha pogut explorar l\'emmagatzematge"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"No s\'ha pogut explorar la targeta SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"No s\'ha pogut explorar l\'emmagatzematge. (Motiu: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"No s\'ha pogut explorar la targeta SD. (Motiu: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Error d\'E/S"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> s\'exportarà en breu."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"S\'ha rebutjat la sol·licitud per exportar vCard. Torna-ho a provar més tard."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contacte"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Exportació contactes"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"La llista de contactes s\'exportarà al fitxer: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Error en exportar"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"No s\'ha iniciat correctament el creador de vCard."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"No s\'ha pogut obrir \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> de <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contactes"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Cancel·lació de la importació de la vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Vols cancel·lar la importació de: <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Cancel·lació de l\'exportació de la vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Vols cancel·lar l\'exportació de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"No es pot cancel·lar la imp./exp. vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Noms dels contactes"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Contactes per mostrar"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importa/exporta"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Importació/exportació de contactes"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importació de contactes"</string>
<string name="menu_share" msgid="943789700636542260">"Comparteix"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Tots els contactes"</string>
<string name="share_via" msgid="563121028023030093">"Comparteix el contacte mitjançant"</string>
<string name="share_error" msgid="948429331673358107">"No es pot compartir aquest contacte."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nom"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"combinat de <xliff:g id="COUNT">%0$d</xliff:g> fonts"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Altres"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Ajunta els contactes"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Vols ajuntar el contacte actual amb el contacte seleccionat?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Edita els contactes seleccionats"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Vols canviar per editar el contacte seleccionat? Es copiarà la informació que hagis introduït fins ara."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Copia a Els meus contactes"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Afegeix a Els meus contactes"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"S\'està carregant…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Crea un contacte nou"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Inicia la sessió a un compte"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importa contactes d\'un fitxer"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importa contactes"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Creació d\'un grup nou"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Crea un grup nou]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Supressió d\'un grup"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"Un grup"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grups"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Predeterminat"</string>
<string name="clear_default" msgid="7193185801596678067">"Esborra els valors predeterminats"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Text copiat"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Descarta els canvis"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Vols descartar els canvis?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Configura el meu perfil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Conserva localment"</string>
<string name="add_account" msgid="8201790677994503186">"Afegeix un compte"</string>
<string name="add_new_account" msgid="5748627740680940264">"Afegeix un compte nou"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"No s\'ha enviat la trucada"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Número de la bústia de veu no disponible"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"No s\'ha enviat la trucada"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Per configurar la bústia de veu, vés a Menú > Configuració."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Per trucar al correu de veu, primer has de desactivar el mode d\'avió."</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 3846714..30e9381 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Hledat"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Nový kontakt"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Zobrazit kontakt"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Volat kontakt <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Zavolat na číslo <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Přidat k oblíbeným položkám"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Odebrat z oblíbených položek"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Upravit"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Navrhované kontakty"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Všechny kontakty"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kontakty byly spojeny"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Smazat kontakt?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Nast. vyzvánění"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Všechny hovory do hlas. schr."</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Z účtů pouze pro čtení není možné kontakty mazat, můžete je však ve svých seznamech kontaktů skrýt."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Často používané kontakty"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Často volané"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Přidat kontakt"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Chcete přidat „<xliff:g id="EMAIL">%s</xliff:g>“ do kontaktů?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"jedna"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dvě"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"mínus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Zobrazit kontakt"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Úložiště je nedostupné"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Žádná karta SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Nebylo nalezeno žádné úložiště."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Nebyla nalezena žádná karta SD"</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Vyhledávání karty vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importovat z karty SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importovat z úložiště"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exportovat do úložiště"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importovat všechny soubory vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Vyhledávání dat souboru vCard v úložišti..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Vyhledávání dat souboru vCard na kartě SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Úložiště se nepodařilo prohledat"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Kartu SD se nepodařilo prohledat"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Nepodařilo se naskenovat úložiště. (Důvod: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Nepodařilo se naskenovat kartu SD. (Důvod: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Chyba I/O"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Soubor <xliff:g id="FILENAME">%s</xliff:g> bude za okamžik exportován."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Požadavek na export souborů vCard byl zamítnut. Zkuste to prosím později."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontakt"</string>
- <string name="percentage" msgid="34897865327092209">"%s %%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Exportovat kontakty?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Seznam kontaktů bude exportován do souboru <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Export se nezdařil"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Editor souboru vCard nebyl správně spuštěn."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Soubor <xliff:g id="FILE_NAME">%s</xliff:g> nelze otevřít: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> z <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontaktů"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Rušení importu souboru vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Zrušit import souboru <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Rušení exportu souboru vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Zrušit export souboru <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Import/export vizitky vCard nelze zrušit"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Jména vašich kontaktů"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakty k zobrazení"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importovat/Exportovat"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Importovat nebo exportovat kontakty"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importovat kontakty"</string>
<string name="menu_share" msgid="943789700636542260">"Sdílet"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Všechny kontakty"</string>
<string name="share_via" msgid="563121028023030093">"Sdílet kontakt pomocí"</string>
<string name="share_error" msgid="948429331673358107">"Tento kontakt nelze sdílet."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Jméno"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"sloučeno ze <xliff:g id="COUNT">%0$d</xliff:g> zdrojů"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Ostatní"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Spojit kontakty"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Spojit aktuální kontakt s vybraným kontaktem?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Upravit vybrané kontakty"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Přepnout do režimu úpravy vybraného kontaktu? Doposud zadané informace budou zkopírovány."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Zkopírovat do kontaktů"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Přidat do skupiny Moje kontakty"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Načítá se..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Vytvořit nový kontakt"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Přihlásit se do účtu"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importovat kontakty ze souboru"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importovat kontakty"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Vytvořit novou skupinu"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Vytvořit novou skupinu]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Smazat skupinu"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 skupina"</item>
<item quantity="other" msgid="1276758425904917367">"Skupiny: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Výchozí nastavení"</string>
<string name="clear_default" msgid="7193185801596678067">"Vymazat výchozí nastavení"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Text zkopírován"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Zrušit změny"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Zrušit změny?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Nastavit profil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Zachovat jako místní"</string>
<string name="add_account" msgid="8201790677994503186">"Přidat účet"</string>
<string name="add_new_account" msgid="5748627740680940264">"Přidat nový účet"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Hovor nebyl odeslán"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Číslo hlasové schránky není dostupné"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Hovor nebyl odeslán"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Chcete-li nastavit hlasovou schránku, přejděte do části Menu > Nastavení."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Chcete-li volat hlasovou schránku, nejdříve vypněte režim V letadle."</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 85bdd00..c068de3 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Søg"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Ny kontakt"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Vis kontakt"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Ring til <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Ring til <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Føj til favoritter"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Fjern fra favoritter"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Rediger"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Foreslåede kontakter"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle kontakter"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Tilføjede kontakter"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Slet kontaktperson?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Indstil ringetone"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Alle opkald til telefonsvareren"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Du kan ikke slette kontaktpersoner fra skrivebeskyttede konti, men du kan skjule dem på listerne over dine kontaktpersoner."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Jævnligt kontaktet"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Ofte ringet til"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Tilføj kontakt"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Føj \"<xliff:g id="EMAIL">%s</xliff:g>\" til kontaktpersoner?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"et"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"to"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Vis kontaktperson"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Lager ikke tilgængeligt"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Der er intet SD-kort"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Intet lager blev fundet."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Ingen SD-kort fundet."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Søger efter vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importer fra SIM-kort"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importer fra lager"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Eksporter til lager"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importer alle VCard-filer"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Søger efter vCard-data på lager..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Søger efter vCard-data på SD-kortet..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Lagring kunne ikke scannes"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"SD-kortet kunne ikke scannes"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Lageret kunne ikke scannes. (Årsag: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD-kortet kunne ikke scannes. (Årsag: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O-fejl"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> eksporteres om et øjeblik."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Anmodningen om eksport af vCard blev afvist. Prøv igen senere."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontakt"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Eksporter kontakter?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Listen over dine kontaktpersoner eksporteres til filen: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Eksport ikke mulig"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Oprettelsen af vCard startede ikke korrekt."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"\"<xliff:g id="FILE_NAME">%s</xliff:g>\" kunne ikke åbnes: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> af <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontakter"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Annullerer import af vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Vil du annullere import af <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Annullerer eksport af vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Vil du annullere eksport af <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Import/eksport af vCard kunne ikke annulleres"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Navne på dine kontakter"</string>
@@ -291,14 +282,14 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakter, der skal vises"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importer og eksporter"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Import/eksport kontakter"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importer kontaktpersoner"</string>
<string name="menu_share" msgid="943789700636542260">"Del"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Alle kontaktpersoner"</string>
<string name="share_via" msgid="563121028023030093">"Del kontakt via"</string>
<string name="share_error" msgid="948429331673358107">"Denne kontaktperson kan ikke deles."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Navn"</string>
<string name="nicknameLabelsGroup" msgid="2891682101053358010">"Kaldenavn"</string>
<string name="organizationLabelsGroup" msgid="2478611760751832035">"Organisation"</string>
- <string name="websiteLabelsGroup" msgid="4202998982804009261">"Websted"</string>
+ <string name="websiteLabelsGroup" msgid="4202998982804009261">"Website"</string>
<string name="eventLabelsGroup" msgid="3695433812142818803">"Begivenheder"</string>
<string name="relationLabelsGroup" msgid="1854373894284572781">"Forhold"</string>
<string name="groupsLabel" msgid="8573535366319059326">"Grupper"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"flettet fra <xliff:g id="COUNT">%0$d</xliff:g> kilder"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Andre"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Saml kontaktpersoner"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Forbind den aktuelle kontaktperson med den valgte kontaktperson?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Rediger valgte kontaktpersoner"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Vil du redigere den valgte kontaktperson? Dine indtastninger kopieres."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopier til Mine kontaktpersoner"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Føj til mine kontaktpersoner"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Indlæser…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Opret ny kontakt"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Log ind på en konto"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importer kontrakter fra en fil"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importer kontaktpersoner"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Opret en ny gruppe"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Opret en ny gruppe]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Slet gruppe"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 gruppe"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grupper"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Indstil standard"</string>
<string name="clear_default" msgid="7193185801596678067">"Ryd standarder"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Kopieret tekst"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Kasser ændringer"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Skal ændringerne slettes?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Opret min profil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Gem lokalt"</string>
<string name="add_account" msgid="8201790677994503186">"Tilføj konto"</string>
<string name="add_new_account" msgid="5748627740680940264">"Tilføj ny konto"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Opkaldet blev ikke sendt"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Nummer til telefonsvarer utilgængeligt"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Opkaldet blev ikke sendt"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Hvis du vil konfigurere telefonsvareren, skal du gå til Menu > Indstillinger."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Hvis du vil ringe til telefonsvareren, skal du først slå Flytilstand fra."</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 704ccae..fe9fb45 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Suche"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Neuer Kontakt"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Kontakt anzeigen"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"<xliff:g id="NAME">%s</xliff:g> anrufen"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"<xliff:g id="NUMBER">%s</xliff:g> wählen"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Zu Favoriten hinzufügen"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Aus Favoriten entfernen"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Bearbeiten"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Vorgeschlagene Kontakte"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle Kontakte"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kontakte wurden verknüpft."</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Kontakt löschen?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Klingeltonwahl"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Alle Anrufe an Mailbox"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Sie können keine Kontakte aus schreibgeschützten Konten löschen. Sie können sie aber in Ihren Kontaktlisten ausblenden."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> Minuten, <xliff:g id="SECONDS">%s</xliff:g> Sekunden"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Häufig kontaktiert"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Häufig angerufen"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Kontakt hinzufügen"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" zu den Kontakten hinzufügen?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"eins"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"zwei"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Kontakt anzeigen"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Kein Speicher verfügbar"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Keine SD-Karte"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Kein Speicher gefunden"</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Keine SD-Karte gefunden"</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"vCard wird gesucht."</string>
<string name="import_from_sim" msgid="3859272228033941659">"Von SIM-Karte importieren"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Aus Speicher importieren"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"In Speicher exportieren"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Alle vCard-Dateien importieren"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Suche nach vCard-Daten im Speicher..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Suche nach vCard-Daten auf der SD-Karte..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Scannen des Speichers nicht möglich"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Scannen der SD-Karte nicht möglich"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Der Speicher konnte nicht gelesen werden. (Grund: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Die SD-Karte konnte nicht gelesen werden. (Grund: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"E/A-Fehler"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> wird demnächst exportiert."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Die vCard-Exportanfrage wurde abgelehnt. Bitte versuchen Sie es später erneut."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"Kontakt"</string>
- <string name="percentage" msgid="34897865327092209">"%s %%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Kontakte exportieren?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Ihre Kontaktliste wird in die Datei \"<xliff:g id="VCARD_FILENAME">%s</xliff:g>\" exportiert."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Export nicht möglich"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Das Programm zum Erstellen der vCard wurde nicht richtig gestartet."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"\"<xliff:g id="FILE_NAME">%s</xliff:g>\" konnte nicht geöffnet werden: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> von <xliff:g id="TOTAL_NUMBER">%s</xliff:g> Kontakten"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"vCard-Import wird abgebrochen."</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Import von <xliff:g id="FILENAME">%s</xliff:g> abbrechen?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"vCard-Export wird abgebrochen."</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Export von <xliff:g id="FILENAME">%s</xliff:g> abbrechen?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"vCard-Import/-Export nicht abgebrochen"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Namen meiner Kontakte"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakte zum Anzeigen"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importieren/Exportieren"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Import/Export von Kontakten"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Kontakte importieren"</string>
<string name="menu_share" msgid="943789700636542260">"Teilen"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Alle Kontakte"</string>
<string name="share_via" msgid="563121028023030093">"Kontakt teilen über"</string>
<string name="share_error" msgid="948429331673358107">"Dieser Kontakt kann nicht geteilt werden."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Name"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"aus <xliff:g id="COUNT">%0$d</xliff:g> Quellen zusammengeführt"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Sonstige"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Kontakte zusammenführen"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Aktuellen Kontakt mit ausgewähltem Kontakt zusammenführen?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Ausgewählte Kontakte bearbeiten"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Zur Bearbeitung des ausgewählten Kontakts wechseln? Die bisher eingegebenen Informationen werden kopiert."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"In meine Kontakte kopieren"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Zu meinen Kontakten hinzufügen"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Wird geladen…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Neuen Kontakt erstellen"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"In einem Konto anmelden"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Kontakte aus einer Datei importieren"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Kontakte importieren"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Neue Gruppe erstellen"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Neue Gruppe erstellen]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Gruppe löschen"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 Gruppe"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> Gruppen"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Als Standard festlegen"</string>
<string name="clear_default" msgid="7193185801596678067">"Als Standard löschen"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Text kopiert"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Änderungen verwerfen"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Sollen die Änderungen verworfen werden?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g><xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Mein Profil einrichten"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Lokal speichern"</string>
<string name="add_account" msgid="8201790677994503186">"Konto hinzufügen"</string>
<string name="add_new_account" msgid="5748627740680940264">"Neues Konto hinzufügen"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Anruf nicht verbunden"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Mailbox-Nummer nicht verfügbar"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Anruf nicht verbunden"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Konfigurieren Sie Ihre Mailbox unter \"Menü\" > \"Einstellungen\"."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Deaktivieren Sie zunächst den Flugmodus, um die Mailbox anzurufen."</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 15b7b91..620429c 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Αναζήτηση"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Νέα επαφή"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Προβολή επαφής"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Κλήση <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Κλήση του αριθμού <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Προσθήκη στα αγαπημένα"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Κατάργηση από τα αγαπημένα"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Επεξεργασία"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Προτεινόμενες επαφές"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Όλες οι επαφές"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Οι επαφές συνδέθηκαν"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Διαγραφή επαφής;"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Ήχος κλήσης"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Κλήσεις στον τηλεφωνητή"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Δεν μπορείτε να διαγράψετε επαφές από λογαριασμούς οι οποίοι προορίζονται μόνο για ανάγνωση, αλλά μπορείτε να τις αποκρύψετε στις λίστες επαφών σας."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> λεπτά <xliff:g id="SECONDS">%s</xliff:g> δευτερόλεπτα"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Επαφές που έχετε συχνή επικοινωνία"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Συχνές κλήσεις"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Προσθήκη επαφής"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Προσθήκη του \"<xliff:g id="EMAIL">%s</xliff:g>\" στις επαφές?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"ένα"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"δύο"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"μείον"</string>
<string name="description_plus_button" msgid="515164827856229880">"συν"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Προβολή επαφής"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Μη διαθέσιμος χώρος αποθ."</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Δεν υπάρχει κάρτα SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Δεν βρέθηκε χώρος αποθήκευσης."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Δεν βρέθηκε κάρτα SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Αναζήτηση κάρτας vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Εισαγωγή από κάρτα SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Εισαγωγή από τον χώρο αποθ."</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Εξαγωγή στον χώρο αποθ."</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Εισαγωγή όλων των αρχείων vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Αναζήτηση δεδομένων vCard στον χώρο αποθήκευσης..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Αναζήτηση για δεδομένα vCard στην κάρτα SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Δεν ήταν δυνατή η σάρωση του χώρου αποθήκευσης"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Δεν ήταν δυνατή η σάρωση της κάρτας SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Δεν ήταν δυνατή η σάρωση του χώρου αποθήκευσης. (Αιτία: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Δεν ήταν δυνατή η σάρωση της κάρτας SD. (Αιτία: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Σφάλμα I/O"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Η <xliff:g id="FILENAME">%s</xliff:g> θα εξαχθεί σύντομα."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Το αίτημα εξαγωγής vCard απορρίφθηκε. Δοκιμάστε ξανά αργότερα."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"επαφή"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Εξαγωγή επαφών;"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Η λίστα επαφών σας θα εξαχθεί στο αρχείο: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Αδυναμία εξαγωγής"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Η έναρξη της vCard δεν ήταν σωστή."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Δεν ήταν δυνατό το άνοιγμα του αρχείου \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> από <xliff:g id="TOTAL_NUMBER">%s</xliff:g> επαφές"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Ακύρωση εισαγωγής της vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Να ακυρωθεί η εισαγωγή του αρχείου <xliff:g id="FILENAME">%s</xliff:g>;"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Ακύρωση εξαγωγής της vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Να ακυρωθεί η εξαγωγή του αρχείου <xliff:g id="FILENAME">%s</xliff:g>;"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Αδ.ακύρ.εισαγ./εξαγ.vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Ονόματα ων επαφών σας"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Επαφές για εμφάνιση"</string>
<string name="menu_import_export" msgid="26217871113229507">"Εισαγωγή/Εξαγωγή"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Εισαγωγή/Εξαγωγή επαφών"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Εισαγωγή επαφών"</string>
<string name="menu_share" msgid="943789700636542260">"Κοινή χρήση"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Όλες οι επαφές"</string>
<string name="share_via" msgid="563121028023030093">"Κοινή χρήση μέσω"</string>
<string name="share_error" msgid="948429331673358107">"Δεν είναι δυνατή η κοινή χρήση αυτής της επαφής."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Όνομα"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"συγχώνευση από <xliff:g id="COUNT">%0$d</xliff:g> προελεύσεις"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Άλλο"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Ένωση επαφών"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Να γίνει ένωση της τρέχουσας επαφής με την επιλεγμένη επαφή;"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Επεξεργασία επιλεγμένων επαφών"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Να γίνει μετάβαση σε επεξεργασία της επιλεγμένης επαφής; Θα γίνει αντιγραφή των στοιχείων που έχετε εισαγάγει μέχρι τώρα."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Αντιγραφή στις Επαφές μου"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Προσθήκη στις Επαφές μου"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Φόρτωση…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Δημιουργία νέας επαφής"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Σύνδεση σε έναν λογαριασμό"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Εισαγωγή επαφών από ένα αρχείο"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Εισαγωγή επαφών"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Δημιουργία νέας ομάδας"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Δημιουργία νέας ομάδας]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Διαγραφή ομάδας"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 ομάδα"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> ομάδες"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Ορισμός ως προεπιλογή"</string>
<string name="clear_default" msgid="7193185801596678067">"Εκκαθάριση προεπιλεγμένων"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Το κείμενο αντιγράφηκε"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Απόρριψη αλλαγών"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Να απορριφθούν οι αλλαγές σας;"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Ρύθμιση του προφίλ μου"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Αποθήκευση τοπικά"</string>
<string name="add_account" msgid="8201790677994503186">"Προσθήκη λογαριασμού"</string>
<string name="add_new_account" msgid="5748627740680940264">"Προσθήκη νέου λογαριασμού"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Η κλήση δεν πραγματοποιήθηκε."</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Μη διαθέσιμος αριθμός αυτόμ. τηλεφωνητή"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Η κλήση δεν πραγματοποιήθηκε"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Για τη r;yumish του αυτόματου τηλεφωνητή, μεταβείτε στο στοιχείο Μενού > Ρυθμίσεις."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Για κλήση αυτόματου τηλεφωνητή, πρώτα απενεργοποιήστε τη λειτουργία πτήσης."</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 72a67b3..f24853d 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Search"</string>
<string name="menu_newContact" msgid="1209922412763274638">"New contact"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"View contact"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Call <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Call <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Add to favourites"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Remove from favourites"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Edit"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Suggested Contacts"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"All contacts"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Contacts joined"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Delete contact?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Set ringtone"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"All calls to voicemail"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"You can\'t delete contacts from read-only accounts, but you can hide them in your contacts lists."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> mins <xliff:g id="SECONDS">%s</xliff:g> secs"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Frequently contacted"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Frequently called"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Add contact"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Add \"<xliff:g id="EMAIL">%s</xliff:g>\" to contacts?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"one"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"two"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"View contact"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Storage unavailable"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"No SD card"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"No storage was found."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"No SD card was found."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Searching for vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Import from SIM card"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Import from storage"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Export to storage"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Import all vCard files"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Searching for vCard data in storage…"</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Searching for vCard data on SD card"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Couldn\'t scan storage"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Couldn\'t scan SD card"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"The storage couldn\'t be scanned. (Reason: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"The SD card couldn\'t be scanned. (Reason: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O error"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> will be exported shortly."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"vCard export request was rejected. Try again later."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contact"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Export contacts?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Your contact list will be exported to file: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Couldn\'t export"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"The vCard composer didn\'t start properly."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Couldn\'t open \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> of <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contacts"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Cancelling vCard import"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Cancel import of <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Cancelling vCard export"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Cancel export of <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Couldn\'t cancel vCard import/export"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Names of your contacts"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Contacts to display"</string>
<string name="menu_import_export" msgid="26217871113229507">"Import/export"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Import/export contacts"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Import contacts"</string>
<string name="menu_share" msgid="943789700636542260">"Share"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"All contacts"</string>
<string name="share_via" msgid="563121028023030093">"Share contact via"</string>
<string name="share_error" msgid="948429331673358107">"This contact can\'t be shared."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Name"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"merged from <xliff:g id="COUNT">%0$d</xliff:g> sources"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Other"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Join contacts"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Join the current contact with the selected contact?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Edit selected contacts"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Switch to editing the selected contact? Information that you\'ve entered so far will be copied."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Copy to My Contacts"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Add to My Contacts"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Loading…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Create a new contact"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Sign in to an account"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Import contacts from a file"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Import contacts"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Create new group"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Create new group]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Delete group"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 group"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> groups"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Set default"</string>
<string name="clear_default" msgid="7193185801596678067">"Clear default"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Text copied"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Discard changes"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Discard your changes?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Set up my profile"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Keep locally"</string>
<string name="add_account" msgid="8201790677994503186">"Add account"</string>
<string name="add_new_account" msgid="5748627740680940264">"Add new account"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Call not sent."</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Voicemail number unavailable"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Call not sent"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"To set up voicemail, go to Menu > Settings."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"To call voicemail, first turn off Airplane mode."</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index edb441d..28d8aa2 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Buscar"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Nuevo contacto"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Ver contacto"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Llamar a <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Llamar al <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Agregar a favoritos"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Eliminar de favoritos"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Editar"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contactos sugeridos"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Todos los contactos"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Unión de contactos"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"¿Eliminar contacto?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Establecer tono"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Llamadas al buzón de voz"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"No puedes eliminar contactos de cuentas de solo lectura, pero puedes ocultarlos en tus listas de contactos."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> seg."</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Contactado con frecuencia"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Llamados con frecuencia"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Agregar contacto"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"¿Deseas agregar \"<xliff:g id="EMAIL">%s</xliff:g>\" a los contactos?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"uno"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dos"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"menos"</string>
<string name="description_plus_button" msgid="515164827856229880">"más"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Ver contacto"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"No se dispone de espacio de almacenamiento."</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"No hay tarjeta SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"No se encontró almacenamiento."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"No se encontró una tarjeta SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Buscando vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importar de la tarjeta SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importar desde el almacenamiento"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exportar al almacenamiento"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importar todos los archivos de vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Buscando datos de vCard en el almacenamiento..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Buscando datos de vCard en la tarjeta SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"No se pudo explorar el almacenamiento."</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"No se pudo explorar la tarjeta SD."</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"No se pudo examinar el almacenamiento. (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")."</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"No se pudo examinar la tarjeta SD. (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Error de E/S"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> se exportará en breve."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Se rechazó la solicitud de exportación de la vCard. Vuelve a intentarlo más tarde."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contacto"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"¿Exportar contactos?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Tu lista de contactos se exportará al archivo: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"No se pudo exportar"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"El compositor de la vCard no se inició correctamente."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"No se pudo abrir \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> de <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contactos"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Cancelación de importación de vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"¿Deseas cancelar la importación de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Cancelación de exportación de vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"¿Deseas cancelar la exportación de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"No se canceló la impor./expor. de vCard."</string>
<string name="search_settings_description" msgid="2675223022992445813">"Nombres de tus contactos"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Contactos para mostrar"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importar/Exportar"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Imp./exp. contactos"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importar contactos"</string>
<string name="menu_share" msgid="943789700636542260">"Compartir"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Todos los contactos"</string>
<string name="share_via" msgid="563121028023030093">"Compartir un contacto a través de"</string>
<string name="share_error" msgid="948429331673358107">"No es posible compartir este contacto."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nombre"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"combinado a partir de fuentes <xliff:g id="COUNT">%0$d</xliff:g>"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Otro"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Agrupar contactos"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"¿Deseas agrupar el contacto actual con el contacto seleccionado?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Modificar contactos seleccionados"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"¿Optar por modificar contacto seleccionado? Se copiará la información que ingresaste hasta ahora."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Copiar en Mis contactos"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Agregar a Mis contactos"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Cargando..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Crear un contacto nuevo"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Accede a una cuenta"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importar contactos desde un archivo"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importar contactos"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Crear grupo nuevo"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Crear grupo nuevo]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Eliminar grupo"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grupo"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grupos"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Establecer como predeterminado"</string>
<string name="clear_default" msgid="7193185801596678067">"Eliminar predeterminado"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Texto copiado"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Descartar cambios"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"¿Deseas descartar los cambios?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g><xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Configurar mi perfil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Guardar localmente"</string>
<string name="add_account" msgid="8201790677994503186">"Agregar una cuenta"</string>
<string name="add_new_account" msgid="5748627740680940264">"Agregar una cuenta nueva"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"No se realizó la llamada."</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Número de buzón de voz no disponible"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"No se realizó la llamada."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Para configurar el buzón de voz, ve a a Menú > Configuración."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Para escuchar los mensajes de tu buzón de voz, desactiva primero el modo de avión."</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 0f06f92..e0af950 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Buscar"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Contacto nuevo"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Ver contacto"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Llamar a <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Llamar a <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Añadir a \"Favoritos\""</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Eliminar de \"Favoritos\""</string>
<string name="menu_editContact" msgid="9042415603857662633">"Editar"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contactos sugeridos"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Todos los contactos"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Contactos agrupados"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"¿Eliminar contacto?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Establecer tono"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Llamadas al buzón de voz"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"No puedes eliminar los contactos procedentes de las cuentas de solo lectura, pero puedes ocultarlos en las listas de contactos."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min. y <xliff:g id="SECONDS">%s</xliff:g> seg."</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Contactos frecuentes"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Más llamados"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Añadir contacto"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"¿Quieres añadir \"<xliff:g id="EMAIL">%s</xliff:g>\" a Contactos?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"uno"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dos"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"menos"</string>
<string name="description_plus_button" msgid="515164827856229880">"más"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Ver contacto"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Almacenamiento no disponible"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Falta la tarjeta SD."</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"No hay ningún almacenamiento."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"No se ha detectado ninguna tarjeta SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Buscando vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importar contactos desde la tarjeta SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importar de USB"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exportar a almacenamiento"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importar todos los archivos de vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Buscando datos de vCard en el almacenamiento..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Buscando datos de vCard en la tarjeta SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"No se ha podido analizar el almacenamiento."</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"No se ha podido analizar la tarjeta SD."</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"No se ha podido analizar el almacenamiento (motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")."</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"No se ha podido analizar la tarjeta SD (motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")."</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Error de E/S"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> se exportará en breve."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Se ha rechazado la solicitud de exportación de vCard. Inténtalo de nuevo más tarde."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contacto"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"¿Exportar contactos?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Tu lista de contactos se exportará al archivo <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Error al exportar"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"El redactor de vCard no se ha iniciado correctamente."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"No se ha podido abrir el archivo \"<xliff:g id="FILE_NAME">%s</xliff:g>\" (<xliff:g id="EXACT_REASON">%s</xliff:g>)."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> de <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contactos"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Cancelando importación de vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"¿Seguro que quieres cancelar la importación de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Cancelando exportación de vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"¿Seguro que quieres cancelar la exportación de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Error al cancelar la importación/exportación de vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Nombres de tus contactos"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Contactos que mostrar"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importar/exportar"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Importar/exportar contactos"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importar contactos"</string>
<string name="menu_share" msgid="943789700636542260">"Compartir"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Todos los contactos"</string>
<string name="share_via" msgid="563121028023030093">"Compartir contacto a través de"</string>
<string name="share_error" msgid="948429331673358107">"No se puede compartir este contacto."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nombre"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"fusionados desde <xliff:g id="COUNT">%0$d</xliff:g> fuentes"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Otro"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Agrupar contactos"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"¿Quieres agrupar el contacto actual con el contacto seleccionado?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Editar contactos seleccionados"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"¿Quieres editar el contacto seleccionado? Se copiará la información que hayas introducido hasta el momento."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Copiar en mis contactos"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Añadir a Mis contactos"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Cargando..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Crear contacto nuevo"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Acceder a una cuenta"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importar contactos de un archivo"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importar contactos"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Crear grupo nuevo"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Crear grupo nuevo]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Eliminar grupo"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"Un grupo"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grupos"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Establecer como predeterminado"</string>
<string name="clear_default" msgid="7193185801596678067">"Borrar predeterminado"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Texto copiado"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Descartar cambios"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"¿Seguro que quieres descartar los cambios?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Configurar mi perfil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Guardar localmente"</string>
<string name="add_account" msgid="8201790677994503186">"Añadir cuenta"</string>
<string name="add_new_account" msgid="5748627740680940264">"Añadir una cuenta nueva"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Llamada no enviada"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Número del buzón de voz no disponible"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Llamada no enviada"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Para configurar el buzón de voz, toca la tecla de menú y, a continuación, toca Ajustes."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Para llamar al buzón de voz, debes desactivar el modo avión."</string>
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 087fb7a..173bb46 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Otsing"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Uus kontakt"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Kuva kontakt"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Helista kasutajale <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Helistage: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Lisa lemmikutesse"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Eemalda lemmikutest"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Muuda"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Soovitatud kontaktid"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Kõik kontaktid"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kontaktid ühendatud"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Kustutada kontakt?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Määrake helin"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Kõik kõned kõneposti"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Te ei saa kontakte kirjutuskaitstud kontodest kustutada, kuid saate need oma kontaktide loendis peita."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Sageli valitud kontaktid"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Sageli valitud üksus"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Lisa kontakt"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Kas lisada „<xliff:g id="EMAIL">%s</xliff:g>” kontaktidesse?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"üks"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"kaks"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"miinus"</string>
<string name="description_plus_button" msgid="515164827856229880">"pluss"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Vaadake kontakti"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Mäluseade pole saadaval"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"SD-kaart puudub"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Mäluruumi ei leitud."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"SD-kaarti ei leitud."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"vCardi otsimine"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Impordi SIM-kaardilt"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Impordi mäluseadmest"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Ekspordi mäluseadmesse"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Impordi kõik vCardi failid"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Mäluruumist vCardi andmete otsimine ..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"SD-kaardilt vCardi andmete otsimine ..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Mäluseadme skaneering ebaõnnestus"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"SD-kaardi skaneering ebaõnnestus"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Mäluruumi ei saa kontrollida. (Põhjus: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD-kaarti ei saa kontrollida. (Põhjus: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O viga"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Fail <xliff:g id="FILENAME">%s</xliff:g> eksporditakse peagi."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"vCardi eksportimistaotlus lükati tagasi. Proovige hiljem uuesti."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontakt"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Eksportida kontakt?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Teie kontaktide loend eksporditakse faili: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Eksport ebaõnnestus"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"vCardi helilooja ei käivitunud korralikult."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Faili „<xliff:g id="FILE_NAME">%s</xliff:g>” ei saa avada: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g>/<xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontaktist"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"vCardi importimise tühistamine"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Kas tühistada faili <xliff:g id="FILENAME">%s</xliff:g> importimine?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"vCardi eksportimise tühistamine"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Kas tühistada faili <xliff:g id="FILENAME">%s</xliff:g> eksportimine?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"vCardi impordi/ekspordi tühist. ebaõnn."</string>
<string name="search_settings_description" msgid="2675223022992445813">"Teie kontaktide nimed"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kuvatavad kontaktisikud"</string>
<string name="menu_import_export" msgid="26217871113229507">"Import/eksport"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Kontaktide import/eksport"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Kontaktide importimine"</string>
<string name="menu_share" msgid="943789700636542260">"Jaga"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Kõik kontaktid"</string>
<string name="share_via" msgid="563121028023030093">"Kontakti jagamisvalikud"</string>
<string name="share_error" msgid="948429331673358107">"Seda kontakti ei saa jagada."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nimi"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"ühendati <xliff:g id="COUNT">%0$d</xliff:g> allikast"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Muu"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Kontaktide ühendamine"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Kas ühendada praegune kontakt valitud kontaktiga?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Valitud kontaktide muutmine"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Kas lülituda valitud kontakti muutmisse? Seni sisestatud andmed kopeeritakse."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopeeri valikusse Minu kontaktid"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Lisa lehele Minu kontaktid"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Laadimine ..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Loo uus kontakt"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Logi kontole sisse"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Impordi kontaktid failist"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Impordi kontaktid"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Uue grupi loomine"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Uue grupi loomine]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Grupi kustutamine"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grupp"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> rühma"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Määra vaikeseadeks"</string>
<string name="clear_default" msgid="7193185801596678067">"Kustuta vaikeseaded"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Tekst on kopeeritud"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Loobu muudatustest"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Kas loobute oma muudatustest?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g><xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Minu profiili seadistamine"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Hoia kohalikuna"</string>
<string name="add_account" msgid="8201790677994503186">"Lisa konto"</string>
<string name="add_new_account" msgid="5748627740680940264">"Lisa uus konto"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Kõnet ei tehtud"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Kõneposti number pole saadaval"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Kõnet ei tehtud"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Kõneposti seadistamiseks minge valikusse Menüü > Seaded."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Kõneposti kuulamiseks lülitage lennurežiim välja."</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 2bacc4e..dbc876e 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"جستجو"</string>
<string name="menu_newContact" msgid="1209922412763274638">"مخاطب جدید"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"مشاهده مخاطب"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"تماس با <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"تماس با <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"افزودن به موارد دلخواه"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"حذف از موارد دلخواه"</string>
<string name="menu_editContact" msgid="9042415603857662633">"ویرایش"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"مخاطبین پیشنهادی"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"همه مخاطبین"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"مخاطبین ملحق شده"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"مخاطب حذف شود؟"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"تنظیم آهنگ زنگ"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"همه تماسها به پست صوتی"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"شما نمیتوانید مخاطبین را از حسابهای فقط خواندنی حذف کنید اما میتوانید آنها را در لیستهای مخاطبین خود پنهان کنید."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> دقیقه و <xliff:g id="SECONDS">%s</xliff:g> ثانیه"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"اغلب تماس گرفته شده"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"اغلب به نام"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"افزودن مخاطب"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" به مخاطبین افزوده شود؟"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"یک"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"دو"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"منها"</string>
<string name="description_plus_button" msgid="515164827856229880">"به اضافه"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"مشاهده مخاطب"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"حافظه در دسترس نیست"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"کارت SD موجود نیست"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"هیچ دستگاه ذخیرهای یافت نشد."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"کارت SD یافت نشد."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"جستجوی کارت ویزیت"</string>
<string name="import_from_sim" msgid="3859272228033941659">"وارد کردن از سیم کارت"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"وارد کردن از حافظه"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"صادر کردن به حافظه"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"وارد کردن همه فایل های کارت ویزیت"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"جستجوی داده کارت ویزیت در دستگاه ذخیره..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"درحال جستجوی دادههای کارت ویزیت در کارت SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"اسکن کردن محل ذخیره ممکن نیست"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"اسکن کارت SD ممکن نیست"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"دستگاه ذخیره نمیتواند بررسی شود. (علت: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"کارت SD نمیتواند بررسی شود. (علت: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"خطای ورودی/خروجی"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> به زودی صادر می شود."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"درخواست صدور کارت ویزیت رد شد. لطفاً بعداً امتحان کنید."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"مخاطب"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"مخاطبین صادر شوند؟"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"لیست مخاطبین شما به این فایل صادر میشود: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"صادر نمیشود"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"سازنده فایل کارت ویزیت به درستی اجرا نشد."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"\"<xliff:g id="FILE_NAME">%s</xliff:g>\" باز نشد: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> از <xliff:g id="TOTAL_NUMBER">%s</xliff:g> مخاطب"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"لغو وارد کردن کارت ویزیت"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"وارد کردن <xliff:g id="FILENAME">%s</xliff:g> لغو شود؟"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"لغو صادر کردن کارت ویزیت"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"صادر کردن <xliff:g id="FILENAME">%s</xliff:g> لغو شود؟"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"نمیتوان وارد کردن/ صادر کردن کارت ویزیت را لغو کرد"</string>
<string name="search_settings_description" msgid="2675223022992445813">"نام های مخاطبین شما"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"مخاطبین جهت نمایش"</string>
<string name="menu_import_export" msgid="26217871113229507">"وارد کردن/صادر کردن"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"وارد کردن/صادر کردن مخاطبین"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"وارد کردن مخاطبین"</string>
<string name="menu_share" msgid="943789700636542260">"اشتراک گذاری"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"همه مخاطبین"</string>
<string name="share_via" msgid="563121028023030093">"اشتراک گذاری مخاطب از طریق"</string>
<string name="share_error" msgid="948429331673358107">"این مخاطب قابل اشتراکگذاری نیست."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"نام"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"ادغام شده از منابع <xliff:g id="COUNT">%0$d</xliff:g>"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"سایر موارد"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"پیوستن به مخاطبین"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"پیوستن به مخاطب فعلی با مخاطب انتخابی؟"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"ویرایش محتویات انتخابی"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"به ویرایش مخاطب انتخابی می روید؟ اطلاعاتی که تا حال وارد کرده اید کپی خواهد شد."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"کپی در مخاطبین من"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"افزودن به مخاطبین من"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"درحال بارگیری..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"ایجاد مخاطب جدید"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"وارد شدن به یک حساب"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"وارد کردن مخاطبین از یک فایل"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"وارد کردن مخاطبین"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"ایجاد گروه جدید"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[ایجاد گروه جدید]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"حذف گروه"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 گروه"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> گروه"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"تنظیم پیش فرض"</string>
<string name="clear_default" msgid="7193185801596678067">"پاک کردن پیش فرضها"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"متن کپی شده"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"صرفنظر از تغییرات"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"از تغییرات شما صرفنظر شود؟"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g><xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"راهاندازی نمایه من"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"ذخیره بصورت محلی"</string>
<string name="add_account" msgid="8201790677994503186">"افزودن حساب"</string>
<string name="add_new_account" msgid="5748627740680940264">"اافزودن حساب جدید"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"تماس ارسال نشد"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"شماره پست صوتی در دسترس نیست"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"تماس ارسال نشد"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"برای راهاندازی پست صوتی به منو > تنظیمات بروید."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"برای تماس با پست صوتی، ابتدا حالت هواپیما را غیرفعال کنید."</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 33db52f..92945fb 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Haku"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Uusi yhteystieto"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Näytä yhteystieto"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Soita: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Soita <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Lisää suosikkeihin"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Poista suosikeista"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Muokkaa"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Ehdotetut yhteystiedot"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Kaikki yhteystiedot"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Yhteystiedot yhdistetty"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Poista yhteystieto?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Aseta soittoääni"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Kaikki puhelut vastaajaan"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Et voi poistaa yhteystietoja vain luku -tilassa olevista tileistä. Voit kuitenkin piilottaa yhteystietoja yhteystietoluetteloissasi."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Usein käytetyt"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Soitettu usein"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Lisää yhteystieto"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Lisätäänkö <xliff:g id="EMAIL">%s</xliff:g> yhteystietoihin?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"yksi"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"kaksi"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"miinus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Näytä yhteystieto"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Tallennustila ei käytettävissä"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Ei SD-korttia"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Tallennustilaa ei löydy."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"SD-korttia ei löydy."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Etsitään vCardia"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Tuo SIM-kortilta"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Tuo tallennustilasta"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Vie tallennustilaan"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Tuo kaikki vCard-tiedostot"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Etsitään vCard-tietoja tallennustilasta..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Etsitään vCard-tietoja SD-kortilta..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Tallennustilan luku epäonnistui."</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"SD-korttia ei voi lukea."</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Tallennustilan luku epäonnistui. (Syy: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD-korttia ei voi lukea. (Syy: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O-virhe"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> viedään pian."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"vCard-vientipyyntö hylättiin. Yritä myöhemmin uudelleen."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"yhteystieto"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Vie yhteystietoja?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Yhteystietoluettelosi viedään tiedostoon: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Vieminen epäonnistui"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"vCard-luonti ei käynnistynyt oikein."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Tiedostoa \"<xliff:g id="FILE_NAME">%s</xliff:g>\" ei voi avata: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> / <xliff:g id="TOTAL_NUMBER">%s</xliff:g> yhteystietoa"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Peruutetaan vCardin tuontia"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Peruuta kohteen <xliff:g id="FILENAME">%s</xliff:g> tuonti?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Peruutetaan vCardin vientiä"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Peruuta kohteen <xliff:g id="FILENAME">%s</xliff:g> vienti?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"vCardin tuonnin/viennin peruutus epäonn."</string>
<string name="search_settings_description" msgid="2675223022992445813">"Yhteystietojen nimet"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Näytettävät yhteystiedot"</string>
<string name="menu_import_export" msgid="26217871113229507">"Tuo/Vie"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Tuo/Vie yhteystietoja"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Tuo yhteystietoja"</string>
<string name="menu_share" msgid="943789700636542260">"Jaa"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Kaikki kontaktit"</string>
<string name="share_via" msgid="563121028023030093">"Jaa yhteystieto"</string>
<string name="share_error" msgid="948429331673358107">"Tätä yhteystietoa ei voi jakaa."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nimi"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"yhdistetty <xliff:g id="COUNT">%0$d</xliff:g> lähteestä"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Muu"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Yhdistä yhteystiedot"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Yhdistetäänkö nykyiset yhteystiedot valittujen yhteystietojen kanssa?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Muokkaa valittuja yhteystietoja"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Haluatko muokata valittuja yhteystietoja? Antamasi tiedot kopioidaan."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopioi yhteystietoihini"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Lisää kontakteihin"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Ladataan..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Luo uusi yhteystieto"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Kirjaudu tiliin"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Tuo yhteystietoja tiedostosta"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Tuo yhteystietoja"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Luo uusi ryhmä"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Luo uusi ryhmä]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Poista ryhmä"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 ryhmä"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> ryhmää"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Aseta oletukseksi"</string>
<string name="clear_default" msgid="7193185801596678067">"Poista oletus"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Teksti kopioitu"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Hylkää muutokset"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Hylätäänkö muutokset?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Luo profiili"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Säilytä paikallisena"</string>
<string name="add_account" msgid="8201790677994503186">"Lisää tili"</string>
<string name="add_new_account" msgid="5748627740680940264">"Lisää uusi tili"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Puhelua ei soitettu."</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Vastaajan numero ei saatavilla"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Puhelua ei soitettu"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Määritä puhelinvastaajan asetukset kohdassa Valikko > Asetukset."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Poista lentokonetila käytöstä ennen vastaajaan soittamista."</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 98ce13e..64d7a6b 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Rechercher"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Nouveau contact"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Afficher le contact"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Appeler <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Appeler le <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Ajouter aux favoris"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Supprimer des favoris"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Modifier"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contacts suggérés"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tous les contacts"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Contacts joints"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Supprimer contact ?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Régler sonnerie"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Tous appels vers messag. voc."</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Impossible de supprimer les contacts des comptes en lecture seule. Vous pouvez les masquer dans la liste des contacts."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> mn <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Contacts fréquents"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Appels fréquents"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Ajouter un contact"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Ajouter \"<xliff:g id="EMAIL">%s</xliff:g>\" aux contacts ?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"un"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"deux"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"moins"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Afficher le contact"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Mémoire non disponible"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Aucune carte SD trouvée"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Aucune mémoire stock. trouvée."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Aucune carte SD détectée."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Recherche des données VCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importer à partir de la carte SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importer depuis mémoire"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exporter vers la mémoire"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importer tous les fichiers vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Recherche de données vCard dans la mémoire de stockage…"</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Recherche de données vCard sur la carte SD…"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Impossible d\'analyser la mémoire de stockage"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Impossible d\'analyser la carte SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Impossible d\'explorer la mémoire de stockage pour la raison suivante : <xliff:g id="FAIL_REASON">%s</xliff:g>."</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Impossible d\'explorer la carte SD pour la raison suivante : <xliff:g id="FAIL_REASON">%s</xliff:g>."</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Erreur d\'E/S."</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Exportation du fichier <xliff:g id="FILENAME">%s</xliff:g> imminente"</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"La demande d\'exportation du fichier vCard a été rejetée. Veuillez réessayer ultérieurement."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contact"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Exporter contacts ?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Votre liste de contacts va être exportée vers le fichier \"<xliff:g id="VCARD_FILENAME">%s</xliff:g>\"."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Échec exportation"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Le système de composition vCard n\'a pas démarré correctement."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Impossible d\'ouvrir \"<xliff:g id="FILE_NAME">%s</xliff:g>\" pour la raison suivante : <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> sur <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contacts"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Annulation importation fichier vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Annuler l\'importation de \"<xliff:g id="FILENAME">%s</xliff:g>\" ?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Annulation exportation fichier vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Annuler l\'exportation de \"<xliff:g id="FILENAME">%s</xliff:g>\" ?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Impossible annuler import./export. vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Noms de vos contacts"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Contacts à afficher"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importer/Exporter"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Import/Export contacts"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importer des contacts"</string>
<string name="menu_share" msgid="943789700636542260">"Partager"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Tous les contacts"</string>
<string name="share_via" msgid="563121028023030093">"Partager contact via"</string>
<string name="share_error" msgid="948429331673358107">"Impossible de partager ce contact."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nom"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"1 contact fusionné à partir de <xliff:g id="COUNT">%0$d</xliff:g> sources"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Autre"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Joindre les contacts"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Associer ce contact au contact sélectionné ?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Modifier les contacts sélectionnés"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Modifier le contact sélectionné ? Les informations saisies jusqu\'ici seront copiées."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Copier dans \"Mes contacts\""</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Ajouter à \"Mes contacts\""</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Chargement…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Créer un contact"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Se connecter à un compte"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importer les contacts d\'un fichier"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importer des contacts"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Créer un groupe"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Créer un groupe]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Supprimer le groupe"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"Un groupe"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> groupes"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Définir par défaut"</string>
<string name="clear_default" msgid="7193185801596678067">"Effacer les valeurs par défaut"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Texte copié"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Supprimer les modifications"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Annuler les modifications ?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g> "</string>
<string name="profile_display_name" msgid="4127389543625918771">"Configurer mon profil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Enregistrer localement"</string>
<string name="add_account" msgid="8201790677994503186">"Ajouter un compte"</string>
<string name="add_new_account" msgid="5748627740680940264">"Ajouter un compte"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Appel non effectué"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Messagerie vocale indisponible"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Appel non effectué."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Pour configurer la messagerie vocale, accédez à Menu > Paramètres."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Veuillez désactiver le mode Avion avant d\'appeler la messagerie vocale."</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 5690338..8ea4de8 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"खोज"</string>
<string name="menu_newContact" msgid="1209922412763274638">"नया संपर्क"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"संपर्क देखें"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"<xliff:g id="NAME">%s</xliff:g> को कॉल करें"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"<xliff:g id="NUMBER">%s</xliff:g> पर कॉल करें"</string>
<string name="menu_addStar" msgid="2908478235715404876">"पसंदीदा में जोड़ें"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"पसंदीदा से निकालें"</string>
<string name="menu_editContact" msgid="9042415603857662633">"संपादित करें"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"सुझाए गए संपर्क"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"सभी संपर्क"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"संपर्क जुड़ गए"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"संपर्क हटाएं?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"रिंगटोन सेट करें"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"ध्वनिमेल से सभी कॉल"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"आप केवल-पढ़ने के लिए खातों से संपर्क नहीं हटा सकते, लेकिन आप उन्हें अपनी संपर्क सूचियों में छुपा सकते हैं."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> मिनट <xliff:g id="SECONDS">%s</xliff:g> सेकंड"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"बार-बार संपर्क किया गया"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"बार-बार कॉल किया गया"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"संपर्क जोड़ें"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" को संपर्कों में जोड़ें?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"एक"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"दो"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"निकालें"</string>
<string name="description_plus_button" msgid="515164827856229880">"जोड़ें"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"संपर्क देखें"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"संग्रहण अनुपलब्ध"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"कोई SD कार्ड नहीं"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"कोई संग्रहण नहीं मिला."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"कोई SD कार्ड नहीं मिला."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"vCard खोज रहा है"</string>
<string name="import_from_sim" msgid="3859272228033941659">"सिम कार्ड से आयात करें"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"संग्रहण से आयात करें"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"संग्रहण में निर्यात करें"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"सभी vCard फ़ाइलें आयात करें"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"संग्रहण में vCard डेटा खोज रहा है..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"SD कार्ड पर vCard डेटा खोज रहा है…"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"संग्रहण स्कैन नहीं हो सका"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"SD कार्ड स्कैन नहीं हो सका"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"संग्रहण स्कैन नहीं किया जा सका. (कारण: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD कार्ड स्कैन नहीं किया जा सका. (कारण: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O त्रुटि"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> को जल्दी ही निर्यात किया जाएगा."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"vCard आयात अनुरोध अस्वीकार हो गया था. बाद में पुन: प्रयास करें."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"संपर्क"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"संपर्क निर्यात करें?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"आपकी संपर्क सूची इस फ़ाइल में निर्यात कर दी जाएगी: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"निर्यात नहीं कर सका"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"vCard कंपोज़र ठीक से शुरू नहीं हुआ."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"\"<xliff:g id="FILE_NAME">%s</xliff:g>\" नहीं खोली जा सकी: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="TOTAL_NUMBER">%s</xliff:g> में से <xliff:g id="CURRENT_NUMBER">%s</xliff:g> संपर्क"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"vCard आयात रद्द कर रहा है"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"<xliff:g id="FILENAME">%s</xliff:g> का आयात रद्द करें?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"vCard निर्यात रद्द किया जा रहा है"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"<xliff:g id="FILENAME">%s</xliff:g> का निर्यात रद्द करें?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"vCard आयात/निर्यात रद्द नहीं हो सका"</string>
<string name="search_settings_description" msgid="2675223022992445813">"आपके संपर्कों के नाम"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"प्रदर्शन के लिए संपर्क"</string>
<string name="menu_import_export" msgid="26217871113229507">"आयात करें/निर्यात करें"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"संपर्क आयात/निर्यात करें"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"संपर्क आयात करें"</string>
<string name="menu_share" msgid="943789700636542260">"शेयर करें"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"सभी संपर्क"</string>
<string name="share_via" msgid="563121028023030093">"इसके द्वारा संपर्क शेयर करें"</string>
<string name="share_error" msgid="948429331673358107">"यह संपर्क साझा नहीं किया जा सकता."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"नाम"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"<xliff:g id="COUNT">%0$d</xliff:g> स्रोतों से मर्ज किया गया"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"अन्य"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"संपर्क जोड़ें"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"वर्तमान संपर्क को चयनित संपर्क से जोड़ें?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"चयनित संपर्कों को संपादित करें"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"चयनित संपर्क के संपादन पर जाएं? आपके द्वारा अभी तक दर्ज की गई जानकारी की प्रतिलिपि बनाई जाएगी."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"मेरे संपर्क में प्रतिलिपि बनाएं"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"मेरे संपर्क में जोड़ें"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"लोड हो रहा है..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"एक नया संपर्क बनाएं"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"किसी खाते में साइन इन करें"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"फ़ाइल से संपर्क आयात करें"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"संपर्क आयात करें"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"नया समूह बनाएं"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[नया समूह बनाएं]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"समूह हटाएं"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 समूह"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> समूह"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"डिफ़ॉल्ट सेट करें"</string>
<string name="clear_default" msgid="7193185801596678067">"डिफ़ॉल्ट साफ़ करें"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"पाठ की प्रतिलिपि बनाई गई"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"परिवर्तन छोड़ें"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"आपके परिवर्तन छोड़ें?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"मेरी प्रोफ़ाइल सेट करें"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"स्थानीय रखें"</string>
<string name="add_account" msgid="8201790677994503186">"खाता जोड़ें"</string>
<string name="add_new_account" msgid="5748627740680940264">"नया खाता जोड़ें"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"कॉल नहीं भेजा गया"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"ध्वनिमेल नंबर अनुपलब्ध"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"कॉल नहीं भेजा गया"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ध्वनिमेल सेट करने के लिए, मेनू > सेटिंग पर जाएं."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"ध्वनिमेल कॉल करने के लिए, पहले हवाई जहाज़ मोड बंद करें."</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index da85680..034b53e 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Pretraži"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Novi kontakt"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Prikaži kontakt"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Nazovi <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Nazovite <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Dodaj u favorite"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Ukloni iz favorita"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Uredi"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Predloženi kontakti"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Svi kontakti"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kontakti su pridruženi"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Izbrisati kontakt?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Postavi zvuk zvona"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Svi pozivi na govornu poštu"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Ne možete izbrisati kontakte s računa samo za čitanje, ali možete ih sakriti na svojim popisima kontakata."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> minuta <xliff:g id="SECONDS">%s</xliff:g> sekundi"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Često kontaktirani"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Često nazivani"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Dodaj kontakt"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Dodati \"<xliff:g id="EMAIL">%s</xliff:g>\" kontaktima?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"jedan"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dva"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Prikaži kontakt"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Prostor za pohranu nedostupan"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nema SD kartice"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Nije pronađena nijedna pohrana."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Nije pronađena SD kartica."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Traženje kartice vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Uvezi sa SIM kartice"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Uvoz iz pohrane"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Izvoz u pohranu"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Uvezi sve vCard datoteke"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Traženje vCard podataka u pohrani..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Pretraživanje vCard podataka na SD kartici..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Skeniranje pohrane nije uspjelo"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Skeniranje SD kartice nije uspjelo"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Pohrana se ne može skenirati. (Razlog: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD kartica ne može se skenirati. (Razlog: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O pogreška"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Datoteka <xliff:g id="FILENAME">%s</xliff:g> uskoro će biti izvezena."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Zahtjev za izvoz formata vCard odbijen je. Pokušajte ponovo kasnije."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontakt"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Izvesti kontakte?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Vaš popis kontakata bit će izvezen u datoteku: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Izvoz nije uspio"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Sastavljač za vCard nije se ispravno pokrenuo."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Datoteku \"<xliff:g id="FILE_NAME">%s</xliff:g>\" nije moguće otvoriti radi: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> od <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontakata"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Otkazivanje uvoza kartice vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Otkazati uvoz datoteke <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Otkazivanje izvoza kartice vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Otkazati izvoz datoteke <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Uvoz/izvoz kartice vCard nije otkazan"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Nazivi vaših kontakata"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakti za prikaz"</string>
<string name="menu_import_export" msgid="26217871113229507">"Uvoz/izvoz"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Uvoz/izvoz kontakata"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Uvezi kontakte"</string>
<string name="menu_share" msgid="943789700636542260">"Podijeli"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Svi kontakti"</string>
<string name="share_via" msgid="563121028023030093">"Dijeli kontakt putem"</string>
<string name="share_error" msgid="948429331673358107">"Ovaj kontakt nije moguće dijeliti."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Ime"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"spojen s <xliff:g id="COUNT">%0$d</xliff:g> izvora"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Drugo"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Pridruživanje kontakata"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Pridružiti trenutačni kontakt odabranom kontaktu?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Uredi odabrane kontakte"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Prebaciti se na uređivanje odabranog kontakta? Informacije koje ste unijeli dosad kopirat će se."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopiraj u Moje kontakte"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Dodaj u Moje kontakte"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Učitavanje..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Izradi novi kontakt"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Prijavi se na račun"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Uvezi kontakte iz datoteke"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Uvezi kontakte"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Izrada nove grupe"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Izradi novu grupu]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Izbriši grupu"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grupa"</item>
<item quantity="other" msgid="1276758425904917367">"Br. grupa: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Postavi zadano"</string>
<string name="clear_default" msgid="7193185801596678067">"Izbriši zadano"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Tekst kopiran"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Odbaci promjene"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Odbaciti promjene?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g><xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Postavi moj profil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Zadrži lokalno"</string>
<string name="add_account" msgid="8201790677994503186">"Dodaj račun"</string>
<string name="add_new_account" msgid="5748627740680940264">"Dodaj novi račun"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Poziv nije poslan"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Broj govorne pošte nedostupan je"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Poziv nije poslan"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Da biste postavili govornu poštu, idite na Izbornik > Postavke."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Da biste nazvali govornu poštu, najprije isključite način rada u zrakoplovu."</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 0f99b0f..2d731c0 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Keresés"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Új névjegy"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Névjegy megtekintése"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"<xliff:g id="NAME">%s</xliff:g> hívása"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Hívás: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Hozzáadás a kedvencekhez"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Eltávolítás a kedvencek közül"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Szerkesztés"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Javasolt névjegyek"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Összes névjegy"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"A névjegyek összekapcsolása megtörtént"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Törli a névjegyet?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Csengőhang"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Minden hívás a hangpostára"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Írásvédett fiókból nem törölhet névjegyet, de saját címtárában elrejtheti azokat."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> perc <xliff:g id="SECONDS">%s</xliff:g> másodperc"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Gyakran keresett"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Gyakran hívott"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Névjegy hozzáadása"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Hozzáadja a(z) \"<xliff:g id="EMAIL">%s</xliff:g>\"címet a Címtárhoz?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"egy"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"kettő"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"mínusz"</string>
<string name="description_plus_button" msgid="515164827856229880">"plusz"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Névjegy megtekintése"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"A tárhely nem érhető el"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Hiányzó SD-kártya"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Nem található tárhely."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Nem található SD-kártya."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"vCard keresése"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importálás a SIM-kártyáról"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importálás a tárhelyről"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exportálás a tárhelyre"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Az összes vCard fájl importálása"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"vCard-adatok keresése a tárhelyen..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"vCard-adatok keresése az SD-kártyán..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Nem sikerült beolvasni a tárolót"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Nem lehet beolvasni az SD-kártyát"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"A tárhelyet nem lehet beolvasni. (Indok: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Az SD-kártyát nem lehet beolvasni. (Ok: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O hiba"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"A(z) <xliff:g id="FILENAME">%s</xliff:g> hamarosan exportálásra kerül."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"A vCard-exportálási kérelem elutasítva. Próbálja újra később."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kapcsolat"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Exportálni szeretné?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"A névjegyek listájának exportálása a(z) <xliff:g id="VCARD_FILENAME">%s</xliff:g> fájlba."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Sikertelen export"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"A vCard-készítő nem megfelelően indult el."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"A(z) \"<xliff:g id="FILE_NAME">%s</xliff:g>\" fájl nem nyitható meg: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g>/<xliff:g id="TOTAL_NUMBER">%s</xliff:g> névjegy"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"vCard importálásának megszakítása"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Megszakítja <xliff:g id="FILENAME">%s</xliff:g> importálását?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"vCard exportálásának megszakítása"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Megszakítja <xliff:g id="FILENAME">%s</xliff:g> exportálását?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"vCard imp./exp. megszakítása sikertelen"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Ismerősök nevei"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Megjelenítendő névjegyek"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importálás/exportálás"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Névjegyek importálása/exportálása"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Névjegyek importálása"</string>
<string name="menu_share" msgid="943789700636542260">"Megosztás"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Összes névjegy"</string>
<string name="share_via" msgid="563121028023030093">"Névjegy megosztása a következőn:"</string>
<string name="share_error" msgid="948429331673358107">"Ez a névjegy nem osztható meg."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Név"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"egyesítve <xliff:g id="COUNT">%0$d</xliff:g> forrásból"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Egyéb"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Névjegyek összekapcsolása"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Összekapcsolja a jelenlegi névjegyet a kiválasztott névjeggyel?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"A kiválasztott névjegyek szerkesztése"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"A kiválasztott névjegy szerkesztésére vált? Az eddig beírt információk át lesznek másolva."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Másolás a saját névjegyeim közé"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Hozzáadás a Címtárhoz"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Betöltés..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Új névjegy létrehozása"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Jelentkezzen be fiókjába"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Névjegyek importálása fájlból"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Névjegyek importálása"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Új csoport létrehozása"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Új csoport létrehozása]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Csoport törlése"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 csoport"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> csoport"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Beállítás alapértelmezettként"</string>
<string name="clear_default" msgid="7193185801596678067">"Alapértelmezés törlése"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Másolt szöveg"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Módosítások elvetése"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Elveti a módosításokat?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Saját profil beállítása"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Tárolás helyben"</string>
<string name="add_account" msgid="8201790677994503186">"Fiók hozzáadása"</string>
<string name="add_new_account" msgid="5748627740680940264">"Új fiók hozzáadása"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"A hívás nem indítható."</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"A hangpostaszám nem érhető el"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"A hívás nem indítható."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"A hangposta beállításához válassza a Menü > Beállítások pontot."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Hangposta hívásához kapcsolja ki a Repülőgép üzemmódot."</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 6d3f29c..25f8d8c 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Telusuri"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Kenalan baru"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Lihat kenalan"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Panggil <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Panggil <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Tambahkan ke favorit"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Hapus dari favorit"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Edit"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Kenalan yang disarankan"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Semua kenalan"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kenalan telah bergabung"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Hapus data kenalan?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Setel nada dering"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Semua panggilan ke kotak pesan"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Anda tidak dapat menghapus data kenalan dari akun hanya-baca, namun Anda dapat menyembunyikannya dalam daftar data kenalan Anda."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> menit <xliff:g id="SECONDS">%s</xliff:g> detik"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Paling sering dihubungi"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Paling sering dipanggil"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Tambahkan kenalan"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Tambahkan \"<xliff:g id="EMAIL">%s</xliff:g>\" ke kenalan?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"satu"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dua"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Lihat kenalan"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Penyimpanan tidak tersedia"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Tidak ada kartu SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Tidak ditemukan penyimpanan."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Tidak ditemukan kartu SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Menelusuri vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Impor dari kartu SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Impor dari penyimpanan"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Ekspor ke penyimpanan"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Impor semua berkas vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Menelusuri data vCard dalam penyimpanan..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Menelusuri data vCard pada kartu SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Tidak dapat memindai penyimpanan"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Tidak dapat memindai kartu SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Penyimpanan tidak dapat dipindai. (Alasan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Kartu SD tidak dapat dipindai. (Alasan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Galat I/O"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> akan segera diekspor."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Permintaan ekspor vCard ditolak. Coba lagi nanti."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kenalan"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Ekspor data kenalan?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Daftar data kenalan Anda akan diekspor ke berkas: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Tak dapat mengekspor"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Penyusun vCard tidak memulai dengan semestinya."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Tidak dapat membuka \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> dari <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kenalan"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Membatalkan impor vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Batalkan impor <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Membatalkan ekspor vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Batalkan ekspor <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Tidak dpt membatalkan impor/ekspor vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Nama kenalan Anda"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kenalan untuk ditampilkan"</string>
<string name="menu_import_export" msgid="26217871113229507">"Impor/ekspor"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Impor/ekspor data kenalan"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Impor kenalan"</string>
<string name="menu_share" msgid="943789700636542260">"Bagikan"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Semua kenalan"</string>
<string name="share_via" msgid="563121028023030093">"Bagikan kenalan melalui"</string>
<string name="share_error" msgid="948429331673358107">"Data kenalan ini tidak dapat dibagi."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nama"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"digabungkan dari <xliff:g id="COUNT">%0$d</xliff:g> sumber"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Lainnya"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Gabungkan kenalan"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Gabungkan kenalan ini dengan kenalan yang dipilih?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Edit kenalan yang dipilih"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Beralih ke mengedit kenalan yang dipilih? Informasi yang telah Anda masukkan sejauh ini akan disalin."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Salin ke Data Kenalan Saya"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Tambahkan ke Kenalan Saya"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Memuat..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Buat kenalan baru"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Masuk ke akun."</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Mengimpor data kenalan dari berkas"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Impor kenalan"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Buat grup baru"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Buat grup baru]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Hapus grup"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grup"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grup"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Setel sebagai bawaan"</string>
<string name="clear_default" msgid="7193185801596678067">"Hapus bawaan"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Teks disalin"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Singkirkan perubahan"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Buang perubahan Anda?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Siapkan profil saya"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Simpan secara lokal"</string>
<string name="add_account" msgid="8201790677994503186">"Tambahkan akun"</string>
<string name="add_new_account" msgid="5748627740680940264">"Tambahkan akun baru"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Panggilan tidak terkirim"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Nomor pesan suara tidak tersedia"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Panggilan tidak terkirim"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Untuk menyiapkan kotak pesan, buka Menu > Setelan."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Untuk memanggil pesan suara, pertama-tama matikan mode Pesawat."</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 32b8522..0a5e9a9 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Cerca"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Nuovo contatto"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Visualizza contatto"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Chiama <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Chiama <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Aggiungi a preferiti"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Rimuovi dai preferiti"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Modifica"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contatti suggeriti"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tutti i contatti"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Contatti uniti"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Eliminare contatto?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Imposta suoneria"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Tutte le chiamate a segreteria"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Non puoi eliminare contatti da account di sola lettura, ma puoi nasconderli nei tuoi elenchi di contatti."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sec."</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Contattati spesso"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Numeri più chiamati"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Aggiungi contatto"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Aggiungi \"<xliff:g id="EMAIL">%s</xliff:g>\" ai contatti?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"uno"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"due"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"meno"</string>
<string name="description_plus_button" msgid="515164827856229880">"più"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Visualizza contatto"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Archivio non disponibile"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nessuna scheda SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Nessun archivio trovato."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Nessuna scheda SD trovata."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Ricerca vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importa da scheda SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importa da archivio"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Esporta in archivio"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importa tutti i file vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Ricerca di dati vCard nell\'archivio..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Ricerca dati vCard su scheda SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Scansione archivio non riuscita"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Scansione scheda SD non riuscita"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Scansione dell\'archivio non riuscita. (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Scansione della scheda SD non riuscita. (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Errore I/O"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"La vCard <xliff:g id="FILENAME">%s</xliff:g> verrà esportata a breve."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Richiesta esportazione vCard rifiutata. Riprova più tardi."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contatto"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Esportare contatti?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"L\'elenco dei contatti verrà esportato nel file: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Impossibile esportare"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Il compositore di vCard non si è avviato correttamente."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Apertura di \"<xliff:g id="FILE_NAME">%s</xliff:g>\" non riuscita: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> contatti su <xliff:g id="TOTAL_NUMBER">%s</xliff:g>"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Annullamento importazione vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Annullare l\'importazione di <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Annullamento esportazione vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Annullare l\'esportazione di <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Annullam. import./esport. vCard non riuscito"</string>
<string name="search_settings_description" msgid="2675223022992445813">"I nomi dei tuoi contatti"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Contatti da visualizzare"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importa/esporta"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Importa/esporta contatti"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importa contatti"</string>
<string name="menu_share" msgid="943789700636542260">"Condividi"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Tutti i contatti"</string>
<string name="share_via" msgid="563121028023030093">"Condividi contatto tramite"</string>
<string name="share_error" msgid="948429331673358107">"Questo contatto non può essere condiviso."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nome"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"uniti da <xliff:g id="COUNT">%0$d</xliff:g> origini"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Altro"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Unisci contatti"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Unire il contatto corrente al contatto selezionato?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Modifica i contatti selezionati"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Passare alla modifica del contatto selezionato? Le informazioni inserite finora verranno copiate."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Copia nei miei contatti"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Aggiungi ai contatti personali"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Caricamento..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Crea nuovo contatto"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Accedi a un account"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importa contatti da file"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importa contatti"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Crea nuovo gruppo"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Crea nuovo gruppo]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Elimina gruppo"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 gruppo"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> gruppi"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Imposta come predefinito"</string>
<string name="clear_default" msgid="7193185801596678067">"Cancella impostazione predefinita"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Testo copiato"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Ignora modifiche"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Annullare le modifiche?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g> "</string>
<string name="profile_display_name" msgid="4127389543625918771">"Imposta il mio profilo"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Memorizza in locale"</string>
<string name="add_account" msgid="8201790677994503186">"Aggiungi account"</string>
<string name="add_new_account" msgid="5748627740680940264">"Aggiungi nuovo account"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Chiamata non inviata"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Numero segreteria non disponibile"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Chiamata non inviata"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Per configurare la segreteria, seleziona Menu > Impostazioni."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Per chiamare la segreteria, disattiva la modalità aereo."</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 6403596..2359bf0 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"חפש"</string>
<string name="menu_newContact" msgid="1209922412763274638">"איש קשר חדש"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"הצג איש קשר"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"התקשר אל <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"התקשר אל <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"הוסף למועדפים"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"הסר מהמועדפים"</string>
<string name="menu_editContact" msgid="9042415603857662633">"ערוך"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"אנשי קשר מוצעים"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"כל אנשי הקשר"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"אנשי קשר צורפו"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"למחוק את איש הקשר?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"הגדר רינגטון"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"כל השיחות לתא הקולי"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"לא ניתן למחוק אנשי קשר מחשבונות לקריאה בלבד, אך ניתן להסתיר אותם ברשימות אנשי הקשר."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> דקות <xliff:g id="SECONDS">%s</xliff:g> שניות"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"בקשר לעתים קרובות"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"התקשרות לעתים קרובות"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"הוסף איש קשר"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"להוסיף את \"<xliff:g id="EMAIL">%s</xliff:g>\" לאנשי הקשר?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"אחד"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"שתיים"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"חיסור"</string>
<string name="description_plus_button" msgid="515164827856229880">"חיבור"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"הצג איש קשר"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"אמצעי אחסון אינו זמין"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"אין כרטיס SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"לא נמצאו התקני אחסון."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"לא נמצא כרטיס SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"מחפש vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"ייבא מכרטיס SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"ייבא מאמצעי אחסון"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"ייצא לאמצעי אחסון"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"ייבא את כל קובצי vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"מחפש נתוני vCard באמצעי האחסון..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"מחפש נתוני vCard בכרטיס ה-SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"לא ניתן לסרוק אחסון"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"לא ניתן לסרוק כרטיס SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"לא ניתן לסרוק את אמצעי האחסון. (סיבה: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"לא ניתן לסרוק את כרטיס ה-SD. (סיבה: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"שגיאת קלט/פלט"</string>
@@ -252,7 +245,8 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"הייצוא של <xliff:g id="FILENAME">%s</xliff:g> יתבצע תוך זמן קצר."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"הבקשה לייצוא ה-vCard נדחתה. נסה שוב מאוחר יותר."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"איש קשר"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <!-- no translation found for percentage (1887004062152632812) -->
+ <skip />
<string name="confirm_export_title" msgid="6834385377255286349">"לייצא את אנשי הקשר?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"רשימת אנשי הקשר שלך תיוצא לקובץ: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"לא ניתן לייצא"</string>
@@ -273,9 +267,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"יישום היצירה של ה-vCard לא הופעל כהלכה."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"לא ניתן לפתוח את \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> מתוך <xliff:g id="TOTAL_NUMBER">%s</xliff:g> אנשי קשר"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"מבטל יבוא של vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"לבטל את הייבוא של <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"מבטל יצוא של vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"לבטל את הייצוא של <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"לא ניתן לבטל ייבוא/ייצוא של vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"השמות של אנשי הקשר"</string>
@@ -291,8 +283,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"אנשי קשר להצגה"</string>
<string name="menu_import_export" msgid="26217871113229507">"ייבוא/ייצוא"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"יבא/יצא אנשי קשר"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"יבוא אנשי קשר"</string>
<string name="menu_share" msgid="943789700636542260">"שתף"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"כל אנשי הקשר"</string>
<string name="share_via" msgid="563121028023030093">"שתף איש קשר באמצעות"</string>
<string name="share_error" msgid="948429331673358107">"לא ניתן לשתף איש קשר זה."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"שם"</string>
@@ -441,9 +433,7 @@
<item quantity="other" msgid="425683718017380845">"מוזגו מ-<xliff:g id="COUNT">%0$d</xliff:g> מקורות"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"אחר"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"צרף אנשי קשר"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"לצרף את איש הקשר הנוכחי לאיש הקשר שנבחר?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"ערוך את אנשי הקשר שנבחרו"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"לעבור לעריכה של איש הקשר שנבחר? המידע שהזנת עד עכשיו יועתק."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"העתק אל \'אנשי הקשר שלי\'"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"הוסף ל\'אנשי הקשר שלי\'"</string>
@@ -475,10 +465,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"טוען..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"צור איש קשר חדש"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"היכנס לחשבון"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"ייבא אנשי קשר מקובץ"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"יבא אנשי קשר"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"צור קבוצה חדשה"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[צור קבוצה חדשה]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"מחק את הקבוצה"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"קבוצה אחת"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> קבוצות"</item>
@@ -497,7 +486,6 @@
<string name="set_default" msgid="4417505153468300351">"קבע כברירת מחדל"</string>
<string name="clear_default" msgid="7193185801596678067">"נקה ברירת מחדל"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"טקסט שהועתק"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"מחק שינויים"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"למחוק את השינויים שביצעת?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"הגדר את הפרופיל שלי"</string>
@@ -561,7 +549,7 @@
<string name="keep_local" msgid="1258761699192993322">"שמור באופן מקומי"</string>
<string name="add_account" msgid="8201790677994503186">"הוסף חשבון"</string>
<string name="add_new_account" msgid="5748627740680940264">"הוסף חשבון חדש"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"השיחה לא נשלחה."</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"המספר של הדואר הקולי אינו זמין"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"השיחה לא נשלחה."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"כדי להגדיר את הדואר הקולי, עבור אל \'תפריט\' > \'הגדרות\'."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"כדי להתקשר לדואר קולי, ראשית כבה את מצב הטיסה."</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index a96f32c..08ade99 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"検索"</string>
<string name="menu_newContact" msgid="1209922412763274638">"連絡先を新規登録"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"連絡先詳細"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"<xliff:g id="NAME">%s</xliff:g>に発信"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"<xliff:g id="NUMBER">%s</xliff:g>に発信"</string>
<string name="menu_addStar" msgid="2908478235715404876">"お気に入りに追加"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"お気に入りから削除"</string>
<string name="menu_editContact" msgid="9042415603857662633">"編集"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"連絡先候補"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"すべての連絡先"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"連絡先を結合しました"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"連絡先を削除しますか?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"着信音を設定"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"すべての通話をボイスメールへ"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"読み取り専用アカウントの連絡先は削除できません。ただし、連絡先リストで非表示にすることができます。"</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g>分<xliff:g id="SECONDS">%s</xliff:g>秒"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"よく使う連絡先"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"よく使う連絡先"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"連絡先を追加"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"<xliff:g id="EMAIL">%s</xliff:g> を連絡先に追加しますか?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"1"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"2"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"マイナス"</string>
<string name="description_plus_button" msgid="515164827856229880">"プラス"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"連絡先を表示"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"ストレージ使用不可"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"SDカードがありません"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"ストレージはありませんでした。"</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"SDカードが見つかりませんでした。"</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"vCardを検索中"</string>
<string name="import_from_sim" msgid="3859272228033941659">"SIMカードからインポート"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"ストレージからインポート"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"ストレージにエクスポート"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"すべてのvCardファイルをインポート"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"ストレージ内でvCardデータを検索しています..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"SDカードでvCardデータを検索しています..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"ストレージをスキャンできませんでした"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"SDカードをスキャンできませんでした"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"ストレージをスキャンできませんでした(理由: 「<xliff:g id="FAIL_REASON">%s</xliff:g>」)。"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SDカードをスキャンできませんでした(理由: 「<xliff:g id="FAIL_REASON">%s</xliff:g>」)。"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"送受信エラー"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g>はまもなくエクスポートされます。"</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"vCardのエクスポートリクエストは拒否されました。しばらくしてからもう一度お試しください。"</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"連絡先"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"エクスポートしますか?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"連絡先リストをファイル「<xliff:g id="VCARD_FILENAME">%s</xliff:g>」にエクスポートします。"</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"エクスポート失敗"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"vCardコンポーザーが正しく起動しませんでした。"</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"「<xliff:g id="FILE_NAME">%s</xliff:g>」を開けませんでした: <xliff:g id="EXACT_REASON">%s</xliff:g>。"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g>/<xliff:g id="TOTAL_NUMBER">%s</xliff:g>件のファイル"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"vCardインポートのキャンセル"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"<xliff:g id="FILENAME">%s</xliff:g>のインポートをキャンセルしますか?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"vCardエクスポートのキャンセル"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"<xliff:g id="FILENAME">%s</xliff:g>のエクスポートをキャンセルしますか?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"vCardインポート/エクスポート取り消し不可"</string>
<string name="search_settings_description" msgid="2675223022992445813">"連絡先の名前"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"表示する連絡先"</string>
<string name="menu_import_export" msgid="26217871113229507">"インポート/エクスポート"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"連絡先のインポート/エクスポート"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"連絡先のインポート"</string>
<string name="menu_share" msgid="943789700636542260">"共有"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"すべての連絡先"</string>
<string name="share_via" msgid="563121028023030093">"連絡先の共有ツール"</string>
<string name="share_error" msgid="948429331673358107">"この連絡先は共有できません。"</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"名前"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"<xliff:g id="COUNT">%0$d</xliff:g>件の連絡先が結合されました"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"その他"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"連絡先の統合"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"現在の連絡先を選択した連絡先に統合しますか?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"選択した連絡先の編集"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"選択した連絡先の編集に切り替えますか?これまでに入力した情報はコピーされます。"</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Myコンタクトにコピー"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Myコンタクトに追加"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"読み込んでいます..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"新しい連絡先を作成"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"アカウントにログイン"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"ファイルから連絡先をインポート"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"連絡先をインポート"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"新しいグループの作成"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[新しいグループを作成]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"グループの削除"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1グループ"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g>グループ"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"デフォルトに設定"</string>
<string name="clear_default" msgid="7193185801596678067">"デフォルトを解除"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"テキストをコピーしました"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"変更を破棄"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"変更を破棄しますか?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"プロフィールを設定"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"ローカルに保存"</string>
<string name="add_account" msgid="8201790677994503186">"アカウントを追加"</string>
<string name="add_new_account" msgid="5748627740680940264">"新しいアカウントを追加"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"発信できません"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"ボイスメールの番号を利用できません"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"発信できません"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ボイスメールをセットアップするには、MENUキー>[設定]をタップします。"</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"機内モードをOFFにしてからボイスメールを呼び出してください。"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index c0fd67d..a291f32 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"검색"</string>
<string name="menu_newContact" msgid="1209922412763274638">"새 연락처"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"연락처 보기"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"<xliff:g id="NAME">%s</xliff:g>님에게 전화걸기"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"<xliff:g id="NUMBER">%s</xliff:g>에 전화"</string>
<string name="menu_addStar" msgid="2908478235715404876">"즐겨찾기에 추가"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"즐겨찾기에서 삭제"</string>
<string name="menu_editContact" msgid="9042415603857662633">"수정"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"추천 연락처"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"모든 연락처"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"연락처 결합됨"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"연락처를 삭제하시겠습니까?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"벨소리 설정"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"음성사서함 자동 연결"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"연락처를 읽기 전용 계정에서 삭제할 수는 없지만 주소록에서 숨길 수는 있습니다."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g>분 <xliff:g id="SECONDS">%s</xliff:g>초"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"자주 연락하는 사람들의 연락처"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"자주 통화한 목록"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"연락처 추가"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\'<xliff:g id="EMAIL">%s</xliff:g>\'을(를) 주소록에 추가하겠습니까?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"1"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"2"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"빼기"</string>
<string name="description_plus_button" msgid="515164827856229880">"더하기"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"연락처 보기"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"저장장치 없음"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"SD 카드 없음"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"저장공간을 찾을 수 없습니다."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"SD 카드가 없습니다."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"vCard 검색"</string>
<string name="import_from_sim" msgid="3859272228033941659">"SIM 카드에서 가져오기"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"저장소에서 가져오기"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"저장소로 내보내기"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"모든 vCard 파일 가져오기"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"저장장치에서 vCard 데이터 검색 중..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"SD 카드의 vCard 데이터 검색 중..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"저장소를 검색하지 못했습니다."</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"SD 카드를 검색하지 못했습니다."</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"저장소를 검색할 수 없습니다(이유: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')."</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD 카드를 검색할 수 없습니다(이유: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')."</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O 오류"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g>을(를) 곧 내보냅니다."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"vCard 내보내기 요청이 거부되었습니다. 나중에 다시 시도해 주세요."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"연락처"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"주소록을 내보내시겠습니까?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"연락처 목록을 <xliff:g id="VCARD_FILENAME">%s</xliff:g> 파일로 내보냅니다."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"내보내기 실패"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"vCard 작성기가 제대로 시작되지 않았습니다."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"\'<xliff:g id="FILE_NAME">%s</xliff:g>\'을(를) 열 수 없습니다(이유: <xliff:g id="EXACT_REASON">%s</xliff:g>)."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"연락처 <xliff:g id="CURRENT_NUMBER">%s</xliff:g>개(총 <xliff:g id="TOTAL_NUMBER">%s</xliff:g>개) 내보내는 중"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"vCard 가져오기 취소 중"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"<xliff:g id="FILENAME">%s</xliff:g> 가져오기를 취소하시겠습니까?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"vCard 내보내기 취소 중"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"<xliff:g id="FILENAME">%s</xliff:g> 내보내기를 취소하시겠습니까?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"vCard 가져오기/내보내기를 취소하지 못했습니다."</string>
<string name="search_settings_description" msgid="2675223022992445813">"연락처 명단"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"표시할 연락처"</string>
<string name="menu_import_export" msgid="26217871113229507">"가져오기/내보내기"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"주소록 가져오기/내보내기"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"주소록 가져오기"</string>
<string name="menu_share" msgid="943789700636542260">"공유"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"모든 연락처"</string>
<string name="share_via" msgid="563121028023030093">"연락처 공유에 사용할 애플리케이션:"</string>
<string name="share_error" msgid="948429331673358107">"연락처를 공유할 수 없습니다."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"이름"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"<xliff:g id="COUNT">%0$d</xliff:g>개 출처에서 병합했습니다."</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"기타"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"연락처 통합"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"이 연락처와 선택한 연락처를 통합하시겠습니까?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"선택한 연락처 수정"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"선택한 연락처를 수정하시겠습니까? 지금까지 입력하신 정보는 복사됩니다."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"내 주소록에 복사"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"내 주소록에 추가"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"로드 중…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"새 연락처 만들기"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"계정에 로그인"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"파일에서 주소록 가져오기"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"주소록 가져오기"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"새 그룹 만들기"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[새 그룹 만들기]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"그룹 삭제"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"그룹 1개"</item>
<item quantity="other" msgid="1276758425904917367">"그룹 <xliff:g id="COUNT">%0$d</xliff:g>개"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"기본으로 설정"</string>
<string name="clear_default" msgid="7193185801596678067">"기본 설정 지우기"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"텍스트 복사됨"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"변경사항 취소"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"변경사항을 삭제하시겠습니까?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g> "</string>
<string name="profile_display_name" msgid="4127389543625918771">"내 프로필 설정"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"오프라인 보관"</string>
<string name="add_account" msgid="8201790677994503186">"계정 추가"</string>
<string name="add_new_account" msgid="5748627740680940264">"새 계정 추가"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"전화를 걸 수 없음"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"음성사서함 번호를 사용할 수 없음"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"전화를 걸 수 없음"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"음성사서함을 설정하려면 메뉴 > 설정으로 이동하세요."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"음성사서함에 메시지를 남기려면 먼저 비행기 모드를 해제하세요."</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 0145168..e4b0b1e 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Ieškoti"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Naujas adresatas"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Žiūrėti adresatą"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Skambinti <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Skambinti <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Pridėti prie adresyno"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Pašalinti iš adresyno"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Redaguoti"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Siūlomi adresatai"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Visi adresatai"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Sujungti adresatai"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Ištrinti kontaktą?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Nustat. sk. toną"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Visi skamb. į balso paštą"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Negalite ištrinti kontaktų iš tik skaitomų paskyrų, bet galite paslėpti juos savo kontaktų sąrašuose."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Dažnai susisiekiama"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Dažniausiai skambinta"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Pridėti adresatą"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Pridėti „<xliff:g id="EMAIL">%s</xliff:g>“ prie adresatų?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"vienas"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"du"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plius"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Peržiūrėti kontaktą"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Saugykla neprieinama"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nėra SD kortelės"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Nerasta jokių atmintinių."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Nerasta jokių SD kortelių."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Ieškoma „vCard“ kortelės"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importuoti iš SIM kortelės"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importuoti iš saugyklos"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Eksportuoti į saugyklą"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importuoti visus „VCard“ kortelės failus"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Ieškoma el. vizitinės kortelės duomenų saugykloje..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"SD kortelėje ieškoma el. vizitinės kortelės duomenų..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Nepavyko nuskaityti atminties"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Nepavyko nuskaityti SD kortelės"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Atmintinės negalima žvalgyti. (Priežastis: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD kortelės negalima žvalgyti. (Priežastis: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Įvesties / išvesties klaida"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> bus netrukus eksportuotas."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"El. vizitinės kortelės eksportavimo užklausa buvo atmesta. Bandykite vėliau."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontaktas"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Eksp. kontaktus?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Jūsų kontaktų sąrašas bus eksportuotas į failą „<xliff:g id="VCARD_FILENAME">%s</xliff:g>“."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Nepavyko eksportuoti"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"El. vizitinių kortelių rengyklė nebuvo tinkamai paleista."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Nepavyko atidaryti „<xliff:g id="FILE_NAME">%s</xliff:g>“: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> iš <xliff:g id="TOTAL_NUMBER">%s</xliff:g> adresatų"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Atšaukiamas el. vizitinės kortelės importavimas"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Atšaukti <xliff:g id="FILENAME">%s</xliff:g> importavimą?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Atšaukiamas el. vizitinės kortelės eksportavimas"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Atšaukti <xliff:g id="FILENAME">%s</xliff:g> eksportavimą?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Nepavyko atš. „vCard“ imp. / eksp."</string>
<string name="search_settings_description" msgid="2675223022992445813">"Adresatų vardai"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Pateiktini kontaktai"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importuoti / eksportuoti"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Import. / eksport. kont."</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importuoti kontaktus"</string>
<string name="menu_share" msgid="943789700636542260">"Bendrinti"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Visi kontaktai"</string>
<string name="share_via" msgid="563121028023030093">"Bendrinti adresatą naudojant"</string>
<string name="share_error" msgid="948429331673358107">"Šio kontakto negalima bendrinti."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Pavadinimas"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"sujungta iš <xliff:g id="COUNT">%0$d</xliff:g> šaltinių (-io)"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Kita"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Sujungti kontaktus"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Sujungti dabartinį kontaktą su pasirinktu?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Redaguoti pasirinktus kontaktus"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Perjungti į pasirinkto kontakto redagavimą? Iki šiol įvesta informacija bus nukopijuota."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopijuoti į „Mano kontaktus“"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Pridėti prie „Mano kontaktų“"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Įkeliama..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Sukurti naują kontaktą"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Prisijunkite prie paskyros"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importuoti kontaktus iš failo"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importuoti kontaktus"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Sukurti naują grupę"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Sukurti naują grupę]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Ištrinti grupę"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grupė"</item>
<item quantity="other" msgid="1276758425904917367">"Grupių: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Nustatyti numatytuosius nustatymus"</string>
<string name="clear_default" msgid="7193185801596678067">"Išvalyti numatytuosius nustatymus"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Tekstas nukopijuotas"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Atmesti pakeitimus"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Atmesti pakeitimus?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Nustatyti mano profilį"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Išsaug. kaip vietinį"</string>
<string name="add_account" msgid="8201790677994503186">"Pridėkite paskyrą"</string>
<string name="add_new_account" msgid="5748627740680940264">"Pridėkite naują paskyrą"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Skambutis neišsiųstas"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Balso pašto numeris nepasiekiamas"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Skambutis neišsiųstas"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Jei norite nustatyti balso paštą, eikite į „Meniu“ > „Nustatymai“."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Jei norite skambinti į balso paštą, išjunkite lėktuvo režimą."</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 50172d8..b662a04 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Meklēt"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Jauna kontaktpersona"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Skatīt kontaktpersonu"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Zvanīt: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Zvaniet: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Pievienot izlasei"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Noņemt no izlases"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Rediģēt"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Ieteiktās kontaktpersonas"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Visas kontaktpersonas"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kontaktpersonas ir apvienotas."</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Vai dzēst kontaktp.?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Iest. zv. sign."</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Visi zvani uz balss pastu"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Jūs nevarat dzēst kontaktpersonas no tikai lasāmiem kontiem, taču varat tās slēpt kontaktpersonu sarakstos."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Bieža saziņa"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Bieži zvanīti"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Pievienot kontaktpersonu"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Vai pievienot “<xliff:g id="EMAIL">%s</xliff:g>” kontaktpersonām?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"viens"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"divi"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"mīnuss"</string>
<string name="description_plus_button" msgid="515164827856229880">"pluss"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Skatīt kontaktpersonu"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"USB atmiņa nav pieejama"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nav SD kartes"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Netika atrasta atmiņa."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Netika atrasta SD karte."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"vCard faila meklēšana"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importēt no SIM kartes"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importēt no USB atmiņas"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Eksportēt uz USB atmiņu"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importēt visus vCard failus"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Notiek vCard datu meklēšana atmiņā..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Notiek vCard datu meklēšana SD kartē..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Nevarēja skenēt atmiņu."</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Nevarēja skenēt SD karti."</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Atmiņu nevarēja skenēt. (Iemesls: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD karti nevarēja skenēt. (Iemesls: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Ievades/izvades kļūda."</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Fails <xliff:g id="FILENAME">%s</xliff:g> tiks drīzumā eksportēts."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Tika noraidīts vCard faila eksportēšanas pieprasījums. Vēlāk mēģiniet vēlreiz."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontaktpersona"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Vai eksp. kontaktp.?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Kontaktpersonu saraksts tiks eksportēts uz failu <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Nevarēja eksportēt"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Netika pareizi startēts vCard veidotājs."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Nevarēja atvērt failu <xliff:g id="FILE_NAME">%s</xliff:g>: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> no <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontaktpersonas(-ām)"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"vCard importēšanas atcelšana"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Vai atcelt faila <xliff:g id="FILENAME">%s</xliff:g> importēšanu?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"vCard eksportēšanas atcelšana"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Vai atcelt faila <xliff:g id="FILENAME">%s</xliff:g> eksportēšanu?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Nevarēja atcelt vCard f. import./eksp."</string>
<string name="search_settings_description" msgid="2675223022992445813">"Kontaktpersonu vārdi"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Attēlojamās kontaktpersonas"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importēt/eksportēt"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"K. pers. imports/eksports"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Kontaktpersonu importēšana"</string>
<string name="menu_share" msgid="943789700636542260">"Kopīgot"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Visas kontaktpersonas"</string>
<string name="share_via" msgid="563121028023030093">"Kopīgot kontaktpersonu, izmantojot"</string>
<string name="share_error" msgid="948429331673358107">"Šo kontaktpersonu nevar kopīgot."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Vārds"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"sapludināts no <xliff:g id="COUNT">%0$d</xliff:g> avotiem"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Cits"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Kontaktpersonu savienošana"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Vai savienot pašreizējo saturu ar atlasīto kontaktpersonu?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Atlasīto kontaktpersonu rediģēšana"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Vai pāriet uz atlasītās kontaktpersonas rediģēšanu? Līdz šim ievadītā informācija tiks kopēta."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopēt uz manām kontaktpersonām"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Pievienot mapē Manas kontaktpersonas"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Notiek ielāde..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Izveidot jaunu kontaktpersonu"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Pierakstīties kontā"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importēt kontaktpersonas no faila"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importēt kontaktpersonas"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Jaunas grupas izveide"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Izveidot jaunu grupu]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Grupas dzēšana"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grupa"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grupas"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Iestatīt kā noklusējumu"</string>
<string name="clear_default" msgid="7193185801596678067">"Notīrīt noklusējuma iestatījumus"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Teksts ir nokopēts"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Atmest izmaiņas"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Vai atmest veiktās izmaiņas?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g><xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Iestatīt savu profilu"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Saglabāt vietēji"</string>
<string name="add_account" msgid="8201790677994503186">"Pievienot kontu"</string>
<string name="add_new_account" msgid="5748627740680940264">"Pievienot jaunu kontu"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Nenosūtīts zvans"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Nepieejams balss pasta numurs"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Nenosūtīts zvans"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Lai iestatītu balss pastu, atveriet sadaļu Izvēlne > Iestatījumi."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Lai piezvanītu balss pastam, vispirms izslēdziet lidojuma režīmu."</string>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 2a6190f..ea09fbb 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Cari"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Kenalan baru"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Papar kenalan"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Panggil <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Panggil <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Tambah ke kegemaran"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Alih keluar daripada kegemaran"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Edit"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Kenalan cadangan"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Semua kenalan"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kenalan digabungkan"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Padamkan kenalan?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Ttpkn nd dering"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Semua panggilan ke mel suara"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Anda tidak boleh memadamkan kenalan daripada akaun baca sahaja, tetapi anda boleh menyembunyikan mereka dalam senarai kenalan anda."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> saat"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Kerap dihubungi"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Kerap dipanggil"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Tambah kenalan"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Tambah \"<xliff:g id="EMAIL">%s</xliff:g>\" kepada kenalan?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"satu"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dua"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"tolak"</string>
<string name="description_plus_button" msgid="515164827856229880">"tambah"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Lihat kenalan"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Storan tidak tersedia"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Tiada kad SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Tiada storan ditemui."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Tiada kad SD ditemui."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Mencari vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Import daripada kad SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Import dari storan"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Eksport ke storan"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Import semua fail vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Mencari data vCard pada storan..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Mencari data vCard pada kad SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Tidak dapat mengimbas storan"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Tidak dapat mengimbas kad SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Storan tidak boleh diimbas. (Alasan: \" <xliff:g id="FAIL_REASON">%s</xliff:g> \")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Kad SD tidak boleh diimbas. (Alasan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Ralat I/O"</string>
@@ -254,7 +247,8 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> akan dieksport sebentar lagi."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Permintaan eksport vCard telah ditolak. Cuba lagi nanti."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kenalan"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <!-- no translation found for percentage (1887004062152632812) -->
+ <skip />
<string name="confirm_export_title" msgid="6834385377255286349">"Eksport kenalan?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Senarai kenalan anda akan dieksport ke: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Tidak boleh mengeksport"</string>
@@ -275,9 +269,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Komposer vCard tidak bermula dengan betul."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Tidak dapat membuka \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> daripada <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kenalan"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Membatalkan mengimport vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Batalkan pengimportan <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Membatalkan mengeksport vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Batalkan pengeksportan <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Tidak dapat membatalkan import/eksport vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Nama kenalan anda"</string>
@@ -293,8 +285,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kenalan untuk dipaparkan"</string>
<string name="menu_import_export" msgid="26217871113229507">"Import/eksport"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Import/Eksport kenalan"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Import kenalan"</string>
<string name="menu_share" msgid="943789700636542260">"Kongsi"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Semua kenalan"</string>
<string name="share_via" msgid="563121028023030093">"Kongsi gambar melalui"</string>
<string name="share_error" msgid="948429331673358107">"Kenalan ini tidak boleh dikongsi."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nama"</string>
@@ -443,9 +435,7 @@
<item quantity="other" msgid="425683718017380845">"digabungkan daripada <xliff:g id="COUNT">%0$d</xliff:g> sumber"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Lain-lain"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Gabungkan kenalan"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Gabungkan kenalan semasa dengan kenalan pilihan?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Edit kenalan pilihan"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Bertukar kepada mengedit kenalan pilihan? Maklumat yang anda masukkan setakat ini akan disalin."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Salin ke Kenalan Saya"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Tambahkan pada Kenalan Saya"</string>
@@ -477,10 +467,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Memuatkan…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Buat kenalan baru"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Log masuk ke akaun"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Import kenalan dari fail"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Import kenalan"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Buat kumpulan baru"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Buat kumpulan baru]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Padam kumpulan"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 kumpulan"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> kumpulan"</item>
@@ -499,7 +488,6 @@
<string name="set_default" msgid="4417505153468300351">"Tetapkan lalai"</string>
<string name="clear_default" msgid="7193185801596678067">"Kosongkan lalai"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Teks disalin"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Buang perubahan"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Buang perubahan anda?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Sediakan profil saya"</string>
@@ -563,7 +551,7 @@
<string name="keep_local" msgid="1258761699192993322">"Simpan setempat"</string>
<string name="add_account" msgid="8201790677994503186">"Tambah akaun"</string>
<string name="add_new_account" msgid="5748627740680940264">"Tambah akaun baharu"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Panggilan tidak dihantar"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Nombor mel suara tidak tersedia"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Panggilan tidak dihantar"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Untuuk menyediakan mel suara, pergi ke Menu > Tetapan."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Untuk membuat panggilan ke mel suara, mula-mula matikan mod Pesawat."</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 37e4946..9994ce8 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Søk"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Ny kontakt"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Se på kontakt"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Ring <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Ring <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Legg til som favoritt"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Fjern fra favoritter"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Rediger"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Forslag"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle kontakter"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kontaktene er forent"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Slette kontakten?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Angi ringetone"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Alle samtaler til talepost"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Du kan ikke slette kontakter fra skrivebeskyttede kontoer, men du kan skjule dem i kontaktlisten."</string>
@@ -89,7 +88,7 @@
</string-array>
<string name="photoPickerNotFoundText" product="tablet" msgid="6247290728908599701">"Ingen bilder er tilgjengelige på nettbrettet."</string>
<string name="photoPickerNotFoundText" product="default" msgid="431331662154342581">"Det er ingen bilder på telefonen."</string>
- <string name="attach_photo_dialog_title" msgid="5599827035558557169">"Kontaktens bilde"</string>
+ <string name="attach_photo_dialog_title" msgid="5599827035558557169">"Kontaktbilde"</string>
<string name="customLabelPickerTitle" msgid="1081475101983255212">"Egendefinert etikett"</string>
<string name="send_to_voicemail_checkbox" msgid="9001686764070676353">"Send anrop direkte til telefonsvarer."</string>
<string name="removePhoto" msgid="4898105274130284565">"Fjern bilde"</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> sek"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Ofte kontaktet"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Ofte oppringt"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Legg til kontakt"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Legg til «<xliff:g id="EMAIL">%s</xliff:g>» som kontakt?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"en"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"to"</string>
@@ -205,15 +203,12 @@
<string name="description_dial_button" msgid="1274091017188142646">"ring"</string>
<string name="description_delete_button" msgid="6263102114033407382">"tilbaketast"</string>
<string name="description_digits_edittext" msgid="8760207516497016437">"ring til"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"kontaktens bilde"</string>
+ <string name="description_contact_photo" msgid="3387458082667894062">"kontaktbilde"</string>
<string name="description_minus_button" msgid="387136707700230172">"minusknapp"</string>
<string name="description_plus_button" msgid="515164827856229880">"plussknapp"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Se kontakt"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Lagring utilgjengelig"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Mangler minnekort"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Finner ikke lagringsplass."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Finner ikke SD-kort."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Leter etter VCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importér fra SIM-kort"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importér fra lagring"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Eksportér til lagring"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importer alle vCard-filer"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Søker etter vCard-data i lagringsenheten …"</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Søker etter vCard-data på SD-kortet …"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Kunne ikke skanne lagring"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Kunne ikke skanne SD-kort"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Lagringsenheten kunne ikke skannes. (Grunn: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD-kortet kan ikke skannes. (Grunn: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Inn-/ut-feil"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> vil eksporteres snart."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Forespørselen om eksport av vCard ble avvist. Prøv på nytt senere."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontakt"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Eksp. kontaktene?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Kontaktlisten din blir eksportert til: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Eksport mislyktes"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"vCard-oppretteren startet ikke som den skulle."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Kan ikke åpne «<xliff:g id="FILE_NAME">%s</xliff:g>»: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> av <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontakter"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Avbryt import av vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Vil du avbryte importen av <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Avbryt eksport av vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Vil du avbryte eksporten av <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Kunne ikke kansellere imp./eksp. av vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Navn på kontakter"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakter i visning"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importér/eksportér"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Imp./eksp. kontakter"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importer kontakter"</string>
<string name="menu_share" msgid="943789700636542260">"Del"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Alle kontakter"</string>
<string name="share_via" msgid="563121028023030093">"Del kontakt via"</string>
<string name="share_error" msgid="948429331673358107">"Denne kontakten kan ikke deles."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Navn"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"sammenslått fra <xliff:g id="COUNT">%0$d</xliff:g> kilder"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Andre"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Slå sammen kontakter"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Slå sammen gjeldende kontakt med valgt kontakt?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Rediger valgte kontakter"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Bytt til redigering av gjeldende kontakt? Informasjonen du har lagt til så langt blir kopiert."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopiér til mine kontakter"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Legg til i Mine kontakter"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Laster inn …"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Opprett en ny kontakt"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Logg deg på en konto"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importer kontakter fra en fil"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importer kontakter"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Opprett ny gruppe"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Opprett ny gruppe]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Slett gruppe"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"Én gruppe"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grupper"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Angi som standard"</string>
<string name="clear_default" msgid="7193185801596678067">"Fjern som standard"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Tekst kopiert"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Forkast endringer"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Vil du forkaste endringene?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Konfigurer profilen min"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Behold lokalt"</string>
<string name="add_account" msgid="8201790677994503186">"Legg til konto"</string>
<string name="add_new_account" msgid="5748627740680940264">"Legg til ny konto"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Anrop ikke foretatt"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Talepostkassenummer utilgjengelig"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Anrop ikke utført"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Du konfigurerer talepost ved å gå til Meny &gt Innstillinger"</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Du må slå av flymodus før du kan sjekke talepostkassen."</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index b4a7617..9d67eec 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Zoeken"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Nieuw contact"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Contact weergeven"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"<xliff:g id="NAME">%s</xliff:g> bellen"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Bel <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Toevoegen aan favorieten"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Uit favorieten verwijderen"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Bewerken"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Mogelijke contacten"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle contacten"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Contacten zijn samengevoegd"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Contact verwijderen?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Beltoon instellen"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Alle oproepen naar voicemail"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"U kunt contacten niet verwijderen uit alleen-lezen-accounts, maar u kunt ze verbergen in uw contactenlijst."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sec."</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Regelmatig contact"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Vaak gebeld"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Contact toevoegen"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Voeg \"<xliff:g id="EMAIL">%s</xliff:g>\" toe aan contactpersonen?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"één"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"twee"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"min"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Contact weergeven"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Opslag niet beschikbaar"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Geen SD-kaart"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Er is geen opslag gevonden."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Geen SD-kaart gevonden."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Zoeken naar vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importeren van SIM-kaart"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importeren uit opslag"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exporteren naar opslag"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Alle vCard-bestanden importeren"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Zoeken naar vCard-gegevens in opslag..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Zoeken naar vCard-gegevens op SD-kaart..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Kan opslag niet scannen"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Kan SD-kaart niet scannen"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"De opslag kan niet worden gescand. (Reden: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"De SD-kaart kan niet worden gescand. (Reden: \'<xliff:g id="FAIL_REASON">%s</xliff:g>\')"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O-fout"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> wordt binnenkort geëxporteerd."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Verzoek voor vCard-export is geweigerd. Probeer het later opnieuw."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contact"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Contacten export.?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Uw lijst met contacten wordt geëxporteerd naar het bestand: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Kan niet exporteren"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"De vCard-editor is niet correct gestart."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Kan \'<xliff:g id="FILE_NAME">%s</xliff:g>\' niet openen: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> van <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contacten"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Importeren van vCard annuleren"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Import van <xliff:g id="FILENAME">%s</xliff:g> annuleren?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Exporteren van vCard annuleren"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Export van <xliff:g id="FILENAME">%s</xliff:g> annuleren?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Kan vCard-import/export niet annuleren"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Namen van uw contacten"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Zichtbare contacten"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importeren/exporteren"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Contacten importeren/exporteren"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Contacten importeren"</string>
<string name="menu_share" msgid="943789700636542260">"Delen"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Alle contacten"</string>
<string name="share_via" msgid="563121028023030093">"Contact delen via"</string>
<string name="share_error" msgid="948429331673358107">"Dit contact kan niet worden gedeeld."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Naam"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"samengevoegd uit <xliff:g id="COUNT">%0$d</xliff:g> bronnen"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Overig"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Contacten samenvoegen"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Wilt u het huidige contact samenvoegen met het geselecteerde contact?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Geselecteerde contacten bewerken"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Wilt u overschakelen naar het bewerken van het geselecteerde contact? Gegevens die u tot nu toe heeft ingevoerd, worden gekopieerd."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopiëren naar mijn contacten"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Toevoegen aan Mijn contacten"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Laden..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Een nieuw contact maken"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Aanmelden bij een account"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Contacten importeren uit een bestand"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Contacten importeren"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Nieuwe groep maken"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Nieuwe groep maken]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Groep verwijderen"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 groep"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> groepen"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Standaard instellen"</string>
<string name="clear_default" msgid="7193185801596678067">"Standaardwaarden wissen"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Tekst gekopieerd"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Wijzigingen annuleren"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Uw wijzigingen annuleren?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Mijn profiel instellen"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Lokaal opslaan"</string>
<string name="add_account" msgid="8201790677994503186">"Account toevoegen"</string>
<string name="add_new_account" msgid="5748627740680940264">"Nieuw account toevoegen"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Oproep niet verzonden"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Voicemailnummer niet beschikbaar"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Oproep niet uitgevoerd"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Voor het instellen van voicemail, gaat u naar \'Menu\' > \'Instellingen\'."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Als u uw voicemail wilt bellen, moet u eerst de Vliegmodus uitschakelen."</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index de6c6bd..cbe931c 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Szukaj"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Nowy kontakt"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Wyświetl kontakt"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Zadzwoń do: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Zadzwoń: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Dodaj do ulubionych"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Usuń z ulubionych"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Edytuj"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Sugerowane kontakty"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Wszystkie kontakty"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kontakty zostały połączone"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Usunąć kontakt?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Ustaw dzwonek"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Łącz na pocztę głosową"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Nie możesz usunąć kontaktów z kont tylko do odczytu, ale możesz ukryć je na swoich listach kontaktów."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Częste kontakty"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Częste połączenia"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Dodaj kontakt"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Czy dodać adres „<xliff:g id="EMAIL">%s</xliff:g>” do kontaktów?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"jeden"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dwa"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Wyświetl kontakt"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Nośnik nie jest dostępny"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Brak karty SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Nie znaleziono nośnika."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Nie znaleziono karty SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Wyszukiwanie danych vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importuj z karty SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importuj z nośnika"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Eksportuj na nośnik"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importuj wszystkie pliki vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Wyszukiwanie danych vCard na nośniku…"</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Wyszukiwanie danych vCard na karcie SD…"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Nie można przeskanować pamięci"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Nie można przeskanować karty SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Nie można przejrzeć nośnika. (Przyczyna: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Nie można przejrzeć karty SD. (Przyczyna: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Błąd wejścia/wyjścia"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Plik <xliff:g id="FILENAME">%s</xliff:g> zostanie za chwilę wyeksportowany."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Żądanie eksportu danych vCard zostało odrzucone. Spróbuj ponownie później."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontakt"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Eksport kontaktów?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Lista kontaktów zostanie wyeksportowana do pliku: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Eksport nieudany"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Obiekt tworzenia danych vCard nie został uruchomiony poprawnie."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Nie można otworzyć pliku „<xliff:g id="FILE_NAME">%s</xliff:g>”: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"Kontakt <xliff:g id="CURRENT_NUMBER">%s</xliff:g> z <xliff:g id="TOTAL_NUMBER">%s</xliff:g>"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Anulowanie importowania pliku vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Anulować import: <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Anulowanie eksportowania pliku vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Anulować eksport: <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Nie można anulować importu/eksportu vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Imiona i nazwiska oraz nazwy w Twoich kontaktach"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakty do wyświetlenia"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importuj/eksportuj"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Importuj/eksportuj kontakty"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importuj kontakty"</string>
<string name="menu_share" msgid="943789700636542260">"Udostępnij"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Wszystkie kontakty"</string>
<string name="share_via" msgid="563121028023030093">"Udostępnij kontakt przez"</string>
<string name="share_error" msgid="948429331673358107">"Tego kontaktu nie można udostępniać."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nazwa"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"scalono z <xliff:g id="COUNT">%0$d</xliff:g> źródeł"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Inne"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Połącz kontakty"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Czy połączyć bieżący kontakt z wybranym?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Edytuj wybrane kontakty"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Czy chcesz edytować wybrany kontakt? Wprowadzone dotąd informacje zostaną skopiowane."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopiuj do moich kontaktów"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Dodaj do moich kontaktów"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Wczytywanie…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Utwórz nowy kontakt"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Zaloguj się na konto"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Zaimportuj kontakty z pliku"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importuj kontakty"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Utwórz nową grupę"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Utwórz nową grupę]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Usuń grupę"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grupa"</item>
<item quantity="other" msgid="1276758425904917367">"Grupy: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Ustaw jako wartość domyślną"</string>
<string name="clear_default" msgid="7193185801596678067">"Wyczyść wartość domyślną"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Tekst skopiowany"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Odrzuć zmiany"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Odrzucić zmiany?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Konfiguruj profil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Przechowuj lokalnie"</string>
<string name="add_account" msgid="8201790677994503186">"Dodaj konto"</string>
<string name="add_new_account" msgid="5748627740680940264">"Dodaj nowe konto"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Połączenie nie zostało zrealizowane"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Numer poczty głosowej niedostępny"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Połączenie nie zostało zrealizowane"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Aby skonfigurować pocztę głosową, przejdź do Menu > Ustawienia."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Aby połączyć się z pocztą głosową, najpierw wyłącz tryb samolotowy."</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 72be05f..223a2ce 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Pesquisar"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Novo contacto"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Visualizar contacto"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Ligar a <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Telefonar para <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Adicionar aos favoritos"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Remover dos favoritos"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Editar"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contactos sugeridos"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Todos os contactos"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Contactos associados"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Eliminar contacto?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Definir toque"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Todas chm. para corr. de voz"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Não pode eliminar contactos de contas só de leitura, mas pode ocultá-los nas suas listas de contactos."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> seg"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Contactos frequentes"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Números de marcação frequente"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Adicionar contacto"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Adicionar \"<xliff:g id="EMAIL">%s</xliff:g>\" aos contactos?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"um"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dois"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"menos"</string>
<string name="description_plus_button" msgid="515164827856229880">"mais"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Ver contacto"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Armazen. indisponível"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nenhum cartão SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Nenhum armazen. encontrado."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Não foi encontrado nenhum cartão SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"A procurar vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importar do cartão SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importar do armazenamento"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exportar para o armazen."</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importar todos os ficheiros VCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"A pesquisar dados de vCard no armazenamento..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"A pesquisar dados de vCard no cartão SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Não foi possível analisar o armazenamento"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Não foi possível analisar o cartão SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Não foi possível analisar o armazenamento. (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Não foi possível analisar o cartão SD. (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Erro de E/S"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> será exportado em breve."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"O pedido de exportação do vCard foi rejeitado. Tente novamente mais tarde."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contacto"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Exportar contactos?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"A sua lista de contactos será exportada para o ficheiro: <xliff:g id="VCARD_FILENAME">%s</xliff:g> ."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Impossível exportar"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"O compositor vCard não iniciou corretamente."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Não foi possível abrir \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> de <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contactos"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"A cancelar importação do vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Cancelar a importação de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"A cancelar exportação do vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Cancelar a exportação de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Imposs. cancel. import./export. do vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Nomes dos contactos"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Contactos a apresentar"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importar/exportar"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Importar/export. contactos"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importar contactos"</string>
<string name="menu_share" msgid="943789700636542260">"Partilhar"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Todos os contactos"</string>
<string name="share_via" msgid="563121028023030093">"Partilhar contacto através de"</string>
<string name="share_error" msgid="948429331673358107">"Não é possível partilhar este contacto."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nome"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"intercalado a partir de <xliff:g id="COUNT">%0$d</xliff:g> origens"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Outro"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Associar contactos"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Associar o contacto actual ao contacto selecionado?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Editar contactos seleccionados"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Alternar para edição do contacto selecionado? A informação introduzida até agora vai ser copiada."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Copiar para Os Meus Contactos"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Adicionar aos Meus Contactos"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"A carregar…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Criar novo contacto"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Iniciar sessão numa conta"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importar contactos de um ficheiro"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importar contactos"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Criar novo grupo"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Criar novo grupo]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Eliminar grupo"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grupo"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grupos"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Definir a predefinição"</string>
<string name="clear_default" msgid="7193185801596678067">"Limpar predefinição"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Texto copiado"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Rejeitar alterações"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Rejeitar as suas alterações?"</string>
<string name="call_type_and_date" msgid="1766269584078149149"></string>
<string name="profile_display_name" msgid="4127389543625918771">"Configurar o meu perfil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Manter localmente"</string>
<string name="add_account" msgid="8201790677994503186">"Adicionar conta"</string>
<string name="add_new_account" msgid="5748627740680940264">"Adicionar nova conta"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Chamada não efetuada"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Número do correio de voz indisponível"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Chamada não efetuada"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Para configurar o correio de voz, aceda a Menu > Definições."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Para efetuar uma chamada para o correio de voz, desative primeiro o Modo de avião."</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 4457755..9a9287b 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Pesquisa"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Novo contato"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Ver contato"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Chamar <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Ligar para <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Adicionar aos favoritos"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Remover dos favoritos"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Editar"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contatos sugeridos"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Todos os contatos"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Contatos unificados"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Excluir contato?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Definir toque"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Todas as cham. p/ correio voz"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Não é possível excluir os contatos das contas somente leitura, mas você pode ocultá-los nas suas listas de contatos."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Chamados frequentemente"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Frequentemente chamado"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Adicionar contato"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Adicionar \"<xliff:g id="EMAIL">%s</xliff:g>\" aos contatos?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"um"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dois"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"menos"</string>
<string name="description_plus_button" msgid="515164827856229880">"mais"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Visualizar contato"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Armazenamento não disponível"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nenhum cartão SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Nenhum armazenamento foi encontrado."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Nenhum cartão SD foi encontrado."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Pesquisando vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importar do cartão SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importar do armazenamento"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exportar para o armazenamento"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importar todos os arquivos do vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Procurando dados do vCard no armazenamento..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Procurando dados do vCard no cartão SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Não foi possível verificar o armazenamento"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Não foi possível verificar o cartão SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Não foi possível verificar o armazenamento. (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Não foi possível ler o cartão SD. (Motivo: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Erro E/S"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> será exportado em breve."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Pedido de exportação vCard foi rejeitado. Tente novamente mais tarde."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contato"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Exportar contatos?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Sua lista de contatos será exportada para o arquivo: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Não foi possível exportar"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"O criador do vCard não iniciou corretamente."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Não foi possível abrir \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> de <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contatos"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Cancelando a importação do vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Cancelar importação de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Cancelando a exportação do vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Cancelar exportação de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Não foi poss. canc. imp./export. vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Nomes dos seus contatos"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Contatos para exibição"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importar/exportar"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Importar/Exportar contatos"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importar contatos"</string>
<string name="menu_share" msgid="943789700636542260">"Compartilhar"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Todos os contatos"</string>
<string name="share_via" msgid="563121028023030093">"Compartilhar contato via"</string>
<string name="share_error" msgid="948429331673358107">"Este contato não pode ser compartilhado."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nome"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"mesclado a partir de <xliff:g id="COUNT">%0$d</xliff:g> origens"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Outros"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Unir contatos"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Unir o contato atual ao contato selecionado?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Editar contatos selecionados"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Alternar para a edição do contato selecionado? As informações inseridas até agora serão copiadas."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Copiar para Meus contatos"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Adicionar a Meus contatos"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Carregando…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Criar um novo contato"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Faça login em uma conta"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importar contatos de um arquivo"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importar contatos"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Criar um novo grupo"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Criar um novo grupo]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Excluir grupo"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"Um grupo"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grupos"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Definir padrão"</string>
<string name="clear_default" msgid="7193185801596678067">"Limpar padrão"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Texto copiado"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Descartar alterações"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Descartar as alterações?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g> "</string>
<string name="profile_display_name" msgid="4127389543625918771">"Configurar meu perfil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Manter localmente"</string>
<string name="add_account" msgid="8201790677994503186">"Adicionar conta"</string>
<string name="add_new_account" msgid="5748627740680940264">"Adicionar nova conta"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Chamada não realizada"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Número de correio de voz indisponível"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Chamada não realizada"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Para configurar o correio de voz, vá para Menu > Configurações."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Para chamar o correio de voz, primeiro desative o modo avião."</string>
</resources>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index c68d667..58d1659 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -47,7 +47,8 @@
<string name="menu_search" msgid="9147752853603483719">"Tschertgar"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Nov contact"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Mussar il contact"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Telefonar a(d) <xliff:g id="NAME">%s</xliff:g>"</string>
+ <!-- no translation found for menu_callNumber (997146291983360266) -->
+ <skip />
<string name="menu_addStar" msgid="2908478235715404876">"Agiuntar als favurits"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Allontanar dals favurits"</string>
<!-- no translation found for menu_editContact (9042415603857662633) -->
@@ -77,8 +78,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contacts proponids"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tut ils contacts"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Contacts unids"</string>
- <!-- no translation found for deleteConfirmation_title (1418215926447642260) -->
- <skip />
<!-- no translation found for menu_set_ring_tone (8728345772068064946) -->
<skip />
<!-- no translation found for menu_redirect_calls_to_vm (4181789196416396656) -->
@@ -245,7 +244,6 @@
<skip />
<!-- no translation found for favoritesFrequentCalled (6128306889600696124) -->
<skip />
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Agiuntar in contact"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Agiuntar «<xliff:g id="EMAIL">%s</xliff:g>» als contacts?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"in"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dus"</string>
@@ -271,14 +269,10 @@
<!-- no translation found for description_view_contact_detail (9133251213656414807) -->
<!-- no translation found for description_view_contact_detail (2795575601596468581) -->
<skip />
- <!-- no translation found for no_sdcard_title (8543619259870877473) -->
- <skip />
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Nagina carta SD"</string>
<!-- no translation found for no_sdcard_message (5242558018442357189) -->
<skip />
<!-- no translation found for no_sdcard_message (3357810406684913482) -->
<skip />
- <string name="searching_vcard_title" msgid="4970508055399376813">"Tschertgar datas vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importar da la carta SIM"</string>
<!-- no translation found for import_from_sdcard (8668347930577565175) -->
<skip />
@@ -292,10 +286,6 @@
<skip />
<!-- no translation found for searching_vcard_message (3962269894118092049) -->
<skip />
- <!-- no translation found for scanning_sdcard_failed_title (4944932641334764942) -->
- <skip />
- <!-- no translation found for scanning_sdcard_failed_title (6664940444476572612) -->
- <skip />
<!-- no translation found for scanning_sdcard_failed_message (7221682312959229201) -->
<skip />
<!-- no translation found for scanning_sdcard_failed_message (189023067829510792) -->
@@ -348,7 +338,8 @@
<skip />
<!-- no translation found for vcard_unknown_filename (7171709890959915954) -->
<skip />
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <!-- no translation found for percentage (1887004062152632812) -->
+ <skip />
<!-- no translation found for confirm_export_title (6834385377255286349) -->
<skip />
<!-- no translation found for confirm_export_message (2423421354816428708) -->
@@ -387,12 +378,8 @@
<!-- no translation found for fail_reason_could_not_open_file (2067725459821997463) -->
<skip />
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> da <xliff:g id="TOTAL_NUMBER">%s</xliff:g> contacts"</string>
- <!-- no translation found for cancel_import_confirmation_title (5578683596010294836) -->
- <skip />
<!-- no translation found for cancel_import_confirmation_message (3929951040347726757) -->
<skip />
- <!-- no translation found for cancel_export_confirmation_title (6516467140276768528) -->
- <skip />
<!-- no translation found for cancel_export_confirmation_message (1995462401949262638) -->
<skip />
<!-- no translation found for cancel_vcard_import_or_export_failed (6139900383366166706) -->
@@ -416,9 +403,9 @@
<skip />
<!-- no translation found for dialog_import_export (4360648034889921624) -->
<skip />
- <string name="menu_share" msgid="943789700636542260">"Cundivider"</string>
- <!-- no translation found for menu_all_contacts (5101735431586050711) -->
+ <!-- no translation found for dialog_import (2431698729761448759) -->
<skip />
+ <string name="menu_share" msgid="943789700636542260">"Cundivider"</string>
<string name="share_via" msgid="563121028023030093">"Cundivider in contact sur"</string>
<!-- no translation found for share_error (948429331673358107) -->
<skip />
@@ -602,12 +589,8 @@
<item quantity="other" msgid="425683718017380845">"1 contact fusiunà ord <xliff:g id="COUNT">%0$d</xliff:g> funtaunas"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Auter"</string>
- <!-- no translation found for aggregation_suggestion_join_dialog_title (5276699501316246253) -->
- <skip />
<!-- no translation found for aggregation_suggestion_join_dialog_message (3842757977671434836) -->
<skip />
- <!-- no translation found for aggregation_suggestion_edit_dialog_title (1064042382692091314) -->
- <skip />
<!-- no translation found for aggregation_suggestion_edit_dialog_message (6549585283910518095) -->
<skip />
<!-- no translation found for menu_copyContact (1573960845106822639) -->
@@ -671,14 +654,12 @@
<skip />
<!-- no translation found for contacts_unavailable_add_account (7911101713860139754) -->
<skip />
- <!-- no translation found for contacts_unavailable_import_contacts (4456440183590517471) -->
+ <!-- no translation found for contacts_unavailable_import_contacts (4957393255392437529) -->
<skip />
<!-- no translation found for create_group_dialog_title (6874527142828424475) -->
<skip />
<!-- no translation found for create_group_item_label (5218022006186243310) -->
<skip />
- <!-- no translation found for delete_group_dialog_title (7368429698398624427) -->
- <skip />
<!-- no translation found for num_groups_in_account:one (2944819210288517794) -->
<!-- no translation found for num_groups_in_account:other (1276758425904917367) -->
<!-- no translation found for delete_group_dialog_message (7586856514337560529) -->
@@ -697,8 +678,6 @@
<skip />
<!-- no translation found for toast_text_copied (5143776250008541719) -->
<skip />
- <!-- no translation found for cancel_confirmation_dialog_title (3950463632415908534) -->
- <skip />
<!-- no translation found for cancel_confirmation_dialog_message (5885724679874403115) -->
<skip />
<!-- no translation found for call_type_and_date (1766269584078149149) -->
@@ -820,11 +799,11 @@
<skip />
<!-- no translation found for add_new_account (5748627740680940264) -->
<skip />
- <!-- no translation found for dialog_phone_call_prohibited_title (2111395432187079579) -->
- <!-- no translation found for dialog_phone_call_prohibited_title (4313552620858880999) -->
- <skip />
- <!-- no translation found for dialog_voicemail_not_ready_title (7258109862329777060) -->
+ <!-- no translation found for dialog_phone_call_prohibited_message (6554711866586660441) -->
+ <!-- no translation found for dialog_phone_call_prohibited_message (4313552620858880999) -->
<skip />
<!-- no translation found for dialog_voicemail_not_ready_message (4384716252789515378) -->
<skip />
+ <!-- no translation found for dialog_voicemail_airplane_mode_message (530922773669546093) -->
+ <skip />
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 0133be3..7e2eb45 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Căutaţi"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Persoană nouă în agendă"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Vizualizaţi persoana din agendă"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Apelaţi <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Apelaţi <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Adăugaţi la lista de favorite"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Eliminaţi din lista de favorite"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Editaţi"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Persoane din agendă sugerate"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Toate persoanele din agendă"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Persoanele din agendă au fost unite"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Ştergeţi contactul?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Setaţi ton apel"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Toate apel. către mesag. voc."</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Nu puteţi şterge persoane din agendă, din conturi cu permisiuni doar de citire, însă puteţi să le ascundeţi în lista dvs. de persoane din agendă."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> m <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Frecvent contactate"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Frecvent apelate"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Adăugaţi o persoană în agendă"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Adăugaţi „<xliff:g id="EMAIL">%s</xliff:g>” la persoanele din agendă?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"unu"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"doi"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Afişaţi persoana din agendă"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Stocare indisponibilă"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Niciun card SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Nu s-a găsit o stocare."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Nu s-a găsit un card SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Se caută date în format vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importaţi de pe cardul SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importaţi din stocare"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exportaţi în stocare"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importaţi toate fişierele vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Se caută date vCard în spaţiul de stocare..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Se caută date vCard pe cardul SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Nu s-a putut scana stocarea"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Nu s-a putut scana cardul SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Stocarea nu s-a putut scana. (Motivul: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Cardul SD nu a putut fi scanat. (Motivul: „<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Eroare I/O"</string>
@@ -252,7 +245,8 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> va fi exportat în curând."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Solicitarea de exportare a fişierului vCard a fost respinsă. Încercaţi din nou mai târziu."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contact"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <!-- no translation found for percentage (1887004062152632812) -->
+ <skip />
<string name="confirm_export_title" msgid="6834385377255286349">"Exportaţi Agenda?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Lista dvs. cu persoane de contact va fi exportată în fişierul: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Nu s-a putut exporta"</string>
@@ -273,9 +267,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Compozitorul vCard nu a pornit în mod corespunzător."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Nu s-a putut deschide fişierul „<xliff:g id="FILE_NAME">%s</xliff:g>”: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> din <xliff:g id="TOTAL_NUMBER">%s</xliff:g> (de) persoane din agendă"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Se anulează importul vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Anulaţi importul fişierului <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Se anulează exportul vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Anulaţi exportul fişierului <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Anulare import/export vCard nereuşită"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Numele persoanelor din agenda dvs."</string>
@@ -291,8 +283,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Persoane de contact de afişat"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importaţi/exportaţi"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Import/export contacte"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importaţi Agenda"</string>
<string name="menu_share" msgid="943789700636542260">"Distribuiţi"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Toată agenda"</string>
<string name="share_via" msgid="563121028023030093">"Distribuiţi persoana din agendă prin"</string>
<string name="share_error" msgid="948429331673358107">"Această persoană de contact nu poate fi distribuită."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Nume"</string>
@@ -441,9 +433,7 @@
<item quantity="other" msgid="425683718017380845">"au fost îmbinate din <xliff:g id="COUNT">%0$d</xliff:g> surse"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Altul"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Asociaţi intrările din Agendă"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Asociaţi intrarea curentă din agendă cu intrarea selectată?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Editaţi persoanele din agendă selectate"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Comutaţi la funcţia de editare a persoanei din agendă selectate? Informaţiile introduse până acum vor fi copiate."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Copiaţi în Agendă"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Adăugaţi în Agendă"</string>
@@ -475,10 +465,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Se încarcă..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Creaţi o intrare nouă în Agendă"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Conectaţi-vă la un cont"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importaţi agenda din fişier"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importaţi Agenda"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Creaţi un grup nou"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Creaţi un grup nou]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Ştergeţi grupul"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grup"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> (de) grupuri"</item>
@@ -497,7 +486,6 @@
<string name="set_default" msgid="4417505153468300351">"Setaţi ca prestabilit"</string>
<string name="clear_default" msgid="7193185801596678067">"Ştergeţi datele prestabilite"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Text copiat"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Renunţaţi la modificări"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Renunţaţi la modificări?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Configuraţi profilul"</string>
@@ -561,7 +549,7 @@
<string name="keep_local" msgid="1258761699192993322">"Păstraţi local"</string>
<string name="add_account" msgid="8201790677994503186">"Adăugaţi un cont"</string>
<string name="add_new_account" msgid="5748627740680940264">"Adăugaţi un cont nou"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Apelul nu a fost trimis"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Număr de mesagerie vocală indisponibil"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Apelul nu a fost trimis"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Pentru a configura mesageria vocală, accesaţi Meniu > Setări."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Pentru a apela mesageria vocală, mai întâi dezactivaţi modul Avion."</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 82e5d07..86398c8 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Поиск"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Новый контакт"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Просмотреть контакт"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Вызов: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Позвонить: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Добавить в избранное"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Удалить из избранных"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Изменить"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Предлагаемые контакты"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Все контакты"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Контакты объединены"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Удаление контакта"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Задать рингтон"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Только голос. почта"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Невозможно удалить контакты из аккаунта, доступного только для чтения, однако их можно скрыть в списках контактов."</string>
@@ -74,8 +73,8 @@
<string name="menu_discard" msgid="6456087569315685632">"Отменить"</string>
<string name="label_notes" msgid="8337354953278341042">"Примечания"</string>
<string name="label_sip_address" msgid="124073911714324974">"Интернет-вызов"</string>
- <string name="ghostData_company" msgid="5414421120553765775">"Компания"</string>
- <string name="ghostData_title" msgid="7496735200318496110">"Название"</string>
+ <string name="ghostData_company" msgid="5414421120553765775">"Название"</string>
+ <string name="ghostData_title" msgid="7496735200318496110">"Должность"</string>
<string name="invalidContactMessage" msgid="8215051456181842274">"Контакт удален."</string>
<string name="pickerNewContactHeader" msgid="7750705279843568147">"Создать новый контакт"</string>
<string name="pickerNewContactText" msgid="6166997164401048211">"Добавить контакт"</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g>:<xliff:g id="SECONDS">%s</xliff:g>"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Часто набираемые"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Часто вызываемые"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Добавить контакт"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Добавить в контакты <xliff:g id="EMAIL">%s</xliff:g>?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"один"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"два"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"минус"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Данные контакта"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Накопитель недоступен"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Нет SD-карты"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Хранилище не найдено."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"SD-карта не обнаружена."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Поиск vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Импортировать с SIM-карты"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Импорт из накопителя"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Экспорт на накопитель"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Импорт всех файлов VCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Поиск данных vCard на накопителе..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Поиск данных vCard на SD-карте..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Накопитель не просканирован"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"SD-карта не просканирована"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Не удалось просканировать накопитель. Причина: <xliff:g id="FAIL_REASON">%s</xliff:g>"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Не удалось просканировать SD-карту. Причина: <xliff:g id="FAIL_REASON">%s</xliff:g>"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Ошибка ввода-вывода"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Экспорт <xliff:g id="FILENAME">%s</xliff:g> начнется в ближайшее время."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Запрос на экспорт данных vCard отклонен. Повторите попытку позже."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"контакт"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Экспорт контактов"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Список контактов будет экспортирован в файл \"<xliff:g id="VCARD_FILENAME">%s</xliff:g>\"."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Сбой экспорта"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Сбой при запуске редактора vCard."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Не удалось открыть файл \"<xliff:g id="FILE_NAME">%s</xliff:g>\". Причина: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"Контакт <xliff:g id="CURRENT_NUMBER">%s</xliff:g> из <xliff:g id="TOTAL_NUMBER">%s</xliff:g>"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Отмена импорта vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Отменить импорт файла \"<xliff:g id="FILENAME">%s</xliff:g>\"?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Отмена экспорта vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Отменить экспорт файла \"<xliff:g id="FILENAME">%s</xliff:g>\"?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Не удалось отменить импорт/экспорт vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Имена контактов"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Фильтр контактов"</string>
<string name="menu_import_export" msgid="26217871113229507">"Импорт/экспорт"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Импорт/экспорт контактов"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Импорт контактов"</string>
<string name="menu_share" msgid="943789700636542260">"Отправить"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Все контакты"</string>
<string name="share_via" msgid="563121028023030093">"Способ отправки"</string>
<string name="share_error" msgid="948429331673358107">"Не удалось передать данные."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Имя"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"объединено из нескольких источников (<xliff:g id="COUNT">%0$d</xliff:g>)"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Другое"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Объединить контакты"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Объединить текущий контакт с выбранным контактом?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Редактировать выбранные контакты"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Переключиться на редактирование выбранного контакта? Введенная информация будет скопирована."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Копировать в \"Мои контакты\""</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Добавить в группу \"Мои контакты\""</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Загрузка..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Создать новый контакт"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Войдите в аккаунт"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Импорт контактов из файла"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Импортировать контакты"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Создание новой группы"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Создать новую группу]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Удаление группы"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 группа"</item>
<item quantity="other" msgid="1276758425904917367">"Групп: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Установить по умолчанию"</string>
<string name="clear_default" msgid="7193185801596678067">"Удалить настройки по умолчанию"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Текст скопирован"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Отмена изменений"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Отменить изменения?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g>, <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Настроить профиль"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Сохранить локально"</string>
<string name="add_account" msgid="8201790677994503186">"Добавить аккаунт"</string>
<string name="add_new_account" msgid="5748627740680940264">"Добавить аккаунт"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Вызов не осуществляется"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Номер недоступен"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Вызов невозможен"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Чтобы настроить голосовую почту, выберите \"Меню > Настройки\"."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Сначала отключите режим полета."</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 831be68..2399b57 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Hľadať"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Nový kontakt"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Zobraziť kontakt"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Zavolať kontakt <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Volať <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Pridať medzi obľúbené položky"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Odstrániť z obľúbených"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Upraviť"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Navrhnuté kontakty"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Všetky kontakty"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kontakty boli spojené"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Odstrániť kontakt?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Nastaviť zvonenie"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Všetky hovory do hl. schránky"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Z účtov, ktoré sú iba na čítanie, nie je možné odstrániť kontakty. Tieto kontakty však môžete v zozname kontaktov skryť."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Najčastejšie používané kontakty"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Najčastejšie volané kontakty"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Pridať kontakt"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Chcete pridať „<xliff:g id="EMAIL">%s</xliff:g>“ medzi kontakty?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"jedna"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dva"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"mínus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Zobraziť kontakt"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Uklad. pr. je nedostupný"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Žiadna karta SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Ukladací priestor sa nenašiel."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Nenašla sa žiadna karta SD."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Vyhľadávanie karty vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importovať z karty SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Import z ukl. priestoru"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Export do uklad. priest."</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importovať všetky súbory vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Prebieha hľadanie údajov vizitky vCard v ukladacom priestore..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Prebieha hľadanie údajov vizitky vCard na karte SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Nepodarilo sa prehľadať ukladací priestor"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Nepodarilo sa prehľadať kartu SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Ukladací priestor sa nepodarilo prehľadať. (Dôvod: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Kartu SD sa nepodarilo prehľadať. (Dôvod: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Chyba I/O"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Vizitka <xliff:g id="FILENAME">%s</xliff:g> bude čoskoro exportovaná."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Žiadosť o exportovanie vizitky vCard bola odmietnutá. Skúste to znova neskôr."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontakt"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Exportovať kontakty?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Váš zoznam kontaktov bude exportovaný do súboru: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Export sa nepodaril"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Nástroj na tvorbu vizitiek vCard sa nespustil správne."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Súbor „<xliff:g id="FILE_NAME">%s</xliff:g>“ sa nepodarilo otvoriť: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> z <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontaktov"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Prebieha rušenie importu vizitky vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Zrušiť importovanie súboru <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Prebieha rušenie exportu vizitky vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Zrušiť exportovanie súboru <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Importovanie/exportovanie karty vizitky vCard zlyhalo"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Mená vašich kontaktov"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakty na zobrazenie"</string>
<string name="menu_import_export" msgid="26217871113229507">"Import a export"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Importovať alebo exportovať kontakty"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Import kontaktov"</string>
<string name="menu_share" msgid="943789700636542260">"Zdieľať"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Všetky kontakty"</string>
<string name="share_via" msgid="563121028023030093">"Zdieľať kontakt pomocou"</string>
<string name="share_error" msgid="948429331673358107">"Tento kontakt nie je možné zdieľať."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Meno"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"zlúčené z <xliff:g id="COUNT">%0$d</xliff:g> zdrojov"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Iné"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Spojiť kontakty"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Spojiť aktuálny kontakt s vybraným kontaktom?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Upraviť vybrané kontakty"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Prepnúť do režimu úpravy vybraného kontaktu? Doposiaľ zadané informácie budú skopírované."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Skopírovať do priečinka Moje kontakty"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Pridať medzi moje kontakty"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Načítava sa…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Vytvoriť nový kontakt"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Prihlásiť sa do účtu"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importovať kontakty zo súboru"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importovať kontakty"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Vytvoriť novú skupinu"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Vytvoriť novú skupinu]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Odstrániť skupinu"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"Počet skupín: 1"</item>
<item quantity="other" msgid="1276758425904917367">"Počet skupín: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Nastaviť ako predvolené"</string>
<string name="clear_default" msgid="7193185801596678067">"Vymazať predvolené nastavenia"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Text bol skopírovaný"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Zahodiť zmeny"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Zahodiť zmeny?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Nastaviť môj profil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Zachovať miestne"</string>
<string name="add_account" msgid="8201790677994503186">"Pridať účet"</string>
<string name="add_new_account" msgid="5748627740680940264">"Pridať nový účet"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Hovor nebol spojený"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Číslo hlasovej schránky je nedostupné"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Hovor nebol spojený"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Ak chcete nastaviť hlasovú schránku, prejdite na položku Menu > Nastavenia."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Ak chcete volať hlasovú schránku, najprv vypnite režim V lietadle."</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 7c988e3..6dfe6b7 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Iskanje"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Nov stik"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Ogled stika"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Pokliči <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Pokliči <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Dodaj k priljubljenim"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Odstrani iz priljubljenih"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Uredi"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Predlagani stiki"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Vsi stiki"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Stiki pridruženi"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Želite izbris. stik?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Nastavi zvonj."</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Vsi klici na odzivnik"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Iz računov samo za branje stikov ni mogoče izbrisati, lahko pa jih skrijete na seznamih stikov."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> min, <xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Pogosti stiki"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Pogosto klicani"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Dodaj stik"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Želite »<xliff:g id="EMAIL">%s</xliff:g>« dodati stikom?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"ena"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dva"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Ogled stika"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Pomnilnik ni na voljo"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Ni kartice SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Shrambe ni bilo mogoče najti."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Kartice SD ni mogoče najti"</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Iskanje vizitke vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Uvozi s kartice SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Uvoz iz pomnilnika"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Izvoz v pomnilnik"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Uvozi vse datoteke vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Iskanje podatkov vCard v pomnilniku ..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Iskanje podatkov vCard na kartici SD ..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Pomnilnika ni bilo mogoče pregledati"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Kartice SD ni bilo mogoče pregledati"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Shrambe ni bilo mogoče pregledati. (Razlog: »<xliff:g id="FAIL_REASON">%s</xliff:g>«)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Kartice SD ni bilo mogoče pregledati. (Razlog: »<xliff:g id="FAIL_REASON">%s</xliff:g>«)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Napaka I/O"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Dat. <xliff:g id="FILENAME">%s</xliff:g> bo kmalu izvožena."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Zahteva za izvoz datoteke vCard je bila zavrnjena. Poskusite znova pozneje."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"stik"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Želite izvoz. stike?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Seznam stikov bo izvožen v datoteko: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Izvoz ni mogoč"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Urejevalnik za vCard se ni pravilno zagnal."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Datoteke »<xliff:g id="FILE_NAME">%s</xliff:g>« ni bilo mogoče odpreti: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> od <xliff:g id="TOTAL_NUMBER">%s</xliff:g> stikov"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Preklic uvoza kart. vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Želite preklicati izvoz datoteke <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Preklic izvoza kart. vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Želite preklicati izvoz datoteke <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Uvoza/izvoza vCard ni mogoče preklicati"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Imena stikov"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Stiki, ki naj bodo prikazani"</string>
<string name="menu_import_export" msgid="26217871113229507">"Uvoz/izvoz"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Uvoz/izvoz stikov"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Uvoz stikov"</string>
<string name="menu_share" msgid="943789700636542260">"Skupna raba"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Vsi stiki"</string>
<string name="share_via" msgid="563121028023030093">"Deli stik z drugimi prek"</string>
<string name="share_error" msgid="948429331673358107">"Tega stika ni mogoče dati v skupno rabo."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Ime"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"spojeno iz <xliff:g id="COUNT">%0$d</xliff:g> virov"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Drugo"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Združevanje stikov"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Želite združiti stik z izbranim stikom?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Uredi izbrane stike"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Želite urejati izbrani stik? Podatki, ki ste jih doslej vnesli, bodo kopirani."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopiraj v moje stike"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Dodaj v skupino »Moji stiki«"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Nalaganje …"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Ustvarjanje novega stika"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Prijava v račun"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Uvoz stikov iz datoteke"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Uvozi stike"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Ustvarjanje nove skupine"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Ustvarjanje nove skupine]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Izbris skupine"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 skupina"</item>
<item quantity="other" msgid="1276758425904917367">"Št. skupin: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Nastavi za privzeto"</string>
<string name="clear_default" msgid="7193185801596678067">"Počisti privzeto"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Besedilo kopirano"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Zavrzi spremembe"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Ali želite zavreči spremembe?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Nastavi moj profil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Ohrani lokalno"</string>
<string name="add_account" msgid="8201790677994503186">"Dodaj račun"</string>
<string name="add_new_account" msgid="5748627740680940264">"Dodaj nov račun"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Klic ni uspel"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Številka odzivnika ni na voljo"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Klic ni uspel"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Če želite nastaviti odzivnik, odprite Meni > Nastavitve."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Če želite poklicati odzivnik, najprej izklopite način za letalo."</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 5b85e52..d42d84f 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Претрага"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Нови контакт"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Прикажи контакт"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Позови <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Позови <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Додај у омиљене контакте"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Уклони из омиљених контаката"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Измени"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Предложени контакти"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Сви контакти"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Придружени контакти"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Желите ли да избришете контакт?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Подеси мелодију звона"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Сви позиви у говорну пошту"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Контакте у оквиру налога који су само за читање не можете да избришете, али можете да их сакријете на листи контаката."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> мин <xliff:g id="SECONDS">%s</xliff:g> сек"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Често контактирани"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Често позивани"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Додај контакт"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Желите ли да додате адресу е-поште „<xliff:g id="EMAIL">%s</xliff:g>“ у контакте?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"један"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"два"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"минус"</string>
<string name="description_plus_button" msgid="515164827856229880">"плус"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Прикажи контакт"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Меморија је недоступна"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Нема SD картице"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Није пронађена меморија."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Није пронађена ниједна SD картица."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Претрага дигиталне визиткарте"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Увези са SIM картице"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Увези из меморије"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Извези у меморију"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Увези све датотеке дигиталних визиткарата"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Тражење података о vCard датотеци у меморији..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"У току је претрага података о vCard датотекама на SD картици..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Није било могуће скенирати складиште"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Није било могуће скенирати SD картицу"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Није било могуће скенирати меморију. (Разлог: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Није било могуће скенирати SD картицу. (Разлог: „<xliff:g id="FAIL_REASON">%s</xliff:g>“)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O грешка"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Датотека <xliff:g id="FILENAME">%s</xliff:g> ће ускоро бити извезена."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Захтев за извоз vCard датотеке је одбијен. Покушајте касније."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"контакт"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Желите ли да извезете контакте?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Листа контаката ће бити извезена у датотеку: <xliff:g id="VCARD_FILENAME">%s</xliff:g> ."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Није могуће извести"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Програм за израду vCard датотека се није исправно покренуо."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Није било могуће отворити датотеку „<xliff:g id="FILE_NAME">%s</xliff:g>“: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> од <xliff:g id="TOTAL_NUMBER">%s</xliff:g> контак(а)та"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Отказивање увоза датотеке"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Желите ли да откажете увоз датотеке <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Отказивање извоза vCard датотеке"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Желите ли да откажете извоз датотеке <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Није могуће отказати vCard увоз/извоз"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Имена контаката"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Контакти за приказ"</string>
<string name="menu_import_export" msgid="26217871113229507">"Увоз/извоз"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Увоз/извоз контаката"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Увоз контаката"</string>
<string name="menu_share" msgid="943789700636542260">"Дели"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Сви контакти"</string>
<string name="share_via" msgid="563121028023030093">"Дели контакт преко"</string>
<string name="share_error" msgid="948429331673358107">"Овај контакт не може да се дели."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Име"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"обједињено од <xliff:g id="COUNT">%0$d</xliff:g> извора"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Други"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Придружи контакте"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Желите ли да тренутни контакт придружите изабраном контакту?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Измена изабраних контаката"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Желите ли да пребаците на уређивање изабраног контакта? Биће копиране информације које сте унели до сада."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Копирај у моје контакте"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Додај у Моје контакте"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Учитавање…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Направи нови контакт"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Пријавите се на налог"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Увези контакте из датотеке"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Увези контакте"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Прављење нове групе"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Направи нову групу]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Избриши групу"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 група"</item>
<item quantity="other" msgid="1276758425904917367">"Група: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Постави на подразумевано"</string>
<string name="clear_default" msgid="7193185801596678067">"Обриши подразумевану вредност"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Текст је копиран"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Одбацивање промена"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Желите ли да одбаците промене?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Подеси мој профил"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Задржи локално"</string>
<string name="add_account" msgid="8201790677994503186">"Додај налог"</string>
<string name="add_new_account" msgid="5748627740680940264">"Додај нови налог"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Позив није послат"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Број говорне поште није доступан"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Позив није послат"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Да бисте подесили говорну пошту, идите у Мени > Подешавања."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Да бисте позвали говорну пошту, прво искључите режим авионa."</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 09f3ead..2d966ce 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Sök"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Ny kontakt"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Visa kontakt"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Ring <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Ring <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Lägg till i Favoriter"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Ta bort från Favoriter"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Redigera"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Föreslagna kontakter"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alla kontakter"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Deltagande kontakter"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Ta bort kontakt?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Ställ in ringsignal"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Alla samtal till röstbrevlådan"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Du kan inte ta bort kontakter från skrivskyddade konton, men du kan dölja dem i kontaktlistorna."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> minuter <xliff:g id="SECONDS">%s</xliff:g> sekunder"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Ofta kontaktade"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Ringer ofta"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Lägg till kontakt"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Vill du lägga till <xliff:g id="EMAIL">%s</xliff:g> i Kontakter?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"ett"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"två"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Visa kontakt"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Lagring otillgänglig"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Inget SD-kort"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Ingen lagringsenhet hittades."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Inget SD-kort hittades."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Söker efter vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Importera från SIM-kort"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Importera från lagring"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Exportera till lagring"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Importera alla vCard-filer"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Sökning efter vCard-data på lagringsenheten pågår ..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Söker efter vCard-data på SD-kort ..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Det gick inte att söka igenom lagringsenheten"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Det gick inte att söka igenom SD-kortet"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Det gick inte att skanna lagringsenheten. (Orsak: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Det gick inte att skanna SD-kortet. (Orsak: <xliff:g id="FAIL_REASON">%s</xliff:g>)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O-fel"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> exporteras snart."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Begäran om vCard-export avvisades. Försök igen vid ett senare tillfälle."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kontakt"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Exportera kontakter?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Kontaktlistan exporteras till filen: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Kunde inte exportera"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"vCard-kompositören initierades inte korrekt."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Det gick inte att öppna <xliff:g id="FILE_NAME">%s</xliff:g>: <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> av <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontakter"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Avbryter vCard-import"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Vill du avbryta importen av <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Avbryter vCard-export"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Vill du avbryta exporten av <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Det gick inte att avbryta importen/exporten av vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Dina kontakters namn"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakter som ska visas"</string>
<string name="menu_import_export" msgid="26217871113229507">"Importera/exportera"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Importera/exportera kontakter"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Importera kontakter"</string>
<string name="menu_share" msgid="943789700636542260">"Dela"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Alla kontakter"</string>
<string name="share_via" msgid="563121028023030093">"Dela kontakt via"</string>
<string name="share_error" msgid="948429331673358107">"Den här kontakten kan inte delas."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Namn"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"kombinerade från <xliff:g id="COUNT">%0$d</xliff:g> källor"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Övrigt"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Kombinera kontakter"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Vill du kombinera kontakten med den markerade kontakten?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Redigera valda kontakter"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Vill du fortsätta att redigera den markerade kontakten? Information som du har angett hittills kommer att kopieras."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopiera till mina kontakter"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Lägg till i mina kontakter"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Läser in …"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Skapa en ny kontakt"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Logga in på ett konto"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Importera kontakter från en fil"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Importera kontakter"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Skapa ny grupp"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Skapa ny grupp]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Radera grupp"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grupp"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grupper"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Ange standard"</string>
<string name="clear_default" msgid="7193185801596678067">"Rensa standardinställningar"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Texten har kopierats"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Ignorera ändringar"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Vill du ta bort ändringarna?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Skapa min profil"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Spara lokalt"</string>
<string name="add_account" msgid="8201790677994503186">"Lägg till ett konto"</string>
<string name="add_new_account" msgid="5748627740680940264">"Lägg till ett nytt konto"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Samtalet gick inte att koppla fram"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Röstbrevlådenumret är inte tillgängligt"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Samtalet gick inte att koppla fram"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Välj Meny > Inställningar om du vill konfigurera röstbrevlådan."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Om du vill ringa röstbrevlådan måste du först inaktivera flygplansläget."</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 8a34f62..bb32630 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Tafuta"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Anwani mpya"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Tazama anwani"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Piga simu <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Piga simu <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Ongeza kwa vipendwa"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Ondoa kutoka kwa vipendwa vyako"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Hariri"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Anwani zilizopendekezwa"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Anwani zote"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Anwani zimeunganishwa"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Futa mwasiliani?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Weka mlio wa simu"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Simu zote kwa barua ya sauti"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Huwezi kufuta anwani kutoka kwa akaunti ya kusoma-tu, lakini unaweza kuzificha katika orodha zako za anwani."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"Dakika <xliff:g id="MINUTES">%s</xliff:g> sekunde <xliff:g id="SECONDS">%s</xliff:g>"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Unaowasiliana nao zaidi"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Zinazopigwa mara kwa mara"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Ongeza anwani"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Ongeza \"<xliff:g id="EMAIL">%s</xliff:g>\" kwa anwani?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"moja"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"mbili"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"kutoa"</string>
<string name="description_plus_button" msgid="515164827856229880">"jumlisha"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Angalia anwani"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Hifadhi haipatikani"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Hakuna kadi ya SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Hakuna hifadhi iliyopatikana."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Hakuna kadi ya SD iliyopatikana."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Inatafuta vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Ingiza kutoka kwa SIM kadi"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Leta kutoka kwa hifadhi"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Hamisha kwa hifadhi"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Ingiza faili zote za vKadi"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Inatafuta data ya vCard katika hifadhi..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Inatafuta data ya vKadi kwenye kadi ya SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Haikuweza kusafisha hifadhi"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Haikuweza kusafisha kadi ya SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Hifadhi haiku tambazwa. (Sababu: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Kadi ya SD haikutambazwa.(Sababu: \" <xliff:g id="FAIL_REASON">%s</xliff:g> \")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Hitilafu ya I/O"</string>
@@ -254,7 +247,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> itahamishwa hivi karibuni."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Ombi la kuhamishwa kwa vCard limekataliwa. Jaribu tena baadaye."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"anwani"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"Kishika nafasi <xliff:g id="PERCENTAGE">%s</xliff:g> <xliff:g id="PERCENTSIGN">%%</xliff:g> "</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Hamisha anwani?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Orodha yako ya anwani itahamishwa kwa faili: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Imeshindwa kuhamisha"</string>
@@ -275,9 +268,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Kitunzi cha vCard hakikuanza vizuri."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Haikuweza kufungua \"{<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> ya anwani <xliff:g id="TOTAL_NUMBER">%s</xliff:g>"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Inaghairi uletaji vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Ghairi kuletwa kwa <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Inaghairi uhamishaji wa vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Ghairi kuhamishwa kwa <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Haikuweza kughairiwa kuleta/kuhamisha vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Majina ya anwani zako"</string>
@@ -293,8 +284,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Anwani za kuonyesha"</string>
<string name="menu_import_export" msgid="26217871113229507">"Leta/hamisha"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Leta/Hamisha wawasiliani"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Ingiza wasiliani"</string>
<string name="menu_share" msgid="943789700636542260">"Shiriki"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Wahusika wote"</string>
<string name="share_via" msgid="563121028023030093">"Shiriki anwani kupitia"</string>
<string name="share_error" msgid="948429331673358107">"Mwasiliani huyu hawezi kushirikishwa."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Jina"</string>
@@ -443,9 +434,7 @@
<item quantity="other" msgid="425683718017380845">"Zimeunganishwa kutoka kwa nyenzo <xliff:g id="COUNT">%0$d</xliff:g>"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Nyingineyo"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Unganisha anwani"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Unganisha anwani ya sasa na anwani iliyochaguliwa?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Hariri majina yaliyochaguliwa"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Badilisha kwa hariri anwani iliyochaguliwa? Maelezo uliyoyaingiza hadi sasa yatanakiliwa."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Nakili kwa Anwani Zangu"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Ongeza kwa Anwani Zangu"</string>
@@ -477,10 +466,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Inapakia…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Unda akaunti mpya"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Ingia katika akaunti"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Leta anwani kutoka kwa faili"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Ingiza wasiliani"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Unda kikundi kipya"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Unda kikundi kipya]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Futa kikundi"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"Kikundi 1"</item>
<item quantity="other" msgid="1276758425904917367">"Vikundi <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -499,7 +487,6 @@
<string name="set_default" msgid="4417505153468300351">"Weka chaguo-msingi"</string>
<string name="clear_default" msgid="7193185801596678067">"Ondoa chaguo-msingi"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Maandishi yamenakiliwa"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Tupa mabadiliko"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Tupa mabadiliko yako?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"Kishika nafasi <xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Sanidi maelezo yangu mafupi"</string>
@@ -563,7 +550,7 @@
<string name="keep_local" msgid="1258761699192993322">"Weka karibu"</string>
<string name="add_account" msgid="8201790677994503186">"Ongeza akaunti"</string>
<string name="add_new_account" msgid="5748627740680940264">"Ongeza akaunti mpya"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Simu haijatumwa."</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Nambari ya barua ya sauti haipatikani"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Simu haijatumwa"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Ili kusanidi ujumbe wa sauti, nenda kwa Menyu > Mipangilio."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Kupigia simu ujumbe wa sauti, kwanza lemaza hali ya ndege."</string>
</resources>
diff --git a/res/values-sw580dp/dimens.xml b/res/values-sw580dp/dimens.xml
index 3d3cb17..264565f 100644
--- a/res/values-sw580dp/dimens.xml
+++ b/res/values-sw580dp/dimens.xml
@@ -38,7 +38,7 @@
<dimen name="contact_browser_list_header_left_margin">@dimen/list_visible_scrollbar_padding</dimen>
<dimen name="contact_browser_list_header_right_margin">24dip</dimen>
<dimen name="list_visible_scrollbar_padding">48dip</dimen>
- <dimen name="account_filter_header_top_padding">@dimen/contact_browser_list_top_margin</dimen>
+ <dimen name="list_header_extra_top_padding">@dimen/contact_browser_list_top_margin</dimen>
<!-- Because the "join" screen has the vertical scroll bar on right,
we cannot use @dimen/contact_browser_list_header_left_margin as is. -->
diff --git a/res/values-sw580dp/donottranslate_config.xml b/res/values-sw580dp/donottranslate_config.xml
index 57db36b..4e17168 100644
--- a/res/values-sw580dp/donottranslate_config.xml
+++ b/res/values-sw580dp/donottranslate_config.xml
@@ -21,6 +21,6 @@
<bool name="config_use_two_panes">true</bool>
<bool name="show_home_icon">true</bool>
<bool name="config_show_group_action_in_action_bar">false</bool>
- <item name="tab_width_screen_width_percentage" type="fraction">66%</item>
- <item name="tab_height_screen_width_percentage" type="fraction">66%</item>
+ <item name="tab_width_screen_width_percentage" type="fraction">66.67%</item>
+ <item name="tab_height_screen_width_percentage" type="fraction">66.67%</item>
</resources>
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index bf5b137..2326d5f 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -95,6 +95,8 @@
<style name="JoinContactActivityTheme" parent="ContactPickerTheme" >
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
+ <!-- In the contact picker screen we're using adjustResize but we don't want it here. -->
+ <item name="android:windowSoftInputMode">adjustUnspecified</item>
</style>
<style name="ContactListFilterTheme" parent="@android:Theme.Holo.Light.Dialog">
@@ -113,7 +115,7 @@
<style name="DirectoryHeader" parent="PeopleTheme">
<item name="android:paddingTop">0dip</item>
- <item name="android:paddingBottom">0dip</item>
+
<item name="android:background">@android:color/transparent</item>
</style>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index bc46708..3acc4ac 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"ค้นหา"</string>
<string name="menu_newContact" msgid="1209922412763274638">"สร้างรายชื่อใหม่"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"ดูสมุดโทรศัพท์"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"โทรหา <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"โทร <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"เพิ่มในรายการโปรด"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"ลบจากรายการโปรด"</string>
<string name="menu_editContact" msgid="9042415603857662633">"แก้ไข"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"รายชื่อที่แนะนำ"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"รายชื่อในสมุดโทรศัพท์ทั้งหมด"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"รายชื่อที่รวมกัน"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"ลบรายชื่อหรือไม่"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"ตั้งเสียงเรียกเข้า"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"โอนทุกสายไปยังข้อความเสียง"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"คุณไม่สามารถลบรายชื่อติดต่อจากบัญชีแบบอ่านอย่างเดียวได้ แต่ซ่อนไว้ในรายการรายชื่อได้"</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> นาที <xliff:g id="SECONDS">%s</xliff:g> วินาที"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"ที่ติดต่อบ่อยครั้ง"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"มีการติดต่อบ่อย"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"เพิ่มรายชื่อในสมุดโทรศัพท์"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"เพิ่ม \"<xliff:g id="EMAIL">%s</xliff:g>\" ในสมุดโทรศัพท์หรือไม่"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"หนึ่ง"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"สอง"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"ดูรายชื่อติดต่อ"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"ไม่มีที่เก็บข้อมูล"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"ไม่มีการ์ด SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"ไม่พบที่จัดเก็บข้อมูล"</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"ไม่พบการ์ด SD"</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"กำลังค้นหา vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"นำเข้าจากซิมการ์ด"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"นำเข้าจากที่เก็บข้อมูล"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"ส่งออกไปยังที่เก็บข้อมูล"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"นำเข้าไฟล์ vCard ทั้งหมด"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"กำลังค้นหาข้อมูล vCard ในที่จัดเก็บข้อมูล..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"กำลังค้นหาข้อมูล vCard บนการ์ด SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"ไม่สามารถสแกนที่เก็บข้อมูล"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"ไม่สามารถสแกนการ์ด SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"ไม่สามารถสแกนที่จัดเก็บข้อมูล (สาเหตุ: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"ไม่สามารถสแกนการ์ด SD (สาเหตุ: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"ข้อผิดพลาด I/O"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"การส่งออก <xliff:g id="FILENAME">%s</xliff:g> จะเกิดขึ้นในไม่ช้า"</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"คำขอส่งออก vCard ถูกปฏิเสธ ลองใหม่ภายหลัง"</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"สมุดโทรศัพท์"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"ส่งออกรายชื่อติดต่อ"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"รายชื่อติดต่อของคุณจะถูกส่งออกเป็นไฟล์: <xliff:g id="VCARD_FILENAME">%s</xliff:g>"</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"ไม่สามารถส่งออก"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"โปรแกรมเขียนข้อความ vCard เริ่มการทำงานไม่ถูกต้อง"</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"ไม่สามารถเปิด \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"รายชื่อในสมุดโทรศัพท์ <xliff:g id="CURRENT_NUMBER">%s</xliff:g> จาก <xliff:g id="TOTAL_NUMBER">%s</xliff:g> รายการ"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"การยกเลิกการนำเข้า vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"ยกเลิกการนำเข้า <xliff:g id="FILENAME">%s</xliff:g> หรือไม่"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"การยกเลิกการส่งออก vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"ยกเลิกการส่งออก <xliff:g id="FILENAME">%s</xliff:g> หรือไม่"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"ไม่สามารถยกเลิกการนำเข้า/ส่งออก vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"ชื่อของรายชื่อในสมุดโทรศัพท์ของคุณ"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"รายชื่อติดต่อที่จะแสดง"</string>
<string name="menu_import_export" msgid="26217871113229507">"นำเข้า/ส่งออก"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"นำเข้า/ส่งออกผู้ติดต่อ"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"นำเข้าสมุดโทรศัพท์"</string>
<string name="menu_share" msgid="943789700636542260">"ใช้ร่วมกัน"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"รายชื่อทั้งหมด"</string>
<string name="share_via" msgid="563121028023030093">"ใช้สมุดโทรศัพท์ร่วมกันทาง"</string>
<string name="share_error" msgid="948429331673358107">"ไม่สามารถแบ่งปันรายชื่อติดต่อนี้ได้"</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"ชื่อ"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"รวมจากแหล่งที่มา <xliff:g id="COUNT">%0$d</xliff:g> แหล่ง"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"อื่นๆ"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"รวมรายชื่อติดต่อ"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"รวมรายชื่อติดต่อปัจจุบันกับรายชื่อติดต่อที่เลือกหรือไม่"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"แก้ไขรายชื่อติดต่อที่เลือก"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"เปลี่ยนไปแก้ไขรายชื่อติดต่อที่เลือกหรือไม่ ข้อมูลที่คุณป้อนไว้จนถึงขณะนี้จะถูกคัดลอก"</string>
<string name="menu_copyContact" msgid="1573960845106822639">"คัดลอกไปยังสมุดโทรศัพท์ของฉัน"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"เพิ่มในสมุดโทรศัพท์ของฉัน"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"กำลังโหลด..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"สร้างที่อยู่ติดต่อใหม่"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"ลงชื่อเข้าใช้บัญชี"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"นำเข้าที่อยู่ติดต่อจากไฟล์"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"นำเข้าสมุดโทรศัพท์"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"สร้างกลุ่มใหม่"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[สร้างกลุ่มใหม่]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"ลบกลุ่ม"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 กลุ่ม"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> กลุ่ม"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"ตั้งเป็นค่าเริ่มต้น"</string>
<string name="clear_default" msgid="7193185801596678067">"ล้างจากค่าเริ่มต้น"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"คัดลอกข้อความแล้ว"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"ยกเลิกการเปลี่ยนแปลง"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"ยกเลิกการเปลี่ยนแปลงหรือไม่"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"ตั้งค่าโปรไฟล์ของฉัน"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"จัดเก็บในตัวเครื่อง"</string>
<string name="add_account" msgid="8201790677994503186">"เพิ่มบัญชี"</string>
<string name="add_new_account" msgid="5748627740680940264">"เพิ่มบัญชีใหม่"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"ไม่สามารถโทรออก"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"หมายเลขข้อความเสียงไม่พร้อมใช้งาน"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"ไม่สามารถโทรออก"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"หากต้องการตั้งค่าข้อความเสียง ให้ไปที่เมนู > การตั้งค่า"</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"หากต้องการฟังข้อความเสียง ให้ปิดโหมดใช้งานบนเครื่องบินก่อน"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 9518b61..4b4fdbd 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Paghahanap"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Bagong contact"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Tingnan ang contact"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Tawagan si <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Tumawag sa <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Idagdag sa mga paborito"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Alisin mula sa mga paborito"</string>
<string name="menu_editContact" msgid="9042415603857662633">"I-edit"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Mga iminumungkahing contact"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Lahat ng mga contact"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Mga pinagsamang contact"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Tanggalin ang contact?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Itakda ang ringtone"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Lahat ng tawag sa voicemail"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Hindi ka makakapagtanggal ng mga contact mula sa mga read-only na account, ngunit maitatago mo ang mga ito sa iyong mga listahan ng mga contact."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> (na) min <xliff:g id="SECONDS">%s</xliff:g> (na) seg"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Madalas na kino-contact"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Madalas na tinatawagan"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Magdagdag ng contact"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Idagdag ang \"<xliff:g id="EMAIL">%s</xliff:g>\" sa mga contact?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"isa"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"dalawa"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"minus"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Tingnan ang contact"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Hindi available ang imbakan"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Walang SD card"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Walang natagpuang storage."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Walang natagpuang SD card."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Paghahanap ng vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"I-import mula sa SIM card"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"I-import mula sa imbakan"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"I-export sa imbakan"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"I-import ang lahat ng mga vCard file"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Naghahanap ng data ng vCard sa storage…"</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Naghahanap ng data ng vCard data sa SD card…"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Hindi ma-scan ang storage"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Hindi ma-scan ang SD card"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Hindi ma-scan ang storage. (Dahilan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Hindi ma-scan ang SD card. (Dahilan: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O na error"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Mae-export ang <xliff:g id="FILENAME">%s</xliff:g> sa ilang saglit."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Tinanggihan ang kahilingan sa pag-export ng vCard. Subukang muli sa ibang pagkakataon."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"contact"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"I-export ang mga contact?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Ang listahan ng iyong contact ay ie-export sa file: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Hindi ma-export"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Hindi nagsimula nang tama ang composer ng vCard."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Hindi mabuksan ang \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> ng <xliff:g id="TOTAL_NUMBER">%s</xliff:g> (na) contact"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Pagkansela ng pag-import ng vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Kanselahin ang pag-import ng <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Pagkansela ng pag-export ng vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Kanselahin ang pag-export ng <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Di makansela pag-import/pag-export vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Mga pangalan ng iyong mga contact"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Mga contact na ipapakita"</string>
<string name="menu_import_export" msgid="26217871113229507">"Mag-import/mag-export"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Mag-import/mag-export ng mga contact"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Mag-import ng mga contact"</string>
<string name="menu_share" msgid="943789700636542260">"Ibahagi"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Lahat ng contact"</string>
<string name="share_via" msgid="563121028023030093">"Ibahagi ang contact sa pamamagitan ng"</string>
<string name="share_error" msgid="948429331673358107">"Hindi maibabahagi ang contact na ito."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Pangalan"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"pinagsama mula sa <xliff:g id="COUNT">%0$d</xliff:g> (na) pinagmumulan"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Iba pa"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Sumali sa mga contact"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Isama ang kasalukuyang contact sa piniling contact?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"I-edit ang napiling mga contact"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Lumipat sa pag-edit ng napiling contact? Kokopyahin ang impormasyong ipinasok mo sa ngayon."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopyahin sa Aking Mga Contact"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Idagdag sa Aking Mga Contact"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Naglo-load…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Lumikha ng bagong contact"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Mag-sign in sa isang account"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Pag-import ng mga contact mula sa isang file"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Mag-import ng mga contact"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Lumikha ng bagong pangkat"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Lumikha ng bagong pangkat]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Tanggalin ang pangkat"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 pangkat"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> (na) pangkat"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Itakda ang default"</string>
<string name="clear_default" msgid="7193185801596678067">"I-clear ang default"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Kinopya ang teksto"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Itapon ang mga pagbabago"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Itapon ang iyong mga pagbabago?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"I-set up ang aking profile"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Panatilihing lokal"</string>
<string name="add_account" msgid="8201790677994503186">"Magdagdag ng account"</string>
<string name="add_new_account" msgid="5748627740680940264">"Magdagdag ng bagong account"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Hindi naipadala ang tawag"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Hindi available ang numero ng voicemail"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Hindi naipadala ang tawag"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Upang mag-set up ng voicemail, pumunta sa Menu > Mga Setting."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Upang tumawag sa voicemail, i-off muna ang Airplane mode."</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 92285fd..fdb658e 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Ara"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Yeni kişi"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Kişiyi görüntüle"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Ara: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Çağrı yap: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Sık kullanılanlara ekle"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Sık kullanılanlardan kaldır"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Düzenle"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Önerilen kişiler"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tüm kişiler"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Kişiler birleştirildi"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Kişi silinsin mi?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Zil sesi ayarla"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Sesli mesaja gelen tüm çağrlr"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Kişileri salt okunur hesaplardan silemezsiniz, ancak bu kişileri kişiler listenizde gizleyebilirsiniz."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> dak <xliff:g id="SECONDS">%s</xliff:g> sn"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Sık iletişim kurulanlar"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Sık arananlar"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Kişi ekle"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" adresi kişilere eklensin mi?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"bir"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"iki"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"eksi"</string>
<string name="description_plus_button" msgid="515164827856229880">"artı"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Kişiyi görüntüle"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Depolama birimi yok"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"SD kart yok"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Depolama birimi bulunamadı."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"SD kart bulunamadı."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"vCard aranıyor"</string>
<string name="import_from_sim" msgid="3859272228033941659">"SIM karttan içe aktar"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Depl biriminden içe aktar"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Depolama birimine aktar"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Tüm vCard dosyalarını içe aktar"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Depolama birimindeki vCard verileri aranıyor..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"SD kartta vCard verileri aranıyor..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Depolama birimi taranamadı"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"SD kart taranamadı"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Depolama biriminiz taranamadı. (Nedeni: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"SD kart taranamadı. (Nedeni: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"G/Ç Hatası"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> kısa bir süre içinde dışa aktarılacak."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"vCard\'ı dışa aktarma isteği reddedildi. Daha sonra tekrar deneyin."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"kişi"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Kişileri dışa aktar?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Kişi listeniz şu dosyaya aktarılacak: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Dışa aktarılamadı"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"vCard oluşturucu düzgün başlamadı."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"\"<xliff:g id="FILE_NAME">%s</xliff:g>\" açılamadı: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"Toplam <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kişiden <xliff:g id="CURRENT_NUMBER">%s</xliff:g> kişi"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"vCard içe aktarmayı iptal etme"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"<xliff:g id="FILENAME">%s</xliff:g> dosyasının içe aktarılması iptal edilsin mi?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"vCard dışa aktarmayı iptal etme"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"<xliff:g id="FILENAME">%s</xliff:g> dosyasının dışa aktarılması iptal edilsin mi?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"İçe/dışa aktrma işlmi iptl edilemedi"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Kişilerinizin adları"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Görüntülenecek kişiler"</string>
<string name="menu_import_export" msgid="26217871113229507">"İçe/Dışa Aktar"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Kişileri içe/dışa aktar"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Kişileri içe aktar"</string>
<string name="menu_share" msgid="943789700636542260">"Paylaş"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Tüm kişiler"</string>
<string name="share_via" msgid="563121028023030093">"Şunu kullanarak kişi paylaş:"</string>
<string name="share_error" msgid="948429331673358107">"Bu kişi paylaşılamıyor."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Ad"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"<xliff:g id="COUNT">%0$d</xliff:g> kaynaktan birleştirildi"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Diğer"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Kişileri birleştir"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Mevcut kişi, seçili kişiyle birleştirilsin mi?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Seçili kişileri düzenle"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Seçili kişiyi düzenlemeye geçilsin mi? Şimdiye kadar girdiğiniz bilgiler kopyalanacak."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kişilerime kopyala"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Kişilerime ekle"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Yükleniyor..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Yeni kişi oluştur"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Bir hesapta oturum açın"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Bir dosyadaki kişileri içe aktar"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Kişileri içe aktar"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Yeni grup oluştur"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Yeni grup oluştur]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Grubu sil"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 grup"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> grup"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Varsayılan olarak ayarla"</string>
<string name="clear_default" msgid="7193185801596678067">"Varsayılanları temizle"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Metin kopyalandı"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Değişiklikleri sil"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Değişiklikleriniz silinsin mi?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Profilimi ayarla"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Yerel olarak sakla"</string>
<string name="add_account" msgid="8201790677994503186">"Hesap ekle"</string>
<string name="add_new_account" msgid="5748627740680940264">"Yeni hesap ekle"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Çağrı yapılamadı"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Sesli mesaj numarası kullanılamıyor"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Çağrı yapılamadı"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Sesli mesajı yapılandırmak için Menü > Ayarlar\'a gidin."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Sesli mesaja çağrı yapmak için öncelikle Uçak modunu kapatın."</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index dbc26fa..eb64fc8 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Пошук"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Новий контакт"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Див. контакт"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Набрати <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Телефонувати <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Додати до вибраного"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Видалити з вибраного"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Редагувати"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Пропоновані контакти"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Усі контакти"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Контакти об\'єднано"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Видалити контакт?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Установ.мелодію"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Усі виклики на голосову пошту"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Неможливо видалити контакти з облікових записів \"лише для читання\", але можна сховати їх у списках контактів."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> хв. <xliff:g id="SECONDS">%s</xliff:g> сек."</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Часті контакти"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Часті виклики"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Додати контакт"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Дод.\" <xliff:g id="EMAIL">%s</xliff:g>\" до контактів?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"один"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"два"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"мінус"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Переглянути контакт"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Пам’ять недоступна"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Нема карти SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Пам’ять не знайдено."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Карту SD не знайдено."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Пошук даних vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Імортув. з SIM-карти"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Імпорт із пам’яті"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Експорт у пам’ять"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Імпортув. всі файли vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Пошук даних vCard у пам’яті..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Пошук даних vCard на карті SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Не вдалося просканувати пам’ять"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Не вдалося просканувати карту SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Не вдалося сканувати пам’ять. (Причина: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Не вдалося сканувати карту SD. (Причина: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Помилка вводу/виводу"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"Файл <xliff:g id="FILENAME">%s</xliff:g> незабаром буде експортовано."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Запит на експорт файлу vCard відхилено. Повторіть спробу пізніше."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"контакт"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Експортув. контакти?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Ваш список контактів буде експортовано у файл: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Помилка експорту"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Майстер vCard не запущено належним чином."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Не вдалося відкрити файл \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> із <xliff:g id="TOTAL_NUMBER">%s</xliff:g> контактів"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Скасування імпорту vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Скасувати імпорт файлу <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Скасування експорту vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Скасувати експорт файлу <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Не вдалося скасув. імпорт/експорт vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Імена ваших контактів"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Контакти для показу"</string>
<string name="menu_import_export" msgid="26217871113229507">"Імпорт або експорт"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Імпорт/експорт контактів"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Імпорт контактів"</string>
<string name="menu_share" msgid="943789700636542260">"Надісл."</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Усі контакти"</string>
<string name="share_via" msgid="563121028023030093">"Надісл. контакт через"</string>
<string name="share_error" msgid="948429331673358107">"Цей контакт неможливо надіслати."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Ім\'я"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"об\'єднано з джерел: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Інші"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Об\'єднати контакти"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Об\'єднати поточний контакт із вибраним контактом?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Редагувати вибрані контакти"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Перейти до редагування вибраного контакта? Введену досі інформацію буде скопійовано."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Копіювати в мої контакти"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Додати до групи \"Мої контакти\""</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Завантаження..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Створити новий контакт"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Увійти в обліковий запис"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Імпортувати контакти з файлу"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Імпортувати контакти"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Створити нову групу"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Створити нову групу]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Видалити групу"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 група"</item>
<item quantity="other" msgid="1276758425904917367">"Груп: <xliff:g id="COUNT">%0$d</xliff:g>"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Установити за умовчанням"</string>
<string name="clear_default" msgid="7193185801596678067">"Очистити налаштування за умовчанням"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Текст скопійовано"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Відхилити зміни"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Відхилити зміни?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Налаштувати профіль"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Зберегти локально"</string>
<string name="add_account" msgid="8201790677994503186">"Додати обліковий запис"</string>
<string name="add_new_account" msgid="5748627740680940264">"Додати новий обліковий запис"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Виклик не здійснено"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Номер голосової пошти не доступний"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Виклик не здійснено"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Щоб налаштувати голосову пошту, перейдіть у Меню > Налаштування."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Щоб перевірити голосову пошту, спочатку вимкніть режим польоту."</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 74da6cd..c48b62e 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Tìm kiếm"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Liên hệ mới"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Xem liên hệ"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Gọi <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Gọi <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Thêm vào mục ưa thích"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Xóa khỏi mục ưa thích"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Chỉnh sửa"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Liên hệ được đề xuất"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tất cả liên hệ"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Danh bạ đã được kết hợp"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Xóa địa chỉ liên hệ?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Đặt nhạc chuông"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Các cuộc gọi tới thư thoại"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Bạn không thể xóa địa chỉ liên hệ từ tài khoản chỉ đọc, nhưng bạn có thể ẩn chúng trong danh sách địa chỉ liên hệ của mình."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> phút <xliff:g id="SECONDS">%s</xliff:g> giây"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Thường xuyên được liên hệ"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Thường xuyên được gọi"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Thêm liên hệ"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Thêm \"<xliff:g id="EMAIL">%s</xliff:g>\" vào danh bạ?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"một"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"hai"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"trừ"</string>
<string name="description_plus_button" msgid="515164827856229880">"cộng"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Xem địa chỉ liên hệ"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Bộ nhớ không khả dụng"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Không có thẻ SD nào"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Không tìm thấy bộ nhớ nào."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Không tìm thấy thẻ SD nào."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Đang tìm kiếm vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Nhập từ thẻ SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Nhập từ bộ nhớ"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Xuất sang bộ nhớ"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Nhập tất cả tệp vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Đang tìm kiếm dữ liệu vCard trong bộ nhớ..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Đang tìm dữ liệu vCard trên thẻ SD..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Không thể quét bộ nhớ"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Không thể quét thẻ SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Không thể quét bộ nhớ. (Lý do: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Không thể quét thẻ SD. (Lý do: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Lỗi I/O"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> sẽ sớm được xuất."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Yêu cầu xuất vCard bị từ chối. Hãy thử lại sau."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"địa chỉ liên hệ"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"Xuất danh bạ?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Danh sách địa chỉ liên hệ của bạn sẽ được xuất sang tệp: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Không thể xuất"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Trình soạn vCard không khởi động đúng."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Không thể mở \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> trong tổng số <xliff:g id="TOTAL_NUMBER">%s</xliff:g> liên hệ"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Hủy nhập vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Hủy yêu cầu nhập <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Hủy xuất vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Hủy yêu cầu xuất <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Không thể nhập/xuất vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Tên danh bạ của bạn"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Danh sách liên hệ để hiển thị"</string>
<string name="menu_import_export" msgid="26217871113229507">"Nhập/xuất"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Nhập/xuất danh bạ"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Nhập danh bạ"</string>
<string name="menu_share" msgid="943789700636542260">"Chia sẻ"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Tất cả liên hệ"</string>
<string name="share_via" msgid="563121028023030093">"Chia sẻ liên hệ qua"</string>
<string name="share_error" msgid="948429331673358107">"Không thể chia sẻ địa chỉ liên hệ này."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Tên"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"được hợp nhất từ <xliff:g id="COUNT">%0$d</xliff:g> nguồn"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Khác"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Kết hợp danh bạ"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Kết hợp địa chỉ liên hệ hiện tại với địa chỉ liên hệ đã chọn?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Chỉnh sửa địa chỉ liên hệ đã chọn"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Chuyển sang chỉnh sửa liên hệ đã chọn? Thông tin bạn đã nhập đến giờ sẽ được sao chép."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Sao chép vào Danh bạ của tôi"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Thêm vào Danh bạ của tôi"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Đang tải…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Tạo địa chỉ liên hệ mới"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Đăng nhập vào tài khoản"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Nhập danh bạ từ một tệp"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Nhập danh bạ"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Tạo nhóm mới"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Tạo nhóm mới]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Xóa nhóm"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 nhóm"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> nhóm"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"Đặt mặc định"</string>
<string name="clear_default" msgid="7193185801596678067">"Xóa mặc định"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Đã sao chép văn bản"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Hủy thay đổi"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Hủy các thay đổi của bạn?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Thiết lập tiểu sử của tôi"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"Lưu trữ cục bộ"</string>
<string name="add_account" msgid="8201790677994503186">"Thêm tài khoản"</string>
<string name="add_new_account" msgid="5748627740680940264">"Thêm tài khoản mới"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Không thể thực hiện cuộc gọi"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Số thư thoại không khả dụng"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"Không thể thực hiện cuộc gọi"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Để thiết lập thư thoại, đi tới Trình đơn > Cài đặt."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Để gọi thư thoại, trước tiên hãy tắt chế độ trên Máy bay."</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 381ffb0..147d2ab 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"搜索"</string>
<string name="menu_newContact" msgid="1209922412763274638">"新建联系人"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"查看联系人"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"呼叫<xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"拨打 <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"添加到收藏"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"从收藏中删除"</string>
<string name="menu_editContact" msgid="9042415603857662633">"修改"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"建议的联系人"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"所有联系人"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"已合并联系人"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"要删除联系人吗?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"设置铃声"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"所有来电转至语音信箱"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"您无法删除只读帐户中的联系人,但可以在联系人列表中将他们隐藏。"</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> 分 <xliff:g id="SECONDS">%s</xliff:g> 秒"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"经常联系的人"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"经常呼叫的联系人"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"添加联系人"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"将“<xliff:g id="EMAIL">%s</xliff:g>”添加到联系人?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"一"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"二"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"删除"</string>
<string name="description_plus_button" msgid="515164827856229880">"添加"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"查看联系人"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"存储设备不存在"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"无 SD 卡"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"未找到任何存储设备。"</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"未找到 SD 卡。"</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"正在搜索 vCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"从 SIM 卡导入"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"从存储设备导入"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"导出到存储设备"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"导入所有 vCard 文件"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"正在从存储设备中搜索 vCard 文件..."</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"正在 SD 卡中搜索 vCard 数据..."</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"无法扫描存储设备"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"无法扫描 SD 卡"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"无法扫描该存储设备。(原因:“<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"无法扫描该 SD 卡。(原因:“<xliff:g id="FAIL_REASON">%s</xliff:g>”)"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O 错误"</string>
@@ -252,7 +245,8 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> 将在稍后导出。"</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"vCard 导出请求遭拒,请稍后重试。"</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"联系人"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <!-- no translation found for percentage (1887004062152632812) -->
+ <skip />
<string name="confirm_export_title" msgid="6834385377255286349">"要导出联系人吗?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"系统会将您的联系人列表导出到以下文件:<xliff:g id="VCARD_FILENAME">%s</xliff:g>。"</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"无法导出"</string>
@@ -273,9 +267,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"vCard 制作程序未正确启动。"</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"无法打开“<xliff:g id="FILE_NAME">%s</xliff:g>”:<xliff:g id="EXACT_REASON">%s</xliff:g>。"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"第 <xliff:g id="CURRENT_NUMBER">%s</xliff:g> 个联系人(共 <xliff:g id="TOTAL_NUMBER">%s</xliff:g> 个)"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"取消导入 vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"要取消导入 <xliff:g id="FILENAME">%s</xliff:g> 吗?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"取消导出 vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"要取消导出 <xliff:g id="FILENAME">%s</xliff:g> 吗?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"无法取消导入/导出 vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"联系人姓名"</string>
@@ -291,8 +283,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"要显示的联系人"</string>
<string name="menu_import_export" msgid="26217871113229507">"导入/导出"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"导入/导出联系人"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"导入联系人"</string>
<string name="menu_share" msgid="943789700636542260">"分享"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"所有联系人"</string>
<string name="share_via" msgid="563121028023030093">"联系人分享方式"</string>
<string name="share_error" msgid="948429331673358107">"无法分享此联系人。"</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"姓名"</string>
@@ -441,9 +433,7 @@
<item quantity="other" msgid="425683718017380845">"合并自 <xliff:g id="COUNT">%0$d</xliff:g> 个来源"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"其他"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"合并联系人"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"要合并当前联系人与所选联系人吗?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"编辑所选联系人"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"要切换至编辑所选联系人吗?系统会复制您到目前为止输入的所有信息。"</string>
<string name="menu_copyContact" msgid="1573960845106822639">"复制到“我的联系人”"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"添加到“我的联系人”"</string>
@@ -475,10 +465,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"正在加载..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"创建新联系人"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"登录帐户"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"从文件导入联系人"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"导入联系人"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"创建新群组"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[创建新群组]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"删除群组"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 个群组"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> 个群组"</item>
@@ -497,7 +486,6 @@
<string name="set_default" msgid="4417505153468300351">"设置默认值"</string>
<string name="clear_default" msgid="7193185801596678067">"清除默认值"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"文本已复制"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"舍弃更改"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"要舍弃您所做的更改吗?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"设置我的个人资料"</string>
@@ -561,7 +549,7 @@
<string name="keep_local" msgid="1258761699192993322">"本地保存"</string>
<string name="add_account" msgid="8201790677994503186">"添加帐户"</string>
<string name="add_new_account" msgid="5748627740680940264">"添加新帐户"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"呼叫未发出"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"语音信箱号码不可用"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"电话未拨出"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"要设置语音信箱,请转到“菜单”>“设置”。"</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"要呼叫语音信箱,请先关闭飞行模式。"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 072daec..a42a94b 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"搜尋"</string>
<string name="menu_newContact" msgid="1209922412763274638">"新增聯絡人"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"檢視聯絡人"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"撥打電話給 <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"撥打 <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"新增至我的最愛"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"從我的最愛中移除"</string>
<string name="menu_editContact" msgid="9042415603857662633">"編輯"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"建議聯絡人"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"所有聯絡人"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"已合併聯絡人"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"確定要刪除聯絡人?"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"設定電話鈴聲"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"將所有來電轉到語音信箱"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"您無法刪除唯讀帳戶的聯絡人,但可在聯絡人清單中隱藏這些聯絡人。"</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> 分 <xliff:g id="SECONDS">%s</xliff:g> 秒"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"常用聯絡人"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"常用聯絡人"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"新增聯絡人"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"要將「<xliff:g id="EMAIL">%s</xliff:g>」加到通訊錄嗎?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"1"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"2"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"負號"</string>
<string name="description_plus_button" msgid="515164827856229880">"加號"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"查看聯絡人"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"儲存裝置無法使用"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"無 SD 卡"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"找不到任何儲存裝置。"</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"找不到 SD 卡。"</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"正在搜尋 VCard"</string>
<string name="import_from_sim" msgid="3859272228033941659">"從 SIM 卡匯入"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"從儲存裝置匯入"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"匯出到儲存裝置"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"匯入所有 vCard 檔案"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"正在搜尋儲存裝置中的 vCard 資料…"</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"正在 SD 卡上搜尋 vCard 資料…"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"無法掃描儲存裝置"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"無法掃描 SD 卡"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"無法掃描儲存裝置 (原因:<xliff:g id="FAIL_REASON">%s</xliff:g>)。"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"無法掃描 SD 卡 (原因:<xliff:g id="FAIL_REASON">%s</xliff:g>)。"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"I/O 錯誤"</string>
@@ -252,7 +245,7 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"<xliff:g id="FILENAME">%s</xliff:g> 將在稍後匯出。"</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"vCard 匯出要求遭到拒絕,請稍後再試。"</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"聯絡人"</string>
- <string name="percentage" msgid="34897865327092209">"%s%%"</string>
+ <string name="percentage" msgid="1887004062152632812">"<xliff:g id="PERCENTAGE">%s</xliff:g><xliff:g id="PERCENTSIGN">%%</xliff:g>"</string>
<string name="confirm_export_title" msgid="6834385377255286349">"確定要匯出聯絡人?"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"您的聯絡人清單即將匯出至以下檔案:<xliff:g id="VCARD_FILENAME">%s</xliff:g>。"</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"無法匯出"</string>
@@ -273,9 +266,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"vCard 編輯器並未正確啟動。"</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"無法開啟「<xliff:g id="FILE_NAME">%s</xliff:g>」:<xliff:g id="EXACT_REASON">%s</xliff:g>。"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"第 <xliff:g id="CURRENT_NUMBER">%s</xliff:g> 位聯絡人,共 <xliff:g id="TOTAL_NUMBER">%s</xliff:g> 位"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"取消匯入 vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"確定要取消匯入 <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"取消匯出 vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"確定要取消匯出 <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"無法取消匯入/匯出 vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"您的聯絡人姓名"</string>
@@ -291,8 +282,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"要顯示的聯絡人"</string>
<string name="menu_import_export" msgid="26217871113229507">"匯入/匯出"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"匯入/匯出聯絡人"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"匯入聯絡人"</string>
<string name="menu_share" msgid="943789700636542260">"分享"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"所有聯絡人"</string>
<string name="share_via" msgid="563121028023030093">"使用下列應用程式分享聯絡人資訊:"</string>
<string name="share_error" msgid="948429331673358107">"無法分享這位聯絡人。"</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"姓名"</string>
@@ -441,9 +432,7 @@
<item quantity="other" msgid="425683718017380845">"從 <xliff:g id="COUNT">%0$d</xliff:g> 個來源合併"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"其他"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"合併聯絡人"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"要將目前聯絡人與所選聯絡人合併嗎?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"編輯所選聯絡人"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"要切換至編輯所選聯絡人嗎?系統會為您複製目前已輸入的資訊。"</string>
<string name="menu_copyContact" msgid="1573960845106822639">"複製到我的通訊錄"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"新增至我的聯絡人"</string>
@@ -475,10 +464,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"載入中…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"建立新聯絡人"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"登入帳戶"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"從檔案匯入聯絡人"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"匯入聯絡人"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"建立新群組"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[建立新群組]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"刪除群組"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 個群組"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> 個群組"</item>
@@ -497,7 +485,6 @@
<string name="set_default" msgid="4417505153468300351">"設為預設值"</string>
<string name="clear_default" msgid="7193185801596678067">"清除預設值"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"文字已複製"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"捨棄變更"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"確定要捨棄變更?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"設定我的個人資料"</string>
@@ -561,7 +548,7 @@
<string name="keep_local" msgid="1258761699192993322">"儲存在本機中"</string>
<string name="add_account" msgid="8201790677994503186">"新增帳戶"</string>
<string name="add_new_account" msgid="5748627740680940264">"新增帳戶"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"未送出通話要求"</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"語音信箱號碼無法使用"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"無法撥號"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"如要設定語音信箱,請前往 [選單] > [設定]。"</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"如要聽語音留言,請先關閉飛行模式。"</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 441e192..fa0672b 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -41,7 +41,7 @@
<string name="menu_search" msgid="9147752853603483719">"Sesha"</string>
<string name="menu_newContact" msgid="1209922412763274638">"Othintana naye omusha"</string>
<string name="menu_viewContact" msgid="2795575601596468581">"Buka othintana naye"</string>
- <string name="menu_callNumber" msgid="5142851348489387516">"Shayela <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Shayela u-<xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="menu_addStar" msgid="2908478235715404876">"Engeza ezintandokazini"</string>
<string name="menu_removeStar" msgid="5844227078364227030">"Susa ezintandokazini"</string>
<string name="menu_editContact" msgid="9042415603857662633">"Hlela"</string>
@@ -62,7 +62,6 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Othintana nabo abasikiselwayo"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Bonke othintana nabo"</string>
<string name="contactsJoinedMessage" msgid="7208148163607047389">"Othintana nabo abahlanganisiwe"</string>
- <string name="deleteConfirmation_title" msgid="1418215926447642260">"Susa othintana naye"</string>
<string name="menu_set_ring_tone" msgid="8728345772068064946">"Hlela iringithoni"</string>
<string name="menu_redirect_calls_to_vm" msgid="4181789196416396656">"Wonke amakholi aya kwimeyili yezwi"</string>
<string name="readOnlyContactWarning" msgid="7808825687289848259">"Awukwazi ukususa othintana nabo ema-akhawuntini okufunda kuphela, kodwa ungabafihla ohlwini lwakho loxhumana nabo."</string>
@@ -186,7 +185,6 @@
<string name="callDetailsDurationFormat" msgid="8157706382818184268">"<xliff:g id="MINUTES">%s</xliff:g> amaminithi <xliff:g id="SECONDS">%s</xliff:g> amasekhondi"</string>
<string name="favoritesFrequentContacted" msgid="6184232487472425690">"Abathintwa njalo"</string>
<string name="favoritesFrequentCalled" msgid="6128306889600696124">"Abashayelwa njalo"</string>
- <string name="add_contact_dlg_title" msgid="2896685845822146494">"Faka othintana naye"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Faka \"<xliff:g id="EMAIL">%s</xliff:g>\" kothintana nabo?"</string>
<string name="description_image_button_one" msgid="1740638037139856139">"kunye"</string>
<string name="description_image_button_two" msgid="5882638439003731308">"okubili"</string>
@@ -209,11 +207,8 @@
<string name="description_minus_button" msgid="387136707700230172">"susa"</string>
<string name="description_plus_button" msgid="515164827856229880">"kuhlanganise"</string>
<string name="description_view_contact_detail" msgid="9133251213656414807">"Buka othintana naye"</string>
- <string name="no_sdcard_title" product="nosdcard" msgid="8543619259870877473">"Isitoreji asitholakali"</string>
- <string name="no_sdcard_title" product="default" msgid="5911758680339949273">"Alikho ikhadi le-SD"</string>
<string name="no_sdcard_message" product="nosdcard" msgid="5242558018442357189">"Ayikho indawo yokulondoloza etholakele."</string>
<string name="no_sdcard_message" product="default" msgid="3357810406684913482">"Alikho ikhadi le-SD elitholakele."</string>
- <string name="searching_vcard_title" msgid="4970508055399376813">"Iseshela i-vCArd"</string>
<string name="import_from_sim" msgid="3859272228033941659">"Ngenisa kusuka kwikhadi le-SIM"</string>
<string name="import_from_sdcard" product="default" msgid="8668347930577565175">"Ngenisa kusuka esigcineni"</string>
<string name="export_to_sdcard" product="default" msgid="6092815580965201089">"Thekelisa kusigcini"</string>
@@ -223,8 +218,6 @@
<string name="import_all_vcard_string" msgid="5518136113853448474">"Ngenisa wonke amafayela e-vCard"</string>
<string name="searching_vcard_message" product="nosdcard" msgid="557077639409584945">"Isesha idatha ye-vCard kusigcini"</string>
<string name="searching_vcard_message" product="default" msgid="3962269894118092049">"Iseshela idatha ye-vCard ekhadini le-SD"</string>
- <string name="scanning_sdcard_failed_title" product="nosdcard" msgid="4944932641334764942">"Yehlulekile ukufinyelela kwindawo yokugcina i-USB"</string>
- <string name="scanning_sdcard_failed_title" product="default" msgid="6664940444476572612">"Yehlulekile ukuskena ikhadi le-SD"</string>
<string name="scanning_sdcard_failed_message" product="nosdcard" msgid="7221682312959229201">"Isilondolozi asiskeneknga. (Isizathu: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="scanning_sdcard_failed_message" product="default" msgid="189023067829510792">"Ikhadi le-SD aliskenekanga. (Isizathu: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\")"</string>
<string name="fail_reason_io_error" msgid="6748358842976073255">"Iphutha le-I/O"</string>
@@ -252,7 +245,8 @@
<string name="vcard_export_will_start_message" msgid="2210241345252081463">"i-<xliff:g id="FILENAME">%s</xliff:g> izothekeliswa maduze nje."</string>
<string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Isicelo sokuthekelisa i-vCard sinqatshelwe. Sicela uzame futhi emva kwesikhathi."</string>
<string name="vcard_unknown_filename" msgid="7171709890959915954">"othintana nabo"</string>
- <string name="percentage" msgid="34897865327092209">"%S%%"</string>
+ <!-- no translation found for percentage (1887004062152632812) -->
+ <skip />
<string name="confirm_export_title" msgid="6834385377255286349">"Thekelisa othintana nabo"</string>
<string name="confirm_export_message" msgid="2423421354816428708">"Uhlu loxhumana nabo luyothunyelw efayelini: <xliff:g id="VCARD_FILENAME">%s</xliff:g>."</string>
<string name="exporting_contact_failed_title" msgid="4892358112409576342">"Yehlulekile ukuthumela"</string>
@@ -273,9 +267,7 @@
<string name="composer_not_initialized" msgid="2321648986367005254">"Umqambi we-Vcard akazange aqale ngendlela efanele."</string>
<string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Ayikwazi ukuvula \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> kothintana nabo abangu-<xliff:g id="TOTAL_NUMBER">%s</xliff:g>"</string>
- <string name="cancel_import_confirmation_title" msgid="5578683596010294836">"Ikhansela ukungenisa i-vCard"</string>
<string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Misa ukulndwa kwe <xliff:g id="FILENAME">%s</xliff:g>?"</string>
- <string name="cancel_export_confirmation_title" msgid="6516467140276768528">"Ikhansela ukuthekelisa i-vCard"</string>
<string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Misa ukulandwa kwe <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Yehlulekile ukukhansela ukungenisa/thekelisa i-vCard"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Amagama othintana nabo"</string>
@@ -291,8 +283,8 @@
<string name="menu_contacts_filter" msgid="2165153460860262501">"Othintana nabo abazoboniswa"</string>
<string name="menu_import_export" msgid="26217871113229507">"Ngenisa/Thekelisa"</string>
<string name="dialog_import_export" msgid="4360648034889921624">"Ngenisa/Thekelisa othintana nabo"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Ngenisa othintana nabo"</string>
<string name="menu_share" msgid="943789700636542260">"Yabelana"</string>
- <string name="menu_all_contacts" msgid="5101735431586050711">"Bonke oxhumana nabo"</string>
<string name="share_via" msgid="563121028023030093">"Abelana nothintana naye nge"</string>
<string name="share_error" msgid="948429331673358107">"Lona oxhumana naye ngeke ukwazi ukwabelana ngaye."</string>
<string name="nameLabelsGroup" msgid="2034640839640477827">"Igama"</string>
@@ -441,9 +433,7 @@
<item quantity="other" msgid="425683718017380845">"ihlanganiswe kusuka emithombeni engu-<xliff:g id="COUNT">%0$d</xliff:g>"</item>
</plurals>
<string name="local_invisible_directory" msgid="6046691709127661065">"Okunye"</string>
- <string name="aggregation_suggestion_join_dialog_title" msgid="5276699501316246253">"Joyina othintana nabo"</string>
<string name="aggregation_suggestion_join_dialog_message" msgid="3842757977671434836">"Joyina othintana naye wamanje nothintana naye okhethiwe?"</string>
- <string name="aggregation_suggestion_edit_dialog_title" msgid="1064042382692091314">"Hlela ama-akhawunti akhethiwe"</string>
<string name="aggregation_suggestion_edit_dialog_message" msgid="6549585283910518095">"Shintshela ekuhleleni othintana naye okhethiwe? Ulwazi olufakile kuze kube manje luzokopishwa."</string>
<string name="menu_copyContact" msgid="1573960845106822639">"Kopisha kwengithintana nabo"</string>
<string name="add_to_my_contacts" msgid="1068274916793627723">"Faka Kothintana Nabo"</string>
@@ -475,10 +465,9 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Iyalayisha…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Dala othintana naye omusha"</string>
<string name="contacts_unavailable_add_account" msgid="7911101713860139754">"Ngena ngemvume kwi-akhawunti"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4456440183590517471">"Ngenisa othintana nabo kwifayela"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Ngenisa othintana nabo"</string>
<string name="create_group_dialog_title" msgid="6874527142828424475">"Dala iqembu elisha"</string>
<string name="create_group_item_label" msgid="5218022006186243310">"[Yenza iqembu elisha]"</string>
- <string name="delete_group_dialog_title" msgid="7368429698398624427">"Susa iqembu"</string>
<plurals name="num_groups_in_account">
<item quantity="one" msgid="2944819210288517794">"1 isigcawu"</item>
<item quantity="other" msgid="1276758425904917367">"<xliff:g id="COUNT">%0$d</xliff:g> Amaqembu"</item>
@@ -497,7 +486,6 @@
<string name="set_default" msgid="4417505153468300351">"Hlela okuzenzakalelayo"</string>
<string name="clear_default" msgid="7193185801596678067">"Sula okuzenzakalelayo"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Umbhalo okopishiwe"</string>
- <string name="cancel_confirmation_dialog_title" msgid="3950463632415908534">"Lahla izinguquko"</string>
<string name="cancel_confirmation_dialog_message" msgid="5885724679874403115">"Lahla izinguquko ozenzile?"</string>
<string name="call_type_and_date" msgid="1766269584078149149">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="profile_display_name" msgid="4127389543625918771">"Misa iphrofayli yami"</string>
@@ -561,7 +549,7 @@
<string name="keep_local" msgid="1258761699192993322">"Gcina kuseduze"</string>
<string name="add_account" msgid="8201790677994503186">"Engeza i-akhawunti"</string>
<string name="add_new_account" msgid="5748627740680940264">"Yengeza i-akhawunti enthsha"</string>
- <string name="dialog_phone_call_prohibited_title" msgid="2111395432187079579">"Ucingo aluthunyelwanga."</string>
- <string name="dialog_voicemail_not_ready_title" msgid="7258109862329777060">"Inombolo yomlayezo wephimbo ayikho"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="6554711866586660441">"ucingo aluthunyelwanga"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Ukuya emyalezweni wephimbo, yana ezisethweni > zemenyu."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Ukushayela i-voicemail, vala kuqala imodi Yendiza."</string>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index e856d67..db81fed 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -46,6 +46,9 @@
<!-- Minimum height of a row in the Editor -->
<dimen name="editor_min_line_item_height">48dip</dimen>
+ <!-- Height of the shadow asset under the photo on the contact detail page -->
+ <dimen name="detail_contact_photo_shadow_height">10dip</dimen>
+
<!-- Height of the tab text label in the tab carousel on the contact detail page -->
<dimen name="detail_tab_carousel_tab_label_height">45dip</dimen>
@@ -178,7 +181,9 @@
<dimen name="join_header_top_margin">16dip</dimen>
<dimen name="join_header_bottom_margin">0dip</dimen>
- <dimen name="account_filter_header_top_padding">0dip</dimen>
+ <!-- Padding between the action bar's bottom edge and the first header
+ in contacts/group lists. -->
+ <dimen name="list_header_extra_top_padding">0dip</dimen>
<!-- ContactTile Layouts -->
<!--
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7bb875c..a88e6a8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -100,8 +100,8 @@
<!-- Menu item used to view the details for a specific contact -->
<string name="menu_viewContact">View contact</string>
- <!-- 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 call a contact, containing the number of the contact to call -->
+ <string name="menu_callNumber">Call <xliff:g id="number">%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>
@@ -163,9 +163,6 @@
<!-- Toast shown after two contacts have been joined by a user action -->
<string name="contactsJoinedMessage">Contacts joined</string>
- <!-- Confirmation dialog title after users selects to delete a contact. [CHAR LIMIT=25]-->
- <string name="deleteConfirmation_title">Delete contact?</string>
-
<!-- Menu item that opens the Options activity for a given contact [CHAR LIMIT=15] -->
<string name="menu_set_ring_tone">Set ringtone</string>
@@ -452,7 +449,8 @@
<!-- 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.) -->
+ to sending DTMF tones over the current call.)
+ [CHAR LIMIT=40] -->
<string name="dialerDialpadHintText">Dial to add a call</string>
<!-- Dialog text displayed when loading a phone number from the SIM card for speed dial -->
@@ -584,8 +582,6 @@
<!-- The text displayed on the divider for the Favorites tab in Phone app indicating that items below it are frequently called as opposed to starred contacts [CHAR LIMIT = 39] -->
<string name="favoritesFrequentCalled">Frequently called</string>
- <!-- Dialog title when prompting before creating a contact -->
- <string name="add_contact_dlg_title">Add contact</string>
<!-- Dialog message when prompting before creating a contact. Includes
the email address, e.g. "Add xyz@foo.com to contacts?" -->
<string name="add_contact_dlg_message_fmt">Add \"<xliff:g id="email">%s</xliff:g>\" to contacts?</string>
@@ -731,19 +727,11 @@
-->
<string name="description_view_contact_detail" msgid="2795575601596468581">View contact</string>
- <!-- Dialog title shown when (USB) storage does not exist [CHAR LIMIT=25] -->
- <string name="no_sdcard_title" product="nosdcard">Storage unavailable</string>
- <!-- Dialog title shown when SD Card does not exist -->
- <string name="no_sdcard_title" product="default">No SD card</string>
-
<!-- Dialog message shown when (USB) storage does not exist [CHAR LIMIT=30] -->
<string name="no_sdcard_message" product="nosdcard">No storage was found.</string>
<!-- Dialog message shown when SDcard does not exist. [CHAR LIMIT=30] -->
<string name="no_sdcard_message" product="default">No SD card was found.</string>
- <!-- Dialog title shown when searching vCard data from SD Card -->
- <string name="searching_vcard_title">Searching for vCard</string>
-
<!-- Action string for selecting SIM for importing contacts -->
<string name="import_from_sim">Import from SIM card</string>
@@ -776,11 +764,6 @@
<!-- Dialog message shown when searching VCard data from SD Card. [CHAR LIMIT=NONE] -->
<string name="searching_vcard_message" product="default">Searching for vCard data on SD card\u2026</string>
- <!-- Dialog title shown when scanning VCard data failed. [CHAR LIMIT=NONE] -->
- <string name="scanning_sdcard_failed_title" product="nosdcard">Couldn\'t scan storage</string>
- <!-- Dialog title shown when scanning VCard data failed. -->
- <string name="scanning_sdcard_failed_title" product="default">Couldn\'t scan SD card</string>
-
<!-- Dialog message shown when searching VCard data failed.
An exact reason for the failure should [CHAR LIMIT=NONE] -->
<string name="scanning_sdcard_failed_message" product="nosdcard">The storage couldn\'t be scanned. (Reason: \"<xliff:g id="fail_reason">%s</xliff:g>\")</string>
@@ -890,7 +873,7 @@
<string name="vcard_unknown_filename">contact</string>
<!-- The percentage, used for expressing the progress of vCard import/export. -->
- <string name="percentage">%s%%</string>
+ <string name="percentage"><xliff:g id="percentage" example="50">%s</xliff:g><xliff:g id="percentsign" example="%">%%</xliff:g></string>
<!-- Dialog title shown when a user confirms whether he/she export Contact data. [CHAR LIMIT=32] -->
<string name="confirm_export_title">Export contacts?</string>
@@ -968,17 +951,11 @@
<!-- Message in progress bar while exporting contact list to a file "(current number) of (total number) contacts" The order of "current number" and "total number" cannot be changed (like "total: (total number), current: (current number)")-->
<string name="exporting_contact_list_progress"><xliff:g id="current_number">%s</xliff:g> of <xliff:g id="total_number">%s</xliff:g> contacts</string>
- <!-- Title shown in a Dialog confirming a user's cancel request toward existing vCard import. [CHAR LIMIT=40] -->
- <string name="cancel_import_confirmation_title">Canceling vCard import</string>
-
<!-- Message shown in a Dialog confirming a user's cancel request toward existing vCard import.
The argument is file name for the vCard import the user wants to cancel.
[CHAR LIMIT=128] -->
<string name="cancel_import_confirmation_message">Cancel import of <xliff:g id="filename" example="import.vcf">%s</xliff:g>?</string>
- <!-- Title shown in a Dialog confirming a user's cancel request toward existing vCard export. [CHAR LIMIT=128] -->
- <string name="cancel_export_confirmation_title">Canceling vCard export</string>
-
<!-- Message shown in a Dialog confirming a user's cancel request toward existing vCard export.
The argument is file name for the vCard export the user wants to cancel.
[CHAR LIMIT=128] -->
@@ -1025,12 +1002,12 @@
<!-- Dialog title when selecting the bulk operation to perform from a list. [CHAR LIMIT=36] -->
<string name="dialog_import_export">Import/export contacts</string>
+ <!-- Dialog title when importing contacts from an external source. [CHAR LIMIT=36] -->
+ <string name="dialog_import">Import contacts</string>
+
<!-- The menu item to share the currently viewed contact [CHAR LIMIT=30] -->
<string name="menu_share">Share</string>
- <!-- The menu item to show all contacts in Phone entrance [CHAR LIMIT=30] -->
- <string name="menu_all_contacts">All contacts</string>
-
<!-- Dialog title when picking the application to share a contact with. -->
<string name="share_via">Share contact via</string>
@@ -1393,19 +1370,11 @@
<!-- The name of the invisible local contact directory -->
<string name="local_invisible_directory">Other</string>
- <!-- The title of a confirmation dialog shown when the user selects a
- contact aggregation suggestion in Contact editor. [CHAR LIMIT=128]-->
- <string name="aggregation_suggestion_join_dialog_title">Join contacts</string>
-
<!-- The message in a confirmation dialog shown when the user selects a
contact aggregation suggestion in Contact editor. [CHAR LIMIT=512]-->
<string name="aggregation_suggestion_join_dialog_message">Join
the current contact with the selected contact?</string>
- <!-- The title of a confirmation dialog shown when the user selects a
- contact aggregation suggestion in Contact editor. [CHAR LIMIT=128]-->
- <string name="aggregation_suggestion_edit_dialog_title">Edit selected contacts</string>
-
<!-- The message in a confirmation dialog shown when the user selects a
contact aggregation suggestion in Contact editor. [CHAR LIMIT=512]-->
<string name="aggregation_suggestion_edit_dialog_message">Switch to editing
@@ -1509,7 +1478,7 @@
<!-- Button shown on the main contacts screen when there are no contacts on the device.
Initiates a contact import dialog [CHAR LIMIT=128] -->
- <string name="contacts_unavailable_import_contacts">Import contacts from a file</string>
+ <string name="contacts_unavailable_import_contacts">Import contacts</string>
<!-- Title of the dialog that allows creation of a contact group [CHAR LIMIT=128] -->
<string name="create_group_dialog_title">Create new group</string>
@@ -1517,9 +1486,6 @@
<!-- An item in the popup list of groups that triggers creation of a contact group [CHAR LIMIT=128] -->
<string name="create_group_item_label">[Create new group]</string>
- <!-- Title of the dialog that allows deletion of a contact group [CHAR LIMIT=128] -->
- <string name="delete_group_dialog_title">Delete group</string>
-
<!-- Shows how many groups are from the specified account [CHAR LIMIT=15] -->
<plurals name="num_groups_in_account">
<item quantity="one">1 group</item>
@@ -1562,9 +1528,6 @@
<!-- Toast shown when text is copied to the clipboard [CHAR LIMIT=64] -->
<string name="toast_text_copied">Text copied</string>
- <!-- Title of the alert dialog when the user hits the Cancel button in the editor [CHAR LIMIT=64] -->
- <string name="cancel_confirmation_dialog_title">Discard changes</string>
-
<!-- Contents of the alert dialog when the user hits the Cancel button in the editor [CHAR LIMIT=128] -->
<string name="cancel_confirmation_dialog_message">Discard your changes?</string>
@@ -1818,15 +1781,17 @@
<!-- Button label to prompt the user to add another account (when there are already existing accounts on the device) [CHAR LIMIT=30] -->
<string name="add_new_account">Add new account</string>
- <!-- Dialog title which is shown when the user tries to make a phone call
- to prohibited phone numbers [CHAR LIMIT=40] -->
- <string name="dialog_phone_call_prohibited_title" msgid="4313552620858880999">Call not sent</string>
-
- <!-- Dialog title which is shown when the user tries to check voicemail
- while the system isn't ready for the access. [CHAR LIMIT=40] -->
- <string name="dialog_voicemail_not_ready_title">Voicemail number unavailable</string>
+ <!-- Dialog message which is shown when the user tries to make a phone call
+ to prohibited phone numbers [CHAR LIMIT=NONE] -->
+ <string name="dialog_phone_call_prohibited_message" msgid="4313552620858880999">Call not sent</string>
<!-- Dialog message which is shown when the user tries to check voicemail
while the system isn't ready for the access. [CHAR LIMIT=NONE] -->
<string name="dialog_voicemail_not_ready_message">To set up voicemail, go to Menu > Settings.</string>
+
+ <!-- Dialog message which is shown when the user tries to check voicemail
+ while the system is in airplane mode. The user cannot access to
+ voicemail service in Airplane mode. [CHAR LIMI=NONE] -->
+ <string name="dialog_voicemail_airplane_mode_message">To call voicemail, first turn off Airplane mode.</string>
+
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index f22ff1d..ae2ecc2 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -38,7 +38,7 @@
<item name="list_item_presence_icon_size">16dip</item>
<item name="list_item_photo_size">@dimen/contact_browser_list_item_photo_size</item>
<item name="list_item_profile_photo_size">70dip</item>
- <item name="list_item_prefix_highlight_color">#729a27</item>
+ <item name="list_item_prefix_highlight_color">@color/people_app_theme_color</item>
<item name="list_item_header_text_indent">8dip</item>
<item name="list_item_header_text_color">@color/people_app_theme_color</item>
<item name="list_item_header_text_size">14sp</item>
@@ -284,7 +284,8 @@
</style>
<style name="DialtactsActionBarStyle" parent="android:Widget.Holo.ActionBar">
- <item name="android:backgroundSplit">@null</item>
+ <!-- For making test easier. Should use @null. -->
+ <!-- <item name="android:backgroundSplit">@null</item> -->
<item name="android:backgroundStacked">@drawable/ab_stacked_opaque_dark_holo</item>
<item name="android:displayOptions"></item>
</style>
@@ -314,6 +315,15 @@
<item name="android:background">@color/quickcontact_tab_indicator</item>
</style>
+ <style name="Theme.PhotoSelector" parent="@android:style/Theme.Holo.Light">
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowFrame">@null</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowAnimationStyle">@null</item>
+ <item name="android:backgroundDimEnabled">false</item>
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowNoTitle">true</item>
+ </style>
<style name="GroupMembershipSizeTextAppearance" parent="@android:style/TextAppearance.Small"/>
diff --git a/src/com/android/contacts/CallContactActivity.java b/src/com/android/contacts/CallContactActivity.java
index b7c472a..793770b 100644
--- a/src/com/android/contacts/CallContactActivity.java
+++ b/src/com/android/contacts/CallContactActivity.java
@@ -18,10 +18,8 @@
import com.android.contacts.interactions.PhoneNumberInteraction;
-import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
-import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
@@ -50,7 +48,7 @@
if (Contacts.CONTENT_ITEM_TYPE.equals(getContentResolver().getType(contactUri))) {
PhoneNumberInteraction.startInteractionForPhoneCall(this, contactUri);
} else {
- startActivity(new Intent(Intent.ACTION_CALL_PRIVILEGED, contactUri));
+ startActivity(ContactsUtils.getCallIntent(contactUri));
finish();
}
}
diff --git a/src/com/android/contacts/CallDetailActivity.java b/src/com/android/contacts/CallDetailActivity.java
index caa8bce..428e2e8 100644
--- a/src/com/android/contacts/CallDetailActivity.java
+++ b/src/com/android/contacts/CallDetailActivity.java
@@ -22,8 +22,10 @@
import com.android.contacts.calllog.ContactInfo;
import com.android.contacts.calllog.ContactInfoHelper;
import com.android.contacts.calllog.PhoneNumberHelper;
+import com.android.contacts.format.FormatUtils;
import com.android.contacts.util.AsyncTaskExecutor;
import com.android.contacts.util.AsyncTaskExecutors;
+import com.android.contacts.util.Constants;
import com.android.contacts.voicemail.VoicemailPlaybackFragment;
import com.android.contacts.voicemail.VoicemailStatusHelper;
import com.android.contacts.voicemail.VoicemailStatusHelper.StatusMessage;
@@ -331,9 +333,8 @@
TelephonyManager tm = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
if (tm.getCallState() == TelephonyManager.CALL_STATE_IDLE) {
- Intent callIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts("tel", mNumber, null));
- startActivity(callIntent);
+ startActivity(ContactsUtils.getCallIntent(
+ Uri.fromParts(Constants.SCHEME_TEL, mNumber, null)));
return true;
}
}
@@ -388,7 +389,6 @@
mPhoneCallDetailsHelper.setCallDetailsHeader(mHeaderTextView, firstDetails);
// Cache the details about the phone number.
- final Uri numberCallUri = mPhoneNumberHelper.getCallUri(mNumber);
final boolean canPlaceCallsTo = mPhoneNumberHelper.canPlaceCallsTo(mNumber);
final boolean isVoicemailNumber = mPhoneNumberHelper.isVoicemailNumber(mNumber);
final boolean isSipNumber = mPhoneNumberHelper.isSipNumber(mNumber);
@@ -469,9 +469,10 @@
firstDetails.number, firstDetails.formattedNumber);
ViewEntry entry = new ViewEntry(
- getString(R.string.menu_callNumber, displayNumber),
- new Intent(Intent.ACTION_CALL_PRIVILEGED, numberCallUri),
- getString(R.string.description_call, nameOrNumber));
+ getString(R.string.menu_callNumber,
+ FormatUtils.forceLeftToRight(displayNumber)),
+ ContactsUtils.getCallIntent(mNumber),
+ getString(R.string.description_call, nameOrNumber));
// Only show a label if the number is shown and it is not a SIP address.
if (!TextUtils.isEmpty(firstDetails.name)
@@ -771,7 +772,7 @@
}
public void onMenuEditNumberBeforeCall(MenuItem menuItem) {
- startActivity(new Intent(Intent.ACTION_DIAL, mPhoneNumberHelper.getCallUri(mNumber)));
+ startActivity(new Intent(Intent.ACTION_DIAL, ContactsUtils.getCallUri(mNumber)));
}
public void onMenuTrashVoicemail(MenuItem menuItem) {
diff --git a/src/com/android/contacts/ContactLoader.java b/src/com/android/contacts/ContactLoader.java
index c711b6c..b7cc87d 100644
--- a/src/com/android/contacts/ContactLoader.java
+++ b/src/com/android/contacts/ContactLoader.java
@@ -301,8 +301,11 @@
return mRequestedUri;
}
+ /**
+ * Returns the contact ID.
+ */
@VisibleForTesting
- /*package*/ long getId() {
+ /* package */ long getId() {
return mId;
}
@@ -1262,6 +1265,21 @@
mLoadInvitableAccountTypes = loadInvitableAccountTypes;
}
+ /**
+ * Sets whether to load stream items. Will trigger a reload if the value has changed.
+ * At the moment, this is only used for debugging purposes
+ */
+ public void setLoadStreamItems(boolean value) {
+ if (mLoadStreamItems != value) {
+ mLoadStreamItems = value;
+ onContentChanged();
+ }
+ }
+
+ public boolean getLoadStreamItems() {
+ return mLoadStreamItems;
+ }
+
public Uri getLookupUri() {
return mLookupUri;
}
diff --git a/src/com/android/contacts/ContactPhotoManager.java b/src/com/android/contacts/ContactPhotoManager.java
index 7c54e80..cb0dc78 100644
--- a/src/com/android/contacts/ContactPhotoManager.java
+++ b/src/com/android/contacts/ContactPhotoManager.java
@@ -30,8 +30,10 @@
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.TransitionDrawable;
import android.net.Uri;
import android.os.Handler;
import android.os.Handler.Callback;
@@ -98,7 +100,7 @@
}
}
- public static final DefaultImageProvider DEFAULT_AVATER = new AvatarDefaultImageProvider();
+ public static final DefaultImageProvider DEFAULT_AVATAR = new AvatarDefaultImageProvider();
public static final DefaultImageProvider DEFAULT_BLANK = new BlankDefaultImageProvider();
@@ -131,10 +133,10 @@
/**
* Calls {@link #loadPhoto(ImageView, long, boolean, boolean, DefaultImageProvider)} with
- * {@link #DEFAULT_AVATER}.
+ * {@link #DEFAULT_AVATAR}.
*/
public final void loadPhoto(ImageView view, long photoId, boolean hires, boolean darkTheme) {
- loadPhoto(view, photoId, hires, darkTheme, DEFAULT_AVATER);
+ loadPhoto(view, photoId, hires, darkTheme, DEFAULT_AVATAR);
}
/**
@@ -147,10 +149,10 @@
/**
* Calls {@link #loadPhoto(ImageView, Uri, boolean, boolean, DefaultImageProvider)} with
- * {@link #DEFAULT_AVATER}.
+ * {@link #DEFAULT_AVATAR}.
*/
public final void loadPhoto(ImageView view, Uri photoUri, boolean hires, boolean darkTheme) {
- loadPhoto(view, photoUri, hires, darkTheme, DEFAULT_AVATER);
+ loadPhoto(view, photoUri, hires, darkTheme, DEFAULT_AVATAR);
}
/**
@@ -177,6 +179,14 @@
public abstract void refreshCache();
/**
+ * Stores the given bitmap directly in the LRU bitmap cache.
+ * @param photoUri The URI of the photo (for future requests).
+ * @param bitmap The bitmap.
+ * @param photoBytes The bytes that were parsed to create the bitmap.
+ */
+ public abstract void cacheBitmap(Uri photoUri, Bitmap bitmap, byte[] photoBytes);
+
+ /**
* Initiates a background process that over time will fill up cache with
* preload photos.
*/
@@ -201,6 +211,8 @@
class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback {
private static final String LOADER_THREAD_NAME = "ContactPhotoLoader";
+ private static final int FADE_TRANSITION_DURATION = 200;
+
/**
* Type of message sent by the UI thread to itself to indicate that some photos
* need to be loaded.
@@ -428,7 +440,7 @@
}
private void loadPhotoByIdOrUri(ImageView view, Request request) {
- boolean loaded = loadCachedPhoto(view, request);
+ boolean loaded = loadCachedPhoto(view, request, false);
if (loaded) {
mPendingRequests.remove(view);
} else {
@@ -459,7 +471,13 @@
*
* @return false if the photo needs to be (re)loaded from the provider.
*/
- private boolean loadCachedPhoto(ImageView view, Request request) {
+ private boolean loadCachedPhoto(ImageView view, Request request, boolean fadeIn) {
+ Bitmap bitmap = mBitmapCache.get(request.getKey());
+ if (bitmap != null) {
+ view.setImageBitmap(bitmap);
+ return true;
+ }
+
BitmapHolder holder = mBitmapHolderCache.get(request.getKey());
if (holder == null) {
// The bitmap has not been loaded - should display the placeholder image.
@@ -475,11 +493,21 @@
// Optionally decode bytes into a bitmap
inflateBitmap(holder);
- view.setImageBitmap(holder.bitmap);
+ if (fadeIn) {
+ Drawable[] layers = new Drawable[2];
+ layers[0] = mContext.getResources().getDrawable(
+ getDefaultAvatarResId(request.mHires, request.mDarkTheme));
+ layers[1] = new BitmapDrawable(mContext.getResources(), holder.bitmap);
+ TransitionDrawable drawable = new TransitionDrawable(layers);
+ view.setImageDrawable(drawable);
+ drawable.startTransition(FADE_TRANSITION_DURATION);
+ } else {
+ view.setImageBitmap(holder.bitmap);
+ }
if (holder.bitmap != null) {
// Put the bitmap in the LRU cache
- mBitmapCache.put(request, holder.bitmap);
+ mBitmapCache.put(request.getKey(), holder.bitmap);
}
// Soften the reference
@@ -598,7 +626,7 @@
while (iterator.hasNext()) {
ImageView view = iterator.next();
Request key = mPendingRequests.get(view);
- boolean loaded = loadCachedPhoto(view, key);
+ boolean loaded = loadCachedPhoto(view, key, true);
if (loaded) {
iterator.remove();
}
@@ -649,6 +677,14 @@
mBitmapHolderCache.put(key, holder);
}
+ @Override
+ public void cacheBitmap(Uri photoUri, Bitmap bitmap, byte[] photoBytes) {
+ Request request = Request.createFromUri(photoUri, true, false, DEFAULT_AVATAR);
+ BitmapHolder holder = new BitmapHolder(photoBytes);
+ mBitmapHolderCache.put(request.getKey(), holder);
+ mBitmapCache.put(request.getKey(), bitmap);
+ }
+
/**
* Populates an array of photo IDs that need to be loaded.
*/
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index be84cc4..f475609 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -37,6 +37,7 @@
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Parcelable;
@@ -53,6 +54,10 @@
import android.util.Log;
import android.widget.Toast;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -80,6 +85,7 @@
public static final String EXTRA_SAVE_MODE = "saveMode";
public static final String EXTRA_SAVE_IS_PROFILE = "saveIsProfile";
public static final String EXTRA_SAVE_SUCCEEDED = "saveSucceeded";
+ public static final String EXTRA_UPDATED_PHOTOS = "updatedPhotos";
public static final String ACTION_CREATE_GROUP = "createGroup";
public static final String ACTION_RENAME_GROUP = "renameGroup";
@@ -269,15 +275,38 @@
/**
* Creates an intent that can be sent to this service to create a new raw contact
* using data presented as a set of ContentValues.
+ * This variant is more convenient to use when there is only one photo that can
+ * possibly be updated, as in the Contact Details screen.
+ * @param rawContactId identifies a writable raw-contact whose photo is to be updated.
+ * @param updatedPhotoPath denotes a temporary file containing the contact's new photo.
*/
public static Intent createSaveContactIntent(Context context, EntityDeltaList state,
String saveModeExtraKey, int saveMode, boolean isProfile, Class<?> callbackActivity,
- String callbackAction) {
+ String callbackAction, long rawContactId, String updatedPhotoPath) {
+ Bundle bundle = new Bundle();
+ bundle.putString(String.valueOf(rawContactId), updatedPhotoPath);
+ return createSaveContactIntent(context, state, saveModeExtraKey, saveMode, isProfile,
+ callbackActivity, callbackAction, bundle);
+ }
+
+ /**
+ * Creates an intent that can be sent to this service to create a new raw contact
+ * using data presented as a set of ContentValues.
+ * This variant is used when multiple contacts' photos may be updated, as in the
+ * Contact Editor.
+ * @param updatedPhotos maps each raw-contact's ID to the file-path of the new photo.
+ */
+ public static Intent createSaveContactIntent(Context context, EntityDeltaList state,
+ String saveModeExtraKey, int saveMode, boolean isProfile, Class<?> callbackActivity,
+ String callbackAction, Bundle updatedPhotos) {
Intent serviceIntent = new Intent(
context, ContactSaveService.class);
serviceIntent.setAction(ContactSaveService.ACTION_SAVE_CONTACT);
serviceIntent.putExtra(EXTRA_CONTACT_STATE, (Parcelable) state);
serviceIntent.putExtra(EXTRA_SAVE_IS_PROFILE, isProfile);
+ if (updatedPhotos != null) {
+ serviceIntent.putExtra(EXTRA_UPDATED_PHOTOS, (Parcelable) updatedPhotos);
+ }
// Callback intent will be invoked by the service once the contact is
// saved. The service will put the URI of the new contact as "data" on
@@ -293,6 +322,7 @@
EntityDeltaList state = intent.getParcelableExtra(EXTRA_CONTACT_STATE);
Intent callbackIntent = intent.getParcelableExtra(EXTRA_CALLBACK_INTENT);
boolean isProfile = intent.getBooleanExtra(EXTRA_SAVE_IS_PROFILE, false);
+ Bundle updatedPhotos = intent.getParcelableExtra(EXTRA_UPDATED_PHOTOS);
// Trim any empty fields, and RawContacts, before persisting
final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
@@ -301,6 +331,10 @@
Uri lookupUri = null;
final ContentResolver resolver = getContentResolver();
+ boolean succeeded = false;
+
+ // Keep track of the id of a newly raw-contact (if any... there can be at most one).
+ long insertedRawContactId = -1;
// Attempt to persist changes
int tries = 0;
@@ -324,6 +358,9 @@
if (rawContactId == -1) {
throw new IllegalStateException("Could not determine RawContact ID after save");
}
+ // We don't have to check to see if the value is still -1. If we reach here,
+ // the previous loop iteration didn't succeed, so any ID that we obtained is bogus.
+ insertedRawContactId = getInsertedRawContactId(diff, results);
if (isProfile) {
// Since the profile supports local raw contacts, which may have been completely
// removed if all information was removed, we need to do a special query to
@@ -346,10 +383,9 @@
lookupUri = RawContacts.getContactLookupUri(resolver, rawContactUri);
}
Log.v(TAG, "Saved contact. New URI: " + lookupUri);
- // Mark the intent to indicate that the save was successful (even if the lookup URI
- // is now null). For local contacts or the local profile, it's possible that the
- // save triggered removal of the contact, so no lookup URI would exist..
- callbackIntent.putExtra(EXTRA_SAVE_SUCCEEDED, true);
+
+ // We can change this back to false later, if we fail to save the contact photo.
+ succeeded = true;
break;
} catch (RemoteException e) {
@@ -395,19 +431,95 @@
}
}
+ // Now save any updated photos. We do this at the end to ensure that
+ // the ContactProvider already knows about newly-created contacts.
+ if (updatedPhotos != null) {
+ for (String key : updatedPhotos.keySet()) {
+ String photoFilePath = updatedPhotos.getString(key);
+ long rawContactId = Long.parseLong(key);
+
+ // If the raw-contact ID is negative, we are saving a new raw-contact;
+ // replace the bogus ID with the new one that we actually saved the contact at.
+ if (rawContactId < 0) {
+ rawContactId = insertedRawContactId;
+ if (rawContactId == -1) {
+ throw new IllegalStateException(
+ "Could not determine RawContact ID for image insertion");
+ }
+ }
+
+ File photoFile = new File(photoFilePath);
+ if (!saveUpdatedPhoto(rawContactId, photoFile)) succeeded = false;
+ }
+ }
+
+ if (succeeded) {
+ // Mark the intent to indicate that the save was successful (even if the lookup URI
+ // is now null). For local contacts or the local profile, it's possible that the
+ // save triggered removal of the contact, so no lookup URI would exist..
+ callbackIntent.putExtra(EXTRA_SAVE_SUCCEEDED, true);
+ }
callbackIntent.setData(lookupUri);
deliverCallback(callbackIntent);
}
+ /**
+ * Save updated photo for the specified raw-contact.
+ * @return true for success, false for failure
+ */
+ private boolean saveUpdatedPhoto(long rawContactId, File photoFile) {
+ final Uri outputUri = Uri.withAppendedPath(
+ ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
+ RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
+
+ try {
+ final FileOutputStream outputStream = getContentResolver()
+ .openAssetFileDescriptor(outputUri, "rw").createOutputStream();
+ try {
+ final FileInputStream inputStream = new FileInputStream(photoFile);
+ try {
+ final byte[] buffer = new byte[16 * 1024];
+ int length;
+ int totalLength = 0;
+ while ((length = inputStream.read(buffer)) > 0) {
+ outputStream.write(buffer, 0, length);
+ totalLength += length;
+ }
+ Log.v(TAG, "Wrote " + totalLength + " bytes for photo " + photoFile.toString());
+ } finally {
+ inputStream.close();
+ }
+ } finally {
+ outputStream.close();
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to write photo: " + photoFile.toString() + " because: " + e);
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Find the ID of an existing or newly-inserted raw-contact. If none exists, return -1.
+ */
private long getRawContactId(EntityDeltaList state,
final ArrayList<ContentProviderOperation> diff,
final ContentProviderResult[] results) {
- long rawContactId = state.findRawContactId();
- if (rawContactId != -1) {
- return rawContactId;
+ long existingRawContactId = state.findRawContactId();
+ if (existingRawContactId != -1) {
+ return existingRawContactId;
}
+ return getInsertedRawContactId(diff, results);
+ }
+
+ /**
+ * Find the ID of a newly-inserted raw-contact. If none exists, return -1.
+ */
+ private long getInsertedRawContactId(
+ final ArrayList<ContentProviderOperation> diff,
+ final ContentProviderResult[] results) {
final int diffSize = diff.size();
for (int i = 0; i < diffSize; i++) {
ContentProviderOperation operation = diff.get(i);
diff --git a/src/com/android/contacts/ContactsUtils.java b/src/com/android/contacts/ContactsUtils.java
index cb19713..687bd0d 100644
--- a/src/com/android/contacts/ContactsUtils.java
+++ b/src/com/android/contacts/ContactsUtils.java
@@ -16,10 +16,13 @@
package com.android.contacts;
+import com.android.contacts.activities.DialtactsActivity;
+import com.android.contacts.calllog.PhoneNumberHelper;
import com.android.contacts.model.AccountType;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.model.AccountWithDataSet;
import com.android.contacts.test.NeededForTesting;
+import com.android.contacts.util.Constants;
import com.android.i18n.phonenumbers.PhoneNumberUtil;
import android.content.Context;
@@ -30,6 +33,7 @@
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Im;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.QuickContact;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.view.View;
@@ -213,6 +217,67 @@
}
/**
+ * Return Uri with an appropriate scheme, accepting Voicemail, SIP, and usual phone call
+ * numbers.
+ */
+ public static Uri getCallUri(String number) {
+ if (PhoneNumberUtils.isVoiceMailNumber(number)) {
+ return Uri.parse("voicemail:");
+ }
+ if (PhoneNumberUtils.isUriNumber(number)) {
+ return Uri.fromParts(Constants.SCHEME_SIP, number, null);
+ }
+ return Uri.fromParts(Constants.SCHEME_TEL, number, null);
+ }
+
+ /**
+ * Return an Intent for making a phone call. Scheme (e.g. tel, sip) will be determined
+ * automatically.
+ */
+ public static Intent getCallIntent(String number) {
+ return getCallIntent(number, null);
+ }
+
+ /**
+ * Return an Intent for making a phone call. A given Uri will be used as is (without any
+ * sanity check).
+ */
+ public static Intent getCallIntent(Uri uri) {
+ return getCallIntent(uri, null);
+ }
+
+ /**
+ * A variant of {@link #getCallIntent(String)} but also accept a call origin. For more
+ * information about call origin, see comments in Phone package (PhoneApp).
+ */
+ public static Intent getCallIntent(String number, String callOrigin) {
+ return getCallIntent(getCallUri(number), callOrigin);
+ }
+
+ /**
+ * A variant of {@link #getCallIntent(Uri)} but also accept a call origin. For more
+ * information about call origin, see comments in Phone package (PhoneApp).
+ */
+ public static Intent getCallIntent(Uri uri, String callOrigin) {
+ final Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, uri);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ if (callOrigin != null) {
+ intent.putExtra(DialtactsActivity.EXTRA_CALL_ORIGIN, callOrigin);
+ }
+ return intent;
+ }
+
+ /**
+ * Return an Intent for launching voicemail screen.
+ */
+ public static Intent getVoicemailIntent() {
+ final Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
+ Uri.fromParts("voicemail", "", null));
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return intent;
+ }
+
+ /**
* Returns a header view based on the R.layout.list_separator, where the
* containing {@link TextView} is set using the given textResourceId.
*/
diff --git a/src/com/android/contacts/NfcHandler.java b/src/com/android/contacts/NfcHandler.java
index ee3e002..1ae72be 100644
--- a/src/com/android/contacts/NfcHandler.java
+++ b/src/com/android/contacts/NfcHandler.java
@@ -89,9 +89,8 @@
ndefBytes.write(buffer, 0, r);
}
- NdefRecord vcardRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
- "text/x-vCard".getBytes(), new byte[]{}, ndefBytes.toByteArray());
- return new NdefMessage(new NdefRecord[] {vcardRecord});
+ NdefRecord record = NdefRecord.createMime("text/x-vcard", ndefBytes.toByteArray());
+ return new NdefMessage(record);
} catch (IOException e) {
Log.e(TAG, "IOException creating vcard.");
return null;
diff --git a/src/com/android/contacts/PhoneCallDetailsHelper.java b/src/com/android/contacts/PhoneCallDetailsHelper.java
index 2d75c26..fd950fe 100644
--- a/src/com/android/contacts/PhoneCallDetailsHelper.java
+++ b/src/com/android/contacts/PhoneCallDetailsHelper.java
@@ -18,7 +18,7 @@
import com.android.contacts.calllog.CallTypeHelper;
import com.android.contacts.calllog.PhoneNumberHelper;
-import com.android.contacts.format.FormatUtils;
+import com.android.contacts.test.NeededForTesting;
import android.content.res.Resources;
import android.graphics.Typeface;
@@ -103,6 +103,7 @@
final CharSequence nameText;
final CharSequence numberText;
+ final CharSequence labelText;
final CharSequence displayNumber =
mPhoneNumberHelper.getDisplayNumber(details.number, details.formattedNumber);
if (TextUtils.isEmpty(details.name)) {
@@ -113,20 +114,17 @@
} else {
numberText = details.geocode;
}
+ labelText = null;
} else {
nameText = details.name;
- if (numberFormattedLabel != null) {
- numberText = FormatUtils.applyStyleToSpan(Typeface.BOLD,
- numberFormattedLabel + " " + displayNumber, 0,
- numberFormattedLabel.length(),
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- } else {
- numberText = displayNumber;
- }
+ numberText = displayNumber;
+ labelText = numberFormattedLabel;
}
views.nameView.setText(nameText);
views.numberView.setText(numberText);
+ views.labelView.setText(labelText);
+ views.labelView.setVisibility(TextUtils.isEmpty(labelText) ? View.GONE : View.VISIBLE);
}
/** Sets the text of the header view for the details page of a phone call. */
@@ -144,6 +142,7 @@
nameView.setText(nameText);
}
+ @NeededForTesting
public void setCurrentTimeForTest(long currentTimeMillis) {
mCurrentTimeMillisForTest = currentTimeMillis;
}
diff --git a/src/com/android/contacts/PhoneCallDetailsViews.java b/src/com/android/contacts/PhoneCallDetailsViews.java
index fa06879..ea5a461 100644
--- a/src/com/android/contacts/PhoneCallDetailsViews.java
+++ b/src/com/android/contacts/PhoneCallDetailsViews.java
@@ -31,14 +31,17 @@
public final CallTypeIconsView callTypeIcons;
public final TextView callTypeAndDate;
public final TextView numberView;
+ public final TextView labelView;
private PhoneCallDetailsViews(TextView nameView, View callTypeView,
- CallTypeIconsView callTypeIcons, TextView callTypeAndDate, TextView numberView) {
+ CallTypeIconsView callTypeIcons, TextView callTypeAndDate, TextView numberView,
+ TextView labelView) {
this.nameView = nameView;
this.callTypeView = callTypeView;
this.callTypeIcons = callTypeIcons;
this.callTypeAndDate = callTypeAndDate;
this.numberView = numberView;
+ this.labelView = labelView;
}
/**
@@ -53,7 +56,8 @@
view.findViewById(R.id.call_type),
(CallTypeIconsView) view.findViewById(R.id.call_type_icons),
(TextView) view.findViewById(R.id.call_count_and_date),
- (TextView) view.findViewById(R.id.number));
+ (TextView) view.findViewById(R.id.number),
+ (TextView) view.findViewById(R.id.label));
}
public static PhoneCallDetailsViews createForTest(Context context) {
@@ -62,6 +66,7 @@
new View(context),
new CallTypeIconsView(context),
new TextView(context),
+ new TextView(context),
new TextView(context));
}
}
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index b90d4c6..0260ca6 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -151,7 +151,14 @@
// Just set to the field here. The listener will be notified by update().
mCurrentTab = TabState.fromInt(savedState.getInt(EXTRA_KEY_SELECTED_TAB));
}
+ // Show tabs or the expanded {@link SearchView}, depending on whether or not we are in
+ // search mode.
update();
+ // Expanding the {@link SearchView} clears the query, so set the query from the
+ // {@link ContactsRequest} after it has been expanded, if applicable.
+ if (mSearchMode && !TextUtils.isEmpty(mQueryString)) {
+ setQueryString(mQueryString);
+ }
}
public void setListener(Listener listener) {
@@ -292,7 +299,8 @@
if (mSearchMode) {
setFocusOnSearchView();
// Since we have the {@link SearchView} in a custom action bar, we must manually handle
- // expanding the {@link SearchView} when a search is initiated.
+ // expanding the {@link SearchView} when a search is initiated. Note that a side effect
+ // of this method is that the {@link SearchView} query text is set to empty string.
mSearchView.onActionViewExpanded();
if (mActionBar.getNavigationMode() != ActionBar.NAVIGATION_MODE_STANDARD) {
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
diff --git a/src/com/android/contacts/activities/AttachPhotoActivity.java b/src/com/android/contacts/activities/AttachPhotoActivity.java
index a697c29..8d4cb5d 100644
--- a/src/com/android/contacts/activities/AttachPhotoActivity.java
+++ b/src/com/android/contacts/activities/AttachPhotoActivity.java
@@ -156,7 +156,7 @@
Bitmap photo = extras.getParcelable("data");
if (photo != null) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
- photo.compress(Bitmap.CompressFormat.JPEG, 75, stream);
+ photo.compress(Bitmap.CompressFormat.PNG, 100, stream);
final ContentValues imageValues = new ContentValues();
imageValues.put(Photo.PHOTO, stream.toByteArray());
diff --git a/src/com/android/contacts/activities/ConfirmAddDetailActivity.java b/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
index 4b297d9..98abfbc 100644
--- a/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
+++ b/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
@@ -319,15 +319,23 @@
// Apply a limit of 1 result to the query because we only need to
// determine whether or not at least one other contact has the same
// name. We don't need to find ALL other contacts with the same name.
- Builder builder = Contacts.CONTENT_URI.buildUpon();
+ final Builder builder = Contacts.CONTENT_URI.buildUpon();
builder.appendQueryParameter("limit", String.valueOf(1));
- Uri uri = builder.build();
+ final Uri uri = builder.build();
+ final String displayNameSelection;
+ final String[] selectionArgs;
+ if (TextUtils.isEmpty(contactDisplayName)) {
+ displayNameSelection = Contacts.DISPLAY_NAME_PRIMARY + " IS NULL";
+ selectionArgs = new String[] { String.valueOf(mContactId) };
+ } else {
+ displayNameSelection = Contacts.DISPLAY_NAME_PRIMARY + " = ?";
+ selectionArgs = new String[] { contactDisplayName, String.valueOf(mContactId) };
+ }
mQueryHandler.startQuery(TOKEN_DISAMBIGUATION_QUERY, null, uri,
new String[] { Contacts._ID } /* unused projection but a valid one was needed */,
- Contacts.DISPLAY_NAME_PRIMARY + " = ? and " + Contacts.PHOTO_ID + " is null and "
- + Contacts._ID + " <> ?",
- new String[] { contactDisplayName, String.valueOf(mContactId) }, null);
+ displayNameSelection + " AND " + Contacts.PHOTO_ID + " IS NULL AND "
+ + Contacts._ID + " <> ?", selectionArgs, null);
}
/**
diff --git a/src/com/android/contacts/activities/ContactDetailActivity.java b/src/com/android/contacts/activities/ContactDetailActivity.java
index b949176..dd3b03b 100644
--- a/src/com/android/contacts/activities/ContactDetailActivity.java
+++ b/src/com/android/contacts/activities/ContactDetailActivity.java
@@ -43,12 +43,10 @@
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
-import android.widget.CheckBox;
import android.widget.Toast;
import java.util.ArrayList;
@@ -56,6 +54,9 @@
public class ContactDetailActivity extends ContactsActivity {
private static final String TAG = "ContactDetailActivity";
+ /** Shows a toogle button for hiding/showing updates. Don't submit with true */
+ private static final boolean DEBUG_TRANSITIONS = false;
+
/**
* Boolean intent key that specifies whether pressing the "up" affordance in this activity
* should cause it to finish itself or launch an intent to bring the user back to a specific
@@ -74,7 +75,7 @@
private Handler mHandler = new Handler();
@Override
- public void onCreate(Bundle savedState) {
+ protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
if (PhoneCapabilityTester.isUsingTwoPanes(this)) {
// This activity must not be shown. We have to select the contact in the
@@ -129,32 +130,55 @@
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.star, menu);
+ if (DEBUG_TRANSITIONS) {
+ final MenuItem toggleSocial =
+ menu.add(mLoaderFragment.getLoadStreamItems() ? "less" : "more");
+ toggleSocial.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ toggleSocial.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ mLoaderFragment.toggleLoadStreamItems();
+ invalidateOptionsMenu();
+ return false;
+ }
+ });
+ }
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
- MenuItem starredMenuItem = menu.findItem(R.id.menu_star);
- ViewGroup starredContainer = (ViewGroup) getLayoutInflater().inflate(
- R.layout.favorites_star, null, false);
- final CheckBox starredView = (CheckBox) starredContainer.findViewById(R.id.star);
- starredView.setOnClickListener(new OnClickListener() {
+ final MenuItem starredMenuItem = menu.findItem(R.id.menu_star);
+ starredMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
- public void onClick(View v) {
+ public boolean onMenuItemClick(MenuItem item) {
// Toggle "starred" state
// Make sure there is a contact
if (mLookupUri != null) {
+ // Read the current starred value from the UI instead of using the last
+ // loaded state. This allows rapid tapping without writing the same
+ // value several times
+ final boolean isStarred = starredMenuItem.isChecked();
+
+ // To improve responsiveness, swap out the picture (and tag) in the UI already
+ ContactDetailDisplayUtils.configureStarredMenuItem(starredMenuItem,
+ mContactData.isDirectoryEntry(), mContactData.isUserProfile(),
+ !isStarred);
+
+ // Now perform the real save
Intent intent = ContactSaveService.createSetStarredIntent(
- ContactDetailActivity.this, mLookupUri, starredView.isChecked());
+ ContactDetailActivity.this, mLookupUri, !isStarred);
ContactDetailActivity.this.startService(intent);
}
+ return true;
}
});
// If there is contact data, update the starred state
if (mContactData != null) {
- ContactDetailDisplayUtils.setStarred(mContactData, starredView);
+ ContactDetailDisplayUtils.configureStarredMenuItem(starredMenuItem,
+ mContactData.isDirectoryEntry(), mContactData.isUserProfile(),
+ mContactData.getStarred());
}
- starredMenuItem.setActionView(starredContainer);
return true;
}
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index b5b6c1d..bf7d7d1 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -31,6 +31,7 @@
import com.android.contacts.list.PhoneNumberPickerFragment;
import com.android.contacts.list.PostalAddressPickerFragment;
import com.android.contacts.widget.ContextMenuAdapter;
+import com.google.android.collect.Sets;
import android.app.ActionBar;
import android.app.ActionBar.LayoutParams;
@@ -415,8 +416,14 @@
ConfirmAddDetailActivity.class);
intent.setData(contactLookupUri);
if (extras != null) {
+ // First remove name key if present because the dialog does not support name
+ // editing. This is fine because the user wants to add information to an
+ // existing contact, who should already have a name and we wouldn't want to
+ // override the name.
+ extras.remove(Insert.NAME);
intent.putExtras(extras);
}
+
// Wait for the activity result because we want to keep the picker open (in case the
// user cancels adding the info to a contact and wants to pick someone else).
startActivityForResult(intent, SUBACTIVITY_ADD_TO_EXISTING_CONTACT);
@@ -440,13 +447,24 @@
* Returns true if is a single email or single phone number provided in the {@link Intent}
* extras bundle so that a pop-up confirmation dialog can be used to add the data to
* a contact. Otherwise return false if there are other intent extras that require launching
- * the full contact editor.
+ * the full contact editor. Ignore extras with the key {@link Insert.NAME} because names
+ * are a special case and we typically don't want to replace the name of an existing
+ * contact.
*/
private boolean launchAddToContactDialog(Bundle extras) {
if (extras == null) {
return false;
}
- Set<String> intentExtraKeys = extras.keySet();
+
+ // Copy extras because the set may be modified in the next step
+ Set<String> intentExtraKeys = Sets.newHashSet();
+ intentExtraKeys.addAll(extras.keySet());
+
+ // Ignore name key because this is an existing contact.
+ if (intentExtraKeys.contains(Insert.NAME)) {
+ intentExtraKeys.remove(Insert.NAME);
+ }
+
int numIntentExtraKeys = intentExtraKeys.size();
if (numIntentExtraKeys == 2) {
boolean hasPhone = intentExtraKeys.contains(Insert.PHONE) &&
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 9abcdf4..a9bb394 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -17,6 +17,7 @@
package com.android.contacts.activities;
import com.android.contacts.R;
+import com.android.contacts.ContactsUtils;
import com.android.contacts.calllog.CallLogFragment;
import com.android.contacts.dialpad.DialpadFragment;
import com.android.contacts.interactions.PhoneNumberInteraction;
@@ -28,6 +29,7 @@
import com.android.contacts.list.PhoneNumberPickerFragment;
import com.android.contacts.activities.TransactionSafeActivity;
import com.android.contacts.util.AccountFilterUtil;
+import com.android.contacts.util.Constants;
import com.android.internal.telephony.ITelephony;
import android.app.ActionBar;
@@ -89,7 +91,8 @@
* Copied from PhoneApp. See comments in Phone app for more detail.
*/
public static final String EXTRA_CALL_ORIGIN = "com.android.phone.CALL_ORIGIN";
- public static final String CALL_ORIGIN_DIALTACTS =
+ /** @see #getCallOrigin() */
+ private static final String CALL_ORIGIN_DIALTACTS =
"com.android.contacts.activities.DialtactsActivity";
/**
@@ -113,14 +116,6 @@
private static final int SUBACTIVITY_ACCOUNT_FILTER = 1;
- /**
- * Listener interface for Fragments accommodated in {@link ViewPager} enabling them to know
- * when it becomes visible or invisible inside the ViewPager.
- */
- public interface ViewPagerVisibilityListener {
- public void onVisibilityChanged(boolean visible);
- }
-
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
@@ -194,6 +189,40 @@
actionBar.selectTab(actionBar.getTabAt(position));
mNextPosition = position;
+
+ // This method is called halfway between swiping between the two pages.
+ // When the next page is fully selected, the ViewPager will go back to IDLE state in
+ // onPageScrollStateChanged(). The order should be:
+ // (user's swipe) -> onPageSelected() -> IDLE in onPageScrollStateChanged()
+ //
+ // sendFragmentVisibilityChange() must be called from here or in the IDLE state to
+ // notify the visibility change events to two pages: the current page (pointed by
+ // mCurrentPosition) should receive sendFragmentVisibilityChange() with the second
+ // argument false, meaning "the page is now invisible", while the next page (pointed by
+ // mNextPosition) should receive the method with the second argument true, meaning
+ // "the page becomes visible".
+ //
+ // To make transition animation smooth enough, we need to delay the event in some cases:
+ // - We should delay both method calls when the dialpad screen is involved.
+ // The screen does not have the bottom action bar, requiring different layout to
+ // fill the screen. The layout refresh takes some time and thus should be done after
+ // the page migration being completed.
+ // - We should delay the method for the call log screen. The screen will update
+ // its internal state and may query full call log. which is too costly to do when
+ // setMenuVisibility() is called, making the animation slower.
+ // - We should *not* delay the method for the phone favorite screen. The screen has
+ // another icon the call log screen doesn't have. We want to show/hide it immediately
+ // after user's choosing pages.
+ if (mCurrentPosition == TAB_INDEX_CALL_LOG && mNextPosition == TAB_INDEX_FAVORITES) {
+ sendFragmentVisibilityChange(mNextPosition, true /* visible */ );
+ invalidateOptionsMenu();
+ } else if (mCurrentPosition == TAB_INDEX_FAVORITES
+ && mNextPosition == TAB_INDEX_CALL_LOG) {
+ sendFragmentVisibilityChange(mCurrentPosition, false /* not visible */ );
+ invalidateOptionsMenu();
+ } else {
+ // Delay sendFragmentVisibilityChange() for both positions.
+ }
}
public void setCurrentPosition(int position) {
@@ -209,12 +238,19 @@
mDuringSwipe = false;
mUserTabClick = false;
- if (mCurrentPosition >= 0) {
- sendFragmentVisibilityChange(mCurrentPosition, false);
+ // Call delayed sendFragmentVisibilityChange() call(s).
+ // See comments in onPageSelected() for more details.
+ if (mCurrentPosition == TAB_INDEX_CALL_LOG
+ && mNextPosition == TAB_INDEX_FAVORITES) {
+ sendFragmentVisibilityChange(mCurrentPosition, false /* not visible */ );
+ } else if (mCurrentPosition == TAB_INDEX_FAVORITES
+ && mNextPosition == TAB_INDEX_CALL_LOG) {
+ sendFragmentVisibilityChange(mNextPosition, true /* visible */ );
+ } else {
+ sendFragmentVisibilityChange(mCurrentPosition, false /* not visible */ );
+ sendFragmentVisibilityChange(mNextPosition, true /* visible */ );
}
- if (mNextPosition >= 0) {
- sendFragmentVisibilityChange(mNextPosition, true);
- }
+
invalidateOptionsMenu();
mCurrentPosition = mNextPosition;
@@ -358,7 +394,8 @@
@Override
public boolean onMenuItemClick(MenuItem item) {
AccountFilterUtil.startAccountFilterActivityForResult(
- DialtactsActivity.this, SUBACTIVITY_ACCOUNT_FILTER);
+ DialtactsActivity.this, SUBACTIVITY_ACCOUNT_FILTER,
+ mContactListFilterController.getFilter());
return true;
}
};
@@ -383,8 +420,7 @@
// Specify call-origin so that users will see the previous tab instead of
// CallLog screen (search UI will be automatically exited).
PhoneNumberInteraction.startInteractionForPhoneCall(
- DialtactsActivity.this, dataUri,
- CALL_ORIGIN_DIALTACTS);
+ DialtactsActivity.this, dataUri, getCallOrigin());
}
@Override
@@ -584,14 +620,8 @@
if (fragment instanceof DialpadFragment) {
mDialpadFragment = (DialpadFragment) fragment;
mDialpadFragment.setListener(mDialpadListener);
- if (currentPosition == TAB_INDEX_DIALER) {
- mDialpadFragment.onVisibilityChanged(true);
- }
} else if (fragment instanceof CallLogFragment) {
mCallLogFragment = (CallLogFragment) fragment;
- if (currentPosition == TAB_INDEX_CALL_LOG) {
- mCallLogFragment.onVisibilityChanged(true);
- }
} else if (fragment instanceof PhoneFavoriteFragment) {
mPhoneFavoriteFragment = (PhoneFavoriteFragment) fragment;
mPhoneFavoriteFragment.setListener(mPhoneFavoriteListener);
@@ -605,6 +635,7 @@
mSearchFragment.setQuickContactEnabled(true);
mSearchFragment.setDarkTheme(true);
mSearchFragment.setPhotoPosition(ContactListItemView.PhotoPosition.LEFT);
+ mSearchFragment.setUseCallableUri(true);
if (mContactListFilterController != null
&& mContactListFilterController.getFilter() != null) {
mSearchFragment.setFilter(mContactListFilterController.getFilter());
@@ -725,10 +756,10 @@
final int previousItemIndex = mViewPager.getCurrentItem();
mViewPager.setCurrentItem(tabIndex, false /* smoothScroll */);
if (previousItemIndex != tabIndex) {
- sendFragmentVisibilityChange(previousItemIndex, false);
+ sendFragmentVisibilityChange(previousItemIndex, false /* not visible */ );
}
mPageChangeListener.setCurrentPosition(tabIndex);
- sendFragmentVisibilityChange(tabIndex, true);
+ sendFragmentVisibilityChange(tabIndex, true /* visible */ );
// Restore to the previous manual selection
mLastManuallySelectedFragment = savedTabIndex;
@@ -767,7 +798,7 @@
}
if (Intent.ACTION_VIEW.equals(action)) {
final Uri data = intent.getData();
- if (data != null && "tel".equals(data.getScheme())) {
+ if (data != null && Constants.SCHEME_TEL.equals(data.getScheme())) {
return true;
}
}
@@ -775,6 +806,16 @@
}
/**
+ * Returns an appropriate call origin for this Activity. May return null when no call origin
+ * should be used (e.g. when some 3rd party application launched the screen. Call origin is
+ * for remembering the tab in which the user made a phone call, so the external app's DIAL
+ * request should not be counted.)
+ */
+ public String getCallOrigin() {
+ return !isDialIntent(getIntent()) ? CALL_ORIGIN_DIALTACTS : null;
+ }
+
+ /**
* Retrieves the filter text stored in {@link #setupFilterText(Intent)}.
* This text originally came from a FILTER_CONTACTS_ACTION intent received
* by this activity. The stored text will then be cleared after after this
@@ -833,8 +874,13 @@
@Override
public void onContactSelected(Uri contactUri) {
PhoneNumberInteraction.startInteractionForPhoneCall(
- DialtactsActivity.this, contactUri,
- CALL_ORIGIN_DIALTACTS);
+ DialtactsActivity.this, contactUri, getCallOrigin());
+ }
+
+ @Override
+ public void onCallNumberDirectly(String phoneNumber) {
+ Intent intent = ContactsUtils.getCallIntent(phoneNumber, getCallOrigin());
+ startActivity(intent);
}
};
@@ -851,22 +897,19 @@
final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option);
final MenuItem addContactOptionMenuItem = menu.findItem(R.id.add_contact);
final MenuItem callSettingsMenuItem = menu.findItem(R.id.menu_call_settings);
+ final Tab tab = getActionBar().getSelectedTab();
final MenuItem fakeMenuItem = menu.findItem(R.id.fake_menu_item);
- Tab tab = getActionBar().getSelectedTab();
if (mInSearchUi) {
searchMenuItem.setVisible(false);
if (ViewConfiguration.get(this).hasPermanentMenuKey()) {
filterOptionMenuItem.setVisible(true);
filterOptionMenuItem.setOnMenuItemClickListener(
mFilterOptionsMenuItemClickListener);
- addContactOptionMenuItem.setVisible(true);
- addContactOptionMenuItem.setIntent(
- new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
} else {
// Filter option menu should be not be shown as a overflow menu.
filterOptionMenuItem.setVisible(false);
- addContactOptionMenuItem.setVisible(false);
}
+ addContactOptionMenuItem.setVisible(false);
callSettingsMenuItem.setVisible(false);
fakeMenuItem.setVisible(false);
} else {
@@ -970,7 +1013,7 @@
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
- sendFragmentVisibilityChange(mViewPager.getCurrentItem(), false);
+ sendFragmentVisibilityChange(mViewPager.getCurrentItem(), false /* not visible */ );
// Show the search fragment and hide everything else.
mSearchFragment.setUserVisibleHint(true);
@@ -1022,7 +1065,7 @@
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
- sendFragmentVisibilityChange(mViewPager.getCurrentItem(), true);
+ sendFragmentVisibilityChange(mViewPager.getCurrentItem(), true /* visible */ );
// Before exiting the search screen, reset swipe state.
mDuringSwipe = false;
@@ -1054,9 +1097,12 @@
}
private void sendFragmentVisibilityChange(int position, boolean visibility) {
- final Fragment fragment = getFragmentAt(position);
- if (fragment instanceof ViewPagerVisibilityListener) {
- ((ViewPagerVisibilityListener) fragment).onVisibilityChanged(visibility);
+ // Position can be -1 initially. See PageChangeListener.
+ if (position >= 0) {
+ final Fragment fragment = getFragmentAt(position);
+ if (fragment != null) {
+ fragment.setMenuVisibility(visibility);
+ }
}
}
diff --git a/src/com/android/contacts/activities/DialtactsViewPager.java b/src/com/android/contacts/activities/DialtactsViewPager.java
index 6bf41f7..fb869a9 100644
--- a/src/com/android/contacts/activities/DialtactsViewPager.java
+++ b/src/com/android/contacts/activities/DialtactsViewPager.java
@@ -36,8 +36,7 @@
* ListViews which delay their children anyway, as desired to prevent
* seeing pressed states flashing while scrolling lists
*/
- /*
public boolean shouldDelayChildPressedState() {
return false;
- }*/
+ }
}
diff --git a/src/com/android/contacts/activities/GroupEditorActivity.java b/src/com/android/contacts/activities/GroupEditorActivity.java
index 7fed0f8..f3255bf 100644
--- a/src/com/android/contacts/activities/GroupEditorActivity.java
+++ b/src/com/android/contacts/activities/GroupEditorActivity.java
@@ -18,7 +18,6 @@
import com.android.contacts.ContactsActivity;
import com.android.contacts.R;
-import com.android.contacts.editor.ContactEditorFragment.SaveMode;
import com.android.contacts.group.GroupEditorFragment;
import com.android.contacts.util.DialogManager;
import com.android.contacts.util.PhoneCapabilityTester;
@@ -108,7 +107,7 @@
@Override
public void onBackPressed() {
// If the change could not be saved, then revert to the default "back" button behavior.
- if (!mFragment.save(SaveMode.CLOSE)) {
+ if (!mFragment.save()) {
super.onBackPressed();
}
}
@@ -123,9 +122,7 @@
String action = intent.getAction();
if (ACTION_SAVE_COMPLETED.equals(action)) {
- mFragment.onSaveCompleted(true,
- intent.getIntExtra(GroupEditorFragment.SAVE_MODE_EXTRA_KEY, SaveMode.CLOSE),
- intent.getData());
+ mFragment.onSaveCompleted(true, intent.getData());
}
}
diff --git a/src/com/android/contacts/activities/JoinContactActivity.java b/src/com/android/contacts/activities/JoinContactActivity.java
index 75a13d0..4a277cb 100644
--- a/src/com/android/contacts/activities/JoinContactActivity.java
+++ b/src/com/android/contacts/activities/JoinContactActivity.java
@@ -24,18 +24,29 @@
import com.android.contacts.list.OnContactPickerActionListener;
import android.app.ActionBar;
+import android.app.ActionBar.LayoutParams;
import android.app.Fragment;
+import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
+import android.text.TextUtils;
import android.util.Log;
+import android.view.LayoutInflater;
import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnFocusChangeListener;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.SearchView;
+import android.widget.SearchView.OnCloseListener;
+import android.widget.SearchView.OnQueryTextListener;
/**
* An activity that shows a list of contacts that can be joined with the target contact.
*/
-public class JoinContactActivity extends ContactsActivity {
+public class JoinContactActivity extends ContactsActivity
+ implements OnQueryTextListener, OnCloseListener, OnFocusChangeListener {
private static final String TAG = "JoinContactActivity";
@@ -59,6 +70,7 @@
private long mTargetContactId;
private JoinContactListFragment mListFragment;
+ private SearchView mSearchView;
@Override
public void onAttachFragment(Fragment fragment) {
@@ -93,12 +105,7 @@
.commitAllowingStateLoss();
}
- final ActionBar actionBar = getActionBar();
- if (actionBar != null) {
- actionBar.setDisplayShowHomeEnabled(true);
- actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.setDisplayShowTitleEnabled(true);
- }
+ prepareSearchViewAndActionBar();
}
private void setupActionListener() {
@@ -125,6 +132,74 @@
});
}
+ private void prepareSearchViewAndActionBar() {
+ final ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ final View searchViewOnLayout = findViewById(R.id.search_view);
+ if (searchViewOnLayout != null) {
+ searchViewOnLayout.setVisibility(View.GONE);
+ }
+
+ final View searchViewLayout = LayoutInflater.from(actionBar.getThemedContext())
+ .inflate(R.layout.custom_action_bar, null);
+ mSearchView = (SearchView) searchViewLayout.findViewById(R.id.search_view);
+
+ // In order to make the SearchView look like "shown via search menu", we need to
+ // manually setup its state. See also DialtactsActivity.java and ActionBarAdapter.java.
+ mSearchView.setIconifiedByDefault(true);
+ mSearchView.setQueryHint(getString(R.string.hint_findContacts));
+ mSearchView.setIconified(false);
+
+ mSearchView.setOnQueryTextListener(this);
+ mSearchView.setOnCloseListener(this);
+ mSearchView.setOnQueryTextFocusChangeListener(this);
+
+ actionBar.setCustomView(searchViewLayout,
+ new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+ actionBar.setDisplayShowCustomEnabled(true);
+ actionBar.setDisplayShowHomeEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ } else {
+ mSearchView = (SearchView) findViewById(R.id.search_view);
+ mSearchView.setQueryHint(getString(R.string.hint_findContacts));
+ mSearchView.setOnQueryTextListener(this);
+ mSearchView.setOnQueryTextFocusChangeListener(this);
+ }
+
+ // Clear focus and suppress keyboard show-up.
+ mSearchView.clearFocus();
+ }
+
+ @Override
+ public boolean onQueryTextChange(String newText) {
+ mListFragment.setQueryString(newText, true);
+ return false;
+ }
+
+ @Override
+ public boolean onQueryTextSubmit(String query) {
+ return false;
+ }
+
+ @Override
+ public boolean onClose() {
+ if (!TextUtils.isEmpty(mSearchView.getQuery())) {
+ mSearchView.setQuery(null, true);
+ }
+ return true;
+ }
+
+ @Override
+ public void onFocusChange(View view, boolean hasFocus) {
+ switch (view.getId()) {
+ case R.id.search_view: {
+ if (hasFocus) {
+ showInputMethod(mSearchView.findFocus());
+ }
+ }
+ }
+ }
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
@@ -156,4 +231,14 @@
mListFragment.onPickerResult(data);
}
}
+
+ private void showInputMethod(View view) {
+ final InputMethodManager imm = (InputMethodManager)
+ getSystemService(Context.INPUT_METHOD_SERVICE);
+ if (imm != null) {
+ if (!imm.showSoftInput(view, 0)) {
+ Log.w(TAG, "Failed to show soft input method.");
+ }
+ }
+ }
}
diff --git a/src/com/android/contacts/activities/NonPhoneActivity.java b/src/com/android/contacts/activities/NonPhoneActivity.java
index 3a54292..47ae020 100644
--- a/src/com/android/contacts/activities/NonPhoneActivity.java
+++ b/src/com/android/contacts/activities/NonPhoneActivity.java
@@ -18,6 +18,7 @@
import com.android.contacts.ContactsActivity;
import com.android.contacts.R;
+import com.android.contacts.util.Constants;
import android.app.Activity;
import android.app.AlertDialog;
@@ -56,7 +57,7 @@
final Uri data = getIntent().getData();
if (data == null) return null;
final String scheme = data.getScheme();
- if (!"tel".equals(scheme)) return null;
+ if (!Constants.SCHEME_TEL.equals(scheme)) return null;
return getIntent().getData().getSchemeSpecificPart();
}
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 8d1b9aa..de08c4c 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -55,7 +55,6 @@
import com.android.contacts.preference.DisplayOptionsPreferenceFragment;
import com.android.contacts.util.AccountFilterUtil;
import com.android.contacts.util.AccountPromptUtils;
-import com.android.contacts.util.AccountSelectionUtil;
import com.android.contacts.util.AccountsListAdapter;
import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
import com.android.contacts.util.Constants;
@@ -88,8 +87,10 @@
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.view.View.OnClickListener;
+import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListPopupWindow;
@@ -110,6 +111,9 @@
private static final String TAG = "PeopleActivity";
+ /** Shows a toogle button for hiding/showing updates. Don't submit with true */
+ private static final boolean DEBUG_TRANSITIONS = false;
+
// These values needs to start at 2. See {@link ContactEntryListFragment}.
private static final int SUBACTIVITY_NEW_CONTACT = 2;
private static final int SUBACTIVITY_EDIT_CONTACT = 3;
@@ -823,7 +827,7 @@
}
@Override
- public void startUpdate(View container) {
+ public void startUpdate(ViewGroup container) {
}
private Fragment getFragment(int position) {
@@ -844,7 +848,7 @@
}
@Override
- public Object instantiateItem(View container, int position) {
+ public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
@@ -857,7 +861,7 @@
}
@Override
- public void destroyItem(View container, int position, Object object) {
+ public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
@@ -865,7 +869,7 @@
}
@Override
- public void finishUpdate(View container) {
+ public void finishUpdate(ViewGroup container) {
if (mCurTransaction != null) {
mCurTransaction.commitAllowingStateLoss();
mCurTransaction = null;
@@ -879,7 +883,7 @@
}
@Override
- public void setPrimaryItem(View container, int position, Object object) {
+ public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment) object;
if (mCurrentPrimaryItem != fragment) {
if (mCurrentPrimaryItem != null) {
@@ -968,7 +972,12 @@
View mainView = findViewById(R.id.main_view);
if (mProviderStatus == ProviderStatus.STATUS_NORMAL) {
+ // Ensure that the mTabPager is visible; we may have made it invisible below.
contactsUnavailableView.setVisibility(View.GONE);
+ if (mTabPager != null) {
+ mTabPager.setVisibility(View.VISIBLE);
+ }
+
if (mainView != null) {
mainView.setVisibility(View.VISIBLE);
}
@@ -1001,7 +1010,14 @@
} else {
mContactsUnavailableFragment.update();
}
+
+ // Show the contactsUnavailableView, and hide the mTabPager so that we don't
+ // see it sliding in underneath the contactsUnavailableView at the edges.
contactsUnavailableView.setVisibility(View.VISIBLE);
+ if (mTabPager != null) {
+ mTabPager.setVisibility(View.GONE);
+ }
+
if (mainView != null) {
mainView.setVisibility(View.INVISIBLE);
}
@@ -1198,7 +1214,7 @@
@Override
public void onImportContactsFromFileAction() {
- ImportExportDialogFragment.show(getFragmentManager());
+ ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable());
}
@Override
@@ -1217,6 +1233,12 @@
startActivity(new Intent(Intent.ACTION_VIEW, contactUri));
}
}
+
+ @Override
+ public void onCallNumberDirectly(String phoneNumber) {
+ // No need to call phone number directly from People app.
+ Log.w(TAG, "unexpected invocation of onCallNumberDirectly()");
+ }
}
private final class GroupBrowserActionListener implements OnGroupBrowserActionListener {
@@ -1288,7 +1310,7 @@
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.actions, menu);
+ inflater.inflate(R.menu.people_options, menu);
// On narrow screens we specify a NEW group button in the {@link ActionBar}, so that
// it can be in the overflow menu. On wide screens, we use a custom view because we need
@@ -1305,6 +1327,21 @@
});
addGroup.setActionView(mAddGroupImageView);
}
+
+ if (DEBUG_TRANSITIONS && mContactDetailLoaderFragment != null) {
+ final MenuItem toggleSocial =
+ menu.add(mContactDetailLoaderFragment.getLoadStreamItems() ? "less" : "more");
+ toggleSocial.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ toggleSocial.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ mContactDetailLoaderFragment.toggleLoadStreamItems();
+ invalidateOptionsMenu();
+ return false;
+ }
+ });
+ }
+
return true;
}
@@ -1424,8 +1461,9 @@
return true;
}
case R.id.menu_contacts_filter: {
- AccountFilterUtil.startAccountFilterActivityForResult(this,
- SUBACTIVITY_ACCOUNT_FILTER);
+ AccountFilterUtil.startAccountFilterActivityForResult(
+ this, SUBACTIVITY_ACCOUNT_FILTER,
+ mContactListFilterController.getFilter());
return true;
}
case R.id.menu_search: {
@@ -1452,7 +1490,7 @@
return true;
}
case R.id.menu_import_export: {
- ImportExportDialogFragment.show(getFragmentManager());
+ ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable());
return true;
}
case R.id.menu_accounts: {
@@ -1524,7 +1562,7 @@
if (resultCode == RESULT_OK && PhoneCapabilityTester.isUsingTwoPanes(this)) {
mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
mAllFragment.setSelectionRequired(true);
- mAllFragment.reloadDataAndSetSelectedUri(data.getData());
+ mAllFragment.setSelectedContactUri(data.getData());
// Suppress IME if in search mode
if (mActionBarAdapter != null) {
mActionBarAdapter.clearFocusOnSearchView();
diff --git a/src/com/android/contacts/activities/PhotoSelectionActivity.java b/src/com/android/contacts/activities/PhotoSelectionActivity.java
new file mode 100644
index 0000000..02843e9
--- /dev/null
+++ b/src/com/android/contacts/activities/PhotoSelectionActivity.java
@@ -0,0 +1,505 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts.activities;
+
+import com.android.contacts.ContactPhotoManager;
+import com.android.contacts.ContactSaveService;
+import com.android.contacts.R;
+import com.android.contacts.detail.PhotoSelectionHandler;
+import com.android.contacts.editor.PhotoActionPopup;
+import com.android.contacts.model.EntityDeltaList;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.view.View;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.widget.FrameLayout.LayoutParams;
+import android.widget.ImageView;
+
+import java.io.File;
+
+/**
+ * Popup activity for choosing a contact photo within the Contacts app.
+ */
+public class PhotoSelectionActivity extends Activity {
+
+ /** Number of ms for the animation to expand the photo. */
+ private static final int PHOTO_EXPAND_DURATION = 100;
+
+ /** Number of ms for the animation to contract the photo on activity exit. */
+ private static final int PHOTO_CONTRACT_DURATION = 50;
+
+ /** Number of ms for the animation to hide the backdrop on finish. */
+ private static final int BACKDROP_FADEOUT_DURATION = 100;
+
+ private static final String KEY_CURRENT_PHOTO_FILE = "currentphotofile";
+
+ private static final String KEY_SUB_ACTIVITY_IN_PROGRESS = "subinprogress";
+
+ /** Intent extra to get the photo URI. */
+ public static final String PHOTO_URI = "photo_uri";
+
+ /** Intent extra to get the entity delta list. */
+ public static final String ENTITY_DELTA_LIST = "entity_delta_list";
+
+ /** Intent extra to indicate whether the contact is the user's profile. */
+ public static final String IS_PROFILE = "is_profile";
+
+ /** Intent extra to indicate whether the contact is from a directory (non-editable). */
+ public static final String IS_DIRECTORY_CONTACT = "is_directory_contact";
+
+ /**
+ * Intent extra to indicate whether the photo should be animated to show the full contents of
+ * the photo (on a larger portion of the screen) when clicked. If unspecified or false, the
+ * photo will not move from its original location.
+ */
+ public static final String EXPAND_PHOTO = "expand_photo";
+
+ /** Source bounds of the image that was clicked on. */
+ private Rect mSourceBounds;
+
+ /**
+ * The photo URI. May be null, in which case the default avatar will be used.
+ */
+ private Uri mPhotoUri;
+
+ /** Entity delta list of the contact. */
+ private EntityDeltaList mState;
+
+ /** Whether the contact is the user's profile. */
+ private boolean mIsProfile;
+
+ /** Whether the contact is from a directory. */
+ private boolean mIsDirectoryContact;
+
+ /** Whether to animate the photo to an expanded view covering more of the screen. */
+ private boolean mExpandPhoto;
+
+ /** The semi-transparent backdrop. */
+ private View mBackdrop;
+
+ /** The photo view. */
+ private ImageView mPhotoView;
+
+ /** The photo handler attached to this activity, if any. */
+ private PhotoHandler mPhotoHandler;
+
+ /** Animator to expand the photo out to full size. */
+ private ObjectAnimator mPhotoAnimator;
+
+ /** Listener for the animation. */
+ private AnimatorListenerAdapter mAnimationListener;
+
+ /** Whether a change in layout of the photo has occurred that has no animation yet. */
+ private boolean mAnimationPending;
+
+ /** Prior position of the image (for animating). */
+ Rect mOriginalPos = new Rect();
+
+ /** Layout params for the photo view before we started animating. */
+ private LayoutParams mPhotoStartParams;
+
+ /** Layout params for the photo view after we finished animating. */
+ private LayoutParams mPhotoEndParams;
+
+ /** Whether a sub-activity is currently in progress. */
+ private boolean mSubActivityInProgress;
+
+ /**
+ * A photo result received by the activity, persisted across activity lifecycle.
+ */
+ private PendingPhotoResult mPendingPhotoResult;
+
+ /**
+ * The photo file being interacted with, if any. Saved/restored between activity instances.
+ */
+ private File mCurrentPhotoFile;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.photoselection_activity);
+ if (savedInstanceState != null) {
+ String fileName = savedInstanceState.getString(KEY_CURRENT_PHOTO_FILE);
+ if (fileName != null) {
+ mCurrentPhotoFile = new File(fileName);
+ }
+ mSubActivityInProgress = savedInstanceState.getBoolean(KEY_SUB_ACTIVITY_IN_PROGRESS);
+ }
+
+ // Pull data out of the intent.
+ final Intent intent = getIntent();
+ mPhotoUri = intent.getParcelableExtra(PHOTO_URI);
+ mState = (EntityDeltaList) intent.getParcelableExtra(ENTITY_DELTA_LIST);
+ mIsProfile = intent.getBooleanExtra(IS_PROFILE, false);
+ mIsDirectoryContact = intent.getBooleanExtra(IS_DIRECTORY_CONTACT, false);
+ mExpandPhoto = intent.getBooleanExtra(EXPAND_PHOTO, false);
+
+ mBackdrop = findViewById(R.id.backdrop);
+ mPhotoView = (ImageView) findViewById(R.id.photo);
+ mSourceBounds = intent.getSourceBounds();
+
+ // Fade in the background.
+ animateInBackground();
+
+ // Dismiss the dialog on clicking the backdrop.
+ mBackdrop.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
+ });
+
+ // Wait until the layout pass to show the photo, so that the source bounds will match up.
+ OnGlobalLayoutListener globalLayoutListener = new OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ displayPhoto();
+ mBackdrop.getViewTreeObserver().removeGlobalOnLayoutListener(this);
+ }
+ };
+ mBackdrop.getViewTreeObserver().addOnGlobalLayoutListener(globalLayoutListener);
+ }
+
+ @Override
+ public void finish() {
+ if (!mSubActivityInProgress) {
+ closePhotoAndFinish();
+ } else {
+ activityFinish();
+ }
+ }
+
+ /**
+ * Builds a well-formed intent for invoking this activity.
+ * @param context The context.
+ * @param photoUri The URI of the current photo (may be null, in which case the default
+ * avatar image will be displayed).
+ * @param photoBitmap The bitmap of the current photo (may be null, in which case the default
+ * avatar image will be displayed).
+ * @param photoBytes The bytes for the current photo (may be null, in which case the default
+ * avatar image will be displayed).
+ * @param photoBounds The pixel bounds of the current photo.
+ * @param delta The entity delta list for the contact.
+ * @param isProfile Whether the contact is the user's profile.
+ * @param isDirectoryContact Whether the contact comes from a directory (non-editable).
+ * @param expandPhotoOnClick Whether the photo should be expanded on click or not (generally,
+ * this should be true for phones, and false for tablets).
+ * @return An intent that can be used to invoke the photo selection activity.
+ */
+ public static Intent buildIntent(Context context, Uri photoUri, Bitmap photoBitmap,
+ byte[] photoBytes, Rect photoBounds, EntityDeltaList delta, boolean isProfile,
+ boolean isDirectoryContact, boolean expandPhotoOnClick) {
+ Intent intent = new Intent(context, PhotoSelectionActivity.class);
+ if (photoUri != null && photoBitmap != null && photoBytes != null) {
+ intent.putExtra(PHOTO_URI, photoUri);
+ }
+ intent.setSourceBounds(photoBounds);
+ intent.putExtra(ENTITY_DELTA_LIST, (Parcelable) delta);
+ intent.putExtra(IS_PROFILE, isProfile);
+ intent.putExtra(IS_DIRECTORY_CONTACT, isDirectoryContact);
+ intent.putExtra(EXPAND_PHOTO, expandPhotoOnClick);
+ return intent;
+ }
+
+ private void activityFinish() {
+ super.finish();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mPhotoAnimator != null) {
+ mPhotoAnimator.cancel();
+ mPhotoAnimator = null;
+ }
+ if (mPhotoHandler != null) {
+ mPhotoHandler.destroy();
+ mPhotoHandler = null;
+ }
+ }
+
+ private void displayPhoto() {
+ // Load the photo.
+ if (mPhotoUri != null) {
+ // If we have a URI, the bitmap should be cached directly.
+ ContactPhotoManager.getInstance(this).loadPhoto(mPhotoView, mPhotoUri, true, false);
+ } else {
+ // Fall back to avatar image.
+ mPhotoView.setImageResource(ContactPhotoManager.getDefaultAvatarResId(true, false));
+ }
+
+ // Animate the photo view into its end location.
+ final int[] pos = new int[2];
+ mBackdrop.getLocationOnScreen(pos);
+ LayoutParams layoutParams = new LayoutParams(mSourceBounds.width(),
+ mSourceBounds.height());
+ mOriginalPos.left = mSourceBounds.left - pos[0];
+ mOriginalPos.top = mSourceBounds.top - pos[1];
+ mOriginalPos.right = mOriginalPos.left + mSourceBounds.width();
+ mOriginalPos.bottom = mOriginalPos.top + mSourceBounds.height();
+ layoutParams.setMargins(mOriginalPos.left, mOriginalPos.top, mOriginalPos.right,
+ mOriginalPos.bottom);
+ mPhotoStartParams = layoutParams;
+ mPhotoView.setLayoutParams(layoutParams);
+ mPhotoView.requestLayout();
+
+ mPhotoView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ if (mAnimationPending) {
+ mAnimationPending = false;
+ PropertyValuesHolder pvhLeft =
+ PropertyValuesHolder.ofInt("left", mOriginalPos.left, left);
+ PropertyValuesHolder pvhTop =
+ PropertyValuesHolder.ofInt("top", mOriginalPos.top, top);
+ PropertyValuesHolder pvhRight =
+ PropertyValuesHolder.ofInt("right", mOriginalPos.right, right);
+ PropertyValuesHolder pvhBottom =
+ PropertyValuesHolder.ofInt("bottom", mOriginalPos.bottom, bottom);
+ ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(mPhotoView,
+ pvhLeft, pvhTop, pvhRight, pvhBottom).setDuration(
+ PHOTO_EXPAND_DURATION);
+ if (mAnimationListener != null) {
+ anim.addListener(mAnimationListener);
+ }
+ anim.start();
+ }
+ }
+ });
+ attachPhotoHandler();
+ }
+
+ private LayoutParams getPhotoEndParams() {
+ if (mPhotoEndParams == null) {
+ mPhotoEndParams = new LayoutParams(mPhotoStartParams);
+ if (mExpandPhoto) {
+ Rect bounds = new Rect();
+ mBackdrop.getDrawingRect(bounds);
+ if (bounds.height() > bounds.width()) {
+ //Take up full width.
+ mPhotoEndParams.width = bounds.width();
+ mPhotoEndParams.height = bounds.width();
+ } else {
+ // Take up full height, leaving space for the popup.
+ mPhotoEndParams.height = bounds.height() - 150;
+ mPhotoEndParams.width = bounds.height() - 150;
+ }
+ mPhotoEndParams.topMargin = 0;
+ mPhotoEndParams.leftMargin = 0;
+ mPhotoEndParams.bottomMargin = mPhotoEndParams.height;
+ mPhotoEndParams.rightMargin = mPhotoEndParams.width;
+ }
+ }
+ return mPhotoEndParams;
+ }
+
+ private void animatePhotoOpen() {
+ mAnimationListener = new AnimatorListenerAdapter() {
+ private void capturePhotoPos() {
+ mPhotoView.requestLayout();
+ mOriginalPos.left = mPhotoView.getLeft();
+ mOriginalPos.top = mPhotoView.getTop();
+ mOriginalPos.right = mPhotoView.getRight();
+ mOriginalPos.bottom = mPhotoView.getBottom();
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ capturePhotoPos();
+ if (mPhotoHandler != null) {
+ mPhotoHandler.onClick(mPhotoView);
+ }
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ capturePhotoPos();
+ }
+ };
+ animatePhoto(getPhotoEndParams());
+ }
+
+ private void closePhotoAndFinish() {
+ mAnimationListener = new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ // After the photo animates down, fade it away and finish.
+ ObjectAnimator anim = ObjectAnimator.ofFloat(
+ mPhotoView, "alpha", 0f).setDuration(PHOTO_CONTRACT_DURATION);
+ anim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ activityFinish();
+ }
+ });
+ anim.start();
+ }
+ };
+
+ // TODO: This won't animate in the right way if the rotation has changed since the activity
+ // was first started.
+ animatePhoto(mPhotoStartParams);
+ animateAwayBackground();
+ }
+
+ private void animatePhoto(MarginLayoutParams to) {
+ // Cancel any existing animation.
+ if (mPhotoAnimator != null) {
+ mPhotoAnimator.cancel();
+ }
+
+ mPhotoView.setLayoutParams(to);
+ mAnimationPending = true;
+ mPhotoView.requestLayout();
+ }
+
+ private void animateInBackground() {
+ ObjectAnimator.ofFloat(mBackdrop, "alpha", 0, 0.5f).setDuration(
+ PHOTO_EXPAND_DURATION).start();
+ }
+
+ private void animateAwayBackground() {
+ ObjectAnimator.ofFloat(mBackdrop, "alpha", 0f).setDuration(
+ BACKDROP_FADEOUT_DURATION).start();
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ if (mCurrentPhotoFile != null) {
+ outState.putString(KEY_CURRENT_PHOTO_FILE, mCurrentPhotoFile.toString());
+ }
+ outState.putBoolean(KEY_SUB_ACTIVITY_IN_PROGRESS, mSubActivityInProgress);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mPhotoHandler != null) {
+ mSubActivityInProgress = false;
+ if (mPhotoHandler.handlePhotoActivityResult(requestCode, resultCode, data)) {
+ // Clear out any pending photo result.
+ mPendingPhotoResult = null;
+ } else {
+ // User returning to the photo selection activity. Re-display options.
+ mPhotoHandler.onClick(mPhotoView);
+ }
+ } else {
+ // Create a pending photo result to be handled when the photo handler is created.
+ mPendingPhotoResult = new PendingPhotoResult(requestCode, resultCode, data);
+ }
+ }
+
+ private void attachPhotoHandler() {
+ // Always provide the same two choices (take a photo with the camera, select a photo
+ // from the gallery), but with slightly different wording.
+ // Note: don't worry about this being a read-only contact; this code will not be invoked.
+ int mode = (mPhotoUri == null) ? PhotoActionPopup.Modes.NO_PHOTO
+ : PhotoActionPopup.Modes.PHOTO_DISALLOW_PRIMARY;
+ // We don't want to provide a choice to remove the photo for two reasons:
+ // 1) the UX designs don't call for it
+ // 2) even if we wanted to, the implementation would be moderately hairy
+ mode &= ~PhotoActionPopup.Flags.REMOVE_PHOTO;
+
+ mPhotoHandler = new PhotoHandler(this, mPhotoView, mode, mState);
+ if (mPendingPhotoResult != null) {
+ mPhotoHandler.handlePhotoActivityResult(mPendingPhotoResult.mRequestCode,
+ mPendingPhotoResult.mResultCode, mPendingPhotoResult.mData);
+ mPendingPhotoResult = null;
+ } else {
+ animatePhotoOpen();
+ }
+ }
+
+ private final class PhotoHandler extends PhotoSelectionHandler {
+ private PhotoHandler(Context context, View photoView, int photoMode,
+ EntityDeltaList state) {
+ super(context, photoView, photoMode, mIsDirectoryContact, state);
+ setListener(new PhotoListener(context, mIsProfile));
+ }
+
+ private final class PhotoListener extends PhotoActionListener {
+ private final Context mContext;
+ private final boolean mIsProfile;
+ private PhotoListener(Context context, boolean isProfile) {
+ mContext = context;
+ mIsProfile = isProfile;
+ }
+
+ @Override
+ public void startTakePhotoActivity(Intent intent, int requestCode, File photoFile) {
+ mSubActivityInProgress = true;
+ mCurrentPhotoFile = photoFile;
+ startActivityForResult(intent, requestCode);
+ }
+
+ @Override
+ public void startPickFromGalleryActivity(Intent intent, int requestCode,
+ File photoFile) {
+ mSubActivityInProgress = true;
+ mCurrentPhotoFile = photoFile;
+ startActivityForResult(intent, requestCode);
+ }
+
+ @Override
+ public void onPhotoSelected(Bitmap bitmap) {
+ EntityDeltaList delta = getDeltaForAttachingPhotoToContact();
+ long rawContactId = getWritableEntityId();
+ String filePath = mCurrentPhotoFile.getAbsolutePath();
+ Intent intent = ContactSaveService.createSaveContactIntent(mContext, delta,
+ "", 0, mIsProfile, PhotoSelectionActivity.class,
+ ContactEditorActivity.ACTION_SAVE_COMPLETED, rawContactId, filePath);
+ startService(intent);
+ finish();
+ }
+
+ @Override
+ public File getCurrentPhotoFile() {
+ return mCurrentPhotoFile;
+ }
+
+ @Override
+ public void onPhotoSelectionDismissed() {
+ if (!mSubActivityInProgress) {
+ finish();
+ }
+ }
+ }
+ }
+
+ private static class PendingPhotoResult {
+ private int mRequestCode;
+ private int mResultCode;
+ private Intent mData;
+ private PendingPhotoResult(int requestCode, int resultCode, Intent data) {
+ mRequestCode = requestCode;
+ mResultCode = resultCode;
+ mData = data;
+ }
+ }
+}
diff --git a/src/com/android/contacts/activities/ShowOrCreateActivity.java b/src/com/android/contacts/activities/ShowOrCreateActivity.java
index c60d0fb..2efd6ba 100755
--- a/src/com/android/contacts/activities/ShowOrCreateActivity.java
+++ b/src/com/android/contacts/activities/ShowOrCreateActivity.java
@@ -24,7 +24,6 @@
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.SearchManager;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
@@ -122,14 +121,12 @@
// Handle specific query request
if (Constants.SCHEME_MAILTO.equals(scheme)) {
mCreateExtras.putString(Intents.Insert.EMAIL, ssp);
- mCreateExtras.putString(SearchManager.QUERY, ssp);
Uri uri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, Uri.encode(ssp));
mQueryHandler.startQuery(QUERY_TOKEN, null, uri, CONTACTS_PROJECTION, null, null, null);
} else if (Constants.SCHEME_TEL.equals(scheme)) {
mCreateExtras.putString(Intents.Insert.PHONE, ssp);
- mCreateExtras.putString(SearchManager.QUERY, ssp);
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, ssp);
mQueryHandler.startQuery(QUERY_TOKEN, null, uri, PHONES_PROJECTION, null, null, null);
@@ -216,7 +213,6 @@
R.string.add_contact_dlg_message_fmt, mCreateDescrip);
return new AlertDialog.Builder(this, AlertDialog.THEME_HOLO_LIGHT)
- .setTitle(R.string.add_contact_dlg_title)
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new IntentClickListener(this, createIntent))
diff --git a/src/com/android/contacts/calllog/CallDetailHistoryAdapter.java b/src/com/android/contacts/calllog/CallDetailHistoryAdapter.java
index 22b85d7..7b6ae63 100644
--- a/src/com/android/contacts/calllog/CallDetailHistoryAdapter.java
+++ b/src/com/android/contacts/calllog/CallDetailHistoryAdapter.java
@@ -72,6 +72,12 @@
}
@Override
+ public boolean isEnabled(int position) {
+ // None of history will be clickable.
+ return false;
+ }
+
+ @Override
public int getCount() {
return mPhoneCallDetails.length + 1;
}
diff --git a/src/com/android/contacts/calllog/CallLogFragment.java b/src/com/android/contacts/calllog/CallLogFragment.java
index d9606cb..059436b 100644
--- a/src/com/android/contacts/calllog/CallLogFragment.java
+++ b/src/com/android/contacts/calllog/CallLogFragment.java
@@ -19,7 +19,7 @@
import com.android.common.io.MoreCloseables;
import com.android.contacts.ContactsUtils;
import com.android.contacts.R;
-import com.android.contacts.activities.DialtactsActivity.ViewPagerVisibilityListener;
+import com.android.contacts.util.Constants;
import com.android.contacts.util.EmptyLoader;
import com.android.contacts.voicemail.VoicemailStatusHelper;
import com.android.contacts.voicemail.VoicemailStatusHelper.StatusMessage;
@@ -56,8 +56,8 @@
/**
* Displays a list of call log entries.
*/
-public class CallLogFragment extends ListFragment implements ViewPagerVisibilityListener,
- CallLogQueryHandler.Listener, CallLogAdapter.CallFetcher {
+public class CallLogFragment extends ListFragment
+ implements CallLogQueryHandler.Listener, CallLogAdapter.CallFetcher {
private static final String TAG = "CallLogFragment";
/**
@@ -69,7 +69,6 @@
private CallLogQueryHandler mCallLogQueryHandler;
private boolean mScrollToTop;
- private boolean mShowOptionsMenu;
/** Whether there is at least one voicemail source installed. */
private boolean mVoicemailSourcesAvailable = false;
/** Whether we are currently filtering over voicemail. */
@@ -265,24 +264,20 @@
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
- if (mShowOptionsMenu) {
- inflater.inflate(R.menu.call_log_options, menu);
- }
+ inflater.inflate(R.menu.call_log_options, menu);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
- if (mShowOptionsMenu) {
- final MenuItem itemDeleteAll = menu.findItem(R.id.delete_all);
- // Check if all the menu items are inflated correctly. As a shortcut, we assume all
- // menu items are ready if the first item is non-null.
- if (itemDeleteAll != null) {
- itemDeleteAll.setEnabled(mAdapter != null && !mAdapter.isEmpty());
- menu.findItem(R.id.show_voicemails_only).setVisible(
- mVoicemailSourcesAvailable && !mShowingVoicemailOnly);
- menu.findItem(R.id.show_all_calls).setVisible(
- mVoicemailSourcesAvailable && mShowingVoicemailOnly);
- }
+ final MenuItem itemDeleteAll = menu.findItem(R.id.delete_all);
+ // Check if all the menu items are inflated correctly. As a shortcut, we assume all
+ // menu items are ready if the first item is non-null.
+ if (itemDeleteAll != null) {
+ itemDeleteAll.setEnabled(mAdapter != null && !mAdapter.isEmpty());
+ menu.findItem(R.id.show_voicemails_only).setVisible(
+ mVoicemailSourcesAvailable && !mShowingVoicemailOnly);
+ menu.findItem(R.id.show_all_calls).setVisible(
+ mVoicemailSourcesAvailable && mShowingVoicemailOnly);
}
}
@@ -329,8 +324,8 @@
Intent intent;
// If "number" is really a SIP address, construct a sip: URI.
if (PhoneNumberUtils.isUriNumber(number)) {
- intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts("sip", number, null));
+ intent = ContactsUtils.getCallIntent(
+ Uri.fromParts(Constants.SCHEME_SIP, number, null));
} else {
// We're calling a regular PSTN phone number.
// Construct a tel: URI, but do some other possible cleanup first.
@@ -342,8 +337,8 @@
String countryIso = cursor.getString(CallLogQuery.COUNTRY_ISO);
number = mAdapter.getBetterNumberFromContacts(number, countryIso);
}
- intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts("tel", number, null));
+ intent = ContactsUtils.getCallIntent(
+ Uri.fromParts(Constants.SCHEME_TEL, number, null));
}
intent.setFlags(
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
@@ -357,21 +352,13 @@
}
@Override
- public void onVisibilityChanged(boolean visible) {
- if (mShowOptionsMenu != visible) {
- mShowOptionsMenu = visible;
- // Invalidate the options menu since we are changing the list of options shown in it.
- Activity activity = getActivity();
- if (activity != null) {
- activity.invalidateOptionsMenu();
- }
- }
-
- if (visible && isResumed()) {
+ public void setMenuVisibility(boolean menuVisible) {
+ super.setMenuVisibility(menuVisible);
+ if (menuVisible && isResumed()) {
refreshData();
}
- if (!visible) {
+ if (!menuVisible) {
updateOnExit();
}
}
@@ -415,7 +402,8 @@
private void updateOnTransition(boolean onEntry) {
// We don't want to update any call data when keyguard is on because the user has likely not
// seen the new calls yet.
- if (!mKeyguardManager.inKeyguardRestrictedInputMode()) {
+ // This might be called before onCreate() and thus we need to check null explicitly.
+ if (mKeyguardManager != null && !mKeyguardManager.inKeyguardRestrictedInputMode()) {
// On either of the transitions we reset the new flag and update the notifications.
// While exiting we additionally consume all missed calls (by marking them as read).
// This will ensure that they no more appear in the "new" section when we return back.
diff --git a/src/com/android/contacts/calllog/CallLogListItemHelper.java b/src/com/android/contacts/calllog/CallLogListItemHelper.java
index bfedba5..9485b54 100644
--- a/src/com/android/contacts/calllog/CallLogListItemHelper.java
+++ b/src/com/android/contacts/calllog/CallLogListItemHelper.java
@@ -45,7 +45,7 @@
public CallLogListItemHelper(PhoneCallDetailsHelper phoneCallDetailsHelper,
PhoneNumberHelper phoneNumberHelper, Resources resources) {
mPhoneCallDetailsHelper = phoneCallDetailsHelper;
- mPhoneNumberHelper= phoneNumberHelper;
+ mPhoneNumberHelper = phoneNumberHelper;
mResources = resources;
}
diff --git a/src/com/android/contacts/calllog/CallLogListItemViews.java b/src/com/android/contacts/calllog/CallLogListItemViews.java
index 741d218..503de43 100644
--- a/src/com/android/contacts/calllog/CallLogListItemViews.java
+++ b/src/com/android/contacts/calllog/CallLogListItemViews.java
@@ -18,6 +18,7 @@
import com.android.contacts.PhoneCallDetailsViews;
import com.android.contacts.R;
+import com.android.contacts.test.NeededForTesting;
import android.content.Context;
import android.view.View;
@@ -68,6 +69,7 @@
view.findViewById(R.id.call_log_divider));
}
+ @NeededForTesting
public static CallLogListItemViews createForTest(Context context) {
return new CallLogListItemViews(
new QuickContactBadge(context),
diff --git a/src/com/android/contacts/calllog/DefaultVoicemailNotifier.java b/src/com/android/contacts/calllog/DefaultVoicemailNotifier.java
index c5e8f91..59dfcd4 100644
--- a/src/com/android/contacts/calllog/DefaultVoicemailNotifier.java
+++ b/src/com/android/contacts/calllog/DefaultVoicemailNotifier.java
@@ -90,8 +90,13 @@
// TODO: Move this into a service, to avoid holding the receiver up.
final NewCall[] newCalls = mNewCallsQuery.query();
+ if (newCalls == null) {
+ // Query failed, just return.
+ return;
+ }
+
if (newCalls.length == 0) {
- Log.e(TAG, "No voicemails to notify about: clear the notification.");
+ // No voicemails to notify about: clear the notification.
clearNotification();
return;
}
@@ -243,6 +248,9 @@
try {
cursor = mContentResolver.query(Calls.CONTENT_URI_WITH_VOICEMAIL, PROJECTION,
selection, selectionArgs, Calls.DEFAULT_SORT_ORDER);
+ if (cursor == null) {
+ return null;
+ }
NewCall[] newCalls = new NewCall[cursor.getCount()];
while (cursor.moveToNext()) {
newCalls[cursor.getPosition()] = createNewCallsFromCursor(cursor);
@@ -301,7 +309,7 @@
cursor = mContentResolver.query(
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)),
PROJECTION, null, null, null);
- if (!cursor.moveToFirst()) return null;
+ if (cursor == null || !cursor.moveToFirst()) return null;
return cursor.getString(DISPLAY_NAME_COLUMN_INDEX);
} finally {
if (cursor != null) {
diff --git a/src/com/android/contacts/calllog/IntentProvider.java b/src/com/android/contacts/calllog/IntentProvider.java
index bfee5ec..7ddfecc 100644
--- a/src/com/android/contacts/calllog/IntentProvider.java
+++ b/src/com/android/contacts/calllog/IntentProvider.java
@@ -17,6 +17,7 @@
package com.android.contacts.calllog;
import com.android.contacts.CallDetailActivity;
+import com.android.contacts.ContactsUtils;
import android.content.ContentUris;
import android.content.Context;
@@ -38,16 +39,7 @@
return new IntentProvider() {
@Override
public Intent getIntent(Context context) {
- // Here, "number" can either be a PSTN phone number or a
- // SIP address. So turn it into either a tel: URI or a
- // sip: URI, as appropriate.
- Uri uri;
- if (PhoneNumberUtils.isUriNumber(number)) {
- uri = Uri.fromParts("sip", number, null);
- } else {
- uri = Uri.fromParts("tel", number, null);
- }
- return new Intent(Intent.ACTION_CALL_PRIVILEGED, uri);
+ return ContactsUtils.getCallIntent(number);
}
};
}
diff --git a/src/com/android/contacts/calllog/PhoneNumberHelper.java b/src/com/android/contacts/calllog/PhoneNumberHelper.java
index 20031b2..af7c2f6 100644
--- a/src/com/android/contacts/calllog/PhoneNumberHelper.java
+++ b/src/com/android/contacts/calllog/PhoneNumberHelper.java
@@ -16,6 +16,7 @@
package com.android.contacts.calllog;
+import com.android.contacts.ContactsUtils;
import com.android.contacts.R;
import com.android.internal.telephony.CallerInfo;
@@ -76,23 +77,18 @@
}
}
- /** Returns a URI that can be used to place a call to this number. */
- public Uri getCallUri(String number) {
- if (isVoicemailNumber(number)) {
- return Uri.parse("voicemail:x");
- }
- if (isSipNumber(number)) {
- return Uri.fromParts("sip", number, null);
- }
- return Uri.fromParts("tel", number, null);
- }
-
- /** Returns true if the given number is the number of the configured voicemail. */
+ /**
+ * Returns true if the given number is the number of the configured voicemail.
+ * To be able to mock-out this, it is not a static method.
+ */
public boolean isVoicemailNumber(CharSequence number) {
return PhoneNumberUtils.isVoiceMailNumber(number.toString());
}
- /** Returns true if the given number is a SIP address. */
+ /**
+ * Returns true if the given number is a SIP address.
+ * To be able to mock-out this, it is not a static method.
+ */
public boolean isSipNumber(CharSequence number) {
return PhoneNumberUtils.isUriNumber(number.toString());
}
diff --git a/src/com/android/contacts/detail/CarouselTab.java b/src/com/android/contacts/detail/CarouselTab.java
index 677f0ad..9331bed 100644
--- a/src/com/android/contacts/detail/CarouselTab.java
+++ b/src/com/android/contacts/detail/CarouselTab.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
+import android.view.ViewPropertyAnimator;
import android.widget.RelativeLayout;
import android.widget.TextView;
@@ -31,7 +32,10 @@
private static final String TAG = CarouselTab.class.getSimpleName();
+ private static final long FADE_TRANSITION_TIME = 150;
+
private TextView mLabelView;
+ private View mLabelBackgroundView;
/**
* This view adds an alpha layer over the entire tab.
@@ -55,6 +59,8 @@
mLabelView = (TextView) findViewById(R.id.label);
mLabelView.setClickable(true);
+ mLabelBackgroundView = findViewById(R.id.label_background);
+
mAlphaLayer = findViewById(R.id.alpha_overlay);
mTouchInterceptLayer = findViewById(R.id.touch_intercept_overlay);
}
@@ -73,8 +79,9 @@
@Override
public void disableTouchInterceptor() {
- // This shouldn't be called because there is no need to disable the touch interceptor if
- // there is no content within the tab that needs to be clicked.
+ if (mTouchInterceptLayer != null) {
+ mTouchInterceptLayer.setVisibility(View.GONE);
+ }
}
@Override
@@ -89,4 +96,20 @@
public void setAlphaLayerValue(float alpha) {
ContactDetailDisplayUtils.setAlphaOnViewBackground(mAlphaLayer, alpha);
}
+
+ public void fadeInLabelViewAnimator(int startDelay, boolean fadeBackground) {
+ final ViewPropertyAnimator labelAnimator = mLabelView.animate();
+ mLabelView.setAlpha(0.0f);
+ labelAnimator.alpha(1.0f);
+ labelAnimator.setStartDelay(startDelay);
+ labelAnimator.setDuration(FADE_TRANSITION_TIME);
+
+ if (fadeBackground) {
+ final ViewPropertyAnimator backgroundAnimator = mLabelBackgroundView.animate();
+ mLabelBackgroundView.setAlpha(0.0f);
+ backgroundAnimator.alpha(1.0f);
+ backgroundAnimator.setStartDelay(startDelay);
+ backgroundAnimator.setDuration(FADE_TRANSITION_TIME);
+ }
+ }
}
diff --git a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
index b81cebf..08e8bfe 100644
--- a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
+++ b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
@@ -20,6 +20,8 @@
import com.android.contacts.ContactLoader.Result;
import com.android.contacts.ContactPhotoManager;
import com.android.contacts.R;
+import com.android.contacts.activities.PhotoSelectionActivity;
+import com.android.contacts.model.EntityDeltaList;
import com.android.contacts.preference.ContactsPreferences;
import com.android.contacts.util.ContactBadgeUtil;
import com.android.contacts.util.HtmlUtils;
@@ -32,12 +34,14 @@
import android.content.Context;
import android.content.Entity;
import android.content.Entity.NamedContentValues;
+import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.provider.ContactsContract;
@@ -50,11 +54,12 @@
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
+import android.view.MenuItem;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
-import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
@@ -192,11 +197,20 @@
/**
* Sets the contact photo to display in the given {@link ImageView}. If bitmap is null, the
* default placeholder image is shown.
+ * @param context The context.
+ * @param contactData The contact loader result.
+ * @param photoView The photo view that will host the image and act as the basis for the
+ * photo selector.
+ * @param expandPhotoOnClick Whether the photo should be expanded to fill more of the screen
+ * when clicked.
+ * @return The onclick listener for the photo. When clicked, a photo selection activity will
+ * be launched.
*/
- public static void setPhoto(Context context, Result contactData, ImageView photoView) {
+ public static OnClickListener setPhoto(Context context, Result contactData,
+ ImageView photoView, boolean expandPhotoOnClick) {
if (contactData.isLoadingPhoto()) {
photoView.setImageBitmap(null);
- return;
+ return null;
}
byte[] photo = contactData.getPhotoBinaryData();
Bitmap bitmap = photo != null ? BitmapFactory.decodeByteArray(photo, 0, photo.length)
@@ -209,22 +223,103 @@
photoView.startAnimation(animation);
}
photoView.setImageBitmap(bitmap);
+
+ // Set up the photo to display a full-screen photo selection activity when clicked.
+ OnClickListener clickListener = new PhotoClickListener(context, contactData, bitmap,
+ photo, expandPhotoOnClick);
+ photoView.setOnClickListener(clickListener);
+ return clickListener;
+ }
+
+ private static final class PhotoClickListener implements OnClickListener {
+
+ private final Context mContext;
+ private final Result mContactData;
+ private final Bitmap mPhotoBitmap;
+ private final byte[] mPhotoBytes;
+ private final boolean mExpandPhotoOnClick;
+ public PhotoClickListener(Context context, Result contactData, Bitmap photoBitmap,
+ byte[] photoBytes, boolean expandPhotoOnClick) {
+ mContext = context;
+ mContactData = contactData;
+ mPhotoBitmap = photoBitmap;
+ mPhotoBytes = photoBytes;
+ mExpandPhotoOnClick = expandPhotoOnClick;
+ }
+
+ @Override
+ public void onClick(View v) {
+ // Assemble the intent.
+ EntityDeltaList delta = EntityDeltaList.fromIterator(
+ mContactData.getEntities().iterator());
+
+ // Find location and bounds of target view, adjusting based on the
+ // assumed local density.
+ final float appScale =
+ mContext.getResources().getCompatibilityInfo().applicationScale;
+ final int[] pos = new int[2];
+ v.getLocationOnScreen(pos);
+
+ final Rect rect = new Rect();
+ rect.left = (int) (pos[0] * appScale + 0.5f);
+ rect.top = (int) (pos[1] * appScale + 0.5f);
+ rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f);
+ rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f);
+
+ Uri photoUri = null;
+ if (mContactData.getPhotoUri() != null) {
+ photoUri = Uri.parse(mContactData.getPhotoUri());
+ }
+ Intent photoSelectionIntent = PhotoSelectionActivity.buildIntent(mContext,
+ photoUri, mPhotoBitmap, mPhotoBytes, rect, delta, mContactData.isUserProfile(),
+ mContactData.isDirectoryEntry(), mExpandPhotoOnClick);
+ // Cache the bitmap directly, so the activity can pull it from the photo manager.
+ ContactPhotoManager.getInstance(mContext).cacheBitmap(photoUri, mPhotoBitmap,
+ mPhotoBytes);
+ mContext.startActivity(photoSelectionIntent);
+ }
}
/**
* Sets the starred state of this contact.
*/
- public static void setStarred(Result contactData, CheckBox starredView) {
+ public static void configureStarredImageView(ImageView starredView, boolean isDirectoryEntry,
+ boolean isUserProfile, boolean isStarred) {
// Check if the starred state should be visible
- if (!contactData.isDirectoryEntry() && !contactData.isUserProfile()) {
+ if (!isDirectoryEntry && !isUserProfile) {
starredView.setVisibility(View.VISIBLE);
- starredView.setChecked(contactData.getStarred());
+ final int resId = isStarred
+ ? R.drawable.btn_star_on_normal_holo_light
+ : R.drawable.btn_star_off_normal_holo_light;
+ starredView.setImageResource(resId);
+ starredView.setTag(isStarred);
+ starredView.setContentDescription(starredView.getResources().getString(
+ isStarred ? R.string.menu_removeStar : R.string.menu_addStar));
} else {
starredView.setVisibility(View.GONE);
}
}
/**
+ * Sets the starred state of this contact.
+ */
+ public static void configureStarredMenuItem(MenuItem starredMenuItem, boolean isDirectoryEntry,
+ boolean isUserProfile, boolean isStarred) {
+ // Check if the starred state should be visible
+ if (!isDirectoryEntry && !isUserProfile) {
+ starredMenuItem.setVisible(true);
+ final int resId = isStarred
+ ? R.drawable.btn_star_on_normal_holo_dark
+ : R.drawable.btn_star_off_normal_holo_dark;
+ starredMenuItem.setIcon(resId);
+ starredMenuItem.setChecked(isStarred);
+ starredMenuItem.setTitle(isStarred ? R.string.menu_removeStar : R.string.menu_addStar);
+ } else {
+ starredMenuItem.setVisible(false);
+ }
+ }
+
+ /**
* Set the social snippet text. If there isn't one, then set the view to gone.
*/
public static void setSocialSnippet(Context context, Result contactData, TextView statusView,
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index 26d240f..b0050c0 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -40,8 +40,8 @@
import com.android.contacts.util.Constants;
import com.android.contacts.util.DataStatus;
import com.android.contacts.util.DateUtils;
-import com.android.contacts.util.StructuredPostalUtils;
import com.android.contacts.util.PhoneCapabilityTester;
+import com.android.contacts.util.StructuredPostalUtils;
import com.android.contacts.widget.TransitionAnimationView;
import com.android.internal.telephony.ITelephony;
import com.google.common.annotations.VisibleForTesting;
@@ -84,7 +84,6 @@
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Directory;
import android.provider.ContactsContract.DisplayNameSources;
-import android.provider.ContactsContract.Intents.UI;
import android.provider.ContactsContract.PhoneLookup;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.StatusUpdates;
@@ -133,13 +132,6 @@
private static final String KEY_CONTACT_URI = "contactUri";
private static final String KEY_LIST_STATE = "liststate";
- // TODO: Make maxLines a field in {@link DataKind}
- private static final int WEBSITE_MAX_LINES = 1;
- private static final int SIP_ADDRESS_MAX_LINES= 1;
- private static final int POSTAL_ADDRESS_MAX_LINES = 10;
- private static final int GROUP_MAX_LINES = 10;
- private static final int NOTE_MAX_LINES = 100;
-
private Context mContext;
private View mView;
private OnScrollListener mVerticalScrollListener;
@@ -147,7 +139,8 @@
private Listener mListener;
private ContactLoader.Result mContactData;
- private ImageView mStaticPhotoView;
+ private ViewGroup mStaticPhotoContainer;
+ private View mPhotoTouchOverlay;
private ListView mListView;
private ViewAdapter mAdapter;
private Uri mPrimaryPhoneUri = null;
@@ -155,14 +148,14 @@
private Button mQuickFixButton;
private QuickFix mQuickFix;
- private int mNumPhoneNumbers = 0;
private String mDefaultCountryIso;
private boolean mContactHasSocialUpdates;
private boolean mShowStaticPhoto = true;
private final QuickFix[] mPotentialQuickFixes = new QuickFix[] {
new MakeLocalCopyQuickFix(),
- new AddToMyContactsQuickFix() };
+ new AddToMyContactsQuickFix()
+ };
/**
* Device capability: Set during buildEntries and used in the long-press context menu
@@ -280,7 +273,8 @@
mInflater = inflater;
- mStaticPhotoView = (ImageView) mView.findViewById(R.id.photo);
+ mStaticPhotoContainer = (ViewGroup) mView.findViewById(R.id.static_photo_container);
+ mPhotoTouchOverlay = mView.findViewById(R.id.photo_touch_intercept_overlay);
mListView = (ListView) mView.findViewById(android.R.id.list);
mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
@@ -442,16 +436,22 @@
mContactHasSocialUpdates = !mContactData.getStreamItems().isEmpty();
// Setup the photo if applicable
- if (mStaticPhotoView != null) {
- // The presence of a static photo view is not sufficient to determine whether or not
- // we should show the photo. Check the mShowStaticPhoto flag which can be set by an
+ if (mStaticPhotoContainer != null) {
+ // The presence of a static photo container is not sufficient to determine whether or
+ // not we should show the photo. Check the mShowStaticPhoto flag which can be set by an
// outside class depending on screen size, layout, and whether the contact has social
// updates or not.
if (mShowStaticPhoto) {
- mStaticPhotoView.setVisibility(View.VISIBLE);
- ContactDetailDisplayUtils.setPhoto(mContext, mContactData, mStaticPhotoView);
+ mStaticPhotoContainer.setVisibility(View.VISIBLE);
+ ImageView photoView = (ImageView) mStaticPhotoContainer.findViewById(R.id.photo);
+ OnClickListener listener = ContactDetailDisplayUtils.setPhoto(mContext,
+ mContactData, photoView, false);
+ if (mPhotoTouchOverlay != null) {
+ mPhotoTouchOverlay.setVisibility(View.VISIBLE);
+ mPhotoTouchOverlay.setOnClickListener(listener);
+ }
} else {
- mStaticPhotoView.setVisibility(View.GONE);
+ mStaticPhotoContainer.setVisibility(View.GONE);
}
}
@@ -541,7 +541,6 @@
mRawContactIds.clear();
mPrimaryPhoneUri = null;
- mNumPhoneNumbers = 0;
final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
@@ -586,6 +585,7 @@
final DetailViewEntry entry = DetailViewEntry.fromValues(mContext, mimeType, kind,
dataId, entryValues, mContactData.isDirectoryEntry(),
mContactData.getDirectoryId());
+ entry.maxLines = kind.maxLinesForDisplay;
final boolean hasData = !TextUtils.isEmpty(entry.data);
Integer superPrimary = entryValues.getAsInteger(Data.IS_SUPER_PRIMARY);
@@ -595,13 +595,12 @@
// Always ignore the name. It is shown in the header if set
} else if (Phone.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
// Build phone entries
- mNumPhoneNumbers++;
String phoneNumberE164 =
entryValues.getAsString(PhoneLookup.NORMALIZED_NUMBER);
entry.data = PhoneNumberUtils.formatNumber(
entry.data, phoneNumberE164, mDefaultCountryIso);
- final Intent phoneIntent = mHasPhone ? new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts(Constants.SCHEME_TEL, entry.data, null)) : null;
+ final Intent phoneIntent = mHasPhone ?
+ ContactsUtils.getCallIntent(entry.data) : null;
final Intent smsIntent = mHasSms ? new Intent(Intent.ACTION_SENDTO,
Uri.fromParts(Constants.SCHEME_SMSTO, entry.data, null)) : null;
@@ -641,22 +640,22 @@
imKind, dataId, entryValues, mContactData.isDirectoryEntry(),
mContactData.getDirectoryId());
buildImActions(mContext, imEntry, entryValues);
- imEntry.applyStatus(status, false);
+ imEntry.setPresence(status.getPresence());
+ imEntry.maxLines = imKind.maxLinesForDisplay;
mImEntries.add(imEntry);
}
} else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
// Build postal entries
- entry.maxLines = POSTAL_ADDRESS_MAX_LINES;
entry.intent = StructuredPostalUtils.getViewPostalAddressIntent(entry.data);
mPostalEntries.add(entry);
} else if (Im.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
// Build IM entries
buildImActions(mContext, entry, entryValues);
- // Apply presence and status details when available
+ // Apply presence when available
final DataStatus status = mContactData.getStatuses().get(entry.id);
if (status != null) {
- entry.applyStatus(status, false);
+ entry.setPresence(status.getPresence());
}
mImEntries.add(entry);
} else if (Organization.CONTENT_ITEM_TYPE.equals(mimeType)) {
@@ -678,12 +677,10 @@
} else if (Note.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
// Build note entries
entry.uri = null;
- entry.maxLines = NOTE_MAX_LINES;
mNoteEntries.add(entry);
} else if (Website.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
// Build Website entries
entry.uri = null;
- entry.maxLines = WEBSITE_MAX_LINES;
try {
WebAddress webAddress = new WebAddress(entry.data);
entry.intent = new Intent(Intent.ACTION_VIEW,
@@ -695,9 +692,8 @@
} else if (SipAddress.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
// Build SipAddress entries
entry.uri = null;
- entry.maxLines = SIP_ADDRESS_MAX_LINES;
if (mHasSip) {
- entry.intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
+ entry.intent = ContactsUtils.getCallIntent(
Uri.fromParts(Constants.SCHEME_SIP, entry.data, null));
} else {
entry.intent = null;
@@ -759,7 +755,6 @@
entry.mimetype = GroupMembership.MIMETYPE;
entry.kind = mContext.getString(R.string.groupsLabel);
entry.data = sb.toString();
- entry.maxLines = GROUP_MAX_LINES;
mGroupEntries.add(entry);
}
}
@@ -1229,8 +1224,6 @@
public int presence = -1;
public int chatCapability = 0;
- public CharSequence footerLine = null;
-
private boolean mIsInSubSection = false;
DetailViewEntry() {
@@ -1281,21 +1274,8 @@
return entry;
}
- /**
- * Apply given {@link DataStatus} values over this {@link DetailViewEntry}
- *
- * @param fillData When true, the given status replaces {@link #data}
- * and {@link #footerLine}. Otherwise only {@link #presence}
- * is updated.
- */
- public DetailViewEntry applyStatus(DataStatus status, boolean fillData) {
- presence = status.getPresence();
- if (fillData && status.isValid()) {
- this.data = status.getStatus().toString();
- this.footerLine = status.getTimestampLabel(context);
- }
-
- return this;
+ public void setPresence(int presence) {
+ this.presence = presence;
}
public void setIsInSubSection(boolean isInSubSection) {
@@ -1371,20 +1351,42 @@
/**
* Cache of the children views for a view that displays a header view entry.
*/
- private static class HeaderViewCache {
+ private static class HeaderViewCache implements ViewOverlay {
public final TextView displayNameView;
public final TextView companyView;
public final ImageView photoView;
- public final CheckBox starredView;
+ public final View photoOverlayView;
+ public final ImageView starredView;
public final int layoutResourceId;
public HeaderViewCache(View view, int layoutResourceInflated) {
displayNameView = (TextView) view.findViewById(R.id.name);
companyView = (TextView) view.findViewById(R.id.company);
photoView = (ImageView) view.findViewById(R.id.photo);
- starredView = (CheckBox) view.findViewById(R.id.star);
+ photoOverlayView = view.findViewById(R.id.photo_touch_intercept_overlay);
+ starredView = (ImageView) view.findViewById(R.id.star);
layoutResourceId = layoutResourceInflated;
}
+
+ @Override
+ public void setAlphaLayerValue(float alpha) {
+ // Nothing to do.
+ }
+
+ @Override
+ public void enableTouchInterceptor(OnClickListener clickListener) {
+ if (photoOverlayView != null) {
+ photoOverlayView.setVisibility(View.VISIBLE);
+ photoOverlayView.setOnClickListener(clickListener);
+ }
+ }
+
+ @Override
+ public void disableTouchInterceptor() {
+ if (photoOverlayView != null) {
+ photoOverlayView.setVisibility(View.GONE);
+ }
+ }
}
/**
@@ -1407,7 +1409,6 @@
private static class DetailViewCache {
public final TextView type;
public final TextView data;
- public final TextView footer;
public final ImageView presenceIcon;
public final ImageView secondaryActionButton;
public final View actionsViewContainer;
@@ -1421,7 +1422,6 @@
OnClickListener secondaryActionClickListener) {
type = (TextView) view.findViewById(R.id.type);
data = (TextView) view.findViewById(R.id.data);
- footer = (TextView) view.findViewById(R.id.footer);
primaryIndicator = view.findViewById(R.id.primary_indicator);
presenceIcon = (ImageView) view.findViewById(R.id.presence_icon);
@@ -1498,13 +1498,18 @@
// Set the photo if it should be displayed
if (viewCache.photoView != null) {
- ContactDetailDisplayUtils.setPhoto(mContext, mContactData, viewCache.photoView);
+ OnClickListener listener = ContactDetailDisplayUtils.setPhoto(mContext,
+ mContactData, viewCache.photoView,
+ !PhoneCapabilityTester.isUsingTwoPanes(mContext));
+ viewCache.enableTouchInterceptor(listener);
}
// Set the starred state if it should be displayed
- final CheckBox favoritesStar = viewCache.starredView;
+ final ImageView favoritesStar = viewCache.starredView;
if (favoritesStar != null) {
- ContactDetailDisplayUtils.setStarred(mContactData, favoritesStar);
+ ContactDetailDisplayUtils.configureStarredImageView(favoritesStar,
+ mContactData.isDirectoryEntry(), mContactData.isUserProfile(),
+ mContactData.getStarred());
final Uri lookupUri = mContactData.getLookupUri();
favoritesStar.setOnClickListener(new OnClickListener() {
@Override
@@ -1512,8 +1517,22 @@
// Toggle "starred" state
// Make sure there is a contact
if (lookupUri != null) {
+ // Read the current starred value from the UI instead of using the last
+ // loaded state. This allows rapid tapping without writing the same
+ // value several times
+ final Object tag = favoritesStar.getTag();
+ final boolean isStarred = tag == null
+ ? false : (Boolean) favoritesStar.getTag();
+
+ // To improve responsiveness, swap out the picture (and tag) in the UI
+ // already
+ ContactDetailDisplayUtils.configureStarredImageView(favoritesStar,
+ mContactData.isDirectoryEntry(), mContactData.isUserProfile(),
+ !isStarred);
+
+ // Now perform the real save
Intent intent = ContactSaveService.createSetStarredIntent(
- getContext(), lookupUri, favoritesStar.isChecked());
+ getContext(), lookupUri, !isStarred);
getContext().startService(intent);
}
}
@@ -1606,14 +1625,6 @@
views.data.setText(entry.data);
setMaxLines(views.data, entry.maxLines);
- // Set the footer
- if (!TextUtils.isEmpty(entry.footerLine)) {
- views.footer.setText(entry.footerLine);
- views.footer.setVisibility(View.VISIBLE);
- } else {
- views.footer.setVisibility(View.GONE);
- }
-
// Set the default contact method
views.primaryIndicator.setVisibility(entry.isPrimary ? View.VISIBLE : View.GONE);
@@ -1903,9 +1914,7 @@
}
} else if (mPrimaryPhoneUri != null) {
// There isn't anything selected, call the default number
- final Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
- mPrimaryPhoneUri);
- mContext.startActivity(intent);
+ mContext.startActivity(ContactsUtils.getCallIntent(mPrimaryPhoneUri));
return true;
}
return false;
@@ -2007,7 +2016,7 @@
// should update the ui
final Intent intent = ContactSaveService.createSaveContactIntent(getActivity(),
contactDeltaList, "", 0, false, getActivity().getClass(),
- Intent.ACTION_VIEW);
+ Intent.ACTION_VIEW, null);
getActivity().startService(intent);
}
}
@@ -2136,17 +2145,14 @@
private final static class InvitableAccountTypesAdapter extends BaseAdapter {
private final Context mContext;
private final LayoutInflater mInflater;
- private final ContactLoader.Result mContactData;
private final ArrayList<AccountType> mAccountTypes;
public InvitableAccountTypesAdapter(Context context, ContactLoader.Result contactData) {
mContext = context;
mInflater = LayoutInflater.from(context);
- mContactData = contactData;
final List<AccountType> types = contactData.getInvitableAccountTypes();
mAccountTypes = new ArrayList<AccountType>(types.size());
- AccountTypeManager manager = AccountTypeManager.getInstance(context);
for (int i = 0; i < types.size(); i++) {
mAccountTypes.add(types.get(i));
}
diff --git a/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java b/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
index 756b1c7..0c3e6ac 100644
--- a/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
+++ b/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
@@ -23,6 +23,7 @@
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewPropertyAnimator;
import android.view.View.OnTouchListener;
import android.widget.HorizontalScrollView;
@@ -84,7 +85,7 @@
private ViewOverlay mAboutFragment;
private ViewOverlay mUpdatesFragment;
- private View mDetailFragmentView;
+ private View mAboutFragmentView;
private View mUpdatesFragmentView;
public ContactDetailFragmentCarousel(Context context) {
@@ -157,8 +158,8 @@
/**
* Set the view containers for the detail and updates fragment.
*/
- public void setFragmentViews(View detailFragmentView, View updatesFragmentView) {
- mDetailFragmentView = detailFragmentView;
+ public void setFragmentViews(View aboutFragmentView, View updatesFragmentView) {
+ mAboutFragmentView = aboutFragmentView;
mUpdatesFragmentView = updatesFragmentView;
}
@@ -180,7 +181,7 @@
if (mUpdatesFragmentView != null) {
mUpdatesFragmentView.setVisibility(enable ? View.VISIBLE : View.GONE);
if (mCurrentPage == ABOUT_PAGE) {
- mDetailFragmentView.requestFocus();
+ mAboutFragmentView.requestFocus();
} else {
mUpdatesFragmentView.requestFocus();
}
@@ -237,7 +238,7 @@
if (!mEnableSwipe) {
return;
}
- mLastScrollPosition= l;
+ mLastScrollPosition = l;
updateAlphaLayers();
}
@@ -283,4 +284,14 @@
}
return false;
}
+
+ /**
+ * Starts an "appear" animation by moving in the "Updates" from the right.
+ */
+ public void animateAppear() {
+ final int x = Math.round((1.0f - FRAGMENT_WIDTH_SCREEN_WIDTH_FRACTION) * getWidth());
+ mUpdatesFragmentView.setTranslationX(x);
+ final ViewPropertyAnimator animator = mUpdatesFragmentView.animate();
+ animator.translationX(0.0f);
+ }
}
diff --git a/src/com/android/contacts/detail/ContactDetailLayoutController.java b/src/com/android/contacts/detail/ContactDetailLayoutController.java
index 74811e4..cd479ca 100644
--- a/src/com/android/contacts/detail/ContactDetailLayoutController.java
+++ b/src/com/android/contacts/detail/ContactDetailLayoutController.java
@@ -65,6 +65,7 @@
private final LayoutInflater mLayoutInflater;
private final FragmentManager mFragmentManager;
+ private View mViewContainer;
private ContactDetailFragment mDetailFragment;
private ContactDetailUpdatesFragment mUpdatesFragment;
@@ -84,6 +85,7 @@
private Uri mContactUri;
private boolean mTabCarouselIsAnimating;
+
private boolean mContactHasUpdates;
private LayoutMode mLayoutMode;
@@ -104,6 +106,7 @@
mContactDetailFragmentListener = contactDetailFragmentListener;
// Retrieve views in case this is view pager and carousel mode
+ mViewContainer = viewContainer;
mViewPager = (ViewPager) viewContainer.findViewById(R.id.pager);
mTabCarousel = (ContactDetailTabCarousel) viewContainer.findViewById(R.id.tab_carousel);
@@ -228,7 +231,7 @@
// Setup the layout if we already have a saved state
if (savedState != null) {
if (mContactHasUpdates) {
- showContactWithUpdates();
+ showContactWithUpdates(false);
} else {
showContactWithoutUpdates();
}
@@ -236,10 +239,17 @@
}
public void setContactData(ContactLoader.Result data) {
+ final Boolean contactHadUpdates;
+ if (mContactData == null) {
+ contactHadUpdates = null;
+ } else {
+ contactHadUpdates = mContactHasUpdates;
+ }
mContactData = data;
mContactHasUpdates = !data.getStreamItems().isEmpty();
if (mContactHasUpdates) {
- showContactWithUpdates();
+ showContactWithUpdates(
+ contactHadUpdates != null && contactHadUpdates.booleanValue() == false);
} else {
showContactWithoutUpdates();
}
@@ -277,7 +287,7 @@
* Setup the layout for the contact with updates.
* TODO: Clean up this method so it's easier to understand.
*/
- private void showContactWithUpdates() {
+ private void showContactWithUpdates(boolean animateStateChange) {
if (mContactData == null) {
return;
}
@@ -288,6 +298,10 @@
switch (mLayoutMode) {
case TWO_COLUMN: {
+ // This is screen is very hard to animate properly, because there is such a hard
+ // cut from the regular version. A proper animation would have to reflow text and
+ // move things around. No animation for now
+
// Set the contact data (hide the static photo because the photo will already be in
// the header that scrolls with contact details).
mDetailFragment.setShowStaticPhoto(false);
@@ -307,11 +321,18 @@
resetViewPager();
resetTabCarousel();
}
+ if (!isDifferentContact && animateStateChange) {
+ mTabCarousel.animateAppear(mViewContainer.getWidth(),
+ mDetailFragment.getFirstListItemOffset());
+ }
break;
}
case FRAGMENT_CAROUSEL: {
// Allow swiping between all fragments
mFragmentCarousel.enableSwipe(true);
+ if (!isDifferentContact && animateStateChange) {
+ mFragmentCarousel.animateAppear();
+ }
break;
}
default:
diff --git a/src/com/android/contacts/detail/ContactDetailTabCarousel.java b/src/com/android/contacts/detail/ContactDetailTabCarousel.java
index 045e900..6cd48e3 100644
--- a/src/com/android/contacts/detail/ContactDetailTabCarousel.java
+++ b/src/com/android/contacts/detail/ContactDetailTabCarousel.java
@@ -18,13 +18,16 @@
import com.android.contacts.ContactLoader;
import com.android.contacts.R;
+import com.android.contacts.util.PhoneCapabilityTester;
import android.content.Context;
import android.content.res.Resources;
import android.util.AttributeSet;
+import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
+import android.view.ViewPropertyAnimator;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.TextView;
@@ -37,6 +40,9 @@
private static final String TAG = ContactDetailTabCarousel.class.getSimpleName();
+ private static final int TRANSITION_TIME = 200;
+ private static final int TRANSITION_MOVE_IN_TIME = 150;
+
private static final int TAB_INDEX_ABOUT = 0;
private static final int TAB_INDEX_UPDATES = 1;
private static final int TAB_COUNT = 2;
@@ -47,15 +53,22 @@
/** Tab height as defined as a fraction of the screen width */
private float mTabHeightScreenWidthFraction;
+ /** Height in pixels of the shadow under the tab carousel */
+ private int mTabShadowHeight;
+
private ImageView mPhotoView;
private TextView mStatusView;
private ImageView mStatusPhotoView;
+ private OnClickListener mPhotoClickListener;
private Listener mListener;
private int mCurrentTab = TAB_INDEX_ABOUT;
+ private View mTabAndShadowContainer;
+ private View mShadow;
private CarouselTab mAboutTab;
+ private View mTabDivider;
private CarouselTab mUpdatesTab;
/** Last Y coordinate of the carousel when the tab at the given index was selected */
@@ -89,6 +102,8 @@
Resources resources = mContext.getResources();
mTabDisplayLabelHeight = resources.getDimensionPixelSize(
R.dimen.detail_tab_carousel_tab_label_height);
+ mTabShadowHeight = resources.getDimensionPixelSize(
+ R.dimen.detail_contact_photo_shadow_height);
mTabWidthScreenWidthFraction = resources.getFraction(
R.fraction.tab_width_screen_width_percentage, 1, 1);
mTabHeightScreenWidthFraction = resources.getFraction(
@@ -98,19 +113,26 @@
@Override
protected void onFinishInflate() {
super.onFinishInflate();
+ mTabAndShadowContainer = findViewById(R.id.tab_and_shadow_container);
mAboutTab = (CarouselTab) findViewById(R.id.tab_about);
mAboutTab.setLabel(mContext.getString(R.string.contactDetailAbout));
+ mTabDivider = findViewById(R.id.tab_divider);
+
mUpdatesTab = (CarouselTab) findViewById(R.id.tab_update);
mUpdatesTab.setLabel(mContext.getString(R.string.contactDetailUpdates));
mAboutTab.enableTouchInterceptor(mAboutTabTouchInterceptListener);
mUpdatesTab.enableTouchInterceptor(mUpdatesTabTouchInterceptListener);
+ mShadow = findViewById(R.id.shadow);
+
// Retrieve the photo view for the "about" tab
+ // TODO: This should be moved down to mAboutTab, so that it hosts its own controls
mPhotoView = (ImageView) mAboutTab.findViewById(R.id.photo);
// Retrieve the social update views for the "updates" tab
+ // TODO: This should be moved down to mUpdatesTab, so that it hosts its own controls
mStatusView = (TextView) mUpdatesTab.findViewById(R.id.status);
mStatusPhotoView = (ImageView) mUpdatesTab.findViewById(R.id.status_photo);
}
@@ -119,22 +141,31 @@
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int screenWidth = MeasureSpec.getSize(widthMeasureSpec);
// Compute the width of a tab as a fraction of the screen width
- int tabWidth = (int) (mTabWidthScreenWidthFraction * screenWidth);
+ int tabWidth = Math.round(mTabWidthScreenWidthFraction * screenWidth);
// Find the allowed scrolling length by subtracting the current visible screen width
// from the total length of the tabs.
mAllowedHorizontalScrollLength = tabWidth * TAB_COUNT - screenWidth;
- int tabHeight = (int) (screenWidth * mTabHeightScreenWidthFraction);
+ int tabHeight = Math.round(screenWidth * mTabHeightScreenWidthFraction) + mTabShadowHeight;
// Set the child {@link LinearLayout} to be TAB_COUNT * the computed tab width so that the
// {@link LinearLayout}'s children (which are the tabs) will evenly split that width.
if (getChildCount() > 0) {
View child = getChildAt(0);
- child.measure(MeasureSpec.makeMeasureSpec(TAB_COUNT * tabWidth, MeasureSpec.EXACTLY),
+
+ // add 1 dip of seperation between the tabs
+ final int seperatorPixels =
+ (int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1,
+ getResources().getDisplayMetrics()) + 0.5f);
+
+ child.measure(
+ MeasureSpec.makeMeasureSpec(
+ TAB_COUNT * tabWidth +
+ (TAB_COUNT - 1) * seperatorPixels, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(tabHeight, MeasureSpec.EXACTLY));
}
- mAllowedVerticalScrollLength = tabHeight - mTabDisplayLabelHeight;
+ mAllowedVerticalScrollLength = tabHeight - mTabDisplayLabelHeight - mTabShadowHeight;
setMeasuredDimension(
resolveSize(screenWidth, widthMeasureSpec),
resolveSize(tabHeight, heightMeasureSpec));
@@ -153,7 +184,11 @@
private final OnClickListener mAboutTabTouchInterceptListener = new OnClickListener() {
@Override
public void onClick(View v) {
- mListener.onTabSelected(TAB_INDEX_ABOUT);
+ if (mCurrentTab == TAB_INDEX_ABOUT && mPhotoClickListener != null) {
+ mPhotoClickListener.onClick(v);
+ } else {
+ mListener.onTabSelected(TAB_INDEX_ABOUT);
+ }
}
};
@@ -164,6 +199,105 @@
}
};
+ /**
+ * Does in "appear" animation to allow a seamless transition from
+ * the "No updates" mode.
+ * @param width Width of the container. As we haven't been layed out yet, we can't know
+ * @param scrollOffset The offset by how far we scrolled, where 0=not scrolled, -x=scrolled by
+ * x pixels, Integer.MIN_VALUE=scrolled so far that the image is not visible in "no updates"
+ * mode of this screen
+ */
+ public void animateAppear(int width, int scrollOffset) {
+ final float photoHeight = mTabHeightScreenWidthFraction * width;
+ final boolean animateZoomAndFade;
+ int pixelsToScrollVertically = 0;
+
+ // Depending on how far we are scrolled down, there is one of three animations:
+ // - Zoom and fade the picture (if it is still visible)
+ // - Scroll, zoom and fade (if the picture is mostly invisible and we now have a
+ // bigger visible region due to the pinning)
+ // - Just scroll if the picture is completely invisible. This time, no zoom is needed
+ if (scrollOffset == Integer.MIN_VALUE) {
+ // animate in completely by scrolling. no need for zooming here
+ pixelsToScrollVertically = mTabDisplayLabelHeight;
+ animateZoomAndFade = false;
+ } else {
+ final int pixelsOfPhotoLeft = Math.round(photoHeight) + scrollOffset;
+ if (pixelsOfPhotoLeft > mTabDisplayLabelHeight) {
+ // nothing to scroll
+ pixelsToScrollVertically = 0;
+ } else {
+ pixelsToScrollVertically = mTabDisplayLabelHeight - pixelsOfPhotoLeft;
+ }
+ animateZoomAndFade = true;
+ }
+
+ if (pixelsToScrollVertically != 0) {
+ // We can't animate ourselves here, because our own translation is needed for the user's
+ // scrolling. Instead, we use our only child. As we are transparent, that is just as
+ // good
+ mTabAndShadowContainer.setTranslationY(-pixelsToScrollVertically);
+ final ViewPropertyAnimator animator = mTabAndShadowContainer.animate();
+ animator.translationY(0.0f);
+ animator.setDuration(TRANSITION_MOVE_IN_TIME);
+ }
+
+ if (animateZoomAndFade) {
+ // Hack: We have two types of possible layouts:
+ // If the picture is square, it is square in both "with updates" and "without updates"
+ // --> no need for scale animation here
+ // example: 10inch tablet portrait
+ // If the picture is non-square, it is full-width in "without updates" and something
+ // arbitrary in "with updates"
+ // --> do animation with container
+ // example: 4.6inch phone portrait
+ final boolean squarePicture =
+ mTabWidthScreenWidthFraction == mTabHeightScreenWidthFraction;
+ final int firstTransitionTime;
+ if (squarePicture) {
+ firstTransitionTime = 0;
+ } else {
+ // For x, we need to scale our container so we'll animate the whole tab
+ // (unfortunately, we need to have the text invisible during this transition as it
+ // would also be stretched)
+ float revScale = 1.0f/mTabWidthScreenWidthFraction;
+ mAboutTab.setScaleX(revScale);
+ mAboutTab.setPivotX(0.0f);
+ final ViewPropertyAnimator aboutAnimator = mAboutTab.animate();
+ aboutAnimator.setDuration(TRANSITION_TIME);
+ aboutAnimator.scaleX(1.0f);
+
+ // For y, we need to scale only the picture itself because we want it to be cropped
+ mPhotoView.setScaleY(revScale);
+ mPhotoView.setPivotY(photoHeight * 0.5f);
+ final ViewPropertyAnimator photoAnimator = mPhotoView.animate();
+ photoAnimator.setDuration(TRANSITION_TIME);
+ photoAnimator.scaleY(1.0f);
+ firstTransitionTime = TRANSITION_TIME;
+ }
+
+ // Animate in the labels after the above transition is finished
+ mAboutTab.fadeInLabelViewAnimator(firstTransitionTime, true);
+ mUpdatesTab.fadeInLabelViewAnimator(firstTransitionTime, false);
+
+ final float pixelsToTranslate = (1.0f - mTabWidthScreenWidthFraction) * width;
+ // Views to translate
+ for (View view : new View[] { mUpdatesTab, mTabDivider }) {
+ view.setTranslationX(pixelsToTranslate);
+ final ViewPropertyAnimator translateAnimator = view.animate();
+ translateAnimator.translationX(0.0f);
+ translateAnimator.setDuration(TRANSITION_TIME);
+ }
+
+ // Another hack: If the picture is square, there is no shadow in "Without updates"
+ // --> fade it in after the translations are done
+ if (squarePicture) {
+ mShadow.setAlpha(0.0f);
+ mShadow.animate().setStartDelay(TRANSITION_TIME).alpha(1.0f);
+ }
+ }
+ }
+
private void updateAlphaLayers() {
mAboutTab.setAlphaLayerValue(mLastScrollPosition * MAX_ALPHA /
mAllowedHorizontalScrollLength);
@@ -256,9 +390,11 @@
case TAB_INDEX_ABOUT:
mAboutTab.showSelectedState();
mUpdatesTab.showDeselectedState();
+ mUpdatesTab.enableTouchInterceptor(mUpdatesTabTouchInterceptListener);
break;
case TAB_INDEX_UPDATES:
mUpdatesTab.showSelectedState();
+ mUpdatesTab.disableTouchInterceptor();
mAboutTab.showDeselectedState();
break;
default:
@@ -278,7 +414,8 @@
// TODO: Move this into the {@link CarouselTab} class when the updates fragment code is more
// finalized
- ContactDetailDisplayUtils.setPhoto(mContext, contactData, mPhotoView);
+ mPhotoClickListener = ContactDetailDisplayUtils.setPhoto(mContext, contactData, mPhotoView,
+ !PhoneCapabilityTester.isUsingTwoPanes(mContext));
ContactDetailDisplayUtils.setSocialSnippet(mContext, contactData, mStatusView,
mStatusPhotoView);
}
diff --git a/src/com/android/contacts/detail/ContactDetailViewPagerAdapter.java b/src/com/android/contacts/detail/ContactDetailViewPagerAdapter.java
index edcfc39..c708dc8 100644
--- a/src/com/android/contacts/detail/ContactDetailViewPagerAdapter.java
+++ b/src/com/android/contacts/detail/ContactDetailViewPagerAdapter.java
@@ -19,6 +19,7 @@
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
+import android.view.ViewGroup;
/**
* Adapter for the {@link ViewPager} for the contact detail page for a contact in 2 cases:
@@ -88,11 +89,11 @@
}
@Override
- public void startUpdate(View container) {
+ public void startUpdate(ViewGroup container) {
}
@Override
- public Object instantiateItem(View container, int position) {
+ public Object instantiateItem(ViewGroup container, int position) {
switch (position) {
case INDEX_ABOUT_FRAGMENT:
mAboutFragmentView.setVisibility(View.VISIBLE);
@@ -105,12 +106,12 @@
}
@Override
- public void destroyItem(View container, int position, Object object) {
+ public void destroyItem(ViewGroup container, int position, Object object) {
((View) object).setVisibility(View.GONE);
}
@Override
- public void finishUpdate(View container) {
+ public void finishUpdate(ViewGroup container) {
}
@Override
diff --git a/src/com/android/contacts/detail/ContactLoaderFragment.java b/src/com/android/contacts/detail/ContactLoaderFragment.java
index 008aff8..ddccfe6 100644
--- a/src/com/android/contacts/detail/ContactLoaderFragment.java
+++ b/src/com/android/contacts/detail/ContactLoaderFragment.java
@@ -407,4 +407,18 @@
mContext, mLookupUri, mCustomRingtone);
mContext.startService(intent);
}
+
+ /** Toggles whether to load stream items. Just for debugging */
+ public void toggleLoadStreamItems() {
+ Loader<ContactLoader.Result> loaderObj = getLoaderManager().getLoader(LOADER_DETAILS);
+ ContactLoader loader = (ContactLoader) loaderObj;
+ loader.setLoadStreamItems(!loader.getLoadStreamItems());
+ }
+
+ /** Returns whether to load stream items. Just for debugging */
+ public boolean getLoadStreamItems() {
+ Loader<ContactLoader.Result> loaderObj = getLoaderManager().getLoader(LOADER_DETAILS);
+ ContactLoader loader = (ContactLoader) loaderObj;
+ return loader != null && loader.getLoadStreamItems();
+ }
}
diff --git a/src/com/android/contacts/detail/PhotoSelectionHandler.java b/src/com/android/contacts/detail/PhotoSelectionHandler.java
new file mode 100644
index 0000000..1423c65
--- /dev/null
+++ b/src/com/android/contacts/detail/PhotoSelectionHandler.java
@@ -0,0 +1,373 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.detail;
+
+import com.android.contacts.R;
+import com.android.contacts.editor.PhotoActionPopup;
+import com.android.contacts.model.AccountType;
+import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.EntityDelta;
+import com.android.contacts.model.EntityDelta.ValuesDelta;
+import com.android.contacts.model.EntityDeltaList;
+import com.android.contacts.model.EntityModifier;
+
+import android.app.Activity;
+import android.content.ActivityNotFoundException;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.media.MediaScannerConnection;
+import android.net.Uri;
+import android.os.Environment;
+import android.provider.ContactsContract.CommonDataKinds.Photo;
+import android.provider.ContactsContract.DisplayPhoto;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.MediaStore;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ListPopupWindow;
+import android.widget.PopupWindow.OnDismissListener;
+import android.widget.Toast;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Handles displaying a photo selection popup for a given photo view and dealing with the results
+ * that come back.
+ */
+public class PhotoSelectionHandler implements OnClickListener {
+
+ private static final String TAG = PhotoSelectionHandler.class.getSimpleName();
+
+ private static final File PHOTO_DIR = new File(
+ Environment.getExternalStorageDirectory() + "/DCIM/Camera");
+
+ private static final String PHOTO_DATE_FORMAT = "'IMG'_yyyyMMdd_HHmmss";
+
+ private static final int REQUEST_CODE_CAMERA_WITH_DATA = 1001;
+ private static final int REQUEST_CODE_PHOTO_PICKED_WITH_DATA = 1002;
+
+ private final Context mContext;
+ private final View mPhotoView;
+ private final int mPhotoMode;
+ private final int mPhotoPickSize;
+ private final EntityDeltaList mState;
+ private final boolean mIsDirectoryContact;
+ private ListPopupWindow mPopup;
+ private AccountType mWritableAccount;
+ private PhotoActionListener mListener;
+
+ public PhotoSelectionHandler(Context context, View photoView, int photoMode,
+ boolean isDirectoryContact, EntityDeltaList state) {
+ mContext = context;
+ mPhotoView = photoView;
+ mPhotoMode = photoMode;
+ mIsDirectoryContact = isDirectoryContact;
+ mState = state;
+ mPhotoPickSize = getPhotoPickSize();
+ }
+
+ public void destroy() {
+ if (mPopup != null) {
+ mPopup.dismiss();
+ }
+ }
+
+ public PhotoActionListener getListener() {
+ return mListener;
+ }
+
+ public void setListener(PhotoActionListener listener) {
+ mListener = listener;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (mListener != null) {
+ if (getWritableEntityIndex() != -1) {
+ mPopup = PhotoActionPopup.createPopupMenu(
+ mContext, mPhotoView, mListener, mPhotoMode);
+ mPopup.setOnDismissListener(new OnDismissListener() {
+ @Override
+ public void onDismiss() {
+ mListener.onPhotoSelectionDismissed();
+ }
+ });
+ mPopup.show();
+ }
+ }
+ }
+
+ /**
+ * Attempts to handle the given activity result. Returns whether this handler was able to
+ * process the result successfully.
+ * @param requestCode The request code.
+ * @param resultCode The result code.
+ * @param data The intent that was returned.
+ * @return Whether the handler was able to process the result.
+ */
+ public boolean handlePhotoActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode == Activity.RESULT_OK) {
+ switch (requestCode) {
+ case REQUEST_CODE_PHOTO_PICKED_WITH_DATA: {
+ Bitmap bitmap = BitmapFactory.decodeFile(
+ mListener.getCurrentPhotoFile().getAbsolutePath());
+ mListener.onPhotoSelected(bitmap);
+ return true;
+ }
+ case REQUEST_CODE_CAMERA_WITH_DATA: {
+ doCropPhoto(mListener.getCurrentPhotoFile());
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Return the index of the first entity in the contact data that belongs to a contact-writable
+ * account, or -1 if no such entity exists.
+ */
+ private int getWritableEntityIndex() {
+ // Directory entries are non-writable.
+ if (mIsDirectoryContact) {
+ return -1;
+ }
+
+ // Find the first writable entity.
+ int entityIndex = 0;
+ for (EntityDelta delta : mState) {
+ ContentValues entityValues = delta.getValues().getCompleteValues();
+ String type = entityValues.getAsString(RawContacts.ACCOUNT_TYPE);
+ String dataSet = entityValues.getAsString(RawContacts.DATA_SET);
+ AccountType accountType = AccountTypeManager.getInstance(mContext).getAccountType(
+ type, dataSet);
+ if (accountType.areContactsWritable()) {
+ mWritableAccount = accountType;
+ return entityIndex;
+ }
+ entityIndex++;
+ }
+ return -1;
+ }
+
+ /**
+ * Return the raw-contact id of the first entity in the contact data that belongs to a
+ * contact-writable account, or -1 if no such entity exists.
+ */
+ protected long getWritableEntityId() {
+ int index = getWritableEntityIndex();
+ if (index == -1) return -1;
+ return mState.get(index).getValues().getId();
+ }
+
+ /**
+ * Utility method to retrieve the entity delta for attaching the given bitmap to the contact.
+ * This will attach the photo to the first contact-writable account that provided data to the
+ * contact. It is the caller's responsibility to apply the delta.
+ * @param bitmap The photo to use.
+ * @return An entity delta list that can be applied to associate the bitmap with the contact,
+ * or null if the photo could not be parsed or none of the accounts associated with the
+ * contact are writable.
+ */
+ public EntityDeltaList getDeltaForAttachingPhotoToContact() {
+ // Find the first writable entity.
+ int writableEntityIndex = getWritableEntityIndex();
+ if (writableEntityIndex != -1) {
+ // Note - guaranteed to have contact data if we have a writable entity index.
+ EntityDelta delta = mState.get(writableEntityIndex);
+ ValuesDelta child = EntityModifier.ensureKindExists(
+ delta, mWritableAccount, Photo.CONTENT_ITEM_TYPE);
+ child.setFromTemplate(false);
+ child.put(Photo.IS_SUPER_PRIMARY, 1);
+
+ return mState;
+ }
+ return null;
+ }
+
+ /**
+ * Sends a newly acquired photo to Gallery for cropping
+ */
+ private void doCropPhoto(File f) {
+ try {
+ // Add the image to the media store
+ MediaScannerConnection.scanFile(
+ mContext,
+ new String[] { f.getAbsolutePath() },
+ new String[] { null },
+ null);
+
+ // Launch gallery to crop the photo
+ final Intent intent = getCropImageIntent(f);
+ mListener.startPickFromGalleryActivity(intent, REQUEST_CODE_PHOTO_PICKED_WITH_DATA, f);
+ } catch (Exception e) {
+ Log.e(TAG, "Cannot crop image", e);
+ Toast.makeText(mContext, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show();
+ }
+ }
+
+ private String getPhotoFileName() {
+ Date date = new Date(System.currentTimeMillis());
+ SimpleDateFormat dateFormat = new SimpleDateFormat(PHOTO_DATE_FORMAT);
+ return dateFormat.format(date) + ".jpg";
+ }
+
+ private File getPhotoFile() {
+ PHOTO_DIR.mkdirs();
+ return new File(PHOTO_DIR, getPhotoFileName());
+ }
+
+ private int getPhotoPickSize() {
+ // Note that this URI is safe to call on the UI thread.
+ Cursor c = mContext.getContentResolver().query(DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI,
+ new String[]{DisplayPhoto.DISPLAY_MAX_DIM}, null, null, null);
+ try {
+ c.moveToFirst();
+ return c.getInt(0);
+ } finally {
+ c.close();
+ }
+ }
+
+ /**
+ * Constructs an intent for picking a photo from Gallery, cropping it and returning the bitmap.
+ */
+ private Intent getPhotoPickIntent(File photoFile) {
+ Uri photoUri = Uri.fromFile(photoFile);
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
+ intent.setType("image/*");
+ intent.putExtra("crop", "true");
+ intent.putExtra("aspectX", 1);
+ intent.putExtra("aspectY", 1);
+ intent.putExtra("outputX", mPhotoPickSize);
+ intent.putExtra("outputY", mPhotoPickSize);
+ intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
+ return intent;
+ }
+
+ /**
+ * Constructs an intent for image cropping.
+ */
+ private Intent getCropImageIntent(File photoFile) {
+ Uri photoUri = Uri.fromFile(photoFile);
+ Intent intent = new Intent("com.android.camera.action.CROP");
+ intent.setDataAndType(photoUri, "image/*");
+ intent.putExtra("crop", "true");
+ intent.putExtra("aspectX", 1);
+ intent.putExtra("aspectY", 1);
+ intent.putExtra("outputX", mPhotoPickSize);
+ intent.putExtra("outputY", mPhotoPickSize);
+ intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
+ return intent;
+ }
+
+ /**
+ * Constructs an intent for capturing a photo and storing it in a temporary file.
+ */
+ public static Intent getTakePhotoIntent(File f) {
+ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);
+ intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
+ return intent;
+ }
+
+ public abstract class PhotoActionListener implements PhotoActionPopup.Listener {
+ @Override
+ public void onUseAsPrimaryChosen() {
+ // No default implementation.
+ }
+
+ @Override
+ public void onRemovePictureChosen() {
+ // No default implementation.
+ }
+
+ @Override
+ public void onTakePhotoChosen() {
+ try {
+ // Launch camera to take photo for selected contact
+ File f = getPhotoFile();
+ final Intent intent = getTakePhotoIntent(f);
+ startTakePhotoActivity(intent, REQUEST_CODE_CAMERA_WITH_DATA, f);
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(mContext, R.string.photoPickerNotFoundText,
+ Toast.LENGTH_LONG).show();
+ }
+ }
+
+ @Override
+ public void onPickFromGalleryChosen() {
+ try {
+ // Launch picker to choose photo for selected contact
+ File f = getPhotoFile();
+ final Intent intent = getPhotoPickIntent(f);
+ startPickFromGalleryActivity(intent, REQUEST_CODE_PHOTO_PICKED_WITH_DATA, f);
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(mContext, R.string.photoPickerNotFoundText,
+ Toast.LENGTH_LONG).show();
+ }
+ }
+
+ /**
+ * Should initiate an activity to take a photo using the camera.
+ * @param intent The image capture intent.
+ * @param requestCode The request code to use, suitable for handling by
+ * {@link PhotoSelectionHandler#handlePhotoActivityResult(int, int, Intent)}.
+ * @param photoFile The file path that will be used to store the photo. This is generally
+ * what should be returned by
+ * {@link PhotoSelectionHandler.PhotoActionListener#getCurrentPhotoFile()}.
+ */
+ public abstract void startTakePhotoActivity(Intent intent, int requestCode, File photoFile);
+
+ /**
+ * Should initiate an activity pick a photo from the gallery.
+ * @param intent The image capture intent.
+ * @param requestCode The request code to use, suitable for handling by
+ * @param photoFile The temporary file that the cropped image is written to before being
+ * stored by the content-provider.
+ * {@link PhotoSelectionHandler#handlePhotoActivityResult(int, int, Intent)}.
+ */
+ public abstract void startPickFromGalleryActivity(Intent intent, int requestCode,
+ File photoFile);
+
+ /**
+ * Called when the user has completed selection of a photo.
+ * @param bitmap The selected and cropped photo.
+ */
+ public abstract void onPhotoSelected(Bitmap bitmap);
+
+ /**
+ * Gets the current photo file that is being interacted with. It is the activity or
+ * fragment's responsibility to maintain this in saved state, since this handler instance
+ * will not survive rotation.
+ */
+ public abstract File getCurrentPhotoFile();
+
+ /**
+ * Called when the photo selection dialog is dismissed.
+ */
+ public abstract void onPhotoSelectionDismissed();
+ }
+}
diff --git a/src/com/android/contacts/detail/TransformableImageView.java b/src/com/android/contacts/detail/TransformableImageView.java
new file mode 100644
index 0000000..6edc42b
--- /dev/null
+++ b/src/com/android/contacts/detail/TransformableImageView.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts.detail;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+
+/**
+ * Extension to ImageView that handles cropping during resize animations.
+ */
+public class TransformableImageView extends ImageView {
+
+ public TransformableImageView(Context context) {
+ super(context);
+ }
+
+ public TransformableImageView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public TransformableImageView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ int saveCount = canvas.getSaveCount();
+ canvas.save();
+ canvas.translate(mPaddingLeft, mPaddingTop);
+ Matrix drawMatrix = new Matrix();
+ int dwidth = getDrawable().getIntrinsicWidth();
+ int dheight = getDrawable().getIntrinsicHeight();
+
+ int vwidth = getWidth() - mPaddingLeft - mPaddingRight;
+ int vheight = getHeight() - mPaddingTop - mPaddingBottom;
+ float scale;
+ float dx = 0, dy = 0;
+
+ if (dwidth * vheight > vwidth * dheight) {
+ scale = (float) vheight / (float) dheight;
+ dx = (vwidth - dwidth * scale) * 0.5f;
+ } else {
+ scale = (float) vwidth / (float) dwidth;
+ dy = (vheight - dheight * scale) * 0.5f;
+ }
+
+ drawMatrix.setScale(scale, scale);
+ drawMatrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
+ canvas.concat(drawMatrix);
+ getDrawable().draw(canvas);
+ canvas.restoreToCount(saveCount);
+ }
+}
diff --git a/src/com/android/contacts/dialpad/DialpadFragment.java b/src/com/android/contacts/dialpad/DialpadFragment.java
index cdba30b..02aa2dc 100644
--- a/src/com/android/contacts/dialpad/DialpadFragment.java
+++ b/src/com/android/contacts/dialpad/DialpadFragment.java
@@ -16,6 +16,7 @@
package com.android.contacts.dialpad;
+
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -44,9 +45,11 @@
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.text.Editable;
+import android.text.SpannableString;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.method.DialerKeyListener;
+import android.text.style.RelativeSizeSpan;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
@@ -54,6 +57,7 @@
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
@@ -69,7 +73,7 @@
import com.android.contacts.R;
import com.android.contacts.SpecialCharSequenceMgr;
import com.android.contacts.activities.DialtactsActivity;
-import com.android.contacts.activities.DialtactsActivity.ViewPagerVisibilityListener;
+import com.android.contacts.util.Constants;
import com.android.contacts.util.PhoneNumberFormatter;
import com.android.internal.telephony.ITelephony;
import com.android.phone.CallLogAsync;
@@ -83,7 +87,7 @@
View.OnLongClickListener, View.OnKeyListener,
AdapterView.OnItemClickListener, TextWatcher,
PopupMenu.OnMenuItemClickListener,
- ViewPagerVisibilityListener {
+ View.OnTouchListener {
private static final String TAG = DialpadFragment.class.getSimpleName();
private static final boolean DEBUG = false;
@@ -110,11 +114,15 @@
private View mDigitsContainer;
private EditText mDigits;
+ /** Remembers if we need to clear digits field when the screen is completely gone. */
+ private boolean mClearDigitsOnStop;
+
private View mDelete;
private ToneGenerator mToneGenerator;
- private Object mToneGeneratorLock = new Object();
+ private final Object mToneGeneratorLock = new Object();
private View mDialpad;
+ private boolean mShowOptionsMenu;
private View mSearchButton;
private View mMenuButton;
private Listener mListener;
@@ -129,23 +137,21 @@
*/
private String mProhibitedPhoneNumberRegexp;
- private boolean mShowOptionsMenu;
-
// Last number dialed, retrieved asynchronously from the call DB
// in onCreate. This number is displayed when the user hits the
// send key and cleared in onPause.
- CallLogAsync mCallLog = new CallLogAsync();
+ private final CallLogAsync mCallLog = new CallLogAsync();
private String mLastNumberDialed = EMPTY_NUMBER;
// determines if we want to playback local DTMF tones.
private boolean mDTMFToneEnabled;
// Vibration (haptic feedback) for dialer key presses.
- private HapticFeedback mHaptic = new HapticFeedback();
+ private final HapticFeedback mHaptic = new HapticFeedback();
/** Identifier for the "Add Call" intent extra. */
- static final String ADD_CALL_MODE_KEY = "add_call_mode";
+ private static final String ADD_CALL_MODE_KEY = "add_call_mode";
/**
* Identifier for intent extra for sending an empty Flash message for
@@ -157,7 +163,7 @@
* TODO: Keep in sync with the string defined in OutgoingCallBroadcaster.java
* in Phone app until this is replaced with the ITelephony API.
*/
- static final String EXTRA_SEND_EMPTY_FLASH
+ private static final String EXTRA_SEND_EMPTY_FLASH
= "com.android.phone.extra.SEND_EMPTY_FLASH";
private String mCurrentCountryIso;
@@ -187,10 +193,12 @@
private boolean mWasEmptyBeforeTextChange;
+ @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
mWasEmptyBeforeTextChange = TextUtils.isEmpty(s);
}
+ @Override
public void onTextChanged(CharSequence input, int start, int before, int changeCount) {
if (mWasEmptyBeforeTextChange != TextUtils.isEmpty(input)) {
final Activity activity = getActivity();
@@ -203,6 +211,7 @@
// the DTMF dialer handles that functionality now.
}
+ @Override
public void afterTextChanged(Editable input) {
if (SpecialCharSequenceMgr.handleChars(getActivity(), input.toString(), mDigits)) {
// A special sequence was entered, clear the digits
@@ -332,7 +341,7 @@
if (Intent.ACTION_DIAL.equals(action) || Intent.ACTION_VIEW.equals(action)) {
Uri uri = intent.getData();
if (uri != null) {
- if ("tel".equals(uri.getScheme())) {
+ if (Constants.SCHEME_TEL.equals(uri.getScheme())) {
// Put the requested number into the input area
String data = uri.getSchemeSpecificPart();
setFormattedDigits(data, null);
@@ -456,26 +465,30 @@
}
private void setupKeypad(View fragmentView) {
- // Setup the listeners for the buttons
- View view = fragmentView.findViewById(R.id.one);
- view.setOnClickListener(this);
- view.setOnLongClickListener(this);
+ // For numeric buttons, we rely on onTouchListener instead of onClickListener
+ // for faster event handling, while some other buttons since basically
+ // onTouch event conflicts with horizontal swipes.
+ fragmentView.findViewById(R.id.one).setOnTouchListener(this);
+ fragmentView.findViewById(R.id.two).setOnTouchListener(this);
+ fragmentView.findViewById(R.id.three).setOnTouchListener(this);
+ fragmentView.findViewById(R.id.four).setOnTouchListener(this);
+ fragmentView.findViewById(R.id.five).setOnTouchListener(this);
+ fragmentView.findViewById(R.id.six).setOnTouchListener(this);
+ fragmentView.findViewById(R.id.seven).setOnTouchListener(this);
+ fragmentView.findViewById(R.id.eight).setOnTouchListener(this);
+ fragmentView.findViewById(R.id.nine).setOnTouchListener(this);
+ fragmentView.findViewById(R.id.zero).setOnTouchListener(this);
- fragmentView.findViewById(R.id.two).setOnClickListener(this);
- fragmentView.findViewById(R.id.three).setOnClickListener(this);
- fragmentView.findViewById(R.id.four).setOnClickListener(this);
- fragmentView.findViewById(R.id.five).setOnClickListener(this);
- fragmentView.findViewById(R.id.six).setOnClickListener(this);
- fragmentView.findViewById(R.id.seven).setOnClickListener(this);
- fragmentView.findViewById(R.id.eight).setOnClickListener(this);
- fragmentView.findViewById(R.id.nine).setOnClickListener(this);
+ // Buttons other than numeric ones should use onClick as usual.
fragmentView.findViewById(R.id.star).setOnClickListener(this);
-
- view = fragmentView.findViewById(R.id.zero);
- view.setOnClickListener(this);
- view.setOnLongClickListener(this);
-
fragmentView.findViewById(R.id.pound).setOnClickListener(this);
+
+ // Long-pressing one button will initiate Voicemail.
+ fragmentView.findViewById(R.id.one).setOnLongClickListener(this);
+
+ // Long-pressing zero button will enter '+' instead.
+ fragmentView.findViewById(R.id.zero).setOnLongClickListener(this);
+
}
@Override
@@ -534,7 +547,10 @@
// 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);
+ final SpannableString hint = new SpannableString(
+ getActivity().getString(R.string.dialerDialpadHintText));
+ hint.setSpan(new RelativeSizeSpan(0.8f), 0, hint.length(), 0);
+ mDigits.setHint(hint);
} else {
// Common case; no hint necessary.
mDigits.setHint(null);
@@ -568,9 +584,18 @@
}
@Override
+ public void onStop() {
+ super.onStop();
+ if (mClearDigitsOnStop) {
+ mClearDigitsOnStop = false;
+ mDigits.getText().clear();
+ }
+ }
+
+ @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
- if (mShowOptionsMenu && ViewConfiguration.get(getActivity()).hasPermanentMenuKey() &&
+ if (ViewConfiguration.get(getActivity()).hasPermanentMenuKey() &&
isLayoutReady() && mDialpadChooser != null) {
inflater.inflate(R.menu.dialpad_options, menu);
}
@@ -579,7 +604,7 @@
@Override
public void onPrepareOptionsMenu(Menu menu) {
// Hardware menu key should be available and Views should already be ready.
- if (mShowOptionsMenu && ViewConfiguration.get(getActivity()).hasPermanentMenuKey() &&
+ if (ViewConfiguration.get(getActivity()).hasPermanentMenuKey() &&
isLayoutReady() && mDialpadChooser != null) {
setupMenuItems(menu);
}
@@ -676,6 +701,7 @@
}
}
+ @Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
switch (view.getId()) {
case R.id.digits:
@@ -688,59 +714,120 @@
return false;
}
+ /**
+ * We handle the key based on the DOWN event, but we wait till the UP event to play the local
+ * DTMF tone (to avoid playing a spurious tone if the user is actually doing a swipe...)
+ */
+ @Override
+ public boolean onTouch(View view, MotionEvent event) {
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ switch (view.getId()) {
+ case R.id.one: {
+ keyPressed(KeyEvent.KEYCODE_1);
+ break;
+ }
+ case R.id.two: {
+ keyPressed(KeyEvent.KEYCODE_2);
+ break;
+ }
+ case R.id.three: {
+ keyPressed(KeyEvent.KEYCODE_3);
+ break;
+ }
+ case R.id.four: {
+ keyPressed(KeyEvent.KEYCODE_4);
+ break;
+ }
+ case R.id.five: {
+ keyPressed(KeyEvent.KEYCODE_5);
+ break;
+ }
+ case R.id.six: {
+ keyPressed(KeyEvent.KEYCODE_6);
+ break;
+ }
+ case R.id.seven: {
+ keyPressed(KeyEvent.KEYCODE_7);
+ break;
+ }
+ case R.id.eight: {
+ keyPressed(KeyEvent.KEYCODE_8);
+ break;
+ }
+ case R.id.nine: {
+ keyPressed(KeyEvent.KEYCODE_9);
+ break;
+ }
+ case R.id.zero: {
+ keyPressed(KeyEvent.KEYCODE_0);
+ break;
+ }
+ default: {
+ Log.wtf(TAG, "Unexpected onTouch(ACTION_DOWN) event from: " + view);
+ break;
+ }
+ }
+ } else if (event.getAction() == MotionEvent.ACTION_UP) {
+ switch (view.getId()) {
+ case R.id.one: {
+ playTone(ToneGenerator.TONE_DTMF_1);
+ break;
+ }
+ case R.id.two: {
+ playTone(ToneGenerator.TONE_DTMF_2);
+ break;
+ }
+ case R.id.three: {
+ playTone(ToneGenerator.TONE_DTMF_3);
+ break;
+ }
+ case R.id.four: {
+ playTone(ToneGenerator.TONE_DTMF_4);
+ break;
+ }
+ case R.id.five: {
+ playTone(ToneGenerator.TONE_DTMF_5);
+ break;
+ }
+ case R.id.six: {
+ playTone(ToneGenerator.TONE_DTMF_6);
+ break;
+ }
+ case R.id.seven: {
+ playTone(ToneGenerator.TONE_DTMF_7);
+ break;
+ }
+ case R.id.eight: {
+ playTone(ToneGenerator.TONE_DTMF_8);
+ break;
+ }
+ case R.id.nine: {
+ playTone(ToneGenerator.TONE_DTMF_9);
+ break;
+ }
+ case R.id.zero: {
+ playTone(ToneGenerator.TONE_DTMF_0);
+ break;
+ }
+ default: {
+ Log.wtf(TAG, "Unexpected onTouch(ACTION_UP) event from: " + view);
+ break;
+ }
+ }
+ } else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
+ // This event will be thrown when a user starts dragging the dialpad screen,
+ // intending horizontal swipe. The system will see the event after ACTION_DOWN while
+ // it won't see relevant ACTION_UP event anymore.
+ //
+ // Here, remove the last digit already entered in the last ACTION_DOWN event.
+ removeLastOneDigitIfPossible();
+ }
+ return false;
+ }
+
@Override
public void onClick(View view) {
switch (view.getId()) {
- case R.id.one: {
- playTone(ToneGenerator.TONE_DTMF_1);
- keyPressed(KeyEvent.KEYCODE_1);
- return;
- }
- case R.id.two: {
- playTone(ToneGenerator.TONE_DTMF_2);
- keyPressed(KeyEvent.KEYCODE_2);
- return;
- }
- case R.id.three: {
- playTone(ToneGenerator.TONE_DTMF_3);
- keyPressed(KeyEvent.KEYCODE_3);
- return;
- }
- case R.id.four: {
- playTone(ToneGenerator.TONE_DTMF_4);
- keyPressed(KeyEvent.KEYCODE_4);
- return;
- }
- case R.id.five: {
- playTone(ToneGenerator.TONE_DTMF_5);
- keyPressed(KeyEvent.KEYCODE_5);
- return;
- }
- case R.id.six: {
- playTone(ToneGenerator.TONE_DTMF_6);
- keyPressed(KeyEvent.KEYCODE_6);
- return;
- }
- case R.id.seven: {
- playTone(ToneGenerator.TONE_DTMF_7);
- keyPressed(KeyEvent.KEYCODE_7);
- return;
- }
- case R.id.eight: {
- playTone(ToneGenerator.TONE_DTMF_8);
- keyPressed(KeyEvent.KEYCODE_8);
- return;
- }
- case R.id.nine: {
- playTone(ToneGenerator.TONE_DTMF_9);
- keyPressed(KeyEvent.KEYCODE_9);
- return;
- }
- case R.id.zero: {
- playTone(ToneGenerator.TONE_DTMF_0);
- keyPressed(KeyEvent.KEYCODE_0);
- return;
- }
case R.id.pound: {
playTone(ToneGenerator.TONE_DTMF_P);
keyPressed(KeyEvent.KEYCODE_POUND);
@@ -778,6 +865,11 @@
if (popup != null) {
popup.show();
}
+ return;
+ }
+ default: {
+ Log.wtf(TAG, "Unexpected onClick() event from: " + view);
+ return;
}
}
}
@@ -795,9 +887,10 @@
return popupMenu;
}
+ @Override
public boolean onLongClick(View view) {
final Editable digits = mDigits.getText();
- int id = view.getId();
+ final int id = view.getId();
switch (id) {
case R.id.deleteButton: {
digits.clear();
@@ -808,20 +901,38 @@
return true;
}
case R.id.one: {
- if (isDigitsEmpty()) {
+ // '1' may be already entered since we rely on onTouch() event for numeric buttons.
+ // Just for safety we also check if the digits field is empty or not.
+ if (isDigitsEmpty() || TextUtils.equals(mDigits.getText(), "1")) {
+ // We'll try to initiate voicemail and thus we want to remove irrelevant string.
+ removeLastOneDigitIfPossible();
+
if (isVoicemailAvailable()) {
callVoicemail();
} else if (getActivity() != null) {
- DialogFragment dialogFragment = ErrorDialogFragment.newInstance(
- R.string.dialog_voicemail_not_ready_title,
- R.string.dialog_voicemail_not_ready_message);
- dialogFragment.show(getFragmentManager(), "voicemail_not_ready");
+ // Voicemail is unavailable maybe because Airplane mode is turned on.
+ // Check the current status and show the most appropriate error message.
+ final boolean isAirplaneModeOn =
+ Settings.System.getInt(getActivity().getContentResolver(),
+ Settings.System.AIRPLANE_MODE_ON, 0) != 0;
+ if (isAirplaneModeOn) {
+ DialogFragment dialogFragment = ErrorDialogFragment.newInstance(
+ R.string.dialog_voicemail_airplane_mode_message);
+ dialogFragment.show(getFragmentManager(),
+ "voicemail_request_during_airplane_mode");
+ } else {
+ DialogFragment dialogFragment = ErrorDialogFragment.newInstance(
+ R.string.dialog_voicemail_not_ready_message);
+ dialogFragment.show(getFragmentManager(), "voicemail_not_ready");
+ }
}
return true;
}
return false;
}
case R.id.zero: {
+ // Remove tentative input ('0') done by onTouch().
+ removeLastOneDigitIfPossible();
keyPressed(KeyEvent.KEYCODE_PLUS);
return true;
}
@@ -836,35 +947,36 @@
return false;
}
+ private void removeLastOneDigitIfPossible() {
+ final Editable editable = mDigits.getText();
+ final int length = editable.length();
+ if (length > 0) {
+ mDigits.getText().delete(length - 1, length);
+ }
+ }
+
public void callVoicemail() {
- startActivity(newVoicemailIntent());
- mDigits.getText().clear(); // TODO: Fix bug 1745781
+ startActivity(ContactsUtils.getVoicemailIntent());
+ mClearDigitsOnStop = true;
getActivity().finish();
}
public static class ErrorDialogFragment extends DialogFragment {
private int mTitleResId;
- private Integer mMessageResId; // can be null
+ private int mMessageResId;
private static final String ARG_TITLE_RES_ID = "argTitleResId";
private static final String ARG_MESSAGE_RES_ID = "argMessageResId";
- public static ErrorDialogFragment newInstance(int titleResId) {
- return newInstanceInter(titleResId, null);
+ public static ErrorDialogFragment newInstance(int messageResId) {
+ return newInstance(0, messageResId);
}
public static ErrorDialogFragment newInstance(int titleResId, int messageResId) {
- return newInstanceInter(titleResId, messageResId);
- }
-
- private static ErrorDialogFragment newInstanceInter(
- int titleResId, Integer messageResId) {
final ErrorDialogFragment fragment = new ErrorDialogFragment();
final Bundle args = new Bundle();
args.putInt(ARG_TITLE_RES_ID, titleResId);
- if (messageResId != null) {
- args.putInt(ARG_MESSAGE_RES_ID, messageResId);
- }
+ args.putInt(ARG_MESSAGE_RES_ID, messageResId);
fragment.setArguments(args);
return fragment;
}
@@ -873,25 +985,25 @@
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTitleResId = getArguments().getInt(ARG_TITLE_RES_ID);
- if (getArguments().containsKey(ARG_MESSAGE_RES_ID)) {
- mMessageResId = getArguments().getInt(ARG_MESSAGE_RES_ID);
- }
+ mMessageResId = getArguments().getInt(ARG_MESSAGE_RES_ID);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- builder.setTitle(mTitleResId)
- .setPositiveButton(android.R.string.ok,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- }
- });
- if (mMessageResId != null) {
+ if (mTitleResId != 0) {
+ builder.setTitle(mTitleResId);
+ }
+ if (mMessageResId != 0) {
builder.setMessage(mMessageResId);
}
+ builder.setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dismiss();
+ }
+ });
return builder.create();
}
}
@@ -959,20 +1071,18 @@
Log.i(TAG, "The phone number is prohibited explicitly by a rule.");
if (getActivity() != null) {
DialogFragment dialogFragment = ErrorDialogFragment.newInstance(
- R.string.dialog_phone_call_prohibited_title);
+ R.string.dialog_phone_call_prohibited_message);
dialogFragment.show(getFragmentManager(), "phone_prohibited_dialog");
}
// Clear the digits just in case.
mDigits.getText().clear();
} else {
- final Intent intent = newDialNumberIntent(number);
- if (getActivity() instanceof DialtactsActivity) {
- intent.putExtra(DialtactsActivity.EXTRA_CALL_ORIGIN,
- DialtactsActivity.CALL_ORIGIN_DIALTACTS);
- }
+ final Intent intent = ContactsUtils.getCallIntent(number,
+ (getActivity() instanceof DialtactsActivity ?
+ ((DialtactsActivity)getActivity()).getCallOrigin() : null));
startActivity(intent);
- mDigits.getText().clear(); // TODO: Fix bug 1745781
+ mClearDigitsOnStop = true;
getActivity().finish();
}
}
@@ -1135,6 +1245,7 @@
DIALPAD_CHOICE_ADD_NEW_CALL);
}
+ @Override
public int getCount() {
return NUM_ITEMS;
}
@@ -1142,6 +1253,7 @@
/**
* Return the ChoiceItem for a given position.
*/
+ @Override
public Object getItem(int position) {
return mChoiceItems[position];
}
@@ -1149,6 +1261,7 @@
/**
* Return a unique ID for each possible choice.
*/
+ @Override
public long getItemId(int position) {
return position;
}
@@ -1156,6 +1269,7 @@
/**
* Make a view for each row.
*/
+ @Override
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.)
@@ -1176,7 +1290,8 @@
/**
* Handle clicks from the dialpad chooser.
*/
- public void onItemClick(AdapterView parent, View v, int position, long id) {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
DialpadChooserAdapter.ChoiceItem item =
(DialpadChooserAdapter.ChoiceItem) parent.getItemAtPosition(position);
int itemId = item.id;
@@ -1418,6 +1533,7 @@
new CallLogAsync.GetLastOutgoingCallArgs(
getActivity(),
new CallLogAsync.OnLastOutgoingCallComplete() {
+ @Override
public void lastOutgoingCall(String number) {
// TODO: Filter out emergency numbers if
// the carrier does not want redial for
@@ -1429,35 +1545,20 @@
mCallLog.getLastOutgoingCall(lastCallArgs);
}
- // Helpers for the call intents.
- private Intent newVoicemailIntent() {
- final Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts("voicemail", EMPTY_NUMBER, null));
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return intent;
- }
-
private Intent newFlashIntent() {
- final Intent intent = newDialNumberIntent(EMPTY_NUMBER);
+ final Intent intent = ContactsUtils.getCallIntent(EMPTY_NUMBER);
intent.putExtra(EXTRA_SEND_EMPTY_FLASH, true);
return intent;
}
- private Intent newDialNumberIntent(String number) {
- final Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts("tel", number, null));
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return intent;
- }
-
public void setListener(Listener listener) {
mListener = listener;
}
@Override
- public void onVisibilityChanged(boolean fragmentVisible) {
- mShowOptionsMenu = fragmentVisible;
- updateFakeMenuButtonsVisibility(fragmentVisible);
+ public void setMenuVisibility(boolean menuVisible) {
+ mShowOptionsMenu = menuVisible;
+ updateFakeMenuButtonsVisibility(menuVisible);
}
/**
diff --git a/src/com/android/contacts/dialpad/DialpadImageButton.java b/src/com/android/contacts/dialpad/DialpadImageButton.java
new file mode 100644
index 0000000..6e01379
--- /dev/null
+++ b/src/com/android/contacts/dialpad/DialpadImageButton.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.dialpad;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.widget.ImageButton;
+
+/**
+ * Custom {@link ImageButton} for dialpad buttons.
+ *
+ * During horizontal swipe, we want to exit "fading out" animation offered by its background
+ * just after starting the swipe.This class overrides {@link #onTouchEvent(MotionEvent)} to achieve
+ * the behavior.
+ */
+public class DialpadImageButton extends ImageButton {
+
+ public DialpadImageButton(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public DialpadImageButton(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ final boolean ret = super.onTouchEvent(event);
+ if (event.getAction() == MotionEvent.ACTION_CANCEL) {
+ jumpDrawablesToCurrentState();
+ }
+ return ret;
+ }
+}
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 844f892..aa432d3 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -23,6 +23,7 @@
import com.android.contacts.activities.ContactEditorAccountsChangedActivity;
import com.android.contacts.activities.ContactEditorActivity;
import com.android.contacts.activities.JoinContactActivity;
+import com.android.contacts.detail.PhotoSelectionHandler;
import com.android.contacts.editor.AggregationSuggestionEngine.Suggestion;
import com.android.contacts.editor.Editor.EditorListener;
import com.android.contacts.model.AccountType;
@@ -44,7 +45,6 @@
import android.app.Fragment;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
-import android.content.ActivityNotFoundException;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
@@ -55,11 +55,10 @@
import android.content.Loader;
import android.database.Cursor;
import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.Rect;
-import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Environment;
import android.os.SystemClock;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Event;
@@ -67,11 +66,9 @@
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.DisplayPhoto;
import android.provider.ContactsContract.Groups;
import android.provider.ContactsContract.Intents;
import android.provider.ContactsContract.RawContacts;
-import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -87,11 +84,9 @@
import android.widget.Toast;
import java.io.File;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
-import java.util.Date;
import java.util.List;
public class ContactEditorFragment extends Fragment implements
@@ -117,6 +112,7 @@
private static final String KEY_STATUS = "status";
private static final String KEY_NEW_LOCAL_PROFILE = "newLocalProfile";
private static final String KEY_IS_USER_PROFILE = "isUserProfile";
+ private static final String KEY_UPDATED_PHOTOS = "updatedPhotos";
public static final String SAVE_MODE_EXTRA_KEY = "saveMode";
@@ -131,8 +127,6 @@
/**
* Modes that specify what the AsyncTask has to perform after saving
*/
- // TODO: Move this into a common utils class or the save service because the contact and
- // group editors need to use this interface definition
public interface SaveMode {
/**
* Close the editor after saving
@@ -192,25 +186,17 @@
}
private static final int REQUEST_CODE_JOIN = 0;
- private static final int REQUEST_CODE_CAMERA_WITH_DATA = 1;
- private static final int REQUEST_CODE_PHOTO_PICKED_WITH_DATA = 2;
- private static final int REQUEST_CODE_ACCOUNTS_CHANGED = 3;
+ private static final int REQUEST_CODE_ACCOUNTS_CHANGED = 1;
- private Bitmap mPhoto = null;
private long mRawContactIdRequestingPhoto = -1;
- private long mRawContactIdRequestingPhotoAfterLoad = -1;
+ private PhotoSelectionHandler mPhotoSelectionHandler;
private final EntityDeltaComparator mComparator = new EntityDeltaComparator();
- private static final File PHOTO_DIR = new File(
- Environment.getExternalStorageDirectory() + "/DCIM/Camera");
-
private Cursor mGroupMetaData;
private File mCurrentPhotoFile;
-
- // Height/width (in pixels) to request for the photo - queried from the provider.
- private int mPhotoPickSize;
+ private Bundle mUpdatedPhotos = new Bundle();
private Context mContext;
private String mAction;
@@ -322,7 +308,6 @@
super.onAttach(activity);
mContext = activity;
mEditorUtils = ContactEditorUtils.getInstance(mContext);
- loadPhotoPickSize();
}
@Override
@@ -436,6 +421,7 @@
mStatus = savedState.getInt(KEY_STATUS);
mNewLocalProfile = savedState.getBoolean(KEY_NEW_LOCAL_PROFILE);
mIsUserProfile = savedState.getBoolean(KEY_IS_USER_PROFILE);
+ mUpdatedPhotos = savedState.getParcelable(KEY_UPDATED_PHOTOS);
}
}
@@ -729,8 +715,14 @@
editor.setState(entity, type, mViewIdGenerator, isEditingUserProfile());
- editor.getPhotoEditor().setEditorListener(
- new PhotoEditorListener(editor, type.areContactsWritable()));
+ // Set up the photo handler.
+ bindPhotoHandler(editor, type, mState);
+
+ // If a new photo was chosen but not yet saved, we need to
+ // update the thumbnail to reflect this.
+ Bitmap bitmap = updatedBitmapForRawContact(rawContactId);
+ if (bitmap != null) editor.setPhotoBitmap(bitmap);
+
if (editor instanceof RawContactEditorView) {
final RawContactEditorView rawContactEditor = (RawContactEditorView) editor;
EditorListener listener = new EditorListener() {
@@ -776,7 +768,43 @@
// Activity can be null if we have been detached from the Activity
final Activity activity = getActivity();
if (activity != null) activity.invalidateOptionsMenu();
+ }
+ /**
+ * If we've stashed a temporary file containing a contact's new photo,
+ * decode it and return the bitmap.
+ * @param rawContactId identifies the raw-contact whose Bitmap we'll try to return.
+ * @return Bitmap of photo for specified raw-contact, or null
+ */
+ private Bitmap updatedBitmapForRawContact(long rawContactId) {
+ String path = mUpdatedPhotos.getString(String.valueOf(rawContactId));
+ return BitmapFactory.decodeFile(path);
+ }
+
+ private void bindPhotoHandler(BaseRawContactEditorView editor, AccountType type,
+ EntityDeltaList state) {
+ final int mode;
+ if (type.areContactsWritable()) {
+ if (editor.hasSetPhoto()) {
+ if (hasMoreThanOnePhoto()) {
+ mode = PhotoActionPopup.Modes.PHOTO_ALLOW_PRIMARY;
+ } else {
+ mode = PhotoActionPopup.Modes.PHOTO_DISALLOW_PRIMARY;
+ }
+ } else {
+ mode = PhotoActionPopup.Modes.NO_PHOTO;
+ }
+ } else {
+ if (editor.hasSetPhoto() && hasMoreThanOnePhoto()) {
+ mode = PhotoActionPopup.Modes.READ_ONLY_ALLOW_PRIMARY;
+ } else {
+ // Read-only and either no photo or the only photo ==> no options
+ return;
+ }
+ }
+ mPhotoSelectionHandler = new PhotoHandler(mContext, editor, mode, state);
+ editor.getPhotoEditor().setEditorListener(
+ (PhotoHandler.PhotoEditorListener) mPhotoSelectionHandler.getListener());
}
private void bindGroupMetaData() {
@@ -926,32 +954,6 @@
return save(SaveMode.JOIN);
}
- private void loadPhotoPickSize() {
- Cursor c = mContext.getContentResolver().query(DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI,
- new String[]{DisplayPhoto.DISPLAY_MAX_DIM}, null, null, null);
- try {
- c.moveToFirst();
- mPhotoPickSize = c.getInt(0);
- } finally {
- c.close();
- }
- }
-
- /**
- * Constructs an intent for picking a photo from Gallery, cropping it and returning the bitmap.
- */
- public Intent getPhotoPickIntent() {
- Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
- intent.setType("image/*");
- intent.putExtra("crop", "true");
- intent.putExtra("aspectX", 1);
- intent.putExtra("aspectY", 1);
- intent.putExtra("outputX", mPhotoPickSize);
- intent.putExtra("outputY", mPhotoPickSize);
- intent.putExtra("return-data", true);
- return intent;
- }
-
/**
* Check if our internal {@link #mState} is valid, usually checked before
* performing user actions.
@@ -961,61 +963,6 @@
}
/**
- * Create a file name for the icon photo using current time.
- */
- private String getPhotoFileName() {
- Date date = new Date(System.currentTimeMillis());
- SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");
- return dateFormat.format(date) + ".jpg";
- }
-
- /**
- * Constructs an intent for capturing a photo and storing it in a temporary file.
- */
- public static Intent getTakePickIntent(File f) {
- Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);
- intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
- return intent;
- }
-
- /**
- * Sends a newly acquired photo to Gallery for cropping
- */
- protected void doCropPhoto(File f) {
- try {
- // Add the image to the media store
- MediaScannerConnection.scanFile(
- mContext,
- new String[] { f.getAbsolutePath() },
- new String[] { null },
- null);
-
- // Launch gallery to crop the photo
- final Intent intent = getCropImageIntent(Uri.fromFile(f));
- mStatus = Status.SUB_ACTIVITY;
- startActivityForResult(intent, REQUEST_CODE_PHOTO_PICKED_WITH_DATA);
- } catch (Exception e) {
- Log.e(TAG, "Cannot crop image", e);
- Toast.makeText(mContext, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show();
- }
- }
-
- /**
- * Constructs an intent for image cropping.
- */
- public Intent getCropImageIntent(Uri photoUri) {
- Intent intent = new Intent("com.android.camera.action.CROP");
- intent.setDataAndType(photoUri, "image/*");
- intent.putExtra("crop", "true");
- intent.putExtra("aspectX", 1);
- intent.putExtra("aspectY", 1);
- intent.putExtra("outputX", mPhotoPickSize);
- intent.putExtra("outputY", mPhotoPickSize);
- intent.putExtra("return-data", true);
- return intent;
- }
-
- /**
* Saves or creates the contact based on the mode, and if successful
* finishes the activity.
*/
@@ -1044,8 +991,9 @@
// Save contact
Intent intent = ContactSaveService.createSaveContactIntent(getActivity(), mState,
- SAVE_MODE_EXTRA_KEY, saveMode, isEditingUserProfile(),
- getActivity().getClass(), ContactEditorActivity.ACTION_SAVE_COMPLETED);
+ SAVE_MODE_EXTRA_KEY, saveMode, isEditingUserProfile(), getActivity().getClass(),
+ ContactEditorActivity.ACTION_SAVE_COMPLETED, mUpdatedPhotos);
+
getActivity().startService(intent);
return true;
}
@@ -1062,12 +1010,11 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.cancel_confirmation_dialog_title)
.setMessage(R.string.cancel_confirmation_dialog_message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@Override
- public void onClick(DialogInterface dialog, int whichButton) {
+ public void onClick(DialogInterface dialogInterface, int whichButton) {
((ContactEditorFragment)getTargetFragment()).doRevertAction();
}
}
@@ -1456,10 +1403,10 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.aggregation_suggestion_join_dialog_title)
.setMessage(R.string.aggregation_suggestion_join_dialog_message)
.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int whichButton) {
ContactEditorFragment targetFragment =
(ContactEditorFragment) getTargetFragment();
@@ -1504,10 +1451,10 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.aggregation_suggestion_edit_dialog_title)
.setMessage(R.string.aggregation_suggestion_edit_dialog_message)
.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int whichButton) {
ContactEditorFragment targetFragment =
(ContactEditorFragment) getTargetFragment();
@@ -1548,21 +1495,6 @@
}
}
- /**
- * Computes bounds of the supplied view relative to its ascendant.
- */
- private Rect getRelativeBounds(View ascendant, View view) {
- Rect rect = new Rect();
- rect.set(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
-
- View parent = (View) view.getParent();
- while (parent != ascendant) {
- rect.offset(parent.getLeft(), parent.getTop());
- parent = (View) parent.getParent();
- }
- return rect;
- }
-
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putParcelable(KEY_URI, mLookupUri);
@@ -1585,6 +1517,8 @@
outState.putBoolean(KEY_NEW_LOCAL_PROFILE, mNewLocalProfile);
outState.putBoolean(KEY_IS_USER_PROFILE, mIsUserProfile);
outState.putInt(KEY_STATUS, mStatus);
+ outState.putParcelable(KEY_UPDATED_PHOTOS, mUpdatedPhotos);
+
super.onSaveInstanceState(outState);
}
@@ -1594,27 +1528,13 @@
mStatus = Status.EDITING;
}
- switch (requestCode) {
- case REQUEST_CODE_PHOTO_PICKED_WITH_DATA: {
- // Ignore failed requests
- if (resultCode != Activity.RESULT_OK) return;
- // As we are coming back to this view, the editor will be reloaded automatically,
- // which will cause the photo that is set here to disappear. To prevent this,
- // we remember to set a flag which is interpreted after loading.
- // This photo is set here already to reduce flickering.
- mPhoto = data.getParcelableExtra("data");
- setPhoto(mRawContactIdRequestingPhoto, mPhoto);
- mRawContactIdRequestingPhotoAfterLoad = mRawContactIdRequestingPhoto;
- mRawContactIdRequestingPhoto = -1;
+ // See if the photo selection handler handles this result.
+ if (mPhotoSelectionHandler != null && mPhotoSelectionHandler.handlePhotoActivityResult(
+ requestCode, resultCode, data)) {
+ return;
+ }
- break;
- }
- case REQUEST_CODE_CAMERA_WITH_DATA: {
- // Ignore failed requests
- if (resultCode != Activity.RESULT_OK) return;
- doCropPhoto(mCurrentPhotoFile);
- break;
- }
+ switch (requestCode) {
case REQUEST_CODE_JOIN: {
// Ignore failed requests
if (resultCode != Activity.RESULT_OK) return;
@@ -1650,13 +1570,21 @@
/**
* Sets the photo stored in mPhoto and writes it to the RawContact with the given id
*/
- private void setPhoto(long rawContact, Bitmap photo) {
+ private void setPhoto(long rawContact, Bitmap photo, File photoFile) {
BaseRawContactEditorView requestingEditor = getRawContactEditorView(rawContact);
+
+ if (photo == null || photo.getHeight() < 0 || photo.getWidth() < 0) {
+ // This is unexpected.
+ Log.w(TAG, "Invalid bitmap passed to setPhoto()");
+ }
+
if (requestingEditor != null) {
requestingEditor.setPhotoBitmap(photo);
} else {
Log.w(TAG, "The contact that requested the photo is no longer present.");
}
+
+ mUpdatedPhotos.putString(String.valueOf(rawContact), photoFile.getAbsolutePath());
}
/**
@@ -1723,12 +1651,6 @@
setData(data);
final long setDataEndTime = SystemClock.elapsedRealtime();
- // If we are coming back from the photo trimmer, this will be set.
- if (mRawContactIdRequestingPhotoAfterLoad != -1) {
- setPhoto(mRawContactIdRequestingPhotoAfterLoad, mPhoto);
- mRawContactIdRequestingPhotoAfterLoad = -1;
- mPhoto = null;
- }
Log.v(TAG, "Time needed for setting UI: " + (setDataEndTime-setDataStartTime));
}
@@ -1754,6 +1676,7 @@
bindGroupMetaData();
}
+ @Override
public void onLoaderReset(Loader<Cursor> loader) {
}
};
@@ -1773,111 +1696,106 @@
save(SaveMode.SPLIT);
}
- private final class PhotoEditorListener
- implements EditorListener, PhotoActionPopup.Listener {
- private final BaseRawContactEditorView mEditor;
- private final boolean mAccountWritable;
+ /**
+ * Custom photo handler for the editor. The inner listener that this creates also has a
+ * reference to the editor and acts as an {@link EditorListener}, and uses that editor to hold
+ * state information in several of the listener methods.
+ */
+ private final class PhotoHandler extends PhotoSelectionHandler {
- private PhotoEditorListener(BaseRawContactEditorView editor, boolean accountWritable) {
- mEditor = editor;
- mAccountWritable = accountWritable;
+ final long mRawContactId;
+
+ public PhotoHandler(Context context, BaseRawContactEditorView editor, int photoMode,
+ EntityDeltaList state) {
+ super(context, editor.getPhotoEditor(), photoMode, false, state);
+ setListener(new PhotoEditorListener(editor));
+ mRawContactId = editor.getRawContactId();
}
- @Override
- public void onRequest(int request) {
- if (!hasValidState()) return;
+ private final class PhotoEditorListener extends PhotoSelectionHandler.PhotoActionListener
+ implements EditorListener {
+ private final BaseRawContactEditorView mEditor;
- if (request == EditorListener.REQUEST_PICK_PHOTO) {
- // Determine mode
- final int mode;
- if (mAccountWritable) {
- if (mEditor.hasSetPhoto()) {
- if (hasMoreThanOnePhoto()) {
- mode = PhotoActionPopup.MODE_PHOTO_ALLOW_PRIMARY;
- } else {
- mode = PhotoActionPopup.MODE_PHOTO_DISALLOW_PRIMARY;
- }
- } else {
- mode = PhotoActionPopup.MODE_NO_PHOTO;
- }
- } else {
- if (mEditor.hasSetPhoto() && hasMoreThanOnePhoto()) {
- mode = PhotoActionPopup.MODE_READ_ONLY_ALLOW_PRIMARY;
- } else {
- // Read-only and either no photo or the only photo ==> no options
- return;
- }
- }
- PhotoActionPopup.createPopupMenu(mContext, mEditor.getPhotoEditor(), this, mode)
- .show();
+ private PhotoEditorListener(BaseRawContactEditorView editor) {
+ mEditor = editor;
}
- }
- @Override
- public void onDeleteRequested(Editor removedEditor) {
- // The picture cannot be deleted, it can only be removed, which is handled by
- // onRemovePictureChosen()
- }
+ @Override
+ public void onRequest(int request) {
+ if (!hasValidState()) return;
- /**
- * User has chosen to set the selected photo as the (super) primary photo
- */
- @Override
- public void onUseAsPrimaryChosen() {
- // Set the IsSuperPrimary for each editor
- int count = mContent.getChildCount();
- for (int i = 0; i < count; i++) {
- final View childView = mContent.getChildAt(i);
- if (childView instanceof BaseRawContactEditorView) {
- final BaseRawContactEditorView editor = (BaseRawContactEditorView) childView;
- final PhotoEditorView photoEditor = editor.getPhotoEditor();
- photoEditor.setSuperPrimary(editor == mEditor);
+ if (request == EditorListener.REQUEST_PICK_PHOTO) {
+ onClick(mEditor.getPhotoEditor());
}
}
- }
- /**
- * User has chosen to remove a picture
- */
- @Override
- public void onRemovePictureChosen() {
- mEditor.setPhotoBitmap(null);
- }
-
- /**
- * Launches Camera to take a picture and store it in a file.
- */
- @Override
- public void onTakePhotoChosen() {
- mRawContactIdRequestingPhoto = mEditor.getRawContactId();
- try {
- // Launch camera to take photo for selected contact
- PHOTO_DIR.mkdirs();
- mCurrentPhotoFile = new File(PHOTO_DIR, getPhotoFileName());
- final Intent intent = getTakePickIntent(mCurrentPhotoFile);
-
- mStatus = Status.SUB_ACTIVITY;
- startActivityForResult(intent, REQUEST_CODE_CAMERA_WITH_DATA);
- } catch (ActivityNotFoundException e) {
- Toast.makeText(mContext, R.string.photoPickerNotFoundText,
- Toast.LENGTH_LONG).show();
+ @Override
+ public void onDeleteRequested(Editor removedEditor) {
+ // The picture cannot be deleted, it can only be removed, which is handled by
+ // onRemovePictureChosen()
}
- }
- /**
- * Launches Gallery to pick a photo.
- */
- @Override
- public void onPickFromGalleryChosen() {
- mRawContactIdRequestingPhoto = mEditor.getRawContactId();
- try {
- // Launch picker to choose photo for selected contact
- final Intent intent = getPhotoPickIntent();
+ /**
+ * User has chosen to set the selected photo as the (super) primary photo
+ */
+ @Override
+ public void onUseAsPrimaryChosen() {
+ // Set the IsSuperPrimary for each editor
+ int count = mContent.getChildCount();
+ for (int i = 0; i < count; i++) {
+ final View childView = mContent.getChildAt(i);
+ if (childView instanceof BaseRawContactEditorView) {
+ final BaseRawContactEditorView editor =
+ (BaseRawContactEditorView) childView;
+ final PhotoEditorView photoEditor = editor.getPhotoEditor();
+ photoEditor.setSuperPrimary(editor == mEditor);
+ }
+ }
+ }
+
+ /**
+ * User has chosen to remove a picture
+ */
+ @Override
+ public void onRemovePictureChosen() {
+ mEditor.setPhotoBitmap(null);
+
+ // Prevent bitmap from being restored if rotate the device.
+ // (only if we first chose a new photo before removing it)
+ mUpdatedPhotos.remove(String.valueOf(mRawContactId));
+ }
+
+ @Override
+ public void startTakePhotoActivity(Intent intent, int requestCode, File photoFile) {
+ mRawContactIdRequestingPhoto = mEditor.getRawContactId();
mStatus = Status.SUB_ACTIVITY;
- startActivityForResult(intent, REQUEST_CODE_PHOTO_PICKED_WITH_DATA);
- } catch (ActivityNotFoundException e) {
- Toast.makeText(mContext, R.string.photoPickerNotFoundText,
- Toast.LENGTH_LONG).show();
+ mCurrentPhotoFile = photoFile;
+ startActivityForResult(intent, requestCode);
+ }
+
+ @Override
+ public void startPickFromGalleryActivity(Intent intent, int requestCode,
+ File photoFile) {
+ mRawContactIdRequestingPhoto = mEditor.getRawContactId();
+ mStatus = Status.SUB_ACTIVITY;
+ mCurrentPhotoFile = photoFile;
+ startActivityForResult(intent, requestCode);
+ }
+
+ @Override
+ public void onPhotoSelected(Bitmap bitmap) {
+ setPhoto(mRawContactIdRequestingPhoto, bitmap, mCurrentPhotoFile);
+ mRawContactIdRequestingPhoto = -1;
+ }
+
+ @Override
+ public File getCurrentPhotoFile() {
+ return mCurrentPhotoFile;
+ }
+
+ @Override
+ public void onPhotoSelectionDismissed() {
+ // Nothing to do.
}
}
}
diff --git a/src/com/android/contacts/editor/ContactEditorUtils.java b/src/com/android/contacts/editor/ContactEditorUtils.java
index 05a041d..46006a0 100644
--- a/src/com/android/contacts/editor/ContactEditorUtils.java
+++ b/src/com/android/contacts/editor/ContactEditorUtils.java
@@ -19,6 +19,7 @@
import com.android.contacts.model.AccountType;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.model.AccountWithDataSet;
+import com.android.contacts.test.NeededForTesting;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets;
@@ -74,11 +75,13 @@
return sInstance;
}
+ @NeededForTesting
void cleanupForTest() {
mPrefs.edit().remove(KEY_DEFAULT_ACCOUNT).remove(KEY_KNOWN_ACCOUNTS)
.remove(KEY_ANYTHING_SAVED).apply();
}
+ @NeededForTesting
void removeDefaultAccountForTest() {
mPrefs.edit().remove(KEY_DEFAULT_ACCOUNT).apply();
}
diff --git a/src/com/android/contacts/editor/EventFieldEditorView.java b/src/com/android/contacts/editor/EventFieldEditorView.java
index 4a5a502..475e172 100644
--- a/src/com/android/contacts/editor/EventFieldEditorView.java
+++ b/src/com/android/contacts/editor/EventFieldEditorView.java
@@ -131,7 +131,9 @@
@Override
public boolean isEmpty() {
- return TextUtils.isEmpty(mDateView.getText());
+ final EditField editField = getKind().fieldList.get(0);
+ final String column = editField.column;
+ return TextUtils.isEmpty(getEntry().getAsString(column));
}
@Override
@@ -243,6 +245,7 @@
} else {
resultString = kind.dateFormatWithYear.format(outCalendar.getTime());
}
+
onFieldChanged(column, resultString);
rebuildDateView();
}
diff --git a/src/com/android/contacts/editor/LabeledEditorView.java b/src/com/android/contacts/editor/LabeledEditorView.java
index 2a1ec5e..5c09b99 100644
--- a/src/com/android/contacts/editor/LabeledEditorView.java
+++ b/src/com/android/contacts/editor/LabeledEditorView.java
@@ -31,7 +31,6 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.Entity;
-import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
@@ -128,6 +127,8 @@
protected void onFinishInflate() {
mLabel = (Spinner) findViewById(R.id.spinner);
+ // Turn off the Spinner's own state management. We do this ourselves on rotation
+ mLabel.setId(View.NO_ID);
mLabel.setOnItemSelectedListener(mSpinnerListener);
mDelete = (ImageView) findViewById(R.id.delete_button);
@@ -286,7 +287,17 @@
}
// Field changes are saved directly
+ saveValue(column, value);
+
+ // Notify listener if applicable
+ notifyEditorListener();
+ }
+
+ protected void saveValue(String column, String value) {
mEntry.put(column, value);
+ }
+
+ protected void notifyEditorListener() {
if (mListener != null) {
mListener.onRequest(EditorListener.FIELD_CHANGED);
}
diff --git a/src/com/android/contacts/editor/PhotoActionPopup.java b/src/com/android/contacts/editor/PhotoActionPopup.java
index cca6f9d..9744308 100644
--- a/src/com/android/contacts/editor/PhotoActionPopup.java
+++ b/src/com/android/contacts/editor/PhotoActionPopup.java
@@ -29,15 +29,46 @@
import java.util.ArrayList;
/**
- * Shows a popup asking the user what to do for a photo. The result is pased back to the Listener
+ * Shows a popup asking the user what to do for a photo. The result is passed back to the Listener
*/
public class PhotoActionPopup {
public static final String TAG = "PhotoActionPopup";
- public static final int MODE_NO_PHOTO = 0;
- public static final int MODE_READ_ONLY_ALLOW_PRIMARY = 1;
- public static final int MODE_PHOTO_DISALLOW_PRIMARY = 2;
- public static final int MODE_PHOTO_ALLOW_PRIMARY = 3;
+ /**
+ * Bitmask flags to specify which actions should be presented to the user.
+ */
+ public static final class Flags {
+ /** If set, show choice to use as primary photo. */
+ public static final int ALLOW_PRIMARY = 1;
+ /** If set, show choice to remove photo. */
+ public static final int REMOVE_PHOTO = 2;
+ /** If set, show choices to take a picture with the camera, or pick one from the gallery. */
+ public static final int TAKE_OR_PICK_PHOTO = 4;
+ /**
+ * If set, modifies the wording in the choices for TAKE_OR_PICK_PHOTO
+ * to emphasize that the existing photo will be replaced.
+ */
+ public static final int TAKE_OR_PICK_PHOTO_REPLACE_WORDING = 8;
+ }
+
+ /**
+ * Convenient combinations of commonly-used flags (see {@link Flags}).
+ */
+ public static final class Modes {
+ public static final int NO_PHOTO =
+ Flags.TAKE_OR_PICK_PHOTO;
+ public static final int READ_ONLY_ALLOW_PRIMARY =
+ Flags.ALLOW_PRIMARY;
+ public static final int PHOTO_DISALLOW_PRIMARY =
+ Flags.REMOVE_PHOTO |
+ Flags.TAKE_OR_PICK_PHOTO |
+ Flags.TAKE_OR_PICK_PHOTO_REPLACE_WORDING;
+ public static final int PHOTO_ALLOW_PRIMARY =
+ Flags.ALLOW_PRIMARY |
+ Flags.REMOVE_PHOTO |
+ Flags.TAKE_OR_PICK_PHOTO |
+ Flags.TAKE_OR_PICK_PHOTO_REPLACE_WORDING;
+ }
public static ListPopupWindow createPopupMenu(Context context, View anchorView,
final Listener listener, int mode) {
@@ -45,29 +76,26 @@
// if there are NO choices (e.g. a read-only picture is already super-primary)
final ArrayList<ChoiceListItem> choices = new ArrayList<ChoiceListItem>(4);
// Use as Primary
- if (mode == MODE_PHOTO_ALLOW_PRIMARY || mode == MODE_READ_ONLY_ALLOW_PRIMARY) {
+ if ((mode & Flags.ALLOW_PRIMARY) > 0) {
choices.add(new ChoiceListItem(ChoiceListItem.ID_USE_AS_PRIMARY,
context.getString(R.string.use_photo_as_primary)));
}
// Remove
- if (mode == MODE_PHOTO_DISALLOW_PRIMARY || mode == MODE_PHOTO_ALLOW_PRIMARY) {
+ if ((mode & Flags.REMOVE_PHOTO) > 0) {
choices.add(new ChoiceListItem(ChoiceListItem.ID_REMOVE,
context.getString(R.string.removePhoto)));
}
- // Take photo (if there is already a photo, it says "Take new photo")
- if (mode == MODE_NO_PHOTO || mode == MODE_PHOTO_ALLOW_PRIMARY
- || mode == MODE_PHOTO_DISALLOW_PRIMARY) {
- final int resId = mode == MODE_NO_PHOTO ? R.string.take_photo :R.string.take_new_photo;
- choices.add(new ChoiceListItem(ChoiceListItem.ID_TAKE_PHOTO,
- context.getString(resId)));
+ // Take photo or pick one from the gallery. Wording differs if there is already a photo.
+ if ((mode & Flags.TAKE_OR_PICK_PHOTO) > 0) {
+ boolean replace = (mode & Flags.TAKE_OR_PICK_PHOTO_REPLACE_WORDING) > 0;
+ final int takePhotoResId = replace ? R.string.take_new_photo : R.string.take_photo;
+ final String takePhotoString = context.getString(takePhotoResId);
+ final int pickPhotoResId = replace ? R.string.pick_new_photo : R.string.pick_photo;
+ final String pickPhotoString = context.getString(pickPhotoResId);
+ choices.add(new ChoiceListItem(ChoiceListItem.ID_TAKE_PHOTO, takePhotoString));
+ choices.add(new ChoiceListItem(ChoiceListItem.ID_PICK_PHOTO, pickPhotoString));
}
- // Select from Gallery (or "Select new from Gallery")
- if (mode == MODE_NO_PHOTO || mode == MODE_PHOTO_ALLOW_PRIMARY
- || mode == MODE_PHOTO_DISALLOW_PRIMARY) {
- final int resId = mode == MODE_NO_PHOTO ? R.string.pick_photo :R.string.pick_new_photo;
- choices.add(new ChoiceListItem(ChoiceListItem.ID_PICK_PHOTO,
- context.getString(resId)));
- }
+
final ListAdapter adapter = new ArrayAdapter<ChoiceListItem>(context,
R.layout.select_dialog_item, choices);
@@ -76,8 +104,6 @@
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final ChoiceListItem choice = choices.get(position);
- listPopupWindow.dismiss();
-
switch (choice.getId()) {
case ChoiceListItem.ID_USE_AS_PRIMARY:
listener.onUseAsPrimaryChosen();
@@ -92,6 +118,8 @@
listener.onPickFromGalleryChosen();
break;
}
+
+ listPopupWindow.dismiss();
}
};
diff --git a/src/com/android/contacts/editor/PhotoEditorView.java b/src/com/android/contacts/editor/PhotoEditorView.java
index 086b07f..db29544 100644
--- a/src/com/android/contacts/editor/PhotoEditorView.java
+++ b/src/com/android/contacts/editor/PhotoEditorView.java
@@ -132,25 +132,13 @@
return;
}
- final int size = photo.getWidth() * photo.getHeight() * 4;
- final ByteArrayOutputStream out = new ByteArrayOutputStream(size);
+ mPhotoImageView.setImageBitmap(photo);
+ mFrameView.setEnabled(isEnabled());
+ mHasSetPhoto = true;
+ mEntry.setFromTemplate(false);
- try {
- photo.compress(Bitmap.CompressFormat.PNG, 100, out);
- out.flush();
- out.close();
-
- mEntry.put(Photo.PHOTO, out.toByteArray());
- mPhotoImageView.setImageBitmap(photo);
- mFrameView.setEnabled(isEnabled());
- mHasSetPhoto = true;
- mEntry.setFromTemplate(false);
-
- // When the user chooses a new photo mark it as super primary
- mEntry.put(Photo.IS_SUPER_PRIMARY, 1);
- } catch (IOException e) {
- Log.w(TAG, "Unable to serialize photo: " + e.toString());
- }
+ // When the user chooses a new photo mark it as super primary
+ mEntry.put(Photo.IS_SUPER_PRIMARY, 1);
}
/**
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index c9c6699..efb6b13 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -307,6 +307,9 @@
addToDefaultGroupIfNeeded();
+
+ final int sectionCount = getSectionViewsWithoutFields().size();
+ mAddFieldButton.setVisibility(sectionCount > 0 ? View.VISIBLE : View.GONE);
mAddFieldButton.setEnabled(isEnabled());
}
@@ -405,12 +408,14 @@
return mRawContactId;
}
- private void showAddInformationPopupWindow() {
+ /**
+ * Return a list of KindSectionViews that have no fields yet...
+ * these are candidates to have fields added in
+ * {@link #showAddInformationPopupWindow()}
+ */
+ private ArrayList<KindSectionView> getSectionViewsWithoutFields() {
final ArrayList<KindSectionView> fields =
new ArrayList<KindSectionView>(mFields.getChildCount());
-
- final PopupMenu popupMenu = new PopupMenu(getContext(), mAddFieldButton);
- final Menu menu = popupMenu.getMenu();
for (int i = 0; i < mFields.getChildCount(); i++) {
View child = mFields.getChildAt(i);
if (child instanceof KindSectionView) {
@@ -434,10 +439,19 @@
continue;
}
- menu.add(Menu.NONE, fields.size(), Menu.NONE, sectionView.getTitle());
fields.add(sectionView);
}
}
+ return fields;
+ }
+
+ private void showAddInformationPopupWindow() {
+ final ArrayList<KindSectionView> fields = getSectionViewsWithoutFields();
+ final PopupMenu popupMenu = new PopupMenu(getContext(), mAddFieldButton);
+ final Menu menu = popupMenu.getMenu();
+ for (int i = 0; i < fields.size(); i++) {
+ menu.add(Menu.NONE, i, Menu.NONE, fields.get(i).getTitle());
+ }
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
@@ -449,6 +463,13 @@
} else {
view.addItem();
}
+
+ // If this was the last section without an entry, we just added one, and therefore
+ // there's no reason to show the button.
+ if (fields.size() == 1) {
+ mAddFieldButton.setVisibility(View.GONE);
+ }
+
return true;
}
});
diff --git a/src/com/android/contacts/editor/StructuredNameEditorView.java b/src/com/android/contacts/editor/StructuredNameEditorView.java
index 6911628..af1b3cf 100644
--- a/src/com/android/contacts/editor/StructuredNameEditorView.java
+++ b/src/com/android/contacts/editor/StructuredNameEditorView.java
@@ -77,11 +77,12 @@
if (!isFieldChanged(column, value)) {
return;
}
- super.onFieldChanged(column, value);
+ // First save the new value for the column.
+ saveValue(column, value);
mChanged = true;
- // Make sure the display name and the structured name are synced
+ // Next make sure the display name and the structured name are synced
if (hasShortAndLongForms()) {
if (areOptionalFieldsVisible()) {
rebuildFullName(getValues());
@@ -89,6 +90,10 @@
rebuildStructuredName(getValues());
}
}
+
+ // Then notify the listener, which will rely on the display and structured names to be
+ // synced (in order to provide aggregate suggestions).
+ notifyEditorListener();
}
@Override
diff --git a/src/com/android/contacts/format/FormatUtils.java b/src/com/android/contacts/format/FormatUtils.java
index 4b076cf..82bf78d 100644
--- a/src/com/android/contacts/format/FormatUtils.java
+++ b/src/com/android/contacts/format/FormatUtils.java
@@ -28,6 +28,8 @@
* Assorted utility methods related to text formatting in Contacts.
*/
public class FormatUtils {
+ private static final char LEFT_TO_RIGHT_EMBEDDING = '\u202A';
+ private static final char POP_DIRECTIONAL_FORMATTING = '\u202C';
/**
* Finds the earliest point in buffer1 at which the first part of buffer2 matches. For example,
@@ -180,4 +182,13 @@
return -1;
}
+
+ /** Returns the given text, forced to be left-to-right. */
+ public static CharSequence forceLeftToRight(CharSequence text) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(LEFT_TO_RIGHT_EMBEDDING);
+ sb.append(text);
+ sb.append(POP_DIRECTIONAL_FORMATTING);
+ return sb.toString();
+ }
}
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index f0e4175..3a43e66 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -23,6 +23,7 @@
import com.android.contacts.interactions.GroupDeletionDialogFragment;
import com.android.contacts.list.ContactTileAdapter;
import com.android.contacts.list.ContactTileAdapter.DisplayType;
+import com.android.contacts.list.ContactTileView;
import com.android.contacts.model.AccountType;
import com.android.contacts.model.AccountTypeManager;
@@ -42,6 +43,7 @@
import android.os.Bundle;
import android.provider.ContactsContract.Groups;
import android.text.TextUtils;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -203,13 +205,19 @@
getLoaderManager().restartLoader(LOADER_MEMBERS, null, mGroupMemberListLoaderListener);
}
- private final ContactTileAdapter.Listener mContactTileListener =
- new ContactTileAdapter.Listener() {
+ private final ContactTileView.Listener mContactTileListener =
+ new ContactTileView.Listener() {
@Override
public void onContactSelected(Uri contactUri, Rect targetRect) {
mListener.onContactSelected(contactUri);
}
+
+ @Override
+ public void onCallNumberDirectly(String phoneNumber) {
+ // No need to call phone number directly from People app.
+ Log.w(TAG, "unexpected invocation of onCallNumberDirectly()");
+ }
};
/**
diff --git a/src/com/android/contacts/group/GroupEditorFragment.java b/src/com/android/contacts/group/GroupEditorFragment.java
index a3ebeb0..6ed652f 100644
--- a/src/com/android/contacts/group/GroupEditorFragment.java
+++ b/src/com/android/contacts/group/GroupEditorFragment.java
@@ -23,7 +23,6 @@
import com.android.contacts.GroupMetaDataLoader;
import com.android.contacts.R;
import com.android.contacts.activities.GroupEditorActivity;
-import com.android.contacts.editor.ContactEditorFragment.SaveMode;
import com.android.contacts.editor.SelectAccountDialogFragment;
import com.android.contacts.group.SuggestedMemberListAdapter.SuggestedMember;
import com.android.contacts.model.AccountType;
@@ -122,8 +121,6 @@
private static final int LOADER_EXISTING_MEMBERS = 2;
private static final int LOADER_NEW_GROUP_MEMBER = 3;
- public static final String SAVE_MODE_EXTRA_KEY = "saveMode";
-
private static final String MEMBER_RAW_CONTACT_ID_KEY = "rawContactId";
private static final String MEMBER_LOOKUP_URI_KEY = "memberLookupUri";
@@ -502,7 +499,7 @@
public void onDoneClicked() {
if (isGroupMembershipEditable()) {
- save(SaveMode.CLOSE);
+ save();
} else {
// Just revert it.
doRevertAction();
@@ -550,12 +547,11 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.cancel_confirmation_dialog_title)
.setMessage(R.string.cancel_confirmation_dialog_message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@Override
- public void onClick(DialogInterface dialog, int whichButton) {
+ public void onClick(DialogInterface dialogInterface, int whichButton) {
((GroupEditorFragment) getTargetFragment()).doRevertAction();
}
}
@@ -571,19 +567,17 @@
* finishes the activity. This actually only handles saving the group name.
* @return true when successful
*/
- public boolean save(int saveMode) {
+ public boolean save() {
if (!hasValidGroupName() || mStatus != Status.EDITING) {
return false;
}
// If we are about to close the editor - there is no need to refresh the data
- if (saveMode == SaveMode.CLOSE) {
- getLoaderManager().destroyLoader(LOADER_EXISTING_MEMBERS);
- }
+ getLoaderManager().destroyLoader(LOADER_EXISTING_MEMBERS);
// If there are no changes, then go straight to onSaveCompleted()
if (!hasNameChange() && !hasMembershipChange()) {
- onSaveCompleted(false, SaveMode.CLOSE, mGroupUri);
+ onSaveCompleted(false, mGroupUri);
return true;
}
@@ -623,50 +617,40 @@
return true;
}
- public void onSaveCompleted(boolean hadChanges, int saveMode, Uri groupUri) {
+ public void onSaveCompleted(boolean hadChanges, Uri groupUri) {
boolean success = groupUri != null;
- Log.d(TAG, "onSaveCompleted(" + saveMode + ", " + groupUri + ")");
+ Log.d(TAG, "onSaveCompleted(" + groupUri + ")");
if (hadChanges) {
Toast.makeText(mContext, success ? R.string.groupSavedToast :
R.string.groupSavedErrorToast, Toast.LENGTH_SHORT).show();
}
- switch (saveMode) {
- case SaveMode.CLOSE:
- case SaveMode.HOME:
- final Intent resultIntent;
- final int resultCode;
- if (success && groupUri != null) {
- final String requestAuthority =
- groupUri == null ? null : groupUri.getAuthority();
+ final Intent resultIntent;
+ final int resultCode;
+ if (success && groupUri != null) {
+ final String requestAuthority = groupUri.getAuthority();
- resultIntent = new Intent();
- if (LEGACY_CONTACTS_AUTHORITY.equals(requestAuthority)) {
- // Build legacy Uri when requested by caller
- final long groupId = ContentUris.parseId(groupUri);
- final Uri legacyContentUri = Uri.parse("content://contacts/groups");
- final Uri legacyUri = ContentUris.withAppendedId(
- legacyContentUri, groupId);
- resultIntent.setData(legacyUri);
- } else {
- // Otherwise pass back the given Uri
- resultIntent.setData(groupUri);
- }
+ resultIntent = new Intent();
+ if (LEGACY_CONTACTS_AUTHORITY.equals(requestAuthority)) {
+ // Build legacy Uri when requested by caller
+ final long groupId = ContentUris.parseId(groupUri);
+ final Uri legacyContentUri = Uri.parse("content://contacts/groups");
+ final Uri legacyUri = ContentUris.withAppendedId(
+ legacyContentUri, groupId);
+ resultIntent.setData(legacyUri);
+ } else {
+ // Otherwise pass back the given Uri
+ resultIntent.setData(groupUri);
+ }
- resultCode = Activity.RESULT_OK;
- } else {
- resultCode = Activity.RESULT_CANCELED;
- resultIntent = null;
- }
- // It is already saved, so prevent that it is saved again
- mStatus = Status.CLOSING;
- if (mListener != null) {
- mListener.onSaveFinished(resultCode, resultIntent);
- }
- break;
- case SaveMode.RELOAD:
- // TODO: Handle reloading the group list
- default:
- throw new IllegalStateException("Unsupported save mode " + saveMode);
+ resultCode = Activity.RESULT_OK;
+ } else {
+ resultCode = Activity.RESULT_CANCELED;
+ resultIntent = null;
+ }
+ // It is already saved, so prevent that it is saved again
+ mStatus = Status.CLOSING;
+ if (mListener != null) {
+ mListener.onSaveFinished(resultCode, resultIntent);
}
}
@@ -853,7 +837,6 @@
* This represents a single member of the current group.
*/
public static class Member implements Parcelable {
- private static final Member[] EMPTY_ARRAY = new Member[0];
// TODO: Switch to just dealing with raw contact IDs everywhere if possible
private final long mRawContactId;
@@ -895,11 +878,16 @@
public boolean equals(Object object) {
if (object instanceof Member) {
Member otherMember = (Member) object;
- return otherMember != null && Objects.equal(mLookupUri, otherMember.getLookupUri());
+ return Objects.equal(mLookupUri, otherMember.getLookupUri());
}
return false;
}
+ @Override
+ public int hashCode() {
+ return mLookupUri == null ? 0 : mLookupUri.hashCode();
+ }
+
// Parcelable
@Override
public int describeContents() {
@@ -924,10 +912,12 @@
}
public static final Parcelable.Creator<Member> CREATOR = new Parcelable.Creator<Member>() {
+ @Override
public Member createFromParcel(Parcel in) {
return new Member(in);
}
+ @Override
public Member[] newArray(int size) {
return new Member[size];
}
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index 7e880a4..4aa4030 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -274,7 +274,6 @@
private void showDialog(int messageId, final Uri contactUri) {
mDialog = new AlertDialog.Builder(getActivity())
- .setTitle(R.string.deleteConfirmation_title)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(messageId)
.setNegativeButton(android.R.string.cancel, null)
diff --git a/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java b/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
index c1f3bd7..09306f2 100644
--- a/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
+++ b/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
@@ -52,7 +52,6 @@
return new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.delete_group_dialog_title)
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
diff --git a/src/com/android/contacts/interactions/ImportExportDialogFragment.java b/src/com/android/contacts/interactions/ImportExportDialogFragment.java
index 7fdc47e..521d2f0 100644
--- a/src/com/android/contacts/interactions/ImportExportDialogFragment.java
+++ b/src/com/android/contacts/interactions/ImportExportDialogFragment.java
@@ -55,14 +55,18 @@
public static final String TAG = "ImportExportDialogFragment";
private static final String KEY_RES_ID = "resourceId";
+ private static final String ARG_CONTACTS_ARE_AVAILABLE = "CONTACTS_ARE_AVAILABLE";
private final String[] LOOKUP_PROJECTION = new String[] {
Contacts.LOOKUP_KEY
};
/** Preferred way to show this dialog */
- public static void show(FragmentManager fragmentManager) {
+ public static void show(FragmentManager fragmentManager, boolean contactsAreAvailable) {
final ImportExportDialogFragment fragment = new ImportExportDialogFragment();
+ Bundle args = new Bundle();
+ args.putBoolean(ARG_CONTACTS_ARE_AVAILABLE, contactsAreAvailable);
+ fragment.setArguments(args);
fragment.show(fragmentManager, ImportExportDialogFragment.TAG);
}
@@ -72,6 +76,7 @@
final Resources res = getActivity().getResources();
final LayoutInflater dialogInflater = (LayoutInflater)getActivity()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ final boolean contactsAreAvailable = getArguments().getBoolean(ARG_CONTACTS_ARE_AVAILABLE);
// Adapter that shows a list of string resources
final ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(getActivity(),
@@ -95,10 +100,14 @@
adapter.add(R.string.import_from_sdcard);
}
if (res.getBoolean(R.bool.config_allow_export_to_sdcard)) {
- adapter.add(R.string.export_to_sdcard);
+ if (contactsAreAvailable) {
+ adapter.add(R.string.export_to_sdcard);
+ }
}
if (res.getBoolean(R.bool.config_allow_share_visible_contacts)) {
- adapter.add(R.string.share_visible_contacts);
+ if (contactsAreAvailable) {
+ adapter.add(R.string.share_visible_contacts);
+ }
}
final DialogInterface.OnClickListener clickListener =
@@ -136,7 +145,9 @@
}
};
return new AlertDialog.Builder(getActivity())
- .setTitle(R.string.dialog_import_export)
+ .setTitle(contactsAreAvailable
+ ? R.string.dialog_import_export
+ : R.string.dialog_import)
.setSingleChoiceItems(adapter, -1, clickListener)
.create();
}
diff --git a/src/com/android/contacts/interactions/PhoneNumberInteraction.java b/src/com/android/contacts/interactions/PhoneNumberInteraction.java
index 4c75896..401cbb1 100644
--- a/src/com/android/contacts/interactions/PhoneNumberInteraction.java
+++ b/src/com/android/contacts/interactions/PhoneNumberInteraction.java
@@ -47,6 +47,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
@@ -65,6 +66,11 @@
* Initiates phone calls or a text message. If there are multiple candidates, this class shows a
* dialog to pick one. Creating one of these interactions should be done through the static
* factory methods.
+ *
+ * Note that this class initiates not only usual *phone* calls but also *SIP* calls.
+ *
+ * TODO: clean up code and documents since it is quite confusing to use "phone numbers" or
+ * "phone calls" here while they can be SIP addresses or SIP calls (See also issue 5039627).
*/
public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
private static final String TAG = PhoneNumberInteraction.class.getSimpleName();
@@ -86,6 +92,8 @@
String dataSet;
long type;
String label;
+ /** {@link Phone#CONTENT_ITEM_TYPE} or {@link SipAddress#CONTENT_ITEM_TYPE}. */
+ String mimeType;
public PhoneItem() {
}
@@ -97,6 +105,7 @@
this.dataSet = in.readString();
this.type = in.readLong();
this.label = in.readString();
+ this.mimeType = in.readString();
}
public void writeToParcel(Parcel dest, int flags) {
@@ -106,6 +115,7 @@
dest.writeString(dataSet);
dest.writeLong(type);
dest.writeString(label);
+ dest.writeString(mimeType);
}
public int describeContents() {
@@ -260,11 +270,15 @@
RawContacts.ACCOUNT_TYPE,
RawContacts.DATA_SET,
Phone.TYPE,
- Phone.LABEL
+ Phone.LABEL,
+ Phone.MIMETYPE
};
- private static final String PHONE_NUMBER_SELECTION = Data.MIMETYPE + "='"
- + Phone.CONTENT_ITEM_TYPE + "' AND " + Phone.NUMBER + " NOT NULL";
+ private static final String PHONE_NUMBER_SELECTION =
+ Data.MIMETYPE + " IN ('"
+ + Phone.CONTENT_ITEM_TYPE + "', "
+ + "'" + SipAddress.CONTENT_ITEM_TYPE + "') AND "
+ + Data.DATA1 + " NOT NULL";
private final Context mContext;
private final OnDismissListener mDismissListener;
@@ -308,11 +322,7 @@
Intent.ACTION_SENDTO, Uri.fromParts("sms", phoneNumber, null));
break;
default:
- intent = new Intent(
- Intent.ACTION_CALL_PRIVILEGED, Uri.fromParts("tel", phoneNumber, null));
- if (callOrigin != null) {
- intent.putExtra(DialtactsActivity.EXTRA_CALL_ORIGIN, callOrigin);
- }
+ intent = ContactsUtils.getCallIntent(phoneNumber, callOrigin);
break;
}
context.startActivity(intent);
@@ -378,6 +388,7 @@
item.dataSet = cursor.getString(cursor.getColumnIndex(RawContacts.DATA_SET));
item.type = cursor.getInt(cursor.getColumnIndex(Phone.TYPE));
item.label = cursor.getString(cursor.getColumnIndex(Phone.LABEL));
+ item.mimeType = cursor.getString(cursor.getColumnIndex(Phone.MIMETYPE));
phoneList.add(item);
}
@@ -396,8 +407,9 @@
if (phoneList.size() == 0) {
onDismiss();
} else if (phoneList.size() == 1) {
+ PhoneItem item = phoneList.get(0);
onDismiss();
- performAction(phoneList.get(0).phoneNumber);
+ performAction(item.phoneNumber);
} else {
// There are multiple candidates. Let the user choose one.
showDisambiguationDialog(phoneList);
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
index 14db634..2624e5d 100644
--- a/src/com/android/contacts/list/AccountFilterActivity.java
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -56,11 +56,14 @@
private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 0;
public static final String KEY_EXTRA_CONTACT_LIST_FILTER = "contactListFilter";
+ public static final String KEY_EXTRA_CURRENT_FILTER = "currentFilter";
private static final int FILTER_LOADER_ID = 0;
private ListView mListView;
+ private ContactListFilter mCurrentFilter;
+
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -74,6 +77,8 @@
actionBar.setDisplayHomeAsUpEnabled(true);
}
+ mCurrentFilter = getIntent().getParcelableExtra(KEY_EXTRA_CURRENT_FILTER);
+
getLoaderManager().initLoader(FILTER_LOADER_ID, null, new MyLoaderCallbacks());
}
@@ -151,7 +156,8 @@
Log.e(TAG, "Failed to load filters");
return;
}
- mListView.setAdapter(new FilterListAdapter(AccountFilterActivity.this, data));
+ mListView.setAdapter(
+ new FilterListAdapter(AccountFilterActivity.this, data, mCurrentFilter));
}
@Override
@@ -197,11 +203,16 @@
private static class FilterListAdapter extends BaseAdapter {
private final List<ContactListFilter> mFilters;
private final LayoutInflater mLayoutInflater;
+ private final AccountTypeManager mAccountTypes;
+ private final ContactListFilter mCurrentFilter;
- public FilterListAdapter(Context context, List<ContactListFilter> filters) {
+ public FilterListAdapter(
+ Context context, List<ContactListFilter> filters, ContactListFilter current) {
mLayoutInflater = (LayoutInflater) context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
mFilters = filters;
+ mCurrentFilter = current;
+ mAccountTypes = AccountTypeManager.getInstance(context);
}
@Override
@@ -230,8 +241,9 @@
view.setSingleAccount(mFilters.size() == 1);
final ContactListFilter filter = mFilters.get(position);
view.setContactListFilter(filter);
- view.bindView(true);
+ view.bindView(mAccountTypes);
view.setTag(filter);
+ view.setActivated(filter.equals(mCurrentFilter));
return view;
}
}
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 4c38efb..a2b61c7 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -300,7 +300,7 @@
* Sets the new selection for the list.
*/
public void setSelectedContactUri(Uri uri) {
- setSelectedContactUri(uri, true, true, true, false);
+ setSelectedContactUri(uri, true, false /* no smooth scroll */, true, false);
}
@Override
diff --git a/src/com/android/contacts/list/ContactEntryListAdapter.java b/src/com/android/contacts/list/ContactEntryListAdapter.java
index 9c36f05..ac4d399 100644
--- a/src/com/android/contacts/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/list/ContactEntryListAdapter.java
@@ -18,7 +18,6 @@
import com.android.contacts.ContactPhotoManager;
import com.android.contacts.R;
import com.android.contacts.widget.IndexerListAdapter;
-import com.android.contacts.widget.TextWithHighlightingFactory;
import android.content.Context;
import android.content.CursorLoader;
@@ -54,13 +53,8 @@
*/
private static final boolean LOCAL_INVISIBLE_DIRECTORY_ENABLED = false;
- /**
- * The animation is used here to allocate animated name text views.
- */
- private TextWithHighlightingFactory mTextWithHighlightingFactory;
private int mDisplayOrder;
private int mSortOrder;
- private boolean mNameHighlightingEnabled;
private boolean mDisplayPhotos;
private boolean mQuickContactEnabled;
@@ -136,6 +130,28 @@
return partition;
}
+ /**
+ * Remove all directories after the default directory. This is typically used when contacts
+ * list screens are asked to exit the search mode and thus need to remove all remote directory
+ * results for the search.
+ *
+ * This code assumes that the default directory and directories before that should not be
+ * deleted (e.g. Join screen has "suggested contacts" directory before the default director,
+ * and we should not remove the directory).
+ */
+ /* package */ void removeDirectoriesAfterDefault() {
+ final int partitionCount = getPartitionCount();
+ for (int i = partitionCount - 1; i >= 0; i--) {
+ final Partition partition = getPartition(i);
+ if ((partition instanceof DirectoryPartition)
+ && ((DirectoryPartition) partition).getDirectoryId() == Directory.DEFAULT) {
+ break;
+ } else {
+ removePartition(i);
+ }
+ }
+ }
+
private int getPartitionByDirectoryId(long id) {
int count = getPartitionCount();
for (int i = 0; i < count; i++) {
@@ -602,8 +618,16 @@
// TODO: move sharable logic (bindXX() methods) to here with extra arguments
+ /**
+ * Loads the photo for the quick contact view and assigns the contact uri.
+ * @param photoIdColumn Index of the photo id column
+ * @param photoUriColumn Index of the photo uri column. Optional: Can be -1
+ * @param contactIdColumn Index of the contact id column
+ * @param lookUpKeyColumn Index of the lookup key column
+ */
protected void bindQuickContact(final ContactListItemView view, int partitionIndex,
- Cursor cursor, int photoIdColumn, int contactIdColumn, int lookUpKeyColumn) {
+ Cursor cursor, int photoIdColumn, int photoUriColumn, int contactIdColumn,
+ int lookUpKeyColumn) {
long photoId = 0;
if (!cursor.isNull(photoIdColumn)) {
photoId = cursor.getLong(photoIdColumn);
@@ -612,7 +636,15 @@
QuickContactBadge quickContact = view.getQuickContact();
quickContact.assignContactUri(
getContactUri(partitionIndex, cursor, contactIdColumn, lookUpKeyColumn));
- getPhotoLoader().loadPhoto(quickContact, photoId, false, mDarkTheme);
+
+ if (photoId != 0 || photoUriColumn == -1) {
+ getPhotoLoader().loadPhoto(quickContact, photoId, false, mDarkTheme);
+ } else {
+ final String photoUriString = cursor.getString(photoUriColumn);
+ final Uri photoUri = photoUriString == null ? null : Uri.parse(photoUriString);
+ getPhotoLoader().loadPhoto(quickContact, photoUri, false, mDarkTheme);
+ }
+
}
protected Uri getContactUri(int partitionIndex, Cursor cursor,
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 8db477e..5ee25a2 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -613,12 +613,10 @@
mAdapter.clearPartitions();
if (!flag) {
- // If we are switching from search to regular display,
- // remove all directory partitions (except the default one).
- int count = mAdapter.getPartitionCount();
- for (int i = count; --i >= 1;) {
- mAdapter.removePartition(i);
- }
+ // If we are switching from search to regular display, remove all directory
+ // partitions after default one, assuming they are remote directories which
+ // should be cleaned up on exiting the search mode.
+ mAdapter.removeDirectoriesAfterDefault();
}
mAdapter.configureDefaultPartition(false, flag);
}
diff --git a/src/com/android/contacts/list/ContactListAdapter.java b/src/com/android/contacts/list/ContactListAdapter.java
index a8caf3b..81fcb84 100644
--- a/src/com/android/contacts/list/ContactListAdapter.java
+++ b/src/com/android/contacts/list/ContactListAdapter.java
@@ -23,7 +23,6 @@
import android.provider.ContactsContract;
import android.provider.ContactsContract.ContactCounts;
import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Directory;
import android.provider.ContactsContract.SearchSnippetColumns;
import android.text.TextUtils;
diff --git a/src/com/android/contacts/list/ContactListFilter.java b/src/com/android/contacts/list/ContactListFilter.java
index 07319f9..172cbe2 100644
--- a/src/com/android/contacts/list/ContactListFilter.java
+++ b/src/com/android/contacts/list/ContactListFilter.java
@@ -18,8 +18,10 @@
import android.content.SharedPreferences;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
+import android.provider.ContactsContract.RawContacts;
import android.text.TextUtils;
/**
@@ -252,6 +254,23 @@
return mId;
}
+ /**
+ * Adds the account query parameters to the given {@code uriBuilder}.
+ *
+ * @throws IllegalStateException if the filter type is not {@link #FILTER_TYPE_ACCOUNT}.
+ */
+ public Uri.Builder addAccountQueryParameterToUrl(Uri.Builder uriBuilder) {
+ if (filterType != FILTER_TYPE_ACCOUNT) {
+ throw new IllegalStateException("filterType must be FILTER_TYPE_ACCOUNT");
+ }
+ uriBuilder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName);
+ uriBuilder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType);
+ if (!TextUtils.isEmpty(dataSet)) {
+ uriBuilder.appendQueryParameter(RawContacts.DATA_SET, dataSet);
+ }
+ return uriBuilder;
+ }
+
public String toDebugString() {
final StringBuilder builder = new StringBuilder();
builder.append("[filter type: " + filterType + " (" + filterTypeToString(filterType) + ")");
diff --git a/src/com/android/contacts/list/ContactListFilterController.java b/src/com/android/contacts/list/ContactListFilterController.java
index 8126c62..9f483f1 100644
--- a/src/com/android/contacts/list/ContactListFilterController.java
+++ b/src/com/android/contacts/list/ContactListFilterController.java
@@ -50,6 +50,9 @@
public abstract void removeListener(ContactListFilterListener listener);
+ /**
+ * Return the currently-active filter.
+ */
public abstract ContactListFilter getFilter();
/**
diff --git a/src/com/android/contacts/list/ContactListFilterView.java b/src/com/android/contacts/list/ContactListFilterView.java
index 398a864..020952d 100644
--- a/src/com/android/contacts/list/ContactListFilterView.java
+++ b/src/com/android/contacts/list/ContactListFilterView.java
@@ -17,13 +17,18 @@
package com.android.contacts.list;
import com.android.contacts.R;
+import com.android.contacts.editor.ContactEditorFragment;
+import com.android.contacts.model.AccountType;
+import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.util.ThemeUtils;
import android.content.Context;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
+import android.widget.RadioButton;
import android.widget.TextView;
/**
@@ -31,12 +36,14 @@
*/
public class ContactListFilterView extends LinearLayout {
+ private static final String TAG = ContactListFilterView.class.getSimpleName();
+
private ImageView mIcon;
- private TextView mLabel;
- private View mIndent;
+ private TextView mAccountType;
+ private TextView mAccountUserName;
+ private RadioButton mRadioButton;
private ContactListFilter mFilter;
private boolean mSingleAccount;
- private int mActivatedBackground;
public ContactListFilterView(Context context) {
super(context);
@@ -58,78 +65,80 @@
this.mSingleAccount = flag;
}
- public void bindView(boolean dropdown) {
- if (dropdown) {
- if (mActivatedBackground == 0) {
- mActivatedBackground = ThemeUtils.getActivatedBackground(getContext().getTheme());
- }
- setBackgroundResource(mActivatedBackground);
+ @Override
+ public void setActivated(boolean activated) {
+ super.setActivated(activated);
+ if (mRadioButton != null) {
+ mRadioButton.setChecked(activated);
+ } else {
+ // We're guarding against null-pointer exceptions,
+ // but otherwise this code is not expected to work
+ // properly if the button hasn't been initialized.
+ Log.wtf(TAG, "radio-button cannot be activated because it is null");
}
+ }
- if (mLabel == null) {
+ public void bindView(AccountTypeManager accountTypes) {
+ if (mAccountType == null) {
mIcon = (ImageView) findViewById(R.id.icon);
- mLabel = (TextView) findViewById(R.id.label);
- mIndent = findViewById(R.id.indent);
+ mAccountType = (TextView) findViewById(R.id.accountType);
+ mAccountUserName = (TextView) findViewById(R.id.accountUserName);
+ mRadioButton = (RadioButton) findViewById(R.id.radioButton);
+ mRadioButton.setChecked(isActivated());
}
if (mFilter == null) {
- mLabel.setText(R.string.contactsList);
+ mAccountType.setText(R.string.contactsList);
return;
}
+ mAccountUserName.setVisibility(View.GONE);
switch (mFilter.filterType) {
case ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS: {
- bindView(R.drawable.ic_menu_contacts_holo_light, R.string.list_filter_all_accounts,
- dropdown);
+ bindView(0, R.string.list_filter_all_accounts);
break;
}
case ContactListFilter.FILTER_TYPE_STARRED: {
- bindView(R.drawable.ic_menu_star_holo_light, R.string.list_filter_all_starred,
- dropdown);
+ bindView(R.drawable.ic_menu_star_holo_light, R.string.list_filter_all_starred);
break;
}
case ContactListFilter.FILTER_TYPE_CUSTOM: {
- bindView(R.drawable.ic_menu_settings_holo_light,
- dropdown ? R.string.list_filter_customize : R.string.list_filter_custom,
- dropdown);
+ bindView(R.drawable.ic_menu_settings_holo_light, R.string.list_filter_customize);
break;
}
case ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY: {
- bindView(0, R.string.list_filter_phones, dropdown);
+ bindView(0, R.string.list_filter_phones);
break;
}
case ContactListFilter.FILTER_TYPE_SINGLE_CONTACT: {
- bindView(0, R.string.list_filter_single, dropdown);
+ bindView(0, R.string.list_filter_single);
break;
}
case ContactListFilter.FILTER_TYPE_ACCOUNT: {
+ mAccountUserName.setVisibility(View.VISIBLE);
mIcon.setVisibility(View.VISIBLE);
if (mFilter.icon != null) {
mIcon.setImageDrawable(mFilter.icon);
} else {
mIcon.setImageResource(R.drawable.unknown_source);
}
- mLabel.setText(mFilter.accountName);
- if (dropdown) {
- mIndent.setVisibility(View.GONE);
- }
+ final AccountType accountType =
+ accountTypes.getAccountType(mFilter.accountType, mFilter.dataSet);
+ mAccountUserName.setText(mFilter.accountName);
+ mAccountType.setText(accountType.getDisplayLabel(getContext()));
break;
}
}
}
- private void bindView(int iconResource, int textResource, boolean dropdown) {
+ private void bindView(int iconResource, int textResource) {
if (iconResource != 0) {
mIcon.setVisibility(View.VISIBLE);
mIcon.setImageResource(iconResource);
} else {
- mIcon.setVisibility(dropdown ? View.INVISIBLE : View.GONE);
+ mIcon.setVisibility(View.GONE);
}
- mLabel.setText(textResource);
-
- if (mIndent != null) {
- mIndent.setVisibility(View.GONE);
- }
+ mAccountType.setText(textResource);
}
}
diff --git a/src/com/android/contacts/list/ContactTileAdapter.java b/src/com/android/contacts/list/ContactTileAdapter.java
index 490cd92..26df446 100644
--- a/src/com/android/contacts/list/ContactTileAdapter.java
+++ b/src/com/android/contacts/list/ContactTileAdapter.java
@@ -50,7 +50,7 @@
private static final String TAG = ContactTileAdapter.class.getSimpleName();
private DisplayType mDisplayType;
- private Listener mListener;
+ private ContactTileView.Listener mListener;
private Context mContext;
private Resources mResources;
private Cursor mContactCursor = null;
@@ -114,7 +114,7 @@
GROUP_MEMBERS
}
- public ContactTileAdapter(Context context, Listener listener, int numCols,
+ public ContactTileAdapter(Context context, ContactTileView.Listener listener, int numCols,
DisplayType displayType) {
mListener = listener;
mContext = context;
@@ -474,16 +474,6 @@
return getRowCount(mDividerPosition);
}
- private ContactTileView.Listener mContactTileListener = new ContactTileView.Listener() {
- @Override
- public void onClick(ContactTileView contactTileView) {
- if (mListener != null) {
- mListener.onContactSelected(contactTileView.getLookupUri(),
- ContactsUtils.getTargetRectFromView(mContext, contactTileView));
- }
- }
- };
-
/**
* Acts as a row item composed of {@link ContactTileView}
*
@@ -531,7 +521,7 @@
0);
contactTile.setLayoutParams(params);
contactTile.setPhotoManager(mPhotoManager);
- contactTile.setListener(mContactTileListener);
+ contactTile.setListener(mListener);
addView(contactTile);
} else {
contactTile = (ContactTileView) getChildAt(childIndex);
@@ -667,8 +657,4 @@
public static final int FREQUENT = 2;
public static final int STARRED_WITH_SECONDARY_ACTION = 3;
}
-
- public interface Listener {
- public void onContactSelected(Uri contactUri, Rect targetRect);
- }
}
diff --git a/src/com/android/contacts/list/ContactTileDarkFrequentView.java b/src/com/android/contacts/list/ContactTileDarkFrequentView.java
deleted file mode 100644
index 78f45bd..0000000
--- a/src/com/android/contacts/list/ContactTileDarkFrequentView.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.contacts.list;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-/**
- * A dark version of the {@link ContactTileView} (This class is needed to load the proper avatar)
- */
-public class ContactTileDarkFrequentView extends ContactTileView {
- public ContactTileDarkFrequentView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected boolean isDarkTheme() {
- return true;
- }
-}
diff --git a/src/com/android/contacts/list/ContactTileListFragment.java b/src/com/android/contacts/list/ContactTileListFragment.java
index d4d961b..fbd7fec 100644
--- a/src/com/android/contacts/list/ContactTileListFragment.java
+++ b/src/com/android/contacts/list/ContactTileListFragment.java
@@ -49,7 +49,8 @@
private static final String TAG = ContactTileListFragment.class.getSimpleName();
public interface Listener {
- public void onContactSelected(Uri contactUri, Rect targetRect);
+ void onContactSelected(Uri contactUri, Rect targetRect);
+ void onCallNumberDirectly(String phoneNumber);
}
private static int LOADER_CONTACTS = 1;
@@ -94,8 +95,7 @@
@Override
public void onStart() {
super.onStart();
- // TODO: Use initLoader?
- getLoaderManager().restartLoader(LOADER_CONTACTS, null, mContactTileLoaderListener);
+ getLoaderManager().initLoader(LOADER_CONTACTS, null, mContactTileLoaderListener);
}
public void setColumnCount(int columnCount) {
@@ -164,13 +164,20 @@
mListener = listener;
}
- private ContactTileAdapter.Listener mAdapterListener =
- new ContactTileAdapter.Listener() {
+ private ContactTileView.Listener mAdapterListener =
+ new ContactTileView.Listener() {
@Override
public void onContactSelected(Uri contactUri, Rect targetRect) {
if (mListener != null) {
mListener.onContactSelected(contactUri, targetRect);
}
}
+
+ @Override
+ public void onCallNumberDirectly(String phoneNumber) {
+ if (mListener != null) {
+ mListener.onCallNumberDirectly(phoneNumber);
+ }
+ }
};
}
diff --git a/src/com/android/contacts/list/ContactTilePhoneFrequentView.java b/src/com/android/contacts/list/ContactTilePhoneFrequentView.java
new file mode 100644
index 0000000..d924b03
--- /dev/null
+++ b/src/com/android/contacts/list/ContactTilePhoneFrequentView.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts.list;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.text.TextUtils;
+
+import com.android.contacts.ContactsUtils;
+import com.android.contacts.list.ContactTileAdapter.ContactEntry;
+
+/**
+ * A dark version of the {@link ContactTileView} that is used in Dialtacts
+ * for frequently called contacts. Slightly different behavior from superclass...
+ * when you tap it, you want to call the frequently-called number for the
+ * contact, even if that is not the default number for that contact.
+ */
+public class ContactTilePhoneFrequentView extends ContactTileView {
+ private String mPhoneNumberString;
+
+ public ContactTilePhoneFrequentView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected boolean isDarkTheme() {
+ return true;
+ }
+
+ @Override
+ public void loadFromContact(ContactEntry entry) {
+ super.loadFromContact(entry);
+ mPhoneNumberString = null; // ... in case we're reusing the view
+ if (entry != null) {
+ // Grab the phone-number to call directly... see {@link onClick()}
+ mPhoneNumberString = entry.phoneNumber;
+ }
+ }
+
+ @Override
+ protected OnClickListener createClickListener() {
+ return new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mListener == null) return;
+ if (TextUtils.isEmpty(mPhoneNumberString)) {
+ // Copy "superclass" implementation
+ mListener.onContactSelected(getLookupUri(), ContactsUtils.getTargetRectFromView(
+ mContext, ContactTilePhoneFrequentView.this));
+ } else {
+ // When you tap a frequently-called contact, you want to
+ // call them at the number that you usually talk to them
+ // at (i.e. the one displayed in the UI), regardless of
+ // whether that's their default number.
+ mListener.onCallNumberDirectly(mPhoneNumberString);
+ }
+ }
+ };
+ }
+}
diff --git a/src/com/android/contacts/list/ContactTileView.java b/src/com/android/contacts/list/ContactTileView.java
index 0b90c44..e73b9c1 100644
--- a/src/com/android/contacts/list/ContactTileView.java
+++ b/src/com/android/contacts/list/ContactTileView.java
@@ -16,10 +16,12 @@
package com.android.contacts.list;
import com.android.contacts.ContactPhotoManager;
+import com.android.contacts.ContactsUtils;
import com.android.contacts.R;
import com.android.contacts.list.ContactTileAdapter.ContactEntry;
import android.content.Context;
+import android.graphics.Rect;
import android.net.Uri;
import android.util.AttributeSet;
import android.util.Log;
@@ -45,7 +47,7 @@
private ContactPhotoManager mPhotoManager = null;
private View mPushState;
private View mHorizontalDivider;
- private Listener mListener;
+ protected Listener mListener;
public ContactTileView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -64,14 +66,8 @@
mPushState = findViewById(R.id.contact_tile_push_state);
mHorizontalDivider = findViewById(R.id.contact_tile_horizontal_divider);
- OnClickListener listener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mListener != null) {
- mListener.onClick(ContactTileView.this);
- }
- }
- };
+
+ OnClickListener listener = createClickListener();
if(mPushState != null) {
mPushState.setOnClickListener(listener);
@@ -80,6 +76,18 @@
}
}
+ protected OnClickListener createClickListener() {
+ return new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mListener == null) return;
+ mListener.onContactSelected(
+ getLookupUri(),
+ ContactsUtils.getTargetRectFromView(mContext, ContactTileView.this));
+ }
+ };
+ }
+
public void setPhotoManager(ContactPhotoManager photoManager) {
mPhotoManager = photoManager;
}
@@ -165,6 +173,13 @@
}
public interface Listener {
- void onClick(ContactTileView contactTileView);
+ /**
+ * Notification that the contact was selected; no specific action is dictated.
+ */
+ void onContactSelected(Uri contactLookupUri, Rect viewRect);
+ /**
+ * Notification that the specified number is to be called.
+ */
+ void onCallNumberDirectly(String phoneNumber);
}
}
diff --git a/src/com/android/contacts/list/ContactsIntentResolver.java b/src/com/android/contacts/list/ContactsIntentResolver.java
index 8d14591..9199766 100644
--- a/src/com/android/contacts/list/ContactsIntentResolver.java
+++ b/src/com/android/contacts/list/ContactsIntentResolver.java
@@ -18,6 +18,7 @@
import com.android.contacts.CallContactActivity;
import com.android.contacts.ContactsSearchManager;
+import com.android.contacts.ContactsUtils;
import android.app.Activity;
import android.app.SearchManager;
@@ -33,6 +34,7 @@
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Intents;
+import android.provider.ContactsContract.Intents.Insert;
import android.provider.ContactsContract.Intents.UI;
import android.text.TextUtils;
import android.util.Log;
@@ -124,16 +126,22 @@
} else if (Intent.ACTION_INSERT_OR_EDIT.equals(action)) {
request.setActionCode(ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT);
} else if (Intent.ACTION_SEARCH.equals(action)) {
+ String query = intent.getStringExtra(SearchManager.QUERY);
// See if the suggestion was clicked with a search action key (call button)
if ("call".equals(intent.getStringExtra(SearchManager.ACTION_MSG))) {
- String query = intent.getStringExtra(SearchManager.QUERY);
if (!TextUtils.isEmpty(query)) {
- Intent newIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts("tel", query, null));
- request.setRedirectIntent(newIntent);
+ request.setRedirectIntent(ContactsUtils.getCallIntent(query));
}
} else {
- request.setQueryString(intent.getStringExtra(SearchManager.QUERY));
+ // If the {@link SearchManager.QUERY} is empty, then check if a phone number
+ // or email is specified, in that priority.
+ if (TextUtils.isEmpty(query)) {
+ query = intent.getStringExtra(Insert.PHONE);
+ }
+ if (TextUtils.isEmpty(query)) {
+ query = intent.getStringExtra(Insert.EMAIL);
+ }
+ request.setQueryString(query);
request.setSearchMode(true);
}
} else if (Intent.ACTION_VIEW.equals(action)) {
@@ -182,7 +190,7 @@
intent.setData(null);
}
} else if (Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED.equals(action)) {
- request.setRedirectIntent(new Intent(Intent.ACTION_CALL_PRIVILEGED, intent.getData()));
+ request.setRedirectIntent(ContactsUtils.getCallIntent(intent.getData()));
} else if (Intents.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED.equals(action)) {
// TODO actually support this in EditContactActivity.
String number = intent.getData().getSchemeSpecificPart();
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 4bf1a04..79dec09 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -60,7 +60,9 @@
@Override
public void onClick(View view) {
AccountFilterUtil.startAccountFilterActivityForResult(
- DefaultContactBrowseListFragment.this, REQUEST_CODE_ACCOUNT_FILTER);
+ DefaultContactBrowseListFragment.this,
+ REQUEST_CODE_ACCOUNT_FILTER,
+ getFilter());
}
}
private OnClickListener mFilterHeaderClickListener = new FilterHeaderClickListener();
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index 348abb9..72a5c88 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -26,9 +26,7 @@
import android.net.Uri.Builder;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Directory;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.SearchSnippetColumns;
@@ -124,9 +122,13 @@
if (filter != null
&& filter.filterType != ContactListFilter.FILTER_TYPE_CUSTOM
&& filter.filterType != ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
- uri = uri.buildUpon().appendQueryParameter(
- ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
- .build();
+ final Uri.Builder builder = uri.buildUpon();
+ builder.appendQueryParameter(
+ ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT));
+ if (filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
+ filter.addAccountQueryParameterToUrl(builder);
+ }
+ uri = builder.build();
}
loader.setUri(uri);
@@ -172,22 +174,7 @@
break;
}
case ContactListFilter.FILTER_TYPE_ACCOUNT: {
- // TODO: avoid the use of private API
- selection.append(
- Contacts._ID + " IN ("
- + "SELECT DISTINCT " + RawContacts.CONTACT_ID
- + " FROM raw_contacts"
- + " WHERE " + RawContacts.ACCOUNT_TYPE + "=?"
- + " AND " + RawContacts.ACCOUNT_NAME + "=?");
- selectionArgs.add(filter.accountType);
- selectionArgs.add(filter.accountName);
- if (filter.dataSet != null) {
- selection.append(" AND " + RawContacts.DATA_SET + "=?");
- selectionArgs.add(filter.dataSet);
- } else {
- selection.append(" AND " + RawContacts.DATA_SET + " IS NULL");
- }
- selection.append(")");
+ // We use query parameters for account filter, so no selection to add here.
break;
}
}
@@ -209,7 +196,8 @@
if (isQuickContactEnabled()) {
bindQuickContact(view, partition, cursor, ContactQuery.CONTACT_PHOTO_ID,
- ContactQuery.CONTACT_ID, ContactQuery.CONTACT_LOOKUP_KEY);
+ ContactQuery.CONTACT_PHOTO_URI, ContactQuery.CONTACT_ID,
+ ContactQuery.CONTACT_LOOKUP_KEY);
} else {
bindPhoto(view, partition, cursor);
}
diff --git a/src/com/android/contacts/list/EmailAddressListAdapter.java b/src/com/android/contacts/list/EmailAddressListAdapter.java
index 93f435e..13853a1 100644
--- a/src/com/android/contacts/list/EmailAddressListAdapter.java
+++ b/src/com/android/contacts/list/EmailAddressListAdapter.java
@@ -78,6 +78,9 @@
builder.appendPath(TextUtils.isEmpty(query) ? "" : query);
} else {
builder = Email.CONTENT_URI.buildUpon();
+ if (isSectionHeaderDisplayEnabled()) {
+ builder.appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true");
+ }
}
builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
String.valueOf(directoryId));
@@ -97,11 +100,6 @@
}
}
- protected static Builder buildSectionIndexerUri(Uri uri) {
- return uri.buildUpon()
- .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true");
- }
-
@Override
public String getContactDisplayName(int position) {
return ((Cursor) getItem(position)).getString(EmailQuery.EMAIL_DISPLAY_NAME);
@@ -112,7 +110,7 @@
* position.
*/
public Uri getDataUri(int position) {
- long id = ((Cursor)getItem(position)).getLong(EmailQuery.EMAIL_ID);
+ long id = ((Cursor) getItem(position)).getLong(EmailQuery.EMAIL_ID);
return ContentUris.withAppendedId(Data.CONTENT_URI, id);
}
diff --git a/src/com/android/contacts/list/EmailAddressPickerFragment.java b/src/com/android/contacts/list/EmailAddressPickerFragment.java
index 14b6c23..13fe541 100644
--- a/src/com/android/contacts/list/EmailAddressPickerFragment.java
+++ b/src/com/android/contacts/list/EmailAddressPickerFragment.java
@@ -58,6 +58,13 @@
return inflater.inflate(R.layout.contact_list_content, null);
}
+ @Override
+ protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
+ super.onCreateView(inflater, container);
+
+ setVisibleScrollbarEnabled(!isLegacyCompatibilityMode());
+ }
+
private void pickEmailAddress(Uri uri) {
mListener.onPickEmailAddressAction(uri);
}
diff --git a/src/com/android/contacts/list/JoinContactListAdapter.java b/src/com/android/contacts/list/JoinContactListAdapter.java
index bfe8c53..80ddc83 100644
--- a/src/com/android/contacts/list/JoinContactListAdapter.java
+++ b/src/com/android/contacts/list/JoinContactListAdapter.java
@@ -20,7 +20,6 @@
import android.content.Context;
import android.content.CursorLoader;
import android.database.Cursor;
-import android.database.MatrixCursor;
import android.net.Uri;
import android.net.Uri.Builder;
import android.provider.ContactsContract;
@@ -53,7 +52,6 @@
@Override
protected void addPartitions() {
-
// Partition 0: suggestions
addPartition(false, true);
@@ -69,11 +67,11 @@
public void configureLoader(CursorLoader cursorLoader, long directoryId) {
JoinContactLoader loader = (JoinContactLoader) cursorLoader;
- Builder builder = Contacts.CONTENT_URI.buildUpon();
+ final Builder builder = Contacts.CONTENT_URI.buildUpon();
builder.appendEncodedPath(String.valueOf(mTargetContactId));
builder.appendEncodedPath(AggregationSuggestions.CONTENT_DIRECTORY);
- String filter = getQueryString();
+ final String filter = getQueryString();
if (!TextUtils.isEmpty(filter)) {
builder.appendEncodedPath(Uri.encode(filter));
}
@@ -84,13 +82,22 @@
// TODO simplify projection
loader.setProjection(getProjection(false));
- Uri allContactsUri = buildSectionIndexerUri(Contacts.CONTENT_URI).buildUpon()
+ final Uri allContactsUri;
+ if (!TextUtils.isEmpty(filter)) {
+ allContactsUri = buildSectionIndexerUri(Contacts.CONTENT_FILTER_URI).buildUpon()
+ .appendEncodedPath(Uri.encode(filter))
.appendQueryParameter(
ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
.build();
+ } else {
+ allContactsUri = buildSectionIndexerUri(Contacts.CONTENT_URI).buildUpon()
+ .appendQueryParameter(
+ ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
+ .build();
+ }
loader.setUri(allContactsUri);
loader.setSelection(Contacts._ID + "!=?");
- loader.setSelectionArgs(new String[]{String.valueOf(mTargetContactId)});
+ loader.setSelectionArgs(new String[]{ String.valueOf(mTargetContactId) });
if (getSortOrder() == ContactsContract.Preferences.SORT_ORDER_PRIMARY) {
loader.setSortOrder(Contacts.SORT_KEY_PRIMARY);
} else {
@@ -120,7 +127,7 @@
@Override
public int getViewTypeCount() {
- return super.getViewTypeCount() + 1;
+ return super.getViewTypeCount();
}
@Override
@@ -173,14 +180,14 @@
protected void bindView(View itemView, int partition, Cursor cursor, int position) {
switch (partition) {
case PARTITION_SUGGESTIONS: {
- final ContactListItemView view = (ContactListItemView)itemView;
+ final ContactListItemView view = (ContactListItemView) itemView;
view.setSectionHeader(null);
bindPhoto(view, partition, cursor);
bindName(view, cursor);
break;
}
case PARTITION_ALL_CONTACTS: {
- final ContactListItemView view = (ContactListItemView)itemView;
+ final ContactListItemView view = (ContactListItemView) itemView;
bindSectionHeaderAndDivider(view, position, cursor);
bindPhoto(view, partition, cursor);
bindName(view, cursor);
diff --git a/src/com/android/contacts/list/JoinContactListFragment.java b/src/com/android/contacts/list/JoinContactListFragment.java
index 5b27bdf..7c6767b 100644
--- a/src/com/android/contacts/list/JoinContactListFragment.java
+++ b/src/com/android/contacts/list/JoinContactListFragment.java
@@ -26,6 +26,7 @@
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -103,7 +104,10 @@
configureAdapter();
getLoaderManager().initLoader(DISPLAY_NAME_LOADER, null, mLoaderCallbacks);
- getLoaderManager().initLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS,
+
+ // When this method is called, Uri to be used may be changed. We should use restartLoader()
+ // to load the parameter again.
+ getLoaderManager().restartLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS,
null, mLoaderCallbacks);
}
@@ -167,4 +171,11 @@
mTargetContactId = savedState.getLong(KEY_TARGET_CONTACT_ID);
}
}
+
+ @Override
+ public void setQueryString(String queryString, boolean delaySelection) {
+ super.setQueryString(queryString, delaySelection);
+
+ setSearchMode(!TextUtils.isEmpty(queryString));
+ }
}
diff --git a/src/com/android/contacts/list/JoinContactLoader.java b/src/com/android/contacts/list/JoinContactLoader.java
index 2f1f9b0..c43560e 100644
--- a/src/com/android/contacts/list/JoinContactLoader.java
+++ b/src/com/android/contacts/list/JoinContactLoader.java
@@ -20,6 +20,7 @@
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
+import android.util.Log;
/**
* A specialized loader for the Join Contacts UI. It executes two queries:
@@ -29,7 +30,7 @@
private String[] mProjection;
private Uri mSuggestionUri;
- private MatrixCursor mSuggestionsCursor;
+ private Cursor mSuggestionsCursor;
public JoinContactLoader(Context context) {
super(context, null, null, null, null, null);
@@ -53,28 +54,8 @@
public Cursor loadInBackground() {
// First execute the suggestions query, then call super.loadInBackground
// to load the entire list
- mSuggestionsCursor = loadSuggestions();
+ mSuggestionsCursor = getContext().getContentResolver()
+ .query(mSuggestionUri, mProjection, null, null, null);
return super.loadInBackground();
}
-
- /**
- * Loads join suggestions into a MatrixCursor.
- */
- private MatrixCursor loadSuggestions() {
- Cursor cursor = getContext().getContentResolver().query(mSuggestionUri, mProjection,
- null, null, null);
- try {
- MatrixCursor matrix = new MatrixCursor(mProjection);
- Object[] row = new Object[mProjection.length];
- while (cursor.moveToNext()) {
- for (int i = 0; i < row.length; i++) {
- row[i] = cursor.getString(i);
- }
- matrix.addRow(row);
- }
- return matrix;
- } finally {
- cursor.close();
- }
- }
}
\ No newline at end of file
diff --git a/src/com/android/contacts/list/PhoneFavoriteFragment.java b/src/com/android/contacts/list/PhoneFavoriteFragment.java
index 7073a57..c24af93 100644
--- a/src/com/android/contacts/list/PhoneFavoriteFragment.java
+++ b/src/com/android/contacts/list/PhoneFavoriteFragment.java
@@ -18,6 +18,7 @@
import com.android.contacts.ContactPhotoManager;
import com.android.contacts.ContactTileLoaderFactory;
import com.android.contacts.R;
+import com.android.contacts.interactions.ImportExportDialogFragment;
import com.android.contacts.preference.ContactsPreferences;
import com.android.contacts.util.AccountFilterUtil;
@@ -32,9 +33,14 @@
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
+import android.provider.ContactsContract;
import android.provider.ContactsContract.Directory;
+import android.provider.Settings;
import android.util.Log;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
@@ -69,6 +75,7 @@
public interface Listener {
public void onContactSelected(Uri contactUri);
+ public void onCallNumberDirectly(String phoneNumber);
}
private class ContactTileLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {
@@ -130,20 +137,29 @@
}
}
- private class ContactTileAdapterListener implements ContactTileAdapter.Listener {
+ private class ContactTileAdapterListener implements ContactTileView.Listener {
@Override
public void onContactSelected(Uri contactUri, Rect targetRect) {
if (mListener != null) {
mListener.onContactSelected(contactUri);
}
}
+
+ @Override
+ public void onCallNumberDirectly(String phoneNumber) {
+ if (mListener != null) {
+ mListener.onCallNumberDirectly(phoneNumber);
+ }
+ }
}
private class FilterHeaderClickListener implements OnClickListener {
@Override
public void onClick(View view) {
AccountFilterUtil.startAccountFilterActivityForResult(
- PhoneFavoriteFragment.this, REQUEST_CODE_ACCOUNT_FILTER);
+ PhoneFavoriteFragment.this,
+ REQUEST_CODE_ACCOUNT_FILTER,
+ mFilter);
}
}
@@ -204,7 +220,7 @@
private FrameLayout mAccountFilterHeaderContainer;
private View mAccountFilterHeader;
- private final ContactTileAdapter.Listener mContactTileAdapterListener =
+ private final ContactTileView.Listener mContactTileAdapterListener =
new ContactTileAdapterListener();
private final LoaderManager.LoaderCallbacks<Cursor> mContactTileLoaderListener =
new ContactTileLoaderListener();
@@ -221,6 +237,7 @@
if (savedState != null) {
mFilter = savedState.getParcelable(KEY_FILTER);
}
+ setHasOptionsMenu(true);
}
@Override
@@ -300,6 +317,8 @@
// Put photos on left for consistency with "frequent" contacts section.
mAllContactsAdapter.setPhotoPosition(ContactListItemView.PhotoPosition.LEFT);
+ mAllContactsAdapter.setUseCallableUri(true);
+
if (mFilter != null) {
mAllContactsAdapter.setFilter(mFilter);
}
@@ -318,6 +337,34 @@
}
@Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+ inflater.inflate(R.menu.phone_favorite_options, menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_import_export:
+ // We hard-code the "contactsAreAvailable" argument because doing it properly would
+ // involve querying a {@link ProviderStatusLoader}, which we don't want to do right
+ // now in Dialtacts for (potential) performance reasons. Compare with how it is
+ // done in {@link PeopleActivity}.
+ ImportExportDialogFragment.show(getFragmentManager(), true);
+ return true;
+ case R.id.menu_accounts:
+ final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
+ intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
+ ContactsContract.AUTHORITY
+ });
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ startActivity(intent);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public void onStart() {
super.onStart();
@@ -452,4 +499,4 @@
public void setListener(Listener listener) {
mListener = listener;
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/contacts/list/PhoneNumberListAdapter.java b/src/com/android/contacts/list/PhoneNumberListAdapter.java
index 1d077b7..2b231a7 100644
--- a/src/com/android/contacts/list/PhoneNumberListAdapter.java
+++ b/src/com/android/contacts/list/PhoneNumberListAdapter.java
@@ -22,7 +22,9 @@
import android.net.Uri;
import android.net.Uri.Builder;
import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Callable;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.ContactCounts;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
@@ -37,7 +39,12 @@
import java.util.List;
/**
- * A cursor adapter for the {@link Phone#CONTENT_TYPE} content type.
+ * A cursor adapter for the {@link Phone#CONTENT_ITEM_TYPE} and
+ * {@link SipAddress#CONTENT_ITEM_TYPE}.
+ *
+ * By default this adapter just handles phone numbers. When {@link #setUseCallableUri(boolean)} is
+ * called with "true", this adapter starts handling SIP addresses too, by using {@link Callable}
+ * API instead of {@link Phone}.
*/
public class PhoneNumberListAdapter extends ContactEntryListAdapter {
private static final String TAG = PhoneNumberListAdapter.class.getSimpleName();
@@ -79,6 +86,8 @@
private ContactListItemView.PhotoPosition mPhotoPosition;
+ private boolean mUseCallableUri;
+
public PhoneNumberListAdapter(Context context) {
super(context);
@@ -91,40 +100,37 @@
@Override
public void configureLoader(CursorLoader loader, long directoryId) {
- Uri uri;
-
if (directoryId != Directory.DEFAULT) {
Log.w(TAG, "PhoneNumberListAdapter is not ready for non-default directory ID ("
+ "directoryId: " + directoryId + ")");
}
+ final Builder builder;
if (isSearchMode()) {
- String query = getQueryString();
- Builder builder = Phone.CONTENT_FILTER_URI.buildUpon();
+ final Uri baseUri =
+ mUseCallableUri ? Callable.CONTENT_FILTER_URI : Phone.CONTENT_FILTER_URI;
+ builder = baseUri.buildUpon();
+ final String query = getQueryString();
if (TextUtils.isEmpty(query)) {
builder.appendPath("");
} else {
builder.appendPath(query); // Builder will encode the query
}
-
builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
String.valueOf(directoryId));
- uri = builder.build();
} else {
- uri = Phone.CONTENT_URI.buildUpon().appendQueryParameter(
- ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
- .build();
+ final Uri baseUri = mUseCallableUri ? Callable.CONTENT_URI : Phone.CONTENT_URI;
+ builder = baseUri.buildUpon().appendQueryParameter(
+ ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT));
if (isSectionHeaderDisplayEnabled()) {
- uri = buildSectionIndexerUri(uri);
+ builder.appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true");
}
- configureSelection(loader, directoryId, getFilter());
+ applyFilter(loader, builder, directoryId, getFilter());
}
// Remove duplicates when it is possible.
- uri = uri.buildUpon()
- .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true")
- .build();
- loader.setUri(uri);
+ builder.appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true");
+ loader.setUri(builder.build());
// TODO a projection that includes the search snippet
if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
@@ -140,8 +146,12 @@
}
}
- private void configureSelection(
- CursorLoader loader, long directoryId, ContactListFilter filter) {
+ /**
+ * Configure {@code loader} and {@code uriBuilder} according to {@code directoryId} and {@code
+ * filter}.
+ */
+ private void applyFilter(CursorLoader loader, Uri.Builder uriBuilder, long directoryId,
+ ContactListFilter filter) {
if (filter == null || directoryId != Directory.DEFAULT) {
return;
}
@@ -156,19 +166,7 @@
break;
}
case ContactListFilter.FILTER_TYPE_ACCOUNT: {
- selection.append("(");
-
- selection.append(RawContacts.ACCOUNT_TYPE + "=?"
- + " AND " + RawContacts.ACCOUNT_NAME + "=?");
- selectionArgs.add(filter.accountType);
- selectionArgs.add(filter.accountName);
- if (filter.dataSet != null) {
- selection.append(" AND " + RawContacts.DATA_SET + "=?");
- selectionArgs.add(filter.dataSet);
- } else {
- selection.append(" AND " + RawContacts.DATA_SET + " IS NULL");
- }
- selection.append(")");
+ filter.addAccountQueryParameterToUrl(uriBuilder);
break;
}
case ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS:
@@ -187,11 +185,6 @@
loader.setSelectionArgs(selectionArgs.toArray(new String[0]));
}
- protected static Uri buildSectionIndexerUri(Uri uri) {
- return uri.buildUpon()
- .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build();
- }
-
@Override
public String getContactDisplayName(int position) {
return ((Cursor) getItem(position)).getString(PhoneQuery.PHONE_DISPLAY_NAME);
@@ -227,6 +220,8 @@
protected void bindView(View itemView, int partition, Cursor cursor, int position) {
ContactListItemView view = (ContactListItemView)itemView;
+ view.setHighlightedPrefix(isSearchMode() ? getUpperCaseQueryString() : null);
+
// Look at elements before and after this position, checking if contact IDs are same.
// If they have one same contact ID, it means they can be grouped.
//
@@ -259,7 +254,9 @@
if (isFirstEntry) {
bindName(view, cursor);
if (isQuickContactEnabled()) {
- bindQuickContact(view, partition, cursor, PhoneQuery.PHONE_PHOTO_ID,
+ // No need for photo uri here, because we can not have directory results. If we
+ // ever do, we need to add photo uri to the query
+ bindQuickContact(view, partition, cursor, PhoneQuery.PHONE_PHOTO_ID, -1,
PhoneQuery.PHONE_CONTACT_ID, PhoneQuery.PHONE_LOOKUP_KEY);
} else {
bindPhoto(view, cursor);
@@ -322,4 +319,12 @@
public ContactListItemView.PhotoPosition getPhotoPosition() {
return mPhotoPosition;
}
+
+ public void setUseCallableUri(boolean useCallableUri) {
+ mUseCallableUri = useCallableUri;
+ }
+
+ public boolean usesCallableUri() {
+ return mUseCallableUri;
+ }
}
diff --git a/src/com/android/contacts/list/PhoneNumberPickerFragment.java b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
index c96956b..6886e81 100644
--- a/src/com/android/contacts/list/PhoneNumberPickerFragment.java
+++ b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
@@ -38,6 +38,8 @@
private static final int REQUEST_CODE_ACCOUNT_FILTER = 1;
+ private static final String KEY_SHORTCUT_ACTION = "shortcutAction";
+
private OnPhoneNumberPickerActionListener mListener;
private String mShortcutAction;
@@ -55,6 +57,8 @@
/** true if the loader has started at least once. */
private boolean mLoaderStarted;
+ private boolean mUseCallableUri;
+
private ContactListItemView.PhotoPosition mPhotoPosition =
ContactListItemView.DEFAULT_PHOTO_POSITION;
@@ -62,7 +66,9 @@
@Override
public void onClick(View view) {
AccountFilterUtil.startAccountFilterActivityForResult(
- PhoneNumberPickerFragment.this, REQUEST_CODE_ACCOUNT_FILTER);
+ PhoneNumberPickerFragment.this,
+ REQUEST_CODE_ACCOUNT_FILTER,
+ mFilter);
}
}
private OnClickListener mFilterHeaderClickListener = new FilterHeaderClickListener();
@@ -127,12 +133,14 @@
}
mFilter = savedState.getParcelable(KEY_FILTER);
+ mShortcutAction = savedState.getString(KEY_SHORTCUT_ACTION);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(KEY_FILTER, mFilter);
+ outState.putString(KEY_SHORTCUT_ACTION, mShortcutAction);
}
@Override
@@ -180,11 +188,20 @@
super.startLoading();
}
+ public void setUseCallableUri(boolean useCallableUri) {
+ mUseCallableUri = useCallableUri;
+ }
+
+ public boolean usesCallableUri() {
+ return mUseCallableUri;
+ }
+
@Override
protected ContactEntryListAdapter createListAdapter() {
if (!isLegacyCompatibilityMode()) {
PhoneNumberListAdapter adapter = new PhoneNumberListAdapter(getActivity());
adapter.setDisplayPhotos(true);
+ adapter.setUseCallableUri(mUseCallableUri);
return adapter;
} else {
LegacyPhoneNumberListAdapter adapter = new LegacyPhoneNumberListAdapter(getActivity());
diff --git a/src/com/android/contacts/list/PostalAddressListAdapter.java b/src/com/android/contacts/list/PostalAddressListAdapter.java
index 41591de..2750e11 100644
--- a/src/com/android/contacts/list/PostalAddressListAdapter.java
+++ b/src/com/android/contacts/list/PostalAddressListAdapter.java
@@ -20,10 +20,11 @@
import android.content.CursorLoader;
import android.database.Cursor;
import android.net.Uri;
+import android.net.Uri.Builder;
import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.ContactCounts;
import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.view.View;
import android.view.ViewGroup;
@@ -69,11 +70,12 @@
@Override
public void configureLoader(CursorLoader loader, long directoryId) {
- Uri uri = buildSectionIndexerUri(StructuredPostal.CONTENT_URI)
- .buildUpon()
- .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true")
- .build();
- loader.setUri(uri);
+ final Builder builder = StructuredPostal.CONTENT_URI.buildUpon()
+ .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true");
+ if (isSectionHeaderDisplayEnabled()) {
+ builder.appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true");
+ }
+ loader.setUri(builder.build());
if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
loader.setProjection(PostalQuery.PROJECTION_PRIMARY);
@@ -88,11 +90,6 @@
}
}
- protected static Uri buildSectionIndexerUri(Uri uri) {
- return uri.buildUpon()
- .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build();
- }
-
@Override
public String getContactDisplayName(int position) {
return ((Cursor) getItem(position)).getString(PostalQuery.POSTAL_DISPLAY_NAME);
diff --git a/src/com/android/contacts/list/PostalAddressPickerFragment.java b/src/com/android/contacts/list/PostalAddressPickerFragment.java
index 85fc155..ddb8e9a 100644
--- a/src/com/android/contacts/list/PostalAddressPickerFragment.java
+++ b/src/com/android/contacts/list/PostalAddressPickerFragment.java
@@ -73,6 +73,13 @@
return inflater.inflate(R.layout.contact_list_content, null);
}
+ @Override
+ protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
+ super.onCreateView(inflater, container);
+
+ setVisibleScrollbarEnabled(!isLegacyCompatibilityMode());
+ }
+
private void pickPostalAddress(Uri uri) {
mListener.onPickPostalAddressAction(uri);
}
diff --git a/src/com/android/contacts/model/AccountType.java b/src/com/android/contacts/model/AccountType.java
index 22ea884..3cc54f1 100644
--- a/src/com/android/contacts/model/AccountType.java
+++ b/src/com/android/contacts/model/AccountType.java
@@ -25,7 +25,6 @@
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
@@ -270,6 +269,7 @@
* {@link Comparator} to sort by {@link DataKind#weight}.
*/
private static Comparator<DataKind> sWeightComparator = new Comparator<DataKind>() {
+ @Override
public int compare(DataKind object1, DataKind object2) {
return object1.weight - object2.weight;
}
@@ -460,13 +460,12 @@
}
/**
- * Generic method of inflating a given {@link Cursor} into a user-readable
+ * Generic method of inflating a given {@link ContentValues} into a user-readable
* {@link CharSequence}. For example, an inflater could combine the multiple
* columns of {@link StructuredPostal} together using a string resource
* before presenting to the user.
*/
public interface StringInflater {
- public CharSequence inflateUsing(Context context, Cursor cursor);
public CharSequence inflateUsing(Context context, ContentValues values);
}
diff --git a/src/com/android/contacts/model/BaseAccountType.java b/src/com/android/contacts/model/BaseAccountType.java
index cd113eb..1e830e2 100644
--- a/src/com/android/contacts/model/BaseAccountType.java
+++ b/src/com/android/contacts/model/BaseAccountType.java
@@ -17,18 +17,14 @@
package com.android.contacts.model;
import com.android.contacts.R;
-import com.android.contacts.model.AccountType.DefinitionException;
+import com.android.contacts.test.NeededForTesting;
import com.android.contacts.util.DateUtils;
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.content.ContentValues;
import android.content.Context;
import android.content.res.Resources;
-import android.database.Cursor;
import android.provider.ContactsContract.CommonDataKinds.BaseTypes;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Event;
@@ -48,6 +44,9 @@
import android.util.Log;
import android.view.inputmethod.EditorInfo;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.IOException;
import java.util.List;
import java.util.Locale;
@@ -79,6 +78,12 @@
protected static final int FLAGS_RELATION = EditorInfo.TYPE_CLASS_TEXT
| EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS | EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME;
+ // Specify the maximum number of lines that can be used to display various field types. If no
+ // value is specified for a particular type, we use the default value from {@link DataKind}.
+ protected static final int MAX_LINES_FOR_POSTAL_ADDRESS = 10;
+ protected static final int MAX_LINES_FOR_GROUP = 10;
+ protected static final int MAX_LINES_FOR_NOTE = 100;
+
private interface Tag {
static final String DATA_KIND = "DataKind";
static final String TYPE = "Type";
@@ -323,6 +328,8 @@
new EditField(StructuredPostal.FORMATTED_ADDRESS, R.string.postal_address,
FLAGS_POSTAL));
+ kind.maxLinesForDisplay = MAX_LINES_FOR_POSTAL_ADDRESS;
+
return kind;
}
@@ -391,6 +398,8 @@
kind.fieldList = Lists.newArrayList();
kind.fieldList.add(new EditField(Note.NOTE, R.string.label_notes, FLAGS_NOTE));
+ kind.maxLinesForDisplay = MAX_LINES_FOR_NOTE;
+
return kind;
}
@@ -430,6 +439,8 @@
kind.fieldList = Lists.newArrayList();
kind.fieldList.add(new EditField(GroupMembership.GROUP_ROW_ID, -1, -1));
+ kind.maxLinesForDisplay = MAX_LINES_FOR_GROUP;
+
return kind;
}
@@ -454,25 +465,7 @@
mColumnName = columnName;
}
- public CharSequence inflateUsing(Context context, Cursor cursor) {
- final int index = mColumnName != null ? cursor.getColumnIndex(mColumnName) : -1;
- final boolean validString = mStringRes > 0;
- final boolean validColumn = index != -1;
-
- final CharSequence stringValue = validString ? context.getText(mStringRes) : null;
- final CharSequence columnValue = validColumn ? cursor.getString(index) : null;
-
- if (validString && validColumn) {
- return String.format(stringValue.toString(), columnValue);
- } else if (validString) {
- return stringValue;
- } else if (validColumn) {
- return columnValue;
- } else {
- return null;
- }
- }
-
+ @Override
public CharSequence inflateUsing(Context context, ContentValues values) {
final boolean validColumn = values.containsKey(mColumnName);
final boolean validString = mStringRes > 0;
@@ -498,6 +491,7 @@
+ " mColumnName" + mColumnName;
}
+ @NeededForTesting
public String getColumnNameForTest() {
return mColumnName;
}
@@ -529,12 +523,7 @@
}
}
- public CharSequence inflateUsing(Context context, Cursor cursor) {
- final Integer type = cursor.getInt(cursor.getColumnIndex(getTypeColumn()));
- final String label = cursor.getString(cursor.getColumnIndex(getLabelColumn()));
- return getTypeLabel(context.getResources(), type, label);
- }
-
+ @Override
public CharSequence inflateUsing(Context context, ContentValues values) {
final Integer type = values.getAsInteger(getTypeColumn());
final String label = values.getAsString(getLabelColumn());
@@ -1210,6 +1199,7 @@
R.string.postal_country, FLAGS_POSTAL).setOptional(true));
}
} else {
+ kind.maxLinesForDisplay= MAX_LINES_FOR_POSTAL_ADDRESS;
kind.fieldList.add(
new EditField(StructuredPostal.FORMATTED_ADDRESS, R.string.postal_address,
FLAGS_POSTAL));
@@ -1344,6 +1334,7 @@
new SimpleInflater(R.string.label_notes), new SimpleInflater(Note.NOTE));
kind.fieldList.add(new EditField(Note.NOTE, R.string.label_notes, FLAGS_NOTE));
+ kind.maxLinesForDisplay = MAX_LINES_FOR_NOTE;
throwIfList(kind);
@@ -1417,6 +1408,7 @@
R.string.groupsLabel, Weight.GROUP_MEMBERSHIP, -1, null, null);
kind.fieldList.add(new EditField(GroupMembership.GROUP_ROW_ID, -1, -1));
+ kind.maxLinesForDisplay = MAX_LINES_FOR_GROUP;
throwIfList(kind);
diff --git a/src/com/android/contacts/model/DataKind.java b/src/com/android/contacts/model/DataKind.java
index 857f3e4..c697e6f 100644
--- a/src/com/android/contacts/model/DataKind.java
+++ b/src/com/android/contacts/model/DataKind.java
@@ -83,8 +83,16 @@
*/
public SimpleDateFormat dateFormatWithYear;
+ /**
+ * The number of lines available for displaying this kind of data in a
+ * {@link ContactDetailFragment} (and possibly elsewhere)
+ * Defaults to 1.
+ */
+ public int maxLinesForDisplay;
+
public DataKind() {
editorLayoutResourceId = R.layout.text_fields_editor_view;
+ maxLinesForDisplay = 1;
}
public DataKind(String mimeType, int titleRes, int weight, boolean editable,
@@ -95,6 +103,7 @@
this.editable = editable;
this.typeOverallMax = -1;
this.editorLayoutResourceId = editorLayoutResourceId;
+ maxLinesForDisplay = 1;
}
@Override
diff --git a/src/com/android/contacts/model/EntityDelta.java b/src/com/android/contacts/model/EntityDelta.java
index 8244e9c..2cbfa26 100644
--- a/src/com/android/contacts/model/EntityDelta.java
+++ b/src/com/android/contacts/model/EntityDelta.java
@@ -16,6 +16,7 @@
package com.android.contacts.model;
+import com.android.contacts.test.NeededForTesting;
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
import com.google.android.collect.Sets;
@@ -183,6 +184,7 @@
* doesn't exist (may be a primary, or just a random item
* @return
*/
+ @NeededForTesting
public ValuesDelta getSuperPrimaryEntry(String mimeType, boolean forceSelection) {
final ArrayList<ValuesDelta> mimeEntries = getMimeEntries(mimeType, false);
if (mimeEntries == null) return null;
@@ -564,6 +566,7 @@
return entry;
}
+ @NeededForTesting
public ContentValues getAfter() {
return mAfter;
}
diff --git a/src/com/android/contacts/model/EntityModifier.java b/src/com/android/contacts/model/EntityModifier.java
index 289ca54..2d87ff0 100644
--- a/src/com/android/contacts/model/EntityModifier.java
+++ b/src/com/android/contacts/model/EntityModifier.java
@@ -53,6 +53,7 @@
import android.provider.ContactsContract.RawContacts;
import android.text.TextUtils;
import android.util.Log;
+import android.util.SparseArray;
import android.util.SparseIntArray;
import java.text.ParsePosition;
@@ -60,12 +61,10 @@
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
-import java.util.Map;
import java.util.Set;
/**
@@ -103,19 +102,28 @@
/**
* Ensure that at least one of the given {@link DataKind} exists in the
* given {@link EntityDelta} state, and try creating one if none exist.
+ * @return The child (either newly created or the first existing one), or null if the
+ * account doesn't support this {@link DataKind}.
*/
- public static void ensureKindExists(
+ public static ValuesDelta ensureKindExists(
EntityDelta state, AccountType accountType, String mimeType) {
final DataKind kind = accountType.getKindForMimetype(mimeType);
final boolean hasChild = state.getMimeEntriesCount(mimeType, true) > 0;
- if (!hasChild && kind != null) {
- // Create child when none exists and valid kind
- final ValuesDelta child = insertChild(state, kind);
- if (kind.mimeType.equals(Photo.CONTENT_ITEM_TYPE)) {
- child.setFromTemplate(true);
+ if (kind != null) {
+ if (hasChild) {
+ // Return the first entry.
+ return state.getMimeEntries(mimeType).get(0);
+ } else {
+ // Create child when none exists and valid kind
+ final ValuesDelta child = insertChild(state, kind);
+ if (kind.mimeType.equals(Photo.CONTENT_ITEM_TYPE)) {
+ child.setFromTemplate(true);
+ }
+ return child;
}
}
+ return null;
}
/**
@@ -1228,7 +1236,7 @@
return;
}
- final Map<Integer, EventEditType> allowedTypes = new HashMap<Integer, EventEditType>();
+ final SparseArray<EventEditType> allowedTypes = new SparseArray<EventEditType>();
for (EditType editType : newDataKind.typeList) {
allowedTypes.put(editType.rawValue, (EventEditType) editType);
}
@@ -1239,7 +1247,8 @@
}
final String dateString = values.getAsString(Event.START_DATE);
final Integer type = values.getAsInteger(Event.TYPE);
- if (type != null && allowedTypes.containsKey(type) && !TextUtils.isEmpty(dateString)) {
+ if (type != null && (allowedTypes.indexOfKey(type) >= 0)
+ && !TextUtils.isEmpty(dateString)) {
EventEditType suitableType = allowedTypes.get(type);
final ParsePosition position = new ParsePosition(0);
@@ -1323,7 +1332,7 @@
}
final Set<Integer> allowedTypes = new HashSet<Integer>();
// key: type, value: the number of entries allowed for the type (specificMax)
- final Map<Integer, Integer> typeSpecificMaxMap = new HashMap<Integer, Integer>();
+ final SparseIntArray typeSpecificMaxMap = new SparseIntArray();
if (defaultType != null) {
allowedTypes.add(defaultType);
typeSpecificMaxMap.put(defaultType, -1);
@@ -1350,7 +1359,7 @@
final int typeOverallMax = newDataKind.typeOverallMax;
// key: type, value: the number of current entries.
- final Map<Integer, Integer> currentEntryCount = new HashMap<Integer, Integer>();
+ final SparseIntArray currentEntryCount = new SparseIntArray();
int totalCount = 0;
for (ValuesDelta entry : mimeEntries) {
@@ -1381,11 +1390,9 @@
typeForNewAccount = oldType;
}
if (typeForNewAccount != null) {
- final int specificMax = (typeSpecificMaxMap.containsKey(typeForNewAccount) ?
- typeSpecificMaxMap.get(typeForNewAccount) : 0);
+ final int specificMax = typeSpecificMaxMap.get(typeForNewAccount, 0);
if (specificMax >= 0) {
- final int currentCount = (currentEntryCount.get(typeForNewAccount) != null ?
- currentEntryCount.get(typeForNewAccount) : 0);
+ final int currentCount = currentEntryCount.get(typeForNewAccount, 0);
if (currentCount >= specificMax) {
continue;
}
diff --git a/src/com/android/contacts/model/ExchangeAccountType.java b/src/com/android/contacts/model/ExchangeAccountType.java
index e5491d2..21a30f8 100644
--- a/src/com/android/contacts/model/ExchangeAccountType.java
+++ b/src/com/android/contacts/model/ExchangeAccountType.java
@@ -169,8 +169,8 @@
kind.typeColumn = Phone.TYPE;
kind.typeList = Lists.newArrayList();
- kind.typeList.add(buildPhoneType(Phone.TYPE_HOME).setSpecificMax(2));
kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE).setSpecificMax(1));
+ kind.typeList.add(buildPhoneType(Phone.TYPE_HOME).setSpecificMax(2));
kind.typeList.add(buildPhoneType(Phone.TYPE_WORK).setSpecificMax(2));
kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true)
.setSpecificMax(1));
diff --git a/src/com/android/contacts/model/FallbackAccountType.java b/src/com/android/contacts/model/FallbackAccountType.java
index d81f2f5..6ce7a43 100644
--- a/src/com/android/contacts/model/FallbackAccountType.java
+++ b/src/com/android/contacts/model/FallbackAccountType.java
@@ -17,6 +17,7 @@
package com.android.contacts.model;
import com.android.contacts.R;
+import com.android.contacts.test.NeededForTesting;
import android.content.Context;
import android.util.Log;
@@ -63,6 +64,7 @@
* In order to build {@link DataKind}s with the same resource package name,
* {@code resPackageName} is injectable.
*/
+ @NeededForTesting
static AccountType createForTest(Context context, String resPackageName) {
return new FallbackAccountType(context, resPackageName);
}
diff --git a/src/com/android/contacts/preference/DisplayOrderPreference.java b/src/com/android/contacts/preference/DisplayOrderPreference.java
index fea01c8..bedce48 100644
--- a/src/com/android/contacts/preference/DisplayOrderPreference.java
+++ b/src/com/android/contacts/preference/DisplayOrderPreference.java
@@ -18,6 +18,7 @@
import com.android.contacts.R;
+import android.app.AlertDialog.Builder;
import android.content.Context;
import android.preference.ListPreference;
import android.provider.ContactsContract;
@@ -80,4 +81,11 @@
}
return true;
}
+
+ @Override
+ // UX recommendation is not to show cancel button on such lists.
+ protected void onPrepareDialogBuilder(Builder builder) {
+ super.onPrepareDialogBuilder(builder);
+ builder.setNegativeButton(null, null);
+ }
}
diff --git a/src/com/android/contacts/preference/SortOrderPreference.java b/src/com/android/contacts/preference/SortOrderPreference.java
index 81b034c..2ac9557 100644
--- a/src/com/android/contacts/preference/SortOrderPreference.java
+++ b/src/com/android/contacts/preference/SortOrderPreference.java
@@ -18,6 +18,7 @@
import com.android.contacts.R;
+import android.app.AlertDialog.Builder;
import android.content.Context;
import android.preference.ListPreference;
import android.provider.ContactsContract;
@@ -80,4 +81,11 @@
}
return true;
}
+
+ @Override
+ // UX recommendation is not to show cancel button on such lists.
+ protected void onPrepareDialogBuilder(Builder builder) {
+ super.onPrepareDialogBuilder(builder);
+ builder.setNegativeButton(null, null);
+ }
}
diff --git a/src/com/android/contacts/quickcontact/Action.java b/src/com/android/contacts/quickcontact/Action.java
index b2d869d..3a283fb 100644
--- a/src/com/android/contacts/quickcontact/Action.java
+++ b/src/com/android/contacts/quickcontact/Action.java
@@ -58,4 +58,7 @@
* row
*/
public long getDataId();
+
+ /** Returns the presence of this item or -1 if it was never set */
+ public int getPresence();
}
diff --git a/src/com/android/contacts/quickcontact/DataAction.java b/src/com/android/contacts/quickcontact/DataAction.java
index 266fd02..6728913 100644
--- a/src/com/android/contacts/quickcontact/DataAction.java
+++ b/src/com/android/contacts/quickcontact/DataAction.java
@@ -21,14 +21,14 @@
import com.android.contacts.model.AccountType.EditType;
import com.android.contacts.model.DataKind;
import com.android.contacts.util.Constants;
-import com.android.contacts.util.StructuredPostalUtils;
import com.android.contacts.util.PhoneCapabilityTester;
+import com.android.contacts.util.StructuredPostalUtils;
import android.content.ContentUris;
+import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.net.WebAddress;
@@ -59,6 +59,7 @@
private Intent mAlternateIntent;
private int mAlternateIconDescriptionRes;
private int mAlternateIconRes;
+ private int mPresence = -1;
private Uri mDataUri;
private long mDataId;
@@ -67,7 +68,8 @@
/**
* Create an action from common {@link Data} elements.
*/
- public DataAction(Context context, String mimeType, DataKind kind, long dataId, Cursor cursor) {
+ public DataAction(Context context, String mimeType, DataKind kind, long dataId,
+ ContentValues entryValues) {
mContext = context;
mKind = kind;
mMimeType = mimeType;
@@ -75,9 +77,8 @@
// Determine type for subtitle
mSubtitle = "";
if (kind.typeColumn != null) {
- final int typeColumnIndex = cursor.getColumnIndex(kind.typeColumn);
- if (typeColumnIndex != -1) {
- final int typeValue = cursor.getInt(typeColumnIndex);
+ if (entryValues.containsKey(kind.typeColumn)) {
+ final int typeValue = entryValues.getAsInteger(kind.typeColumn);
// get type string
for (EditType type : kind.typeList) {
@@ -87,8 +88,7 @@
mSubtitle = context.getString(type.labelRes);
} else {
// Custom type. Read it from the database
- mSubtitle = cursor.getString(cursor.getColumnIndexOrThrow(
- type.customColumn));
+ mSubtitle = entryValues.getAsString(type.customColumn);
}
break;
}
@@ -96,12 +96,11 @@
}
}
- if (getAsInt(cursor, Data.IS_SUPER_PRIMARY) != 0) {
- mIsPrimary = true;
- }
+ final Integer superPrimary = entryValues.getAsInteger(Data.IS_SUPER_PRIMARY);
+ mIsPrimary = superPrimary != null && superPrimary != 0;
if (mKind.actionBody != null) {
- mBody = mKind.actionBody.inflateUsing(context, cursor);
+ mBody = mKind.actionBody.inflateUsing(context, entryValues);
}
mDataId = dataId;
@@ -113,11 +112,11 @@
// Handle well-known MIME-types with special care
if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
if (PhoneCapabilityTester.isPhone(mContext)) {
- final String number = getAsString(cursor, Phone.NUMBER);
+ final String number = entryValues.getAsString(Phone.NUMBER);
if (!TextUtils.isEmpty(number)) {
- final Intent phoneIntent = hasPhone ? new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts(Constants.SCHEME_TEL, number, null)) : null;
+ final Intent phoneIntent = hasPhone ? ContactsUtils.getCallIntent(number)
+ : null;
final Intent smsIntent = hasSms ? new Intent(Intent.ACTION_SENDTO,
Uri.fromParts(Constants.SCHEME_SMSTO, number, null)) : null;
@@ -136,10 +135,10 @@
}
} else if (SipAddress.CONTENT_ITEM_TYPE.equals(mimeType)) {
if (PhoneCapabilityTester.isSipPhone(mContext)) {
- final String address = getAsString(cursor, SipAddress.SIP_ADDRESS);
+ final String address = entryValues.getAsString(SipAddress.SIP_ADDRESS);
if (!TextUtils.isEmpty(address)) {
final Uri callUri = Uri.fromParts(Constants.SCHEME_SIP, address, null);
- mIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED, callUri);
+ mIntent = ContactsUtils.getCallIntent(callUri);
// Note that this item will get a SIP-specific variant
// of the "call phone" icon, rather than the standard
// app icon for the Phone app (which we show for
@@ -149,14 +148,14 @@
}
}
} else if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
- final String address = getAsString(cursor, Email.DATA);
+ final String address = entryValues.getAsString(Email.DATA);
if (!TextUtils.isEmpty(address)) {
final Uri mailUri = Uri.fromParts(Constants.SCHEME_MAILTO, address, null);
mIntent = new Intent(Intent.ACTION_SENDTO, mailUri);
}
} else if (Website.CONTENT_ITEM_TYPE.equals(mimeType)) {
- final String url = getAsString(cursor, Website.URL);
+ final String url = entryValues.getAsString(Website.URL);
if (!TextUtils.isEmpty(url)) {
WebAddress webAddress = new WebAddress(url);
mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(webAddress.toString()));
@@ -164,21 +163,21 @@
} else if (Im.CONTENT_ITEM_TYPE.equals(mimeType)) {
final boolean isEmail = Email.CONTENT_ITEM_TYPE.equals(
- getAsString(cursor, Data.MIMETYPE));
- if (isEmail || isProtocolValid(cursor)) {
+ entryValues.getAsString(Data.MIMETYPE));
+ if (isEmail || isProtocolValid(entryValues)) {
final int protocol = isEmail ? Im.PROTOCOL_GOOGLE_TALK :
- getAsInt(cursor, Im.PROTOCOL);
+ entryValues.getAsInteger(Im.PROTOCOL);
if (isEmail) {
// Use Google Talk string when using Email, and clear data
// Uri so we don't try saving Email as primary.
- mSubtitle = context.getText(R.string.chat_gtalk);
+ mSubtitle = Im.getProtocolLabel(context.getResources(), Im.PROTOCOL_GOOGLE_TALK,
+ null);
mDataUri = null;
}
- String host = getAsString(cursor, Im.CUSTOM_PROTOCOL);
- String data = getAsString(cursor,
- isEmail ? Email.DATA : Im.DATA);
+ String host = entryValues.getAsString(Im.CUSTOM_PROTOCOL);
+ String data = entryValues.getAsString(isEmail ? Email.DATA : Im.DATA);
if (protocol != Im.PROTOCOL_CUSTOM) {
// Try bringing in a well-known host for specific protocols
host = ContactsUtils.lookupProviderNameFromId(protocol);
@@ -192,7 +191,8 @@
// If the address is also available for a video chat, we'll show the capability
// as a secondary action.
- final int chatCapability = getAsInt(cursor, Data.CHAT_CAPABILITY);
+ final Integer chatCapabilityObj = entryValues.getAsInteger(Im.CHAT_CAPABILITY);
+ final int chatCapability = chatCapabilityObj == null ? 0 : chatCapabilityObj;
final boolean isVideoChatCapable =
(chatCapability & Im.CAPABILITY_HAS_CAMERA) != 0;
final boolean isAudioChatCapable =
@@ -211,7 +211,8 @@
}
}
} else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(mimeType)) {
- final String postalAddress = getAsString(cursor, StructuredPostal.FORMATTED_ADDRESS);
+ final String postalAddress =
+ entryValues.getAsString(StructuredPostal.FORMATTED_ADDRESS);
if (!TextUtils.isEmpty(postalAddress)) {
mIntent = StructuredPostalUtils.getViewPostalAddressIntent(postalAddress);
}
@@ -224,28 +225,30 @@
}
// Always launch as new task, since we're like a launcher
- mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ setCommonIntentFlags(mIntent);
+ if (mAlternateIntent != null) setCommonIntentFlags(mAlternateIntent);
}
- /** Read {@link String} from the given {@link Cursor}. */
- private static String getAsString(Cursor cursor, String columnName) {
- final int index = cursor.getColumnIndex(columnName);
- return cursor.getString(index);
+ private static void setCommonIntentFlags(Intent intent) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
}
- /** Read {@link Integer} from the given {@link Cursor}. */
- private static int getAsInt(Cursor cursor, String columnName) {
- final int index = cursor.getColumnIndex(columnName);
- return cursor.getInt(index);
+ @Override
+ public int getPresence() {
+ return mPresence;
}
- private boolean isProtocolValid(Cursor cursor) {
- final int columnIndex = cursor.getColumnIndex(Im.PROTOCOL);
- if (cursor.isNull(columnIndex)) {
+ public void setPresence(int presence) {
+ mPresence = presence;
+ }
+
+ private boolean isProtocolValid(ContentValues entryValues) {
+ final String protocol = entryValues.getAsString(Im.PROTOCOL);
+ if (protocol == null) {
return false;
}
try {
- Integer.valueOf(cursor.getString(columnIndex));
+ Integer.valueOf(protocol);
} catch (NumberFormatException e) {
return false;
}
diff --git a/src/com/android/contacts/quickcontact/FloatingChildLayout.java b/src/com/android/contacts/quickcontact/FloatingChildLayout.java
index 5358aca..f1a0fe1 100644
--- a/src/com/android/contacts/quickcontact/FloatingChildLayout.java
+++ b/src/com/android/contacts/quickcontact/FloatingChildLayout.java
@@ -66,8 +66,8 @@
mChild.setDuplicateParentStateEnabled(true);
// this will be expanded in showChild()
- mChild.setScaleX(0.0f);
- mChild.setScaleY(0.0f);
+ mChild.setScaleX(0.5f);
+ mChild.setScaleY(0.5f);
mChild.setAlpha(0.0f);
}
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 2c62fe4..b603e42 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -17,44 +17,42 @@
package com.android.contacts.quickcontact;
import com.android.contacts.Collapser;
+import com.android.contacts.ContactLoader;
import com.android.contacts.ContactPhotoManager;
import com.android.contacts.R;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.model.DataKind;
import com.android.contacts.util.DataStatus;
-import com.android.contacts.util.NotifyingAsyncQueryHandler;
-import com.android.contacts.util.NotifyingAsyncQueryHandler.AsyncQueryListener;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
+import android.app.LoaderManager.LoaderCallbacks;
import android.content.ActivityNotFoundException;
import android.content.ContentUris;
+import android.content.ContentValues;
import android.content.Context;
+import android.content.Entity;
+import android.content.Entity.NamedContentValues;
import android.content.Intent;
+import android.content.Loader;
import android.content.pm.PackageManager;
-import android.content.res.AssetFileDescriptor;
-import android.database.Cursor;
-import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
-import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Im;
import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.DisplayPhoto;
import android.provider.ContactsContract.QuickContact;
import android.provider.ContactsContract.RawContacts;
import android.support.v13.app.FragmentPagerAdapter;
@@ -74,7 +72,6 @@
import android.widget.TextView;
import android.widget.Toast;
-import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -96,8 +93,6 @@
@SuppressWarnings("deprecation")
private static final String LEGACY_AUTHORITY = android.provider.Contacts.AUTHORITY;
- private NotifyingAsyncQueryHandler mHandler;
-
private Uri mLookupUri;
private String[] mExcludeMimes;
private List<String> mSortedActionMimeTypes = Lists.newArrayList();
@@ -147,8 +142,8 @@
private static final List<String> TRAILING_MIMETYPES = Lists.newArrayList(
StructuredPostal.CONTENT_ITEM_TYPE, Website.CONTENT_ITEM_TYPE);
- /** Id for the background handler that loads the data */
- private static final int HANDLER_ID_DATA = 1;
+ /** Id for the background loader */
+ private static final int LOADER_ID = 0;
@Override
protected void onCreate(Bundle icicle) {
@@ -190,8 +185,6 @@
mListPager.setAdapter(new ViewPagerAdapter(getFragmentManager()));
mListPager.setOnPageChangeListener(new PageChangeListener());
- mHandler = new NotifyingAsyncQueryHandler(this, mQueryListener);
-
show();
}
@@ -225,16 +218,7 @@
mPhotoContainer = findViewById(R.id.photo_container);
setHeaderNameText(R.id.name, R.string.missing_name);
- // Start background query for data, but only select photo rows when they
- // directly match the super-primary PHOTO_ID.
- final Uri dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY);
- mHandler.cancelOperation(HANDLER_ID_DATA);
-
- // Select all data items of the contact (except for photos, where we only select the display
- // photo)
- mHandler.startQuery(HANDLER_ID_DATA, lookupUri, dataUri, DataQuery.PROJECTION, Data.MIMETYPE
- + "!=? OR (" + Data.MIMETYPE + "=? AND " + Data._ID + "=" + Contacts.PHOTO_ID
- + ")", new String[] { Photo.CONTENT_ITEM_TYPE, Photo.CONTENT_ITEM_TYPE }, null);
+ getLoaderManager().initLoader(LOADER_ID, null, mLoaderCallbacks);
}
private boolean handleOutsideTouch() {
@@ -248,7 +232,7 @@
private void hide(boolean withAnimation) {
// cancel any pending queries
- mHandler.cancelOperation(HANDLER_ID_DATA);
+ getLoaderManager().destroyLoader(LOADER_ID);
if (withAnimation) {
mFloatingLayout.hideChild(new Runnable() {
@@ -268,47 +252,6 @@
hide(true);
}
- private final AsyncQueryListener mQueryListener = new AsyncQueryListener() {
- @Override
- public synchronized void onQueryComplete(int token, Object cookie, Cursor cursor) {
- try {
- if (isFinishing()) {
- hide(false);
- return;
- } else if (cursor == null || cursor.getCount() == 0) {
- Toast.makeText(QuickContactActivity.this, R.string.invalidContactMessage,
- Toast.LENGTH_LONG).show();
- hide(false);
- return;
- }
-
- bindData(cursor);
-
- if (TRACE_LAUNCH) {
- android.os.Debug.stopMethodTracing();
- }
-
- // Data bound and ready, pull curtain to show. Put this on the Handler to ensure
- // that the layout passes are completed
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mFloatingLayout.showChild(new Runnable() {
- @Override
- public void run() {
- mHasFinishedAnimatingIn = true;
- }
- });
- }
- });
- } finally {
- if (cursor != null) {
- cursor.close();
- }
- }
- }
- };
-
/** Assign this string to the view if it is not empty. */
private void setHeaderNameText(int id, int resId) {
setHeaderNameText(id, getText(resId));
@@ -325,35 +268,6 @@
}
/**
- * Assign this string to the view (if found in {@link #mPhotoContainer}), or hiding this view
- * if there is no string.
- */
- private void setHeaderText(int id, int resId) {
- setHeaderText(id, getText(resId));
- }
-
- /**
- * Assign this string to the view (if found in {@link #mPhotoContainer}), or hiding this view
- * if there is no string.
- */
- private void setHeaderText(int id, CharSequence value) {
- final View view = mPhotoContainer.findViewById(id);
- if (view instanceof TextView) {
- ((TextView)view).setText(value);
- view.setVisibility(TextUtils.isEmpty(value) ? View.GONE : View.VISIBLE);
- }
- }
-
- /** Assign this image to the view, if found in {@link #mPhotoContainer}. */
- private void setHeaderImage(int id, Drawable drawable) {
- final View view = mPhotoContainer.findViewById(id);
- if (view instanceof ImageView) {
- ((ImageView)view).setImageDrawable(drawable);
- view.setVisibility(drawable == null ? View.GONE : View.VISIBLE);
- }
- }
-
- /**
* Check if the given MIME-type appears in the list of excluded MIME-types
* that the most-recent caller requested.
*/
@@ -368,9 +282,9 @@
}
/**
- * Handle the result from the {@link #TOKEN_DATA} query.
+ * Handle the result from the ContactLoader
*/
- private void bindData(Cursor cursor) {
+ private void bindData(ContactLoader.Result data) {
final ResolveCache cache = ResolveCache.getInstance(this);
final Context context = this;
@@ -379,90 +293,63 @@
mDefaultsMap.clear();
- final DataStatus status = new DataStatus();
final AccountTypeManager accountTypes = AccountTypeManager.getInstance(
context.getApplicationContext());
final ImageView photoView = (ImageView) mPhotoContainer.findViewById(R.id.photo);
+ final byte[] photo = data.getPhotoBinaryData();
+ if (photo != null) {
+ photoView.setImageBitmap(BitmapFactory.decodeByteArray(photo, 0, photo.length));
+ } else {
+ photoView.setImageResource(
+ ContactPhotoManager.getDefaultAvatarResId(true, false));
+ }
- Bitmap photoBitmap = null;
- while (cursor.moveToNext()) {
- // Handle any social status updates from this row
- status.possibleUpdate(cursor);
+ for (Entity entity : data.getEntities()) {
+ final ContentValues entityValues = entity.getEntityValues();
+ final String accountType = entityValues.getAsString(RawContacts.ACCOUNT_TYPE);
+ final String dataSet = entityValues.getAsString(RawContacts.DATA_SET);
+ for (NamedContentValues subValue : entity.getSubValues()) {
+ final ContentValues entryValues = subValue.values;
+ final String mimeType = entryValues.getAsString(Data.MIMETYPE);
- final String mimeType = cursor.getString(DataQuery.MIMETYPE);
+ // Skip this data item if MIME-type excluded
+ if (isMimeExcluded(mimeType)) continue;
- // Skip this data item if MIME-type excluded
- if (isMimeExcluded(mimeType)) continue;
+ final long dataId = entryValues.getAsLong(Data._ID);
+ final Integer primary = entryValues.getAsInteger(Data.IS_PRIMARY);
+ final boolean isPrimary = primary != null && primary != 0;
+ final Integer superPrimary = entryValues.getAsInteger(Data.IS_SUPER_PRIMARY);
+ final boolean isSuperPrimary = superPrimary != null && superPrimary != 0;
- final long dataId = cursor.getLong(DataQuery._ID);
- final String accountType = cursor.getString(DataQuery.ACCOUNT_TYPE);
- final String dataSet = cursor.getString(DataQuery.DATA_SET);
- final boolean isPrimary = cursor.getInt(DataQuery.IS_PRIMARY) != 0;
- final boolean isSuperPrimary = cursor.getInt(DataQuery.IS_SUPER_PRIMARY) != 0;
+ final DataKind kind =
+ accountTypes.getKindOrFallback(accountType, dataSet, mimeType);
- // Handle photos included as data row
- if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
- final int displayPhotoColumnIndex = cursor.getColumnIndex(Photo.PHOTO_FILE_ID);
- final boolean hasDisplayPhoto = !cursor.isNull(displayPhotoColumnIndex);
- if (hasDisplayPhoto) {
- final long displayPhotoId = cursor.getLong(displayPhotoColumnIndex);
- final Uri displayPhotoUri = ContentUris.withAppendedId(
- DisplayPhoto.CONTENT_URI, displayPhotoId);
- // Fetch and JPEG uncompress on the background thread
- new AsyncTask<Void, Void, Bitmap>() {
- @Override
- protected Bitmap doInBackground(Void... params) {
- try {
- AssetFileDescriptor fd = getContentResolver()
- .openAssetFileDescriptor(displayPhotoUri, "r");
- return BitmapFactory.decodeStream(fd.createInputStream());
- } catch (IOException e) {
- Log.e(TAG, "Error getting display photo. Ignoring, as we already " +
- "have the thumbnail", e);
- return null;
- }
+ if (kind != null) {
+ // Build an action for this data entry, find a mapping to a UI
+ // element, build its summary from the cursor, and collect it
+ // along with all others of this MIME-type.
+ final Action action = new DataAction(context, mimeType, kind, dataId,
+ entryValues);
+ final boolean wasAdded = considerAdd(action, cache);
+ if (wasAdded) {
+ // Remember the default
+ if (isSuperPrimary || (isPrimary && (mDefaultsMap.get(mimeType) == null))) {
+ mDefaultsMap.put(mimeType, action);
}
-
- @Override
- protected void onPostExecute(Bitmap result) {
- if (result == null) return;
- photoView.setImageBitmap(result);
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
- }
- final int photoColumnIndex = cursor.getColumnIndex(Photo.PHOTO);
- final byte[] photoBlob = cursor.getBlob(photoColumnIndex);
- if (photoBlob != null) {
- photoBitmap = BitmapFactory.decodeByteArray(photoBlob, 0, photoBlob.length);
- }
- continue;
- }
-
- final DataKind kind = accountTypes.getKindOrFallback(accountType, dataSet, mimeType);
-
- if (kind != null) {
- // Build an action for this data entry, find a mapping to a UI
- // element, build its summary from the cursor, and collect it
- // along with all others of this MIME-type.
- final Action action = new DataAction(context, mimeType, kind, dataId, cursor);
- final boolean wasAdded = considerAdd(action, cache);
- if (wasAdded) {
- // Remember the default
- if (isSuperPrimary || (isPrimary && (mDefaultsMap.get(mimeType) == null))) {
- mDefaultsMap.put(mimeType, action);
}
}
- }
- // Handle Email rows with presence data as Im entry
- final boolean hasPresence = !cursor.isNull(DataQuery.PRESENCE);
- if (hasPresence && Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
- final DataKind imKind = accountTypes.getKindOrFallback(accountType, dataSet,
- Im.CONTENT_ITEM_TYPE);
- if (imKind != null) {
- final DataAction action = new DataAction(context, Im.CONTENT_ITEM_TYPE, imKind,
- dataId, cursor);
- considerAdd(action, cache);
+ // Handle Email rows with presence data as Im entry
+ final DataStatus status = data.getStatuses().get(dataId);
+ if (status != null && Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
+ final DataKind imKind = accountTypes.getKindOrFallback(accountType, dataSet,
+ Im.CONTENT_ITEM_TYPE);
+ if (imKind != null) {
+ final DataAction action = new DataAction(context, Im.CONTENT_ITEM_TYPE,
+ imKind, dataId, entryValues);
+ action.setPresence(status.getPresence());
+ considerAdd(action, cache);
+ }
}
}
}
@@ -472,20 +359,7 @@
Collapser.collapseList(actionChildren);
}
- if (cursor.moveToLast()) {
- // Read contact name from last data row
- final String name = cursor.getString(DataQuery.DISPLAY_NAME);
- setHeaderNameText(R.id.name, name);
- }
-
- if (photoView != null) {
- // Place photo when discovered in data, otherwise show generic avatar
- if (photoBitmap != null) {
- photoView.setImageBitmap(photoBitmap);
- } else {
- photoView.setImageResource(ContactPhotoManager.getDefaultAvatarResId(true, false));
- }
- }
+ setHeaderNameText(R.id.name, data.getDisplayName());
// All the mime-types to add.
final Set<String> containedTypes = new HashSet<String>(mActions.keySet());
@@ -515,6 +389,7 @@
}
// Add buttons for each mimetype
+ mTrack.removeAllViews();
for (String mimeType : mSortedActionMimeTypes) {
final View actionView = inflateAction(mimeType, cache, mTrack);
mTrack.addView(actionView);
@@ -574,6 +449,61 @@
listFragment.setListener(mListFragmentListener);
}
+ private LoaderCallbacks<ContactLoader.Result> mLoaderCallbacks =
+ new LoaderCallbacks<ContactLoader.Result>() {
+ @Override
+ public void onLoaderReset(Loader<ContactLoader.Result> loader) {
+ }
+
+ @Override
+ public void onLoadFinished(Loader<ContactLoader.Result> loader, ContactLoader.Result data) {
+ if (isFinishing()) {
+ hide(false);
+ return;
+ }
+ if (data.isError()) {
+ // This shouldn't ever happen, so throw an exception. The {@link ContactLoader}
+ // should log the actual exception.
+ throw new IllegalStateException("Failed to load contact", data.getException());
+ }
+ if (data.isNotFound()) {
+ Log.i(TAG, "No contact found: " + ((ContactLoader)loader).getLookupUri());
+ Toast.makeText(QuickContactActivity.this, R.string.invalidContactMessage,
+ Toast.LENGTH_LONG).show();
+ hide(false);
+ return;
+ }
+
+ bindData(data);
+
+ if (TRACE_LAUNCH) {
+ android.os.Debug.stopMethodTracing();
+ }
+
+ // Data bound and ready, pull curtain to show. Put this on the Handler to ensure
+ // that the layout passes are completed
+ new Handler().post(new Runnable() {
+ @Override
+ public void run() {
+ mFloatingLayout.showChild(new Runnable() {
+ @Override
+ public void run() {
+ mHasFinishedAnimatingIn = true;
+ }
+ });
+ }
+ });
+ }
+
+ @Override
+ public Loader<ContactLoader.Result> onCreateLoader(int id, Bundle args) {
+ if (mLookupUri == null) {
+ Log.wtf(TAG, "Lookup uri wasn't initialized. Loader was started too early");
+ }
+ return new ContactLoader(getApplicationContext(), mLookupUri);
+ }
+ };
+
/** A type (e.g. Call/Addresses was clicked) */
private final OnClickListener mTypeViewClickListener = new OnClickListener() {
@Override
@@ -653,53 +583,4 @@
new Handler().post(startAppRunnable);
}
};
-
- private interface DataQuery {
- final String[] PROJECTION = new String[] {
- Data._ID,
-
- RawContacts.ACCOUNT_TYPE,
- RawContacts.DATA_SET,
- Contacts.STARRED,
- Contacts.DISPLAY_NAME,
-
- Data.STATUS,
- Data.STATUS_RES_PACKAGE,
- Data.STATUS_ICON,
- Data.STATUS_LABEL,
- Data.STATUS_TIMESTAMP,
- Data.PRESENCE,
- Data.CHAT_CAPABILITY,
-
- Data.RES_PACKAGE,
- Data.MIMETYPE,
- Data.IS_PRIMARY,
- Data.IS_SUPER_PRIMARY,
- Data.RAW_CONTACT_ID,
-
- Data.DATA1, Data.DATA2, Data.DATA3, Data.DATA4, Data.DATA5,
- Data.DATA6, Data.DATA7, Data.DATA8, Data.DATA9, Data.DATA10, Data.DATA11,
- Data.DATA12, Data.DATA13, Data.DATA14, Data.DATA15,
- };
-
- final int _ID = 0;
-
- final int ACCOUNT_TYPE = 1;
- final int DATA_SET = 2;
- final int STARRED = 3;
- final int DISPLAY_NAME = 4;
-
- final int STATUS = 5;
- final int STATUS_RES_PACKAGE = 6;
- final int STATUS_ICON = 7;
- final int STATUS_LABEL = 8;
- final int STATUS_TIMESTAMP = 9;
- final int PRESENCE = 10;
- final int CHAT_CAPABILITY = 11;
-
- final int RES_PACKAGE = 12;
- final int MIMETYPE = 13;
- final int IS_PRIMARY = 14;
- final int IS_SUPER_PRIMARY = 15;
- }
}
diff --git a/src/com/android/contacts/quickcontact/QuickContactListFragment.java b/src/com/android/contacts/quickcontact/QuickContactListFragment.java
index c6187e9..117480a 100644
--- a/src/com/android/contacts/quickcontact/QuickContactListFragment.java
+++ b/src/com/android/contacts/quickcontact/QuickContactListFragment.java
@@ -16,14 +16,14 @@
package com.android.contacts.quickcontact;
+import com.android.contacts.ContactPresenceIconUtil;
import com.android.contacts.R;
import android.app.Fragment;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Website;
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -31,7 +31,7 @@
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
-import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
import android.widget.ListView;
import android.widget.TextView;
@@ -41,7 +41,7 @@
public class QuickContactListFragment extends Fragment {
private ListView mListView;
private List<Action> mActions;
- private LinearLayout mFragmentContainer;
+ private RelativeLayout mFragmentContainer;
private Listener mListener;
public QuickContactListFragment() {
@@ -50,7 +50,7 @@
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
- mFragmentContainer = (LinearLayout) inflater.inflate(R.layout.quickcontact_list_fragment,
+ mFragmentContainer = (RelativeLayout) inflater.inflate(R.layout.quickcontact_list_fragment,
container, false);
mListView = (ListView) mFragmentContainer.findViewById(R.id.list);
mListView.setItemsCanFocus(true);
@@ -111,6 +111,8 @@
final ImageView alternateActionButton = (ImageView) resultView.findViewById(
R.id.secondary_action_button);
final View alternateActionDivider = resultView.findViewById(R.id.vertical_divider);
+ final ImageView presenceIconView =
+ (ImageView) resultView.findViewById(R.id.presence_icon);
actionsContainer.setOnClickListener(mPrimaryActionClickListener);
actionsContainer.setTag(action);
@@ -143,6 +145,14 @@
text2.setVisibility(View.VISIBLE);
}
}
+ final Drawable presenceIcon = ContactPresenceIconUtil.getPresenceIcon(
+ getActivity(), action.getPresence());
+ if (presenceIcon != null) {
+ presenceIconView.setImageDrawable(presenceIcon);
+ presenceIconView.setVisibility(View.VISIBLE);
+ } else {
+ presenceIconView.setVisibility(View.GONE);
+ }
return resultView;
}
});
diff --git a/src/com/android/contacts/util/AccountFilterUtil.java b/src/com/android/contacts/util/AccountFilterUtil.java
index 955c195..d63db55 100644
--- a/src/com/android/contacts/util/AccountFilterUtil.java
+++ b/src/com/android/contacts/util/AccountFilterUtil.java
@@ -118,22 +118,26 @@
*
* @param activity
* @param requestCode requestCode for {@link Activity#startActivityForResult(Intent, int)}
+ * @param currentFilter currently-selected filter, so that it can be displayed as activated.
*/
public static void startAccountFilterActivityForResult(
- Activity activity, int requestCode) {
+ Activity activity, int requestCode, ContactListFilter currentFilter) {
final Intent intent = new Intent(activity, AccountFilterActivity.class);
+ intent.putExtra(AccountFilterActivity.KEY_EXTRA_CURRENT_FILTER, currentFilter);
activity.startActivityForResult(intent, requestCode);
}
/**
- * Very similar to {@link #startAccountFilterActivityForResult(Activity, int)} but uses
- * Fragment instead.
+ * Very similar to
+ * {@link #startAccountFilterActivityForResult(Activity, int, ContactListFilter)}
+ * but uses Fragment instead.
*/
public static void startAccountFilterActivityForResult(
- Fragment fragment, int requestCode) {
+ Fragment fragment, int requestCode, ContactListFilter currentFilter) {
final Activity activity = fragment.getActivity();
if (activity != null) {
final Intent intent = new Intent(activity, AccountFilterActivity.class);
+ intent.putExtra(AccountFilterActivity.KEY_EXTRA_CURRENT_FILTER, currentFilter);
fragment.startActivityForResult(intent, requestCode);
} else {
Log.w(TAG, "getActivity() returned null. Ignored");
diff --git a/src/com/android/contacts/vcard/CancelActivity.java b/src/com/android/contacts/vcard/CancelActivity.java
index c890607..5dafa53 100644
--- a/src/com/android/contacts/vcard/CancelActivity.java
+++ b/src/com/android/contacts/vcard/CancelActivity.java
@@ -87,17 +87,13 @@
protected Dialog onCreateDialog(int id, Bundle bundle) {
switch (id) {
case R.id.dialog_cancel_confirmation: {
- final String title;
final String message;
if (mType == VCardService.TYPE_IMPORT) {
- title = getString(R.string.cancel_import_confirmation_title);
message = getString(R.string.cancel_import_confirmation_message, mDisplayName);
} else {
- title = getString(R.string.cancel_export_confirmation_title);
message = getString(R.string.cancel_export_confirmation_message, mDisplayName);
}
final AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(title)
.setMessage(message)
.setPositiveButton(android.R.string.ok, new RequestCancelListener())
.setOnCancelListener(mCancelListener)
diff --git a/src/com/android/contacts/vcard/ExportVCardActivity.java b/src/com/android/contacts/vcard/ExportVCardActivity.java
index c36cc38..f38c9df 100644
--- a/src/com/android/contacts/vcard/ExportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ExportVCardActivity.java
@@ -235,7 +235,6 @@
case R.id.dialog_sdcard_not_found: {
mProcessOngoing = false;
return new AlertDialog.Builder(this)
- .setTitle(R.string.no_sdcard_title)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(R.string.no_sdcard_message)
.setPositiveButton(android.R.string.ok, this).create();
diff --git a/src/com/android/contacts/vcard/ImportVCardActivity.java b/src/com/android/contacts/vcard/ImportVCardActivity.java
index 18b9cc1..2dc92af 100644
--- a/src/com/android/contacts/vcard/ImportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ImportVCardActivity.java
@@ -901,10 +901,9 @@
}
case R.id.dialog_searching_vcard: {
if (mProgressDialogForScanVCard == null) {
- String title = getString(R.string.searching_vcard_title);
String message = getString(R.string.searching_vcard_message);
mProgressDialogForScanVCard =
- ProgressDialog.show(this, title, message, true, false);
+ ProgressDialog.show(this, "", message, true, false);
mProgressDialogForScanVCard.setOnCancelListener(mVCardScanThread);
mVCardScanThread.start();
}
@@ -912,7 +911,6 @@
}
case R.id.dialog_sdcard_not_found: {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.no_sdcard_title)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(R.string.no_sdcard_message)
.setOnCancelListener(mCancelListener)
@@ -922,7 +920,6 @@
case R.id.dialog_vcard_not_found: {
final String message = getString(R.string.import_failure_no_vcard_file);
AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.scanning_sdcard_failed_title)
.setMessage(message)
.setOnCancelListener(mCancelListener)
.setPositiveButton(android.R.string.ok, mCancelListener);
@@ -954,7 +951,6 @@
String message = (getString(R.string.scanning_sdcard_failed_message,
getString(R.string.fail_reason_io_error)));
AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.scanning_sdcard_failed_title)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(message)
.setOnCancelListener(mCancelListener)
diff --git a/src/com/android/contacts/vcard/NfcImportVCardActivity.java b/src/com/android/contacts/vcard/NfcImportVCardActivity.java
index d182cfd..c3a55d2 100644
--- a/src/com/android/contacts/vcard/NfcImportVCardActivity.java
+++ b/src/com/android/contacts/vcard/NfcImportVCardActivity.java
@@ -154,25 +154,20 @@
if (!NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
Log.w(TAG, "Unknowon intent " + intent);
finish();
- }
-
- NdefMessage msg = (NdefMessage) intent.getParcelableArrayExtra(
- NfcAdapter.EXTRA_NDEF_MESSAGES)[0];
- NdefRecord records[] = msg.getRecords();
- if (records == null || records.length == 0) {
- Log.w(TAG, "No records " + intent);
- finish();
- }
-
- NdefRecord record = records[0];
- String type = new String(record.getType(), Charset.forName("UTF8"));
- if (record.getTnf() != NdefRecord.TNF_MIME_MEDIA ||
- (!"text/x-vcard".equalsIgnoreCase(type) && !"text/vcard".equals(type))) {
- Log.w(TAG, "Not a vcard");
- //setStatus(getString(R.string.fail_reason_not_supported));
return;
}
- mRecord = record;
+
+ String type = intent.getType();
+ if (type == null ||
+ (!"text/x-vcard".equals(type) && !"text/vcard".equals(type))) {
+ Log.w(TAG, "Not a vcard");
+ //setStatus(getString(R.string.fail_reason_not_supported));
+ finish();
+ return;
+ }
+ NdefMessage msg = (NdefMessage) intent.getParcelableArrayExtra(
+ NfcAdapter.EXTRA_NDEF_MESSAGES)[0];
+ mRecord = msg.getRecords()[0];
final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
final List<AccountWithDataSet> accountList = accountTypes.getAccounts(true);
diff --git a/src/com/android/contacts/widget/CompositeListAdapter.java b/src/com/android/contacts/widget/CompositeListAdapter.java
index 692e073..610b97f 100644
--- a/src/com/android/contacts/widget/CompositeListAdapter.java
+++ b/src/com/android/contacts/widget/CompositeListAdapter.java
@@ -15,6 +15,7 @@
*/
package com.android.contacts.widget;
+import com.android.contacts.test.NeededForTesting;
import com.google.common.annotations.VisibleForTesting;
import android.database.DataSetObserver;
@@ -27,7 +28,11 @@
* A general purpose adapter that is composed of multiple sub-adapters. It just
* appends them in the order they are added. It listens to changes from all
* sub-adapters and propagates them to its own listeners.
+ *
+ * This class not used for now -- but let's keep running the test in case we want to revive it...
+ * (So NeededForTesting)
*/
+@NeededForTesting
public class CompositeListAdapter extends BaseAdapter {
private static final int INITIAL_CAPACITY = 2;
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 6ea42d6..2806830 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -119,6 +119,9 @@
android:name="android.provider.CONTACTS_STRUCTURE"
android:resource="@xml/test_basic_contacts" />
</service>
+
+ <service android:name=".QueryService" />
+ <service android:name=".PhoneNumberTestService" />
</application>
<instrumentation android:name="android.test.InstrumentationTestRunner"
diff --git a/tests/res/drawable/ic_contact_picture.png b/tests/res/drawable/ic_contact_picture.png
index 3a338e8..6876777 100644
--- a/tests/res/drawable/ic_contact_picture.png
+++ b/tests/res/drawable/ic_contact_picture.png
Binary files differ
diff --git a/tests/res/values/donottranslate_strings.xml b/tests/res/values/donottranslate_strings.xml
index 19ebde3..c3cbc10 100644
--- a/tests/res/values/donottranslate_strings.xml
+++ b/tests/res/values/donottranslate_strings.xml
@@ -23,7 +23,7 @@
<!-- List modes -->
<item>LIST_DEFAULT</item>
<item>LIST_ALL_CONTACTS_ACTION</item>
- <item>LIST_CONTACTS_WITH_PHONES_ACTION</item>
+ <item>LIST_CONTACTS_WITH_PHONES_ACTION (deprecated)</item>
<item>LIST_STARRED_ACTION</item>
<item>LIST_FREQUENT_ACTION</item>
<item>LIST_STREQUENT_ACTION</item>
diff --git a/tests/src/com/android/contacts/CallDetailActivityTest.java b/tests/src/com/android/contacts/CallDetailActivityTest.java
index ac02588..689f946 100644
--- a/tests/src/com/android/contacts/CallDetailActivityTest.java
+++ b/tests/src/com/android/contacts/CallDetailActivityTest.java
@@ -25,7 +25,6 @@
import com.android.contacts.util.IntegrationTestUtils;
import com.android.contacts.util.LocaleTestUtils;
import com.android.internal.view.menu.ContextMenuBuilder;
-import com.google.common.base.Preconditions;
import com.google.common.io.Closeables;
import android.content.ContentResolver;
@@ -227,7 +226,7 @@
}
private void setActivityIntentForTestCallEntry() {
- Preconditions.checkState(mCallLogUri == null, "mUri should be null");
+ assertNull(mCallLogUri);
ContentResolver contentResolver = getContentResolver();
ContentValues values = new ContentValues();
values.put(CallLog.Calls.NUMBER, CONTACT_NUMBER);
@@ -237,7 +236,7 @@
}
private void setActivityIntentForTestVoicemailEntry() {
- Preconditions.checkState(mVoicemailUri == null, "mUri should be null");
+ assertNull(mVoicemailUri);
ContentResolver contentResolver = getContentResolver();
ContentValues values = new ContentValues();
values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER);
@@ -252,7 +251,7 @@
}
private void setActivityIntentForRealFileVoicemailEntry() throws IOException {
- Preconditions.checkState(mVoicemailUri == null, "mUri should be null");
+ assertNull(mVoicemailUri);
ContentValues values = new ContentValues();
values.put(VoicemailContract.Voicemails.DATE, String.valueOf(System.currentTimeMillis()));
values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER);
@@ -307,7 +306,7 @@
}
private TextView assertHasOneTextViewContaining(String text) throws Throwable {
- Preconditions.checkNotNull(mActivityUnderTest, "forget to call startActivityUnderTest()?");
+ assertNotNull(mActivityUnderTest);
List<TextView> views = mTestUtils.getTextViewsWithString(mActivityUnderTest, text);
assertEquals("There should have been one TextView with text '" + text + "' but found "
+ views, 1, views.size());
@@ -315,14 +314,14 @@
}
private void assertZeroTextViewsContaining(String text) throws Throwable {
- Preconditions.checkNotNull(mActivityUnderTest, "forget to call startActivityUnderTest()?");
+ assertNotNull(mActivityUnderTest);
List<TextView> views = mTestUtils.getTextViewsWithString(mActivityUnderTest, text);
assertEquals("There should have been no TextViews with text '" + text + "' but found "
+ views, 0, views.size());
}
private void startActivityUnderTest() throws Throwable {
- Preconditions.checkState(mActivityUnderTest == null, "must only start the activity once");
+ assertNull(mActivityUnderTest);
mActivityUnderTest = getActivity();
assertNotNull("activity should not be null", mActivityUnderTest);
// We have to run all tasks, not just one.
diff --git a/tests/src/com/android/contacts/EntityModifierTests.java b/tests/src/com/android/contacts/EntityModifierTests.java
index 6872604..df4934a 100644
--- a/tests/src/com/android/contacts/EntityModifierTests.java
+++ b/tests/src/com/android/contacts/EntityModifierTests.java
@@ -1130,6 +1130,25 @@
AccountType newAccountType = new ExchangeAccountType(getContext(), "");
DataKind kind = newAccountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
+ // Create 5 numbers.
+ // - "1" -- HOME
+ // - "2" -- WORK
+ // - "3" -- CUSTOM
+ // - "4" -- WORK
+ // - "5" -- WORK_MOBILE
+ // Then we convert it to Exchange account type.
+ // - "1" -- HOME
+ // - "2" -- WORK
+ // - "3" -- Because CUSTOM is not supported, it'll be changed to the default, MOBILE
+ // - "4" -- WORK
+ // - "5" -- WORK_MOBILE not suppoted again, so will be MOBILE.
+ // But then, Exchange doesn't support multiple MOBILE numbers, so "5" will be removed.
+ // i.e. the result will be:
+ // - "1" -- HOME
+ // - "2" -- WORK
+ // - "3" -- MOBILE
+ // - "4" -- WORK
+
EntityDelta oldState = new EntityDelta();
ContentValues mockNameValues = new ContentValues();
mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
@@ -1138,12 +1157,12 @@
oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
mockNameValues = new ContentValues();
mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
- mockNameValues.put(Phone.TYPE, Phone.TYPE_MOBILE);
+ mockNameValues.put(Phone.TYPE, Phone.TYPE_WORK);
mockNameValues.put(Phone.NUMBER, "2");
oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
mockNameValues = new ContentValues();
mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
- // Exchange doesn't support this type. Default to HOME
+ // Exchange doesn't support this type. Default to MOBILE
mockNameValues.put(Phone.TYPE, Phone.TYPE_CUSTOM);
mockNameValues.put(Phone.LABEL, "custom_type");
mockNameValues.put(Phone.NUMBER, "3");
@@ -1155,8 +1174,6 @@
oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
mockNameValues = new ContentValues();
- // This field should be ignored, as Exchange only allows 2 HOME phone numbers while we
- // already have that number of HOME phones.
mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
mockNameValues.put(Phone.TYPE, Phone.TYPE_WORK_MOBILE);
mockNameValues.put(Phone.NUMBER, "5");
@@ -1169,13 +1186,13 @@
assertNotNull(list);
assertEquals(4, list.size());
- int defaultType = kind.typeList.get(0).rawValue;
+ int defaultType = Phone.TYPE_MOBILE;
ContentValues outputValues = list.get(0).getAfter();
assertEquals(Phone.TYPE_HOME, outputValues.getAsInteger(Phone.TYPE).intValue());
assertEquals("1", outputValues.getAsString(Phone.NUMBER));
outputValues = list.get(1).getAfter();
- assertEquals(Phone.TYPE_MOBILE, outputValues.getAsInteger(Phone.TYPE).intValue());
+ assertEquals(Phone.TYPE_WORK, outputValues.getAsInteger(Phone.TYPE).intValue());
assertEquals("2", outputValues.getAsString(Phone.NUMBER));
outputValues = list.get(2).getAfter();
assertEquals(defaultType, outputValues.getAsInteger(Phone.TYPE).intValue());
diff --git a/tests/src/com/android/contacts/activities/PeopleActivityTest.java b/tests/src/com/android/contacts/activities/PeopleActivityTest.java
index 66c2c5a..ea7c3dc 100644
--- a/tests/src/com/android/contacts/activities/PeopleActivityTest.java
+++ b/tests/src/com/android/contacts/activities/PeopleActivityTest.java
@@ -48,7 +48,7 @@
import android.provider.ContactsContract.ProviderStatus;
import android.provider.Settings;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.Smoke;
+import android.test.suitebuilder.annotation.SmallTest;
import android.widget.TextView;
/**
@@ -64,7 +64,7 @@
* -w com.android.contacts.tests/android.test.InstrumentationTestRunner
*
*/
-@Smoke
+@SmallTest
public class PeopleActivityTest
extends ActivityInstrumentationTestCase2<PeopleActivity>
{
diff --git a/tests/src/com/android/contacts/calllog/CallLogFragmentTest.java b/tests/src/com/android/contacts/calllog/CallLogFragmentTest.java
index 9cac8fe..89c0a99 100644
--- a/tests/src/com/android/contacts/calllog/CallLogFragmentTest.java
+++ b/tests/src/com/android/contacts/calllog/CallLogFragmentTest.java
@@ -619,14 +619,14 @@
/** Asserts that the number and label text view contains the given text. */
private void assertNumberAndLabelAre(CallLogListItemViews views, CharSequence number,
- CharSequence numberLabel) {
+ CharSequence label) {
assertEquals(View.VISIBLE, views.phoneCallDetailsViews.numberView.getVisibility());
- final CharSequence expectedText;
- if (numberLabel == null) {
- expectedText = number;
- } else {
- expectedText = numberLabel + " " + number;
+ assertEquals(number, views.phoneCallDetailsViews.numberView.getText().toString());
+
+ assertEquals(label == null ? View.GONE : View.VISIBLE,
+ views.phoneCallDetailsViews.labelView.getVisibility());
+ if (label != null) {
+ assertEquals(label, views.phoneCallDetailsViews.labelView.getText().toString());
}
- assertEquals(expectedText, views.phoneCallDetailsViews.numberView.getText().toString());
}
}
diff --git a/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java b/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
index 19b14d9..131af96 100644
--- a/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
+++ b/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
@@ -21,6 +21,7 @@
import com.google.common.collect.Lists;
import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
import java.util.ArrayList;
@@ -33,6 +34,7 @@
/**
* Unit tests for {@link StreamItemAdapter}.
*/
+@SmallTest
public class StreamItemAdapterTest extends AndroidTestCase {
private StreamItemAdapter mAdapter;
private FakeOnClickListener mListener;
diff --git a/tests/src/com/android/contacts/format/PrefixHighligherTest.java b/tests/src/com/android/contacts/format/PrefixHighligherTest.java
index a0c0ff3..668330b 100644
--- a/tests/src/com/android/contacts/format/PrefixHighligherTest.java
+++ b/tests/src/com/android/contacts/format/PrefixHighligherTest.java
@@ -17,11 +17,13 @@
package com.android.contacts.format;
import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
import android.widget.TextView;
/**
* Unit tests for {@link PrefixHighlighter}.
*/
+@SmallTest
public class PrefixHighligherTest extends AndroidTestCase {
private static final int TEST_PREFIX_HIGHLIGHT_COLOR = 0xFF0000;
/** The HTML code used to mark the start of the highlighted part. */
diff --git a/tests/src/com/android/contacts/format/SpannedTestUtils.java b/tests/src/com/android/contacts/format/SpannedTestUtils.java
index 625c6aa..646a7ec 100644
--- a/tests/src/com/android/contacts/format/SpannedTestUtils.java
+++ b/tests/src/com/android/contacts/format/SpannedTestUtils.java
@@ -16,6 +16,7 @@
package com.android.contacts.format;
+import android.test.suitebuilder.annotation.SmallTest;
import android.text.Html;
import android.text.Spanned;
import android.text.TextUtils;
@@ -26,6 +27,7 @@
/**
* Utility class to check the value of spanned text in text views.
*/
+@SmallTest
public class SpannedTestUtils {
/**
* Checks that the text contained in the text view matches the given HTML text.
diff --git a/tests/src/com/android/contacts/format/TestTextWithHighlightingFactory.java b/tests/src/com/android/contacts/format/TestTextWithHighlightingFactory.java
index f2848d0..2deaef3 100644
--- a/tests/src/com/android/contacts/format/TestTextWithHighlightingFactory.java
+++ b/tests/src/com/android/contacts/format/TestTextWithHighlightingFactory.java
@@ -21,10 +21,12 @@
import android.database.CharArrayBuffer;
import android.graphics.Typeface;
+import android.test.suitebuilder.annotation.SmallTest;
import android.text.SpannableStringBuilder;
import android.text.style.StyleSpan;
/** A factory for {@link TextWithHighlighting} that wraps its parts in italics. */
+@SmallTest
public final class TestTextWithHighlightingFactory implements TextWithHighlightingFactory {
/** A {@link TextWithHighlighting} implementation that wraps its parts in italics. */
private final static class TestTextWithHighlighting extends SpannableStringBuilder
diff --git a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
index 2c4b74c..b37d24f 100644
--- a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
+++ b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
@@ -35,7 +35,7 @@
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Contacts.Entity;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.Smoke;
+import android.test.suitebuilder.annotation.SmallTest;
/**
* Tests for {@link ContactDeletionInteraction}.
@@ -47,7 +47,7 @@
* adb shell am instrument \
* -w com.android.contacts.tests/android.test.InstrumentationTestRunner
*/
-@Smoke
+@SmallTest
public class ContactDeletionInteractionTest
extends ActivityInstrumentationTestCase2<FragmentTestActivity> {
diff --git a/tests/src/com/android/contacts/interactions/PhoneNumberInteractionTest.java b/tests/src/com/android/contacts/interactions/PhoneNumberInteractionTest.java
index e0b443a..2da8859 100644
--- a/tests/src/com/android/contacts/interactions/PhoneNumberInteractionTest.java
+++ b/tests/src/com/android/contacts/interactions/PhoneNumberInteractionTest.java
@@ -29,11 +29,12 @@
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.Smoke;
+import android.test.suitebuilder.annotation.SmallTest;
import java.util.ArrayList;
import java.util.List;
@@ -48,7 +49,7 @@
* adb shell am instrument \
* -w com.android.contacts.tests/android.test.InstrumentationTestRunner
*/
-@Smoke
+@SmallTest
public class PhoneNumberInteractionTest extends InstrumentationTestCase {
static {
@@ -89,7 +90,8 @@
public void testSendSmsWhenOnlyOneNumberAvailable() {
Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 13);
expectQuery(contactUri)
- .returnRow(1, "123", 0, null, null, Phone.TYPE_HOME, null);
+ .returnRow(1, "123", 0, null, null, Phone.TYPE_HOME, null,
+ Phone.CONTENT_ITEM_TYPE);
TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
mContext, InteractionType.SMS, null);
@@ -107,7 +109,8 @@
public void testSendSmsWhenDataIdIsProvided() {
Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, 1);
expectQuery(dataUri, true /* isDataUri */ )
- .returnRow(1, "987", 0, null, null, Phone.TYPE_HOME, null);
+ .returnRow(1, "987", 0, null, null, Phone.TYPE_HOME, null,
+ Phone.CONTENT_ITEM_TYPE);
TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
mContext, InteractionType.SMS, null);
@@ -125,8 +128,10 @@
public void testSendSmsWhenThereIsPrimaryNumber() {
Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 13);
expectQuery(contactUri)
- .returnRow(1, "123", 0, null, null, Phone.TYPE_HOME, null)
- .returnRow(2, "456", 1, null, null, Phone.TYPE_HOME, null);
+ .returnRow(
+ 1, "123", 0, null, null, Phone.TYPE_HOME, null, Phone.CONTENT_ITEM_TYPE)
+ .returnRow(
+ 2, "456", 1, null, null, Phone.TYPE_HOME, null, Phone.CONTENT_ITEM_TYPE);
TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
mContext, InteractionType.SMS, null);
@@ -164,8 +169,10 @@
public void testCallNumberWhenThereAreDuplicates() {
Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 13);
expectQuery(contactUri)
- .returnRow(1, "123", 0, null, null, Phone.TYPE_HOME, null)
- .returnRow(2, "123", 0, null, null, Phone.TYPE_WORK, null);
+ .returnRow(1, "123", 0, null, null, Phone.TYPE_HOME, null,
+ Phone.CONTENT_ITEM_TYPE)
+ .returnRow(2, "123", 0, null, null, Phone.TYPE_WORK, null,
+ Phone.CONTENT_ITEM_TYPE);
TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
mContext, InteractionType.PHONE_CALL, null);
@@ -180,11 +187,31 @@
assertEquals("tel:123", intent.getDataString());
}
+ public void testCallWithSip() {
+ Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 13);
+ expectQuery(contactUri)
+ .returnRow(1, "example@example.com", 0, null, null, Phone.TYPE_HOME, null,
+ SipAddress.CONTENT_ITEM_TYPE);
+ TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
+ mContext, InteractionType.PHONE_CALL, null);
+
+ interaction.startInteraction(contactUri);
+ interaction.getLoader().waitForLoader();
+
+ Intent intent = mContext.getIntentForStartActivity();
+ assertNotNull(intent);
+
+ assertEquals(Intent.ACTION_CALL_PRIVILEGED, intent.getAction());
+ assertEquals("sip:example%40example.com", intent.getDataString());
+ }
+
public void testShowDisambigDialogForCalling() {
Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 13);
expectQuery(contactUri)
- .returnRow(1, "123", 0, "account", null, Phone.TYPE_HOME, "label")
- .returnRow(2, "456", 0, null, null, Phone.TYPE_WORK, null);
+ .returnRow(1, "123", 0, "account", null, Phone.TYPE_HOME, "label",
+ Phone.CONTENT_ITEM_TYPE)
+ .returnRow(2, "456", 0, null, null, Phone.TYPE_WORK, null,
+ Phone.CONTENT_ITEM_TYPE);
TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
mContext, InteractionType.PHONE_CALL, null);
@@ -224,7 +251,9 @@
RawContacts.ACCOUNT_TYPE,
RawContacts.DATA_SET,
Phone.TYPE,
- Phone.LABEL)
- .withSelection("mimetype='vnd.android.cursor.item/phone_v2' AND data1 NOT NULL");
+ Phone.LABEL,
+ Phone.MIMETYPE)
+ .withSelection("mimetype IN ('vnd.android.cursor.item/phone_v2',"
+ + " 'vnd.android.cursor.item/sip_address') AND data1 NOT NULL");
}
}
diff --git a/tests/src/com/android/contacts/tests/PhoneNumberTestService.java b/tests/src/com/android/contacts/tests/PhoneNumberTestService.java
new file mode 100644
index 0000000..894e66e
--- /dev/null
+++ b/tests/src/com/android/contacts/tests/PhoneNumberTestService.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.tests;
+
+import com.android.i18n.phonenumbers.NumberParseException;
+import com.android.i18n.phonenumbers.PhoneNumberUtil;
+import com.android.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
+import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber;
+
+import android.app.IntentService;
+import android.content.Context;
+import android.content.Intent;
+import android.location.CountryDetector;
+import android.telephony.PhoneNumberUtils;
+import android.util.Log;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * A service to test various phone number formatters.
+ *
+ Usage:
+ adb shell am startservice -e n PHONE_NUMBER \
+ [-e c OPTIONAL COUNTRY CODE] \
+ com.android.contacts.tests/.PhoneNumberTestService
+
+ Example:
+
+ adb shell am startservice -e n '6502530000' \
+ com.android.contacts.tests/.PhoneNumberTestService
+ */
+public class PhoneNumberTestService extends IntentService {
+ private static final String TAG = "phonenumber";
+
+ private static final String EXTRA_PHONE_NUMBER = "n";
+ private static final String EXTRA_COUNTRY_CODE = "c";
+
+ public PhoneNumberTestService() {
+ super("PhoneNumberTestService");
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ final String number = intent.getStringExtra(EXTRA_PHONE_NUMBER);
+ final String country = intent.getStringExtra(EXTRA_COUNTRY_CODE);
+ final String defaultCountry = getCurrentCountryCode();
+
+ Log.i(TAG, "Input phone number: " + number);
+ Log.i(TAG, "Input country code: " + country);
+ Log.i(TAG, "Current country code: " + defaultCountry);
+
+ // Dump for the given country, the current country, US, GB and JP.
+ Set<String> countries = new LinkedHashSet<String>();
+ if (country != null) countries.add(country);
+ countries.add(defaultCountry);
+ countries.add("US");
+ countries.add("GB");
+ countries.add("JP");
+
+ for (String c : countries) {
+ dump(number, c);
+ }
+ }
+
+ private void dump(String number, String country) {
+ Log.i(TAG, "Result for: " + number + " / " +country);
+ dump_PhoneNumberUtils_formatNumberToE164(number, country);
+ dump_PhoneNumberUtil_format(number, country, PhoneNumberFormat.E164);
+ dump_PhoneNumberUtil_format(number, country, PhoneNumberFormat.INTERNATIONAL);
+ dump_PhoneNumberUtil_format(number, country, PhoneNumberFormat.NATIONAL);
+ dump_PhoneNumberUtil_format(number, country, PhoneNumberFormat.RFC3966);
+ }
+
+ private void dump_PhoneNumberUtils_formatNumberToE164(String number, String country) {
+ Log.i(TAG, " formatNumberToE164(" + number + ", " + country
+ + ") = " + PhoneNumberUtils.formatNumberToE164(number, country));
+ }
+
+ private void dump_PhoneNumberUtil_format(String number, String country,
+ PhoneNumberFormat format) {
+ String formatted;
+ boolean isValid = false;
+ try {
+ final PhoneNumberUtil util = PhoneNumberUtil.getInstance();
+ final PhoneNumber pn = util.parse(number, country);
+ isValid = util.isValidNumber(pn);
+ formatted = util.format(pn, format);
+ } catch (NumberParseException e) {
+ formatted = "Error: " + e.toString();
+ }
+ Log.i(TAG, " PhoneNumberUtil.format(parse(" + number + ", " + country + "), " + format
+ + ") = " + formatted + (isValid ? " (valid)" : " (invalid)"));
+ }
+
+ private String getCurrentCountryCode() {
+ final CountryDetector countryDetector =
+ (CountryDetector) getSystemService(Context.COUNTRY_DETECTOR);
+ return countryDetector.detectCountry().getCountryIso();
+ }
+}
+
diff --git a/tests/src/com/android/contacts/tests/QueryService.java b/tests/src/com/android/contacts/tests/QueryService.java
new file mode 100644
index 0000000..04a95c5
--- /dev/null
+++ b/tests/src/com/android/contacts/tests/QueryService.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.tests;
+
+import android.app.IntentService;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.text.TextUtils;
+import android.util.Log;
+
+/**
+ * A service that executes a query specified by an intent and dump the result on logcat. Use the
+ * "am" command to launch it.
+ *
+ Usage:
+ adb shell am startservice -d URI \
+ [-e p OPTIONAL PROJECTION] [-e s OPTIONAL SELECTION] [-e s OPTIONAL ORDER BY] \
+ com.android.contacts.tests/.QueryService
+
+ Example:
+
+ adb shell am startservice -d content://com.android.contacts/directories \
+ -e p accountName,accountType -e s 'accountName NOT NULL' -e o '_id' \
+ com.android.contacts.tests/.QueryService
+ */
+public class QueryService extends IntentService {
+ private static final String TAG = "contactsquery";
+
+ private static final String EXTRA_PROJECTION = "p";
+ private static final String EXTRA_SELECTION = "s";
+ private static final String EXTRA_ORDER = "o";
+ private static final String NULL_STRING = "*null*";
+ private static final String SEPARATOR = "|";
+
+ public QueryService() {
+ super("ContactsQueryService");
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ final Uri uri = intent.getData();
+ // Unfortunately "am" doesn't support string arrays...
+ final String projection = intent.getStringExtra(EXTRA_PROJECTION);
+ final String selection = intent.getStringExtra(EXTRA_SELECTION);
+ final String order = intent.getStringExtra(EXTRA_ORDER);
+
+ Log.i(TAG, "URI: " + uri);
+ Log.i(TAG, "Projection: " + projection);
+ Log.i(TAG, "Selection: " + selection);
+
+ try {
+ Cursor c = getContentResolver().query(uri, parseProjection(projection), selection, null,
+ order);
+ if (c == null) {
+ Log.i(TAG, "(no results)");
+ return;
+ }
+ StringBuilder sb = new StringBuilder();
+ try {
+ Log.i(TAG, "Result count: " + c.getCount());
+
+ final int columnCount = c.getColumnCount();
+
+ sb.setLength(0);
+ for (int i = 0; i < columnCount; i++) {
+ add(sb, c.getColumnName(i));
+ }
+ Log.i(TAG, sb.toString());
+
+ c.moveToPosition(-1);
+ while (c.moveToNext()) {
+ sb.setLength(0);
+ for (int i = 0; i < columnCount; i++) {
+ add(sb, c.getString(i));
+ }
+ Log.i(TAG, sb.toString());
+ }
+ } finally {
+ c.close();
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Exeption while executing query", e);
+ }
+ }
+
+ private StringBuilder add(StringBuilder sb, String s) {
+ if (sb.length() > 0) {
+ sb.append(SEPARATOR);
+ }
+ sb.append(s == null ? NULL_STRING : s);
+ return sb;
+ }
+
+ private static String[] parseProjection(String projectionString) {
+ if (TextUtils.isEmpty(projectionString)) {
+ return null; // all columns
+ }
+ final String[] columns = projectionString.split(",");
+ if (columns.length == 0) {
+ return null; // all columns
+ }
+ return columns;
+ }
+}
diff --git a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
index 555b339..0d9383f 100644
--- a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
+++ b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
@@ -290,11 +290,15 @@
break;
}
case ACTION_SEARCH_EMAIL: {
- Toast.makeText(this, "Unsupported", Toast.LENGTH_SHORT).show();
+ Intent intent = new Intent(Intent.ACTION_SEARCH);
+ intent.putExtra(Insert.EMAIL, "a");
+ startSearchResultActivity(intent);
break;
}
case ACTION_SEARCH_PHONE: {
- Toast.makeText(this, "Unsupported", Toast.LENGTH_SHORT).show();
+ Intent intent = new Intent(Intent.ACTION_SEARCH);
+ intent.putExtra(Insert.PHONE, "800");
+ startSearchResultActivity(intent);
break;
}
case SEARCH_SUGGESTION_CLICKED_CALL_BUTTON: {
diff --git a/tests/src/com/android/contacts/tests/mocks/MockContactPhotoManager.java b/tests/src/com/android/contacts/tests/mocks/MockContactPhotoManager.java
index 51c665f..67b7c0c 100644
--- a/tests/src/com/android/contacts/tests/mocks/MockContactPhotoManager.java
+++ b/tests/src/com/android/contacts/tests/mocks/MockContactPhotoManager.java
@@ -18,6 +18,7 @@
import com.android.contacts.ContactPhotoManager;
+import android.graphics.Bitmap;
import android.net.Uri;
import android.widget.ImageView;
@@ -56,6 +57,10 @@
}
@Override
+ public void cacheBitmap(Uri photoUri, Bitmap bitmap, byte[] photoBytes) {
+ }
+
+ @Override
public void preloadPhotosInBackground() {
}
}
diff --git a/tests/src/com/android/contacts/util/FakeAsyncTaskExecutor.java b/tests/src/com/android/contacts/util/FakeAsyncTaskExecutor.java
index 960f0bf..e68c0ec 100644
--- a/tests/src/com/android/contacts/util/FakeAsyncTaskExecutor.java
+++ b/tests/src/com/android/contacts/util/FakeAsyncTaskExecutor.java
@@ -16,10 +16,6 @@
package com.android.contacts.util;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import android.app.Instrumentation;
@@ -65,7 +61,8 @@
/** Create a fake AsyncTaskExecutor for use in unit tests. */
public FakeAsyncTaskExecutor(Instrumentation instrumentation) {
- mInstrumentation = checkNotNull(instrumentation);
+ Assert.assertNotNull(instrumentation);
+ mInstrumentation = instrumentation;
}
/** Encapsulates an async task with the params and identifier it was submitted with. */
@@ -116,8 +113,9 @@
@Override
public void execute(Runnable command) {
synchronized (mNextLock) {
+ Assert.assertNotNull(mNextTask);
mSubmittedTasks.add(new SubmittedTaskImpl(mNextIdentifier,
- command, checkNotNull(mNextTask)));
+ command, mNextTask));
mNextIdentifier = null;
mNextTask = null;
}
@@ -126,13 +124,14 @@
public <T> AsyncTask<T, ?, ?> submit(Object identifier,
AsyncTask<T, ?, ?> task, T... params) {
synchronized (mNextLock) {
- checkState(mNextIdentifier == null);
- checkState(mNextTask == null);
+ Assert.assertNull(mNextIdentifier);
+ Assert.assertNull(mNextTask);
mNextIdentifier = identifier;
- mNextTask = checkNotNull(task, "Already had a valid task.\n"
+ Assert.assertNotNull("Already had a valid task.\n"
+ "Are you calling AsyncTaskExecutor.submit(...) from within the "
+ "onPreExecute() method of another task being submitted?\n"
- + "Sorry! Not that's not supported.");
+ + "Sorry! Not that's not supported.", task);
+ mNextTask = task;
}
return task.executeOnExecutor(this, params);
}
@@ -205,7 +204,7 @@
private List<SubmittedTask> getSubmittedTasksByIdentifier(
Object identifier, boolean remove) {
- Preconditions.checkNotNull(identifier, "can't lookup tasks by 'null' identifier");
+ Assert.assertNotNull(identifier);
List<SubmittedTask> results = Lists.newArrayList();
synchronized (mLock) {
Iterator<SubmittedTask> iter = mSubmittedTasks.iterator();