resolve merge conflicts of d105c1e to master
Change-Id: If53abe8be5d8bd18e5f66699a113fdf27e01cfa3
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7a19e37..6441042 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -16,8 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.contacts"
- android:versionCode="10604"
- android:versionName="1.6.4">
+ android:versionCode="20000"
+ android:versionName="2.0.0">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="25" />
@@ -51,6 +51,8 @@
<uses-permission android:name="com.android.voicemail.permission.READ_VOICEMAIL" />
<!-- Following used for Contact metadata syncing -->
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
+ <!-- Following used for getting the status of the contacts sync adapter -->
+ <uses-permission android:name="android.permission.READ_SYNC_STATS" />
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
@@ -137,6 +139,13 @@
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/person" />
<data android:mimeType="vnd.android.cursor.dir/contact" />
+ <data android:mimeType="vnd.android.cursor.item/group" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="android.intent.action.EDIT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.item/group" />
</intent-filter>
<intent-filter>
@@ -268,23 +277,6 @@
</intent-filter>
</activity>
- <!-- Displays the members of a group in a list -->
- <activity android:name=".activities.GroupMembersActivity"
- android:theme="@style/GroupActivityTheme">
-
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/group" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="android.intent.action.EDIT" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/group" />
- </intent-filter>
- </activity>
-
<activity
android:name=".quickcontact.QuickContactActivity"
android:theme="@style/Theme.QuickContact"
@@ -360,7 +352,7 @@
<!-- Edit or create a contact with only the most important fields displayed initially. -->
<activity
- android:name=".activities.CompactContactEditorActivity"
+ android:name=".activities.ContactEditorActivity"
android:theme="@style/EditorActivityTheme"
android:windowSoftInputMode="stateHidden|adjustResize">
@@ -380,29 +372,6 @@
</intent-filter>
</activity>
- <!-- Edit or create a contact with all fields displayed. -->
- <activity
- android:name=".activities.ContactEditorActivity"
- android:theme="@style/EditorActivityTheme"
- android:windowSoftInputMode="stateHidden|adjustResize"
- android:exported="false">
-
- <intent-filter>
- <action android:name="com.android.contacts.action.FULL_EDIT" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/person" />
- <data android:mimeType="vnd.android.cursor.item/contact" />
- <data android:mimeType="vnd.android.cursor.item/raw_contact" />
- </intent-filter>
- <intent-filter>
- <action android:name="com.android.contacts.action.FULL_INSERT" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.dir/person" />
- <data android:mimeType="vnd.android.cursor.dir/contact" />
- <data android:mimeType="vnd.android.cursor.dir/raw_contact" />
- </intent-filter>
- </activity>
-
<activity android:name=".common.test.FragmentTestActivity">
<intent-filter>
<category android:name="android.intent.category.TEST" />
diff --git a/proguard.flags b/proguard.flags
index 80809a9..b7b9f18 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -86,6 +86,7 @@
-keep class com.android.contacts.interactions.CallLogInteractionsLoader { *; }
-keep class com.android.contacts.interactions.ContactDeletionInteraction { *; }
-keep class com.android.contacts.interactions.ContactInteractionUtil { *; }
+-keep class com.android.contacts.util.SyncUtil { *; }
-keep class com.android.contacts.widget.CompositeListAdapter { *; }
-keep class com.google.common.base.Objects { *; }
-keep class com.google.common.base.Preconditions { *; }
diff --git a/res-aosp/xml/shortcuts.xml b/res-aosp/xml/shortcuts.xml
index 35d15e7..f28da68 100644
--- a/res-aosp/xml/shortcuts.xml
+++ b/res-aosp/xml/shortcuts.xml
@@ -24,6 +24,6 @@
android:action="android.intent.action.INSERT"
android:data="content://com.android.contacts/contacts"
android:targetPackage="com.android.contacts"
- android:targetClass="com.android.contacts.activities.CompactContactEditorActivity"/>
+ android:targetClass="com.android.contacts.activities.ContactEditorActivity"/>
</shortcut>
</shortcuts>
diff --git a/res/color/tab_text_color.xml b/res/color/tab_text_color.xml
deleted file mode 100644
index 5ef1fe3..0000000
--- a/res/color/tab_text_color.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2014 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
- -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="@color/actionbar_text_color" android:state_selected="true"/>
- <item android:color="@color/actionbar_unselected_text_color" />
-</selector>
\ No newline at end of file
diff --git a/res/drawable-hdpi/ic_check_circle_googblue_drawable_24dp.png b/res/drawable-hdpi/ic_check_circle_googblue_drawable_24dp.png
deleted file mode 100644
index da6561d..0000000
--- a/res/drawable-hdpi/ic_check_circle_googblue_drawable_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_photos_white_24.png b/res/drawable-hdpi/ic_photos_white_24.png
deleted file mode 100644
index a5180a1..0000000
--- a/res/drawable-hdpi/ic_photos_white_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_check_circle_googblue_drawable_24dp.png b/res/drawable-mdpi/ic_check_circle_googblue_drawable_24dp.png
deleted file mode 100644
index efa2fdf..0000000
--- a/res/drawable-mdpi/ic_check_circle_googblue_drawable_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_photos_white_24.png b/res/drawable-mdpi/ic_photos_white_24.png
deleted file mode 100644
index e0e5854..0000000
--- a/res/drawable-mdpi/ic_photos_white_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-v21/view_pager_tab_background.xml b/res/drawable-v21/view_pager_tab_background.xml
deleted file mode 100644
index b9e0805..0000000
--- a/res/drawable-v21/view_pager_tab_background.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2016 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
- -->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/tab_ripple_color">
- <item android:id="@android:id/mask">
- <color android:color="@android:color/white" />
- </item>
-</ripple>
diff --git a/res/drawable-xhdpi/ic_check_circle_googblue_drawable_24dp.png b/res/drawable-xhdpi/ic_check_circle_googblue_drawable_24dp.png
deleted file mode 100644
index 70a22c9..0000000
--- a/res/drawable-xhdpi/ic_check_circle_googblue_drawable_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_photos_white_24.png b/res/drawable-xhdpi/ic_photos_white_24.png
deleted file mode 100644
index bc64bb0..0000000
--- a/res/drawable-xhdpi/ic_photos_white_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_check_circle_googblue_drawable_24dp.png b/res/drawable-xxhdpi/ic_check_circle_googblue_drawable_24dp.png
deleted file mode 100644
index 7ac3497..0000000
--- a/res/drawable-xxhdpi/ic_check_circle_googblue_drawable_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_photos_white_24.png b/res/drawable-xxhdpi/ic_photos_white_24.png
deleted file mode 100644
index 2cb5dbc..0000000
--- a/res/drawable-xxhdpi/ic_photos_white_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_check_circle_googblue_drawable_24dp.png b/res/drawable-xxxhdpi/ic_check_circle_googblue_drawable_24dp.png
deleted file mode 100644
index c077752..0000000
--- a/res/drawable-xxxhdpi/ic_check_circle_googblue_drawable_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_photos_white_24.png b/res/drawable-xxxhdpi/ic_photos_white_24.png
deleted file mode 100644
index 5722b4a..0000000
--- a/res/drawable-xxxhdpi/ic_photos_white_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/unread_count_background.xml b/res/drawable/unread_count_background.xml
deleted file mode 100644
index f70f84a..0000000
--- a/res/drawable/unread_count_background.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-<shape
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <corners android:radius="@dimen/tab_unread_count_background_radius"/>
- <solid android:color="@color/tab_unread_count_background_color" />
-</shape>
diff --git a/res/drawable/view_pager_tab_background.xml b/res/drawable/view_pager_tab_background.xml
deleted file mode 100644
index 9f59845..0000000
--- a/res/drawable/view_pager_tab_background.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2014 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
- -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_pressed="true"
- android:drawable="@color/tab_ripple_color"/>
-</selector>
\ No newline at end of file
diff --git a/res/layout-land/compact_contact_editor_fragment.xml b/res/layout-land/compact_contact_editor_fragment.xml
index 7855fcb..6b02462 100644
--- a/res/layout-land/compact_contact_editor_fragment.xml
+++ b/res/layout-land/compact_contact_editor_fragment.xml
@@ -15,7 +15,7 @@
limitations under the License.
-->
-<com.android.contacts.editor.CompactRawContactsEditorView
+<com.android.contacts.editor.RawContactEditorView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/raw_contacts_editor_view"
android:layout_width="match_parent"
@@ -24,7 +24,7 @@
android:orientation="horizontal"
android:visibility="invisible">
- <include layout="@layout/compact_photo_editor_view" />
+ <include layout="@layout/photo_editor_view" />
<!-- Dummy view so the first input field is not initially focused. b/21644158 -->
<View
@@ -48,10 +48,10 @@
<include layout="@layout/editor_account_header" />
- <include layout="@layout/compact_contact_editor_fields" />
+ <include layout="@layout/contact_editor_fields" />
</LinearLayout>
</ScrollView>
-</com.android.contacts.editor.CompactRawContactsEditorView>
\ No newline at end of file
+</com.android.contacts.editor.RawContactEditorView>
\ No newline at end of file
diff --git a/res/layout-ldrtl/unread_count_tab.xml b/res/layout-ldrtl/unread_count_tab.xml
deleted file mode 100644
index b23ab57..0000000
--- a/res/layout-ldrtl/unread_count_tab.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-<!-- layoutDirection set to ltr as a workaround to a framework bug (b/22010411) causing view with
- layout_centerInParent inside a RelativeLayout to expand to screen width when RTL is active -->
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@drawable/view_pager_tab_background"
- android:layoutDirection="ltr">
- <!-- The tab icon -->
- <ImageView
- android:id="@+id/icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"/>
- <TextView
- android:id="@+id/count"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/tab_unread_count_background_size"
- android:layout_marginTop="@dimen/tab_unread_count_margin_top"
- android:layout_marginStart="@dimen/tab_unread_count_margin_left"
- android:layout_toStartOf="@id/icon"
- android:paddingLeft="@dimen/tab_unread_count_text_padding"
- android:paddingRight="@dimen/tab_unread_count_text_padding"
- android:background="@drawable/unread_count_background"
- android:fontFamily="sans-serif-medium"
- android:importantForAccessibility="no"
- android:minWidth="@dimen/tab_unread_count_background_size"
- android:textAlignment="center"
- android:textColor="@color/tab_accent_color"
- android:textSize="@dimen/tab_unread_count_text_size"
- android:layoutDirection="locale"/>
-</RelativeLayout>
-
diff --git a/res/layout-sw600dp-land/contact_editor_activity.xml b/res/layout-sw600dp-land/contact_editor_activity.xml
deleted file mode 100644
index 4eb2d0c..0000000
--- a/res/layout-sw600dp-land/contact_editor_activity.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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.
--->
-
-<!-- This should be kept in sync with layout-sw720dp/contact_editor_activity.xml -->
-<ScrollView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:baselineAligned="false">
-
- <!-- Empty view to represent the left margin -->
- <View
- android:layout_height="match_parent"
- android:layout_width="0dip"
- android:layout_weight="@integer/contact_list_space_layout_weight" />
-
- <fragment class="com.android.contacts.editor.ContactEditorFragment"
- android:id="@+id/contact_editor_fragment"
- android:layout_width="0dip"
- android:layout_weight="@integer/contact_list_card_layout_weight"
- android:layout_height="match_parent"/>
-
- <!-- Empty view to represent the right margin -->
- <View
- android:layout_height="match_parent"
- android:layout_width="0dip"
- android:layout_weight="@integer/contact_list_space_layout_weight" />
-
- </LinearLayout>
-
-</ScrollView>
diff --git a/res/layout-sw600dp/contact_editor_activity.xml b/res/layout-sw600dp/contact_editor_activity.xml
deleted file mode 100644
index 526fe2b..0000000
--- a/res/layout-sw600dp/contact_editor_activity.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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.
--->
-
-<ScrollView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true">
-
- <fragment class="com.android.contacts.editor.ContactEditorFragment"
- android:id="@+id/contact_editor_fragment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
-
-</ScrollView>
diff --git a/res/layout-sw600dp/contact_editor_fragment.xml b/res/layout-sw600dp/contact_editor_fragment.xml
deleted file mode 100644
index be7723d..0000000
--- a/res/layout-sw600dp/contact_editor_fragment.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<com.android.contacts.widget.InterpolatingLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:ex="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/contact_all_list_background_color"
- android:elevation="@dimen/contact_list_card_elevation">
-
- <LinearLayout
- android:id="@+id/editors"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:fadingEdge="none"
- ex:layout_wideParentWidth="800dip"
- ex:layout_wideMarginLeft="128dip"
- ex:layout_wideMarginRight="128dip"
- ex:layout_narrowParentWidth="600dip"
- ex:layout_narrowMarginLeft="50dip"
- ex:layout_narrowMarginRight="50dip"/>
-
-</com.android.contacts.widget.InterpolatingLayout>
diff --git a/res/layout-sw720dp/contact_editor_activity.xml b/res/layout-sw720dp/contact_editor_activity.xml
deleted file mode 100644
index b31171f..0000000
--- a/res/layout-sw720dp/contact_editor_activity.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<!-- This should be kept in sync with layout-sw600dp-land/contact_editor_activity.xml -->
-<ScrollView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:baselineAligned="false">
-
- <!-- Empty view to represent the left margin -->
- <View
- android:layout_height="match_parent"
- android:layout_width="0dip"
- android:layout_weight="@integer/contact_list_space_layout_weight" />
-
- <fragment class="com.android.contacts.editor.ContactEditorFragment"
- android:id="@+id/contact_editor_fragment"
- android:layout_width="0dip"
- android:layout_weight="@integer/contact_list_card_layout_weight"
- android:layout_height="match_parent"/>
-
- <!-- Empty view to represent the right margin -->
- <View
- android:layout_height="match_parent"
- android:layout_width="0dip"
- android:layout_weight="@integer/contact_list_space_layout_weight" />
-
- </LinearLayout>
-
-</ScrollView>
diff --git a/res/layout/all_photos_button.xml b/res/layout/all_photos_button.xml
deleted file mode 100644
index 83578c3..0000000
--- a/res/layout/all_photos_button.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="@dimen/photo_picker_item_ideal_width"
- android:layout_height="@dimen/photo_picker_item_ideal_width"
- android:background="@color/google_grey_600"
- android:orientation="vertical">
-
- <ImageView
- android:id="@+id/image"
- android:paddingTop="48dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_photos_white_24"
- android:layout_gravity="center_horizontal"/>
-
- <TextView
- android:id="@+id/textLabel"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:singleLine="true"
- android:text="@string/all_photos_button"
- android:textSize="14sp"
- android:textColor="@color/photo_action_button_color"
- android:paddingTop="9dp"
- android:paddingBottom="35dp"
- android:layout_gravity="center_horizontal"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/compact_contact_editor_activity.xml b/res/layout/compact_contact_editor_activity.xml
deleted file mode 100644
index 595f381..0000000
--- a/res/layout/compact_contact_editor_activity.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/fragment_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"/>
diff --git a/res/layout/compact_contact_editor_fragment.xml b/res/layout/compact_contact_editor_fragment.xml
deleted file mode 100644
index e00c648..0000000
--- a/res/layout/compact_contact_editor_fragment.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 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.
--->
-
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/compact_contact_editor_fragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/background_primary"
- android:fadingEdge="none"
- android:fillViewport="true">
-
- <com.android.contacts.editor.CompactRawContactsEditorView
- android:id="@+id/raw_contacts_editor_view"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:visibility="invisible">
-
- <include layout="@layout/compact_photo_editor_view" />
-
- <!-- Dummy view so the first input field is not initially focused. b/21644158 -->
- <View
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:focusable="true"
- android:focusableInTouchMode="true"/>
-
- <include layout="@layout/editor_all_rawcontacts_accounts_selector" />
- <include layout="@layout/editor_account_header" />
-
- <include layout="@layout/compact_contact_editor_fields" />
-
- </com.android.contacts.editor.CompactRawContactsEditorView>
-
-</ScrollView>
diff --git a/res/layout/compact_item_kind_section.xml b/res/layout/compact_item_kind_section.xml
deleted file mode 100644
index 771ccfe..0000000
--- a/res/layout/compact_item_kind_section.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 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.
--->
-
-<!-- The body surrounding all editors for a specific kind -->
-
-<com.android.contacts.editor.CompactKindSectionView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/kind_icon"
- style="@style/EditKindIconStyle" />
-
- <LinearLayout
- android:id="@+id/kind_editors"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
-
-</com.android.contacts.editor.CompactKindSectionView>
\ No newline at end of file
diff --git a/res/layout/compact_photo_selection_fragment.xml b/res/layout/compact_photo_selection_fragment.xml
deleted file mode 100644
index 42f5b96..0000000
--- a/res/layout/compact_photo_selection_fragment.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 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.
--->
-
- <GridView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/grid_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:numColumns="auto_fit"
- android:verticalSpacing="3dp"
- android:horizontalSpacing="3dp"
- android:stretchMode="columnWidth"
- android:gravity="center"
- android:paddingTop="3dp"
- android:drawSelectorOnTop="true"/>
diff --git a/res/layout/compact_photo_selection_item.xml b/res/layout/compact_photo_selection_item.xml
deleted file mode 100644
index aea8ff6..0000000
--- a/res/layout/compact_photo_selection_item.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 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.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/SelectableItem"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <ImageView
- android:id="@+id/image"
- android:layout_width="match_parent"
- android:layout_height="@dimen/photo_picker_item_ideal_width"
- android:adjustViewBounds="true"
- android:layout_centerInParent="true"
- android:scaleType="centerCrop" />
-
- <ImageView
- android:id="@+id/check"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:layout_alignParentTop="true"
- android:layout_alignParentStart="true"
- android:layout_margin="8dp"
- android:src="@drawable/ic_check_circle_googblue_drawable_24dp"
- android:visibility="gone"/>
-
- <ImageView
- android:id="@+id/account_type"
- android:layout_width="30dp"
- android:layout_height="30dp"
- android:layout_alignParentBottom="true"
- android:layout_alignParentStart="true"
- android:paddingBottom="8dp"
- android:paddingStart="8dp"/>
-
-</RelativeLayout>
diff --git a/res/layout/contact_editor_activity.xml b/res/layout/contact_editor_activity.xml
index 8c13629..595f381 100644
--- a/res/layout/contact_editor_activity.xml
+++ b/res/layout/contact_editor_activity.xml
@@ -1,25 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!--
+ Copyright (C) 2015 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
+ 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
+ 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.
+ 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.
-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <fragment class="com.android.contacts.editor.ContactEditorFragment"
- android:id="@+id/contact_editor_fragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-</FrameLayout>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"/>
diff --git a/res/layout/compact_contact_editor_fields.xml b/res/layout/contact_editor_fields.xml
similarity index 96%
rename from res/layout/compact_contact_editor_fields.xml
rename to res/layout/contact_editor_fields.xml
index 1d91448..b9bda16 100644
--- a/res/layout/compact_contact_editor_fields.xml
+++ b/res/layout/contact_editor_fields.xml
@@ -41,7 +41,7 @@
android:minHeight="@dimen/editor_min_line_item_height"
android:paddingStart="72dp"
android:gravity="center_vertical"
- android:text="@string/compact_editor_more_fields"
+ android:text="@string/editor_more_fields"
android:textAlignment="viewStart"
android:textColor="?android:attr/colorAccent"
android:textSize="@dimen/expanding_entry_card_title_text_size"/>
diff --git a/res/layout/contact_editor_fragment.xml b/res/layout/contact_editor_fragment.xml
index f174a3d..85c4cf1 100644
--- a/res/layout/contact_editor_fragment.xml
+++ b/res/layout/contact_editor_fragment.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
+<!--
+ Copyright (C) 2015 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.
@@ -15,17 +16,34 @@
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- android:fadingEdge="none"
- android:background="@color/background_primary"
->
-
- <LinearLayout android:id="@+id/editors"
+ android:id="@+id/contact_editor_fragment"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- />
+ android:layout_height="match_parent"
+ android:background="@color/background_primary"
+ android:fadingEdge="none"
+ android:fillViewport="true">
+
+ <com.android.contacts.editor.RawContactEditorView
+ android:id="@+id/raw_contacts_editor_view"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:visibility="invisible">
+
+ <include layout="@layout/photo_editor_view" />
+
+ <!-- Dummy view so the first input field is not initially focused. b/21644158 -->
+ <View
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:focusable="true"
+ android:focusableInTouchMode="true"/>
+
+ <include layout="@layout/editor_all_rawcontacts_accounts_selector" />
+ <include layout="@layout/editor_account_header" />
+
+ <include layout="@layout/contact_editor_fields" />
+
+ </com.android.contacts.editor.RawContactEditorView>
</ScrollView>
diff --git a/res/layout/contact_list_content.xml b/res/layout/contact_list_content.xml
index f18267d..8420b26 100644
--- a/res/layout/contact_list_content.xml
+++ b/res/layout/contact_list_content.xml
@@ -39,20 +39,29 @@
android:id="@+id/contact_list">
<include layout="@layout/contact_list_card"/>
- <view
- class="com.android.contacts.common.list.PinnedHeaderListView"
- android:id="@android:id/list"
+
+ <android.support.v4.widget.SwipeRefreshLayout
+ android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_marginLeft="?attr/contact_browser_list_padding_left"
- android:layout_marginRight="?attr/contact_browser_list_padding_right"
- android:layout_marginStart="?attr/contact_browser_list_padding_left"
- android:layout_marginEnd="?attr/contact_browser_list_padding_right"
- android:paddingTop="?attr/list_item_padding_top"
- android:clipToPadding="false"
- android:fastScrollEnabled="true"
- android:visibility="gone"
- android:fadingEdge="none" />
+ android:enabled="false" >
+
+ <view
+ class="com.android.contacts.common.list.PinnedHeaderListView"
+ android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="?attr/contact_browser_list_padding_left"
+ android:layout_marginRight="?attr/contact_browser_list_padding_right"
+ android:layout_marginStart="?attr/contact_browser_list_padding_left"
+ android:layout_marginEnd="?attr/contact_browser_list_padding_right"
+ android:paddingTop="?attr/list_item_padding_top"
+ android:clipToPadding="false"
+ android:fastScrollEnabled="true"
+ android:visibility="gone"
+ android:fadingEdge="none" />
+ </android.support.v4.widget.SwipeRefreshLayout>
+
<ProgressBar
android:id="@+id/search_progress"
style="?android:attr/progressBarStyleLarge"
diff --git a/res/layout/editor_account_header.xml b/res/layout/editor_account_header.xml
index 3a382f4..b9f4a14 100644
--- a/res/layout/editor_account_header.xml
+++ b/res/layout/editor_account_header.xml
@@ -22,7 +22,7 @@
android:layout_width="match_parent"
android:minHeight="@dimen/editor_min_line_item_height"
android:orientation="horizontal"
- android:paddingBottom="@dimen/compact_editor_name_top_margin"
+ android:paddingBottom="@dimen/editor_name_top_margin"
>
@@ -34,8 +34,8 @@
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
- android:layout_marginTop="@dimen/compact_editor_account_header_top_margin"
- android:layout_marginStart="@dimen/compact_editor_account_left_margin"
+ android:layout_marginTop="@dimen/editor_account_header_top_margin"
+ android:layout_marginStart="@dimen/editor_account_left_margin"
android:layout_gravity="center_vertical"
android:orientation="vertical"
>
diff --git a/res/layout/editor_all_rawcontacts_accounts_selector.xml b/res/layout/editor_all_rawcontacts_accounts_selector.xml
index 7cff162..5606422 100644
--- a/res/layout/editor_all_rawcontacts_accounts_selector.xml
+++ b/res/layout/editor_all_rawcontacts_accounts_selector.xml
@@ -34,7 +34,7 @@
android:id="@+id/rawcontacts_accounts_summary"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_marginStart="@dimen/compact_editor_account_left_margin"
+ android:layout_marginStart="@dimen/editor_account_left_margin"
android:textSize="16sp"
android:singleLine="true"
android:layout_weight="1"
diff --git a/res/layout/floating_action_button.xml b/res/layout/floating_action_button.xml
index 2dc8955..91afecd 100644
--- a/res/layout/floating_action_button.xml
+++ b/res/layout/floating_action_button.xml
@@ -17,6 +17,7 @@
<!-- This expects to be included inside a RelativeLayout or a CoordinatorLayout -->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/floating_action_button_container"
android:layout_width="@dimen/floating_action_button_width"
android:layout_height="@dimen/floating_action_button_height"
@@ -26,7 +27,8 @@
android:layout_marginBottom="@dimen/floating_action_button_margin_bottom"
android:layout_marginEnd="@dimen/floating_action_button_margin_right"
android:background="@drawable/fab_blue"
- android:elevation="@dimen/design_fab_elevation">
+ android:elevation="@dimen/design_fab_elevation"
+ app:layout_dodgeInsetEdges="bottom" >
<ImageButton
android:id="@+id/floating_action_button"
diff --git a/res/layout/item_kind_section.xml b/res/layout/item_kind_section.xml
index d62523b..9e434d5 100644
--- a/res/layout/item_kind_section.xml
+++ b/res/layout/item_kind_section.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
+<!--
+ Copyright (C) 2015 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.
@@ -14,22 +15,22 @@
limitations under the License.
-->
-<!-- the body surrounding all editors for a specific kind -->
+<!-- The body surrounding all editors for a specific kind -->
<com.android.contacts.editor.KindSectionView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/kind_icon"
- style="@style/EditKindIconStyle" />
-
- <LinearLayout
- android:id="@+id/kind_editors"
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical" />
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@+id/kind_icon"
+ style="@style/EditKindIconStyle" />
+
+ <LinearLayout
+ android:id="@+id/kind_editors"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" />
</com.android.contacts.editor.KindSectionView>
\ No newline at end of file
diff --git a/res/layout/item_photo_editor.xml b/res/layout/item_photo_editor.xml
deleted file mode 100644
index e3eff4e..0000000
--- a/res/layout/item_photo_editor.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<view class="com.android.contacts.editor.PhotoEditorView"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
-
- <ImageView
- android:id="@+id/kind_icon"
- android:src="@drawable/ic_camera_alt_black_24dp"
- android:layout_marginTop="13dp"
- android:contentDescription="@string/header_photo_entry"
- style="@style/EditKindIconStyle" />
-
- <!-- Needs 10dp of top padding, in order get a total of 32dp of padding between this view
- and the previous DataKindSection. Note that EditTexts in other editor.xml files have this
- padding built in. Similarly, we need to add 4dp of start margin to make up for the padding
- that an EditText would have in this image's place. -->
- <ImageView
- android:id="@+id/photo"
- android:layout_width="72dip"
- android:layout_height="72dip"
- android:cropToPadding="true"
- android:scaleType="centerCrop"
- android:layout_marginTop="15dp"
- android:layout_marginStart="4dp"
- android:contentDescription="@string/description_contact_photo"
- android:layout_marginBottom="@dimen/editor_padding_below_photo"
- android:gravity="start" />
-
- <!-- We want 16dp for the effective marginStart. So we set 12dp, since the private
- @android:dimen/control_inset_material already includes 4dp of padding. -->
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="12dp" >
-
- <!-- The values applied to this button are complicated:
- 1) We want 16dp internal padding in the button. The background drawable is inset
- by private @android:dimen/button_inset_horizontal_material=4dp. Therefore,
- we need paddingStart/End of 20dp.
- 2) In order to leave enough room for the 32dp RadioButton, this can only be 46dp.
- This is 2dp less than the default touch target size.
- 3) This button will appear to be offset by the private
- @android:dimen/button_inset_vertical_material amount. Therefore, in order to achieve
- 15dp of apparent top margin, we only need to apply 9dp. -->
- <Button
- android:id="@+id/change_button"
- android:layout_width="wrap_content"
- android:layout_height="46dp"
- android:textSize="@dimen/editor_form_text_size"
- android:textColor="@color/primary_text_color"
- android:layout_marginTop="9dp"
- android:paddingStart="20dp"
- android:paddingEnd="20dp"
- android:text="@string/change_photo" />
-
- <!-- Don't explicitly set the layout_height in case we need to rely on text wrapping.
- For one line, we can expect the height to be 32dp with 16dp text size. -->
- <RadioButton
- android:id="@+id/primary_checkbox"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginEnd="48dp"
- android:textSize="@dimen/editor_form_text_size"
- android:text="@string/primary_photo" />
- </LinearLayout>
-</view>
diff --git a/res/layout/item_photo_editor_readonly.xml b/res/layout/item_photo_editor_readonly.xml
deleted file mode 100644
index edb6f61..0000000
--- a/res/layout/item_photo_editor_readonly.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<!-- A readonly version of item_photo_editor.xml shown in the readonly raw contact editor. -->
-<view class="com.android.contacts.editor.PhotoEditorView"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
-
- <ImageView
- android:id="@+id/kind_icon"
- android:src="@drawable/ic_camera_alt_black_24dp"
- android:layout_marginTop="0dp"
- android:contentDescription="@string/header_photo_entry"
- style="@style/EditKindIconStyle" />
-
- <!-- We need to add 2dp of start margin to make up for the padding that a TextView would
- have in this image's place. We add 2dp of top margin, so that icon drawable is a little
- below the top of this ImageView. -->
- <ImageView
- android:id="@+id/photo"
- android:layout_width="72dip"
- android:layout_height="72dip"
- android:cropToPadding="true"
- android:scaleType="centerCrop"
- android:layout_marginTop="2dp"
- android:layout_marginStart="2dp"
- android:contentDescription="@string/description_contact_photo"
- android:layout_marginBottom="@dimen/editor_padding_around_read_only_photo_editor"
- android:gravity="start" />
-
-
- <!-- Don't explicitly set the layout_height in case we need to rely on text wrapping.
- For one line, we can expect the height to be 32dp with 16dp text size. -->
- <RadioButton
- android:id="@+id/primary_checkbox"
- android:layout_marginStart="12dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginEnd="@dimen/editor_delete_button_width"
- android:layout_marginTop="2dp"
- android:textSize="@dimen/editor_form_text_size"
- android:text="@string/primary_photo" />
-</view>
diff --git a/res/layout/nick_name_editor_view.xml b/res/layout/nick_name_editor_view.xml
deleted file mode 100644
index 3b91917..0000000
--- a/res/layout/nick_name_editor_view.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 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.
- -->
-
-<com.android.contacts.editor.TextFieldsEditorView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="@dimen/editor_min_line_item_height"
- android:layout_marginStart="@dimen/editor_kind_icon_total_width"
- android:layout_marginEnd="@dimen/editor_delete_button_width">
-
- <!-- This isn't used in the nickname field. It is only included so that
- TextFieldsEditorView's base classes don't need extra null checks. -->
- <include
- android:id="@+id/spinner"
- layout="@layout/edit_spinner"
- android:visibility="gone" />
-
- <include
- android:id="@+id/editors"
- layout="@layout/edit_field_list" />
-
- <!-- This isn't used in the nickname field. It is only included so that
- TextFieldsEditorView doesn't need extra null checks. -->
- <include
- android:id="@+id/delete_button_container"
- layout="@layout/edit_delete_button"
- android:visibility="gone" />
-
-</com.android.contacts.editor.TextFieldsEditorView>
diff --git a/res/layout/people_activity.xml b/res/layout/people_activity.xml
index 9fd1a69..8810af0 100644
--- a/res/layout/people_activity.xml
+++ b/res/layout/people_activity.xml
@@ -20,37 +20,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent" >
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/list_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <!--
- ViewPager for swiping between tabs. We put fragments at runtime.
-
- (Adding them directly as the children of this view is not recommended. ViewPager should
- be treated like a ListView, which doesn't expect children to be added from the layout.)
- -->
- <android.support.v4.view.ViewPager
- android:id="@+id/tab_pager"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:layout_below="@id/toolbar_parent"
- />
-
- <FrameLayout
- android:id="@+id/contacts_unavailable_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_below="@id/toolbar_parent"
- android:visibility="gone">
- <FrameLayout
- android:id="@+id/contacts_unavailable_container"
- android:layout_height="match_parent"
- android:layout_width="match_parent" />
- </FrameLayout>
-
- </RelativeLayout>
+ <FrameLayout
+ android:id="@+id/contacts_list_container"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent" />
<include layout="@layout/floating_action_button" />
</android.support.design.widget.CoordinatorLayout>
diff --git a/res/layout/people_activity_tabs_lands.xml b/res/layout/people_activity_tabs_lands.xml
deleted file mode 100644
index 8d7b42b..0000000
--- a/res/layout/people_activity_tabs_lands.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<com.android.contacts.common.list.ViewPagerTabs
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/lists_pager_header"
- android:layout_width="@dimen/people_activity_landscape_tabs_width"
- android:layout_height="match_parent"
- android:textAllCaps="true"
- android:orientation="horizontal"
- android:layout_gravity="top"
- android:layout_weight="0"
- android:visibility="gone"
- android:textSize="@dimen/people_activity_landscape_tabs_text_size"
- style="@style/ContactsActionBarTabTextStyle" />
diff --git a/res/layout/people_activity_toolbar.xml b/res/layout/people_activity_toolbar.xml
index edca3ba..3599f0c 100644
--- a/res/layout/people_activity_toolbar.xml
+++ b/res/layout/people_activity_toolbar.xml
@@ -36,17 +36,4 @@
style="@style/ContactsToolbarStyle" />
</FrameLayout>
-
- <com.android.contacts.common.list.ViewPagerTabs
- android:id="@+id/lists_pager_header"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
- android:textAllCaps="true"
- android:orientation="horizontal"
- android:layout_gravity="top"
- android:layout_weight="0"
- android:layout_below="@id/toolbar"
- android:visibility="gone"
- style="@style/ContactsActionBarTabTextStyle" />
-
</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/compact_photo_editor_view.xml b/res/layout/photo_editor_view.xml
similarity index 91%
rename from res/layout/compact_photo_editor_view.xml
rename to res/layout/photo_editor_view.xml
index 8f791ca..891450c 100644
--- a/res/layout/compact_photo_editor_view.xml
+++ b/res/layout/photo_editor_view.xml
@@ -15,7 +15,7 @@
limitations under the License.
-->
-<com.android.contacts.editor.CompactPhotoEditorView
+<com.android.contacts.editor.PhotoEditorView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/photo_editor"
android:layout_width="match_parent"
@@ -51,6 +51,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/item_background_material_dark"
- android:contentDescription="@string/compact_editor_change_photo_content_description" />
+ android:contentDescription="@string/editor_change_photo_content_description" />
-</com.android.contacts.editor.CompactPhotoEditorView>
+</com.android.contacts.editor.PhotoEditorView>
diff --git a/res/layout/raw_contact_editor_view.xml b/res/layout/raw_contact_editor_view.xml
deleted file mode 100644
index 004418d..0000000
--- a/res/layout/raw_contact_editor_view.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<com.android.contacts.editor.RawContactEditorView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/body"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
-
- <include
- layout="@layout/editor_account_header" />
-
- <LinearLayout
- android:id="@+id/collapsable_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
-
- <!-- Dummy view so the first input field is not initially focused. b/21644158 -->
- <View
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:focusable="true"
- android:focusableInTouchMode="true"/>
-
- <include
- android:id="@+id/edit_name"
- layout="@layout/structured_name_editor_view" />
-
- <include
- android:id="@+id/edit_phonetic_name"
- layout="@layout/phonetic_name_editor_view" />
-
- <include
- android:id="@+id/edit_nick_name"
- layout="@layout/nick_name_editor_view" />
-
- <include
- android:id="@+id/edit_photo"
- android:layout_marginRight="8dip"
- android:layout_marginEnd="8dip"
- layout="@layout/item_photo_editor" />
-
- <LinearLayout
- android:id="@+id/sect_fields"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginBottom="16dip"/>
-
- </LinearLayout>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="@dimen/divider_line_height"
- android:background="@color/divider_line_color_light" />
-
-</com.android.contacts.editor.RawContactEditorView>
diff --git a/res/layout/raw_contact_readonly_editor_view.xml b/res/layout/raw_contact_readonly_editor_view.xml
deleted file mode 100644
index e50aa98..0000000
--- a/res/layout/raw_contact_readonly_editor_view.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<com.android.contacts.editor.RawContactReadOnlyEditorView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
-
- <include
- layout="@layout/editor_account_header" />
-
- <LinearLayout
- android:id="@+id/collapsable_section"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
-
- <!-- Want 16dp of apparent top padding. Since TextView has 4dp of inset/padding built in,
- only set marginTop=12dp. -->
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/editor_padding_around_read_only_photo_editor"
- android:layout_marginTop="12dp"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/kind_icon"
- android:layout_marginTop="2dp"
- android:src="@drawable/ic_person_black_24dp"
- android:contentDescription="@string/header_name_entry"
- style="@style/EditKindIconStyle" />
-
- <TextView
- android:id="@+id/read_only_name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginRight="@dimen/editor_delete_button_width"
- android:layout_marginEnd="@dimen/editor_delete_button_width"
- android:singleLine="true"
- android:textSize="@dimen/editor_form_text_size"
- android:textColor="?android:attr/textColorSecondary"
- android:textAlignment="viewStart"
- android:enabled="false"/>
-
- </LinearLayout>
-
- <include
- android:id="@+id/edit_photo"
- layout="@layout/item_photo_editor_readonly" />
-
- <Button
- android:id="@+id/button_edit_externally"
- android:text="@string/edit_contact"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="@dimen/editor_padding_below_photo"
- android:layout_marginEnd="13dip"
- android:layout_marginStart="13dip"/>
-
- <LinearLayout android:id="@+id/sect_general"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"/>
-
- </LinearLayout>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="@dimen/divider_line_height"
- android:background="@color/divider_line_color_light" />
-
-</com.android.contacts.editor.RawContactReadOnlyEditorView>
diff --git a/res/layout/take_a_photo_button.xml b/res/layout/take_a_photo_button.xml
deleted file mode 100644
index b837e85..0000000
--- a/res/layout/take_a_photo_button.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="@dimen/photo_picker_item_ideal_width"
- android:layout_height="@dimen/photo_picker_item_ideal_width"
- android:background="@color/google_grey_600"
- android:orientation="vertical">
-
- <ImageView
- android:id="@+id/image"
- android:paddingTop="48dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_photo_camera_white_24dp"
- android:layout_gravity="center_horizontal"/>
-
- <TextView
- android:id="@+id/textLabel"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:singleLine="true"
- android:text="@string/take_a_photo_button"
- android:textSize="14sp"
- android:textColor="@color/photo_action_button_color"
- android:paddingTop="9dp"
- android:paddingBottom="35dp"
- android:layout_gravity="center_horizontal"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/unread_count_tab.xml b/res/layout/unread_count_tab.xml
deleted file mode 100644
index 783f1c1..0000000
--- a/res/layout/unread_count_tab.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@drawable/view_pager_tab_background">
- <!-- The tab icon -->
- <ImageView
- android:id="@+id/icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true" />
- <TextView
- android:id="@+id/count"
- android:background="@drawable/unread_count_background"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/tab_unread_count_background_size"
- android:gravity="center"
- android:minWidth="@dimen/tab_unread_count_background_size"
- android:layout_marginStart="@dimen/tab_unread_count_margin_left"
- android:layout_marginTop="@dimen/tab_unread_count_margin_top"
- android:layout_toEndOf="@id/icon"
- android:paddingLeft="@dimen/tab_unread_count_text_padding"
- android:paddingRight="@dimen/tab_unread_count_text_padding"
- android:textAlignment="center"
- android:textSize="@dimen/tab_unread_count_text_size"
- android:textColor="@color/tab_accent_color"
- android:fontFamily="sans-serif-medium"
- android:importantForAccessibility="no" />
-</RelativeLayout>
diff --git a/res/menu/quickcontact.xml b/res/menu/quickcontact.xml
index 6cfe053..a0cbdbb 100644
--- a/res/menu/quickcontact.xml
+++ b/res/menu/quickcontact.xml
@@ -26,6 +26,14 @@
android:showAsAction="always" />
<item
+ android:id="@+id/menu_split"
+ android:title="@string/menu_splitAggregate" />
+
+ <item
+ android:id="@+id/menu_join"
+ android:title="@string/menu_joinAggregate" />
+
+ <item
android:id="@+id/menu_delete"
android:title="@string/menu_deleteContact" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 2007dba..b1e9909 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Voorgestelde kontakte"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle kontakte"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontakte is saamgevoeg"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> uitgevee"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kontakte is uitgevee</item>
<item quantity="one">Kontak is uitgevee</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Geen kontakte met hierdie etiket nie"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Geen kontakte in hierdie rekening nie"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Jou kontaktelys is leeg"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> is gestoor"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontak gestoor"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontakte is ontkoppel"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Kon nie kontakveranderinge stoor nie"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Bel weer"</string>
<string name="returnCall" msgid="8171961914203617813">"Bel terug"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Voeg \"<xliff:g id="EMAIL">%s</xliff:g>\" by kontakte?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"kontakfoto"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Name van jou kontakte"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Datum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiket"</string>
<string name="change_photo" msgid="8530597935483526383">"Verander"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Primêre foto"</string>
<string name="description_star" msgid="2605854427360036550">"gunsteling"</string>
<string name="edit_contact" msgid="7529281274005689512">"Redigeer kontak"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"maak toe"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Naam"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-pos"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Foon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Klik om kontakredakteur uit te vou."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Klik om kontakredakteur in te vou."</string>
<string name="content_description_directions" msgid="2686791825798189335">"rigtingaanwysings na ligging"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"onlangse oproep. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. klik om terug te bel"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Jy: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts werk beter as jy die persoon se Hangouts-identifiseerder in die e-posveld of foonveld invoer."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Meer velde"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Verander foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Kon nie redigeer oopmaak nie."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Stoor na"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Stoor tans na <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dubbeltik om \'n ander rekening te kies."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Meer velde"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Verander foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Kon nie redigeerder oopmaak nie."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Stoor tans na"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Bekyk tans"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Stoor tans na <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dubbeltik om \'n ander rekening te kies."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Geskakelde kontakte (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Geskakelde kontak</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Hierdie kontak"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Moontlike duplikate"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Hierdie kontakte kan dalk dieselfde persoon wees. Jy kan hulle as \'n enkele kontak koppel."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Saamgevoegde kontakte"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Saamgevoegde kontakte"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Van jou rekeninge af"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Neem \'n foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Alle foto\'s"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Kies foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Van <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Vee <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> uit"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Deel gunstelingkontakte"</string>
<string name="share_contacts" msgid="8109287987498711664">"Deel alle kontakte"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Kon nie kontakte deel nie."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Voer kontakte in/uit"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Voer kontakte uit"</string>
<string name="dialog_import" msgid="2431698729761448759">"Voer kontakte in"</string>
<string name="share_error" msgid="948429331673358107">"Hierdie kontak kan nie gedeel word nie."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Daar is geen kontakte om te deel nie."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Vee dikwels-gebruiktes uit"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Kies SIM-kaart"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Bestuur rekeninge"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Voer in/uit"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Voer in"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Voer uit"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Geblokkeerde nommers"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 39d7ed4..dd26dac 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"አስተያየት የተሰጠባቸው እውቅያዎች"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"ሁሉም እውቅያዎች"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"ዕውቂያዎች ተገናኝተዋል"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> ተሰርዟል"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">እውቂያዎች ተሰርዘዋል</item>
<item quantity="other">እውቂያዎች ተሰርዘዋል</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"ይህ መሰየሚያ ያላቸው ምንም እውቂያዎች የሉም"</string>
<string name="emptyAccount" msgid="6873962901497975964">"በዚህ መለያ ውስጥ ምንም እውቂያዎች የሉም።"</string>
<string name="emptyMainList" msgid="2772242747899664460">"የእውቂያዎች ዝርዝርዎ ባዶ ነው"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> ተቀምጧል"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"ዕውቂያ ተቀምጧል"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"የእውቂያዎች ግንኙነት ተላቅቋል"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"የእውቂያ ለውጦችን ማስቀመጥ አልተቻለም"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"እንደገና ደውል"</string>
<string name="returnCall" msgid="8171961914203617813">"ጥሪ መልስ"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"<xliff:g id="EMAIL">%s</xliff:g> ወደ እውቅያዎች ዝርዝር ይታከል"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"የዕውቂያ ፎቶ"</string>
<string name="description_plus_button" msgid="515164827856229880">"ተጨማሪ"</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="search_settings_description" msgid="2675223022992445813">"የዕውቂያዎችዎ ስሞች"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"ቀን"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"መሰየሚያ"</string>
<string name="change_photo" msgid="8530597935483526383">"ቀይር"</string>
- <string name="primary_photo" msgid="8517942231868516999">"ዋና ፎቶ"</string>
<string name="description_star" msgid="2605854427360036550">"ተወዳጅ"</string>
<string name="edit_contact" msgid="7529281274005689512">"እውቅያ አርትዕ"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"ዝጋ"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"ስም"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ኢሜይል"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ስልክ"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ፎተግራፍ"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"የእውቂያ አርታዒን ለመዘርጋት ጠቅ ያድርጉ።"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"የእውቂያ አርታዒን ለመሰብሰብ ጠቅ ያድርጉ።"</string>
<string name="content_description_directions" msgid="2686791825798189335">"ወደ አካባቢ የሚወስዱ አቅጣጫዎች"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"የቅርብ ጊዜ ጥሪ። <xliff:g id="CALL_TYPE">%s</xliff:g>። <xliff:g id="PHONE_NUMBER">%s</xliff:g>። <xliff:g id="DATE">%s</xliff:g>። መልሰው ለመደወል ጠቅ ያድርጉ"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"እርስዎ፦ <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"የግለሰቡን የHangouts ለይቶ አዋቂ ወደ ኢሜይል መስኩ ወይም የስልክ መስኩ በሚያስገቡበት ጊዜ Hangouts በተሻለ ሁኔታ ይሰራል።"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"ተጨማሪ መስኮች"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ፎቶ ለውጥ"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"አርታዒውን መክፈት አልተሳካም።"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"ወደዚህ በማስቀመጥ ላይ፦"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"አሁን ላይ ወደ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> በማስቀመጥ ላይ። ሌላ መለያ ለመምረጥ ሁለቴ መታ ያድርጉ።"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"ተጨማሪ መስኮች"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ፎቶ ለውጥ"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"አርታዒውን መክፈት አልተሳካም።"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"በማስቀመጥ ላይ ወደ፦"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"በማየት ላይ"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"አሁን ወደ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> በማስቀመጥ ላይ። ሌላ መለያ ለመምረጥ ሁለቴ መታ ያድርጉ።"</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">የተገናኙ እውቂያዎች (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">የተገናኙ እውቂያዎች (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"ይህ እውቂያ"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"ሊሆኑ የሚችሉ ድግምግሞሽ"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ይህ እውቂያ ተመሳሳይ ሰው ሊሆን ይችላል። እንደ ነጠላ እውቂያ በአንድ ላይ ሊያገናኙዋቸው ይችላሉ።"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"የተገናኙ ዕውቂያዎች"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"የተገናኙ ዕውቂያዎች"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"ከእርስዎ መለያዎች"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ፎቶ አንሳ"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"ሁሉም ፎቶዎች"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ፎቶ ይምረጡ"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"ከ<xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>ን ሰርዝ"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"ተወዳጅ እውቂያዎችን አጋራ"</string>
<string name="share_contacts" msgid="8109287987498711664">"ሁሉንም እውቂያዎች አጋራ"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"እውቂያዎችን ማጋራት አልተሳካም።"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"ዕውቂያዎች አስመጣ/ላክ"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"እውቅያዎች ወደ ውጭ ላክ"</string>
<string name="dialog_import" msgid="2431698729761448759">"እውቅያዎችን ከውጭ አስመጣ"</string>
<string name="share_error" msgid="948429331673358107">"ይህ ዕውቂያ መጋራት አይችልም።"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"ምንም የሚጋሩ እውቂያዎች የሉም።"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"ተደጋጋሚዎችን አጽዳ"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"ሲም ካርድ ይምረጡ"</string>
<string name="menu_accounts" msgid="1424330057450189074">"መለያዎችን አስተዳድር"</string>
- <string name="menu_import_export" msgid="26217871113229507">"አስመጣ/ላክ"</string>
+ <string name="menu_import" msgid="6107961135813836467">"አምጣ"</string>
+ <string name="menu_export" msgid="2658783911863503902">"ወደ ውጪ ላክ"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"የታገዱ ቁጥሮች"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"በ<xliff:g id="SOURCE">%1$s</xliff:g> በኩል"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g>በ<xliff:g id="SOURCE">%2$s</xliff:g> በኩል"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index d2cec0b..1ad4abf 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"جهات الاتصال المقترحة"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"جميع جهات الاتصال"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"تم ربط جهات الاتصال"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"تم حذف <xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="zero">تم حذف جهة الاتصال</item>
<item quantity="two">تم حذف جهتي الاتصال</item>
@@ -123,6 +124,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"لا توجد جهات اتصال بهذه التسمية"</string>
<string name="emptyAccount" msgid="6873962901497975964">"لا توجد جهات اتصال في هذا الحساب"</string>
<string name="emptyMainList" msgid="2772242747899664460">"قائمة جهات اتصالك فارغة"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"تم حفظ <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"تم حفظ جهة الاتصال."</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"تم إلغاء ربط جهات الاتصال"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"تعذر حفظ التغييرات التي تم إجراؤها على جهة الاتصال"</string>
@@ -171,7 +173,6 @@
<string name="callAgain" msgid="3197312117049874778">"الاتصال مرة أخرى"</string>
<string name="returnCall" msgid="8171961914203617813">"معاودة اتصال بمكالمة فائتة"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"هل ترغب في إضافة \"<xliff:g id="EMAIL">%s</xliff:g>\" إلى جهات الاتصال؟"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"صورة جهة الاتصال"</string>
<string name="description_plus_button" msgid="515164827856229880">"علامة زائد"</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="search_settings_description" msgid="2675223022992445813">"أسماء جهات الاتصال"</string>
@@ -220,7 +221,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"التاريخ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"التصنيف"</string>
<string name="change_photo" msgid="8530597935483526383">"تغيير"</string>
- <string name="primary_photo" msgid="8517942231868516999">"الصورة الأساسية"</string>
<string name="description_star" msgid="2605854427360036550">"مفضل"</string>
<string name="edit_contact" msgid="7529281274005689512">"تعديل جهة الاتصال"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"إغلاق"</string>
@@ -297,7 +297,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"الاسم"</string>
<string name="header_email_entry" msgid="8666093061171624478">"البريد الإلكتروني"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"الهاتف"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"الصورة"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"يمكنك النقر لتوسيع محرر جهات الاتصال."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"يمكنك النقر لتصغير محرر جهات الاتصال."</string>
<string name="content_description_directions" msgid="2686791825798189335">"الاتجاهات إلى الموقع"</string>
@@ -308,12 +307,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"المكالمة الأخيرة. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. انقر لمعاودة الاتصال"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"أنت: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"تعمل Hangouts بشكل أفضل عند إدخال معرف الشخص في Hangouts في حقل البريد الإلكتروني أو حقل الهاتف."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"المزيد من الحقول"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"تغيير الصورة"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"أخفق فتح المحرر."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"الحفظ في"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"جارٍ الحفظ حاليًا في <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. يمكنك النقر نقرًا مزدوجًا لاختيار حساب آخر."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"المزيد من الحقول"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"تغيير الصورة"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"أخفق فتح المحرر."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"الحفظ في"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"المشاهدة"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"جارٍ الحفظ حاليًا في <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. يمكنك النقر نقرًا مزدوجًا لاختيار حساب آخر."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="zero">جهات الاتصال المرتبطة (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="two">جهات الاتصال المرتبطة (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="few">جهات الاتصال المرتبطة (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -353,10 +353,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"جهة الاتصال هذه"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"التكرارات المحتملة"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ربما تمثل جهات الاتصال هذه شخصًا واحدًا. يمكنك ربطها معًا كجهة اتصال واحدة."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"جهات الاتصال المرتبطة"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"جهات الاتصال المرتبطة"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"من حساباتك"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"التقاط صورة"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"جميع الصور"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"اختيار صورة"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"من <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"حذف <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -591,7 +589,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"مشاركة جهات الاتصال المفضلة"</string>
<string name="share_contacts" msgid="8109287987498711664">"مشاركة جميع جهات الاتصال"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"أخفقت مشاركة جهات الاتصال."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"استيراد/تصدير جهات اتصال"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"تصدير جهات الاتصال"</string>
<string name="dialog_import" msgid="2431698729761448759">"استيراد جهات الاتصال"</string>
<string name="share_error" msgid="948429331673358107">"لا يمكن مشاركة جهة الاتصال هذه."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"ليست هناك جهات اتصال لمشاركتها."</string>
@@ -606,7 +604,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"محو قائمة من يتصل بهم كثيرًا"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"تحديد شريحة SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"إدارة الحسابات"</string>
- <string name="menu_import_export" msgid="26217871113229507">"استيراد/تصدير"</string>
+ <string name="menu_import" msgid="6107961135813836467">"استيراد"</string>
+ <string name="menu_export" msgid="2658783911863503902">"تصدير"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"الأرقام المحظورة"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"عبر <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> عبر <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml
index 5964c3b..c75835f 100644
--- a/res/values-az-rAZ/strings.xml
+++ b/res/values-az-rAZ/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Təklif edilmiş kontaktlar"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Bütün kontaktlar"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontaktlar əlaqələndirildi"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> silindi"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kontakt silindi</item>
<item quantity="one">Kontakt silindi</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Bu etiketlə kontakt yoxdur"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Bu hesabda heç bir kontakt yoxdur"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Kontakt siyahınız boşdur"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> saxlanıldı"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt yadda saxlanıldı"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontaktlar əlaqələndirilməyib"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Kontakt dəyişiklikləri saxlanıla bilmədi"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Yenidən zəng edin"</string>
<string name="returnCall" msgid="8171961914203617813">"Zəngi qaytarın"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" kontaktlara əlavə olunsun?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"Kontakt şəkli"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontaktdan <xliff:g id="CURRENT_NUMBER">%s</xliff:g> kontakt"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Kontaktlarınızın adları"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Tarix"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiket"</string>
<string name="change_photo" msgid="8530597935483526383">"Dəyişdir"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Əsas şəkil"</string>
<string name="description_star" msgid="2605854427360036550">"sevimli"</string>
<string name="edit_contact" msgid="7529281274005689512">"Kontaktı redaktə edin"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"qapadın"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Ad"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-poçt"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Şəkil"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Əlaqə redaktorunu genişləndirmək üçün klikləyin."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Əlaqə redaktorunu yığışdırmaq üçün klikləyin."</string>
<string name="content_description_directions" msgid="2686791825798189335">"məkana istiqamətlər"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"son çağrı. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. zəng etmək üçün klikləyin"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Siz: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Siz hər hansı bir şəxsin Görüşlə bağlı identifikatorlarını e-poçt sahəsi və ya telefon sahəsinə daxil edəndə, Görüş yerləri daha yaxşı işləyir."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Daha çox sahə"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Şəkli dəyişin"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Redaktoru açmaq uğursuz oldu."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Hesabda yadda saxlanır"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Hal-hazırda <xliff:g id="ACCOUNT_NAME">%s</xliff:g> hesabında yadda saxlanır. Fərqli hesab seçmək üçün iki dəfə basın."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Daha çox sahə"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Şəkli dəyişin"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Redaktoru açmaq uğursuz oldu."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Hesabda yadda saxlanır"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Baxılır"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Hal-hazırda <xliff:g id="ACCOUNT_NAME">%s</xliff:g> hesabında yadda saxlanır. Fərqli hesab seçmək üçün iki dəfə basın."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Əlaqələnmiş kontakt (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Əlaqələnmiş kontakt</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Bu kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mümkün dublikatlar"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Bu kontaktlar eyni şəxsə aid ola bilər. Onları bir kontaktda birləşdirə bilərsiniz."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Əlaqələndirilmiş kontaktlar"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Əlaqələndirilmiş kontaktlar"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Hesablarınızdan"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Şəkil çək"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Bütün fotolar"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Foto seçin"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> hesabından"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> datasını silin"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Sevdiyiniz kontaktları paylaşın"</string>
<string name="share_contacts" msgid="8109287987498711664">"Bütün kontaktları paylaşın"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Kontaktları paylaşmaq uğursuz oldu."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Kontaktları import/eksport edin"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Kontaktları eksport edin"</string>
<string name="dialog_import" msgid="2431698729761448759">"Kontaktların importu"</string>
<string name="share_error" msgid="948429331673358107">"Bu kontakt paylaşıla bilməz."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Bölüşmək üçün kontakt yoxdur."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Müntəzəmləri təmizləyin"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM kart seçin"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Hesabları idarə edin"</string>
- <string name="menu_import_export" msgid="26217871113229507">"İmport/eksport"</string>
+ <string name="menu_import" msgid="6107961135813836467">"İmport edin"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Eksport edin"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Bloklanmış nömrələr"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> vasitəsilə"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> vasitəsilə <xliff:g id="DATE">%1$s</xliff:g>"</string>
diff --git a/res/values-b+sr+Latn-sw600dp/strings.xml b/res/values-b+sr+Latn-sw600dp/strings.xml
new file mode 100644
index 0000000..f6727a7
--- /dev/null
+++ b/res/values-b+sr+Latn-sw600dp/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="account_phone" msgid="347665663520819575">"Uređaj"</string>
+ <string name="composer_has_no_exportable_contact" msgid="5998889616701036804">"Nema kontakata za izvoz. Ako imate kontakte na tabletu, neki dobavljači podataka možda neće dozvoliti izvoz kontakata sa tableta."</string>
+</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 3078976..170fb26 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -17,9 +17,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="3906689777043645443">"Kontakti"</string>
- <string name="launcherActivityLabel" msgid="6497230399032392417">"Kontakti"</string>
- <string name="quickContactActivityLabel" msgid="7985456650689347268">"Prikaži kontakt"</string>
- <string name="editContactActivityLabel" msgid="1129944572070802839">"Izmeni kontakt"</string>
<string name="contactsList" msgid="8661624236494819731">"Kontakti"</string>
<string name="shortcutContact" msgid="749243779392912958">"Kontakt"</string>
<string name="shortcutDialContact" msgid="746622101599186779">"Direktno biranje"</string>
@@ -31,12 +28,7 @@
<string name="contactPickerActivityTitle" msgid="4301062192337417640">"Izaberite kontakt"</string>
<string name="groupMemberPickerActivityTitle" msgid="1431750793695262522">"Izaberite"</string>
<string name="header_entry_contact_list_adapter_header_title" msgid="2436981165830115659">"Napravi novi kontakt"</string>
- <string name="starredList" msgid="4817256136413959463">"Sa zvezdicom"</string>
- <string name="frequentList" msgid="7154768136473953056">"Česti"</string>
- <string name="strequentList" msgid="5640192862059373511">"Omiljeno"</string>
<string name="viewContactTitle" msgid="7989394521836644384">"Detalji o kontaktu"</string>
- <string name="editContactDescription" msgid="2947202828256214947">"Izmeni kontakt"</string>
- <string name="insertContactDescription" msgid="4709878105452681987">"Napravi kontakt"</string>
<string name="contactDetailAbout" msgid="5430408883907061400">"Osnovni podaci"</string>
<string name="contactDetailUpdates" msgid="3780588624763446941">"Ažuriranja"</string>
<string name="searchHint" msgid="8482945356247760701">"Pretraži kontakte"</string>
@@ -52,7 +44,7 @@
<string name="menu_call" msgid="3992595586042260618">"Pozovi kontakt"</string>
<string name="menu_sendSMS" msgid="5535886767547006515">"Pošalji SMS kontaktu"</string>
<string name="menu_splitAggregate" msgid="2627252205317945563">"Razdvoji"</string>
- <string name="menu_editGroup" msgid="5062005185370983720">"Izmeni"</string>
+ <string name="menu_editGroup" msgid="6696843438454341063">"Ukloni kontakte"</string>
<string name="menu_renameGroup" msgid="7169512355179757182">"Preimenuj oznaku"</string>
<string name="menu_deleteGroup" msgid="1126469629233412249">"Izbriši oznaku"</string>
<string name="menu_addToGroup" msgid="3267409983764370041">"Dodaj kontakt"</string>
@@ -75,15 +67,21 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Predloženi kontakti"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Svi kontakti"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontakti su objedinjeni"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> je izbrisan/a"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Kontakti su izbrisani</item>
<item quantity="few">Kontakti su izbrisani</item>
<item quantity="other">Kontakti su izbrisani</item>
</plurals>
- <plurals name="contacts_count" formatted="false" msgid="3287407967505649458">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> kontakt</item>
- <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> kontakta</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> kontakata</item>
+ <plurals name="contacts_count" formatted="false" msgid="8696793457340503668">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> kontakt</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> kontakta</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kontakata</item>
+ </plurals>
+ <plurals name="contacts_count_with_account" formatted="false" msgid="7402583111980220575">
+ <item quantity="one"><xliff:g id="COUNT_2">%d</xliff:g> kontakt · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="few"><xliff:g id="COUNT_2">%d</xliff:g> kontakta · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="other"><xliff:g id="COUNT_2">%d</xliff:g> kontakata · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
</plurals>
<string name="title_from_google" msgid="4664084747121207202">"Sa Google-a"</string>
<string name="title_from_other_accounts" msgid="8307885412426754288">"Sa <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
@@ -110,18 +108,21 @@
<string name="attach_photo_dialog_title" msgid="5599827035558557169">"Slika kontakta"</string>
<string name="customLabelPickerTitle" msgid="1081475101983255212">"Naziv prilagođene oznake"</string>
<string name="send_to_voicemail_checkbox" msgid="9001686764070676353">"Šalji pozive direktno u glasovnu poštu"</string>
- <string name="removePhoto" msgid="4898105274130284565">"Ukloni fotografiju"</string>
- <string name="noContacts" msgid="4955659076981974652">"Nema kontakata"</string>
+ <string name="removePhoto" msgid="4898105274130284565">"Ukloni sliku"</string>
+ <string name="noContacts" msgid="2228592924476426108">"Lista kontakata je prazna"</string>
<string name="noGroups" msgid="4607906327968232225">"Nema oznaka."</string>
<string name="noAccounts" msgid="7768267764545265909">"Morate da imate nalog da biste mogli da pravite grupe."</string>
<string name="emptyGroup" msgid="5102411903247859575">"Nema kontakata sa ovom oznakom"</string>
+ <string name="emptyAccount" msgid="6873962901497975964">"Nema kontakata na ovom nalogu"</string>
+ <string name="emptyMainList" msgid="2772242747899664460">"Lista kontakata je prazna"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Kontakt <xliff:g id="DISPLAY_NAME">%s</xliff:g> je sačuvan"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt je sačuvan"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontakti su razdvojeni"</string>
- <string name="contactSavedErrorToast" msgid="3207250533172944892">"Nije moguće sačuvati izmene kontakata."</string>
- <string name="contactUnlinkErrorToast" msgid="2758070702785994171">"Razdvajanje kontakta na više njih nije uspelo."</string>
- <string name="contactJoinErrorToast" msgid="3977932531264809035">"Objedinjavanje kontakata nije uspelo."</string>
- <string name="contactGenericErrorToast" msgid="7774911165341591714">"Došlo je do greške pri čuvanju kontakta."</string>
- <string name="contactPhotoSavedErrorToast" msgid="4079032272022979114">"Čuvanje izmena slike kontakta nije uspelo."</string>
+ <string name="contactSavedErrorToast" msgid="4827033473908688031">"Čuvanje promena kontakta nije uspelo"</string>
+ <string name="contactUnlinkErrorToast" msgid="2706297508166952431">"Razdvajanje kontakta nije uspelo"</string>
+ <string name="contactJoinErrorToast" msgid="5735129234573327701">"Objedinjavanje kontakata nije uspelo"</string>
+ <string name="contactGenericErrorToast" msgid="3885457515665783976">"Greška pri čuvanju kontakta"</string>
+ <string name="contactPhotoSavedErrorToast" msgid="6860883564984042194">"Čuvanje promena slike kontakta nije uspelo"</string>
<string name="groupLoadErrorToast" msgid="7536267148196064554">"Učitavanje oznake nije uspelo"</string>
<string name="groupSavedToast" msgid="6491495462357722285">"Oznaka je sačuvana"</string>
<string name="groupDeletedToast" msgid="520896687873262027">"Oznaka je izbrisana"</string>
@@ -130,7 +131,8 @@
<string name="groupUpdatedToast" msgid="3667977658676267687">"Oznaka je ažurirana"</string>
<string name="groupMembersRemovedToast" msgid="3510563559799376603">"Uklonili smo iz oznake"</string>
<string name="groupMembersAddedToast" msgid="4824834898718972768">"Dodato je u oznaku"</string>
- <string name="groupSavedErrorToast" msgid="8121032018490980184">"Čuvanje promena oznake nije uspelo."</string>
+ <string name="groupSavedErrorToast" msgid="2355891714292740162">"Čuvanje promena oznake nije uspelo"</string>
+ <string name="groupExistsErrorMessage" msgid="5196811283836946189">"Ta oznaka već postoji"</string>
<plurals name="listTotalPhoneContacts" formatted="false" msgid="3692277679143308755">
<item quantity="one"><xliff:g id="COUNT">%d</xliff:g> kontakt sa brojem telefona</item>
<item quantity="few"><xliff:g id="COUNT">%d</xliff:g> kontakta sa brojevima telefona</item>
@@ -153,7 +155,6 @@
<string name="callAgain" msgid="3197312117049874778">"Pozovi ponovo"</string>
<string name="returnCall" msgid="8171961914203617813">"Uzvrati poziv"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Želite li da dodate imejl adresu „<xliff:g id="EMAIL">%s</xliff:g>“ u kontakte?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"fotografija kontakta"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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> kontak(a)ta"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Imena kontakata"</string>
@@ -184,8 +185,8 @@
<string name="google_account_type_format" msgid="5283997303922067997">"<xliff:g id="SOURCE">%1$s</xliff:g> nalog"</string>
<!-- no translation found for from_account_format (4469138575127580203) -->
<skip />
- <string name="take_photo" msgid="7496128293167402354">"Snimi fotografiju"</string>
- <string name="take_new_photo" msgid="7341354729436576304">"Napravi novu fotografiju"</string>
+ <string name="take_photo" msgid="7496128293167402354">"Slikaj"</string>
+ <string name="take_new_photo" msgid="7341354729436576304">"Slikaj novu sliku"</string>
<string name="pick_photo" msgid="2129509985223564942">"Izaberi sliku"</string>
<string name="pick_new_photo" msgid="9122450996263688237">"Izaberite novu sliku"</string>
<string name="upgrade_in_progress" msgid="474511436863451061">"Kontakt lista se ažurira."</string>
@@ -199,7 +200,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Datum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Oznaka"</string>
<string name="change_photo" msgid="8530597935483526383">"Promeni"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Glavna slika"</string>
<string name="description_star" msgid="2605854427360036550">"omiljeno"</string>
<string name="edit_contact" msgid="7529281274005689512">"Izmeni kontakt"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"zatvorite"</string>
@@ -223,8 +223,7 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Učitava se…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Napravi novi kontakt"</string>
<string name="contacts_unavailable_add_account" msgid="4347232421410561500">"Dodajte nalog"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Uvezi kontakte"</string>
- <string name="create_group_dialog_title" msgid="5363404287877384473">"Napravite novu oznaku"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="3182801738595937144">"Uvezi"</string>
<string name="create_group_item_label" msgid="3263064599743742865">"Napravi novu…"</string>
<string name="delete_group_dialog_message" msgid="335713829185261371">"Želite da izbrišete oznaku „<xliff:g id="GROUP_LABEL">%1$s</xliff:g>“? (Kontakti neće biti izbrisani.)"</string>
<string name="toast_join_with_empty_contact" msgid="1215465657839085613">"Unesite ime kontakta pre nego što ga objedinite sa drugim kontaktom."</string>
@@ -232,36 +231,33 @@
<string name="set_default" msgid="4417505153468300351">"Postavi na podrazumevano"</string>
<string name="clear_default" msgid="7193185801596678067">"Obriši podrazumevanu vrednost"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Tekst je kopiran"</string>
- <string name="cancel_confirmation_dialog_message" msgid="5058226498605989285">"Želite li da odbacite promene i prekinete sa izmenama?"</string>
+ <string name="cancel_confirmation_dialog_message" msgid="9008214737653278989">"Želite da odbacite promene?"</string>
<string name="cancel_confirmation_dialog_cancel_editing_button" msgid="3057023972074640671">"Odbaci"</string>
- <string name="cancel_confirmation_dialog_keep_editing_button" msgid="7737724111972855348">"Nastavi izmene"</string>
+ <string name="cancel_confirmation_dialog_keep_editing_button" msgid="3316573928085916146">"Otkaži"</string>
+ <string name="leave_customize_confirmation_dialog_message" msgid="4277114551206032979">"Želite da odbacite prilagođavanja?"</string>
<string name="call_type_and_date" msgid="747163730039311423">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="enter_contact_name" msgid="4594274696120278368">"Pretražite kontakte"</string>
- <!-- no translation found for title_edit_group (1889302367574226969) -->
- <skip />
+ <string name="title_edit_group" msgid="8602752287270586734">"Uklonite kontakte"</string>
<string name="local_profile_title" msgid="2021416826991393684">"Moj lokalni profil"</string>
<string name="external_profile_title" msgid="8034998767621359438">"Moj <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g> profil"</string>
<string name="toast_displaying_all_contacts" msgid="2737388783898593875">"Prikazani su svi kontakti"</string>
<string name="generic_no_account_prompt" msgid="7218827704367325460">"Očuvajte bezbednost kontakata čak i ako izgubite telefon – sinhronizujte sa uslugom na mreži."</string>
<string name="generic_no_account_prompt_title" msgid="753783911899054860">"Dodavanje naloga"</string>
- <string name="contact_editor_prompt_zero_accounts" msgid="1785345895691886499">"Neće biti napravljena rezervna kopija novog kontakta. Želite li da dodate nalog koji pravi rezervnu kopiju kontakata onlajn?"</string>
+ <string name="contact_editor_prompt_zero_accounts" msgid="6648376557574360096">"Odvojte malo vremena da biste dodali nalog pomoću kog ćete napraviti rezervnu kopiju kontakata na Google-u."</string>
<string name="contact_editor_prompt_one_account" msgid="3087691056345099310">"Novi kontakti će biti sačuvani na nalogu <xliff:g id="ACCOUNT_NAME">%1$s</xliff:g>."</string>
<string name="contact_editor_prompt_multiple_accounts" msgid="8565761674283473549">"Izaberite podrazumevani nalog za nove kontakte:"</string>
<string name="contact_editor_title_new_contact" msgid="7192223018128934940">"Dodaj novi kontakt"</string>
<string name="contact_editor_title_existing_contact" msgid="4898475703683187798">"Izmeni kontakt"</string>
- <string name="keep_local" msgid="1258761699192993322">"Zadrži lokalno"</string>
<string name="add_account" msgid="8201790677994503186">"Dodaj nalog"</string>
<string name="add_new_account" msgid="5748627740680940264">"Dodaj novi nalog"</string>
<string name="menu_export_database" msgid="2659719297530170820">"Izvezi datoteke baze podataka"</string>
<string name="action_menu_add_new_contact_button" msgid="3180222523336380017">"dodavanje novog kontakta"</string>
<string name="expanding_entry_card_view_see_more" msgid="3779194067124758079">"Prikaži više"</string>
<string name="expanding_entry_card_view_see_less" msgid="5344160551629714168">"Prikaži manje"</string>
- <string name="expanding_entry_card_view_see_all" msgid="3845258737661412627">"Prikaži sve"</string>
<string name="recent_card_title" msgid="8982782042698001695">"Nedavno"</string>
<string name="about_card_title" msgid="2920942314212825637">"Osnovni podaci"</string>
<string name="send_message" msgid="8938418965550543196">"Pošalji poruku"</string>
<string name="toast_making_personal_copy" msgid="288549957278065542">"Pravljenje lične kopije..."</string>
- <string name="yesterday" msgid="6840858548955018569">"Juče"</string>
<string name="tomorrow" msgid="6241969467795308581">"Sutra"</string>
<string name="today" msgid="8041090779381781781">"Danas"</string>
<string name="today_at_time_fmt" msgid="605665249491030460">"Danas u <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
@@ -280,7 +276,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Ime"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Imejl"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Slika"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kliknite da biste proširili uređivač kontakata."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kliknite da biste skupili uređivač kontakata."</string>
<string name="content_description_directions" msgid="2686791825798189335">"uputstva do lokacije"</string>
@@ -291,12 +286,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Nedavni poziv. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Kliknite za povratni poziv"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Vi: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts radi bolje kad unesete Hangouts identifikator osobe u polje za imejl adresu ili broj telefona."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Još polja"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Promenite sliku"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Otvaranje uređivača nije uspelo."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Čuva se"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Trenutno se čuva na nalogu <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dodirnite dvaput da biste izabrali drugi nalog."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Još polja"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Promenite sliku"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Otvaranje uređivača nije uspelo."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Čuva se na"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Gledate"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Trenutno se čuva na <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dodirnite dvaput da biste izabrali drugi nalog."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Objedinjeni kontakti (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="few">Objedinjeni kontakti (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Objedinjeni kontakti (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -324,10 +320,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ovaj kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mogući duplikati"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Izgleda da su ovi kontakti ista osoba. Možete da ih objedinite u jedan kontakt."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Objedinjeni kontakti"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Objedinjeni kontakti"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Sa vaših naloga"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Slikaj"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Sve slike"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Izaberite sliku"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Sa <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Izbriši <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -346,4 +340,273 @@
<string name="permission_explanation_subheader_calendar_and_SMS" msgid="630115334220569184">"Događaji i poruke"</string>
<string name="permission_explanation_subheader_calendar" msgid="8785323496211704613">"Događaji"</string>
<string name="permission_explanation_subheader_SMS" msgid="1904552086449525567">"Poruke"</string>
+ <string name="hamburger_feature_highlight_header" msgid="7442308698936786415">"Organizujte listu"</string>
+ <string name="hamburger_feature_highlight_body" msgid="6268711111318172098">"Uklonite duplikate i grupišite kontakte prema oznaci"</string>
+ <string name="undo" msgid="1425165101664071422">"Opozovi"</string>
+ <string name="call_custom" msgid="6385303130912713318">"Pozovi <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="call_home" msgid="1990519474420545392">"Pozovi kućni telefon"</string>
+ <string name="call_mobile" msgid="7502236805487609178">"Pozovi mobilni telefon"</string>
+ <string name="call_work" msgid="5328785911463744028">"Pozovi poslovni telefon"</string>
+ <string name="call_fax_work" msgid="7467763592359059243">"Pozovi faks"</string>
+ <string name="call_fax_home" msgid="8342175628887571876">"Pozovi kućni faks"</string>
+ <string name="call_pager" msgid="9003902812293983281">"Pozovi pejdžer"</string>
+ <string name="call_other" msgid="8563753966926932052">"Pozovi"</string>
+ <string name="call_callback" msgid="1910165691349426858">"Pozovi za povratni poziv"</string>
+ <string name="call_car" msgid="3280537320306436445">"Pozovi telefon u automobilu"</string>
+ <string name="call_company_main" msgid="6105120947138711257">"Pozovi glavni telefon preduzeća"</string>
+ <string name="call_isdn" msgid="1541590690193403411">"Pozovi ISDN"</string>
+ <string name="call_main" msgid="6082900571803441339">"Pozovi glavni telefon"</string>
+ <string name="call_other_fax" msgid="5745314124619636674">"Pozovi faks"</string>
+ <string name="call_radio" msgid="8296755876398357063">"Pozovi mobilni telefon"</string>
+ <string name="call_telex" msgid="2223170774548648114">"Pozovi teleks"</string>
+ <string name="call_tty_tdd" msgid="8951266948204379604">"Pozovi TTY/TDD"</string>
+ <string name="call_work_mobile" msgid="8707874281430105394">"Pozovi poslovni mobilni telefon"</string>
+ <string name="call_work_pager" msgid="3419348514157949008">"Pozovi poslovni pejdžer"</string>
+ <string name="call_assistant" msgid="670941612175068337">"Pozovi <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="call_mms" msgid="6274041545876221437">"Pozovi MMS"</string>
+ <string name="call_by_shortcut" msgid="2566802538698913124">"<xliff:g id="CONTACT_NAME">%s</xliff:g> (pozovi)"</string>
+ <string name="sms_custom" msgid="415060214233647603">"Pošalji SMS na <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="sms_home" msgid="7524332261493162995">"Pošalji SMS na kućni telefon"</string>
+ <string name="sms_mobile" msgid="5200107250451030769">"Pošalji SMS na mobilni telefon"</string>
+ <string name="sms_work" msgid="2269624156655267740">"Pošalji SMS na poslovni telefon"</string>
+ <string name="sms_fax_work" msgid="8028189067816907075">"Pošalji SMS na poslovni faks"</string>
+ <string name="sms_fax_home" msgid="9204042076306809634">"Pošalji SMS na kućni faks"</string>
+ <string name="sms_pager" msgid="7730404569637015192">"Pošalji SMS na pejdžer"</string>
+ <string name="sms_other" msgid="806127844607642331">"Tekst"</string>
+ <string name="sms_callback" msgid="5004824430094288752">"Pošalji SMS za povratni poziv"</string>
+ <string name="sms_car" msgid="7444227058437359641">"Pošalji SMS na telefon u automobilu"</string>
+ <string name="sms_company_main" msgid="118970873419678087">"Pošalji SMS na glavni broj telefona preduzeća"</string>
+ <string name="sms_isdn" msgid="8153785037515047845">"Pošalji SMS na ISDN"</string>
+ <string name="sms_main" msgid="8621625784504541679">"Pošalji SMS na glavni telefon"</string>
+ <string name="sms_other_fax" msgid="3888842199855843152">"Pošalji SMS na faks"</string>
+ <string name="sms_radio" msgid="3329166673433967820">"Pošalji SMS na mobilni telefon"</string>
+ <string name="sms_telex" msgid="9034802430065267848">"Pošalji SMS na teleks"</string>
+ <string name="sms_tty_tdd" msgid="6782284969132531532">"Pošalji SMS na TTY/TDD"</string>
+ <string name="sms_work_mobile" msgid="2459939960512702560">"Pošalji SMS na poslovni mobilni telefon"</string>
+ <string name="sms_work_pager" msgid="5566924423316960597">"Pošalji SMS na pejdžer"</string>
+ <string name="sms_assistant" msgid="2773424339923116234">"Pošalji SMS na <xliff:g id="ASSISTANT">%s</xliff:g>"</string>
+ <string name="sms_mms" msgid="4069352461380762677">"Pošalji SMS na MMS"</string>
+ <string name="sms_by_shortcut" msgid="7741770672976099517">"<xliff:g id="CONTACT_NAME">%s</xliff:g> (pošalji SMS)"</string>
+ <string name="description_video_call" msgid="7120921378651700947">"Uputite video poziv"</string>
+ <string name="clearFrequentsConfirmation_title" msgid="766292372438450432">"Brisanje često kontaktiranih?"</string>
+ <string name="clearFrequentsConfirmation" msgid="2270554975938265734">"Obrisaćete listu često kontaktiranih u aplikacijama Kontakti i Telefon, pa će imejl aplikacije morati iz početka da prikupe informacije o adresiranju."</string>
+ <string name="clearFrequentsProgress_title" msgid="5157001637482794212">"Brisanje često kontaktiranih..."</string>
+ <string name="status_available" msgid="5586870015822828392">"Dostupan/na"</string>
+ <string name="status_away" msgid="1838861100379804730">"Odsutan/na"</string>
+ <string name="status_busy" msgid="9147992455450257136">"Zauzet/a"</string>
+ <string name="local_invisible_directory" msgid="6046691709127661065">"Drugi"</string>
+ <string name="directory_search_label" msgid="1887759056597975053">"Katalog"</string>
+ <string name="directory_search_label_work" msgid="8618292129829443176">"Katalog za Work"</string>
+ <string name="local_search_label" msgid="2551177578246113614">"Svi kontakti"</string>
+ <string name="foundTooManyContacts" msgid="5163335650920020220">"Pronađeno je više od <xliff:g id="COUNT">%d</xliff:g>."</string>
+ <string name="description_quick_contact_for" msgid="6737516415168327789">"Brzi kontakt za korisnika <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="missing_name" msgid="8745511583852904385">"(Bez imena)"</string>
+ <string name="favoritesFrequentContacted" msgid="6184232487472425690">"Često kontaktirani"</string>
+ <string name="description_view_contact_detail" msgid="9133251213656414807">"Prikaži kontakt"</string>
+ <string name="list_filter_phones" msgid="735313795643493365">"Svi kontakti sa brojevima telefona"</string>
+ <string name="list_filter_phones_work" msgid="1470173699551475015">"Kontakti sa profila za Work"</string>
+ <string name="view_updates_from_group" msgid="1782685984905600034">"Prikaži ažuriranja"</string>
+ <string name="account_phone" msgid="7128032778471187553">"Uređaj"</string>
+ <string name="account_sim" msgid="6519016427905087952">"SIM"</string>
+ <string name="nameLabelsGroup" msgid="2034640839640477827">"Ime"</string>
+ <string name="nicknameLabelsGroup" msgid="2891682101053358010">"Nadimak"</string>
+ <string name="full_name" msgid="6602579550613988977">"Naziv"</string>
+ <string name="name_given" msgid="4280790853455320619">"Ime"</string>
+ <string name="name_family" msgid="7466985689626017037">"Prezime"</string>
+ <string name="name_prefix" msgid="59756378548779822">"Prefiks za ime"</string>
+ <string name="name_middle" msgid="8467433655992690326">"Srednje slovo"</string>
+ <string name="name_suffix" msgid="3855278445375651441">"Sufiks imena"</string>
+ <string name="name_phonetic" msgid="4259595234312430484">"Ime – fonetski"</string>
+ <string name="name_phonetic_given" msgid="8723179018384187631">"Ime – fonetski"</string>
+ <string name="name_phonetic_middle" msgid="8643721493320405200">"Srednje ime – fonetski"</string>
+ <string name="name_phonetic_family" msgid="2640133663656011626">"Prezime – fonetski"</string>
+ <string name="phoneLabelsGroup" msgid="6468091477851199285">"Telefon"</string>
+ <string name="emailLabelsGroup" msgid="8389931313045344406">"Pošalji imejlom"</string>
+ <string name="postalLabelsGroup" msgid="3487738141112589324">"Adresa"</string>
+ <string name="imLabelsGroup" msgid="3898238486262614027">"Razmena trenutnih poruka"</string>
+ <string name="organizationLabelsGroup" msgid="2478611760751832035">"Organizacija"</string>
+ <string name="relationLabelsGroup" msgid="1854373894284572781">"Odnos"</string>
+ <string name="eventLabelsGroup" msgid="7960408705307831289">"Poseban dan"</string>
+ <string name="sms" msgid="1756857139634224222">"Tekstualna poruka"</string>
+ <string name="postal_address" msgid="8765560217149624536">"Adresa"</string>
+ <string name="ghostData_company" msgid="5414421120553765775">"Preduzeće"</string>
+ <string name="ghostData_title" msgid="7496735200318496110">"Naslov"</string>
+ <string name="label_notes" msgid="8337354953278341042">"Beleške"</string>
+ <string name="label_custom_field" msgid="1994056912242214426">"Prilagođeno"</string>
+ <string name="label_sip_address" msgid="7252153678613978127">"SIP"</string>
+ <string name="websiteLabelsGroup" msgid="4202998982804009261">"Veb-sajt"</string>
+ <string name="groupsLabel" msgid="7000816729542098972">"Oznake"</string>
+ <string name="email_home" msgid="8573740658148184279">"Pošalji imejl na kućnu imejl adresu"</string>
+ <string name="email_mobile" msgid="2042889209787989814">"Pošalji imejl na broj mobilnog telefona"</string>
+ <string name="email_work" msgid="2807430017302722689">"Pošalji imejl na poslovni broj telefona"</string>
+ <string name="email_other" msgid="3454004077967657109">"Pošalji imejlom"</string>
+ <string name="email_custom" msgid="5536404237099078802">"Pošalji imejl na <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="email" msgid="5668400997660065897">"Pošalji imejlom"</string>
+ <string name="postal_street" msgid="8133143961580058972">"Ulica"</string>
+ <string name="postal_pobox" msgid="4431938829180269821">"Poštansko sanduče"</string>
+ <string name="postal_neighborhood" msgid="1450783874558956739">"Komšiluk"</string>
+ <string name="postal_city" msgid="6597491300084895548">"Grad"</string>
+ <string name="postal_region" msgid="6045263193478437672">"Država"</string>
+ <string name="postal_postcode" msgid="572136414136673751">"Poštanski broj"</string>
+ <string name="postal_country" msgid="7638264508416368690">"Zemlja"</string>
+ <string name="map_home" msgid="1243547733423343982">"Prikaži kućnu adresu"</string>
+ <string name="map_work" msgid="1360474076921878088">"Prikaži poslovnu adresu"</string>
+ <string name="map_other" msgid="3817820803587012641">"Prikaži adresu"</string>
+ <string name="map_custom" msgid="8761800628069473526">"Prikaži adresu <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="chat_aim" msgid="2588492205291249142">"Započni ćaskanje preko AIM-a"</string>
+ <string name="chat_msn" msgid="8041633440091073484">"Započni ćaskanje preko Windows Live-a"</string>
+ <string name="chat_yahoo" msgid="6629211142719943666">"Započni ćaskanje preko Yahoo-a"</string>
+ <string name="chat_skype" msgid="1210045020427480566">"Započni ćaskanje preko Skype-a"</string>
+ <string name="chat_qq" msgid="4294637812847719693">"Započni ćaskanje preko QQ-a"</string>
+ <string name="chat_gtalk" msgid="981575737258117697">"Ćaskaj preko Google Talk-a"</string>
+ <string name="chat_icq" msgid="8438405386153745775">"Započni ćaskanje preko ICQ-a"</string>
+ <string name="chat_jabber" msgid="7561444230307829609">"Započni ćaskanje preko Jabber-a"</string>
+ <string name="chat" msgid="9025361898797412245">"Ćaskanje"</string>
+ <string name="description_minus_button" msgid="6908099247930477551">"izbriši"</string>
+ <string name="expand_name_fields_description" msgid="6883935911480726652">"Proširite polja za ime"</string>
+ <string name="collapse_name_fields_description" msgid="4757877385895561556">"Skupite polja za ime"</string>
+ <string name="expand_phonetic_name_fields_description" msgid="3865726859582581741">"Proširite polja za fonetsko ime"</string>
+ <string name="collapse_phonetic_name_fields_description" msgid="9102249481855019452">"Skupite polja za fonetsko ime"</string>
+ <string name="expand_fields_description" msgid="8129294181216760037">"Proširite"</string>
+ <string name="collapse_fields_description" msgid="1884143625854637874">"Skupite"</string>
+ <string name="announce_expanded_fields" msgid="1075947220478530622">"Prošireno je"</string>
+ <string name="announce_collapsed_fields" msgid="6414231530177338704">"Skupljeno je"</string>
+ <string name="list_filter_all_accounts" msgid="8908683398914322369">"Svi kontakti"</string>
+ <string name="list_filter_all_starred" msgid="5031734941601931356">"Sa zvezdicom"</string>
+ <string name="list_filter_customize" msgid="4789963356004169321">"Prilagodi"</string>
+ <string name="list_filter_single" msgid="5871400283515893087">"Kontakt"</string>
+ <string name="display_ungrouped" msgid="6885954210243119591">"Svi drugi kontakti"</string>
+ <string name="display_all_contacts" msgid="2031647544742889505">"Svi kontakti"</string>
+ <string name="menu_sync_remove" msgid="3266725887008450161">"Ukloni grupu za sinhronizaciju"</string>
+ <string name="dialog_sync_add" msgid="8267045393119375803">"Dodaj grupu za sinhronizaciju"</string>
+ <string name="display_more_groups" msgid="2682547080423434170">"Još grupa…"</string>
+ <string name="display_warn_remove_ungrouped" msgid="8872290721676651414">"Uklanjanjem grupe „<xliff:g id="GROUP">%s</xliff:g>“ sa liste za sinhronizaciju uklonićete i sve negrupisane kontakte sa te liste."</string>
+ <string name="savingDisplayGroups" msgid="2133152192716475939">"Čuvanje opcija prikaza je u toku..."</string>
+ <string name="menu_done" msgid="796017761764190697">"Gotovo"</string>
+ <string name="menu_doNotSave" msgid="58593876893538465">"Otkaži"</string>
+ <string name="listCustomView" msgid="1840624396582117590">"Prilagođeni prikaz"</string>
+ <string name="dialog_new_contact_account" msgid="4969619718062454756">"Sačuvajte uvezene kontakte na:"</string>
+ <string name="import_from_sim" msgid="3859272228033941659">"Uvezi sa SIM kartice"</string>
+ <string name="import_from_sim_summary" msgid="5815105584445743740">"Uvezi sa SIM kartice <xliff:g id="SIM_NAME">^1</xliff:g> – <xliff:g id="SIM_NUMBER">^2</xliff:g>"</string>
+ <string name="import_from_sim_summary_no_number" msgid="880612418352086012">"Uvezi sa SIM kartice <xliff:g id="SIM_NAME">%1$s</xliff:g>"</string>
+ <string name="import_from_vcf_file" product="default" msgid="5304572242183878086">"Uvezi iz .vcf datoteke"</string>
+ <string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Želite li da otkažete uvoz datoteke <xliff:g id="FILENAME">%s</xliff:g>?"</string>
+ <string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Želite li da otkažete izvoz datoteke <xliff:g id="FILENAME">%s</xliff:g>?"</string>
+ <string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Nije moguće otkazati vCard uvoz/izvoz"</string>
+ <string name="fail_reason_unknown" msgid="1714092345030570863">"Nepoznata greška."</string>
+ <string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Nije moguće otvoriti datoteku „<xliff:g id="FILE_NAME">%s</xliff:g>“: <xliff:g id="EXACT_REASON">%s</xliff:g>"</string>
+ <string name="fail_reason_could_not_initialize_exporter" msgid="707260459259688510">"Nije moguće pokrenuti program za izvoz: „<xliff:g id="EXACT_REASON">%s</xliff:g>“"</string>
+ <string name="fail_reason_no_exportable_contact" msgid="8728506011371262065">"Nema kontakata za izvoz."</string>
+ <string name="missing_required_permission" msgid="5865884842972833120">"Onemogućili ste obaveznu dozvolu."</string>
+ <string name="fail_reason_error_occurred_during_export" msgid="3018855323913649063">"Došlo je do greške pri izvozu: „<xliff:g id="EXACT_REASON">%s</xliff:g>“"</string>
+ <string name="fail_reason_too_long_filename" msgid="3393764245254738333">"Zahtevani naziv datoteke je predugačak („<xliff:g id="FILENAME">%s</xliff:g>“)"</string>
+ <string name="fail_reason_io_error" msgid="6748358842976073255">"I/O greška"</string>
+ <string name="fail_reason_low_memory_during_import" msgid="875222757734882898">"Nema dovoljno memorije. Datoteka je možda prevelika."</string>
+ <string name="fail_reason_vcard_parse_error" msgid="888263542360355784">"Iz neočekivanog razloga nije bilo moguće raščlaniti vCard datoteku."</string>
+ <string name="fail_reason_not_supported" msgid="8219562769267148825">"Format nije podržan."</string>
+ <string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="6427931733267328564">"Nije moguće prikupiti metapodatke datih vCard datoteka."</string>
+ <string name="fail_reason_failed_to_read_files" msgid="5823434810622484922">"Nije moguće uvesti jednu ili više datoteka (%s)."</string>
+ <string name="exporting_vcard_finished_title" msgid="4767045779458185251">"Izvoz datoteke <xliff:g id="FILENAME">%s</xliff:g> je završen."</string>
+ <string name="exporting_vcard_finished_title_fallback" msgid="6060472638008218274">"Izvoz kontakata je završen."</string>
+ <string name="exporting_vcard_finished_toast" msgid="1739055986856453882">"Izvoz kontakata je završen. Kliknite na obaveštenje da biste ih delili."</string>
+ <string name="touch_to_share_contacts" msgid="4882485525268469736">"Dodirnite da biste delili kontakte."</string>
+ <string name="exporting_vcard_canceled_title" msgid="2652222370493306887">"Izvoz datoteke <xliff:g id="FILENAME">%s</xliff:g> je otkazan"</string>
+ <string name="exporting_contact_list_title" msgid="9072240631534457415">"Izvoz podataka o kontaktima je u toku"</string>
+ <string name="exporting_contact_list_message" msgid="3367949209642931952">"Podaci o kontaktima se izvoze."</string>
+ <string name="composer_failed_to_get_database_infomation" msgid="1765944280846236723">"Nije moguće preuzeti informacije iz baze podataka"</string>
+ <string name="composer_has_no_exportable_contact" msgid="3296493229040294335">"Nema kontakata za izvoz. Ako imate kontakata na telefonu, neki dobavljači podataka možda neće dozvoliti da se kontakti izvoze sa telefona."</string>
+ <string name="composer_not_initialized" msgid="2321648986367005254">"Program za izradu vCard datoteka se nije ispravno pokrenuo."</string>
+ <string name="exporting_contact_failed_title" msgid="4892358112409576342">"Nije moguće izvesti"</string>
+ <string name="exporting_contact_failed_message" msgid="4938527850142003141">"Podaci o kontaktima nizu izvezeni.\nRazlog: „<xliff:g id="FAIL_REASON">%s</xliff:g>“"</string>
+ <string name="importing_vcard_description" msgid="4245275224298571351">"Uvoz <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="reading_vcard_failed_title" msgid="4251647443358422855">"Nije moguće čitati vCard podatke"</string>
+ <string name="reading_vcard_canceled_title" msgid="1925216585981542019">"Otkazano je čitanje podataka sa vCard datoteke"</string>
+ <string name="importing_vcard_finished_title" msgid="3341541727268747967">"Uvoz datoteke <xliff:g id="FILENAME">%s</xliff:g> je završen"</string>
+ <string name="importing_vcard_canceled_title" msgid="2147475978165599336">"Uvoz datoteke <xliff:g id="FILENAME">%s</xliff:g> je otkazan"</string>
+ <string name="vcard_import_will_start_message" msgid="2804911199145873396">"Datoteka <xliff:g id="FILENAME">%s</xliff:g> će uskoro biti uvezena."</string>
+ <string name="vcard_import_will_start_message_with_default_name" msgid="1022969530654129470">"Datoteka će uskoro biti uvezena."</string>
+ <string name="vcard_import_request_rejected_message" msgid="2890471184508516011">"Zahtev za izvoz vCard datoteke je odbijen. Pokušajte kasnije."</string>
+ <string name="vcard_export_will_start_message" msgid="2210241345252081463">"Datoteka <xliff:g id="FILENAME">%s</xliff:g> će uskoro biti izvezena."</string>
+ <string name="vcard_export_will_start_message_fallback" msgid="6553826997490909749">"Datoteka će uskoro biti izvezena."</string>
+ <string name="contacts_export_will_start_message" msgid="8538705791417534431">"Kontakti će uskoro biti izvezeni."</string>
+ <string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Zahtev za izvoz vCard datoteke je odbijen. Pokušajte kasnije."</string>
+ <string name="vcard_unknown_filename" msgid="7171709890959915954">"kontakt"</string>
+ <string name="caching_vcard_message" msgid="4926308675041506756">"Keširanje vCard datoteke u lokalnu privremenu memoriju. Uvoz će uskoro započeti."</string>
+ <string name="vcard_import_failed" msgid="5223531255894842406">"Nije moguće uvesti vCard datoteku."</string>
+ <string name="nfc_vcard_file_name" msgid="2823095213265993609">"Kontakt preko NFC-a"</string>
+ <string name="confirm_export_title" msgid="6834385377255286349">"Želite li da izvezete kontakte?"</string>
+ <string name="caching_vcard_title" msgid="1226272312940516605">"Keširanje..."</string>
+ <string name="progress_notifier_message" msgid="2311011466908220528">"Uvoz <xliff:g id="CURRENT_NUMBER">%s</xliff:g>/<xliff:g id="TOTAL_NUMBER">%s</xliff:g>: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="export_to_vcf_file" product="default" msgid="4407527157056120858">"Izvezi u .vcf datoteku"</string>
+ <string name="display_options_sort_list_by" msgid="7028809117272018712">"Sortiraj prema"</string>
+ <string name="display_options_sort_by_given_name" msgid="2778421332815687873">"Ime"</string>
+ <string name="display_options_sort_by_family_name" msgid="2684905041926954793">"Prezime"</string>
+ <string name="display_options_view_names_as" msgid="6514632499276563482">"Format imena"</string>
+ <string name="display_options_view_given_name_first" msgid="3616004640258761473">"Prvo ime"</string>
+ <string name="display_options_view_family_name_first" msgid="956445100777296467">"Prvo prezime"</string>
+ <string name="settings_accounts" msgid="350219740670774576">"Nalozi"</string>
+ <string name="default_editor_account" msgid="699591683362420991">"Podrazumevani nalog za nove kontakte"</string>
+ <string name="sync_contact_metadata_title" msgid="6957956139306960211">"Sinhronizuj metapodatke kontakata [DOGFOOD]"</string>
+ <string name="sync_contact_metadata_dialog_title" msgid="6192335951588820553">"Sinhronizujte metapodatke kontakata"</string>
+ <string name="settings_my_info_title" msgid="1534272456405343119">"Moje informacije"</string>
+ <string name="set_up_profile" msgid="7370213843590143771">"Podesite profil"</string>
+ <string name="setting_about" msgid="7014388749752042863">"O Kontaktima"</string>
+ <string name="share_visible_contacts" msgid="890150378880783797">"Deli vidljive kontakte"</string>
+ <string name="share_visible_contacts_failure" msgid="7324717548166915560">"Deljenje vidljivih kontakata nije uspelo."</string>
+ <string name="share_favorite_contacts" msgid="4280926751003081042">"Deli omiljene kontakte"</string>
+ <string name="share_contacts" msgid="8109287987498711664">"Deli sve kontakte"</string>
+ <string name="share_contacts_failure" msgid="1216431977330560559">"Deljenje kontakata nije uspelo."</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Izvezite kontakte"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Uvoz kontakata"</string>
+ <string name="share_error" msgid="948429331673358107">"Ovaj kontakt ne može da se deli."</string>
+ <string name="no_contact_to_share" msgid="1276397530378323033">"Nema kontakata za deljenje."</string>
+ <string name="menu_search" msgid="9147752853603483719">"Pretraga"</string>
+ <string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakti za prikaz"</string>
+ <string name="activity_title_contacts_filter" msgid="8275542497615516969">"Kontakti za prikaz"</string>
+ <string name="custom_list_filter" msgid="2105275443109077687">"Definišite prilagođeni prikaz"</string>
+ <string name="menu_custom_filter_save" msgid="2679793632208086460">"Sačuvaj"</string>
+ <string name="hint_findContacts" msgid="7128627979899070325">"Pretražite kontakte"</string>
+ <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Omiljeno"</string>
+ <string name="listTotalAllContactsZero" msgid="5513001821794568211">"Nema kontakata."</string>
+ <string name="menu_clear_frequents" msgid="7688250191932838833">"Obriši često kontaktirane"</string>
+ <string name="menu_select_sim" msgid="3603578201960504010">"Izaberite SIM karticu"</string>
+ <string name="menu_accounts" msgid="1424330057450189074">"Upravljaj nalozima"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Uvezi"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Izvezi"</string>
+ <string name="menu_blocked_numbers" msgid="5272951629083025995">"Blokirani brojevi"</string>
+ <string name="contact_status_update_attribution" msgid="752179367353018597">"preko <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
+ <string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> preko <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
+ <string name="action_menu_back_from_search" msgid="8793348588949233348">"zaustavite pretraživanje"</string>
+ <string name="description_clear_search" msgid="688023606766232904">"Brisanje pretrage"</string>
+ <string name="settings_contact_display_options_title" msgid="4890258244494248687">"Opcije prikazivanja kontakata"</string>
+ <string name="select_account_dialog_title" msgid="5478489655696599219">"Nalog"</string>
+ <string name="set_default_account" msgid="4311613760725609801">"Uvek koristi ovo za pozive"</string>
+ <string name="select_phone_account_for_calls" msgid="3810607744451014540">"Pozovi pomoću"</string>
+ <string name="call_with_a_note" msgid="8389827628360791676">"Uputi poziv sa beleškom"</string>
+ <string name="call_subject_hint" msgid="3043028982108363572">"Unesite belešku koju ćete poslati uz poziv…"</string>
+ <string name="send_and_call_button" msgid="7740295432834590737">"POŠALJI I POZOVI"</string>
+ <string name="call_subject_limit" msgid="4545212901205397669">"<xliff:g id="COUNT">%1$s</xliff:g>/<xliff:g id="LIMIT">%2$s</xliff:g>"</string>
+ <string name="call_subject_type_and_number" msgid="7667188212129152558">"<xliff:g id="TYPE">%1$s</xliff:g> • <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <plurals name="tab_title_with_unread_items" formatted="false" msgid="7682024005130747825">
+ <item quantity="one"> <xliff:g id="TITLE_2">%1$s</xliff:g>. <xliff:g id="COUNT_3">%2$d</xliff:g> nepročitana stavka. </item>
+ <item quantity="few"> <xliff:g id="TITLE_2">%1$s</xliff:g>. <xliff:g id="COUNT_3">%2$d</xliff:g> nepročitane stavke. </item>
+ <item quantity="other"> <xliff:g id="TITLE_2">%1$s</xliff:g>. <xliff:g id="COUNT_3">%2$d</xliff:g> nepročitanih stavki. </item>
+ </plurals>
+ <string name="about_build_version" msgid="1765533099416999801">"Verzija"</string>
+ <string name="about_open_source_licenses" msgid="6479990452352919641">"Licence otvorenog koda"</string>
+ <string name="about_open_source_licenses_summary" msgid="57418386931763994">"Podaci o licenci za softver otvorenog koda"</string>
+ <string name="about_privacy_policy" msgid="3705518622499152626">"Politika privatnosti"</string>
+ <string name="about_terms_of_service" msgid="4642400812150296723">"Uslovi korišćenja usluge"</string>
+ <string name="activity_title_licenses" msgid="5467767062737708066">"Licence otvorenog koda"</string>
+ <string name="url_open_error_toast" msgid="452592089815420457">"Otvaranje URL-a nije uspelo."</string>
+ <string name="account_filter_view_checked" msgid="6696859503887762213">"Označeno: <xliff:g id="ACCOUNT_INFO">%s</xliff:g>"</string>
+ <string name="account_filter_view_not_checked" msgid="2248684521205038389">"Nije označeno: <xliff:g id="ACCOUNT_INFO">%s</xliff:g>"</string>
+ <string name="description_search_video_call" msgid="5841525580339803272">"Uputite video poziv"</string>
+ <string name="description_delete_contact" msgid="53835657343783663">"Izbrišite"</string>
+ <string name="description_no_name_header" msgid="8884991311595943271">"Tri tačke"</string>
+ <string name="callDurationSecondFormat" msgid="7067644915903528776">"<xliff:g id="SECONDS">%s</xliff:g> sek"</string>
+ <string name="callDurationMinuteFormat" msgid="4647095486747447674">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> sek"</string>
+ <string name="callDurationHourFormat" msgid="7392254193808506640">"<xliff:g id="MINUTES_0">%s</xliff:g> s <xliff:g id="MINUTES_1">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> sek"</string>
+ <string name="dynamic_shortcut_disabled_message" msgid="249939425761315252">"Ova prečica je onemogućena"</string>
+ <string name="dynamic_shortcut_contact_removed_message" msgid="6845645831837615899">"Kontakt je uklonjen"</string>
</resources>
diff --git a/res/values-be-rBY-sw600dp/strings.xml b/res/values-be-rBY-sw600dp/strings.xml
new file mode 100644
index 0000000..8e0b10f
--- /dev/null
+++ b/res/values-be-rBY-sw600dp/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="account_phone" msgid="347665663520819575">"Прылада"</string>
+ <string name="composer_has_no_exportable_contact" msgid="5998889616701036804">"Няма кантактаў, якія можна экспартаваць. Калі ў вас ёсць кантакты на планшэце, некаторыя пастаўшчыкі даных могуць не дазваляць экспарт кантактаў з планшэта."</string>
+</resources>
diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml
index 2eee399..c63f68f 100644
--- a/res/values-be-rBY/strings.xml
+++ b/res/values-be-rBY/strings.xml
@@ -17,9 +17,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="3906689777043645443">"Кантакты"</string>
- <string name="launcherActivityLabel" msgid="6497230399032392417">"Кантакты"</string>
- <string name="quickContactActivityLabel" msgid="7985456650689347268">"Прагледзець кантакт"</string>
- <string name="editContactActivityLabel" msgid="1129944572070802839">"Рэдагаваць кантакт"</string>
<string name="contactsList" msgid="8661624236494819731">"Кантакты"</string>
<string name="shortcutContact" msgid="749243779392912958">"Кантакт"</string>
<string name="shortcutDialContact" msgid="746622101599186779">"Хуткі выклік"</string>
@@ -31,12 +28,7 @@
<string name="contactPickerActivityTitle" msgid="4301062192337417640">"Выберыце кантакт"</string>
<string name="groupMemberPickerActivityTitle" msgid="1431750793695262522">"Выбраць"</string>
<string name="header_entry_contact_list_adapter_header_title" msgid="2436981165830115659">"Стварыць новы кантакт"</string>
- <string name="starredList" msgid="4817256136413959463">"Пазначана"</string>
- <string name="frequentList" msgid="7154768136473953056">"Частыя"</string>
- <string name="strequentList" msgid="5640192862059373511">"Любімыя"</string>
<string name="viewContactTitle" msgid="7989394521836644384">"Дадзеныя кантакта"</string>
- <string name="editContactDescription" msgid="2947202828256214947">"Рэдагаваць кантакт"</string>
- <string name="insertContactDescription" msgid="4709878105452681987">"Стварыць кантакт"</string>
<string name="contactDetailAbout" msgid="5430408883907061400">"Інфармацыя"</string>
<string name="contactDetailUpdates" msgid="3780588624763446941">"Абнаўленні"</string>
<string name="searchHint" msgid="8482945356247760701">"Пошук кантактаў"</string>
@@ -52,7 +44,7 @@
<string name="menu_call" msgid="3992595586042260618">"Выклікаць кантакт"</string>
<string name="menu_sendSMS" msgid="5535886767547006515">"Паведамленне кантакту"</string>
<string name="menu_splitAggregate" msgid="2627252205317945563">"Выдаліць сувязь"</string>
- <string name="menu_editGroup" msgid="5062005185370983720">"Рэдагаваць"</string>
+ <string name="menu_editGroup" msgid="6696843438454341063">"Выдаліць кантакты"</string>
<string name="menu_renameGroup" msgid="7169512355179757182">"Перайменаваць метку"</string>
<string name="menu_deleteGroup" msgid="1126469629233412249">"Выдаліць метку"</string>
<string name="menu_addToGroup" msgid="3267409983764370041">"Дадаць кантакт"</string>
@@ -75,17 +67,24 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Прапанаваныя кантакты"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Усе кантакты"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Кантакты звязаны"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Карыстальнік <xliff:g id="NAME">%s</xliff:g> выдалены"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Кантакты выдалены</item>
<item quantity="few">Кантакты выдалены</item>
<item quantity="many">Кантакты выдалены</item>
<item quantity="other">Кантакты выдалены</item>
</plurals>
- <plurals name="contacts_count" formatted="false" msgid="3287407967505649458">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> кантакт</item>
- <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> кантакты</item>
- <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> кантактаў</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> кантакту</item>
+ <plurals name="contacts_count" formatted="false" msgid="8696793457340503668">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> кантакт</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> кантакты</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> кантактаў</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> кантакту</item>
+ </plurals>
+ <plurals name="contacts_count_with_account" formatted="false" msgid="7402583111980220575">
+ <item quantity="one"><xliff:g id="COUNT_2">%d</xliff:g> кантакт · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="few"><xliff:g id="COUNT_2">%d</xliff:g> кантакты · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="many"><xliff:g id="COUNT_2">%d</xliff:g> кантактаў · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="other"><xliff:g id="COUNT_2">%d</xliff:g> кантакту · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
</plurals>
<string name="title_from_google" msgid="4664084747121207202">"З Google"</string>
<string name="title_from_other_accounts" msgid="8307885412426754288">"З <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
@@ -113,17 +112,20 @@
<string name="customLabelPickerTitle" msgid="1081475101983255212">"Імя карыстальніцкага цэтліка"</string>
<string name="send_to_voicemail_checkbox" msgid="9001686764070676353">"Адпраўляць выклікі непасрэдна на галасавую пошту"</string>
<string name="removePhoto" msgid="4898105274130284565">"Выдаліць фота"</string>
- <string name="noContacts" msgid="4955659076981974652">"Няма кантактаў"</string>
+ <string name="noContacts" msgid="2228592924476426108">"Ваш спіс кантактаў пусты"</string>
<string name="noGroups" msgid="4607906327968232225">"Метак няма."</string>
<string name="noAccounts" msgid="7768267764545265909">"Для стварэння групы патрабуецца ўліковы запіс."</string>
<string name="emptyGroup" msgid="5102411903247859575">"Няма кантактаў з гэтай меткай"</string>
+ <string name="emptyAccount" msgid="6873962901497975964">"Няма кантактаў у гэтым уліковым запісе"</string>
+ <string name="emptyMainList" msgid="2772242747899664460">"Ваш спіс кантактаў пусты"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Кантакт <xliff:g id="DISPLAY_NAME">%s</xliff:g> захаваны"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Кантакт захаваны"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Кантакты адлучаны"</string>
- <string name="contactSavedErrorToast" msgid="3207250533172944892">"Немагчыма захаваць змены кантакта."</string>
- <string name="contactUnlinkErrorToast" msgid="2758070702785994171">"Не ўдалося скасаваць сувязь з кантактам."</string>
- <string name="contactJoinErrorToast" msgid="3977932531264809035">"Не ўдалося падлучыць кантакт."</string>
- <string name="contactGenericErrorToast" msgid="7774911165341591714">"Памылка пры захаванні кантакту."</string>
- <string name="contactPhotoSavedErrorToast" msgid="4079032272022979114">"Не ўдалося захаваць змяненні фота кантакту."</string>
+ <string name="contactSavedErrorToast" msgid="4827033473908688031">"Не ўдалося захаваць змены кантакту"</string>
+ <string name="contactUnlinkErrorToast" msgid="2706297508166952431">"Не ўдалося скасаваць сувязь з кантактам"</string>
+ <string name="contactJoinErrorToast" msgid="5735129234573327701">"Не ўдалося звязаць кантакт"</string>
+ <string name="contactGenericErrorToast" msgid="3885457515665783976">"Памылка пры захаванні кантакту"</string>
+ <string name="contactPhotoSavedErrorToast" msgid="6860883564984042194">"Не ўдалося захаваць змяненні фота кантакту"</string>
<string name="groupLoadErrorToast" msgid="7536267148196064554">"Збой загрузкі этыкеткі"</string>
<string name="groupSavedToast" msgid="6491495462357722285">"Метка захавана"</string>
<string name="groupDeletedToast" msgid="520896687873262027">"Метка выдалена"</string>
@@ -132,7 +134,8 @@
<string name="groupUpdatedToast" msgid="3667977658676267687">"Метка абноўлена"</string>
<string name="groupMembersRemovedToast" msgid="3510563559799376603">"Выдалена з меткі"</string>
<string name="groupMembersAddedToast" msgid="4824834898718972768">"Дададзена да этыкеткі"</string>
- <string name="groupSavedErrorToast" msgid="8121032018490980184">"Не ўдалося захаваць змяненні меткі."</string>
+ <string name="groupSavedErrorToast" msgid="2355891714292740162">"Не ўдалося захаваць змяненні меткі"</string>
+ <string name="groupExistsErrorMessage" msgid="5196811283836946189">"Гэта пазнака ўжо існуе"</string>
<plurals name="listTotalPhoneContacts" formatted="false" msgid="3692277679143308755">
<item quantity="one"><xliff:g id="COUNT">%d</xliff:g> кантакт з нумарам(і) тэлефона(ў)</item>
<item quantity="few"><xliff:g id="COUNT">%d</xliff:g> кантакты з нумарамі тэлефонаў</item>
@@ -158,7 +161,6 @@
<string name="callAgain" msgid="3197312117049874778">"Выклікаць зноў"</string>
<string name="returnCall" msgid="8171961914203617813">"Зваротны выклік"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Дадаць адрас \"<xliff:g id="EMAIL">%s</xliff:g>\" у кантакты?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"фатаграфія кантакта"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</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="search_settings_description" msgid="2675223022992445813">"Імёны вашых кантактаў"</string>
@@ -205,7 +207,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Дата"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Метка"</string>
<string name="change_photo" msgid="8530597935483526383">"Змяніць"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Асноўнае фота"</string>
<string name="description_star" msgid="2605854427360036550">"выбранае"</string>
<string name="edit_contact" msgid="7529281274005689512">"Рэдагаваць кантакт"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"закрыць"</string>
@@ -229,8 +230,7 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Загрузка..."</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Стварыць новы кантакт"</string>
<string name="contacts_unavailable_add_account" msgid="4347232421410561500">"Дадаць уліковы запіс"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Імпартаваць кантакты"</string>
- <string name="create_group_dialog_title" msgid="5363404287877384473">"Стварыць новую метку"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="3182801738595937144">"Імпартаваць"</string>
<string name="create_group_item_label" msgid="3263064599743742865">"Стварыць новую..."</string>
<string name="delete_group_dialog_message" msgid="335713829185261371">"Выдаліць метку \"<xliff:g id="GROUP_LABEL">%1$s</xliff:g>\"? (Самі кантакты не будуць выдалены.)"</string>
<string name="toast_join_with_empty_contact" msgid="1215465657839085613">"Перад звязваннем кантакту з іншым увядзіце імя кантакту."</string>
@@ -238,36 +238,33 @@
<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_message" msgid="5058226498605989285">"Адхіліць змены і скончыць рэдагаванне?"</string>
+ <string name="cancel_confirmation_dialog_message" msgid="9008214737653278989">"Скасаваць змены?"</string>
<string name="cancel_confirmation_dialog_cancel_editing_button" msgid="3057023972074640671">"Адхіліць"</string>
- <string name="cancel_confirmation_dialog_keep_editing_button" msgid="7737724111972855348">"Працягнуць рэдагаванне"</string>
+ <string name="cancel_confirmation_dialog_keep_editing_button" msgid="3316573928085916146">"Скасаваць"</string>
+ <string name="leave_customize_confirmation_dialog_message" msgid="4277114551206032979">"Скасаваць дапасаванні?"</string>
<string name="call_type_and_date" msgid="747163730039311423">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="enter_contact_name" msgid="4594274696120278368">"Пошук кантактаў"</string>
- <!-- no translation found for title_edit_group (1889302367574226969) -->
- <skip />
+ <string name="title_edit_group" msgid="8602752287270586734">"Выдаліць кантакты"</string>
<string name="local_profile_title" msgid="2021416826991393684">"Мой лакальны профіль"</string>
<string name="external_profile_title" msgid="8034998767621359438">"Мой профіль у <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g>"</string>
<string name="toast_displaying_all_contacts" msgid="2737388783898593875">"Адлюстраванне ўсіх кантактаў"</string>
<string name="generic_no_account_prompt" msgid="7218827704367325460">"Абаранiце свае кантакты, нават калі страціце тэлефон: сінхранізуйце iх з вэб-службай."</string>
<string name="generic_no_account_prompt_title" msgid="753783911899054860">"Дадаць уліковы запіс"</string>
- <string name="contact_editor_prompt_zero_accounts" msgid="1785345895691886499">"Рэзервовая копiя вашага новага кантакту не будзе створана. Дадаць улiковы запiс, у якiм будуць захоўвацца рэзервовыя копii кантактаў у Iнтэрнэце?"</string>
+ <string name="contact_editor_prompt_zero_accounts" msgid="6648376557574360096">"Знайдзіце хвілінку, каб дадаць уліковы запіс, які дазволіць стварыць рэзервовую копію вашых кантактаў у Google."</string>
<string name="contact_editor_prompt_one_account" msgid="3087691056345099310">"Новыя кантакты будуць захаваны ва ўліковы запіс <xliff:g id="ACCOUNT_NAME">%1$s</xliff:g>."</string>
<string name="contact_editor_prompt_multiple_accounts" msgid="8565761674283473549">"Выбраць уліковы запіс па змаўчанні для новых кантактаў:"</string>
<string name="contact_editor_title_new_contact" msgid="7192223018128934940">"Дадаць новы кантакт"</string>
<string name="contact_editor_title_existing_contact" msgid="4898475703683187798">"Рэдагаваць кантакт"</string>
- <string name="keep_local" msgid="1258761699192993322">"Захоўваць лакальна"</string>
<string name="add_account" msgid="8201790677994503186">"Дадаць уліковы запіс"</string>
<string name="add_new_account" msgid="5748627740680940264">"Дадаць новы ўліковы запіс"</string>
<string name="menu_export_database" msgid="2659719297530170820">"Экспарт базы дадзеных файлаў"</string>
<string name="action_menu_add_new_contact_button" msgid="3180222523336380017">"дадаць новы кантакт"</string>
<string name="expanding_entry_card_view_see_more" msgid="3779194067124758079">"Болей"</string>
<string name="expanding_entry_card_view_see_less" msgid="5344160551629714168">"Паказаць менш"</string>
- <string name="expanding_entry_card_view_see_all" msgid="3845258737661412627">"Прагледзець усё"</string>
<string name="recent_card_title" msgid="8982782042698001695">"Нядаўнія"</string>
<string name="about_card_title" msgid="2920942314212825637">"Інфармацыя"</string>
<string name="send_message" msgid="8938418965550543196">"Адправiць паведамленне"</string>
<string name="toast_making_personal_copy" msgid="288549957278065542">"Стварэнне асабістай копіі..."</string>
- <string name="yesterday" msgid="6840858548955018569">"Учора"</string>
<string name="tomorrow" msgid="6241969467795308581">"Заўтра"</string>
<string name="today" msgid="8041090779381781781">"Сёння"</string>
<string name="today_at_time_fmt" msgid="605665249491030460">"Сёння ў перыяд <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
@@ -286,7 +283,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Імя"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Электронная пошта"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Тэлефон"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Фота"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Націсніце, каб разгарнуць рэдактар кантактаў."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Націсніце, каб згарнуць рэдактар кантактаў."</string>
<string name="content_description_directions" msgid="2686791825798189335">"напрамкі да месцазнаходжання"</string>
@@ -297,13 +293,14 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"апошні выклік. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. націсніце для зваротнага выкліку"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Вы: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts працуе лепш, калі вы ўводзіце ідэнтыфікатар асобы Hangouts у поле для адраса электроннай пошты ці тэлефона."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Дадатковыя палі"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Змяніць фота"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Збой адкрыцця рэдактара."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Куды захоўваць:"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Зараз ідзе захаванне ва ўліковы запіс <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Двойчы дакраніцеся, каб выбраць іншы ўліковы запіс."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one">Звязаны кантакт (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Дадатковыя палі"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Змяніць фота"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Збой адкрыцця рэдактара."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Захоўваць у:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Прагляд"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Зараз захоўваецца ва ўліковы запіс <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Краніце двойчы, каб выбраць іншы ўліковы запіс."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="one">Звязаныя кантакты (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="few">Звязаныя кантакты (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="many">Звязаныя кантакты (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Звязаныя кантакты (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -334,10 +331,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Гэты кантакт"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Магчымыя дублікаты"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Гэтыя кантакты могуць датычыць адной асобы. Іх можна звязаць, каб стварыць адзіны кантакт."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Падлучаныя кантакты"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Звязаныя кантакты"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"З вашых уліковых запісаў"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Зрабіць фотаздымак"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Усе фота"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Выбраць фота"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"З уліковага запісу <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Выдаліць <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -356,4 +351,274 @@
<string name="permission_explanation_subheader_calendar_and_SMS" msgid="630115334220569184">"Падзеі і паведамленні"</string>
<string name="permission_explanation_subheader_calendar" msgid="8785323496211704613">"Падзеі"</string>
<string name="permission_explanation_subheader_SMS" msgid="1904552086449525567">"Паведамленні"</string>
+ <string name="hamburger_feature_highlight_header" msgid="7442308698936786415">"Арганізуйце свой спіс"</string>
+ <string name="hamburger_feature_highlight_body" msgid="6268711111318172098">"Выдаліце дублікаты і згрупуйце кантакты па метках"</string>
+ <string name="undo" msgid="1425165101664071422">"Адрабіць"</string>
+ <string name="call_custom" msgid="6385303130912713318">"Выклікаць <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="call_home" msgid="1990519474420545392">"Патэлефанаваць на хатні нумар"</string>
+ <string name="call_mobile" msgid="7502236805487609178">"Набраць нумар мабільнага тэлефону"</string>
+ <string name="call_work" msgid="5328785911463744028">"Выклікаць працоўны нумар тэлефона"</string>
+ <string name="call_fax_work" msgid="7467763592359059243">"Набраць нумар працоўнага факса"</string>
+ <string name="call_fax_home" msgid="8342175628887571876">"Патэлефанаваць на хатні факс"</string>
+ <string name="call_pager" msgid="9003902812293983281">"Выклікаць пэйджар"</string>
+ <string name="call_other" msgid="8563753966926932052">"Выклікаць"</string>
+ <string name="call_callback" msgid="1910165691349426858">"Зрабіць зваротны выклік"</string>
+ <string name="call_car" msgid="3280537320306436445">"Выклікаць нумар у машыне"</string>
+ <string name="call_company_main" msgid="6105120947138711257">"Выклікаць асноўны нумар кампаніі"</string>
+ <string name="call_isdn" msgid="1541590690193403411">"Выклік ISDN"</string>
+ <string name="call_main" msgid="6082900571803441339">"Выклікаць асноўны нумар"</string>
+ <string name="call_other_fax" msgid="5745314124619636674">"Выклік факса"</string>
+ <string name="call_radio" msgid="8296755876398357063">"Патэлефанаваць на радыётэлефон"</string>
+ <string name="call_telex" msgid="2223170774548648114">"Выклік на тэлекс"</string>
+ <string name="call_tty_tdd" msgid="8951266948204379604">"Выклікаць TTY/TDD"</string>
+ <string name="call_work_mobile" msgid="8707874281430105394">"Патэлефанаваць на працоўны мабільны"</string>
+ <string name="call_work_pager" msgid="3419348514157949008">"Выклікаць працоўны пэйджар"</string>
+ <string name="call_assistant" msgid="670941612175068337">"Выклікаць <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="call_mms" msgid="6274041545876221437">"Выклік MMS"</string>
+ <string name="call_by_shortcut" msgid="2566802538698913124">"<xliff:g id="CONTACT_NAME">%s</xliff:g> (Выклікаць)"</string>
+ <string name="sms_custom" msgid="415060214233647603">"Адправіць SMS на <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="sms_home" msgid="7524332261493162995">"Тэкставае паведамленне на хатні тэлефон"</string>
+ <string name="sms_mobile" msgid="5200107250451030769">"Тэкставае паведамленне на мабільны тэлефон"</string>
+ <string name="sms_work" msgid="2269624156655267740">"Тэкставае паведамленне на працоўны тэлефон"</string>
+ <string name="sms_fax_work" msgid="8028189067816907075">"Тэкставае паведамленне на працоўны факс"</string>
+ <string name="sms_fax_home" msgid="9204042076306809634">"Тэкставае паведамленне на хатні факс"</string>
+ <string name="sms_pager" msgid="7730404569637015192">"Тэкставае паведамленне на пэйджар"</string>
+ <string name="sms_other" msgid="806127844607642331">"Тэкст"</string>
+ <string name="sms_callback" msgid="5004824430094288752">"Тэкст на нумар зваротнага выкліку"</string>
+ <string name="sms_car" msgid="7444227058437359641">"Тэкставае паведамленне ў аўтамабіль"</string>
+ <string name="sms_company_main" msgid="118970873419678087">"Паведамленне на асноўны нумар кампаніі"</string>
+ <string name="sms_isdn" msgid="8153785037515047845">"Тэкст ISDN"</string>
+ <string name="sms_main" msgid="8621625784504541679">"Паведамленне на асноўны нумар"</string>
+ <string name="sms_other_fax" msgid="3888842199855843152">"Тэкставае паведамленне на факс"</string>
+ <string name="sms_radio" msgid="3329166673433967820">"Тэкставае паведамленее на радыётэлефон"</string>
+ <string name="sms_telex" msgid="9034802430065267848">"Тэкставае паведамленне на тэлекс"</string>
+ <string name="sms_tty_tdd" msgid="6782284969132531532">"Тэкставае паведамленне на TTY/TDD"</string>
+ <string name="sms_work_mobile" msgid="2459939960512702560">"Тэкставае паведамленне на працоўны мабільны тэлефон"</string>
+ <string name="sms_work_pager" msgid="5566924423316960597">"Тэкставае паведамленне на працоўны пэйджар"</string>
+ <string name="sms_assistant" msgid="2773424339923116234">"Напiсаць тэкставае паведамленне: <xliff:g id="ASSISTANT">%s</xliff:g>"</string>
+ <string name="sms_mms" msgid="4069352461380762677">"Паведамленне MMS"</string>
+ <string name="sms_by_shortcut" msgid="7741770672976099517">"<xliff:g id="CONTACT_NAME">%s</xliff:g> (Паведамленне)"</string>
+ <string name="description_video_call" msgid="7120921378651700947">"Зрабіць відэавыклік"</string>
+ <string name="clearFrequentsConfirmation_title" msgid="766292372438450432">"Выдалiць частыя кантакты?"</string>
+ <string name="clearFrequentsConfirmation" msgid="2270554975938265734">"Спіс найчасцей ужываных кантактаў праграм \"Кантакты\" i \"Тэлефон\" ачысціцца, а параметры адрасацыі паштовых праграм абнуляцца."</string>
+ <string name="clearFrequentsProgress_title" msgid="5157001637482794212">"Выдаленне частых кантактаў..."</string>
+ <string name="status_available" msgid="5586870015822828392">"Даступны"</string>
+ <string name="status_away" msgid="1838861100379804730">"Адсутнічае"</string>
+ <string name="status_busy" msgid="9147992455450257136">"Заняты"</string>
+ <string name="local_invisible_directory" msgid="6046691709127661065">"Іншае"</string>
+ <string name="directory_search_label" msgid="1887759056597975053">"Дырэкторыя"</string>
+ <string name="directory_search_label_work" msgid="8618292129829443176">"Працоўны каталог"</string>
+ <string name="local_search_label" msgid="2551177578246113614">"Усе кантакты"</string>
+ <string name="foundTooManyContacts" msgid="5163335650920020220">"Знойдзена вынікаў: больш за <xliff:g id="COUNT">%d</xliff:g>."</string>
+ <string name="description_quick_contact_for" msgid="6737516415168327789">"Хуткі кантакт для карыстальніка <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="missing_name" msgid="8745511583852904385">"(Без назвы)"</string>
+ <string name="favoritesFrequentContacted" msgid="6184232487472425690">"Частая сувязь"</string>
+ <string name="description_view_contact_detail" msgid="9133251213656414807">"Прагледзець кантакт"</string>
+ <string name="list_filter_phones" msgid="735313795643493365">"Усе кантакты з нумарамі тэлефонаў"</string>
+ <string name="list_filter_phones_work" msgid="1470173699551475015">"Кантакты працоўнага профілю"</string>
+ <string name="view_updates_from_group" msgid="1782685984905600034">"Прагл. абнаўленняў"</string>
+ <string name="account_phone" msgid="7128032778471187553">"Прылада"</string>
+ <string name="account_sim" msgid="6519016427905087952">"SIM"</string>
+ <string name="nameLabelsGroup" msgid="2034640839640477827">"Імя"</string>
+ <string name="nicknameLabelsGroup" msgid="2891682101053358010">"Псеўданiм"</string>
+ <string name="full_name" msgid="6602579550613988977">"Iмя"</string>
+ <string name="name_given" msgid="4280790853455320619">"Імя"</string>
+ <string name="name_family" msgid="7466985689626017037">"Прозвішча"</string>
+ <string name="name_prefix" msgid="59756378548779822">"Прэфікс імені"</string>
+ <string name="name_middle" msgid="8467433655992690326">"Імя па бацьку"</string>
+ <string name="name_suffix" msgid="3855278445375651441">"Суфікс да імені"</string>
+ <string name="name_phonetic" msgid="4259595234312430484">"Фанетычны запіс імя"</string>
+ <string name="name_phonetic_given" msgid="8723179018384187631">"Вымаўленне імя"</string>
+ <string name="name_phonetic_middle" msgid="8643721493320405200">"Фанетычны запіс імя па бацьку"</string>
+ <string name="name_phonetic_family" msgid="2640133663656011626">"Вымаўленне прозвішча"</string>
+ <string name="phoneLabelsGroup" msgid="6468091477851199285">"Тэлефон"</string>
+ <string name="emailLabelsGroup" msgid="8389931313045344406">"Электронная пошта"</string>
+ <string name="postalLabelsGroup" msgid="3487738141112589324">"Адрас"</string>
+ <string name="imLabelsGroup" msgid="3898238486262614027">"ІМ"</string>
+ <string name="organizationLabelsGroup" msgid="2478611760751832035">"Арганізацыя"</string>
+ <string name="relationLabelsGroup" msgid="1854373894284572781">"Сувязі"</string>
+ <string name="eventLabelsGroup" msgid="7960408705307831289">"Асаблівая дата"</string>
+ <string name="sms" msgid="1756857139634224222">"Тэкставае паведамленне"</string>
+ <string name="postal_address" msgid="8765560217149624536">"Адрас"</string>
+ <string name="ghostData_company" msgid="5414421120553765775">"Кампанія"</string>
+ <string name="ghostData_title" msgid="7496735200318496110">"Назва"</string>
+ <string name="label_notes" msgid="8337354953278341042">"Нататкі"</string>
+ <string name="label_custom_field" msgid="1994056912242214426">"Карыстальніцкі"</string>
+ <string name="label_sip_address" msgid="7252153678613978127">"SIP"</string>
+ <string name="websiteLabelsGroup" msgid="4202998982804009261">"Вэб-старонка"</string>
+ <string name="groupsLabel" msgid="7000816729542098972">"Меткі"</string>
+ <string name="email_home" msgid="8573740658148184279">"Паведамленне на хатні адрас электроннай пошты"</string>
+ <string name="email_mobile" msgid="2042889209787989814">"Адправіць электронную пошту на мабільны адрас"</string>
+ <string name="email_work" msgid="2807430017302722689">"Паведамленне на працоўную электронную пошту"</string>
+ <string name="email_other" msgid="3454004077967657109">"Электронная пошта"</string>
+ <string name="email_custom" msgid="5536404237099078802">"Адправіць ліст на адрас <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="email" msgid="5668400997660065897">"Электронная пошта"</string>
+ <string name="postal_street" msgid="8133143961580058972">"Вуліца"</string>
+ <string name="postal_pobox" msgid="4431938829180269821">"Паштовая скрыня"</string>
+ <string name="postal_neighborhood" msgid="1450783874558956739">"Наваколле"</string>
+ <string name="postal_city" msgid="6597491300084895548">"Горад"</string>
+ <string name="postal_region" msgid="6045263193478437672">"Штат"</string>
+ <string name="postal_postcode" msgid="572136414136673751">"Паштовы індэкс"</string>
+ <string name="postal_country" msgid="7638264508416368690">"Краіна"</string>
+ <string name="map_home" msgid="1243547733423343982">"Прагледзець хатні адрас"</string>
+ <string name="map_work" msgid="1360474076921878088">"Паглядзець працоўны адрас"</string>
+ <string name="map_other" msgid="3817820803587012641">"Прагледзець адрас"</string>
+ <string name="map_custom" msgid="8761800628069473526">"Паглядзець адрас <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="chat_aim" msgid="2588492205291249142">"Чат у AIM"</string>
+ <string name="chat_msn" msgid="8041633440091073484">"Чат у Windows Live"</string>
+ <string name="chat_yahoo" msgid="6629211142719943666">"Чат праз Yahoo"</string>
+ <string name="chat_skype" msgid="1210045020427480566">"Чат у Skype"</string>
+ <string name="chat_qq" msgid="4294637812847719693">"Чат у QQ"</string>
+ <string name="chat_gtalk" msgid="981575737258117697">"Чат у Google Talk"</string>
+ <string name="chat_icq" msgid="8438405386153745775">"Чат праз ICQ"</string>
+ <string name="chat_jabber" msgid="7561444230307829609">"Чат у Jabber"</string>
+ <string name="chat" msgid="9025361898797412245">"Чат"</string>
+ <string name="description_minus_button" msgid="6908099247930477551">"выдаліць"</string>
+ <string name="expand_name_fields_description" msgid="6883935911480726652">"Разгарнуць палі імён"</string>
+ <string name="collapse_name_fields_description" msgid="4757877385895561556">"Згарнуць палі імён"</string>
+ <string name="expand_phonetic_name_fields_description" msgid="3865726859582581741">"Разгарнуць палі вымаўлення імён"</string>
+ <string name="collapse_phonetic_name_fields_description" msgid="9102249481855019452">"Згарнуць палі вымаўлення імён"</string>
+ <string name="expand_fields_description" msgid="8129294181216760037">"Разгарнуць"</string>
+ <string name="collapse_fields_description" msgid="1884143625854637874">"Згарнуць"</string>
+ <string name="announce_expanded_fields" msgid="1075947220478530622">"Разгорнута"</string>
+ <string name="announce_collapsed_fields" msgid="6414231530177338704">"Згорнута"</string>
+ <string name="list_filter_all_accounts" msgid="8908683398914322369">"Усе кантакты"</string>
+ <string name="list_filter_all_starred" msgid="5031734941601931356">"Пазначана"</string>
+ <string name="list_filter_customize" msgid="4789963356004169321">"Карыстальнiцкi"</string>
+ <string name="list_filter_single" msgid="5871400283515893087">"Кантакт"</string>
+ <string name="display_ungrouped" msgid="6885954210243119591">"Усе кантакты з тэчкі \"Іншыя\""</string>
+ <string name="display_all_contacts" msgid="2031647544742889505">"Усе кантакты"</string>
+ <string name="menu_sync_remove" msgid="3266725887008450161">"Выдаліць групу сінхранізацыі"</string>
+ <string name="dialog_sync_add" msgid="8267045393119375803">"Дадаць групу сінхранізацыі"</string>
+ <string name="display_more_groups" msgid="2682547080423434170">"Больш груп..."</string>
+ <string name="display_warn_remove_ungrouped" msgid="8872290721676651414">"Выдаленне групы \"<xliff:g id="GROUP">%s</xliff:g>\" з сінхранізацыі таксама выдаліць любыя разгрупаваныя кантакты з сінхранізацыі."</string>
+ <string name="savingDisplayGroups" msgid="2133152192716475939">"Захаванне параметраў адлюстравання..."</string>
+ <string name="menu_done" msgid="796017761764190697">"Зроблена"</string>
+ <string name="menu_doNotSave" msgid="58593876893538465">"Адмена"</string>
+ <string name="listCustomView" msgid="1840624396582117590">"Карыстальніцкі выгляд"</string>
+ <string name="dialog_new_contact_account" msgid="4969619718062454756">"Захаваць імпартаваныя кантакты ў:"</string>
+ <string name="import_from_sim" msgid="3859272228033941659">"Імпарт з SIM-карты"</string>
+ <string name="import_from_sim_summary" msgid="5815105584445743740">"Імпартаваць з SIM-карты <xliff:g id="SIM_NAME">^1</xliff:g> – <xliff:g id="SIM_NUMBER">^2</xliff:g>"</string>
+ <string name="import_from_sim_summary_no_number" msgid="880612418352086012">"Імпартаваць з SIM-карты <xliff:g id="SIM_NAME">%1$s</xliff:g>"</string>
+ <string name="import_from_vcf_file" product="default" msgid="5304572242183878086">"Імпартаваць з файла .vcf"</string>
+ <string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Адмянiць iмпарт файла <xliff:g id="FILENAME">%s</xliff:g>?"</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="fail_reason_unknown" msgid="1714092345030570863">"Невядомая памылка."</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="fail_reason_could_not_initialize_exporter" msgid="707260459259688510">"Не атрымалася запусцiць экспарцёр: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\"."</string>
+ <string name="fail_reason_no_exportable_contact" msgid="8728506011371262065">"Няма кантактаў для экспарту."</string>
+ <string name="missing_required_permission" msgid="5865884842972833120">"Вы адключылі дазвол, які патрабуецца."</string>
+ <string name="fail_reason_error_occurred_during_export" msgid="3018855323913649063">"Памылка экспарту: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\"."</string>
+ <string name="fail_reason_too_long_filename" msgid="3393764245254738333">"Патрабаванае імя файла (\"<xliff:g id="FILENAME">%s</xliff:g>\") занадта доўгае."</string>
+ <string name="fail_reason_io_error" msgid="6748358842976073255">"Памылка ўводу/вываду"</string>
+ <string name="fail_reason_low_memory_during_import" msgid="875222757734882898">"Недастаткова памяці (магчыма, занадта вялікі файл)"</string>
+ <string name="fail_reason_vcard_parse_error" msgid="888263542360355784">"Немагчыма разабраць файл vCard па нечаканай прычыне."</string>
+ <string name="fail_reason_not_supported" msgid="8219562769267148825">"Фармат не падтрымліваецца."</string>
+ <string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="6427931733267328564">"Немагчыма сабраць мета-інфармацыю з гэтых файлаў vCard."</string>
+ <string name="fail_reason_failed_to_read_files" msgid="5823434810622484922">"Адзін або некалькі файлаў не могуць быць імпартаваныя (%s)."</string>
+ <string name="exporting_vcard_finished_title" msgid="4767045779458185251">"Экспарт файла <xliff:g id="FILENAME">%s</xliff:g> завершаны."</string>
+ <string name="exporting_vcard_finished_title_fallback" msgid="6060472638008218274">"Экспартаванне кантактаў завершана."</string>
+ <string name="exporting_vcard_finished_toast" msgid="1739055986856453882">"Экспартаванне кантактаў завершана, націсніце на апавяшчэнне, каб абагуліць кантакты."</string>
+ <string name="touch_to_share_contacts" msgid="4882485525268469736">"Дакраніцеся, каб абагуліць кантакты."</string>
+ <string name="exporting_vcard_canceled_title" msgid="2652222370493306887">"Экспарт файла <xliff:g id="FILENAME">%s</xliff:g> адменены."</string>
+ <string name="exporting_contact_list_title" msgid="9072240631534457415">"Экспарт дадзеных кантакту"</string>
+ <string name="exporting_contact_list_message" msgid="3367949209642931952">"Кантактныя даныя экспартуюцца."</string>
+ <string name="composer_failed_to_get_database_infomation" msgid="1765944280846236723">"Немагчыма атрымаць інфармацыю з базы дадзеных."</string>
+ <string name="composer_has_no_exportable_contact" msgid="3296493229040294335">"Няма кантактаў, якiя можна экспартаваць. Калi ў вашым тэлефоне няма кантактаў, некаторыя пастаўшчыкi дадзеных могуць забараняць экспарт кантактаў з тэлефона."</string>
+ <string name="composer_not_initialized" msgid="2321648986367005254">"Памылка запуску складальнiка файлаў vCard."</string>
+ <string name="exporting_contact_failed_title" msgid="4892358112409576342">"Не атрымалася экспартаваць"</string>
+ <string name="exporting_contact_failed_message" msgid="4938527850142003141">"Памылка экспарта кантактных дадзеных. \nПрычына: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
+ <string name="importing_vcard_description" msgid="4245275224298571351">"Імпарт <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="reading_vcard_failed_title" msgid="4251647443358422855">"Немагчыма прачытаць дадзеныя vCard"</string>
+ <string name="reading_vcard_canceled_title" msgid="1925216585981542019">"Чытанне дадзеных з vCard адменена"</string>
+ <string name="importing_vcard_finished_title" msgid="3341541727268747967">"Заканчэнне імпартавання vCard <xliff:g id="FILENAME">%s</xliff:g>"</string>
+ <string name="importing_vcard_canceled_title" msgid="2147475978165599336">"Імпарт файла <xliff:g id="FILENAME">%s</xliff:g> адменены"</string>
+ <string name="vcard_import_will_start_message" msgid="2804911199145873396">"Файл <xliff:g id="FILENAME">%s</xliff:g> будзе імпартаваны ў бліжэйшы час."</string>
+ <string name="vcard_import_will_start_message_with_default_name" msgid="1022969530654129470">"Файл будзе імпартаваны ў бліжэйшы час."</string>
+ <string name="vcard_import_request_rejected_message" msgid="2890471184508516011">"Запыт экспарту vCard адхілены. Паспрабуйце пазней."</string>
+ <string name="vcard_export_will_start_message" msgid="2210241345252081463">"Файл <xliff:g id="FILENAME">%s</xliff:g> будзе экспартаваны ў бліжэйшы час."</string>
+ <string name="vcard_export_will_start_message_fallback" msgid="6553826997490909749">"Неўзабаве файл будзе экспартаваны."</string>
+ <string name="contacts_export_will_start_message" msgid="8538705791417534431">"Неўзабаве кантакты будуць экспартаваны."</string>
+ <string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Запыт экспарту vCard адхілены. Паспрабуйце пазней."</string>
+ <string name="vcard_unknown_filename" msgid="7171709890959915954">"кантакт"</string>
+ <string name="caching_vcard_message" msgid="4926308675041506756">"Кэшуе файлы vCard у лакальнае часовае сховішча. Фактычны імпарт пачнецца ў бліжэйшы час."</string>
+ <string name="vcard_import_failed" msgid="5223531255894842406">"Немагчыма імпартаваць vCard."</string>
+ <string name="nfc_vcard_file_name" msgid="2823095213265993609">"Кант. атр. праз NFC"</string>
+ <string name="confirm_export_title" msgid="6834385377255286349">"Экспартаваць кантакты?"</string>
+ <string name="caching_vcard_title" msgid="1226272312940516605">"Кэшаванне..."</string>
+ <string name="progress_notifier_message" msgid="2311011466908220528">"Імпарт <xliff:g id="CURRENT_NUMBER">%s</xliff:g>/<xliff:g id="TOTAL_NUMBER">%s</xliff:g>: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="export_to_vcf_file" product="default" msgid="4407527157056120858">"Экспартаваць у файл .vcf"</string>
+ <string name="display_options_sort_list_by" msgid="7028809117272018712">"Сартаваць па"</string>
+ <string name="display_options_sort_by_given_name" msgid="2778421332815687873">"Імя"</string>
+ <string name="display_options_sort_by_family_name" msgid="2684905041926954793">"Прозвішча"</string>
+ <string name="display_options_view_names_as" msgid="6514632499276563482">"Фармат імя"</string>
+ <string name="display_options_view_given_name_first" msgid="3616004640258761473">"Спачатку імя"</string>
+ <string name="display_options_view_family_name_first" msgid="956445100777296467">"Спачатку прозвішча"</string>
+ <string name="settings_accounts" msgid="350219740670774576">"Уліковыя запісы"</string>
+ <string name="default_editor_account" msgid="699591683362420991">"Стандартны ўліковы запіс для новых кантактаў"</string>
+ <string name="sync_contact_metadata_title" msgid="6957956139306960211">"Сінхранізаваць метаданыя кантактаў [DOGFOOD]"</string>
+ <string name="sync_contact_metadata_dialog_title" msgid="6192335951588820553">"Сінхранізаваць метаданыя кантактаў"</string>
+ <string name="settings_my_info_title" msgid="1534272456405343119">"Мая інфармацыя"</string>
+ <string name="set_up_profile" msgid="7370213843590143771">"Наладзьце ваш профіль"</string>
+ <string name="setting_about" msgid="7014388749752042863">"Інфармацыя аб Кантактах"</string>
+ <string name="share_visible_contacts" msgid="890150378880783797">"Адкрыць бачныя кантакты"</string>
+ <string name="share_visible_contacts_failure" msgid="7324717548166915560">"Збой абагульвання бачных кантактаў."</string>
+ <string name="share_favorite_contacts" msgid="4280926751003081042">"Абагуліць улюбёныя кантакты"</string>
+ <string name="share_contacts" msgid="8109287987498711664">"Абагуліць усе кантакты"</string>
+ <string name="share_contacts_failure" msgid="1216431977330560559">"Збой абагульвання кантактаў."</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Экспартаваць кантакты"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Імпартаваць кантакты"</string>
+ <string name="share_error" msgid="948429331673358107">"Нельга падзялiцца гэтым кантактам."</string>
+ <string name="no_contact_to_share" msgid="1276397530378323033">"Няма кантактаў, якія можна абагуліць."</string>
+ <string name="menu_search" msgid="9147752853603483719">"Пошук"</string>
+ <string name="menu_contacts_filter" msgid="2165153460860262501">"Паказаць кантакты"</string>
+ <string name="activity_title_contacts_filter" msgid="8275542497615516969">"Кантакты для адлюстр."</string>
+ <string name="custom_list_filter" msgid="2105275443109077687">"Вызначыце карыстальніцкі выгляд"</string>
+ <string name="menu_custom_filter_save" msgid="2679793632208086460">"Захаваць"</string>
+ <string name="hint_findContacts" msgid="7128627979899070325">"Шукаць у кантактах"</string>
+ <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Выбранае"</string>
+ <string name="listTotalAllContactsZero" msgid="5513001821794568211">"Няма кантактаў."</string>
+ <string name="menu_clear_frequents" msgid="7688250191932838833">"Выдалiць частыя кантакты"</string>
+ <string name="menu_select_sim" msgid="3603578201960504010">"Выбраць SIM-карту"</string>
+ <string name="menu_accounts" msgid="1424330057450189074">"Кіраваць уліковымі запісамі"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Імпартаваць"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Экспартаваць"</string>
+ <string name="menu_blocked_numbers" msgid="5272951629083025995">"Заблакіраваныя нумары"</string>
+ <string name="contact_status_update_attribution" msgid="752179367353018597">"праз <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
+ <string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> праз <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
+ <string name="action_menu_back_from_search" msgid="8793348588949233348">"спыніць пошук"</string>
+ <string name="description_clear_search" msgid="688023606766232904">"Ачысціць пошук"</string>
+ <string name="settings_contact_display_options_title" msgid="4890258244494248687">"Параметры адлюстравання кантактаў"</string>
+ <string name="select_account_dialog_title" msgid="5478489655696599219">"Уліковы запіс"</string>
+ <string name="set_default_account" msgid="4311613760725609801">"Заўсёды ўжываць гэта для выклікаў"</string>
+ <string name="select_phone_account_for_calls" msgid="3810607744451014540">"Выклікаць праз"</string>
+ <string name="call_with_a_note" msgid="8389827628360791676">"Выклікаць з нататкай"</string>
+ <string name="call_subject_hint" msgid="3043028982108363572">"Увесці нататку для адпраўкі з выклікам…"</string>
+ <string name="send_and_call_button" msgid="7740295432834590737">"АДПРАВІЦЬ І ВЫКЛІКАЦЬ"</string>
+ <string name="call_subject_limit" msgid="4545212901205397669">"<xliff:g id="COUNT">%1$s</xliff:g> / <xliff:g id="LIMIT">%2$s</xliff:g>"</string>
+ <string name="call_subject_type_and_number" msgid="7667188212129152558">"<xliff:g id="TYPE">%1$s</xliff:g> • <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <plurals name="tab_title_with_unread_items" formatted="false" msgid="7682024005130747825">
+ <item quantity="one"> <xliff:g id="TITLE_2">%1$s</xliff:g>. <xliff:g id="COUNT_3">%2$d</xliff:g> непрачытаны элемент. </item>
+ <item quantity="few"> <xliff:g id="TITLE_2">%1$s</xliff:g>. <xliff:g id="COUNT_3">%2$d</xliff:g> непрачытаныя элементы. </item>
+ <item quantity="many"> <xliff:g id="TITLE_2">%1$s</xliff:g>. <xliff:g id="COUNT_3">%2$d</xliff:g> непрачытаных элементаў. </item>
+ <item quantity="other"> <xliff:g id="TITLE_2">%1$s</xliff:g>. <xliff:g id="COUNT_3">%2$d</xliff:g> непрачытанага элемента. </item>
+ </plurals>
+ <string name="about_build_version" msgid="1765533099416999801">"Версія зборкі"</string>
+ <string name="about_open_source_licenses" msgid="6479990452352919641">"Ліцэнзіі на ПЗ з адкрытым зыходным кодам"</string>
+ <string name="about_open_source_licenses_summary" msgid="57418386931763994">"Звесткі аб ліцэнзіі на праграмнае забеспячэнне з адкрытым зыходным кодам"</string>
+ <string name="about_privacy_policy" msgid="3705518622499152626">"Палітыка прыватнасці"</string>
+ <string name="about_terms_of_service" msgid="4642400812150296723">"Умовы абслугоўвання"</string>
+ <string name="activity_title_licenses" msgid="5467767062737708066">"Ліцэнзіі на ПЗ з адкрытым зыходным кодам"</string>
+ <string name="url_open_error_toast" msgid="452592089815420457">"Збой адкрыцця URL-адраса."</string>
+ <string name="account_filter_view_checked" msgid="6696859503887762213">"<xliff:g id="ACCOUNT_INFO">%s</xliff:g> - пазначана"</string>
+ <string name="account_filter_view_not_checked" msgid="2248684521205038389">"<xliff:g id="ACCOUNT_INFO">%s</xliff:g> - не пазначана"</string>
+ <string name="description_search_video_call" msgid="5841525580339803272">"Пачаць відэавыклік"</string>
+ <string name="description_delete_contact" msgid="53835657343783663">"Выдаліць"</string>
+ <string name="description_no_name_header" msgid="8884991311595943271">"Шматкроп\'е"</string>
+ <string name="callDurationSecondFormat" msgid="7067644915903528776">"<xliff:g id="SECONDS">%s</xliff:g> c"</string>
+ <string name="callDurationMinuteFormat" msgid="4647095486747447674">"<xliff:g id="MINUTES">%s</xliff:g> хв <xliff:g id="SECONDS">%s</xliff:g> с"</string>
+ <string name="callDurationHourFormat" msgid="7392254193808506640">"<xliff:g id="MINUTES_0">%s</xliff:g> гадз <xliff:g id="MINUTES_1">%s</xliff:g> хв <xliff:g id="SECONDS">%s</xliff:g> с"</string>
+ <string name="dynamic_shortcut_disabled_message" msgid="249939425761315252">"Гэта спалучэнне клавіш было адключана"</string>
+ <string name="dynamic_shortcut_contact_removed_message" msgid="6845645831837615899">"Кантакт быў выдалены"</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index a35fed6..f41f959 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Предлагани контакти"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Всички контакти"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Контактите са свързани"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Изтрихте <xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Контактите са изтрити</item>
<item quantity="one">Контактът е изтрит</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Няма контакти с този етикет"</string>
<string name="emptyAccount" msgid="6873962901497975964">"В този профил няма контакти"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Списъкът ви с контакти е празен"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Запазихте <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Контактът е запазен"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Контактите са разделени"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Промените в контакта не можаха да бъдат запазени"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Повторно обаждане"</string>
<string name="returnCall" msgid="8171961914203617813">"Отговаряне на обаждане"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Да се добави ли „<xliff:g id="EMAIL">%s</xliff:g>“ към контакти?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"снимка на контакта"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</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="search_settings_description" msgid="2675223022992445813">"Имена на контактите ви"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Дата"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Етикет"</string>
<string name="change_photo" msgid="8530597935483526383">"Промяна"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Основна снимка"</string>
<string name="description_star" msgid="2605854427360036550">"любимо"</string>
<string name="edit_contact" msgid="7529281274005689512">"Редактиране на контакта"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"затваряне"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Име"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Имейл"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Телефон"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Снимка"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Кликнете за разгъване на редактора за контакти."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Кликнете за свиване на редактора за контакти."</string>
<string name="content_description_directions" msgid="2686791825798189335">"упътвания до местоположението"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Скорошно обаждане (<xliff:g id="CALL_TYPE">%s</xliff:g>) от <xliff:g id="PHONE_NUMBER">%s</xliff:g> на <xliff:g id="DATE">%s</xliff:g>. Кликнете за обратно обаждане"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Вие: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts работи по-добре, когато въведете съответния идентификатор на човека в полето за имейл или телефон."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Още полета"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Промяна на снимката"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Отварянето на редактора не бе успешно."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Запазване във:"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Понастоящем се запазва в профила <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Докоснете двукратно, за да изберете друг."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Още полета"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Промяна на снимката"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Отварянето на редактора не бе успешно."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Запазва се във:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Преглежда се"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Понастоящем се запазва в профила <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Докоснете двукратно, за да изберете друг."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Свързани контакти (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Свързан контакт</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Този контакт"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Възможни дубликати"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Тези контакти може да са един и същи човек. Можете да ги свържете в един."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Свързани контакти"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Свързани контакти"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"От профилите ви"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Правене на снимка"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Всички снимки"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Избиране на снимка"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"От <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Изтриване на <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Споделяне на любимите контакти"</string>
<string name="share_contacts" msgid="8109287987498711664">"Споделяне на всички контакти"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Споделянето на контактите не бе успешно."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Импортиране/Експортиране на контакти"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Експортиране на контакти"</string>
<string name="dialog_import" msgid="2431698729761448759">"Импортиране на контактите"</string>
<string name="share_error" msgid="948429331673358107">"Този контакт не може да бъде споделен."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Няма контакти за споделяне."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Изчистване на често търсените"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Избиране на SIM карта"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Управление на профилите"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Импортиране/Експортиране"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Импортиране"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Експортиране"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Блокирани номера"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"чрез <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> чрез <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index dc76fc0..08a44b0 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"প্রস্তাবিত পরিচিতিগুলি"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"সকল পরিচিতি"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"পরিচিতিগুলি লিঙ্ক করা হয়েছে"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g>কে মোছা হয়েছে"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">পরিচিতিগুলি মোছা হয়েছে</item>
<item quantity="other">পরিচিতিগুলি মোছা হয়েছে</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"এই লেবেলে কোনো পরিচিতি নেই"</string>
<string name="emptyAccount" msgid="6873962901497975964">"এই অ্যাকাউন্টে কোনো পরিচিতি নেই"</string>
<string name="emptyMainList" msgid="2772242747899664460">"আপনার পরিচিতির তালিকা খালি"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> সংরক্ষণ করা হয়েছে"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"পরিচিতি সংরক্ষণ করা হয়েছে"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"পরিচিতিগুলি লিঙ্কমুক্ত করা হয়েছে"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"পরিচিতিতে করা পরিবর্তনগুলি সংরক্ষণ করা গেল না"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"আবার কল করুন"</string>
<string name="returnCall" msgid="8171961914203617813">"মিস হয়ে যওয়া নম্বরে পুনরায় কল করুন"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"পরিচিতিগুলিতে <xliff:g id="EMAIL">%s</xliff:g> যোগ করবেন?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"পরিচিতির ফটো"</string>
<string name="description_plus_button" msgid="515164827856229880">"যোগ চিহ্ন"</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="search_settings_description" msgid="2675223022992445813">"আপনার পরিচিতিগুলির নামগুলি"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"তারিখ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"লেবেল"</string>
<string name="change_photo" msgid="8530597935483526383">"পরিবর্তন"</string>
- <string name="primary_photo" msgid="8517942231868516999">"প্রাথমিক ফটো"</string>
<string name="description_star" msgid="2605854427360036550">"পছন্দসই"</string>
<string name="edit_contact" msgid="7529281274005689512">"পরিচিতি সম্পাদনা করুন"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"বন্ধ করুন"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"নাম"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ইমেল"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ফোন"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ফটো"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"পরিচিতি সম্পাদক প্রসারিত করতে ক্লিক করুন৷"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"পরিচিতি সম্পাদক সঙ্কুচিত করতে ক্লিক করুন৷"</string>
<string name="content_description_directions" msgid="2686791825798189335">"অবস্থান জানার দিকনির্দেশ"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"সাম্প্রতিক কল৷ <xliff:g id="CALL_TYPE">%s</xliff:g>৷ <xliff:g id="PHONE_NUMBER">%s</xliff:g>৷ <xliff:g id="DATE">%s</xliff:g>৷ ঘুরিয়ে কল করতে ক্লিক করুন"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"আপনি: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"আপনি যখন ইমেল বা ফোন নম্বর লেখার ক্ষেত্রটিতে ব্যক্তির Hangouts সনাক্তকারী লেখেন তখন Hangouts আরো ভালো কাজ করে৷"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"আরো ফিল্ড"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ফটো পরিবর্তন করুন"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"সম্পাদক খুলতে ব্যর্থ হচ্ছে৷"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"এতে সংরক্ষণ করা হচ্ছে"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"বর্তমানে <xliff:g id="ACCOUNT_NAME">%s</xliff:g> এ সংরক্ষণ করা হচ্ছে৷ কোনো আলাদা অ্যাকাউন্ট চয়ন করার জন্য দুবার আলতো চপুন৷"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"আরো ফিল্ড"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ফটো পরিবর্তন করুন"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"সম্পাদক খুলতে ব্যর্থ হচ্ছে৷"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"এতে সংরক্ষণ করা হচ্ছে"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"দেখা হচ্ছে"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"বর্তমানে <xliff:g id="ACCOUNT_NAME">%s</xliff:g> এ সংরক্ষণ করা হচ্ছে৷ কোনো আলাদা অ্যাকাউন্ট চয়ন করার জন্য দুবার আলতো চপুন৷"</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">লিঙ্ক করা পরিচিতিগুলি (<xliff:g id="COUNT">%d</xliff:g>টি)</item>
<item quantity="other">লিঙ্ক করা পরিচিতিগুলি (<xliff:g id="COUNT">%d</xliff:g>টি)</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"এই পরিচিতি"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"সম্ভাব্য সদৃশগুলি"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"এই পরিচিতিগুলি একই ব্যক্তির হতে পারে৷ আপনি সেগুলিকে একটি একক পরিচিতি হিসাবে লিঙ্ক করতে পারবেন৷"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"লিঙ্ক করা পরিচিতিগুলি"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"লিঙ্ক করা পরিচিতিগুলি"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"আপনার অ্যাকাউন্টগুলি থেকে"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"একটি ফটো তুলুন"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"সকল ফটো"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ফটো বেছে নিন"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> থেকে"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> মুছুন"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"পছন্দসই পরিচিতিগুলি শেয়ার করুন"</string>
<string name="share_contacts" msgid="8109287987498711664">"সকল পরিচিতি শেয়ার করুন"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"পরিচিতিগুলিকে শেয়ার করতে ব্যর্থ হয়েছে৷"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"পরিচিতিগুলি আমদানি/রপ্তানি করুন"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"পরিচিতিগুলি রপ্তানি করুন"</string>
<string name="dialog_import" msgid="2431698729761448759">"পরিচিতিগুলি আমদানি করুন"</string>
<string name="share_error" msgid="948429331673358107">"এই পরিচিতিটিকে শেয়ার করা যাবে না৷"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"শেয়ার করার জন্য কোনো পরিচিতি নেই৷"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"পুনরাবৃত্তি সাফ করুন"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"সিম কার্ড নির্বাচন করুন"</string>
<string name="menu_accounts" msgid="1424330057450189074">"অ্যাকাউন্টগুলি পরিচালনা করুন"</string>
- <string name="menu_import_export" msgid="26217871113229507">"আমদানি/রপ্তানি"</string>
+ <string name="menu_import" msgid="6107961135813836467">"আমদানি করুন"</string>
+ <string name="menu_export" msgid="2658783911863503902">"রপ্তানি করুন"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"অবরোধ করা নম্বরগুলি"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> এর মাধ্যমে"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> এর মাধ্যমে <xliff:g id="DATE">%1$s</xliff:g>"</string>
diff --git a/res/values-bs-rBA-sw600dp/strings.xml b/res/values-bs-rBA-sw600dp/strings.xml
new file mode 100644
index 0000000..6b0ac29
--- /dev/null
+++ b/res/values-bs-rBA-sw600dp/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="account_phone" msgid="347665663520819575">"Uređaj"</string>
+ <string name="composer_has_no_exportable_contact" msgid="5998889616701036804">"Nema kontakata koji se mogu izvoziti. Ako imate kontakte na tabletu, neki dobavljači podataka možda ne dozvoljavaju izvoz kontakata s tableta."</string>
+</resources>
diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml
index 67f5166..6667bb3 100644
--- a/res/values-bs-rBA/strings.xml
+++ b/res/values-bs-rBA/strings.xml
@@ -17,9 +17,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="3906689777043645443">"Kontakti"</string>
- <string name="launcherActivityLabel" msgid="6497230399032392417">"Kontakti"</string>
- <string name="quickContactActivityLabel" msgid="7985456650689347268">"Prikaži kontakt"</string>
- <string name="editContactActivityLabel" msgid="1129944572070802839">"Uredi kontakt"</string>
<string name="contactsList" msgid="8661624236494819731">"Kontakti"</string>
<string name="shortcutContact" msgid="749243779392912958">"Kontakt"</string>
<string name="shortcutDialContact" msgid="746622101599186779">"Direktno biranje"</string>
@@ -31,12 +28,7 @@
<string name="contactPickerActivityTitle" msgid="4301062192337417640">"Izaberi kontakt"</string>
<string name="groupMemberPickerActivityTitle" msgid="1431750793695262522">"Odaberi"</string>
<string name="header_entry_contact_list_adapter_header_title" msgid="2436981165830115659">"Napravi novi kontakt"</string>
- <string name="starredList" msgid="4817256136413959463">"Označeno zvijezdom"</string>
- <string name="frequentList" msgid="7154768136473953056">"Često kontaktirani"</string>
- <string name="strequentList" msgid="5640192862059373511">"Favoriti"</string>
<string name="viewContactTitle" msgid="7989394521836644384">"Detalji o kontaktu"</string>
- <string name="editContactDescription" msgid="2947202828256214947">"Uredi kontakt"</string>
- <string name="insertContactDescription" msgid="4709878105452681987">"Napravi kontakt"</string>
<string name="contactDetailAbout" msgid="5430408883907061400">"O kontaktu"</string>
<string name="contactDetailUpdates" msgid="3780588624763446941">"Ažuriranja"</string>
<string name="searchHint" msgid="8482945356247760701">"Traži kontakte"</string>
@@ -52,7 +44,7 @@
<string name="menu_call" msgid="3992595586042260618">"Pozovi kontakt"</string>
<string name="menu_sendSMS" msgid="5535886767547006515">"Pošalji tekstualnu poruku kontaktu"</string>
<string name="menu_splitAggregate" msgid="2627252205317945563">"Razdvoji"</string>
- <string name="menu_editGroup" msgid="5062005185370983720">"Uredi"</string>
+ <string name="menu_editGroup" msgid="6696843438454341063">"Ukloni kontakte"</string>
<string name="menu_renameGroup" msgid="7169512355179757182">"Preimenuj oznaku"</string>
<string name="menu_deleteGroup" msgid="1126469629233412249">"Izbriši oznaku"</string>
<string name="menu_addToGroup" msgid="3267409983764370041">"Dodaj kontakt"</string>
@@ -75,15 +67,21 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Predloženi kontakti"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Svi kontakti"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontakti su povezani"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Kontakt <xliff:g id="NAME">%s</xliff:g> je izbrisan"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Kontakti su izbrisani</item>
<item quantity="few">Kontakti su izbrisani</item>
<item quantity="other">Kontakti su izbrisani</item>
</plurals>
- <plurals name="contacts_count" formatted="false" msgid="3287407967505649458">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> kontakt</item>
- <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> kontakta</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> kontakata</item>
+ <plurals name="contacts_count" formatted="false" msgid="8696793457340503668">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> kontakt</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> kontakta</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kontakata</item>
+ </plurals>
+ <plurals name="contacts_count_with_account" formatted="false" msgid="7402583111980220575">
+ <item quantity="one"><xliff:g id="COUNT_2">%d</xliff:g> kontakt · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="few"><xliff:g id="COUNT_2">%d</xliff:g> kontakta · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="other"><xliff:g id="COUNT_2">%d</xliff:g> kontakata · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
</plurals>
<string name="title_from_google" msgid="4664084747121207202">"Sa Googlea"</string>
<string name="title_from_other_accounts" msgid="8307885412426754288">"Sa računa <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
@@ -111,17 +109,20 @@
<string name="customLabelPickerTitle" msgid="1081475101983255212">"Prilagođeni naziv oznake"</string>
<string name="send_to_voicemail_checkbox" msgid="9001686764070676353">"Pošalji pozive direktno na govornu poštu"</string>
<string name="removePhoto" msgid="4898105274130284565">"Ukloni fotografiju"</string>
- <string name="noContacts" msgid="4955659076981974652">"Nema kontakata"</string>
+ <string name="noContacts" msgid="2228592924476426108">"Spisak kontakata je prazan"</string>
<string name="noGroups" msgid="4607906327968232225">"Nema oznaka."</string>
<string name="noAccounts" msgid="7768267764545265909">"Potreban vam je račun da napravite grupe."</string>
<string name="emptyGroup" msgid="5102411903247859575">"Nema kontakata s ovom oznakom"</string>
+ <string name="emptyAccount" msgid="6873962901497975964">"Nema kontakata na ovom računu"</string>
+ <string name="emptyMainList" msgid="2772242747899664460">"Spisak kontakata je prazan"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Kontakt <xliff:g id="DISPLAY_NAME">%s</xliff:g> je sačuvan"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt je sačuvan"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontakti su razdvojeni"</string>
- <string name="contactSavedErrorToast" msgid="3207250533172944892">"Nije moguće sačuvati promjene kontakta."</string>
- <string name="contactUnlinkErrorToast" msgid="2758070702785994171">"Nije moguće razdvojiti kontakt."</string>
- <string name="contactJoinErrorToast" msgid="3977932531264809035">"Nije moguće povezati kontakt."</string>
- <string name="contactGenericErrorToast" msgid="7774911165341591714">"Greška prilikom čuvanja kontakta."</string>
- <string name="contactPhotoSavedErrorToast" msgid="4079032272022979114">"Nije moguće sačuvati promjene fotografije kontakta."</string>
+ <string name="contactSavedErrorToast" msgid="4827033473908688031">"Nije moguće sačuvati promjene kontakta"</string>
+ <string name="contactUnlinkErrorToast" msgid="2706297508166952431">"Nije moguće razdvojiti kontakt"</string>
+ <string name="contactJoinErrorToast" msgid="5735129234573327701">"Nije moguće povezati kontakt"</string>
+ <string name="contactGenericErrorToast" msgid="3885457515665783976">"Greška prilikom spremanja kontakta"</string>
+ <string name="contactPhotoSavedErrorToast" msgid="6860883564984042194">"Nije moguće sačuvati promjene fotografije kontakta"</string>
<string name="groupLoadErrorToast" msgid="7536267148196064554">"Učitavanje oznake nije uspjelo"</string>
<string name="groupSavedToast" msgid="6491495462357722285">"Oznaka je sačuvana"</string>
<string name="groupDeletedToast" msgid="520896687873262027">"Oznaka je izbrisana"</string>
@@ -130,7 +131,8 @@
<string name="groupUpdatedToast" msgid="3667977658676267687">"Oznaka je ažurirana"</string>
<string name="groupMembersRemovedToast" msgid="3510563559799376603">"Uklonjeno iz oznake"</string>
<string name="groupMembersAddedToast" msgid="4824834898718972768">"Dodano oznaci"</string>
- <string name="groupSavedErrorToast" msgid="8121032018490980184">"Nije moguće sačuvati promjene oznake."</string>
+ <string name="groupSavedErrorToast" msgid="2355891714292740162">"Nije moguće sačuvati promjene oznake"</string>
+ <string name="groupExistsErrorMessage" msgid="5196811283836946189">"Ta oznaka već postoji"</string>
<plurals name="listTotalPhoneContacts" formatted="false" msgid="3692277679143308755">
<item quantity="one"><xliff:g id="COUNT">%d</xliff:g> kontakt s brojem telefona</item>
<item quantity="few"><xliff:g id="COUNT">%d</xliff:g> kontakta s brojevima telefona</item>
@@ -153,7 +155,6 @@
<string name="callAgain" msgid="3197312117049874778">"Pozovi ponovo"</string>
<string name="returnCall" msgid="8171961914203617813">"Uzvrati poziv"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Dodati \"<xliff:g id="EMAIL">%s</xliff:g>\" u kontakte?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"fotografija kontakta"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Imena kontakata"</string>
@@ -199,7 +200,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Datum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Oznaka"</string>
<string name="change_photo" msgid="8530597935483526383">"Promijeni"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Primarna fotografija"</string>
<string name="description_star" msgid="2605854427360036550">"favorit"</string>
<string name="edit_contact" msgid="7529281274005689512">"Uredi kontakt"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"zatvori"</string>
@@ -223,8 +223,7 @@
<string name="social_widget_loading" msgid="5327336597364074608">"Učitavanje…"</string>
<string name="contacts_unavailable_create_contact" msgid="7014525713871959208">"Napravi novi kontakt"</string>
<string name="contacts_unavailable_add_account" msgid="4347232421410561500">"Dodaj račun"</string>
- <string name="contacts_unavailable_import_contacts" msgid="4957393255392437529">"Uvezi kontakte"</string>
- <string name="create_group_dialog_title" msgid="5363404287877384473">"Napravi novu oznaku"</string>
+ <string name="contacts_unavailable_import_contacts" msgid="3182801738595937144">"Uvezi"</string>
<string name="create_group_item_label" msgid="3263064599743742865">"Napravi novu…"</string>
<string name="delete_group_dialog_message" msgid="335713829185261371">"Izbrisati oznaku \"<xliff:g id="GROUP_LABEL">%1$s</xliff:g>\"? (Kontakti neće biti izbrisani.)"</string>
<string name="toast_join_with_empty_contact" msgid="1215465657839085613">"Upišite ime kontakta prije povezivanja s drugim kontaktom."</string>
@@ -232,36 +231,33 @@
<string name="set_default" msgid="4417505153468300351">"Postavi zadano"</string>
<string name="clear_default" msgid="7193185801596678067">"Obriši zadano"</string>
<string name="toast_text_copied" msgid="5143776250008541719">"Tekst je kopiran"</string>
- <string name="cancel_confirmation_dialog_message" msgid="5058226498605989285">"Želite li odbaciti napravljene promjene i prekinuti uređivanje?"</string>
+ <string name="cancel_confirmation_dialog_message" msgid="9008214737653278989">"Odbaciti promjene?"</string>
<string name="cancel_confirmation_dialog_cancel_editing_button" msgid="3057023972074640671">"Odbaci"</string>
- <string name="cancel_confirmation_dialog_keep_editing_button" msgid="7737724111972855348">"Nastavi uređivanje"</string>
+ <string name="cancel_confirmation_dialog_keep_editing_button" msgid="3316573928085916146">"Otkaži"</string>
+ <string name="leave_customize_confirmation_dialog_message" msgid="4277114551206032979">"Odbaciti prilagođavanja?"</string>
<string name="call_type_and_date" msgid="747163730039311423">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="enter_contact_name" msgid="4594274696120278368">"Traži kontakte"</string>
- <!-- no translation found for title_edit_group (1889302367574226969) -->
- <skip />
+ <string name="title_edit_group" msgid="8602752287270586734">"Ukloni kontakte"</string>
<string name="local_profile_title" msgid="2021416826991393684">"Moj lokalni profil"</string>
<string name="external_profile_title" msgid="8034998767621359438">"Moj profil <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g>"</string>
<string name="toast_displaying_all_contacts" msgid="2737388783898593875">"Prikazuju se svi kontakti"</string>
<string name="generic_no_account_prompt" msgid="7218827704367325460">"Očuvajte sigurnost svojih kontakata čak i ako izgubite telefon: sinhronizirajte ih s mrežnom uslugom."</string>
<string name="generic_no_account_prompt_title" msgid="753783911899054860">"Dodajte račun"</string>
- <string name="contact_editor_prompt_zero_accounts" msgid="1785345895691886499">"Neće biti napravljena sigurnosna kopija novog računa. Dodati račun za pravljenje sigurnosnih kopija kontakata na mreži?"</string>
+ <string name="contact_editor_prompt_zero_accounts" msgid="6648376557574360096">"Odvojite trenutak da dodate račun putem kojeg će se kontakti sigurnosno kopirati na Google."</string>
<string name="contact_editor_prompt_one_account" msgid="3087691056345099310">"Novi kontakti će biti sačuvani na račun <xliff:g id="ACCOUNT_NAME">%1$s</xliff:g>."</string>
<string name="contact_editor_prompt_multiple_accounts" msgid="8565761674283473549">"Izaberite zadani račun za nove kontakte:"</string>
<string name="contact_editor_title_new_contact" msgid="7192223018128934940">"Dodaj novi kontakt"</string>
<string name="contact_editor_title_existing_contact" msgid="4898475703683187798">"Uredi kontakt"</string>
- <string name="keep_local" msgid="1258761699192993322">"Zadrži na uređaju"</string>
<string name="add_account" msgid="8201790677994503186">"Dodajte račun"</string>
<string name="add_new_account" msgid="5748627740680940264">"Dodaj novi račun"</string>
<string name="menu_export_database" msgid="2659719297530170820">"Izvezi fajlove baze podataka"</string>
<string name="action_menu_add_new_contact_button" msgid="3180222523336380017">"dodaj novi kontakt"</string>
<string name="expanding_entry_card_view_see_more" msgid="3779194067124758079">"Pogledaj više"</string>
<string name="expanding_entry_card_view_see_less" msgid="5344160551629714168">"Vidi manje"</string>
- <string name="expanding_entry_card_view_see_all" msgid="3845258737661412627">"Pogledaj sve"</string>
<string name="recent_card_title" msgid="8982782042698001695">"Nedavno"</string>
<string name="about_card_title" msgid="2920942314212825637">"O kontaktu"</string>
<string name="send_message" msgid="8938418965550543196">"Pošalji poruku"</string>
<string name="toast_making_personal_copy" msgid="288549957278065542">"Izrađivanje lične kopije u toku…"</string>
- <string name="yesterday" msgid="6840858548955018569">"Jučer"</string>
<string name="tomorrow" msgid="6241969467795308581">"Sutra"</string>
<string name="today" msgid="8041090779381781781">"Danas"</string>
<string name="today_at_time_fmt" msgid="605665249491030460">"Danas u <xliff:g id="TIME_INTERVAL">%s</xliff:g>"</string>
@@ -280,7 +276,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Ime"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-pošta"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fotografija"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kliknite da proširite uređivač kontakata."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kliknite da skupite uređivač kontakata."</string>
<string name="content_description_directions" msgid="2686791825798189335">"smjernice do lokacije"</string>
@@ -291,12 +286,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"nedavni poziv. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. kliknite da uputite povratni poziv"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Vi: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts funkcionira bolje kada unesete Hangouts identifikator osobe u polje za adresu e-pošte ili telefon."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Više polja"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Promijeni fotografiju"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Otvaranje uređivača nije uspjelo."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Sačuvati na"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Trenutno se sprema na račun <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dodirnite dvaput da izaberete drugi račun."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Više polja"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Promijeni fotografiju"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Otvaranje uređivača nije uspjelo."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Sačuvaj na"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Prikazuje se"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Trenutno se sprema na račun <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dodirnite dvaput da izaberete drugi račun."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Povezani kontakti (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="few">Povezani kontakti (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Povezani kontakti (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -324,10 +320,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ovaj kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mogući duplikati"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Moguće je da su ovi kontakti ista osoba. Možete ih povezati u jedan kontakt."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Povezani kontakti"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Povezani kontakti"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"S vaših računa"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Snimi fotografiju"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Sve fotografije"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Izaberi fotografiju"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Od kontakta <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Izbriši <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -346,4 +340,273 @@
<string name="permission_explanation_subheader_calendar_and_SMS" msgid="630115334220569184">"Događaji i poruke"</string>
<string name="permission_explanation_subheader_calendar" msgid="8785323496211704613">"Događaji"</string>
<string name="permission_explanation_subheader_SMS" msgid="1904552086449525567">"Poruke"</string>
+ <string name="hamburger_feature_highlight_header" msgid="7442308698936786415">"Organizirajte spisak"</string>
+ <string name="hamburger_feature_highlight_body" msgid="6268711111318172098">"Uklonite duplikate i grupirajte kontakte prema oznaci"</string>
+ <string name="undo" msgid="1425165101664071422">"Opozovi radnju"</string>
+ <string name="call_custom" msgid="6385303130912713318">"Pozovi <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="call_home" msgid="1990519474420545392">"Pozovi kuću"</string>
+ <string name="call_mobile" msgid="7502236805487609178">"Pozovi mobitel"</string>
+ <string name="call_work" msgid="5328785911463744028">"Pozovi posao"</string>
+ <string name="call_fax_work" msgid="7467763592359059243">"Pozovi poslovni faks"</string>
+ <string name="call_fax_home" msgid="8342175628887571876">"Pozovi kućni faks"</string>
+ <string name="call_pager" msgid="9003902812293983281">"Pozovi pejdžer"</string>
+ <string name="call_other" msgid="8563753966926932052">"Pozovi"</string>
+ <string name="call_callback" msgid="1910165691349426858">"Pozovi broj za uzvraćanje poziva"</string>
+ <string name="call_car" msgid="3280537320306436445">"Pozovi automobil"</string>
+ <string name="call_company_main" msgid="6105120947138711257">"Pozovi glavni broj kompanije"</string>
+ <string name="call_isdn" msgid="1541590690193403411">"Pozovi ISDN"</string>
+ <string name="call_main" msgid="6082900571803441339">"Pozovi glavni broj"</string>
+ <string name="call_other_fax" msgid="5745314124619636674">"Pozovi faks"</string>
+ <string name="call_radio" msgid="8296755876398357063">"Pozovi radio"</string>
+ <string name="call_telex" msgid="2223170774548648114">"Pozovi teleks"</string>
+ <string name="call_tty_tdd" msgid="8951266948204379604">"Pozovi TTY/TDD"</string>
+ <string name="call_work_mobile" msgid="8707874281430105394">"Pozovi poslovni mobitel"</string>
+ <string name="call_work_pager" msgid="3419348514157949008">"Pozovi poslovni pejdžer"</string>
+ <string name="call_assistant" msgid="670941612175068337">"Pozovi <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="call_mms" msgid="6274041545876221437">"Pozovi MMS"</string>
+ <string name="call_by_shortcut" msgid="2566802538698913124">"<xliff:g id="CONTACT_NAME">%s</xliff:g> (Poziv)"</string>
+ <string name="sms_custom" msgid="415060214233647603">"Pošalji poruku na <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="sms_home" msgid="7524332261493162995">"Pošalji tekstualnu poruku na kućni broj"</string>
+ <string name="sms_mobile" msgid="5200107250451030769">"Pošalji tekstualnu poruku na mobilni"</string>
+ <string name="sms_work" msgid="2269624156655267740">"Pošalji tekstualnu poruku na poslovni broj"</string>
+ <string name="sms_fax_work" msgid="8028189067816907075">"Pošalji tekstualnu poruku na poslovni faks"</string>
+ <string name="sms_fax_home" msgid="9204042076306809634">"Pošalji tekstualnu poruku na kućni faks"</string>
+ <string name="sms_pager" msgid="7730404569637015192">"Pošalji tekstualnu poruku na pejdžer"</string>
+ <string name="sms_other" msgid="806127844607642331">"Tekst"</string>
+ <string name="sms_callback" msgid="5004824430094288752">"Pošalji tekstualnu poruku na broj za povratni poziv"</string>
+ <string name="sms_car" msgid="7444227058437359641">"Pošalji tekstualnu poruku na automobil"</string>
+ <string name="sms_company_main" msgid="118970873419678087">"Pošalji tekstualnu poruku na glavni broj kompanije"</string>
+ <string name="sms_isdn" msgid="8153785037515047845">"Pošalji tekstualnu poruku na ISDN"</string>
+ <string name="sms_main" msgid="8621625784504541679">"Pošalji tekstualnu poruku na glavni broj"</string>
+ <string name="sms_other_fax" msgid="3888842199855843152">"Pošalji tekstualnu poruku na faks"</string>
+ <string name="sms_radio" msgid="3329166673433967820">"Pošalji tekstualnu poruku na radio"</string>
+ <string name="sms_telex" msgid="9034802430065267848">"Pošalji tekstualnu poruku na teleks"</string>
+ <string name="sms_tty_tdd" msgid="6782284969132531532">"Pošalji tekstualnu poruku na TTY/TDD"</string>
+ <string name="sms_work_mobile" msgid="2459939960512702560">"Pošalji tekstualnu poruku na poslovni mobitel"</string>
+ <string name="sms_work_pager" msgid="5566924423316960597">"Pošalji tekstualnu poruku na poslovni pejdžer"</string>
+ <string name="sms_assistant" msgid="2773424339923116234">"Pošalji tekstualnu poruku <xliff:g id="ASSISTANT">%s</xliff:g>"</string>
+ <string name="sms_mms" msgid="4069352461380762677">"Pošalji tekstualnu poruku na MMS broj"</string>
+ <string name="sms_by_shortcut" msgid="7741770672976099517">"<xliff:g id="CONTACT_NAME">%s</xliff:g> (Poruka)"</string>
+ <string name="description_video_call" msgid="7120921378651700947">"Uputi videopoziv"</string>
+ <string name="clearFrequentsConfirmation_title" msgid="766292372438450432">"Obrisati često kontaktirane osobe?"</string>
+ <string name="clearFrequentsConfirmation" msgid="2270554975938265734">"Obrisat ćete listu često kontaktiranih osoba u aplikaciji Kontakti i Aplikaciji za telefon, pa će aplikacije za e-poštu morati ispočetka učiti vaše postavke adresa."</string>
+ <string name="clearFrequentsProgress_title" msgid="5157001637482794212">"Brisanje često kontaktiranih osoba…"</string>
+ <string name="status_available" msgid="5586870015822828392">"Dostupno"</string>
+ <string name="status_away" msgid="1838861100379804730">"Odsutan"</string>
+ <string name="status_busy" msgid="9147992455450257136">"Zauzeto"</string>
+ <string name="local_invisible_directory" msgid="6046691709127661065">"Ostali"</string>
+ <string name="directory_search_label" msgid="1887759056597975053">"Direktorij"</string>
+ <string name="directory_search_label_work" msgid="8618292129829443176">"Poslovni imenik"</string>
+ <string name="local_search_label" msgid="2551177578246113614">"Svi kontakti"</string>
+ <string name="foundTooManyContacts" msgid="5163335650920020220">"Pronađeno je više od <xliff:g id="COUNT">%d</xliff:g>."</string>
+ <string name="description_quick_contact_for" msgid="6737516415168327789">"Brzi kontakt za <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="missing_name" msgid="8745511583852904385">"(Bez imena)"</string>
+ <string name="favoritesFrequentContacted" msgid="6184232487472425690">"Često kontaktirani"</string>
+ <string name="description_view_contact_detail" msgid="9133251213656414807">"Prikaži kontakt"</string>
+ <string name="list_filter_phones" msgid="735313795643493365">"Svi kontakti s brojevima telefona"</string>
+ <string name="list_filter_phones_work" msgid="1470173699551475015">"Kontakti radnog profila"</string>
+ <string name="view_updates_from_group" msgid="1782685984905600034">"Prikaži ažuriranja"</string>
+ <string name="account_phone" msgid="7128032778471187553">"Uređaj"</string>
+ <string name="account_sim" msgid="6519016427905087952">"SIM"</string>
+ <string name="nameLabelsGroup" msgid="2034640839640477827">"Ime"</string>
+ <string name="nicknameLabelsGroup" msgid="2891682101053358010">"Nadimak"</string>
+ <string name="full_name" msgid="6602579550613988977">"Ime"</string>
+ <string name="name_given" msgid="4280790853455320619">"Ime"</string>
+ <string name="name_family" msgid="7466985689626017037">"Prezime"</string>
+ <string name="name_prefix" msgid="59756378548779822">"Prefiks imena"</string>
+ <string name="name_middle" msgid="8467433655992690326">"Srednje ime"</string>
+ <string name="name_suffix" msgid="3855278445375651441">"Sufiks imena"</string>
+ <string name="name_phonetic" msgid="4259595234312430484">"Fonetsko ime"</string>
+ <string name="name_phonetic_given" msgid="8723179018384187631">"Fonetsko ime"</string>
+ <string name="name_phonetic_middle" msgid="8643721493320405200">"Fonetsko srednje ime"</string>
+ <string name="name_phonetic_family" msgid="2640133663656011626">"Fonetsko prezime"</string>
+ <string name="phoneLabelsGroup" msgid="6468091477851199285">"Telefoniraj"</string>
+ <string name="emailLabelsGroup" msgid="8389931313045344406">"E-pošta"</string>
+ <string name="postalLabelsGroup" msgid="3487738141112589324">"Adresa"</string>
+ <string name="imLabelsGroup" msgid="3898238486262614027">"IM"</string>
+ <string name="organizationLabelsGroup" msgid="2478611760751832035">"Organizacija"</string>
+ <string name="relationLabelsGroup" msgid="1854373894284572781">"Odnos"</string>
+ <string name="eventLabelsGroup" msgid="7960408705307831289">"Posebni datum"</string>
+ <string name="sms" msgid="1756857139634224222">"Tekstualna poruka"</string>
+ <string name="postal_address" msgid="8765560217149624536">"Adresa"</string>
+ <string name="ghostData_company" msgid="5414421120553765775">"Kompanija"</string>
+ <string name="ghostData_title" msgid="7496735200318496110">"Naslov"</string>
+ <string name="label_notes" msgid="8337354953278341042">"Bilješke"</string>
+ <string name="label_custom_field" msgid="1994056912242214426">"Prilagođeno"</string>
+ <string name="label_sip_address" msgid="7252153678613978127">"SIP"</string>
+ <string name="websiteLabelsGroup" msgid="4202998982804009261">"Web stranica"</string>
+ <string name="groupsLabel" msgid="7000816729542098972">"Oznake"</string>
+ <string name="email_home" msgid="8573740658148184279">"Pošalji poruku e-pošte na kućnu adresu e-pošte"</string>
+ <string name="email_mobile" msgid="2042889209787989814">"Mobilna e-pošta"</string>
+ <string name="email_work" msgid="2807430017302722689">"Pošalji poruku e-pošte na poslovnu adresu e-pošte"</string>
+ <string name="email_other" msgid="3454004077967657109">"E-pošta"</string>
+ <string name="email_custom" msgid="5536404237099078802">"Pošalji poruku e-pošte na <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
+ <string name="email" msgid="5668400997660065897">"E-pošta"</string>
+ <string name="postal_street" msgid="8133143961580058972">"Ulica"</string>
+ <string name="postal_pobox" msgid="4431938829180269821">"Poštanski pretinac"</string>
+ <string name="postal_neighborhood" msgid="1450783874558956739">"Naselje"</string>
+ <string name="postal_city" msgid="6597491300084895548">"Grad"</string>
+ <string name="postal_region" msgid="6045263193478437672">"Država"</string>
+ <string name="postal_postcode" msgid="572136414136673751">"Poštanski broj"</string>
+ <string name="postal_country" msgid="7638264508416368690">"Država"</string>
+ <string name="map_home" msgid="1243547733423343982">"Prikaži kućnu adresu"</string>
+ <string name="map_work" msgid="1360474076921878088">"Prikaži poslovnu adresu"</string>
+ <string name="map_other" msgid="3817820803587012641">"Prikaži adresu"</string>
+ <string name="map_custom" msgid="8761800628069473526">"Prikaži <xliff:g id="CUSTOM_LABEL">%s</xliff:g> adresu"</string>
+ <string name="chat_aim" msgid="2588492205291249142">"Ćaskanje putem aplikacije AIM"</string>
+ <string name="chat_msn" msgid="8041633440091073484">"Ćaskanje putem aplikacije Windows Live"</string>
+ <string name="chat_yahoo" msgid="6629211142719943666">"Ćaskanje putem aplikacije Yahoo"</string>
+ <string name="chat_skype" msgid="1210045020427480566">"Ćaskanje putem aplikacije Skype"</string>
+ <string name="chat_qq" msgid="4294637812847719693">"Ćaskanje putem aplikacije QQ"</string>
+ <string name="chat_gtalk" msgid="981575737258117697">"Ćaskanje putem aplikacije Google Talk"</string>
+ <string name="chat_icq" msgid="8438405386153745775">"Ćaskanje putem aplikacije ICQ"</string>
+ <string name="chat_jabber" msgid="7561444230307829609">"Ćaskanje putem aplikacije Jabber"</string>
+ <string name="chat" msgid="9025361898797412245">"Ćaskanje"</string>
+ <string name="description_minus_button" msgid="6908099247930477551">"izbriši"</string>
+ <string name="expand_name_fields_description" msgid="6883935911480726652">"Proširi polja za imena"</string>
+ <string name="collapse_name_fields_description" msgid="4757877385895561556">"Skupi polja za imena"</string>
+ <string name="expand_phonetic_name_fields_description" msgid="3865726859582581741">"Proširi polja za fonetska imena"</string>
+ <string name="collapse_phonetic_name_fields_description" msgid="9102249481855019452">"Skupi polja za fonetska imena"</string>
+ <string name="expand_fields_description" msgid="8129294181216760037">"Proširi"</string>
+ <string name="collapse_fields_description" msgid="1884143625854637874">"Skupi"</string>
+ <string name="announce_expanded_fields" msgid="1075947220478530622">"Prošireno"</string>
+ <string name="announce_collapsed_fields" msgid="6414231530177338704">"Skupljeno"</string>
+ <string name="list_filter_all_accounts" msgid="8908683398914322369">"Svi kontakti"</string>
+ <string name="list_filter_all_starred" msgid="5031734941601931356">"Označeno zvijezdom"</string>
+ <string name="list_filter_customize" msgid="4789963356004169321">"Prilagodi"</string>
+ <string name="list_filter_single" msgid="5871400283515893087">"Kontakt"</string>
+ <string name="display_ungrouped" msgid="6885954210243119591">"Svi drugi kontakti"</string>
+ <string name="display_all_contacts" msgid="2031647544742889505">"Svi kontakti"</string>
+ <string name="menu_sync_remove" msgid="3266725887008450161">"Ukloni grupu za sinhronizaciju"</string>
+ <string name="dialog_sync_add" msgid="8267045393119375803">"Dodaj grupu za sinhronizaciju"</string>
+ <string name="display_more_groups" msgid="2682547080423434170">"Više grupa…"</string>
+ <string name="display_warn_remove_ungrouped" msgid="8872290721676651414">"Uklanjanje grupe \"<xliff:g id="GROUP">%s</xliff:g>\" iz sinhronizacije će također ukloniti sve negrupirane kontakte iz sinhronizacije."</string>
+ <string name="savingDisplayGroups" msgid="2133152192716475939">"Čuvanje opcija prikaza u toku…"</string>
+ <string name="menu_done" msgid="796017761764190697">"Gotovo"</string>
+ <string name="menu_doNotSave" msgid="58593876893538465">"Otkaži"</string>
+ <string name="listCustomView" msgid="1840624396582117590">"Prilagođeni prikaz"</string>
+ <string name="dialog_new_contact_account" msgid="4969619718062454756">"Sačuvaj uvezene kontakte na karticu:"</string>
+ <string name="import_from_sim" msgid="3859272228033941659">"Uvezi sa SIM kartice"</string>
+ <string name="import_from_sim_summary" msgid="5815105584445743740">"Uvezi sa SIM kartice <xliff:g id="SIM_NAME">^1</xliff:g> - <xliff:g id="SIM_NUMBER">^2</xliff:g>"</string>
+ <string name="import_from_sim_summary_no_number" msgid="880612418352086012">"Uvezi sa SIM kartice <xliff:g id="SIM_NAME">%1$s</xliff:g>"</string>
+ <string name="import_from_vcf_file" product="default" msgid="5304572242183878086">"Uvezi iz .vcf fajla"</string>
+ <string name="cancel_import_confirmation_message" msgid="3929951040347726757">"Otkazati uvoz fajla <xliff:g id="FILENAME">%s</xliff:g>?"</string>
+ <string name="cancel_export_confirmation_message" msgid="1995462401949262638">"Otkazati izvoz fajla <xliff:g id="FILENAME">%s</xliff:g>?"</string>
+ <string name="cancel_vcard_import_or_export_failed" msgid="6139900383366166706">"Nemoguće otkazati uvoz/izvoz vCard fajla"</string>
+ <string name="fail_reason_unknown" msgid="1714092345030570863">"Nepoznata greška."</string>
+ <string name="fail_reason_could_not_open_file" msgid="2067725459821997463">"Nije moguće otvoriti \"<xliff:g id="FILE_NAME">%s</xliff:g>\": <xliff:g id="EXACT_REASON">%s</xliff:g>."</string>
+ <string name="fail_reason_could_not_initialize_exporter" msgid="707260459259688510">"Nije moguće pokrenuti program za izvoz: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\"."</string>
+ <string name="fail_reason_no_exportable_contact" msgid="8728506011371262065">"Nema sadržaja za izvoz."</string>
+ <string name="missing_required_permission" msgid="5865884842972833120">"Onemogućili ste potrebnu dozvolu."</string>
+ <string name="fail_reason_error_occurred_during_export" msgid="3018855323913649063">"Došlo je do greške prilikom izvoza: \"<xliff:g id="EXACT_REASON">%s</xliff:g>\"."</string>
+ <string name="fail_reason_too_long_filename" msgid="3393764245254738333">"Zahtijevano ime fajla je predugo (\"<xliff:g id="FILENAME">%s</xliff:g>\")."</string>
+ <string name="fail_reason_io_error" msgid="6748358842976073255">"I/O greška"</string>
+ <string name="fail_reason_low_memory_during_import" msgid="875222757734882898">"Nema dovoljno memorije. Možda je fajl prevelik."</string>
+ <string name="fail_reason_vcard_parse_error" msgid="888263542360355784">"Nije moguće raščlaniti vCard fajl iz neočekivanog razloga."</string>
+ <string name="fail_reason_not_supported" msgid="8219562769267148825">"Format nije podržan."</string>
+ <string name="fail_reason_failed_to_collect_vcard_meta_info" msgid="6427931733267328564">"Nije moguće otvoriti metapodatke vCard fajl(ov)a."</string>
+ <string name="fail_reason_failed_to_read_files" msgid="5823434810622484922">"Nije moguće uvesti jedan ili više fajlova (%s)."</string>
+ <string name="exporting_vcard_finished_title" msgid="4767045779458185251">"Izvoz fajla <xliff:g id="FILENAME">%s</xliff:g> je završen."</string>
+ <string name="exporting_vcard_finished_title_fallback" msgid="6060472638008218274">"Izvoz kontakata je završen."</string>
+ <string name="exporting_vcard_finished_toast" msgid="1739055986856453882">"Izvoz kontakata je završen. Kliknite obavještenje da podijelite kontakte."</string>
+ <string name="touch_to_share_contacts" msgid="4882485525268469736">"Dodirnite da podijelite kontakte."</string>
+ <string name="exporting_vcard_canceled_title" msgid="2652222370493306887">"Izvoz fajla <xliff:g id="FILENAME">%s</xliff:g> je otkazan."</string>
+ <string name="exporting_contact_list_title" msgid="9072240631534457415">"Izvoz podataka kontakta u toku"</string>
+ <string name="exporting_contact_list_message" msgid="3367949209642931952">"Podaci kontakta se izvoze."</string>
+ <string name="composer_failed_to_get_database_infomation" msgid="1765944280846236723">"Nije moguće preuzeti informacije iz baze podataka."</string>
+ <string name="composer_has_no_exportable_contact" msgid="3296493229040294335">"Nema kontakata koji se mogu izvoziti. Ako imate kontakte na telefonu, neki dobavljači podataka možda ne dozvoljavaju izvoz kontakata s telefona."</string>
+ <string name="composer_not_initialized" msgid="2321648986367005254">"Program za izradu kartica vCard nije pravilno pokrenut."</string>
+ <string name="exporting_contact_failed_title" msgid="4892358112409576342">"Izvoz nije uspio"</string>
+ <string name="exporting_contact_failed_message" msgid="4938527850142003141">"Podaci kontakta nisu izvezeni.\nRazlog: \"<xliff:g id="FAIL_REASON">%s</xliff:g>\""</string>
+ <string name="importing_vcard_description" msgid="4245275224298571351">"Uvozi se kontakt <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="reading_vcard_failed_title" msgid="4251647443358422855">"Čitanje podataka vCard nije uspjelo"</string>
+ <string name="reading_vcard_canceled_title" msgid="1925216585981542019">"Čitanje vCard podataka je otkazano"</string>
+ <string name="importing_vcard_finished_title" msgid="3341541727268747967">"Završen uvoz vCard fajla <xliff:g id="FILENAME">%s</xliff:g>"</string>
+ <string name="importing_vcard_canceled_title" msgid="2147475978165599336">"Uvoz fajla <xliff:g id="FILENAME">%s</xliff:g> je otkazan"</string>
+ <string name="vcard_import_will_start_message" msgid="2804911199145873396">"Fajl <xliff:g id="FILENAME">%s</xliff:g> će uskoro biti uvezen."</string>
+ <string name="vcard_import_will_start_message_with_default_name" msgid="1022969530654129470">"Fajl će uskoro biti uvezen."</string>
+ <string name="vcard_import_request_rejected_message" msgid="2890471184508516011">"Zahtjev za uvoz vCard fajla je odbijen. Pokušajte ponovo kasnije."</string>
+ <string name="vcard_export_will_start_message" msgid="2210241345252081463">"Fajl <xliff:g id="FILENAME">%s</xliff:g> će uskoro biti izvezen."</string>
+ <string name="vcard_export_will_start_message_fallback" msgid="6553826997490909749">"Fajl će uskoro biti izvezen."</string>
+ <string name="contacts_export_will_start_message" msgid="8538705791417534431">"Kontakti će uskoro biti izvezeni."</string>
+ <string name="vcard_export_request_rejected_message" msgid="2844874826431327531">"Zahtjev za izvoz vCard fajla je odbijen. Pokušajte ponovo kasnije."</string>
+ <string name="vcard_unknown_filename" msgid="7171709890959915954">"kontakt"</string>
+ <string name="caching_vcard_message" msgid="4926308675041506756">"Spremanje vCard fajlova u lokalnu privremenu pohranu. Uvoz će započeti uskoro."</string>
+ <string name="vcard_import_failed" msgid="5223531255894842406">"Uvoz vCard kartice nije uspio."</string>
+ <string name="nfc_vcard_file_name" msgid="2823095213265993609">"Kontakt NFC-om"</string>
+ <string name="confirm_export_title" msgid="6834385377255286349">"Izvesti kontakte?"</string>
+ <string name="caching_vcard_title" msgid="1226272312940516605">"Spremanje u privremenu pohranu u toku"</string>
+ <string name="progress_notifier_message" msgid="2311011466908220528">"Uvozi se <xliff:g id="CURRENT_NUMBER">%s</xliff:g>/<xliff:g id="TOTAL_NUMBER">%s</xliff:g>: <xliff:g id="NAME">%s</xliff:g>"</string>
+ <string name="export_to_vcf_file" product="default" msgid="4407527157056120858">"Izvezi u .vcf fajl"</string>
+ <string name="display_options_sort_list_by" msgid="7028809117272018712">"Poredaj po"</string>
+ <string name="display_options_sort_by_given_name" msgid="2778421332815687873">"Ime"</string>
+ <string name="display_options_sort_by_family_name" msgid="2684905041926954793">"Prezime"</string>
+ <string name="display_options_view_names_as" msgid="6514632499276563482">"Format imena"</string>
+ <string name="display_options_view_given_name_first" msgid="3616004640258761473">"Ime prvo"</string>
+ <string name="display_options_view_family_name_first" msgid="956445100777296467">"Prezime prvo"</string>
+ <string name="settings_accounts" msgid="350219740670774576">"Računi"</string>
+ <string name="default_editor_account" msgid="699591683362420991">"Zadani račun za nove kontakte"</string>
+ <string name="sync_contact_metadata_title" msgid="6957956139306960211">"Sinhroniziraj metapodatke kontakata [DOGFOOD]"</string>
+ <string name="sync_contact_metadata_dialog_title" msgid="6192335951588820553">"Sinhroniziraj metapodatke kontakata"</string>
+ <string name="settings_my_info_title" msgid="1534272456405343119">"Moje informacije"</string>
+ <string name="set_up_profile" msgid="7370213843590143771">"Postavite svoj profil"</string>
+ <string name="setting_about" msgid="7014388749752042863">"O kontaktima"</string>
+ <string name="share_visible_contacts" msgid="890150378880783797">"Podijeli vidljive kontakte"</string>
+ <string name="share_visible_contacts_failure" msgid="7324717548166915560">"Dijeljenje vidljivih kontakata nije uspjelo."</string>
+ <string name="share_favorite_contacts" msgid="4280926751003081042">"Dijeli omiljene kontakte"</string>
+ <string name="share_contacts" msgid="8109287987498711664">"Dijeli sve kontakte"</string>
+ <string name="share_contacts_failure" msgid="1216431977330560559">"Dijeljenje kontakata nije uspjelo."</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Izvezi kontakte"</string>
+ <string name="dialog_import" msgid="2431698729761448759">"Uvezi kontakte"</string>
+ <string name="share_error" msgid="948429331673358107">"Ovaj kontakt se ne može podijeliti."</string>
+ <string name="no_contact_to_share" msgid="1276397530378323033">"Nema kontakata za dijeljenje."</string>
+ <string name="menu_search" msgid="9147752853603483719">"Traži"</string>
+ <string name="menu_contacts_filter" msgid="2165153460860262501">"Kontakti za prikaz"</string>
+ <string name="activity_title_contacts_filter" msgid="8275542497615516969">"Kontakti za prikaz"</string>
+ <string name="custom_list_filter" msgid="2105275443109077687">"Definirajte prilagođeni prikaz"</string>
+ <string name="menu_custom_filter_save" msgid="2679793632208086460">"Sačuvaj"</string>
+ <string name="hint_findContacts" msgid="7128627979899070325">"Traži kontakte"</string>
+ <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoriti"</string>
+ <string name="listTotalAllContactsZero" msgid="5513001821794568211">"Nema kontakata."</string>
+ <string name="menu_clear_frequents" msgid="7688250191932838833">"Obriši često kontaktirane"</string>
+ <string name="menu_select_sim" msgid="3603578201960504010">"Odaberi SIM karticu"</string>
+ <string name="menu_accounts" msgid="1424330057450189074">"Upravljaj računima"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Uvezi"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Izvezi"</string>
+ <string name="menu_blocked_numbers" msgid="5272951629083025995">"Blokirani brojevi"</string>
+ <string name="contact_status_update_attribution" msgid="752179367353018597">"putem <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
+ <string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> putem <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
+ <string name="action_menu_back_from_search" msgid="8793348588949233348">"zaustavi pretraživanje"</string>
+ <string name="description_clear_search" msgid="688023606766232904">"Obriši pretragu"</string>
+ <string name="settings_contact_display_options_title" msgid="4890258244494248687">"Opcije prikaza kontakata"</string>
+ <string name="select_account_dialog_title" msgid="5478489655696599219">"Račun"</string>
+ <string name="set_default_account" msgid="4311613760725609801">"Uvijek koristi ovu karticu za poziv"</string>
+ <string name="select_phone_account_for_calls" msgid="3810607744451014540">"Poziv putem"</string>
+ <string name="call_with_a_note" msgid="8389827628360791676">"Poziv s bilješkom"</string>
+ <string name="call_subject_hint" msgid="3043028982108363572">"Upišite bilješku koja će se poslati uz poziv…"</string>
+ <string name="send_and_call_button" msgid="7740295432834590737">"POŠALJI I POZOVI"</string>
+ <string name="call_subject_limit" msgid="4545212901205397669">"<xliff:g id="COUNT">%1$s</xliff:g> / <xliff:g id="LIMIT">%2$s</xliff:g>"</string>
+ <string name="call_subject_type_and_number" msgid="7667188212129152558">"<xliff:g id="TYPE">%1$s</xliff:g> • <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <plurals name="tab_title_with_unread_items" formatted="false" msgid="7682024005130747825">
+ <item quantity="one"> <xliff:g id="TITLE_2">%1$s</xliff:g>. <xliff:g id="COUNT_3">%2$d</xliff:g> nepročitana stavka. </item>
+ <item quantity="few"> <xliff:g id="TITLE_2">%1$s</xliff:g>. <xliff:g id="COUNT_3">%2$d</xliff:g> nepročitana stavka. </item>
+ <item quantity="other"> <xliff:g id="TITLE_2">%1$s</xliff:g>. <xliff:g id="COUNT_3">%2$d</xliff:g> nepročitana stavka. </item>
+ </plurals>
+ <string name="about_build_version" msgid="1765533099416999801">"Podverzija"</string>
+ <string name="about_open_source_licenses" msgid="6479990452352919641">"Licence otvorenog koda"</string>
+ <string name="about_open_source_licenses_summary" msgid="57418386931763994">"Detalji o licenci za softver otvorenog koda"</string>
+ <string name="about_privacy_policy" msgid="3705518622499152626">"Pravila o privatnosti"</string>
+ <string name="about_terms_of_service" msgid="4642400812150296723">"Uslovi pružanja usluge"</string>
+ <string name="activity_title_licenses" msgid="5467767062737708066">"Licence otvorenog koda"</string>
+ <string name="url_open_error_toast" msgid="452592089815420457">"Otvaranje URL-a nije uspjelo."</string>
+ <string name="account_filter_view_checked" msgid="6696859503887762213">"<xliff:g id="ACCOUNT_INFO">%s</xliff:g> je označen"</string>
+ <string name="account_filter_view_not_checked" msgid="2248684521205038389">"<xliff:g id="ACCOUNT_INFO">%s</xliff:g> nije označen"</string>
+ <string name="description_search_video_call" msgid="5841525580339803272">"Uputi videopoziv"</string>
+ <string name="description_delete_contact" msgid="53835657343783663">"Izbriši"</string>
+ <string name="description_no_name_header" msgid="8884991311595943271">"Elipsa"</string>
+ <string name="callDurationSecondFormat" msgid="7067644915903528776">"<xliff:g id="SECONDS">%s</xliff:g> sek."</string>
+ <string name="callDurationMinuteFormat" msgid="4647095486747447674">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
+ <string name="callDurationHourFormat" msgid="7392254193808506640">"<xliff:g id="MINUTES_0">%s</xliff:g> h <xliff:g id="MINUTES_1">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
+ <string name="dynamic_shortcut_disabled_message" msgid="249939425761315252">"Ova prečica je onemogućena"</string>
+ <string name="dynamic_shortcut_contact_removed_message" msgid="6845645831837615899">"Kontakt je uklonjen"</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 5eab8dc..540b13a 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contactes suggerits"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tots els contactes"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contactes enllaçats"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"S\'ha suprimit <xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">S\'han suprimit els contactes</item>
<item quantity="one">S\'ha suprimit el contacte</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"No hi ha cap contacte amb aquesta etiqueta"</string>
<string name="emptyAccount" msgid="6873962901497975964">"No hi ha cap contacte en aquest compte"</string>
<string name="emptyMainList" msgid="2772242747899664460">"La llista de contactes està buida"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> s\'ha desat"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"S\'ha desat el contacte"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Els contactes s\'han desenllaçat"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"No s\'han pogut desar els canvis al contacte"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Torna a trucar"</string>
<string name="returnCall" msgid="8171961914203617813">"Retorna la trucada"</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_contact_photo" msgid="3387458082667894062">"foto del contacte"</string>
<string name="description_plus_button" msgid="515164827856229880">"més"</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="search_settings_description" msgid="2675223022992445813">"Noms dels contactes"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Data"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiqueta"</string>
<string name="change_photo" msgid="8530597935483526383">"Canvia"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Foto principal"</string>
<string name="description_star" msgid="2605854427360036550">"preferit"</string>
<string name="edit_contact" msgid="7529281274005689512">"Edita contacte"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"tanca"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nom"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Adreça electrònica"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telèfon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Fes clic per desplegar l\'editor de contactes."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Fes clic per replegar l\'editor de contactes."</string>
<string name="content_description_directions" msgid="2686791825798189335">"indicacions cap a la ubicació"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Trucada recent. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Fes clic per tornar la trucada."</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Usuari: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts funciona millor si introdueixes l\'identificador de Hangouts de la persona corresponent al camp de l\'adreça electrònica o del telèfon."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Més camps"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Canvia la foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"No s\'ha pogut obrir l\'editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Es desa a"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Actualment es desa a <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Fes doble toc per triar un altre compte."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">S\'han enllaçat els contactes (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">S\'ha enllaçat el contacte</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Més camps"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Canvia la foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"No s\'ha pogut obrir l\'editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Es desarà a"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Es mostra"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Actualment es desa a <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Fes doble toc per triar un altre compte."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">Contactes enllaçats (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="one">Contacte enllaçat</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> contactes enllaçats"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Aquest contacte"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Possibles duplicats"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"És possible que aquests contactes corresponguin a la mateixa persona. Els pots enllaçar i crear un contacte únic."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Contactes enllaçats"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Contactes enllaçats"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Dels teus comptes"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Fes una foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Totes les fotos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Tria una foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Del compte <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Suprimeix <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Comparteix els contactes preferits"</string>
<string name="share_contacts" msgid="8109287987498711664">"Comparteix tots els contactes"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"No s\'han pogut compartir els contactes."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importa/exporta contactes"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exporta contactes"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importació de contactes"</string>
<string name="share_error" msgid="948429331673358107">"No es pot compartir aquest contacte."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"No hi ha cap contacte per compartir."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Esborra els freqüents"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Selecciona una targeta SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Gestiona els comptes"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importa/exporta"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importa"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exporta"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Números bloquejats"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"mitjançant <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> mitjançant <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 4edf6f6..08b1325 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Navrhované kontakty"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Všechny kontakty"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontakty byly propojeny"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Kontakt <xliff:g id="NAME">%s</xliff:g> byl smazán"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="few">Kontakty byly smazány</item>
<item quantity="many">Kontakty byly smazány</item>
@@ -117,6 +118,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Žádné kontakty s tímto štítkem"</string>
<string name="emptyAccount" msgid="6873962901497975964">"V tomto účtu nejsou uloženy žádné kontakty"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Váš seznam kontaktů je prázdný"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Kontakt <xliff:g id="DISPLAY_NAME">%s</xliff:g> byl uložen"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt uložen"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Propojení kontaktů bylo zrušeno"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Změny kontaktu se nepodařilo uložit"</string>
@@ -159,7 +161,6 @@
<string name="callAgain" msgid="3197312117049874778">"Zavolat znovu"</string>
<string name="returnCall" msgid="8171961914203617813">"Zpětné volání"</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_contact_photo" msgid="3387458082667894062">"fotografie kontaktu"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Jména vašich kontaktů"</string>
@@ -206,7 +207,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Datum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Štítek"</string>
<string name="change_photo" msgid="8530597935483526383">"Změnit"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Primární fotka"</string>
<string name="description_star" msgid="2605854427360036550">"oblíbené"</string>
<string name="edit_contact" msgid="7529281274005689512">"Upravit kontakt"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"zavřít"</string>
@@ -283,7 +283,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Jméno"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-mail"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fotka"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kliknutím rozbalíte editor kontaktů."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kliknutím sbalíte editor kontaktů."</string>
<string name="content_description_directions" msgid="2686791825798189335">"trasy k místům"</string>
@@ -294,12 +293,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"nedávný hovor. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. kliknutím zavoláte zpět"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Vy: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Aplikace Hangouts funguje lépe, když do pole pro e-mail nebo pro telefon zadáte identifikátor osoby ve službě Hangouts."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Další pole"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Změnit fotografii"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Editor nelze otevřít."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Uložit do účtu"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Momentálně se ukládá do účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dvojitým klepnutím můžete vybrat jiný účet."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Další pole"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Změnit fotku"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Editor se nepodařilo otevřít."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Uložit do účtu"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Zobrazuje se"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Momentálně se ukládá do účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dvojitým klepnutím můžete vybrat jiný účet."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="few">Propojené kontakty (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="many">Propojené kontakty (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Propojené kontakty (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -331,10 +331,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Tento kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Možná duplicita"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Tyto kontakty možná reprezentují stejného člověka. Můžete je propojit a vytvořit z nich jeden kontakt."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Propojené kontakty"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Propojené kontakty"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Z vašich účtů"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Pořídit fotku"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Všechny fotky"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Výběr fotky"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Z účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Smazat <xliff:g id="DATA_KIND">%s</xliff:g> (<xliff:g id="DATA_TYPE">%s </xliff:g>)"</string>
@@ -569,7 +567,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Sdílet oblíbené kontakty"</string>
<string name="share_contacts" msgid="8109287987498711664">"Sdílet všechny kontakty"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Kontakty se nepodařilo sdílet."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importovat nebo exportovat kontakty"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exportovat kontakty"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importovat kontakty"</string>
<string name="share_error" msgid="948429331673358107">"Tento kontakt nelze sdílet."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Nejsou dostupné žádné kontakty ke sdílení."</string>
@@ -584,7 +582,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Vymazat často kontaktované os."</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Vybrat SIM kartu"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Spravovat účty"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importovat/Exportovat"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importovat"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportovat"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blokovaná čísla"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"pomocí služby <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> prostřednictvím služby <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index caae194..52acd85 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Foreslåede kontakter"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle kontakter"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontaktpersonerne er linket"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> blev slettet"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Kontaktpersonen blev slettet</item>
<item quantity="other">Kontaktpersonerne blev slettet</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Der er ingen kontaktpersoner med denne etiket"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Der er ingen kontaktpersoner på denne konto"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Din liste over kontaktpersoner er tom"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> blev gemt"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontaktpersonen er gemt"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Linkningen til kontaktpersonerne er fjernet"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Ændringerne af kontaktpersonen kan ikke gemmes"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Ring op igen"</string>
<string name="returnCall" msgid="8171961914203617813">"Ring tilbage"</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_contact_photo" msgid="3387458082667894062">"kontaktpersonfoto"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Navne på dine kontakter"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Dato"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiket"</string>
<string name="change_photo" msgid="8530597935483526383">"Rediger"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Primært foto"</string>
<string name="description_star" msgid="2605854427360036550">"foretrukken"</string>
<string name="edit_contact" msgid="7529281274005689512">"Rediger kontaktperson"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"luk"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Navn"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-mail"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Klik for at udvide værktøjet til redigering af kontaktpersoner."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Klik for at skjule værktøjet til redigering af kontaktpersoner."</string>
<string name="content_description_directions" msgid="2686791825798189335">"rutevejledning til placering"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"seneste opkald. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Klik for at ringe tilbage"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Dig: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts fungerer bedre, når du indtaster personens Hangouts-id i e-mailfeltet eller telefonfeltet."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Flere felter"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Skift billede"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Redigeringsværktøjet kunne ikke åbnes."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Gemmes på"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"I øjeblikket gemmes den på <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Tryk to gange for at vælge en anden konto."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one">Linket kontaktperson (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="other">Linkede kontaktpersoner (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Flere felter"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Skift billede"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Redigeringsværktøjet kunne ikke åbnes."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Gemmes på"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Vises nu"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"I øjeblikket gemmes den på <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Tryk to gange for at vælge en anden konto."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="one">Tilknyttet kontaktperson (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="other">Tilknyttede kontaktpersoner (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> linkede kontaktpersoner"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Denne kontaktperson"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mulige dubletter"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Disse kontaktpersoner kan være den samme person. Du kan linke dem til én enkelt kontaktperson."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Linkede kontaktpersoner"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Linkede kontaktpersoner"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Fra dine konti"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Tag et billede"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Alle billeder"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Vælg billede"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Fra <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Slet <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Del foretrukne kontaktpersoner"</string>
<string name="share_contacts" msgid="8109287987498711664">"Del alle kontaktpersoner"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Kontaktpersonerne kunne ikke deles."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Import/eksport kontakter"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Eksportér kontaktpersoner"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importer kontaktpersoner"</string>
<string name="share_error" msgid="948429331673358107">"Denne kontaktperson kan ikke deles."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Der er ingen kontaktpersoner, der kan deles."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Ryd hyppige"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Vælg SIM-kort"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Administrer konti"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importer og eksporter"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importér"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Eksportér"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blokerede telefonnumre"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index ddb3ab4..2565045 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Vorgeschlagene Kontakte"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle Kontakte"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontakte verknüpft"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> gelöscht"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kontakte gelöscht</item>
<item quantity="one">Kontakt gelöscht</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Keine Kontakte mit diesem Label"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Keine Kontakte für dieses Konto"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Die Kontaktliste ist leer"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> gespeichert"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt gespeichert"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Verknüpfung der Kontakte wurde aufgehoben."</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Änderungen am Kontakt konnten nicht gespeichert werden"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Erneut anrufen"</string>
<string name="returnCall" msgid="8171961914203617813">"Zurückrufen"</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_contact_photo" msgid="3387458082667894062">"Kontaktbild"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Namen meiner Kontakte"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Datum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Label"</string>
<string name="change_photo" msgid="8530597935483526383">"Ändern"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Hauptfoto"</string>
<string name="description_star" msgid="2605854427360036550">"Favorit"</string>
<string name="edit_contact" msgid="7529281274005689512">"Kontakt bearbeiten"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"Schließen"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Name"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-Mail"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Zum Maximieren des Kontakteditors klicken"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Zum Minimieren des Kontakteditors klicken"</string>
<string name="content_description_directions" msgid="2686791825798189335">"Wegbeschreibung"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Letzter Anruf. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Für Rückruf klicken."</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Ich: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts funktioniert besser, wenn du die Hangouts-ID der Person in das E-Mail- oder Telefonfeld eingibst."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Weitere Felder"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Foto ändern"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Fehler beim Öffnen des Editors."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Speichern in"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Wird derzeit in <xliff:g id="ACCOUNT_NAME">%s</xliff:g> gespeichert. Tippe doppelt, um ein anderes Konto auszuwählen."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Weitere Felder"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Foto ändern"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Fehler beim Öffnen des Editors."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Speichern in"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Wiedergabe"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Wird derzeit in <xliff:g id="ACCOUNT_NAME">%s</xliff:g> gespeichert. Doppeltippe, um ein anderes Konto auszuwählen."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Verknüpfte Kontakte (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Verknüpfter Kontakt</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Dieser Kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mögliche Duplikate"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Bei diesen Kontakten könnte es sich um dieselbe Person handeln. Du kannst sie zu einem einzigen Kontakt verknüpfen."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Verknüpfte Kontakte"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Verknüpfte Kontakte"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Aus meinen Konten"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Foto aufnehmen"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Alle Fotos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Foto auswählen"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Von <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> löschen"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Lieblingskontakte teilen"</string>
<string name="share_contacts" msgid="8109287987498711664">"Alle Kontakte teilen"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Kontakte konnten nicht geteilt werden."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Import/Export von Kontakten"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Kontakte exportieren"</string>
<string name="dialog_import" msgid="2431698729761448759">"Kontakte importieren"</string>
<string name="share_error" msgid="948429331673358107">"Dieser Kontakt kann nicht geteilt werden."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Keine Kontakte zum Teilen vorhanden."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"\"Häufig kontaktiert\" löschen"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM-Karte auswählen"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Konten verwalten"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importieren/Exportieren"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importieren"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportieren"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blockierte Nummern"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"über <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> über <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index d3ff77f..dff1668 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Προτεινόμενες επαφές"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Όλες οι επαφές"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Οι επαφές συνδέθηκαν"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g>: διαγράφηκε"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other"> επαφές διαγράφηκαν</item>
<item quantity="one"> επαφή διαγράφηκε</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Δεν υπάρχουν επαφές με αυτήν την εκτικέτα"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Δεν υπάρχουν επαφές σε αυτόν το λογαριασμό"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Η λίστα επαφών σας είναι άδεια"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Η επαφή \"<xliff:g id="DISPLAY_NAME">%s</xliff:g>\" αποθηκεύτηκε"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Η επαφή αποθηκεύτηκε"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Οι επαφές αποσυνδέθηκαν"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Δεν ήταν δυνατή η αποθήκευση των αλλαγών που πραγματοποιήθηκαν στην επαφή"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Επανάληψη κλήσης"</string>
<string name="returnCall" msgid="8171961914203617813">"Επιστροφή κλήσης"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Προσθήκη του \"<xliff:g id="EMAIL">%s</xliff:g>\" στις επαφές?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"φωτογραφία επαφής"</string>
<string name="description_plus_button" msgid="515164827856229880">"συν"</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="search_settings_description" msgid="2675223022992445813">"Ονόματα των επαφών σας"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Ημερομηνία"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Ετικέτα"</string>
<string name="change_photo" msgid="8530597935483526383">"Αλλαγή"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Κύρια φωτογραφία"</string>
<string name="description_star" msgid="2605854427360036550">"αγαπημένο"</string>
<string name="edit_contact" msgid="7529281274005689512">"Επεξεργασία"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"κλείσιμο"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Όνομα"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Διεύθυνση ηλεκτρονικού ταχυδρομείου"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Τηλέφωνο"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Φωτογραφία"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Κάντε κλικ για επέκταση της επεξεργασίας επαφών."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Κάντε κλικ για σύμπτυξη της επεξεργασίας επαφών."</string>
<string name="content_description_directions" msgid="2686791825798189335">"οδηγίες προς την τοποθεσία"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"πρόσφατη κλήση. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. κάντε κλικ για επιστροφή της κλήσης"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Εσείς: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Το Hangouts λειτουργεί καλύτερα όταν εισάγετε το αναγνωριστικό Hangouts του ατόμου στο πεδίο ηλεκτρονικού ταχυδρομείου ή τηλεφώνου."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Περισσότερα πεδία"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Αλλαγή φωτογραφίας"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Αποτυχία ανοίγματος προγράμματος επεξεργασίας."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Αποθήκευση σε"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Γίνεται αποθήκευση στο λογαριασμό <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Πατήστε δύο φορές για να επιλέξετε διαφορετικό λογαριασμό."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Περισσότερα πεδία"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Αλλαγή φωτογραφίας"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Αποτυχία ανοίγματος προγράμματος επεξεργασίας."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Αποθήκευση σε"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Προβολή"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Γίνεται αποθήκευση στο λογαριασμό <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Πατήστε δύο φορές για να επιλέξετε διαφορετικό λογαριασμό."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Συνδεδεμένες επαφές (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Συνδεδεμένη επαφή</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Αυτή η επαφή"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Πιθανά διπλότυπα"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Αυτές οι επαφές μπορεί να αντιστοιχούν στο ίδιο άτομο. Μπορείτε να τις συνδέσετε σε μία μεμονωμένη επαφή."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Συνδεδεμένες επαφές"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Συνδεδεμένες επαφές"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Από τους λογαριασμούς σας"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Λήψη φωτογραφίας"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Όλες οι φωτογραφίες"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Επιλογή φωτογραφίας"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Από <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Διαγραφή <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Κοινοποίηση αγαπημένων επαφών"</string>
<string name="share_contacts" msgid="8109287987498711664">"Κοινή χρήση όλων των επαφών"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Αποτυχία κοινής χρήσης επαφών."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Εισαγωγή/Εξαγωγή επαφών"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Εξαγωγή επαφών"</string>
<string name="dialog_import" msgid="2431698729761448759">"Εισαγωγή επαφών"</string>
<string name="share_error" msgid="948429331673358107">"Δεν είναι δυνατή η κοινή χρήση αυτής της επαφής."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Δεν υπάρχουν επαφές για κοινοποίηση."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Διαγραφή ατόμ. με συχνή επικ."</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Επιλογή κάρτας SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Διαχείριση λογαριασμών"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Εισαγωγή/Εξαγωγή"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Εισαγωγή"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Εξαγωγή"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Αποκλεισμένοι αριθμοί"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"μέσω <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> μέσω <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 402617d..1dd7ee2 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Suggested Contacts"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"All contacts"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contacts linked"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> deleted"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Contacts deleted</item>
<item quantity="one">Contact deleted</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"No contacts with this label"</string>
<string name="emptyAccount" msgid="6873962901497975964">"No contacts in this account"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Your contacts list is empty"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> saved"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Contact saved"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contacts unlinked"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Couldn\'t save contact changes"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Call again"</string>
<string name="returnCall" msgid="8171961914203617813">"Return call"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Add \"<xliff:g id="EMAIL">%s</xliff:g>\" to contacts?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"contact photo"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Names of your contacts"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Date"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Label"</string>
<string name="change_photo" msgid="8530597935483526383">"Change"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Primary photo"</string>
<string name="description_star" msgid="2605854427360036550">"favourite"</string>
<string name="edit_contact" msgid="7529281274005689512">"Edit contact"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"close"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Name"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Email"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Phone"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Photo"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Click to expand contact editor."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Click to collapse contact editor."</string>
<string name="content_description_directions" msgid="2686791825798189335">"directions to location"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"recent call. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. click to call back"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"You: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts works better when you enter the person\'s Hangouts identifier into the email field or phone field."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"More fields"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Change photo"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Failed to open editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Saving to"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Currently saving to <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Double-tap to pick a different account."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"More fields"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Change photo"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Failed to open editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Saving to"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Viewing"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Currently saving to <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Double-tap to choose a different account."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Linked contacts (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Linked contact</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"This contact"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Possible duplicates"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"These contacts might be the same person. You can link them together as a single contact."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Linked contacts"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Linked contacts"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"From your accounts"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Take a photo"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"All photos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Choose photo"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"From <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Delete <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Share favourite contacts"</string>
<string name="share_contacts" msgid="8109287987498711664">"Share all contacts"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Failed to share contacts."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Import/export contacts"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Export contacts"</string>
<string name="dialog_import" msgid="2431698729761448759">"Import contacts"</string>
<string name="share_error" msgid="948429331673358107">"This contact cannot be shared."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"There are no contacts to share."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Clear frequents"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Select SIM card"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Manage accounts"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Import/export"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Import"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Export"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blocked numbers"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 402617d..1dd7ee2 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Suggested Contacts"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"All contacts"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contacts linked"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> deleted"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Contacts deleted</item>
<item quantity="one">Contact deleted</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"No contacts with this label"</string>
<string name="emptyAccount" msgid="6873962901497975964">"No contacts in this account"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Your contacts list is empty"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> saved"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Contact saved"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contacts unlinked"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Couldn\'t save contact changes"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Call again"</string>
<string name="returnCall" msgid="8171961914203617813">"Return call"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Add \"<xliff:g id="EMAIL">%s</xliff:g>\" to contacts?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"contact photo"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Names of your contacts"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Date"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Label"</string>
<string name="change_photo" msgid="8530597935483526383">"Change"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Primary photo"</string>
<string name="description_star" msgid="2605854427360036550">"favourite"</string>
<string name="edit_contact" msgid="7529281274005689512">"Edit contact"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"close"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Name"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Email"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Phone"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Photo"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Click to expand contact editor."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Click to collapse contact editor."</string>
<string name="content_description_directions" msgid="2686791825798189335">"directions to location"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"recent call. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. click to call back"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"You: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts works better when you enter the person\'s Hangouts identifier into the email field or phone field."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"More fields"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Change photo"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Failed to open editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Saving to"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Currently saving to <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Double-tap to pick a different account."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"More fields"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Change photo"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Failed to open editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Saving to"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Viewing"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Currently saving to <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Double-tap to choose a different account."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Linked contacts (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Linked contact</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"This contact"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Possible duplicates"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"These contacts might be the same person. You can link them together as a single contact."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Linked contacts"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Linked contacts"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"From your accounts"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Take a photo"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"All photos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Choose photo"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"From <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Delete <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Share favourite contacts"</string>
<string name="share_contacts" msgid="8109287987498711664">"Share all contacts"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Failed to share contacts."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Import/export contacts"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Export contacts"</string>
<string name="dialog_import" msgid="2431698729761448759">"Import contacts"</string>
<string name="share_error" msgid="948429331673358107">"This contact cannot be shared."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"There are no contacts to share."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Clear frequents"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Select SIM card"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Manage accounts"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Import/export"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Import"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Export"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blocked numbers"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 402617d..1dd7ee2 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Suggested Contacts"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"All contacts"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contacts linked"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> deleted"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Contacts deleted</item>
<item quantity="one">Contact deleted</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"No contacts with this label"</string>
<string name="emptyAccount" msgid="6873962901497975964">"No contacts in this account"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Your contacts list is empty"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> saved"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Contact saved"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contacts unlinked"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Couldn\'t save contact changes"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Call again"</string>
<string name="returnCall" msgid="8171961914203617813">"Return call"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Add \"<xliff:g id="EMAIL">%s</xliff:g>\" to contacts?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"contact photo"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Names of your contacts"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Date"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Label"</string>
<string name="change_photo" msgid="8530597935483526383">"Change"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Primary photo"</string>
<string name="description_star" msgid="2605854427360036550">"favourite"</string>
<string name="edit_contact" msgid="7529281274005689512">"Edit contact"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"close"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Name"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Email"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Phone"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Photo"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Click to expand contact editor."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Click to collapse contact editor."</string>
<string name="content_description_directions" msgid="2686791825798189335">"directions to location"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"recent call. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. click to call back"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"You: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts works better when you enter the person\'s Hangouts identifier into the email field or phone field."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"More fields"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Change photo"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Failed to open editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Saving to"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Currently saving to <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Double-tap to pick a different account."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"More fields"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Change photo"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Failed to open editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Saving to"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Viewing"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Currently saving to <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Double-tap to choose a different account."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Linked contacts (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Linked contact</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"This contact"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Possible duplicates"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"These contacts might be the same person. You can link them together as a single contact."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Linked contacts"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Linked contacts"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"From your accounts"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Take a photo"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"All photos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Choose photo"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"From <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Delete <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Share favourite contacts"</string>
<string name="share_contacts" msgid="8109287987498711664">"Share all contacts"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Failed to share contacts."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Import/export contacts"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Export contacts"</string>
<string name="dialog_import" msgid="2431698729761448759">"Import contacts"</string>
<string name="share_error" msgid="948429331673358107">"This contact cannot be shared."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"There are no contacts to share."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Clear frequents"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Select SIM card"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Manage accounts"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Import/export"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Import"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Export"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blocked numbers"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 98c6545..3bb2479 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contactos sugeridos"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Todos los contactos"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Se vincularon los contactos"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> borrado"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Contactos borrados</item>
<item quantity="one">Contacto borrado</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Ningún contacto tiene esta etiqueta"</string>
<string name="emptyAccount" msgid="6873962901497975964">"No hay contactos en esta cuenta"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Tu lista de contactos está vacía"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Se guardó a <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Contacto guardado"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contactos desvinculados"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"No se pudieron guardar los cambios en el contacto"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Llamar nuevamente"</string>
<string name="returnCall" msgid="8171961914203617813">"Regresar llamada"</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_contact_photo" msgid="3387458082667894062">"foto de contacto"</string>
<string name="description_plus_button" msgid="515164827856229880">"más"</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="search_settings_description" msgid="2675223022992445813">"Nombres de tus contactos"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Fecha"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiqueta"</string>
<string name="change_photo" msgid="8530597935483526383">"Cambiar"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Foto principal"</string>
<string name="description_star" msgid="2605854427360036550">"favorito"</string>
<string name="edit_contact" msgid="7529281274005689512">"Editar contacto"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"cerrar"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nombre"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Correo electrónico"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Teléfono"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Haz clic aquí para expandir el editor de contacto."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Haz clic aquí para contraer el editor de contacto."</string>
<string name="content_description_directions" msgid="2686791825798189335">"instrucciones sobre cómo llegar a la ubicación"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Llamada reciente. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Haz clic para devolver la llamada."</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Tú: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts funciona mejor si ingresas el identificador de Hangouts de la persona en el campo de correo electrónico o teléfono."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Más campos"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Cambiar foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"No se pudo abrir el editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Se guarda en"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Actualmente los contactos se guardan en <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Presiona dos veces para elegir otra cuenta."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Más campos"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Cambiar foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"No se pudo abrir el editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Guardar en"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"En vista"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Actualmente, los contactos se guardan en <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Presiona dos veces para elegir una cuenta diferente."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Contactos vinculados (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Contacto vinculado</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Este contacto"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Posibles duplicados"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Es posible que estos contactos sean de la misma persona. Puedes vincularlos como un solo contacto."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Contactos vinculados"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Contactos vinculados"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"De tus cuentas"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Tomar una foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Todas las fotos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Elegir foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Desde <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Borrar <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Compartir contactos favoritos"</string>
<string name="share_contacts" msgid="8109287987498711664">"Compartir todos los contactos"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"No se pudieron compartir los contactos."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Imp./exp. contactos"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exportar contactos"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importar contactos"</string>
<string name="share_error" msgid="948429331673358107">"No es posible compartir este contacto."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"No hay contactos para compartir."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Borrar contactos frecuentes"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Seleccionar tarjeta SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Administrar cuentas"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importar/Exportar"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importar"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportar"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Números bloqueados"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"a través de <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> a través de <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index c20731c..5c84cc7 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contactos sugeridos"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Todos los contactos"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contactos enlazados"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Se ha eliminado a <xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Contactos eliminados</item>
<item quantity="one">Contacto eliminado</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"No hay ningún contacto con esta etiqueta"</string>
<string name="emptyAccount" msgid="6873962901497975964">"No hay contactos en esta cuenta"</string>
<string name="emptyMainList" msgid="2772242747899664460">"La lista de contactos está vacía"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Se ha guardado <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Contacto guardado"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contactos desvinculados"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"No se han podido guardar los cambios en el contacto"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Volver a llamar"</string>
<string name="returnCall" msgid="8171961914203617813">"Devolver llamada"</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_contact_photo" msgid="3387458082667894062">"foto de contacto"</string>
<string name="description_plus_button" msgid="515164827856229880">"más"</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="search_settings_description" msgid="2675223022992445813">"Nombres de tus contactos"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Fecha"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiqueta"</string>
<string name="change_photo" msgid="8530597935483526383">"Cambiar"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Foto principal"</string>
<string name="description_star" msgid="2605854427360036550">"favoritos"</string>
<string name="edit_contact" msgid="7529281274005689512">"Editar contacto"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"cerrar"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nombre"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Correo electrónico"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Teléfono"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Haz clic para ampliar el editor de contactos."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Haz clic para contraer el editor de contactos."</string>
<string name="content_description_directions" msgid="2686791825798189335">"indicaciones para llegar a la ubicación"</string>
@@ -280,15 +279,19 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"llamada reciente. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. haz clic para devolver la llamada"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Tú: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts funciona mejor si se introduce el identificador de Hangouts de la persona en el campo del correo electrónico o en el campo del teléfono."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Más campos"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Cambiar foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Error al abrir el editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Se guarda en"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Actualmente los contactos se guardan en <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Toca dos veces para seleccionar otra cuenta."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">Contactos enlazados (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">Contacto enlazado</item>
- </plurals>
+ <!-- no translation found for editor_more_fields (3630987771304393421) -->
+ <skip />
+ <!-- no translation found for editor_change_photo_content_description (754100561085306263) -->
+ <skip />
+ <!-- no translation found for editor_failed_to_load (1623639078580475818) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_title (4426337993307015833) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_read_only_title (8315171723911587719) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_description (3324358600570627740) -->
+ <skip />
+ <!-- no translation found for editor_linked_contacts_selector_title (249075501821303190) -->
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> contactos enlazados"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
<string name="quickcontact_suggestion_link_button" msgid="3244619714781727946">"VINCULAR CONTACTOS"</string>
@@ -309,10 +312,9 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Este contacto"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Posibles duplicados"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Es posible que estos contactos se correspondan a la misma persona. Puedes enlazarlos y crear un único contacto."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Contactos enlazados"</string>
+ <!-- no translation found for editor_linked_contacts_title (3077479751631492125) -->
+ <skip />
<string name="from_your_accounts" msgid="1746293107836889912">"De tus cuentas"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Hacer una foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Todas las fotos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Elegir foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"De <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Eliminar <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +549,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Compartir contactos favoritos"</string>
<string name="share_contacts" msgid="8109287987498711664">"Compartir todos los contactos"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"No se han podido compartir contactos."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importar/exportar contactos"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exportar contactos"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importar contactos"</string>
<string name="share_error" msgid="948429331673358107">"No se puede compartir este contacto."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"No hay contactos que compartir."</string>
@@ -562,7 +564,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Borrar frecuentes"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Seleccionar tarjeta SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Administrar cuentas"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importar/exportar"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importar"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportar"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Números bloqueados"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"con <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> con <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 944841e..bcdf146 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Soovitatud kontaktid"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Kõik kontaktid"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontaktid lingiti"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> on kustutatud"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kontaktid kustutati</item>
<item quantity="one">Kontakt kustutati</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Selle sildiga kontakte pole"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Kontol ei ole ühtki kontakti"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Teie kontaktiloend on tühi"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> on salvestatud"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt on salvestatud."</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontaktide linkimine tühistati"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Kontakti muudatusi ei õnnestunud salvestada"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Helista uuesti"</string>
<string name="returnCall" msgid="8171961914203617813">"Tagasihelistamine"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Kas lisada „<xliff:g id="EMAIL">%s</xliff:g>” kontaktidesse?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"kontakti foto"</string>
<string name="description_plus_button" msgid="515164827856229880">"pluss"</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="search_settings_description" msgid="2675223022992445813">"Teie kontaktide nimed"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Kuupäev"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Silt"</string>
<string name="change_photo" msgid="8530597935483526383">"Muuda"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Põhifoto"</string>
<string name="description_star" msgid="2605854427360036550">"lemmik"</string>
<string name="edit_contact" msgid="7529281274005689512">"Muuda kontakti"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"sule"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nimi"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-post"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Klõpsake kontaktiredigeerija laiendamiseks."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Klõpsake kontaktiredigeerija ahendamiseks."</string>
<string name="content_description_directions" msgid="2686791825798189335">"juhised asukohta"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"viimane kõne. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. klõpsake tagasihelistamiseks"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Teie: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts toimib paremini, kui sisestate isiku Hangoutsi koodi e-posti aadressi või telefoninumbri väljale."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Rohkem välju"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Foto vahetamine"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Redigeerija avamine nurjus."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Salvestamine asukohta"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Praegu salvestatakse kontole <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Teise konto valimiseks topeltpuudutage."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Rohkem välju"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Foto vahetamine"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Redigeerija avamine ebaõnnestus."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Salvestamine asukohta"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Vaatamine"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Praegu salvestatakse kontole <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Teise konto valimiseks topeltpuudutage."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Lingitud kontaktid (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Lingitud kontakt</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"See kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Võimalikud duplikaadid"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Need kontaktid võivad olla sama isik. Saate need linkida üheks kontaktiks."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Lingitud kontaktid"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Lingitud kontaktid"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Teie kontodelt"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Foto jäädvustamine"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Kõik fotod"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Foto valimine"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Kontolt <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Kustuta <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Jaga lemmikkontakte"</string>
<string name="share_contacts" msgid="8109287987498711664">"Jaga kõiki kontakte"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Kontaktide jagamine ebaõnnestus."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Kontaktide import/eksport"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Kontaktide eksportimine"</string>
<string name="dialog_import" msgid="2431698729761448759">"Kontaktide importimine"</string>
<string name="share_error" msgid="948429331673358107">"Seda kontakti ei saa jagada."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Jagamiseks ei ole ühtki kontakti."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Sagedaste kustutamine"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM-kaardi valimine"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Kontode haldamine"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Import/eksport"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importimine"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Eksportimine"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blokeeritud numbrid"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"allika <xliff:g id="SOURCE">%1$s</xliff:g> kaudu"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> allika <xliff:g id="SOURCE">%2$s</xliff:g> kaudu"</string>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index a33221b..c04b292 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Gomendatutako kontaktuak"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Kontaktu guztiak"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Estekatu dira kontaktuak"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Ezabatu da <xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Ezabatu dira kontaktuak</item>
<item quantity="one">Ezabatu da kontaktua</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Ez dago etiketa hau duen kontakturik"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Ez dago kontakturik kontu honetan"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Hutsik dago kontaktuen zerrenda"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Gorde da <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Gorde da kontaktua"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kendu da kontaktuen lotura"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Ezin izan dira gorde kontaktuari egindako aldaketak"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Deitu berriro"</string>
<string name="returnCall" msgid="8171961914203617813">"Itzuli deia"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" kontaktuetan gehitu?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"kontaktuaren argazkia"</string>
<string name="description_plus_button" msgid="515164827856229880">"gehi"</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> kontaktu"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Kontaktuen izenak"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Data"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiketa"</string>
<string name="change_photo" msgid="8530597935483526383">"Aldatu"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Argazki nagusia"</string>
<string name="description_star" msgid="2605854427360036550">"gogokoa"</string>
<string name="edit_contact" msgid="7529281274005689512">"Editatu kontaktua"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"itxi"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Izena"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Helbide elektronikoa"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefonoa"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Argazkia"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Egin klik kontaktuen editorea zabaltzeko."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Egin klik kontaktuen editorea tolesteko."</string>
<string name="content_description_directions" msgid="2686791825798189335">"kokapenerako jarraibideak"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"duela gutxiko deia. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. sakatu deitzeko"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Zu: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts-ek hobeto funtzionatzen du pertsonaren Hangouts identifikatzailea idazten baduzu helbide elektronikoaren edo telefonoaren eremuan."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Eremu gehiago"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Aldatu argazkia"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Ezin izan da ireki editorea."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Gorde hemen:"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> kontuan gordetzen dira kontaktuak. Beste kontu bat hautatzeko, sakatu birritan."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Eremu gehiago"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Aldatu argazkia"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Ezin izan da ireki editorea."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Gorde hemen:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Ikusgai"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> kontuan gordetzen dira kontaktuak. Beste kontu bat hautatzeko, sakatu birritan."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Lotutako kontaktuak (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">Lotutako kontaktu bat</item>
+ <item quantity="one">Lotutako kontaktua</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> kontaktu lotuta"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Kontaktu hau"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Baliteke bikoiztuak egotea"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Kontaktu hauek pertsona bera izan daitezke. Lotu egin ditzakezu, informazioa kontaktu bakarrean bilduta izateko."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Estekatutako kontaktuak"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Lotutako kontaktuak"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Zure kontuetatik"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Atera argazkia"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Argazki guztiak"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Aukeratu argazkia"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Kontua: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Ezabatu <xliff:g id="DATA_TYPE">%s </xliff:g> <xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Partekatu gogoko kontaktuak"</string>
<string name="share_contacts" msgid="8109287987498711664">"Partekatu kontaktu guztiak"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Ezin izan dira partekatu kontaktuak."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Inportatu edo esportatu kontaktuak"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Esportatu kontaktuak"</string>
<string name="dialog_import" msgid="2431698729761448759">"Inportatu kontaktuak"</string>
<string name="share_error" msgid="948429331673358107">"Ezin da kontaktua partekatu."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Ez dago parteka daitekeen kontakturik."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Garbitu sarri erabilitakoak"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Hautatu SIM txartela"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Kudeatu kontuak"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Inportatu/Esportatu"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Inportatu"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Esportatu"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blokeatutako zenbakiak"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> bidez"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="SOURCE">%2$s</xliff:g> bidez"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 21049ec..3c49f2e 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"مخاطبین پیشنهادی"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"همه مخاطبین"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"مخاطبین پیوند داده شدند"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> حذف شد"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">مخاطب حذف شد</item>
<item quantity="other">مخاطب حذف شد</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"هیچ مخاطبی با این برچسب وجود ندارد"</string>
<string name="emptyAccount" msgid="6873962901497975964">"هیچ مخاطبی در این حساب نیست"</string>
<string name="emptyMainList" msgid="2772242747899664460">"فهرست مخاطبینتان خالی است"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> ذخیره شد"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"مخاطب ذخیره شد"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"ارتباط مخاطبین لغو شد."</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"تغییرات مخاطب ذخیره نشد"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"تماس مجدد"</string>
<string name="returnCall" msgid="8171961914203617813">"برگرداندن تماس"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" به مخاطبین افزوده شود؟"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"عکس مخاطب"</string>
<string name="description_plus_button" msgid="515164827856229880">"به اضافه"</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="search_settings_description" msgid="2675223022992445813">"نامهای مخاطبین شما"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"تاریخ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"برچسب"</string>
<string name="change_photo" msgid="8530597935483526383">"تغییر"</string>
- <string name="primary_photo" msgid="8517942231868516999">"عکس اصلی"</string>
<string name="description_star" msgid="2605854427360036550">"مورد دلخواه"</string>
<string name="edit_contact" msgid="7529281274005689512">"ویرایش مخاطب"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"بستن"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"نام"</string>
<string name="header_email_entry" msgid="8666093061171624478">"رایانامه"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"تلفن"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"عکس"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"برای بزرگ کردن ویرایشگر مخاطب کلیک کنید."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"برای کوچک کردن ویرایشگر مخاطب کلیک کنید."</string>
<string name="content_description_directions" msgid="2686791825798189335">"مسیرها به مکان"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"تماس اخیر. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. برای بازگرداندن تماس کلیک کنید"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"شما: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"وقتی شناسه Hangouts شخص را در فیلد رایانامه یا فیلد تلفن وارد کنید، Hangouts بهتر کار میکند."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"فیلدهای بیشتر"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"تغییر عکس"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"ویرایشگر باز نشد."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"ذخیره در"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"درحال حاضر در <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ذخیره میشود. برای انتخاب حساب دیگری، دوضربه سریع بزنید."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one">مخاطبین پیوند داده شده (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="other">مخاطبین پیوند داده شده (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"فیلدهای بیشتر"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"تغییر عکس"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"ویرایشگر باز نشد."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"ذخیره در"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"درحال مشاهده"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"درحال حاضر در <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ذخیره میشود. برای انتخاب حساب دیگری، دوضربه سریع بزنید."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="one">مخاطب پیونددادهشده (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="other">مخاطب پیونددادهشده (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> مخاطب پیوند داده شده"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"این مخاطب"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"مخاطبین تکراری ممکن"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ممکن است این مخاطبها یک نفر باشند. میتوانید آنها را بهعنوان یک مخاطب به هم پیوند دهید."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"مخاطبهای پیوند داده شده"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"مخاطبهای پیونددادهشده"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"از حسابهای شما"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"عکس گرفتن"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"همه عکسها"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"انتخاب عکس"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"از <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"حذف <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"اشتراکگذاری مخاطبین دلخواه"</string>
<string name="share_contacts" msgid="8109287987498711664">"اشتراکگذاری همه مخاطبین"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"مخاطبین به اشتراک گذاشته نشدند."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"وارد کردن/صادر کردن مخاطبین"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"صادر کردن مخاطبین"</string>
<string name="dialog_import" msgid="2431698729761448759">"وارد کردن مخاطبین"</string>
<string name="share_error" msgid="948429331673358107">"این مخاطب قابل اشتراکگذاری نیست."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"مخاطبی برای اشتراکگذاری وجود ندارد."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"پاک کردن تماسهای مکرر"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"انتخاب سیمکارت"</string>
<string name="menu_accounts" msgid="1424330057450189074">"مدیریت حسابها"</string>
- <string name="menu_import_export" msgid="26217871113229507">"وارد کردن/صادر کردن"</string>
+ <string name="menu_import" msgid="6107961135813836467">"وارد کردن"</string>
+ <string name="menu_export" msgid="2658783911863503902">"صادر کردن"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"شمارههای مسدودشده"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"از طریق <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> از طریق <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index e5d8364..53d6c2f 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Ehdotetut yhteystiedot"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Kaikki yhteystiedot"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Yhteystiedot on linkitetty"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> poistettu"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Yhteystiedot poistettu</item>
<item quantity="one">Yhteystieto poistettu</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Tässä tunnisteessa ei ole yhteystietoja."</string>
<string name="emptyAccount" msgid="6873962901497975964">"Tällä tilillä ei ole yhteystietoja."</string>
<string name="emptyMainList" msgid="2772242747899664460">"Yhteystietoluettelo on tyhjä."</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> tallennettiin."</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Yhteystieto tallennettu"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Yhteystietojen linkitys on poistettu."</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Ei voitu tallentaa yhteystietojen muutoksia."</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Soita uudelleen"</string>
<string name="returnCall" msgid="8171961914203617813">"Soita takaisin"</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_contact_photo" msgid="3387458082667894062">"yhteystiedon valokuva"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Yhteystietojen nimet"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Päivämäärä"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Tunniste"</string>
<string name="change_photo" msgid="8530597935483526383">"Muuta"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Kontaktin kuva"</string>
<string name="description_star" msgid="2605854427360036550">"lisää suosikkeihin"</string>
<string name="edit_contact" msgid="7529281274005689512">"Muokkaa yhteystietoa"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"sulje"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nimi"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Sähköposti"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Puhelin"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Valokuva"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Laajenna yhteystietojen muokkausnäkymä klikkaamalla."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Tiivistä yhteystietojen muokkausnäkymä klikkaamalla."</string>
<string name="content_description_directions" msgid="2686791825798189335">"reittiohjeet sijaintiin"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Viimeisin puhelu. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Soita takaisin klikkaamalla."</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Sinä: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts toimii paremmin, kun kirjoitat käyttäjän Hangouts-tunnuksen sähköposti- tai puhelinnumerokenttään."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Lisää kenttiä"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Vaihda kuva"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Muokkausnäkymän avaaminen epäonnistui."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Tallennetaan tiliin"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Tälle hetkellä tallennetaan tilille <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Valitse eri tili kaksoisnapauttamalla."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">Yhdistetyt kontaktit (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">Yhdistetty kontakti</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Lisää kenttiä"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Vaihda kuva"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Muokkausnäkymän avaaminen epäonnistui."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Tallennetaan tilille"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Katselu"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Tallennetaan tilille <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Valitse toinen tili kaksoisnapauttamalla."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">Linkitetyt yhteystiedot (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="one">Linkitetty yhteystieto</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> yhdistettyä kontaktia"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Tämä kontakti"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mahdolliset kaksoiskappaleet"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Nämä yhteystiedot saattavat kuulua samalle henkilölle. Voit linkittää ne yhdeksi yhteystiedoksi."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Linkitetyt yhteystiedot"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Linkitetyt yhteystiedot"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Omista tileistäsi"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Ota kuva"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Kaikki kuvat"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Valitse valokuva"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Tili: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Poista <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Jaa suosikkiyhteystiedot"</string>
<string name="share_contacts" msgid="8109287987498711664">"Jaa kaikki yhteystiedot"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Yhteystietojen jakaminen epäonnistui."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Tuo/Vie yhteystietoja"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Vie yhteystiedot"</string>
<string name="dialog_import" msgid="2431698729761448759">"Tuo yhteystietoja"</string>
<string name="share_error" msgid="948429331673358107">"Yhteystieto ei jaettavissa"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Jaettavia yhteystietoja ei ole."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Tyhjennä usein käytetyt"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Valitse SIM-kortti"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Hallinnoi tilejä"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Tuo/Vie"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Tuo"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Vie"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Estetyt numerot"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"lähteestä: <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> lähteestä: <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 9d9cd52..bc93005 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contacts suggérés"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tous les contacts"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contacts associés"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> supprimé"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Contact supprimé</item>
<item quantity="other">Contacts supprimés</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Aucun contact avec cette étiquette"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Aucun contact dans ce compte"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Votre liste de contacts est vide"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> enregistré"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Contact enregistré."</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"La fusion des contacts a été annulée"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Impossible d\'enregistrer les modifications apportées au contact"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Renouveler l\'appel"</string>
<string name="returnCall" msgid="8171961914203617813">"Rappeler"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Ajouter \"<xliff:g id="EMAIL">%s</xliff:g>\" aux contacts?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"photo du contact"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Noms de vos contacts"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Date"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Étiquette"</string>
<string name="change_photo" msgid="8530597935483526383">"Modifier"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Photo principale"</string>
<string name="description_star" msgid="2605854427360036550">"favori"</string>
<string name="edit_contact" msgid="7529281274005689512">"Modifier un contact"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"fermer"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nom"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Courriel"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Téléphone"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Photo"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Cliquez pour développer l\'éditeur de contact."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Cliquez pour réduire l\'éditeur de contact."</string>
<string name="content_description_directions" msgid="2686791825798189335">"itinéraire vers le lieu"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Appel récent : <xliff:g id="CALL_TYPE">%s</xliff:g>, <xliff:g id="PHONE_NUMBER">%s</xliff:g>, <xliff:g id="DATE">%s</xliff:g>. Touchez l\'écran pour rappeler ce numéro."</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Vous : <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Google Hangout fonctionne mieux lorsque vous entrez l\'identifiant Hangout de la personne dans le champ de l\'adresse de courriel ou du numéro de téléphone."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Autres champs"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Changer de photo"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Échec d\'ouverture de l\'éditeur."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Enregistrer dans le compte"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Enregistrement en cours dans le compte <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Touchez deux fois pour choisir un autre compte."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Autres champs"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Changer de photo"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Échec de l\'ouverture de l\'éditeur."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Enregistrer dans le compte"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Compte affiché"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Enregistrement en cours dans le compte <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Touchez deux fois pour choisir un autre compte."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Contact associé (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Contacts associés (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ce contact"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Doublons possibles"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Ces contacts correspondent peut-être à la même personne. Vous pouvez les regrouper dans un seul contact."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Contacts associés"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Contacts associés"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"De vos comptes"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Prendre une photo"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Toutes les photos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Sélectionner une photo"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"De <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Effacer <xliff:g id="DATA_TYPE">%s </xliff:g> <xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Partager les contacts favoris"</string>
<string name="share_contacts" msgid="8109287987498711664">"Partager tous les contacts"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Échec du partage des contacts."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importer/Exporter des contacts"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exporter des contacts"</string>
<string name="dialog_import" msgid="2431698729761448759">"Téléverser des contacts"</string>
<string name="share_error" msgid="948429331673358107">"Impossible de partager ce contact."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Il n\'y a aucun contact à partager."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Effacer les contacts fréquents"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Sélectionner une carte SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Gérer les comptes"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importer/Exporter"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importer"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exporter"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Numéros bloqués"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 604422d..4088791 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contacts suggérés"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tous les contacts"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Les contacts ont bien été associés."</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> supprimé"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Contact supprimé.</item>
<item quantity="other">Contacts supprimés.</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Aucun contact n\'est associé à ce libellé"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Aucun contact dans ce compte"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Votre liste de contacts est vide"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> enregistré"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Contact enregistré."</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contacts dissociés"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Impossible d\'enregistrer les modifications apportées au contact"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Renouveler l\'appel"</string>
<string name="returnCall" msgid="8171961914203617813">"Rappeler"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Ajouter \"<xliff:g id="EMAIL">%s</xliff:g>\" aux contacts ?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"photo du contact"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Noms de vos contacts"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Date"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Ajouter libellé"</string>
<string name="change_photo" msgid="8530597935483526383">"Modifier"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Photo principale"</string>
<string name="description_star" msgid="2605854427360036550">"favori"</string>
<string name="edit_contact" msgid="7529281274005689512">"Modifier le contact"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"fermer"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nom"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Adresse e-mail"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Numéro de téléphone"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Photo"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Cliquez pour développer l\'éditeur de contact."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Cliquez pour réduire l\'éditeur de contact."</string>
<string name="content_description_directions" msgid="2686791825798189335">"itinéraire vers le lieu"</string>
@@ -280,15 +279,19 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Appel récent : <xliff:g id="CALL_TYPE">%s</xliff:g>, <xliff:g id="PHONE_NUMBER">%s</xliff:g>, <xliff:g id="DATE">%s</xliff:g>. Appuyez sur l\'écran pour rappeler ce numéro."</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Vous : <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Les Hangouts fonctionnent mieux si vous saisissez l\'identifiant Hangouts de la personne concernée dans le champ de l\'adresse e-mail ou du numéro de téléphone."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Autres champs"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Changer de photo"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Échec de l\'ouverture de l\'éditeur."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Enregistrement sur le compte"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Enregistrement en cours sur le compte <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Double-cliquez pour choisir un autre compte."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one">Contact associé (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="other">Contacts associés (<xliff:g id="COUNT">%d</xliff:g>)</item>
- </plurals>
+ <!-- no translation found for editor_more_fields (3630987771304393421) -->
+ <skip />
+ <!-- no translation found for editor_change_photo_content_description (754100561085306263) -->
+ <skip />
+ <!-- no translation found for editor_failed_to_load (1623639078580475818) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_title (4426337993307015833) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_read_only_title (8315171723911587719) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_description (3324358600570627740) -->
+ <skip />
+ <!-- no translation found for editor_linked_contacts_selector_title (249075501821303190) -->
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> contacts associés"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
<string name="quickcontact_suggestion_link_button" msgid="3244619714781727946">"ASSOCIER LES CONTACTS"</string>
@@ -309,10 +312,9 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ce contact"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Doublons potentiels"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Ces contacts correspondent peut-être à la même personne. Vous pouvez les regrouper dans un seul contact."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Contacts associés"</string>
+ <!-- no translation found for editor_linked_contacts_title (3077479751631492125) -->
+ <skip />
<string name="from_your_accounts" msgid="1746293107836889912">"De vos comptes"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Prendre une photo"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Toutes les photos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Sélectionner une photo"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Du compte <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Supprimer l\'élément \"<xliff:g id="DATA_TYPE">%s </xliff:g> – <xliff:g id="DATA_KIND">%s</xliff:g>\""</string>
@@ -547,7 +549,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Partager les contacts favoris"</string>
<string name="share_contacts" msgid="8109287987498711664">"Partager tous les contacts"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Échec du partage des contacts."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Import/Export contacts"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exporter les contacts"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importer des contacts"</string>
<string name="share_error" msgid="948429331673358107">"Impossible de partager ce contact."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Aucun contact à partager."</string>
@@ -562,7 +564,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Effacer les contacts fréquents"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Sélectionner une carte SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Gérer les comptes"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importer/Exporter"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importer"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exporter"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Numéros bloqués"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 2854fdf..3cefdaf 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contactos suxeridos"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Todos os contactos"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Ligáronse os contactos"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> eliminado"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Elimináronse os contactos</item>
<item quantity="one">Eliminouse o contacto</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Non hai ningún contacto con esta etiqueta"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Non hai ningún contacto nesta conta"</string>
<string name="emptyMainList" msgid="2772242747899664460">"A túa lista de contactos está baleira"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Gardouse a <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Gardouse o contacto"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Desligáronse os contactos"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Non se puideron gardar os cambios no contacto"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Chamar de novo"</string>
<string name="returnCall" msgid="8171961914203617813">"Devolver chamada"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Engadir \"<xliff:g id="EMAIL">%s</xliff:g>\" aos contactos?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"foto de contacto"</string>
<string name="description_plus_button" msgid="515164827856229880">"máis"</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="search_settings_description" msgid="2675223022992445813">"Nomes dos teus contactos"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Data"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiqueta"</string>
<string name="change_photo" msgid="8530597935483526383">"Cambiar"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Foto principal"</string>
<string name="description_star" msgid="2605854427360036550">"favorito"</string>
<string name="edit_contact" msgid="7529281274005689512">"Editar contacto"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"pechar"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nome"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Correo electrónico"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Teléfono"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Fai clic para ampliar o editor de contactos."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Fai clic para contraer o editor de contactos."</string>
<string name="content_description_directions" msgid="2686791825798189335">"indicacións para a localización"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"chamada recente. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. fai clic para devolver a chamada"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Ti: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts funciona mellor se introduces o identificador de Hangouts da persoa no campo do correo electrónico ou do teléfono."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Máis campos"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Cambiar foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Produciuse un erro ao abrir o editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Gardando en"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Gardando actualmente en <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Toca dúas veces para seleccionar unha conta diferente."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">Ligáronse os contactos (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">Ligouse o contacto</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Máis campos"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Cambiar foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Produciuse un erro ao abrir o editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Gardando en"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Visualizando"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Gardando actualmente en <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Toca dúas veces para seleccionar unha conta diferente."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">Contactos ligados (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="one">Contacto ligado</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"Ligáronse <xliff:g id="COUNT">%d</xliff:g> contactos"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Este contacto"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Posibles duplicados"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Estes contactos poden referirse á mesma persoa. Podes ligalos nun contacto único."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Contactos ligados"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Contactos ligados"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Das túas contas"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Tirar unha foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Todas as fotos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Escoller foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"De <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Eliminar <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Compartir contactos favoritos"</string>
<string name="share_contacts" msgid="8109287987498711664">"Compartir todos os contactos"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Erro ao compartir os contactos."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importar/exportar contactos"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exportar contactos"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importar contactos"</string>
<string name="share_error" msgid="948429331673358107">"Non se pode compartir este contacto."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Non hai ningún contacto para compartir."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Borrar frecuentes"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Seleccionar tarxeta SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Xestionar contas"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importar/exportar"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importar"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportar"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Números bloqueados"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"a través de <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> a través de <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml
index 0d36d99..718a986 100644
--- a/res/values-gu-rIN/strings.xml
+++ b/res/values-gu-rIN/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"સૂચવેલા સંપર્કો"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"તમામ સંપર્કો"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"સંપર્કો લિંક કર્યાં"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> ને કાઢી નાખ્યાં"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">સંપર્કો કાઢી નાખ્યા</item>
<item quantity="other">સંપર્કો કાઢી નાખ્યા</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"આ લેબલ સાથે કોઈ સંપર્કો નથી"</string>
<string name="emptyAccount" msgid="6873962901497975964">"આ એકાઉન્ટમાંં કોઈ સંંપર્કો નથી"</string>
<string name="emptyMainList" msgid="2772242747899664460">"તમારી સંપર્કોની સૂચિ ખાલી છે"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> સાચવ્યો"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"સંપર્ક સાચવ્યો"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"સંપર્કો અનલિંક કર્યા"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"ફેરફારો સાચવી શક્યાં નથી"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"ફરી કૉલ કરો"</string>
<string name="returnCall" msgid="8171961914203617813">"વળતો કૉલ"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" ને સંપર્કોમાં ઉમેરીએ?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"સંપર્ક ફોટો"</string>
<string name="description_plus_button" msgid="515164827856229880">"પ્લસ"</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="search_settings_description" msgid="2675223022992445813">"તમારા સંપર્કોના નામ"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"તારીખ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"લેબલ"</string>
<string name="change_photo" msgid="8530597935483526383">"બદલો"</string>
- <string name="primary_photo" msgid="8517942231868516999">"પ્રાથમિક ફોટો"</string>
<string name="description_star" msgid="2605854427360036550">"મનપસંદ"</string>
<string name="edit_contact" msgid="7529281274005689512">"સંપર્ક સંપાદિત કરો"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"બંધ કરો"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"નામ"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ઇમેઇલ"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ફોન"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ફોટો"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"સંપર્ક સંપાદક વિસ્તૃત કરવા માટે ક્લિક કરો."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"સંપર્ક સંપાદકને સંકુચિત કરવા માટે ક્લિક કરો."</string>
<string name="content_description_directions" msgid="2686791825798189335">"સ્થાન માટેનાં દિશા નિર્દેશો"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"તાજેતરનો કૉલ. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. કૉલ બેક કરવા ક્લિક કરો"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"તમે: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"જ્યારે તમે વ્યક્તિના Hangouts ઓળખકર્તાને ઇમેઇલ ફીલ્ડ અથવા ફોન ફીલ્ડમાં દાખલ કરો છો ત્યારે Hangouts વધુ સારું કામ કરે છે."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"વધુ ફીલ્ડ્સ"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ફોટો બદલો"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"સંપાદક ખોલવામાં નિષ્ફળ થયાં."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"આમાં સાચવી રહ્યાં છે"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"વર્તમાનમાં <xliff:g id="ACCOUNT_NAME">%s</xliff:g> પર સાચવી રહ્યાં છે. ભિન્ન એકાઉન્ટ ચૂંટવા માટે બે વાર ટેપ કરો."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"વધુ ફીલ્ડ્સ"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ફોટો બદલો"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"સંપાદક ખોલવામાં નિષ્ફળ થયાં."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"આમાં સાચવી રહ્યાં છે"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"જોવાઈ રહ્યું છે"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"હાલમાં <xliff:g id="ACCOUNT_NAME">%s</xliff:g> પર સાચવી રહ્યાં છે. અલગ એકાઉન્ટ ચૂંટવા માટે બે વાર ટૅપ કરો."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">લિંક કરેલ સંપર્કો (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">લિંક કરેલ સંપર્કો (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"આ સંપર્ક"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"સંભવિત ડુપ્લિકેટ્સ"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"આ સંપર્કો એક જ વ્યક્તિ હોઈ શકે છે. તમે તેઓને એકલ સંપર્ક તરીકે એકસાથે લિંક કરી શકો છો."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"લિંક કરેલ સંપર્કો"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"લિંક કરેલ સંપર્કો"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"તમારા એકાઉન્ટ્સમાંથી"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"એક ફોટો લો"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"બધા ફોટા"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ફોટો પસંદ કરો"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> માંથી"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> કાઢી નાખો"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"મનપસંદ સંપર્કોને શેર કરો"</string>
<string name="share_contacts" msgid="8109287987498711664">"તમામ સંપર્કોને શેર કરો"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"સંપર્કોને શેર કરવામાં નિષ્ફળ થયાં."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"સંપર્કો આયાત/નિકાસ કરો"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"સંપર્કો નિકાસ કરો"</string>
<string name="dialog_import" msgid="2431698729761448759">"સંપર્કો આયાત કરો"</string>
<string name="share_error" msgid="948429331673358107">"આ સંપર્ક શેર કરી શકાતો નથી."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"શેર કરવા માટે કોઇ સંપર્કો નથી"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"વારંવારના સાફ કરો"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM કાર્ડ પસંદ કરો"</string>
<string name="menu_accounts" msgid="1424330057450189074">"એકાઉન્ટ્સ સંચાલિત કરો"</string>
- <string name="menu_import_export" msgid="26217871113229507">"આયાત/નિકાસ કરો"</string>
+ <string name="menu_import" msgid="6107961135813836467">"આયાત કરો"</string>
+ <string name="menu_export" msgid="2658783911863503902">"નિકાસ કરો"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"અવરોધિત નંબરો"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> મારફતે"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> મારફતે <xliff:g id="DATE">%1$s</xliff:g> ના રોજ"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index feec009..46499fa 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"सुझाए गए संपर्क"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"सभी संपर्क"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"संपर्क लिंक कर दिए गए"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> को हटाया गया"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">संपर्क हटा दिए गए</item>
<item quantity="other">संपर्क हटा दिए गए</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"इस लेबल वाला कोई संपर्क नहीं"</string>
<string name="emptyAccount" msgid="6873962901497975964">"इस खाते में कोई संपर्क नहीं"</string>
<string name="emptyMainList" msgid="2772242747899664460">"आपकी संपर्क सूची खाली है"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> सहेजा गया"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"संपर्क सहेजा गया"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"संपर्क अनलिंक किए गए"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"संपर्क परिवर्तन सहेजे नहीं जा सके"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"फिर से कॉल करें"</string>
<string name="returnCall" msgid="8171961914203617813">"रिटर्न कॉल"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" को संपर्कों में जोड़ें?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"संपर्क का फ़ोटो"</string>
<string name="description_plus_button" msgid="515164827856229880">"जोड़ें"</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="search_settings_description" msgid="2675223022992445813">"आपके संपर्कों के नाम"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"दिनांक"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"लेबल"</string>
<string name="change_photo" msgid="8530597935483526383">"बदलें"</string>
- <string name="primary_photo" msgid="8517942231868516999">"प्राथमिक फ़ोटो"</string>
<string name="description_star" msgid="2605854427360036550">"पसंदीदा"</string>
<string name="edit_contact" msgid="7529281274005689512">"संपर्क संपादित करें"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"बंद करें"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"नाम"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ईमेल"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"फ़ोन"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"फ़ोटो"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"संपर्क संपादक को विस्तृत करने के लिए क्लिक करें."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"संपर्क संपादक को संक्षिप्त करने के लिए क्लिक करें."</string>
<string name="content_description_directions" msgid="2686791825798189335">"स्थान के लिए दिशा निर्देश"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"हाल ही का कॉल. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. पुनः कॉल करने के लिए क्लिक करें"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"आप: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts तब बेहतर कार्य करता है जब आप व्यक्ति के Hangouts पहचानकर्ता को ईमेल फ़ील्ड या फ़ोन फ़ील्ड में डालते हैं."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"अधिक फ़ील्ड"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"फ़ोटो बदलें"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"संपादक को खोलने में विफल रहा."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"इसमें सहेजें"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"वर्तमान में <xliff:g id="ACCOUNT_NAME">%s</xliff:g> में सहेजा जा रहा है. भिन्न खाता चुनने के लिए डबल-टैप करें."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"अधिक फ़ील्ड"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"फ़ोटो बदलें"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"संपादक को खोलने में विफल रहा."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"इसमें सहेजा जा रहा है"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"देखना"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"वर्तमान में <xliff:g id="ACCOUNT_NAME">%s</xliff:g> में सहेजा जा रहा है. भिन्न खाता चुनने के लिए डबल-टैप करें."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">लिंक किए गए संपर्क (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">लिंक किए गए संपर्क (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"यह संपर्क"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"संभावित प्रतिलिपि"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"हो सकता है कि ये संपर्क एक ही व्यक्ति हो. आप उन्हें एकल संपर्क के रूप में एक साथ लिंक कर सकते हैं."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"लिंक किए गए संपर्क"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"लिंक किए गए संपर्क"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"आपके खातों से"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"फ़ोटो लें"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"सभी फ़ोटो"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"फ़ोटो चुनें"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> की ओर से"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> हटाएं"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"पसंदीदा संपर्कों को साझा करें"</string>
<string name="share_contacts" msgid="8109287987498711664">"सभी संपर्कों को साझा करें"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"संपर्कों को साझा करना विफल रहा."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"संपर्क आयात/निर्यात करें"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"संपर्क निर्यात करें"</string>
<string name="dialog_import" msgid="2431698729761448759">"संपर्क आयात करें"</string>
<string name="share_error" msgid="948429331673358107">"यह संपर्क साझा नहीं किया जा सकता."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"साझा करने के लिए कोई भी संपर्क नहीं है."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"अक्सर किए जाने वाले साफ़ करें"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"सिम कार्ड चुनें"</string>
<string name="menu_accounts" msgid="1424330057450189074">"खाते प्रबंधित करें"</string>
- <string name="menu_import_export" msgid="26217871113229507">"आयात करें/निर्यात करें"</string>
+ <string name="menu_import" msgid="6107961135813836467">"आयात करें"</string>
+ <string name="menu_export" msgid="2658783911863503902">"निर्यात करें"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"अवरोधित नंबर"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> द्वारा"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> द्वारा <xliff:g id="DATE">%1$s</xliff:g>"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index ec4e8d4..f843015 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Predloženi kontakti"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Svi kontakti"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontakti su povezani"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Izbrisano: <xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Kontakti su izbrisani</item>
<item quantity="few">Kontakti su izbrisani</item>
@@ -114,6 +115,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Nema kontakata s tom oznakom"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Nema kontakata na ovom računu"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Popis kontakata je prazan"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Spremljeno: <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt je spremljen"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Prekinuta je veza kontakata"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Promjene kontakta ne mogu se spremiti"</string>
@@ -153,7 +155,6 @@
<string name="callAgain" msgid="3197312117049874778">"Zovi ponovo"</string>
<string name="returnCall" msgid="8171961914203617813">"Povratni poziv"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Dodati \"<xliff:g id="EMAIL">%s</xliff:g>\" kontaktima?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"fotografija kontakta"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Nazivi vaših kontakata"</string>
@@ -199,7 +200,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Datum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Oznaka"</string>
<string name="change_photo" msgid="8530597935483526383">"Promijeni"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Primarna slika"</string>
<string name="description_star" msgid="2605854427360036550">"favorit"</string>
<string name="edit_contact" msgid="7529281274005689512">"Uredi kontakt"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"zatvaranje"</string>
@@ -276,7 +276,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Ime"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-adresa"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fotografija"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kliknite da bi se alat za uređivanje kontakta proširio."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kliknite da bi se alat za uređivanje kontakta sažeo."</string>
<string name="content_description_directions" msgid="2686791825798189335">"upute do lokacije"</string>
@@ -287,12 +286,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"nedavni poziv. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. kliknite za uzvratni poziv"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Vi: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts funkcionira bolje kada unesete njegov identifikator osobe u polje e-adrese ili telefona."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Više polja"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Promijeni fotografiju"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Otvaranje alata za uređivanje nije uspjelo."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Spremanje na"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Trenutačno se sprema na <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dvaput dodirnite da biste odabrali neki drugi račun."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Više polja"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Promjena fotografije"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Otvaranje alata za uređivanje nije uspjelo."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Spremanje na"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Pregledavanje"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Trenutačno se sprema na <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dvaput dodirnite da biste odabrali neki drugi račun."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Povezani kontakti (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="few">Povezani kontakti (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Povezani kontakti (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -320,10 +320,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ovaj kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mogući duplikati"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Ti bi se kontakti mogli odnositi na istu osobu. Možete ih povezati u jedan kontakt."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Povezani kontakti"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Povezani kontakti"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"S vaših računa"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Snimi fotografiju"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Sve fotografije"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Odabir fotografije"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"S računa <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Izbriši <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -558,7 +556,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Dijeljenje omiljenih kontakata"</string>
<string name="share_contacts" msgid="8109287987498711664">"Dijeljenje svih kontakata"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Dijeljenje kontakata nije uspjelo."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Uvoz/izvoz kontakata"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Izvoz kontakata"</string>
<string name="dialog_import" msgid="2431698729761448759">"Uvezi kontakte"</string>
<string name="share_error" msgid="948429331673358107">"Ovaj kontakt nije moguće dijeliti."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Nema kontakata za dijeljenje."</string>
@@ -573,7 +571,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Briši često kontaktirane"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Odaberi SIM karticu"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Upravljanje računima"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Uvoz/izvoz"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Uvoz"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Izvoz"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blokirani brojevi"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"preko izvora <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> preko izvora <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 3599af4..8aa7f27 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Javasolt névjegyek"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Összes névjegy"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Névkegyek társítva"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> törölve"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Névjegyek törölve.</item>
<item quantity="one">Névjegy törölve.</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Nincs ilyen címkéjű névjegy"</string>
<string name="emptyAccount" msgid="6873962901497975964">"A fiókban nincsenek névjegyek"</string>
<string name="emptyMainList" msgid="2772242747899664460">"A névjegylista üres"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Mentette a következőt: <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Névjegy elmentve"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Névjegyek szétválasztva"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Nem sikerült menteni a névjegymódosításokat"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Hívásismétlés"</string>
<string name="returnCall" msgid="8171961914203617813">"Visszahívás"</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_contact_photo" msgid="3387458082667894062">"fotó a névjegyhez"</string>
<string name="description_plus_button" msgid="515164827856229880">"plusz"</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="search_settings_description" msgid="2675223022992445813">"Ismerősök nevei"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Dátum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Címke"</string>
<string name="change_photo" msgid="8530597935483526383">"Módosítás"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Elsődleges fotó"</string>
<string name="description_star" msgid="2605854427360036550">"kedvenc"</string>
<string name="edit_contact" msgid="7529281274005689512">"Névjegy szerkesztése"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"bezárás"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Név"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-mail"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fénykép"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kattintson a névjegyszerkesztő kibontásához."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kattintson a névjegyszerkesztő összecsukásához."</string>
<string name="content_description_directions" msgid="2686791825798189335">"útvonalterv a helyhez"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"hívás a közelmúltban. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. kattintson a visszahíváshoz"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Ön: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"A Hangouts jobban működik, ha a személy Hangouts-azonosítóját adja meg az e-mail vagy telefonszám mezőben."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"További mezők"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Fénykép lecserélése"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Nem sikerült megnyitni a szerkesztőt."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Mentés ide"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Jelenleg a(z) <xliff:g id="ACCOUNT_NAME">%s</xliff:g>fiókba menti a névjegyet. Koppintson duplán másik fiók kiválasztásához."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"További mezők"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Fotó lecserélése"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Nem sikerült megnyitni a szerkesztőt."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Mentés ide"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Megtekintés"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Jelenleg a(z) <xliff:g id="ACCOUNT_NAME">%s</xliff:g>fiókba menti a névjegyet. Koppintson duplán másik fiók kiválasztásához."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Társított névjegyek (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Társított névjegy</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ez a névjegy"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Lehetséges ismétlődések"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Lehet, hogy ezek a névjegyek ugyanahhoz a személyhez tartoznak. Lehetőség van a névjegyek egyesítésére."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Összekapcsolt névjegyek"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Összekapcsolt névjegyek"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Az Ön fiókjaiból"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Fotó készítése"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Az összes fotó"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Fotó kiválasztása"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Innen: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"A(z) <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> törlése"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Kedvenc névjegyek megosztása"</string>
<string name="share_contacts" msgid="8109287987498711664">"Az összes névjegy megosztása"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Nem sikerült megosztani a névjegyeket."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Névjegyek importálása/exportálása"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Névjegyek exportálása"</string>
<string name="dialog_import" msgid="2431698729761448759">"Névjegyek importálása"</string>
<string name="share_error" msgid="948429331673358107">"Ez a névjegy nem osztható meg."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Nincsenek megosztható névjegyek."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Gyakran keresettek törlése"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM kártya kiválasztása"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Fiókok kezelése"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importálás/exportálás"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importálás"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportálás"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Letiltott számok"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"- <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> - <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index e712213..ca585b9 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Առաջարկվող կոնտակները"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Բոլոր կոնտակտները"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Կոնտակտները միավորված են"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> կոնտակտը ջնջվեց"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Կոնտակտները ջնջվեցին</item>
<item quantity="other">Կոնտակտները ջնջվեցին</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Այս պիտակով կոնտակտներ չկան"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Այս հաշվում կոնտակտներ չկան"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Կոնտակտների ցանկը դատարկ է"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> կոնտակտը պահվեց"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Կոնտակտը պահվեց"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Կոնտակտներն անջատվեցին"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Չհաջողվեց պահել կոնտակտի տվյալների փոփոխությունները"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Կրկին զանգել"</string>
<string name="returnCall" msgid="8171961914203617813">"Հետ զանգել"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Ավելացնե՞լ «<xliff:g id="EMAIL">%s</xliff:g>»-ը կոնտակտներին:"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"կոնտակտի լուսանկարը"</string>
<string name="description_plus_button" msgid="515164827856229880">"գումարել"</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="search_settings_description" msgid="2675223022992445813">"Ձեր կոնտակտների անունները"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Ամսաթիվը"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Պիտակ"</string>
<string name="change_photo" msgid="8530597935483526383">"Փոխել"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Հիմնական լուսանկար"</string>
<string name="description_star" msgid="2605854427360036550">"ընտրյալ"</string>
<string name="edit_contact" msgid="7529281274005689512">"Փոփոխել կոնտակտը"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"փակել"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Անուն"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Էլփոստի հասցե"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Հեռախոս"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Լուսանկար"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Սեղմեք՝ կոնտակտների խմբագրիչը ընդարձակելու համար:"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Սեղմեք՝ կոնտակտների խմբագրիչը կոծկելու համար:"</string>
<string name="content_description_directions" msgid="2686791825798189335">"Երթուղիներ"</string>
@@ -280,15 +279,19 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"վերջին զանգը՝ <xliff:g id="CALL_TYPE">%s</xliff:g>, <xliff:g id="PHONE_NUMBER">%s</xliff:g>, <xliff:g id="DATE">%s</xliff:g>, սեղմեք՝ հետ զանգելու համար"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Դուք՝ <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts-ն ավելի լավ կաշխատի, եթե էլփոստի կամ հեռախոսի դաշտում մուտքագրեք Hangouts-ի օգտվողի նույնացուցիչը:"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Լրացուցիչ դաշտեր"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Փոխել լուսանկարը"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Չհաջողվեց բացել խմբագրիչը:"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Պահվում է հետևյալ հաշվում՝"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Ներկայումս պահվում է <xliff:g id="ACCOUNT_NAME">%s</xliff:g> հաշվում: Կրկնակի հպեք՝ մեկ այլ հաշիվ ընտրելու համար:"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one">Կապված կոնտակտներ (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="other">Կապված կոնտակտներ (<xliff:g id="COUNT">%d</xliff:g>)</item>
- </plurals>
+ <!-- no translation found for editor_more_fields (3630987771304393421) -->
+ <skip />
+ <!-- no translation found for editor_change_photo_content_description (754100561085306263) -->
+ <skip />
+ <!-- no translation found for editor_failed_to_load (1623639078580475818) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_title (4426337993307015833) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_read_only_title (8315171723911587719) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_description (3324358600570627740) -->
+ <skip />
+ <!-- no translation found for editor_linked_contacts_selector_title (249075501821303190) -->
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> կապված կոնտակտ"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
<string name="quickcontact_suggestion_link_button" msgid="3244619714781727946">"ՄԻԱԿՑԵԼ ԿՈՆՏԱԿՏՆԵՐԸ"</string>
@@ -309,10 +312,9 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Այս կոնտակտը"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Հնարավոր կրկնօրինակներ"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Այս կոնտակտները հնարավոր է միևնույն մարդու կոնտակտներ են։ Կարող եք դրանք միակցել և ստեղծել մեկ կոնտակտ։"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Միավորված կոնտակտներ"</string>
+ <!-- no translation found for editor_linked_contacts_title (3077479751631492125) -->
+ <skip />
<string name="from_your_accounts" msgid="1746293107836889912">"Ձեր հաշիվներից"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Լուսանկարել"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Բոլոր լուսանկարները"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Ընտրել լուսանկար"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> հաշվից"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Ջնջել <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +549,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Կիսվել նախընտրած կոնտակտներով"</string>
<string name="share_contacts" msgid="8109287987498711664">"Կիսվել բոլոր կոնտակտներով"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Չհաջողվեց կիսվել կոնտակտներով:"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Ներմուծել/արտահանել կոնտակտներ"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Արտահանել կոնտակտները"</string>
<string name="dialog_import" msgid="2431698729761448759">"Ներմուծել կոնտակտներ"</string>
<string name="share_error" msgid="948429331673358107">"Չհաջողվեց կիսվել կոնտակտով:"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Հասանելի կոնտակտներ չկան։"</string>
@@ -562,7 +564,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Մաքրել ամենաշատ զանգվածները"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Ընտրեք SIM քարտը"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Հաշիվների կառավարում"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Ներմուծել/արտահանել"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Ներմուծել"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Արտահանել"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Արգելափակված համարներ"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g>-ի միջոցով"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="SOURCE">%2$s</xliff:g>-ով"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 9834bdf..2ab3633 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Kontak yang disarankan"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Semua kontak"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontak ditautkan"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> dihapus"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kontak dihapus</item>
<item quantity="one">Kontak dihapus</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Tidak ada kontak dengan label ini"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Tidak ada kontak di akun ini"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Daftar kontak Anda kosong"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> disimpan"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontak disimpan"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontak dibatalkan tautannya"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Tidak dapat menyimpan perubahan kontak"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Hubungi sekali lagi"</string>
<string name="returnCall" msgid="8171961914203617813">"Panggilan kembali"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Tambahkan \"<xliff:g id="EMAIL">%s</xliff:g>\" ke kontak?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"foto kontak"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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> kontak"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Nama kontak Anda"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Tanggal"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Beri Label"</string>
<string name="change_photo" msgid="8530597935483526383">"Ganti"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Foto utama"</string>
<string name="description_star" msgid="2605854427360036550">"favorit"</string>
<string name="edit_contact" msgid="7529281274005689512">"Edit kontak"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"tutup"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nama"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Email"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telepon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Klik untuk meluaskan editor kontak."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Klik untuk menciutkan editor kontak."</string>
<string name="content_description_directions" msgid="2686791825798189335">"petunjuk arah ke lokasi"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"panggilan telepon terbaru. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. klik untuk menelepon balik"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Anda: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts bekerja lebih baik jika Anda memasukkan pengidentifikasi Hangouts orang tersebut ke bidang email atau bidang ponsel."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Bidang lainnya"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Ganti foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Gagal membuka editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Menyimpan ke"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Saat ini menyimpan ke <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Ketuk dua kali untuk memilih akun lain."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Bidang lainnya"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Ganti foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Gagal membuka editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Menyimpan ke"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Sedang dilihat"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Saat ini menyimpan ke <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Tap dua kali untuk memilih akun lain."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Kontak tertaut (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Kontak tertaut</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Kontak ini"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Kemungkinan duplikat"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Semua kontak ini mungkin orang yang sama. Anda dapat menautkannya sebagai satu kontak."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Kontak yang ditautkan"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Kontak yang ditautkan"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Dari akun Anda"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Jepret foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Semua foto"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Pilih foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Dari <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Hapus <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Bagikan kontak favorit"</string>
<string name="share_contacts" msgid="8109287987498711664">"Bagikan semua kontak"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Gagal membagikan kontak."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Impor/ekspor kontak"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Ekspor kontak"</string>
<string name="dialog_import" msgid="2431698729761448759">"Impor kontak"</string>
<string name="share_error" msgid="948429331673358107">"Kontak ini tidak dapat dibagi."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Tidak ada kontak untuk dibagikan."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Hapus yang sering"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Pilih kartu SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Kelola akun"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Impor/ekspor"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Impor"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Ekspor"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Nomor yang diblokir"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"melalui <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> melalui <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 6c88db6..f0a5feb 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Tillögur að tengiliðum"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Allir tengiliðir"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Tengiliðir tengdir saman"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> eytt"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Tengiliðum eytt</item>
<item quantity="other">Tengiliðum eytt</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Engir tengiliðir í þessum flokki"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Engir tengiliðir á þessum reikningi"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Listinn yfir tengiliði er tómur"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> vistuð/vistaður"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Tengiliður vistaður"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Tengiliðir aðskildir"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Ekki tókst að vista breytingar á tengiliðnum"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Hringja aftur"</string>
<string name="returnCall" msgid="8171961914203617813">"Hringja til baka"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Bæta „<xliff:g id="EMAIL">%s</xliff:g>“ við tengiliði?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"mynd tengiliðar"</string>
<string name="description_plus_button" msgid="515164827856229880">"plús"</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> tengiliðum"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Nöfn tengiliðanna þinna"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Dagsetning"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Flokkur"</string>
<string name="change_photo" msgid="8530597935483526383">"Breyta"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Aðalmynd"</string>
<string name="description_star" msgid="2605854427360036550">"uppáhald"</string>
<string name="edit_contact" msgid="7529281274005689512">"Breyta tengilið"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"loka"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nafn"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Netfang"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Sími"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Ljósmynd"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Smelltu til að stækka tengiliðaritilinn."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Smelltu til að draga saman tengiliðaritilinn."</string>
<string name="content_description_directions" msgid="2686791825798189335">"leiðarlýsing að stað"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"nýlegt símtal. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. smelltu til að hringja til baka"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Þú: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts virkar betur ef þú slærð Hangouts auðkenni viðkomandi inn í netfangsreitinn eða símanúmersreitinn."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Fleiri reitir"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Skipta um mynd"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Mistókst að opna ritilinn."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Vistar í"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Vistar núna á <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Ýttu tvisvar til að velja annan reikning."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Fleiri reitir"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Skipta um mynd"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Mistókst að opna ritilinn."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Vistar í"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Í skoðun"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Vistar núna á <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Ýttu tvisvar til að velja annan reikning."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Tengdir tengiliðir (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Tengdir tengiliðir (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Þessi tengiliður"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mögulegar tvítekningar"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Hugsanlegt er að þessir tengiliðir séu sama manneskjan. Þú getur tengt þá saman í einn tengilið."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Samtengdir tengiliðir"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Tengdir tengiliðir"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Af reikningunum þínum"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Taka mynd"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Allar myndir"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Velja mynd"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Af <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Eyða <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Deila eftirlætistengiliðum"</string>
<string name="share_contacts" msgid="8109287987498711664">"Deila öllum tengiliðum"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Ekki tókst að deila tengiliðum."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Tengiliðir fluttir inn/út"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Flytja út tengiliði"</string>
<string name="dialog_import" msgid="2431698729761448759">"Flytja inn tengiliði"</string>
<string name="share_error" msgid="948429331673358107">"Ekki er hægt að deila þessum tengilið."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Engir tengiliðir til að deila."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Hreinsa algenga tengiliði"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Veldu SIM-kort"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Umsjón með reikningum"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Flytja inn/út"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Flytja inn"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Flytja út"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Númer á bannlista"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"í gegnum <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> í gegnum <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 7eb1936..29ec1ad 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contatti suggeriti"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tutti i contatti"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contatti collegati"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> eliminato"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Contatti eliminati</item>
<item quantity="one">Contatto eliminato</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Nessun contatto con questa etichetta"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Nessun contatto in questo account"</string>
<string name="emptyMainList" msgid="2772242747899664460">"L\'elenco dei contatti è vuoto"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> - salvato"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Contatto salvato"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contatti scollegati"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Impossibile salvare le modifiche al contatto"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Richiama"</string>
<string name="returnCall" msgid="8171961914203617813">"Chiama numero"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Aggiungi \"<xliff:g id="EMAIL">%s</xliff:g>\" ai contatti?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"foto contatto"</string>
<string name="description_plus_button" msgid="515164827856229880">"più"</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="search_settings_description" msgid="2675223022992445813">"I nomi dei tuoi contatti"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Data"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etichetta"</string>
<string name="change_photo" msgid="8530597935483526383">"Modifica"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Foto principale"</string>
<string name="description_star" msgid="2605854427360036550">"preferiti"</string>
<string name="edit_contact" msgid="7529281274005689512">"Modifica contatto"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"chiudi"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nome"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Email"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefono"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Fai clic per espandere l\'editor contatti."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Fai clic per comprimere l\'editor contatti."</string>
<string name="content_description_directions" msgid="2686791825798189335">"indicazioni per la posizione"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"chiamata recente. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. fai clic per richiamare"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Tu: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts funziona meglio se inserisci l\'identificatore Hangouts della persona nel campo dell\'indirizzo email o del numero di telefono."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Altri campi"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Cambia foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Impossibile aprire l\'editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Salvataggio in:"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"I contatti vengono salvati in <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Tocca due volte per scegliere un altro account."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Altri campi"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Cambia foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Impossibile aprire l\'editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Salvataggio in:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Visualizzazione"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"I contatti vengono salvati in <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Tocca due volte per scegliere un altro account."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Contatti collegati (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Contatto collegato</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Questo contatto"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Possibili duplicati"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Questi contatti potrebbero riguardare la stessa persona. Puoi collegarli per creare un unico contatto."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Contatti collegati"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Contatti collegati"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Dei tuoi account"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Scatta una foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Tutte le foto"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Scegli foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Da <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Elimina <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Condividi i contatti preferiti"</string>
<string name="share_contacts" msgid="8109287987498711664">"Condividi tutti i contatti"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Impossibile condividere i contatti."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importa/esporta contatti"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Esporta contatti"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importa contatti"</string>
<string name="share_error" msgid="948429331673358107">"Questo contatto non può essere condiviso."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Nessun contatto da condividere."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Cancella frequenti"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Seleziona scheda SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Gestisci account"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importa/esporta"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importa"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Esporta"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Numeri bloccati"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"tramite <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> tramite <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 585cbd2..365d9a0 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"אנשי קשר מוצעים"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"כל אנשי הקשר"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"אנשי הקשר קושרו"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"מחקת את <xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="two">אנשי קשר נמחקו</item>
<item quantity="many">אנשי קשר נמחקו</item>
@@ -117,6 +118,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"אין אנשי קשר עם התווית הזו"</string>
<string name="emptyAccount" msgid="6873962901497975964">"אין אנשי קשר בחשבון הזה"</string>
<string name="emptyMainList" msgid="2772242747899664460">"רשימת אנשי הקשר שלך ריקה"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> נשמר/ה"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"איש הקשר נשמר"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"בוטל הקישור לאנשי קשר"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"לא ניתן היה לשמור את השינויים באיש הקשר"</string>
@@ -159,7 +161,6 @@
<string name="callAgain" msgid="3197312117049874778">"התקשר שוב"</string>
<string name="returnCall" msgid="8171961914203617813">"התקשר בחזרה"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"להוסיף את \"<xliff:g id="EMAIL">%s</xliff:g>\" לאנשי הקשר?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"תמונה של איש קשר"</string>
<string name="description_plus_button" msgid="515164827856229880">"חיבור"</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="search_settings_description" msgid="2675223022992445813">"השמות של אנשי הקשר"</string>
@@ -206,7 +207,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"תאריך"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"תווית"</string>
<string name="change_photo" msgid="8530597935483526383">"שנה"</string>
- <string name="primary_photo" msgid="8517942231868516999">"תמונה ראשית"</string>
<string name="description_star" msgid="2605854427360036550">"מועדף"</string>
<string name="edit_contact" msgid="7529281274005689512">"ערוך איש קשר"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"סגירה"</string>
@@ -283,7 +283,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"שם"</string>
<string name="header_email_entry" msgid="8666093061171624478">"אימייל"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"טלפון"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"תמונה"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"לחץ כדי להרחיב את עורך אנשי הקשר."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"לחץ כדי לכווץ את עורך אנשי הקשר."</string>
<string name="content_description_directions" msgid="2686791825798189335">"הנחיות הגעה למיקום"</string>
@@ -294,12 +293,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"שיחה אחרונה. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. לחץ כדי להתקשר חזרה"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"אתה: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts פועל טוב יותר כשאתה מזין את מזהה ה-Hangouts של המשתמש בשדה האימייל או בשדה הטלפון."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"עוד שדות"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"החלפת תמונה"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"פתיחת העורך נכשלה."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"שומר ב-"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"נשמר כרגע ב-<xliff:g id="ACCOUNT_NAME">%s</xliff:g>. הקש פעמיים כדי לבחור חשבון אחר."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"שדות נוספים"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"החלף תמונה"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"לא ניתן היה לפתוח את העורך."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"חשבון לשמירה"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"מוצג"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"החשבון לשמירה הוא <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. הקש פעמיים כדי לבחור חשבון אחר."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="two">שני אנשי קשר מקושרים (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="many">אנשי קשר מקושרים (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">אנשי קשר מקושרים (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -331,10 +331,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"איש קשר זה"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"כפילויות אפשריות"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ייתכן שאנשי הקשר האלו הם אותו אדם. תוכל לקשר אותם ביחד כאיש קשר יחיד."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"אנשי קשר שקושרו"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"אנשי קשר מקושרים"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"מהחשבונות שלך"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"צלם תמונה"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"כל התמונות"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"בחירת תמונה"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"מאת <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"מחק את <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -569,7 +567,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"שתף את אנשי הקשר המועדפים"</string>
<string name="share_contacts" msgid="8109287987498711664">"שתף את כל אנשי הקשר"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"לא ניתן היה לשתף את אנשי הקשר."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"יבא/יצא אנשי קשר"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"ייצא אנשי קשר"</string>
<string name="dialog_import" msgid="2431698729761448759">"יבוא אנשי קשר"</string>
<string name="share_error" msgid="948429331673358107">"לא ניתן לשתף איש קשר זה."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"אין אנשי קשר שניתן לשתף."</string>
@@ -584,7 +582,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"מחק אנשי קשר קבועים"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"בחר כרטיס SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"ניהול החשבונות"</string>
- <string name="menu_import_export" msgid="26217871113229507">"ייבוא/ייצוא"</string>
+ <string name="menu_import" msgid="6107961135813836467">"ייבא"</string>
+ <string name="menu_export" msgid="2658783911863503902">"ייצא"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"מספרים חסומים"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"באמצעות <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> באמצעות <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index f79113c..cb6bec4 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"連絡先候補"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"すべての連絡先"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"連絡先をリンクしました"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> さんを削除しました"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">連絡先を削除しました</item>
<item quantity="one">連絡先を削除しました</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"このラベルを使用している連絡先はいません"</string>
<string name="emptyAccount" msgid="6873962901497975964">"このアカウントに保存されている連絡先はありません"</string>
<string name="emptyMainList" msgid="2772242747899664460">"連絡先リストが空です"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> さんを保存しました"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"連絡先を保存しました"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"連絡先のリンクを解除しました"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"連絡先の変更を保存できませんでした"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"再発信"</string>
<string name="returnCall" msgid="8171961914203617813">"発信"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"<xliff:g id="EMAIL">%s</xliff:g> を連絡先に追加しますか?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"連絡先の写真"</string>
<string name="description_plus_button" msgid="515164827856229880">"プラス"</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="search_settings_description" msgid="2675223022992445813">"連絡先の名前"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"日付"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"ラベル"</string>
<string name="change_photo" msgid="8530597935483526383">"変更"</string>
- <string name="primary_photo" msgid="8517942231868516999">"メインの写真"</string>
<string name="description_star" msgid="2605854427360036550">"お気に入り"</string>
<string name="edit_contact" msgid="7529281274005689512">"連絡先の編集"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"閉じる"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"名前"</string>
<string name="header_email_entry" msgid="8666093061171624478">"メール"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"電話"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"写真"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"クリックして連絡先エディターを展開します。"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"クリックして連絡先エディターを折りたたみます。"</string>
<string name="content_description_directions" msgid="2686791825798189335">"場所までの経路"</string>
@@ -280,13 +279,14 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"最近の通話。<xliff:g id="CALL_TYPE">%s</xliff:g>。<xliff:g id="PHONE_NUMBER">%s</xliff:g>。<xliff:g id="DATE">%s</xliff:g>。折り返し電話するにはタップしてください。"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"あなた: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"ハングアウトを使いやすくするには、相手のハングアウトIDをメールアドレス欄または電話番号欄に入力します。"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"他の項目"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"写真を変更"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"エディタを開けませんでした。"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"保存先"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"現在の保存先は<xliff:g id="ACCOUNT_NAME">%s</xliff:g>です。別のアカウントを選択するにはダブルタップします。"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">リンクされた連絡先(<xliff:g id="COUNT">%d</xliff:g>件)</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"その他の項目"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"写真を変更"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"エディタを開けませんでした。"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"保存先"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"表示中"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"現在、連絡先は <xliff:g id="ACCOUNT_NAME">%s</xliff:g> に保存される設定になっています。ダブルタップすると別のアカウントを選択できます。"</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">リンクされた連絡先(<xliff:g id="COUNT">%d</xliff:g> 件)</item>
<item quantity="one">リンクされた連絡先</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g>件のリンクされた連絡先"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"この連絡先"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"重複の可能性"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"これらの連絡先は同一人物である可能性があります。リンクして1つの連絡先にまとめることができます。"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"リンクした連絡先"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"リンクされた連絡先"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"アカウントの写真"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"写真を撮る"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"すべての写真"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"写真の選択"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"送信元: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>を削除"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"お気に入りの連絡先を共有"</string>
<string name="share_contacts" msgid="8109287987498711664">"すべての連絡先を共有"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"連絡先を共有できませんでした。"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"連絡先のインポート/エクスポート"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"連絡先のエクスポート"</string>
<string name="dialog_import" msgid="2431698729761448759">"連絡先のインポート"</string>
<string name="share_error" msgid="948429331673358107">"この連絡先は共有できません。"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"共有する連絡先がありません。"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"よく使う連絡先のクリア"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIMカードを選択"</string>
<string name="menu_accounts" msgid="1424330057450189074">"アカウントを管理"</string>
- <string name="menu_import_export" msgid="26217871113229507">"インポート/エクスポート"</string>
+ <string name="menu_import" msgid="6107961135813836467">"インポート"</string>
+ <string name="menu_export" msgid="2658783911863503902">"エクスポート"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"ブロックした番号"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g>経由"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g>、<xliff:g id="SOURCE">%2$s</xliff:g>経由"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 25d116a..24a74d7 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"შემოთავაზებული კონტაქტები"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"ყველა კონტაქტი"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"კონტაქტები მიება"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> წაიშალა"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">კონტაქტი წაიშალა</item>
<item quantity="one">კონტაქტი წაიშალა</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"კონტაქტი ამ ლეიბლით არ არსებობს"</string>
<string name="emptyAccount" msgid="6873962901497975964">"ამ ანგარიშში კონტაქტები არ არის"</string>
<string name="emptyMainList" msgid="2772242747899664460">"თქვენი კონტაქტების სია ცარიელია"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> შენახულია"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"კონტაქტი შენახულია"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"კონტაქტების მიბმა გაუქმდა"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"კონტაქტის ცვლილებების შენახვა ვერ მოხერხდა"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"დარეკვა ხელახლა"</string>
<string name="returnCall" msgid="8171961914203617813">"გადარეკვა"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"„<xliff:g id="EMAIL">%s</xliff:g>“ დაემატოს კონტაქტებს?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"კონტაქტის ფოტო"</string>
<string name="description_plus_button" msgid="515164827856229880">"პლუსი"</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="search_settings_description" msgid="2675223022992445813">"თქვენი კონტაქტების სახელები"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"თარიღი"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"ლეიბლი"</string>
<string name="change_photo" msgid="8530597935483526383">"შეცვლა"</string>
- <string name="primary_photo" msgid="8517942231868516999">"პირველადი ფოტო"</string>
<string name="description_star" msgid="2605854427360036550">"რჩეული"</string>
<string name="edit_contact" msgid="7529281274005689512">"კონტაქტის რედაქტირება"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"დახურვა"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"სახელი"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ელფოსტა"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ტელეფონი"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ფოტო"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"კონტაქტების რედაქტირების გაფართოებისათვის, დააჭირეთ."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"კონტაქტების რედაქტირების შეკუმშვისათვის, დააჭირეთ."</string>
<string name="content_description_directions" msgid="2686791825798189335">"მიმართულებები მდებარეობამდე"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"ბოლო ზარი. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. დააწკაპუნეთ გადასარეკად"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"თქვენ: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangout უკეთესად იმუშავებს იმ შემთხვევაში, თუ ტელეფონის ან ელფოსტის ველში პიროვნების Hangout-ის ინდენტიფიკატორს შეიყვანთ."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"სხვა ველები"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ფოტოს გამოცვლა"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"რედაქტორი ვერ გაიხსნა."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"ინახება აქ:"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"ამჟამად ინახება აქ: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. ორმაგად შეეხეთ სხვა ანგარიშის ასარჩევად."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">მიბმული კონტაქტები (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">მიბმული კონტაქტი</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"სხვა ველები"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ფოტოს შეცვლა"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"რედაქტორი ვერ გაიხსნა."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"ინახება აქ:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"ნახულობთ"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"ამჟამად ინახება <xliff:g id="ACCOUNT_NAME">%s</xliff:g>-ში. ორმაგად შეეხეთ სხვა ანგარიშის ასარჩევად."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">დაკავშირებული კონტაქტები (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="one">დაკავშირებული კონტაქტი</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> მიბმული კონტაქტი"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"ეს კონტაქტი"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"შესაძლო დუბლიკატები"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ეს კონტაქტები შეიძლება ერთი და იგივე პიროვნება იყოს. შეგიძლიათ მიბმის მეშვეობით მათი ერთ კონტაქტად გაერთიანება."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"მიბმული კონტაქტები"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"დაკავშირებული კონტაქტები"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"თქვენი ანგარიშებიდან"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ფოტოს გადაღება"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"ყველა ფოტო"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"აირჩიეთ ფოტო"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g>-დან"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"წაიშალოს <xliff:g id="DATA_KIND">%s</xliff:g> (<xliff:g id="DATA_TYPE">%s </xliff:g>)"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"რჩეული კონტაქტების გაზიარება"</string>
<string name="share_contacts" msgid="8109287987498711664">"ყველა კონტაქტის გაზიარება"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"კონტაქტების გაზიარება ვერ მოხერხდა."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"კონტაქტების იმპორტი/ექსპორტი"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"კონტაქტების ექსპორტი"</string>
<string name="dialog_import" msgid="2431698729761448759">"კონტაქტების იმპორტი"</string>
<string name="share_error" msgid="948429331673358107">"ამ კონტაქტის გაზიარება შეუძლებელია."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"გასაზიარებელი კონტაქტები არ არის."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"ხშირი კონტაქტების წაშლა"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"აირჩიეთ SIM ბარათი"</string>
<string name="menu_accounts" msgid="1424330057450189074">"ანგარიშების მართვა"</string>
- <string name="menu_import_export" msgid="26217871113229507">"იმპორტი/ექსპორტი"</string>
+ <string name="menu_import" msgid="6107961135813836467">"იმპორტი"</string>
+ <string name="menu_export" msgid="2658783911863503902">"ექსპორტი"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"დაბლოკილი ნომრები"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g>-ის საშუალებით"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="SOURCE">%2$s</xliff:g>-ის მეშვეობით"</string>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 05312a9..65a2f00 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Ұсынылған контактілер"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Барлық контактілер"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Контактілер байланыстырылды"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> жойылған"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Контактілер жойылды</item>
<item quantity="one">Контакт жойылды</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Осы белгісі бар контактілер жоқ"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Бұл есептік жазбада контактілер жоқ"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Контактілер тізімі бос"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> сақталды"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Контакт сақталды"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Контактілердің байланысы жойылды"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Контакт өзгерістері сақталмады"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Қайта қоңырау шалу"</string>
<string name="returnCall" msgid="8171961914203617813">"Қоңырауды қайтару"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" контактілерге қосылсын ба?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"контакт фотосуреті"</string>
<string name="description_plus_button" msgid="515164827856229880">"қосу"</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="search_settings_description" msgid="2675223022992445813">"Контактілеріңіздің аттары"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Күні"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Белгі"</string>
<string name="change_photo" msgid="8530597935483526383">"Өзгерту"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Негізгі фотосурет"</string>
<string name="description_star" msgid="2605854427360036550">"сүйікті"</string>
<string name="edit_contact" msgid="7529281274005689512">"Контактіні жөндеу"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"жабу"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Аты"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Электрондық пошта"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Телефон"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Фотосурет"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Контактілер өңдегішті кеңейту үшін басыңыз."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Контактілер өңдегішті тасалау үшін басыңыз."</string>
<string name="content_description_directions" msgid="2686791825798189335">"орынға бағыттар"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"жақындағы қоңырау. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. кері қоңырау шалу үшін басыңыз"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Сіз: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts қолданбасы электрондық пошта өрісіне немесе телефон өрісіне адамның Hangouts идентификаторын енгізгенде жақсырақ жұмыс істейді."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Қалған өрістер"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Фотосуретті өзгерту"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Өңдегішті ашу сәтсіз аяқталды."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Келесіге сақтау"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Қазіргі уақытта <xliff:g id="ACCOUNT_NAME">%s</xliff:g> есептік жазбасына сақталуда. Басқа есептік жазбаны таңдау үшін екі рет түртіңіз."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">Байланыстырылған контактілер (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">Байланыстырылған контакт</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Тағы"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Суретті өзгерту"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Өңдегішті ашу мүмкін болмады."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Cақтау:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Каралуда"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Қазір <xliff:g id="ACCOUNT_NAME">%s</xliff:g> есептік жазбасына сақталуда. Басқа есептік жазбаны таңдау үшін, екі рет түртіңіз."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">Байланысты контактілер (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="one">Байланысты контакт</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> байланыстырылған контакт"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Осы контакт"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Ықтимал көшірмелер"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Бұл контактілер бір адам болуы мүмкін. Оларды бір контактіге біріктіруге болады."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Байланыстырылған контактілер"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Байланысты контактілер"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Есептік жазбаларыңыздан"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Фотосурет түсіру"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Барлық фотосуреттер"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Фотосуретті таңдау"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Кімнен: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> жою"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Таңдаулы контактілерді бөлісу"</string>
<string name="share_contacts" msgid="8109287987498711664">"Барлық контактілерді бөлісу"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Контактілерді бөлісу сәтсіз аяқталды."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Контактілерді импорттау/экспорттау"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Контактілерді экспорттау"</string>
<string name="dialog_import" msgid="2431698729761448759">"Контактілерді импорттау"</string>
<string name="share_error" msgid="948429331673358107">"Бұл контактіні бөлісу мүмкін болмады"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Бөлісетін контактілер жоқ."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Жиі хабарласатындарды өшіру"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM картасын таңдау"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Есептік жазбаларды басқару"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Импорттау/экспорттау"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Импорттау"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Экспорттау"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Бөгелген нөмірлер"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> арқылы"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="SOURCE">%2$s</xliff:g> арқылы"</string>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 02e32f1..fedfcbf 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"ទំនាក់ទំនងដែលបានស្នើ"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"ទំនាក់ទំនងទាំងអស់"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"បានតភ្ជាប់ទំនាក់ទំនង"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"បានលុប <xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">បានលុបទំនាក់ទំនង</item>
<item quantity="one">បានលុបទំនាក់ទំនង</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"មិនមានទំនាក់ទំនងដែលមានស្លាកនេះ"</string>
<string name="emptyAccount" msgid="6873962901497975964">"មិនមានទំនាក់ទំនងនៅក្នុងគណនីនេះទេ"</string>
<string name="emptyMainList" msgid="2772242747899664460">"បញ្ជីទំនាក់ទំនងរបស់អ្នកគឺទទេ"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"បានរក្សាទុក <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"បានរក្សាទុកទំនាក់ទំនង"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"ទំនាក់ទំនងដែលមិនបានតភ្ជាប់"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"មិនអាចរក្សាទុកការប្ដូរទំនាក់ទំនងបានទេ"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"ហៅម្ដងទៀត"</string>
<string name="returnCall" msgid="8171961914203617813">"ហៅទៅវិញ"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"បញ្ចូល \"<xliff:g id="EMAIL">%s</xliff:g>\" ទៅក្នុងទំនាក់ទំនង?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"រូបថតទំនាក់ទំនង"</string>
<string name="description_plus_button" msgid="515164827856229880">"បូក"</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="search_settings_description" msgid="2675223022992445813">"ឈ្មោះនៃទំនាក់ទំនងរបស់អ្នក"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"កាលបរិច្ឆេទ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"ស្លាក"</string>
<string name="change_photo" msgid="8530597935483526383">"ផ្លាស់ប្ដូរ"</string>
- <string name="primary_photo" msgid="8517942231868516999">"រូបថតបឋម"</string>
<string name="description_star" msgid="2605854427360036550">"សំណព្វ"</string>
<string name="edit_contact" msgid="7529281274005689512">"កែទំនាក់ទំនង"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"បិទ"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"ឈ្មោះ"</string>
<string name="header_email_entry" msgid="8666093061171624478">"អ៊ីមែល"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ទូរស័ព្ទ"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"រូបថត"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"ចុចដើម្បីពង្រីកកម្មវិធីកែប្រែទំនាក់ទំនង។"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"ចុចដើម្បីបង្រួមកម្មវិធីកែប្រែទំនាក់ទំនង។"</string>
<string name="content_description_directions" msgid="2686791825798189335">"ទិសដៅទៅទីតាំង"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"ការហៅថ្មី។ <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. ចុចដើម្បីហៅត្រឡប់"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"អ្នក៖ <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts ដំណើរការបានយ៉ាងល្អ នៅពេលដែលអ្នកបញ្ចូលអត្តសញ្ញាណ Hangouts របស់បុគ្គលនោះទៅក្នុងប្រអប់អ៊ីម៉ែល ឬប្រអប់លេខទូរស័ព្ទ។"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"ប្រអប់ច្រើនទៀត"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ប្ដូររូបថត"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"បានបរាជ័យក្នុងការបើកកម្មវិធីកែ"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"រក្សាទុកក្នុង"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"បច្ចុប្បន្នកំពុងរក្សាទុកទៅ <xliff:g id="ACCOUNT_NAME">%s</xliff:g>។ សូូមប៉ះពីរដងដើម្បីជ្រើសគណនីផ្សេងទៀត។"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"ប្រឡោះបញ្ចូលបន្ថែម"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ប្ដូររូបថត"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"មិនអាចបើកកម្មវិធីកែសម្រួលបានទេ។"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"រក្សាទុកទៅ"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"កំពុងមើល"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"កំពុងរក្សាទុកទៅ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> នៅពេលនេះ។ សូមចុចពីរដង ដើម្បីជ្រើសយកគណនីផ្សេង។"</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">ទំនាក់ទំនងដែលបានតភ្ជាប់ (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">ទំនាក់ទំនងដែលបានតភ្ជាប់ 1</item>
+ <item quantity="one">ទំនាក់ទំនងដែលបានតភ្ជាប់</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"ទំនាក់ទំនងដែលបានតភ្ជាប់ <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"ទំនាក់ទំនងនេះ"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"អាចនឹងស្ទួន"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ទំនាក់ទំនងទាំងនេះប្រហែលជាមនុស្សតែមួយ។ អ្នកអាចតភ្ជាប់ពួកគេជាមួយគ្នាឲ្យទៅជាទំនាក់ទំនងទោលបាន។"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"ទំនាក់ទំនងដែលបានតភ្ជាប់"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"ទំនាក់ទំនងដែលបានតភ្ជាប់"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"ពីគណនីរបស់អ្នក"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ថតរូប"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"រូបថតទាំងអស់"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ជ្រើសរើសរូបថត"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"ពី <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"លុប <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"ចែករំលែកទំនាក់ទំនងដែលចូលចិត្ត"</string>
<string name="share_contacts" msgid="8109287987498711664">"ចែករំលែកទំនាក់ទំនងទាំងអស់"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"ការចែករំលែកទំនាក់ទំនងមិនបានសម្រេច។"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"នាំចេញ/នាំចូលទំនាក់ទំនង"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"នាំចេញទំនាក់ទំនង"</string>
<string name="dialog_import" msgid="2431698729761448759">"នាំចូលទំនាក់ទំនង"</string>
<string name="share_error" msgid="948429331673358107">"ទំនាក់ទំនងនេះមិនអាចចែករំលែកបានទេ។"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"មិនមានទំនាក់ទំនងដើម្បីចែករំលែកទេ។"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"សម្អាតញឹកញាប់"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"ជ្រើសស៊ីមកាត"</string>
<string name="menu_accounts" msgid="1424330057450189074">"គ្រប់គ្រងគណនី"</string>
- <string name="menu_import_export" msgid="26217871113229507">"នាំចេញ/នាំចូល"</string>
+ <string name="menu_import" msgid="6107961135813836467">"នាំចូល"</string>
+ <string name="menu_export" msgid="2658783911863503902">"នាំចេញ"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"លេខបានរារាំង"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"តាមរយៈ <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> តាមរយៈ <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 3a89032..5b5238c 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"ಸೂಚಿಸಲಾದ ಸಂಪರ್ಕಗಳು"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"ಎಲ್ಲಾ ಸಂಪರ್ಕಗಳು"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"ಸಂಪರ್ಕಗಳನ್ನು ಲಿಂಕ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> ಅಳಿಸಲಾಗಿದೆ"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">ಸಂಪರ್ಕಗಳನ್ನು ಅಳಿಸಲಾಗಿದೆ</item>
<item quantity="other">ಸಂಪರ್ಕಗಳನ್ನು ಅಳಿಸಲಾಗಿದೆ</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"ಈ ಲೇಬಲ್ನೊಂದಿಗೆ ಯಾವುದೇ ಸಂಪರ್ಕಗಳಿಲ್ಲ"</string>
<string name="emptyAccount" msgid="6873962901497975964">"ಈ ಖಾತೆಯಲ್ಲಿ ಯಾವುದೇ ಸಂಪರ್ಕಗಳಿಲ್ಲ"</string>
<string name="emptyMainList" msgid="2772242747899664460">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳ ಪಟ್ಟಿಯು ಖಾಲಿಯಾಗಿದೆ"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> ಉಳಿಸಲಾಗಿದೆ"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"ಸಂಪರ್ಕವನ್ನು ಉಳಿಸಲಾಗಿದೆ"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"ಸಂಪರ್ಕಗಳನ್ನು ಅನ್ಲಿಂಕ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"ಸಂಪರ್ಕ ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಲಾಗಲಿಲ್ಲ"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"ಮತ್ತೆ ಕರೆ ಮಾಡಿ"</string>
<string name="returnCall" msgid="8171961914203617813">"ಹಿಂತಿರುಗುವಿಕೆ ಕರೆ"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" ಗೆ ಸಂಪರ್ಕಗಳನ್ನು ಸೇರಿಸುವುದೇ?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"ಸಂಪರ್ಕ ಫೋಟೋ"</string>
<string name="description_plus_button" msgid="515164827856229880">"ಪ್ಲಸ್"</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="search_settings_description" msgid="2675223022992445813">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳ ಹೆಸರುಗಳು"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"ದಿನಾಂಕ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"ಲೇಬಲ್"</string>
<string name="change_photo" msgid="8530597935483526383">"ಬದಲಾಯಿಸು"</string>
- <string name="primary_photo" msgid="8517942231868516999">"ಪ್ರಾಥಮಿಕ ಫೋಟೋ"</string>
<string name="description_star" msgid="2605854427360036550">"ಮೆಚ್ಚಿನ"</string>
<string name="edit_contact" msgid="7529281274005689512">"ಸಂಪರ್ಕವನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"ಮುಚ್ಚು"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"ಹೆಸರು"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ಇಮೇಲ್"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ಫೋನ್"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ಫೋಟೋ"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"ಸಂಪರ್ಕ ಸಂಪಾದಕವನ್ನು ವಿಸ್ತರಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"ಸಂಪರ್ಕ ಸಂಪಾದಕವನ್ನು ಕುಗ್ಗಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ."</string>
<string name="content_description_directions" msgid="2686791825798189335">"ಸ್ಥಳಕ್ಕಾಗಿ ದಿಕ್ಕುಗಳು"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"ಇತ್ತೀಚಿನ ಕರೆ. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. ಪುನಃ ಕರೆ ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"ನೀವು: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"ಇಮೇಲ್ ಕ್ಷೇತ್ರ ಅಥವಾ ಫೋನ್ ಕ್ಷೇತ್ರದಲ್ಲಿ ವ್ಯಕ್ತಿಯ Hangouts ಗುರುತಿಸುವಿಕೆಯನ್ನು ನೀವು ನಮೂದಿಸಿದಾಗ Hangouts ಉತ್ತಮವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"ಇನ್ನಷ್ಟು ಫೀಲ್ಡ್ಗಳು"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ಫೋಟೋ ಬದಲಾಯಿಸಿ"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"ಸಂಪಾದಕವನ್ನು ತೆರೆಯಲು ವಿಫಲವಾಗಿದೆ."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"ಇದಕ್ಕೆ ಉಳಿಸಲಾಗುತ್ತಿದೆ"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"ಪ್ರಸ್ತುತ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ಖಾತೆಗೆ ಉಳಿಸಲಾಗುತ್ತಿದೆ. ಬೇರೆ ಖಾತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"ಇನ್ನಷ್ಟು ಫೀಲ್ಡ್ಗಳು"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ಫೋಟೋ ಬದಲಾಯಿಸಿ"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"ಸಂಪಾದಕವನ್ನು ತೆರೆಯಲು ವಿಫಲವಾಗಿದೆ."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"ಇದಕ್ಕೆ ಉಳಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"ವೀಕ್ಷಣೆ"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"ಪ್ರಸ್ತುತ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ಖಾತೆಗೆ ಉಳಿಸಲಾಗುತ್ತಿದೆ. ಬೇರೆ ಖಾತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">ಲಿಂಕ್ ಮಾಡಲಾದ ಸಂಪರ್ಕಗಳು (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">ಲಿಂಕ್ ಮಾಡಲಾದ ಸಂಪರ್ಕಗಳು (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"ಈ ಸಂಪರ್ಕ"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"ಸಂಭವನೀಯ ನಕಲಿಗಳು"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ಈ ಸಂಪರ್ಕಗಳು ಅದೇ ವ್ಯಕ್ತಿಯದ್ದಾಗಿರಬಹುದು. ನೀವು ಅವುಗಳನ್ನು ಏಕ ಸಂಪರ್ಕವಾಗಿ ಒಟ್ಟಿಗೆ ಲಿಂಕ್ ಮಾಡಬಹುದು."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"ಲಿಂಕ್ ಮಾಡಲಾದ ಸಂಪರ್ಕಗಳು"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"ಲಿಂಕ್ ಮಾಡಲಾದ ಸಂಪರ್ಕಗಳು"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"ನಿಮ್ಮ ಖಾತೆಗಳಿಂದ"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ಫೋಟೋ ತೆಗೆದುಕೊಳ್ಳಿ"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"ಎಲ್ಲ ಫೋಟೋಗಳು"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ಫೋಟೋ ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> ನಿಂದ"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> ಅಳಿಸು"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"ಮೆಚ್ಚಿನ ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="share_contacts" msgid="8109287987498711664">"ಎಲ್ಲ ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ವಿಫಲವಾಗಿದೆ."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"ಸಂಪರ್ಕಗಳನ್ನು ಆಮದು/ರಪ್ತು ಮಾಡಿ"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"ಸಂಪರ್ಕಗಳನ್ನು ರಫ್ತು ಮಾಡಿ"</string>
<string name="dialog_import" msgid="2431698729761448759">"ಸಂಪರ್ಕಗಳನ್ನು ಆಮದು ಮಾಡಿ"</string>
<string name="share_error" msgid="948429331673358107">"ಈ ಸಂಪರ್ಕವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"ಹಂಚಿಕೊಳ್ಳಲು ಯಾವುದೇ ಸಂಪರ್ಕಗಳಿಲ್ಲ."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"ಪುನರಾವರ್ತನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"ಸಿಮ್ ಕಾರ್ಡ್ ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="menu_accounts" msgid="1424330057450189074">"ಖಾತೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
- <string name="menu_import_export" msgid="26217871113229507">"ಆಮದು/ರಫ್ತು ಮಾಡು"</string>
+ <string name="menu_import" msgid="6107961135813836467">"ಆಮದು ಮಾಡಿ"</string>
+ <string name="menu_export" msgid="2658783911863503902">"ರಫ್ತು ಮಾಡು"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"ನಿರ್ಬಂಧಿಸಲಾದ ಸಂಖ್ಯೆಗಳು"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> ಮೂಲಕ"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="SOURCE">%2$s</xliff:g> ಮೂಲಕ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 1899386..b0c2bc6 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"추천 연락처"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"모든 연락처"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"연락처가 연결되었습니다."</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g>님이 삭제됨"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">연락처 삭제됨</item>
<item quantity="one">연락처 삭제됨</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"이 라벨에 연락처 없음"</string>
<string name="emptyAccount" msgid="6873962901497975964">"이 계정에 연락처 없음"</string>
<string name="emptyMainList" msgid="2772242747899664460">"연락처 목록이 비어 있음"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> 저장됨"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"연락처가 저장되었습니다."</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"연락처 연결 해제됨"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"연락처 변경사항을 저장할 수 없습니다."</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"다시 걸기"</string>
<string name="returnCall" msgid="8171961914203617813">"전화 걸기"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\'<xliff:g id="EMAIL">%s</xliff:g>\'을(를) 주소록에 추가하겠습니까?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"주소록 사진"</string>
<string name="description_plus_button" msgid="515164827856229880">"더하기"</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="search_settings_description" msgid="2675223022992445813">"연락처 명단"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"날짜"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"라벨"</string>
<string name="change_photo" msgid="8530597935483526383">"변경"</string>
- <string name="primary_photo" msgid="8517942231868516999">"기본 사진"</string>
<string name="description_star" msgid="2605854427360036550">"즐겨찾기"</string>
<string name="edit_contact" msgid="7529281274005689512">"연락처 수정"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"닫기"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"이름"</string>
<string name="header_email_entry" msgid="8666093061171624478">"이메일"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"전화"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"사진"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"연락처 편집기를 펼치려면 클릭하세요."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"연락처 편집기를 접으려면 클릭하세요."</string>
<string name="content_description_directions" msgid="2686791825798189335">"길찾기"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"최근 통화내역은 다음과 같습니다. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. 연락 온 번호로 다시 전화하려면 클릭하세요."</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"내가 보낸 메시지: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"사용자의 행아웃 식별자를 이메일 입력란 또는 휴대전화 입력란에 입력하면 행아웃이 더 잘 작동합니다."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"입력란 더보기"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"사진 변경"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"편집기를 열지 못했습니다."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"다음에 저장"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"현재 <xliff:g id="ACCOUNT_NAME">%s</xliff:g>에 저장 중입니다. 다른 계정을 선택하려면 두 번 탭하세요."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"입력란 더보기"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"사진 변경"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"편집기를 열지 못했습니다."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"다음에 저장"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"현재 표시 중"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"현재 <xliff:g id="ACCOUNT_NAME">%s</xliff:g>에 저장 중입니다. 다른 계정을 선택하려면 두 번 탭하세요."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">연결된 연락처(<xliff:g id="COUNT">%d</xliff:g>개)</item>
<item quantity="one">연결된 연락처</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"이 연락처"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"중복된 것으로 보이는 연락처"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"이 연락처는 같은 사람일 수 있습니다. 이 연락처들을 하나의 연락처로 연결할 수 있습니다."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"연결된 연락처"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"연결된 연락처"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"내 계정의 프로필 사진"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"사진 찍기"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"모든 사진"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"사진 선택"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"저장된 계정: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> 삭제"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"자주 사용하는 연락처 공유"</string>
<string name="share_contacts" msgid="8109287987498711664">"모든 연락처 공유"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"연락처를 공유할 수 없습니다."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"주소록 가져오기/내보내기"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"연락처 내보내기"</string>
<string name="dialog_import" msgid="2431698729761448759">"주소록 가져오기"</string>
<string name="share_error" msgid="948429331673358107">"연락처를 공유할 수 없습니다."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"공유할 연락처가 없습니다."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"자주 연락하는 사람들 목록 삭제"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM 카드 선택"</string>
<string name="menu_accounts" msgid="1424330057450189074">"계정 관리"</string>
- <string name="menu_import_export" msgid="26217871113229507">"가져오기/내보내기"</string>
+ <string name="menu_import" msgid="6107961135813836467">"가져오기"</string>
+ <string name="menu_export" msgid="2658783911863503902">"내보내기"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"차단된 번호"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"출처: <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g>(출처: <xliff:g id="SOURCE">%2$s</xliff:g>)"</string>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index a8f5595..f80902d 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Сунушталган байланыштар"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Бардык байланыштар"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Байланыштар шилтемеленди"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> жок кылынды"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Байланыштар жок кылынды</item>
<item quantity="one">Байланыш жок кылынды</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Бул энбелги коюлган бир дагы байланыш жок"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Бул каттоо эсебинде эч кандай байланыш жок"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Байланыштар тизмеңиз бош"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> сакталды"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Байланыш сакталды"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Байланыштар ажыратылды"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Байланыштын өзгөрүүлөрү сакталган жок."</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Дагы чалуу"</string>
<string name="returnCall" msgid="8171961914203617813">"Кайра чалуу"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Байланыштарга \"<xliff:g id="EMAIL">%s</xliff:g>\" кошосузбу?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"байланыштын сүрөтү"</string>
<string name="description_plus_button" msgid="515164827856229880">"кошуу"</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="search_settings_description" msgid="2675223022992445813">"Байланыштарыңыздын аттары"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Дата"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Энбелги"</string>
<string name="change_photo" msgid="8530597935483526383">"Өзгөртүү"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Негизги сүрөт"</string>
<string name="description_star" msgid="2605854427360036550">"сүйүктүү"</string>
<string name="edit_contact" msgid="7529281274005689512">"Байланышты түзөтүү"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"жабуу"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Ысымы"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Электрондук почта"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Телефон"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Сүрөт"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Байланыш түзөткүчүн жайып көрсөтүү үчүн чыкылдатыңыз."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Байланыш түзөткүчүн жыйыштыруу үчүн чыкылдатыңыз."</string>
<string name="content_description_directions" msgid="2686791825798189335">"жайгашуу ордуна багыттоолор"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"акыркы чалуу. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. кайра чалуу үчүн чыкылдатыңыз"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Сиз: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Кимдир-бирөөнүн Hangouts аныктагычы электрондук почта же телефон талаасына киргизилгенде Hangouts жакшыраак иштейт."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Калган талааларды көрсөтүү"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Сүрөттү өзгөртүү"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Түзөткүч ачылбай калды."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Төмөнкүгө сакталууда"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Учурда <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ичине сакталууда. Башка каттоо эсебин тандоо үчүн эки жолу таптаңыз."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Калган талааларды көрсөтүү"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Сүрөттү өзгөртүү"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Түзөткүч ачылбай калды."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Төмөнкүгө сакталууда"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Көрүлүүдө"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Учурда <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ичине сакталууда. Башка каттоо эсебин тандоо үчүн эки жолу таптаңыз."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Шилтемеленген байланыштар (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Шилтемеленген байланыш</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ушул байланыш"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Булар жупнуска болушу мүмкүн"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Бул байланыштар бир эле адам болушу мүмкүн. Аларды жалгыз байланыш кылып бириктирсеңиз болот."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Шилтемеленген байланыштар"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Шилтемеленген байланыштар"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Каттоо эсептериңизден"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Сүрөткө тартуу"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Бардык сүрөттөр"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Сүрөт тандаңыз"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> дегенден"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> жок кылуу"</string>
@@ -650,7 +648,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Сүйүктүү байланыштарды бөлүшүү"</string>
<string name="share_contacts" msgid="8109287987498711664">"Бардык байланыштар менен бөлүшүү"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Байланыштар бөлүшүлбөй койду."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Байланыштарды өткөрүп алуу/берүү"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Байланыштарды өткөрүп берүү"</string>
<string name="dialog_import" msgid="2431698729761448759">"Байланыштарды өткөрүп алуу"</string>
<string name="share_error" msgid="948429331673358107">"Бул байланышты бөлүшүү мүмкүн эмес."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Бөлүшө турган байланыш жок."</string>
@@ -669,7 +667,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Көп чалуулар тизмесин тазалоо"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM карта тандаңыз"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Каттоо эсептерин башкаруу"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Импорттоо/экспорттоо"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Өткөрүп алуу"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Өткөрүп берүү"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Бөгөттөлгөн номерлер"</string>
<!-- no translation found for contact_status_update_attribution (752179367353018597) -->
<skip />
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index 14da737..c65ed89 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"ລາຍຊື່ຜູ່ຕິດຕໍ່ທີ່ແນະນຳ"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"ລາຍຊື່ຜູ່ຕິດຕໍ່ທັງໝົດ"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"ລາຍຊື່ຕິດຕໍ່ລິ້ງແລ້ວ"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"ລຶບ <xliff:g id="NAME">%s</xliff:g> ອອກແລ້ວ"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">ລາຍຊື່ຜູ້ຕິດຕໍ່ຖືກລຶບອອກແລ້ວ</item>
<item quantity="one">ລາຍຊື່ຜູ້ຕິດຕໍ່ຖືກລຶບອອກແລ້ວ</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"ບໍ່ມີລາຍຊື່ຜູ້ຕິດຕໍ່ທີ່ມີປ້າຍກຳກັບນີ້"</string>
<string name="emptyAccount" msgid="6873962901497975964">"ບໍ່ມີລາຍຊື່ຜູ້ຕິດຕໍ່ໃນບັນຊີນີ້"</string>
<string name="emptyMainList" msgid="2772242747899664460">"ລາຍຊື່ຜູ້ຕິດຕໍ່ຂອງທ່ານຫວ່າງເປົ່າ"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"ບັນທຶກ <xliff:g id="DISPLAY_NAME">%s</xliff:g> ແລ້ວ"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"ບັນທຶກລາຍຊື່ຜູ່ຕິດຕໍ່ແລ້ວ"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"ຖອນລິ້ງລາຍຊື່ຕິດຕໍ່ແລ້ວ"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"ບໍ່ສາມາດບັນທຶກການແກ້ໄຂລາຍຊື່ຜູ້ຕິດຕໍ່ໄດ້"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"ໂທອີກເທື່ອນຶ່ງ"</string>
<string name="returnCall" msgid="8171961914203617813">"ໂທກັບ"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"ເພີ່ມ \"<xliff:g id="EMAIL">%s</xliff:g>\" ໃສ່ລາຍຊື່ຜູ່ຕິດຕໍ່?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"ຮູບພາບລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
<string name="description_plus_button" msgid="515164827856229880">"ບວກ"</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="search_settings_description" msgid="2675223022992445813">"ຊື່ຂອງລາຍຊື່ຜູ່ຕິດຕໍ່ຂອງທ່ານ"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"ວັນທີ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"ປ້າຍກຳກັບ"</string>
<string name="change_photo" msgid="8530597935483526383">"ປ່ຽນແປງ"</string>
- <string name="primary_photo" msgid="8517942231868516999">"ຮູບຖ່າຍຕົ້ນຕໍ"</string>
<string name="description_star" msgid="2605854427360036550">"ໝາຍດາວ"</string>
<string name="edit_contact" msgid="7529281274005689512">"ແກ້ໄຂລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"ປິດ"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"ຊື່"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ອີເມວ"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ໂທລະສັບ"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ຮູບພາບ"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"ຄລິກເພື່ອຂະຫຍາຍເຄື່ອງກວດແກ້ລາຍຊື່ຕິດຕໍ່."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"ຄລິກເພື່ອຫຍໍ້ເຄື່ອງກວດແກ້ລາຍຊື່ຕິດຕໍ່."</string>
<string name="content_description_directions" msgid="2686791825798189335">"ເສັ້ນທາງໄປຫາສະຖານທີ່"</string>
@@ -280,15 +279,19 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"ການໂທຫຼ້າສຸດ. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. ຄລິກເພື່ອໂທກັບ"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"ທ່ານ: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts ເຮັດວຽກໄດ້ດີຂຶ້ນ ເມື່ອທ່ານປ້ອນຕົວລະບຸ Hangouts ຂອງບຸກຄົນໃສ່ບ່ອນໃສ່ອີເມວ ຫຼືບ່ອນໃສ່ໂທລະສັບຂອງທ່ານ."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"ຊ່ອງຂໍ້ມູນເພີ່ມເຕີມ"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ປ່ຽນຮູບ"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"ເປີດເຄື່ອງຕັດຕໍ່ບໍ່ສຳເລັດ."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"ກຳລັງບັນທຶກໃສ່"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"ປະຈຸບັນກຳລັງບັນທຶກໃສ່ <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. ແຕະສອງເທື່ອ ເພື່ອເລືອກບັນຊີອື່ນ."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">ລາຍຊື່ຕິດຕໍ່ລິ້ງແລ້ວ (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">ລາຍຊື່ຕິດຕໍ່ລິ້ງແລ້ວ</item>
- </plurals>
+ <!-- no translation found for editor_more_fields (3630987771304393421) -->
+ <skip />
+ <!-- no translation found for editor_change_photo_content_description (754100561085306263) -->
+ <skip />
+ <!-- no translation found for editor_failed_to_load (1623639078580475818) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_title (4426337993307015833) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_read_only_title (8315171723911587719) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_description (3324358600570627740) -->
+ <skip />
+ <!-- no translation found for editor_linked_contacts_selector_title (249075501821303190) -->
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> ລາຍຊື່ຕິດຕໍ່ລິ້ງແລ້ວ"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
<string name="quickcontact_suggestion_link_button" msgid="3244619714781727946">"ລິ້ງລາຍຊື່ຕິດຕໍ່"</string>
@@ -309,10 +312,9 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"ລາຍຊື່ຕິດຕໍ່ນີ້"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"ເປັນໄປໄດ້ວ່າມີການຊ້ຳກັນ"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ລາຍຊື່ຕິດຕໍ່ເຫຼົ່ານີ້ອາດຈະເປັນຄົນດຽວກັນ. ທ່ານສາມາດລິ້ງພວກມັນເຂົ້າກັນເປັນບັນຊີດຽວໄດ້."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"ລາຍຊື່ຕິດຕໍ່ລິ້ງແລ້ວ"</string>
+ <!-- no translation found for editor_linked_contacts_title (3077479751631492125) -->
+ <skip />
<string name="from_your_accounts" msgid="1746293107836889912">"ຈາກບັນຊີຂອງທ່ານ"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ຖ່າຍຮູບ"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"ຮູບທັງໝົດ"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ເລືອກຮູບ"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"ຈາກ <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"ລຶບ <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +549,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"ແບ່ງປັນລາຍຊື່ຜູ້ຕິດຕໍ່ທີ່ມັກ"</string>
<string name="share_contacts" msgid="8109287987498711664">"ແບ່ງປັນທຸກລາຍຊື່ຜູ້ຕິດຕໍ່"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"ແບ່ງປັນລາຍຊື່ຜູ້ຕິດຕໍ່ບໍ່ສຳເລັດ."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"ນຳເຂົ້າ/ສົ່ງອອກ ລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"ສົ່ງອອກລາຍຊື່ຜູ້ຕິດຕໍ່"</string>
<string name="dialog_import" msgid="2431698729761448759">"ນຳເຂົ້າລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
<string name="share_error" msgid="948429331673358107">"ບໍ່ສາມາດແບ່ງປັນລາຍຊື່ຜູ່ຕິດຕໍ່ນີ້ໄດ້"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"ບໍ່ມີລາຍຊື່ຜູ້ຕິດຕໍ່ທີ່ຈະແບ່ງປັນ."</string>
@@ -562,7 +564,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"ລຶບລາຍຊື່ທີ່ຕິດຕໍ່ເລື້ອຍໆ"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"ເລືອກ SIM ກາດ"</string>
<string name="menu_accounts" msgid="1424330057450189074">"ຈັດການບັນຊີ"</string>
- <string name="menu_import_export" msgid="26217871113229507">"ນຳເຂົ້າ/ສົ່ງອອກ"</string>
+ <string name="menu_import" msgid="6107961135813836467">"ນຳເຂົ້າ"</string>
+ <string name="menu_export" msgid="2658783911863503902">"ສົ່ງອອກ"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"ເບີໂທທີ່ບລັອກໄວ້"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"ຜ່ານ <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> ຜ່ານ <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 29b2fcd..56bad49 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Siūlomi adresatai"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Visi kontaktai"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontaktai susieti"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> ištrintas (-a)"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">kontaktas ištrintas</item>
<item quantity="few">kontaktai ištrinti</item>
@@ -117,6 +118,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Nėra kontaktų su šia etikete"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Šioje paskyroje nėra jokių kontaktų"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Kontaktų sąrašas tuščias"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> išsaugotas (-a)"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontaktas išsaugotas"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontaktai atsieti"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Nepavyko išsaugoti kontakto pakeitimų"</string>
@@ -159,7 +161,6 @@
<string name="callAgain" msgid="3197312117049874778">"Skambinti dar kartą"</string>
<string name="returnCall" msgid="8171961914203617813">"Grįžtamasis skambutis"</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_contact_photo" msgid="3387458082667894062">"adresato nuotrauka"</string>
<string name="description_plus_button" msgid="515164827856229880">"plius"</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="search_settings_description" msgid="2675223022992445813">"Kontaktų vardai"</string>
@@ -206,7 +207,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Data"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiketė"</string>
<string name="change_photo" msgid="8530597935483526383">"Pakeisti"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Pagrindinė nuotrauka"</string>
<string name="description_star" msgid="2605854427360036550">"įtraukti į adresyną"</string>
<string name="edit_contact" msgid="7529281274005689512">"Redaguoti kontaktą"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"uždaryti"</string>
@@ -283,7 +283,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Vardas"</string>
<string name="header_email_entry" msgid="8666093061171624478">"El. paštas"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefonas"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Nuotrauka"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Spustelėkite, kad išskleistumėte kontaktų redagavimo priemonę."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Spustelėkite, kad sutrauktumėte kontaktų redagavimo priemonę."</string>
<string name="content_description_directions" msgid="2686791825798189335">"nuorodos į vietovę"</string>
@@ -294,12 +293,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Neseniai skambino. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Spustelėkite, kad atskambintumėte."</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Jūs: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"„Hangout“ veikia geriau įvedus asmens „Hangout“ identifikatorių el. pašto ar telefono numerio lauke."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Daugiau laukų"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Keisti nuotrauką"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Nepavyko atidaryti redagavimo priemonės."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Saugojimo vieta"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Šiuo metu išsaugoma <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dukart palieskite, kad pasirinktumėte kitą paskyrą."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Daugiau laukų"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Keisti nuotrauką"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Nepavyko atidaryti redagavimo priemonės."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Išsaugoma"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Peržiūrima"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Šiuo metu išsaugoma paskyroje <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dukart palieskite, kad pasirinktumėte kitą paskyrą."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Susieti kontaktai (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="few">Susieti kontaktai (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="many">Susieti kontaktai (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -331,10 +331,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Šis kontaktas"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Galimos tikslios kopijos"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Šie kontaktai gali būti tas pats asmuo. Galite juos susieti kaip vieną kontaktą."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Susieti kontaktai"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Susieti kontaktai"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Iš jūsų paskyrų"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Fotografuoti"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Visos nuotraukos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Pasirinkti nuotrauką"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Iš <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Ištrinti <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -569,7 +567,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Bendrinti mėgstamiausius kontaktus"</string>
<string name="share_contacts" msgid="8109287987498711664">"Bendrinti visus kontaktus"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Nepavyko bendrinti kontaktų."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Import. / eksport. kont."</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Eksportuoti kontaktus"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importuoti kontaktus"</string>
<string name="share_error" msgid="948429331673358107">"Šio kontakto negalima bendrinti."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Nėra bendrintinų kontaktų."</string>
@@ -584,7 +582,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Valyti dažniausiai naudojamus"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Pasirinkti SIM kortelę"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Tvarkyti paskyras"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importuoti / eksportuoti"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importuoti"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Eksportuoti"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Užblokuoti numeriai"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"naudojant „<xliff:g id="SOURCE">%1$s</xliff:g>“"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> naudojant „<xliff:g id="SOURCE">%2$s</xliff:g>“"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index b0d95f0..2535cbc 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Ieteiktās kontaktpersonas"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Visas kontaktpersonas"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontaktpersonas tika saistītas."</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Kontaktpers. <xliff:g id="NAME">%s</xliff:g> dzēsta"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="zero">Kontaktpersonas ir izdzēstas</item>
<item quantity="one">Kontaktpersonas ir izdzēstas</item>
@@ -114,6 +115,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Nav nevienas kontaktpersonas ar šo iezīmi."</string>
<string name="emptyAccount" msgid="6873962901497975964">"Šajā kontā nav nevienas kontaktpersonas."</string>
<string name="emptyMainList" msgid="2772242747899664460">"Jūsu kontaktpersonu saraksts ir tukšs."</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Kontaktpersona <xliff:g id="DISPLAY_NAME">%s</xliff:g> saglabāta"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontaktpersona ir saglabāta."</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontaktpersonas ir atsaistītas"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Nevarēja saglabāt kontaktpersonas datu izmaiņas."</string>
@@ -153,7 +155,6 @@
<string name="callAgain" msgid="3197312117049874778">"Zvanīt vēlreiz"</string>
<string name="returnCall" msgid="8171961914203617813">"Atzvanīt"</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_contact_photo" msgid="3387458082667894062">"kontaktpersonas fotoattēls"</string>
<string name="description_plus_button" msgid="515164827856229880">"pluss"</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="search_settings_description" msgid="2675223022992445813">"Kontaktpersonu vārdi"</string>
@@ -199,7 +200,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Datums"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Iezīme"</string>
<string name="change_photo" msgid="8530597935483526383">"Mainīt"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Galvenais foto"</string>
<string name="description_star" msgid="2605854427360036550">"izlase"</string>
<string name="edit_contact" msgid="7529281274005689512">"Kontaktpersonu rediģēšana"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"aizvērt"</string>
@@ -276,7 +276,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nosaukums"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-pasta adrese"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Tālrunis"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fotoattēls"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Noklikšķiniet, lai izvērstu kontaktpersonu redaktoru."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Noklikšķiniet, lai sakļautu kontaktpersonu redaktoru."</string>
<string name="content_description_directions" msgid="2686791825798189335">"norādes uz atrašanās vietu"</string>
@@ -287,15 +286,16 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Nesen saņemts zvans. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Noklikšķiniet, lai atzvanītu."</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Jūs: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Funkcija Hangouts darbojas precīzāk, ja e-pasta vai tālruņa laukā ievadāt personas Hangouts identifikatoru."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Vairāk lauku"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Mainīt fotoattēlu"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Neizdevās atvērt redaktoru."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Tiks saglabāts šajā kontā:"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Pašlaik notiek saglabāšana kontā <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Veiciet dubultskārienu, lai izvēlētos citu kontu."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="zero">Saistītas kontaktpersonas (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">Saistītas kontaktpersonas (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="other">Saistītas kontaktpersonas (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Vairāk lauku"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Mainīt fotoattēlu"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Neizdevās atvērt redaktoru."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Tiks saglabāts šajā kontā:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Tiek skatīts šis konts:"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Pašlaik notiek saglabāšana kontā <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Veiciet dubultskārienu, lai izvēlētos citu kontu."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="zero">Saistītās kontaktpersonas (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="one">Saistītās kontaktpersonas (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="other">Saistītās kontaktpersonas (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> saistītas kontaktpersonas"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -320,10 +320,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Šī kontaktpersona"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Iespējamie dublikāti"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Iespējams, šīs kontaktpersonas ir viena un tā pati persona. Varat tās apvienot vienā kontaktpersonā."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Saistītās kontaktpersonas"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Saistītās kontaktpersonas"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"No jūsu kontiem"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Uzņemt fotoattēlu"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Visi fotoattēli"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Fotoattēla izvēle"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"No: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Dzēst: <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -558,7 +556,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Kopīgot izlases kontaktpersonas"</string>
<string name="share_contacts" msgid="8109287987498711664">"Kopīgot visas kontaktpersonas"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Neizdevās kopīgot kontaktpersonas."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"K. pers. imports/eksports"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Kontaktpersonu eksportēšana"</string>
<string name="dialog_import" msgid="2431698729761448759">"Kontaktpersonu importēšana"</string>
<string name="share_error" msgid="948429331673358107">"Šo kontaktpersonu nevar kopīgot."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Nav nevienas kopīgojamas kontaktpersonas."</string>
@@ -573,7 +571,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Dzēst bieži lietotos kontaktus"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Atlasiet SIM karti"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Pārvaldīt kontus"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importēt/eksportēt"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importēt"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Eksportēt"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Bloķētie numuri"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"izmantojot <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g>, izmantojot <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index decd987..6fb161c 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Препорачани контакти"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Сите контакти"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Контактите се поврзани"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> е избришан"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Контактот е избришан</item>
<item quantity="other">Контактите се избришани</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Нема контакти со етикетава"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Нема контакти во сметкава"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Списокот со контакти е празен"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> е зачуван"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Контактот е зачуван"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Контактите се раздвоени"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Не можеше да се зачуваат промените на контактот"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Повикај повторно"</string>
<string name="returnCall" msgid="8171961914203617813">"Врати повик"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Додај „<xliff:g id="EMAIL">%s</xliff:g>“ во контакти?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"фотографија за контакт"</string>
<string name="description_plus_button" msgid="515164827856229880">"плус"</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="search_settings_description" msgid="2675223022992445813">"Имиња на вашите контакти"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Датум"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Етикета"</string>
<string name="change_photo" msgid="8530597935483526383">"Промени"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Пр. фотографија"</string>
<string name="description_star" msgid="2605854427360036550">"омилено"</string>
<string name="edit_contact" msgid="7529281274005689512">"Уреди контакт"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"затвори"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Име"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-пошта"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Телефон"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Фотографија"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Кликнете за да го проширите уредникот за контакти."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Кликнете за да го соберете уредникот за контакти."</string>
<string name="content_description_directions" msgid="2686791825798189335">"насоки до локација"</string>
@@ -280,13 +279,14 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"неодамнешен повик. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. кликни за да повикаш назад"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Вие: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts работат подобро кога во полето за е-пошта или за телефон ќе го внесете идентификаторот на Hangouts за лицето."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Повеќе полиња"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Промени фотографија"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Не успеа да го отвори уредникот."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Се зачувува на"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Моментално се зачувува на <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Допрете двапати за да изберете друга сметка."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one">Поврзан контакт (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Повеќе полиња"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Променете ја фотографијата"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Не успеа да го отвори уредникот."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Се зачувува на"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Се прикажува"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Моментално се зачувува на <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Допрете двапати за да изберете друга сметка."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="one">Поврзани контакти (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Поврзани контакти (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> поврзани контакти"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Овој контакт"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Можни дупликати"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Овие контакти можеби се на истото лице. Може да ги споите во еден контакт."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Поврзани контакти"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Поврзани контакти"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Од вашите сметки"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Фотографирај"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Сите фотографии"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Избери фотографија"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Од <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Избриши <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Споделете омилени контакти"</string>
<string name="share_contacts" msgid="8109287987498711664">"Споделете ги сите контакти"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Споделувањето на контактите не успеа."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Извршете увоз/извоз на контакти"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Извоз на контакти"</string>
<string name="dialog_import" msgid="2431698729761448759">"Извршете увоз на контакти"</string>
<string name="share_error" msgid="948429331673358107">"Контактов не може да се сподели."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Нема контакти за споделување."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Исчисти чести"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Изберете СИМ-картичка"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Управувај со сметки"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Изврши увоз/извоз"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Изврши увоз"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Изврши извоз"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Блокирани броеви"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"од <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"на <xliff:g id="DATE">%1$s</xliff:g> од <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index 9ee2bab..7ac2744 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"നിര്ദ്ദേശിച്ച കോണ്ടാക്റ്റുകള്"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"എല്ലാ കോൺടാക്റ്റുകളും"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"ലിങ്കുചെയ്ത കോൺടാക്റ്റുകൾ"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> എന്ന കോൺടാക്റ്റിനെ ഇല്ലാതാക്കി"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">കോൺടാക്റ്റുകൾ ഇല്ലാതാക്കി</item>
<item quantity="one">കോൺടാക്റ്റ് ഇല്ലാതാക്കി</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"ഈ ലേബലുള്ള കോൺടാക്റ്റുകളൊന്നുമില്ല"</string>
<string name="emptyAccount" msgid="6873962901497975964">"ഈ അക്കൗണ്ടിൽ കോൺടാക്റ്റുകളൊന്നുമില്ല"</string>
<string name="emptyMainList" msgid="2772242747899664460">"നിങ്ങളുടെ കോൺടാക്റ്റ് ലിസ്റ്റ് ശൂന്യമാണ്"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> സംരക്ഷിച്ചു"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"കോൺടാക്റ്റ് സംരക്ഷിച്ചു"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"കോൺടാക്റ്റുകൾ അൺലിങ്കുചെയ്തു"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"കോൺടാക്റ്റ് മാറ്റങ്ങൾ സംരക്ഷിക്കാനായില്ല"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"വീണ്ടും വിളിക്കുക"</string>
<string name="returnCall" msgid="8171961914203617813">"കോളിലേക്ക് മടങ്ങുക"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"കോൺടാക്റ്റുകളിലേക്ക് \"<xliff:g id="EMAIL">%s</xliff:g>\" ചേർക്കണോ?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"കോൺടാക്റ്റിന്റെ ഫോട്ടോ"</string>
<string name="description_plus_button" msgid="515164827856229880">"പ്ലസ്"</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="search_settings_description" msgid="2675223022992445813">"നിങ്ങളുടെ കോൺടാക്റ്റുകളുടെ പേരുകൾ"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"തീയതി"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"ലേബൽ"</string>
<string name="change_photo" msgid="8530597935483526383">"മാറ്റുക"</string>
- <string name="primary_photo" msgid="8517942231868516999">"പ്രാഥമിക ഫോട്ടോ"</string>
<string name="description_star" msgid="2605854427360036550">"പ്രിയപ്പെട്ടതാക്കുക"</string>
<string name="edit_contact" msgid="7529281274005689512">"കോൺടാക്റ്റ് തിരുത്തുക"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"അടയ്ക്കുക"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"പേര്"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ഇമെയിൽ"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ഫോണ്"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ഫോട്ടോ"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"കോൺടാക്റ്റ് എഡിറ്റർ വിപുലീകരിക്കാൻ ക്ലിക്കുചെയ്യുക."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"കോൺടാക്റ്റ് എഡിറ്റർ ചുരുക്കാൻ ക്ലിക്കുചെയ്യുക."</string>
<string name="content_description_directions" msgid="2686791825798189335">"ലൊക്കേഷനിലേക്കുള്ള വഴികൾ"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"പുതിയ കോൾ. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. തിരികെ വിളിക്കാൻ ക്ലിക്കുചെയ്യുക"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"നിങ്ങൾ: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"ഇമെയിൽ ഫീൽഡിലോ ഫോൺ ഫീൽഡിലോ വ്യക്തിയുടെ Hangouts ഐഡന്റിഫയർ നൽകുമ്പോൾ, Hangouts മികച്ചതായി പ്രവർത്തിക്കുന്നു."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"കൂടുതൽ ഫീൽഡുകൾ"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ഫോട്ടോ മാറ്റുക"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"എഡിറ്റർ തുറക്കുന്നത് പരാജയപ്പെട്ടു."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"ഇതിലേക്ക് സംരക്ഷിക്കുന്നു"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"നിലവിൽ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> എന്ന അക്കൗണ്ടിലേക്ക് സംരക്ഷിക്കുന്നു. മറ്റൊരു അക്കൗണ്ടിലേക്ക് സംരക്ഷിക്കാൻ രണ്ടുതവണ ടാപ്പുചെയ്യുക."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"കൂടുതൽ ഫീൽഡുകൾ"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ഫോട്ടോ മാറ്റുക"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"എഡിറ്റർ തുറക്കുന്നത് പരാജയപ്പെട്ടു."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"ഇതിലേക്ക് സംരക്ഷിക്കുന്നു"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"കാണുന്നു"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"നിലവിൽ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> എന്ന അക്കൗണ്ടിലേക്ക് സംരക്ഷിക്കുന്നു. മറ്റൊരു അക്കൗണ്ടിലേക്ക് സംരക്ഷിക്കാൻ രണ്ടുതവണ ടാപ്പുചെയ്യുക."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">ലിങ്കുചെയ്ത കോൺടാക്റ്റുകൾ (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">ലിങ്കുചെയ്ത കോൺടാക്റ്റ്</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"ഈ കോൺടാക്റ്റ്"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"സാധ്യതയുള്ള ഡ്യൂപ്ലിക്കേറ്റുകൾ"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ഈ കോൺടാക്റ്റുകൾ, ഒരേ വ്യക്തി ആയേക്കാം, ഒരൊറ്റ കോൺടാക്റ്റായി നിങ്ങൾക്കിവ ലിങ്കുചെയ്യാവുന്നതാണ്."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"ലിങ്കുചെയ്ത കോൺടാക്റ്റുകൾ"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"ലിങ്കുചെയ്ത കോൺടാക്റ്റുകൾ"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"നിങ്ങളുടെ അക്കൗണ്ടുകളിൽ നിന്നും"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ഒരു ഫോട്ടോ എടുക്കുക"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"എല്ലാ ഫോട്ടോകളും"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ഫോട്ടോ തിരഞ്ഞെടുക്കുക"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> എന്നതിൽ നിന്ന്"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> ഇല്ലാതാക്കുക"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"പ്രിയപ്പെട്ട കോൺടാക്റ്റുകൾ പങ്കിടുക"</string>
<string name="share_contacts" msgid="8109287987498711664">"എല്ലാ കോൺടാക്റ്റുകളും പങ്കിടുക"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"കോൺടാക്റ്റുകൾ പങ്കിടുന്നത് പരാജയം."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"കോൺടാക്റ്റുകൾ ഇമ്പോർട്ടുചെയ്യുക/എക്സ്പോർട്ടുചെയ്യുക"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"കോൺടാക്റ്റുകൾ എക്സ്പോർട്ടുചെയ്യുക"</string>
<string name="dialog_import" msgid="2431698729761448759">"കോൺടാക്റ്റുകൾ ഇമ്പോർട്ടുചെയ്യുക"</string>
<string name="share_error" msgid="948429331673358107">"ഈ കോൺടാക്റ്റ് പങ്കിടാനാകില്ല."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"പങ്കിടാൻ കോൺടാക്റ്റുകളൊന്നും ഇല്ല."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"സ്ഥിരംവിളിക്കുന്നവരെ മായ്ക്കൂ"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"സിം കാർഡ് തിരഞ്ഞെടുക്കുക"</string>
<string name="menu_accounts" msgid="1424330057450189074">"മാനേജുചെയ്യുക"</string>
- <string name="menu_import_export" msgid="26217871113229507">"ഇമ്പോർട്ടുചെയ്യുക/എക്സ്പോർട്ടുചെയ്യുക"</string>
+ <string name="menu_import" msgid="6107961135813836467">"ഇമ്പോർട്ടുചെയ്യുക"</string>
+ <string name="menu_export" msgid="2658783911863503902">"എക്സ്പോർട്ട് ചെയ്യുക"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"ബ്ലോക്കുചെയ്ത നമ്പറുകൾ"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> വഴി"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> വഴി <xliff:g id="DATE">%1$s</xliff:g>"</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index b521daf..fcb40c0 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Санал болгосон харилцагчид"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Бүх харилцагчид"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Холбосон харилцагчид"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g>-г устгасан"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Харилцагчийг устгасан</item>
<item quantity="one">Харилцагчийг устгасан</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Ийм шошготой харилцагч байхгүй"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Энэ бүртгэлд харилцагч байхгүй байна"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Таны харилцагчдын жагсаалт хоосон байна"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> хадгалагдсан"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Харилцагчийг хадгалсан"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Харилцагчийг салгасан"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Харилцагчийн өөрчлөлтүүдийг хадгалж чадсангүй"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Дахин залгана уу"</string>
<string name="returnCall" msgid="8171961914203617813">"Буцааж залгах"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\"-г харилцагчдад нэмэх үү?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"харилцагчийн зураг"</string>
<string name="description_plus_button" msgid="515164827856229880">"нэмэх"</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="search_settings_description" msgid="2675223022992445813">"Таны харилцагчдын нэрс"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Огноо"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Шошго"</string>
<string name="change_photo" msgid="8530597935483526383">"Солих"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Ерөнхий зураг"</string>
<string name="description_star" msgid="2605854427360036550">"дуртай"</string>
<string name="edit_contact" msgid="7529281274005689512">"Харилцагчийг засварлах"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"хаах"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Нэр"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Имэйл"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Утас"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Зураг"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Харилцагчдын засварлагчийг дэлгэхийг хүсвэл дарна уу."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Харилцагчдын засварлагчийг буулгахыг хүсвэл дарна уу."</string>
<string name="content_description_directions" msgid="2686791825798189335">"байршил руу очих чиглэл"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"саяхны дуудлага. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. буцааж залгахын тулд товшино уу"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Та: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts апликейшн нь таныг найзуудынхаа мэдээллийг харилцагчийн и-мэйл эсвэл гар утасны талбарт оруулбал илүү сайн ажилладаг."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Нэмэлт талбар"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Зураг солих"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Засварлагчийг нээж чадсангүй."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Дараахад хадгалж байна"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Одоогоор <xliff:g id="ACCOUNT_NAME">%s</xliff:g>-д хадгалж байна. Өөр бүртгэл сонгохын тулд хоёр товшино уу."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">Холбосон харилцагч (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">Холбосон харилцагч</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Нэмэлт талбар"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Зураг солих"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Засварлагчийг нээж чадсангүй."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Хадгалж байна"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Үзэж байгаа"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Одоогоор <xliff:g id="ACCOUNT_NAME">%s</xliff:g>-д хадгалж байна. Өөр бүртгэл сонгохын тулд хоёр товшино уу."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">Холбогдсон харилцагч (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="one">Холбогдсон харилцагч</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> холбосон харилцагч"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Энэ харилцагч"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Боломжит хуулбар"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Эдгээр харилцагчийн хаяг нь ижил хүн байж болзошгүй. Та нэг харилцагчийн хаяг болгон холбох боломжтой."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Холбосон харилцагчид"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Холбогдсон харилцагчид"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Таны бүртгэлээс"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Зураг авах"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Бүх зураг"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Зураг сонгох"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Илгээгч: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>-г устгах"</string>
@@ -549,7 +547,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Дуртай харилцагчдаа хуваалцах"</string>
<string name="share_contacts" msgid="8109287987498711664">"Бүх харилцагчдыг хуваалцах"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Харилцагчдыг хуваалцаж чадсангүй."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Харилцагч импорт/экспорт"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Харилцагчдыг экспортлох"</string>
<string name="dialog_import" msgid="2431698729761448759">"Харилцагч импортлох"</string>
<string name="share_error" msgid="948429331673358107">"Энэ харилцагчийг хуваалцах боломжгүй."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Хуваалцах харилцагчид байхгүй байна."</string>
@@ -564,7 +562,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Байнга харилцсаныг арилгах"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM карт сонгоно уу"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Бүртгэлийг удирдах"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Импорт/экспорт"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Импортлох"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Экспортлох"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Блоклосон дугаар"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g>-р"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="SOURCE">%2$s</xliff:g>-р"</string>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index e9ecbfa..88bc420 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"सूचित संपर्क"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"सर्व संपर्क"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"संपर्कांचा दुवा साधला"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> हटविले"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">संपर्क हटविला</item>
<item quantity="other">संपर्क हटविले</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"या लेबलसह कोणतेही संपर्क नाहीत"</string>
<string name="emptyAccount" msgid="6873962901497975964">"या खात्यामध्ये कोणतेही संपर्क नाहीत"</string>
<string name="emptyMainList" msgid="2772242747899664460">"आपली संपर्क सूची रिक्त आहे"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> जतन केला"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"संपर्क जतन केला"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"संपर्कांचा दुवा रद्द केला"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"संपर्क बदल जतन करणे शक्य झाले नाही"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"पुन्हा कॉल करा"</string>
<string name="returnCall" msgid="8171961914203617813">"उलट कॉल करा"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"संपर्कांमध्ये \"<xliff:g id="EMAIL">%s</xliff:g>\" जोडायचे?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"संपर्क फोटो"</string>
<string name="description_plus_button" msgid="515164827856229880">"अधिक"</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="search_settings_description" msgid="2675223022992445813">"आपल्या संपर्कांची नावे"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"तारीख"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"लेबल"</string>
<string name="change_photo" msgid="8530597935483526383">"बदला"</string>
- <string name="primary_photo" msgid="8517942231868516999">"प्राथमिक फोटो"</string>
<string name="description_star" msgid="2605854427360036550">"आवडते"</string>
<string name="edit_contact" msgid="7529281274005689512">"संपर्क संपादित करा"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"बंद करा"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"नाव"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ईमेल करा"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"फोन"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"फोटो"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"संपर्क संपादक विस्तृत करण्यासाठी क्लिक करा."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"संपर्क संपादक संकुचित करण्यासाठी क्लिक करा."</string>
<string name="content_description_directions" msgid="2686791825798189335">"स्थानाचे दिशानिर्देश"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"अलीकडील कॉल. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. परत कॉल करण्यासाठी क्लिक करा"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"आपण: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"आपण ईमेल फिल्डमध्ये किंवा फोन फिल्डमध्ये एखाद्या व्यक्तीचे Hangouts अभिज्ञापक प्रविष्ट करता तेव्हा Hangouts उत्कृष्ट कार्य करते."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"आणखी फील्ड"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"फोटो बदला"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"संपादक उघडण्यात अयशस्वी."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"यावर जतन करीत आहे"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"सध्या <xliff:g id="ACCOUNT_NAME">%s</xliff:g> मध्ये जतन करीत आहे. भिन्न खाते निवडण्यासाठी दोनदा टॅप करा."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"आणखी फील्ड"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"फोटो बदला"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"संपादक उघडण्यात अयशस्वी."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"यावर जतन करीत आहे"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"पाहिले जात आहे"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"सध्या <xliff:g id="ACCOUNT_NAME">%s</xliff:g> मध्ये जतन करीत आहे. भिन्न खाते निवडण्यासाठी दोनदा टॅप करा."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">दुवा जोडलेला संपर्क (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">दुवा जोडलेले संपर्क (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"हा संपर्क"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"संभाव्य डुप्लिकेट"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"हे संपर्क म्हणजे कदाचित एकच व्यक्ती असू शकते. आपण त्या सर्वांना एकल दुवा म्हणून एकत्र जोडू शकता."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"दुवा साधलेले संपर्क"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"दुवा साधलेले संपर्क"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"आपल्या खात्यांमधून"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"एक फोटो घ्या"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"सर्व फोटो"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"फोटो निवडा"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> कडील"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> हटवा"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"आवडते संपर्क सामायिक करा"</string>
<string name="share_contacts" msgid="8109287987498711664">"सर्व संपर्क सामायिक करा"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"संपर्क सामायिक करण्यात अयशस्वी झाले."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"संपर्क आयात/निर्यात कराcts"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"संपर्क निर्यात करा"</string>
<string name="dialog_import" msgid="2431698729761448759">"संपर्क आयात करा"</string>
<string name="share_error" msgid="948429331673358107">"हा संपर्क सामायिक केला जाऊ शकत नाही."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"सामायिक करण्यासाठी कोणतेही संपर्क नाहीत."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"वारंवारता साफ करा"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"सिम कार्ड निवडा"</string>
<string name="menu_accounts" msgid="1424330057450189074">"खाती व्यवस्थापित करा"</string>
- <string name="menu_import_export" msgid="26217871113229507">"आयात/निर्यात"</string>
+ <string name="menu_import" msgid="6107961135813836467">"आयात"</string>
+ <string name="menu_export" msgid="2658783911863503902">"निर्यात"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"अवरोधित केलेले नंबर"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> द्वारे"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> द्वारे <xliff:g id="DATE">%1$s</xliff:g>"</string>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index e1e5468..a6cc9ba 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Kenalan cadangan"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Semua kenalan"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kenalan dipaut"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> dipadamkan"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kenalan dipadamkan</item>
<item quantity="one">Kenalan dipadamkan</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Tiada kenalan dengan label ini"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Tiada kenalan dalam akaun ini"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Senarai kenalan anda kosong"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> disimpan"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kenalan disimpan."</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kenalan dinyahpaut"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Tidak dapat menyimpan perubahan kenalan"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Panggil semula"</string>
<string name="returnCall" msgid="8171961914203617813">"Balas panggilan"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Tambah \"<xliff:g id="EMAIL">%s</xliff:g>\" kepada kenalan?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"foto kenalan"</string>
<string name="description_plus_button" msgid="515164827856229880">"tambah"</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="search_settings_description" msgid="2675223022992445813">"Nama kenalan anda"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Tarikh"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Label"</string>
<string name="change_photo" msgid="8530597935483526383">"Tukar"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Foto utama"</string>
<string name="description_star" msgid="2605854427360036550">"kegemaran"</string>
<string name="edit_contact" msgid="7529281274005689512">"Edit kenalan"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"tutup"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nama"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-mel"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Klik untuk kembangkan editor kenalan."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Klik untuk runtuhkan editor kenalan."</string>
<string name="content_description_directions" msgid="2686791825798189335">"arah ke lokasi"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"panggilan terbaharu. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. klik untuk memanggil balik"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Anda: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts berfungsi lebih baik apabila anda memasukkan pengecam Hangouts individu itu ke dalam medan e-mel atau telefon."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Lagi medan"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Tukar foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Gagal membuka editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Menyimpan ke"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Pada masa ini menyimpan ke <xliff:g id="ACCOUNT_NAME">%s</xliff:g> . Ketik dua kali untuk memilih akaun yang lain."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">Kenalan dipaut (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">Kenalan dipaut</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Lebih banyak medan"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Tukar foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Gagal membuka editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Menyimpan ke"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Melihat"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Sedang disimpan pada <xliff:g id="ACCOUNT_NAME">%s</xliff:g> pada masa ini. Ketik dua kali untuk memilih akaun yang lain."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">Kenalan dipautkan (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="one">Kenalan dipautkan</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> kenalan dipaut"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Kenalan ini"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Pendua berkemungkinan"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Kenalan ini mungkin orang yang sama. Anda boleh memautnya bersama sebagai satu kenalan."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Kenalan yang dipaut"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Kenalan dipautkan"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Daripada akaun anda"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Ambil foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Semua foto"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Pilih foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Daripada <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Padamkan <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -549,7 +547,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Kongsi kenalan kegemaran"</string>
<string name="share_contacts" msgid="8109287987498711664">"Kongsi semua kenalan"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Gagal berkongsi kenalan."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Import/Eksport kenalan"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Eksport kenalan"</string>
<string name="dialog_import" msgid="2431698729761448759">"Import kenalan"</string>
<string name="share_error" msgid="948429331673358107">"Kenalan ini tidak boleh dikongsi."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Tiada kenalan untuk dikongsi."</string>
@@ -564,7 +562,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Padam bersih kerap dihubungi"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Pilih kad SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Urus akaun"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Import/eksport"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Import"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Eksport"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Nombor yang disekat"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"melalui <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> melalui <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index 0c0832d..eabb00b 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"အကြုံပြုလိုသော အဆက်အသွယ်များ"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"လိပ်စာများအားလုံး"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"ကွင်းဆက်ထားသည့် အဆက်အသွယ်များ"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> ကို ဖျက်လိုက်ပါသည်"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other"> အဆက်အသွယ် ဖျက်ခဲ့သည်</item>
<item quantity="one"> အဆက်အသွယ် ဖျက်ခဲ့သည်</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"ဤအညွှန်းဖြင့်အဆက်အသွယ်များ မရှိပါ"</string>
<string name="emptyAccount" msgid="6873962901497975964">"ဤအကောင့်တွင် အဆက်အသွယ်များ မရှိပါ"</string>
<string name="emptyMainList" msgid="2772242747899664460">"သင့်အဆက်အသွယ်များစာရင်းတွင် မည်သူမျှမရှိပါ"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> ကို သိမ်းဆည်းလိုက်ပါပြီ"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"အဆက်အသွယ်အား သိမ်းဆည်းပြီးပါပြီ"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"အဆက်အသွယ်များကို ကွင်းဆက်ဖြုတ်လိုက်ပြီ"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"အဆက်အသွယ်ပြောင်းလဲမှုများကို သိမ်းဆည်း၍မရပါ"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"ပြန်လည်ခေါ်ဆိုရန်"</string>
<string name="returnCall" msgid="8171961914203617813">"ဖုန်းပြန်ခေါ်ရန်"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" ကို လိပ်စာထဲ ထည့်မလား?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"လိပ်စာမှ ဓာတ်ပုံ"</string>
<string name="description_plus_button" msgid="515164827856229880">"အပေါင်း"</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="search_settings_description" msgid="2675223022992445813">"အဆက်အသွယ်များ၏နာမည်များ"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"ရက်စွဲ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"အညွှန်း"</string>
<string name="change_photo" msgid="8530597935483526383">"ပြောင်းရန်"</string>
- <string name="primary_photo" msgid="8517942231868516999">"အဓိက ဓာတ်ပုံ"</string>
<string name="description_star" msgid="2605854427360036550">"အနှစ်သက်ဆုံး"</string>
<string name="edit_contact" msgid="7529281274005689512">"အဆက်အသွယ်အားပြင်ရန်"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"ပိတ်ရန်"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"အမည်"</string>
<string name="header_email_entry" msgid="8666093061171624478">"အီးမေးလ်"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ဖုန်း"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ဓာတ်ပုံ"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"အဆက်အသွယ် အယ်ဒီတာအား ချဲ့ရန် ကလစ်နှိပ်ပါ။"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"အဆက်အသွယ် အယ်ဒီတာအား ခေါက်ချရန် ကလစ်နှိပ်ပါ။"</string>
<string name="content_description_directions" msgid="2686791825798189335">"တည်နေရာများသို့ လမ်းညွှန်ချက်"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"မကြာမီက ခေါ်ဆိုမှု။ <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. ပြန်ခေါ်ရန် ကလစ်ပါ"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"သင်: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"အီးမေးအကွက် သို့မဟုတ် ဖုန်းနံပါတ် အကွက်တွင် တစ်ခြားသူ၏ Hangouts အမှတ်သညာအား သင်ရိုက်ထည့်သည့်အခါ Hangouts ပိုမိုလွယ်ကူကောင်းမွန်စွာ အလုပ်လုပ်သည်။"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"နောက်ထပ် အကွက်များ"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ဓာတ်ပုံပြောင်းရန်"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"တည်းဖြတ်သူကို ဖွင့်ခြင်းမအောင်မြင်ပါ။"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"သိမ်းဆည်းရန်နေရာ"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"လောလောဆယ်မှာ <xliff:g id="ACCOUNT_NAME">%s</xliff:g>သို့ သိမ်းဆည်းနေသည်။ အခြားအကောင့်ကို ရွေးရန် နှစ်ကြိမ် တို့ပါ။"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">ကွင်းဆက်ချိတ်ထားသည့်အကောင့် (<xliff:g id="COUNT">%d</xliff:g>) ခု</item>
- <item quantity="one"> ကွင်းဆက်ချိတ်ထားသည့် အဆက်အသွယ်</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"နောက်ထပ်အကွက်များ"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ဓာတ်ပုံ ပြောင်းပါ"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"အယ်ဒီတာကို ဖွင့်၍မရပါ။"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"အောက်ပါသို့ သိမ်းနေပါသည်"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"ကြည့်ရှုနေပါသည်"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> သို့ လတ်တလောသိမ်းနေပါသည်။ အခြားအကောင့်ရွေးရန် နှစ်ချက်တို့ပါ။"</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">လင့်ခ်ချိတ်ထားသောအဆက်အသွယ် (<xliff:g id="COUNT">%d</xliff:g>) ခု</item>
+ <item quantity="one">လင့်ခ်ချိတ်ထားသောအဆက်အသွယ်</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"ကွင်းဆက်ချိတ်ထားသည့် အကောင့် <xliff:g id="COUNT">%d</xliff:g> ခု"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"ဤအဆက်အသွယ်"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"ဖြစ်နိုင်သည့် မိတ္တုပွားများ"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ယင်းအဆက်အသွယ်များ လူတစ်ဦးတည်း ဖြစ်နိုင်ပါသည်။ ၎င်းတို့ကို တစ်ခုတည်းသော အဆက်အသွယ် အဖြစ် ချိတ်ဆက်ပေးနိုင်ပါသည်။"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"ကွင်းဆက် အဆက်အသွယ်များ"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"လင့်ခ်ချိတ်ထားသောအဆက်အသွယ်များ"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"သင့်အကောင့်များမှ"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ဓာတ်ပုံရိုက်ရန်"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"ဓာတ်ပုံများအားလုံး"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ဓာတ်ပုံ ရွေးပါ"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> မှ"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> ကိုဖျက်ပါ"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"အကြိုက်ဆုံးအဆက်အသွယ်များကို မျှဝေရန်"</string>
<string name="share_contacts" msgid="8109287987498711664">"အဆက်အသွယ်အားလုံးမျှဝေရန်"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"အဆက်အသွယ်များ မျှဝေ၍မရပါ။"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"အဆက်အသွယ်များ တင်သွင်း/တင်ပို့ရန်"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"အဆက်အသွယ်များ တင်ပို့ပါ"</string>
<string name="dialog_import" msgid="2431698729761448759">"အဆက်အသွယ်များ တင်သွင်းရန်"</string>
<string name="share_error" msgid="948429331673358107">"ဤအဆက်အသွယ်ကို မျှဝေ၍မရပါ။"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"မျှဝေရန်အဆက်အသွယ် မရှိပါ။"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"မကြာခဏဆက်သွယ်လေ့ရှိသူများကို ရှင်းရန်"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM ကဒ်ကို ရွေးရန်"</string>
<string name="menu_accounts" msgid="1424330057450189074">"အကောင့်များစီမံခန့်ခွဲရန်"</string>
- <string name="menu_import_export" msgid="26217871113229507">"တင်သွင်း/တင်ပို့ရန်"</string>
+ <string name="menu_import" msgid="6107961135813836467">"တင်သွင်းရန်"</string>
+ <string name="menu_export" msgid="2658783911863503902">"တင်ပို့ရန်"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"ပိတ်ဆို့ထားသည့် နံပါတ်များ"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> မှတဆင့်"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="SOURCE">%2$s</xliff:g> မှတဆင့်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 8af98bd..3c3642e 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Forslag"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle kontakter"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontaktene er sammenknyttet"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> er slettet"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kontakter er slettet</item>
<item quantity="one">Kontakten er slettet</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Ingen kontakter har denne etiketten"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Ingen kontakter i denne kontoen"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Kontaktlisten din er tom"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> er lagret"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt er lagret"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Tilknytningen mellom kontaktene er fjernet"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Kunne ikke lagre kontaktendringene"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Ring på nytt"</string>
<string name="returnCall" msgid="8171961914203617813">"Ring tilbake"</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_contact_photo" msgid="3387458082667894062">"kontaktbilde"</string>
<string name="description_plus_button" msgid="515164827856229880">"plussknapp"</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="search_settings_description" msgid="2675223022992445813">"Navn på kontakter"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Dato"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etikett"</string>
<string name="change_photo" msgid="8530597935483526383">"Endre"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Hovedbilde"</string>
<string name="description_star" msgid="2605854427360036550">"favoritt"</string>
<string name="edit_contact" msgid="7529281274005689512">"Rediger kontakt"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"lukk"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Navn"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-post"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Klikk for å utvide redigeringsvinduet for kontakter"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Klikk for å skjule redigeringsvinduet for kontakter"</string>
<string name="content_description_directions" msgid="2686791825798189335">"veibeskrivelse til posisjon"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"nylig oppringning. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. klikk for å ringe tilbake"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Du: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts fungerer bedre når du går inn i personenes Hangouts-identifikatorer i e-postfeltet eller telefonfeltet."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Flere felt"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Bytt bilde"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Kunne ikke åpne redigeringsvinduet."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Lagres i"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Lagrer på <xliff:g id="ACCOUNT_NAME">%s</xliff:g> for øyeblikket. Dobbelttrykk for å velge en annen konto."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Flere felt"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Bytt bilde"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Kunne ikke åpne redigeringsvinduet."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Lagres i"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Visningsdata"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Lagrer på <xliff:g id="ACCOUNT_NAME">%s</xliff:g> for øyeblikket. Dobbelttrykk for å velge en annen konto."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Sammenknyttede kontakter (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Sammenknyttet kontakt</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Denne kontakten"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mulige duplikater"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Disse kontaktene kan være den samme personen. Du kan knytte dem sammen til én enkelt kontakt."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Sammenknyttede kontakter"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Sammenknyttede kontakter"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Fra kontoene dine"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Ta et bilde"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Alle bildene"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Velg bilde"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Fra <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Slett <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Del favorittkontaktene"</string>
<string name="share_contacts" msgid="8109287987498711664">"Del alle kontaktene"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Kunne ikke dele kontaktene."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Imp./eksp. kontakter"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Eksporter kontakter"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importer kontakter"</string>
<string name="share_error" msgid="948429331673358107">"Denne kontakten kan ikke deles."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Det finnes ingen kontakter å dele."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Fjern ofte kontaktede personer"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Velg SIM-kort"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Administrer kontoer"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importér/eksportér"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importér"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Eksportér"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blokkerte telefonnumre"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index 1424004..b594126 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"सुझाव गरिएका सम्पर्कहरू"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"सबै सम्पर्कहरू"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"सम्पर्क ठेगानाहरू लिंक गरियो"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> मेटियो"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">सम्पर्क ठेगानाहरू मेटिए</item>
<item quantity="one"> सम्पर्क ठेगाना मेटियो</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"यो लेबल अन्तर्गत कुनै सम्पर्कहरू छैनन्"</string>
<string name="emptyAccount" msgid="6873962901497975964">"यस खातामा कुनै सम्पर्क ठेगानाहरू छैनन्"</string>
<string name="emptyMainList" msgid="2772242747899664460">"तपाईंको सम्पर्क ठेगानाहरूको सूची खाली छ"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> सुरक्षित गरियो"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"सम्पर्क बचत गरियो।"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"सम्पर्क ठेगानाहरू अनलिंक गरियो"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"सम्पर्कमा गरिएका परिवर्तनहरू सुरक्षित गर्न सकिएन"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"फेरि कल गर्नुहोस्"</string>
<string name="returnCall" msgid="8171961914203617813">"कल फर्काउनुहोस्"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" लाई सम्पर्कमा थप्ने?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"तस्बिर सम्पर्क गर्नुहोस्"</string>
<string name="description_plus_button" msgid="515164827856229880">"जोड"</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="search_settings_description" msgid="2675223022992445813">"तपाईँका सम्पर्कहरूका नामहरू"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"मिति"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"लेबल"</string>
<string name="change_photo" msgid="8530597935483526383">"परिवर्तन गर्नुहोस्"</string>
- <string name="primary_photo" msgid="8517942231868516999">"प्राथमिक तस्बिर"</string>
<string name="description_star" msgid="2605854427360036550">"मनपर्ने"</string>
<string name="edit_contact" msgid="7529281274005689512">"सम्पर्क सम्पादन गर्नुहोस्"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"बन्द गर्नुहोस्"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"नाम"</string>
<string name="header_email_entry" msgid="8666093061171624478">"इमेल"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"फोन"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"तस्बिर"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"सम्पर्क सम्पादक विस्तार गर्न क्लिक गर्नुहोस्।"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"सम्पर्क सम्पादक समाप्त गर्न क्लिक गर्नुहोस्।"</string>
<string name="content_description_directions" msgid="2686791825798189335">"स्थानको लागि निर्देशनहरू"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"हालैको कल। <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. कल फिर्ता गर्न क्लिक गर्नुहोस्"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"तपाईँ: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"तपाईंले इमेल क्षेत्र वा फोन क्षेत्रमा व्यक्तिको Hangouts परिचायक प्रविष्ट गर्नु हुँदा Hangouts राम्रो काम गर्दछ।"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"थप क्षेत्रहरू"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"तस्बिर परिवर्तन गर्नुहोस्"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"सम्पादक खोल्न असफल भयो।"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"यसमा सुरक्षित गर्दै"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> मा हाल सुरक्षित गर्दै। भिन्न खाता परिवर्तन गर्न डबल ट्याप गर्नुहोस्।"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"थप क्षेत्रहरू"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"तस्बिर बदल्नुहोस्"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"सम्पादक खोल्न सकिएन।"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"यसमा सुरक्षित गरिँदै"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"हेर्दै"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"हाल <xliff:g id="ACCOUNT_NAME">%s</xliff:g> मा सुरक्षित गरिँदै। भिन्न खाता चयन गर्न डबल ट्याप गर्नुहोस्।"</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">लिंक गरिएका सम्पर्क ठेगानाहरू (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">लिंक गरिएको सम्पर्क ठेगाना</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"यो सम्पर्क ठेगाना"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"सम्भावित प्रतिलिपिहरू"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"यी सम्पर्कहरू एउटै व्यक्तिको हुन सक्छ। तपाईँले एउटै सम्पर्कको रूपमा तिनीहरूलाई सँगै लिंक गर्न सक्नुहुन्छ।"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"लिंक गरिएका सम्पर्क ठेगानाहरू"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"लिंक गरिएका सम्पर्क ठेगानाहरू"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"तपाईंका खाताहरूबाट"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"तस्बिर खिच्नुहोस्"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"सबै तस्बिरहरू"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"तस्बिर छान्नुहोस्"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> बाट"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> मेट्नुहोस्"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"मनपर्ने सम्पर्कहरू आदान-प्रदान गर्नुहोस्"</string>
<string name="share_contacts" msgid="8109287987498711664">"सबै सम्पर्क आदान-प्रदान गर्ने"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"सम्पर्कहरू आदान-प्रदान गर्न सकिएन।"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"आयात/निर्यात सम्पर्कहरू"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"सम्पर्क ठेगानाहरू निर्यात गर्नुहोस्"</string>
<string name="dialog_import" msgid="2431698729761448759">"सम्पर्कहरू आयात गर्नुहोस्"</string>
<string name="share_error" msgid="948429331673358107">"यो सम्पर्क साझेदारी गर्न मिल्दैन।"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"आदान-प्रदान गर्न कुनै सम्पर्क ठेगानाहरू छैनन्।"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"बारम्बार गरिएको क्लियर गर्नुहोस्"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"सिम कार्ड चयन गर्नुहोस्"</string>
<string name="menu_accounts" msgid="1424330057450189074">"खाताहरू व्यवस्थापन गर्नुहोस्"</string>
- <string name="menu_import_export" msgid="26217871113229507">"आयात/निर्यात"</string>
+ <string name="menu_import" msgid="6107961135813836467">"आयात गर्नुहोस्"</string>
+ <string name="menu_export" msgid="2658783911863503902">"निर्यात गर्नुहोस्"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"रोकिएका नम्बरहरू"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g>मार्फत"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> मार्फत <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 2baa9d3..8dfb402 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Mogelijke contacten"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alle contacten"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contacten gekoppeld"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> verwijderd"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Contacten verwijderd</item>
<item quantity="one">Contact verwijderd</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Geen contacten met dit label"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Geen contacten in dit account"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Je contactenlijst is leeg"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> opgeslagen"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Contact opgeslagen"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contacten losgekoppeld"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Kan wijzigingen in contact niet opslaan"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Opnieuw bellen"</string>
<string name="returnCall" msgid="8171961914203617813">"Terugbellen"</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_contact_photo" msgid="3387458082667894062">"contactfoto"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Namen van je contacten"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Datum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Labelen"</string>
<string name="change_photo" msgid="8530597935483526383">"Wijzigen"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Primaire foto"</string>
<string name="description_star" msgid="2605854427360036550">"favoriet"</string>
<string name="edit_contact" msgid="7529281274005689512">"Contact bewerken"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"sluiten"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Naam"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-mail"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefoon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Klik om contacteditor uit te vouwen."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Klik om contacteditor samen te vouwen."</string>
<string name="content_description_directions" msgid="2686791825798189335">"routebeschrijving naar locatie"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"recente oproep. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. klik om terug te bellen"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Jij: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts werkt beter wanneer je de Hangouts-ID van de betreffende persoon in het veld \'E-mail\' of \'Telefoon\' opgeeft."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Meer velden"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Foto wijzigen"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Kan editor niet openen."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Opslaan in"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Wordt momenteel opgeslagen in <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dubbeltik om een ander account te kiezen."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Meer velden"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Foto wijzigen"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Kan editor niet openen."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Opslaan in"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Bekijken"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Wordt momenteel opgeslagen in <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Dubbeltik om een ander account te kiezen."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Gelinkte contacten (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Gelinkt contact</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Dit contact"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mogelijke duplicaten"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Deze contacten zijn mogelijk dezelfde persoon. Je kunt ze linken tot één contact."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Gekoppelde contacten"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Gelinkte contacten"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Vanuit je accounts"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Een foto maken"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Alle foto\'s"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Foto kiezen"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Van <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> verwijderen"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Favoriete contacten delen"</string>
<string name="share_contacts" msgid="8109287987498711664">"Alle contacten delen"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Kan contacten niet delen."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Contacten importeren/exporteren"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Contacten exporteren"</string>
<string name="dialog_import" msgid="2431698729761448759">"Contacten importeren"</string>
<string name="share_error" msgid="948429331673358107">"Dit contact kan niet worden gedeeld."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Er zijn geen contacten om te delen."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Regelmatige contacten wissen"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Simkaart selecteren"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Accounts beheren"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importeren/exporteren"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importeren"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exporteren"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Geblokkeerde nummers"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml
index 455a6f6..99d8fa3 100644
--- a/res/values-pa-rIN/strings.xml
+++ b/res/values-pa-rIN/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"ਸੁਝਾਏ ਗਏ ਸੰਪਰਕ"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"ਸਾਰੇ ਸੰਪਰਕ"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"ਸੰਪਰਕ ਲਿੰਕ ਕੀਤੇ ਗਏ"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਮਿਟਾਇਆ ਗਿਆ"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one"> ਸੰਪਰਕ ਹਟਾਏ</item>
<item quantity="other"> ਸੰਪਰਕ ਹਟਾਏ</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"ਇਸ ਲੇਬਲ ਨਾਲ ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ"</string>
<string name="emptyAccount" msgid="6873962901497975964">"ਇਸ ਖਾਤੇ ਵਿੱਚ ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ ਹਨ"</string>
<string name="emptyMainList" msgid="2772242747899664460">"ਤੁਹਾਡੀ ਸੰਪਰਕਾਂ ਦੀ ਸੂਚੀ ਖਾਲੀ ਹੈ"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> ਨੂੰ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"ਸੰਪਰਕ ਸਹੇਜਿਆ"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"ਸੰਪਰਕ ਅਨਲਿੰਕ ਕੀਤੇ"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"ਸੰਪਰਕ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਨੂੰ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"ਦੁਬਾਰਾ ਕਾਲ ਕਰੋ"</string>
<string name="returnCall" msgid="8171961914203617813">"ਕਾਲ ਤੇ ਵਾਪਸ ਜਾਓ"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"ਕੀ \"<xliff:g id="EMAIL">%s</xliff:g>\" ਨੂੰ ਸੰਪਰਕਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰਨਾ ਹੈ?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"ਸੰਪਰਕ ਫੋਟੋ"</string>
<string name="description_plus_button" msgid="515164827856229880">"ਪਲਸ"</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="search_settings_description" msgid="2675223022992445813">"ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਦੇ ਨਾਮ"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"ਮਿਤੀ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"ਲੇਬਲ ਕਰੋ"</string>
<string name="change_photo" msgid="8530597935483526383">"ਬਦਲੋ"</string>
- <string name="primary_photo" msgid="8517942231868516999">"ਪ੍ਰਾਈਮਰੀ ਫੋਟੋ"</string>
<string name="description_star" msgid="2605854427360036550">"ਮਨਪਸੰਦ"</string>
<string name="edit_contact" msgid="7529281274005689512">"ਸੰਪਰਕ ਸੰਪਾਦਿਤ ਕਰੋ"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"ਬੰਦ ਕਰੋ"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"ਨਾਮ"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ਈਮੇਲ"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ਫੋਨ"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ਫੋਟੋ"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"ਸੰਪਰਕ ਸੰਪਾਦਕ ਦਾ ਵਿਸਤਾਰ ਕਰਨ ਲਈ ਕਲਿਕ ਕਰੋ।"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"ਸੰਪਰਕ ਸੰਪਾਦਕ ਨਸ਼ਟ ਕਰਨ ਲਈ ਕਲਿਕ ਕਰੋ।"</string>
<string name="content_description_directions" msgid="2686791825798189335">"ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਲਈ ਨਿਰਦੇਸ਼"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"ਹਾਲੀਆ ਕਾਲ। <xliff:g id="CALL_TYPE">%s</xliff:g>। <xliff:g id="PHONE_NUMBER">%s</xliff:g>। <xliff:g id="DATE">%s</xliff:g>। ਕਾਲ ਬੈਕ ਕਰਨ ਲਈ ਕਲਿਕ ਕਰੋ।"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"ਤੁਸੀਂ: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"ਜਦੋਂ ਤੁਸੀਂ ਈਮੇਲ ਖੇਤਰ ਜਾਂ ਫੋਨ ਖੇਤਰ ਵਿੱਚ ਵਿਅਕਤੀ ਦਾ ਹੈਂਗਆਊਟਸ ਆਈਡੈਂਟੀਫਾਇਰ ਦਰਜ ਕਰਦੇ ਹੋ ਤਾਂ ਹੈਂਗਆਊਟਸ ਬਿਹਤਰ ਕੰਮ ਕਰਦਾ ਹੈ।"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"ਹੋਰ ਖੇਤਰ"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ਫੋਟੋ ਬਦਲੋ"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"ਸੰਪਾਦਕ ਨੂੰ ਖੋਲ੍ਹਣ ਵਿੱਚ ਅਸਫਲ।"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"ਏਥੇ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"ਮੌਜੂਦਾ ਤੌਰ \'ਤੇ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ। ਇੱਕ ਵੱਖਰਾ ਖਾਤਾ ਚੁਣਨ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ।"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one"> ਲਿੰਕ ਕੀਤੇ ਗਏ ਸੰਪਰਕ ( <xliff:g id="COUNT">%d</xliff:g> )</item>
- <item quantity="other"> ਲਿੰਕ ਕੀਤੇ ਗਏ ਸੰਪਰਕ ( <xliff:g id="COUNT">%d</xliff:g> )</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"ਹੋਰ ਖੇਤਰ"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ਫ਼ੋਟੋ ਬਦਲੋ"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"ਸੰਪਾਦਕ ਖੋਲ੍ਹਣਾ ਅਸਫਲ ਰਿਹਾ।"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"ਇਸ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"ਵੇਖਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"ਵਰਤਮਾਨ ਰੂਪ ਵਿੱਚ <xliff:g id="ACCOUNT_NAME">%s</xliff:g> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ। ਇੱਕ ਵੱਖਰਾ ਖਾਤਾ ਚੁਣਨ ਲਈ ਡਬਲ-ਟੈਪ ਕਰੋ।"</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="one">ਲਿੰਕ ਕੀਤੇ ਗਏ ਸੰਪਰਕ ( <xliff:g id="COUNT">%d</xliff:g> )</item>
+ <item quantity="other">ਲਿੰਕ ਕੀਤੇ ਗਏ ਸੰਪਰਕ ( <xliff:g id="COUNT">%d</xliff:g> )</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> ਲਿੰਕ ਕੀਤੇ ਸੰਪਰਕ"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"ਇਹ ਸੰਪਰਕ"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"ਸੰਭਵ ਡੁਪਲੀਕੇਟ"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ਇਹ ਸੰਪਰਕ ਇਕੋ ਵਿਅਕਤੀ ਦੇ ਹੋ ਸਕਦੇ ਹਨ। ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਇੱਕ ਇੱਕਲੇ ਸੰਪਰਕ ਵੱਜੋਂ ਲਿੰਕ ਕਰ ਸਕਦੇ ਹੋ।"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"ਲਿੰਕ ਕੀਤੇ ਗਏ ਸੰਪਰਕ"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"ਲਿੰਕ ਕੀਤੇ ਗਏ ਸੰਪਰਕ"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"ਤੁਹਾਡੇ ਖਾਤਿਆਂ ਤੋਂ"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ਇੱਕ ਫੋਟੋ ਲਓ"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"ਸਾਰੀਆਂ ਫੋਟੋਆਂ"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ਫੋਟੋ ਚੁਣੋ"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> ਵੱਲੋਂ"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> ਹਟਾਓ"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"ਮਨਪਸੰਦ ਸੰਪਰਕਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ"</string>
<string name="share_contacts" msgid="8109287987498711664">"ਸਾਰੇ ਸੰਪਰਕ ਸਾਂਝੇ ਕਰੋ"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"ਸੰਪਰਕ ਸਾਂਝੇ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ।"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"ਸੰਪਰਕ ਆਯਾਤ/ਨਿਰਯਾਤ ਕਰੋ"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"ਸੰਪਰਕ ਨਿਰਯਾਤ ਕਰੋ"</string>
<string name="dialog_import" msgid="2431698729761448759">"ਸੰਪਰਕ ਆਯਾਤ ਕਰੋ"</string>
<string name="share_error" msgid="948429331673358107">"ਇਸ ਸੰਪਰਕ ਨੂੰ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"ਸਾਂਝਾ ਕਰਨ ਲਈ ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ ਹਨ।"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"ਅਕਸਰ ਆਉਣ ਵਾਲਿਆਂ ਨੂੰ ਸਾਫ਼ ਕਰੋ"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM ਕਾਰਡ ਚੁਣੋ"</string>
<string name="menu_accounts" msgid="1424330057450189074">"ਖਾਤੇ ਪ੍ਰਬੰਧਿਤ ਕਰੋ"</string>
- <string name="menu_import_export" msgid="26217871113229507">"ਆਯਾਤ/ਨਿਰਯਾਤ ਕਰੋ"</string>
+ <string name="menu_import" msgid="6107961135813836467">"ਆਯਾਤ ਕਰੋ"</string>
+ <string name="menu_export" msgid="2658783911863503902">"ਨਿਰਯਾਤ ਕਰੋ"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"ਬਲੌਕ ਕੀਤੇ ਨੰਬਰ"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> ਦੇ ਰਾਹੀਂ"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> ਦੇ ਰਾਹੀਂ <xliff:g id="DATE">%1$s</xliff:g>"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 4bfa61e..b017162 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Sugerowane kontakty"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Wszystkie kontakty"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontakty zostały połączone"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Kontakt <xliff:g id="NAME">%s</xliff:g> usunięty"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="few">Kontakty zostały usunięte</item>
<item quantity="many">Kontakty zostały usunięte</item>
@@ -117,6 +118,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Brak kontaktów z tą etykietą"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Na tym koncie nie ma żadnych kontaktów"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Twoja lista kontaktów jest pusta"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Kontakt <xliff:g id="DISPLAY_NAME">%s</xliff:g> został zapisany"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt został zapisany"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontakty zostały odłączone"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Nie udało się zapisać zmian kontaktu"</string>
@@ -159,7 +161,6 @@
<string name="callAgain" msgid="3197312117049874778">"Zadzwoń ponownie"</string>
<string name="returnCall" msgid="8171961914203617813">"Połączenie zwrotne"</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_contact_photo" msgid="3387458082667894062">"zdjęcie kontaktu"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Imiona i nazwiska oraz nazwy w Twoich kontaktach"</string>
@@ -206,7 +207,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Data"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Dodaj etykietę"</string>
<string name="change_photo" msgid="8530597935483526383">"Zmień"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Główne zdjęcie"</string>
<string name="description_star" msgid="2605854427360036550">"ulubione"</string>
<string name="edit_contact" msgid="7529281274005689512">"Edytuj kontakt"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"zamknij"</string>
@@ -283,7 +283,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Imię i nazwisko"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-mail"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Zdjęcie"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kliknij, by rozwinąć edytor kontaktów."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kliknij, by zwinąć edytor kontaktów."</string>
<string name="content_description_directions" msgid="2686791825798189335">"trasa do lokalizacji"</string>
@@ -294,12 +293,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"ostatnie połączenie. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. kliknij, by oddzwonić"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Ty: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"W przypadku Hangouts lepiej wpisać identyfikator danej osoby w polu adresu e-mail lub telefonu."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Więcej pól"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Zmień zdjęcie"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Nie udało się otworzyć edytora."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Zapisz na koncie"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Obecnie zapisujesz na koncie <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Kliknij dwukrotnie, by wybrać inne."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Więcej pól"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Zmień zdjęcie"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Nie udało się otworzyć edytora."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Zapisz na koncie"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Przeglądasz"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Obecnie zapisujesz na koncie <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Kliknij dwukrotnie, by wybrać inne."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="few">Kontakty połączone (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="many">Kontakty połączone (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Kontakty połączone (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -331,10 +331,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ten kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Możliwe duplikaty"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Te kontakty mogą dotyczyć tej samej osoby. Możesz je połączyć w jeden kontakt."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Połączone kontakty"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Połączone kontakty"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Z Twoich kont"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Zrób zdjęcie"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Wszystkie zdjęcia"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Wybierz zdjęcie"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Z konta <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Usuń <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -569,7 +567,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Udostępnij ulubione kontakty"</string>
<string name="share_contacts" msgid="8109287987498711664">"Udostępnij wszystkie kontakty"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Nie udało się udostępnić kontaktów."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importuj/eksportuj kontakty"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Eksportuj kontakty"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importuj kontakty"</string>
<string name="share_error" msgid="948429331673358107">"Tego kontaktu nie można udostępniać."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Brak kontaktów do udostępnienia."</string>
@@ -584,7 +582,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Wyczyść częste kontakty"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Wybierz kartę SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Zarządzaj kontami"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importuj/eksportuj"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importuj"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Eksportuj"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Zablokowane numery"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"przez: <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g>, przez: <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index c77fe60..e202ea5 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contatos sugeridos"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Todos os contatos"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contatos vinculados"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> excluído"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Contatos excluídos</item>
<item quantity="other">Contatos excluídos</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Nenhum contato com este marcador"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Nenhum contato nesta conta"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Sua lista de contatos está vazia"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Contato salvo: <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"O contato foi salvo"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contatos desvinculados"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Não foi possível salvar as alterações do contato"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Ligar novamente"</string>
<string name="returnCall" msgid="8171961914203617813">"Retornar chamada"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Adicionar \"<xliff:g id="EMAIL">%s</xliff:g>\" aos contatos?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"foto do contato"</string>
<string name="description_plus_button" msgid="515164827856229880">"mais"</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="search_settings_description" msgid="2675223022992445813">"Nomes dos seus contatos"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Data"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Marcador"</string>
<string name="change_photo" msgid="8530597935483526383">"Alterar"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Foto principal"</string>
<string name="description_star" msgid="2605854427360036550">"favorito"</string>
<string name="edit_contact" msgid="7529281274005689512">"Editar contato"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"fechar"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nome"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-mail"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefone"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Clique para expandir o editor de contatos."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Clique para recolher o editor de contatos."</string>
<string name="content_description_directions" msgid="2686791825798189335">"rotas até o local"</string>
@@ -280,13 +279,14 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"chamada recente. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. clique para retornar a chamada"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Você: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"O Hangouts funciona melhor quando você insere o identificador do Hangouts da pessoa no campo de e-mail ou de telefone."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Mais campos"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Alterar foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Falha ao abrir o editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Salvar em"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Salvando em <xliff:g id="ACCOUNT_NAME">%s</xliff:g> no momento. Toque duas vezes para escolher uma conta diferente."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one">Contatos vinculados (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Mais campos"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Alterar foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Falha ao abrir o editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Salvar em"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Visualizando"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Salvando em <xliff:g id="ACCOUNT_NAME">%s</xliff:g> no momento. Toque duas vezes para escolher uma conta diferente."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="one">Contato vinculado (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Contatos vinculados (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> contatos vinculados"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Este contato"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Possíveis cópias"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Talvez esses contatos sejam a mesma pessoa. É possível vinculá-los como um único contato."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Contatos vinculados"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Contatos vinculados"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Das suas contas"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Tirar uma foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Todas as fotos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Escolher foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"De <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Excluir <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Compartilhar contatos favoritos"</string>
<string name="share_contacts" msgid="8109287987498711664">"Compartilhar todos os contatos"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Falha ao compartilhar contatos."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importar/Exportar contatos"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exportar contatos"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importar contatos"</string>
<string name="share_error" msgid="948429331673358107">"Este contato não pode ser compartilhado."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Não há contatos para compartilhar."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Apagar frequentes"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Selecionar cartão SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Gerenciar contas"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importar/Exportar"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importar"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportar"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Números bloqueados"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"por meio de <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 3eea103..2413369 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contactos sugeridos"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Todos os contactos"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contacts linked"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"O contacto <xliff:g id="NAME">%s</xliff:g> foi eliminado"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Contactos eliminados</item>
<item quantity="one">Contacto eliminado</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Sem contactos com esta etiqueta"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Não existem contactos nesta conta"</string>
<string name="emptyMainList" msgid="2772242747899664460">"A sua lista de contactos está vazia"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> guardado"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Contacto guardado"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contactos desassociados"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Não foi possível guardar as alterações do contacto"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Ligar novamente"</string>
<string name="returnCall" msgid="8171961914203617813">"Devolver chamada"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Adicionar \"<xliff:g id="EMAIL">%s</xliff:g>\" aos contactos?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"fotografia do contacto"</string>
<string name="description_plus_button" msgid="515164827856229880">"mais"</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="search_settings_description" msgid="2675223022992445813">"Nomes dos contactos"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Data"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiqueta"</string>
<string name="change_photo" msgid="8530597935483526383">"Alterar"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Fot. principal"</string>
<string name="description_star" msgid="2605854427360036550">"favorito"</string>
<string name="edit_contact" msgid="7529281274005689512">"Editar contacto"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"fechar"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nome"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Email"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telemóvel"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fotografia"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Clique para expandir o editor de contactos."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Clique para reduzir o editor de contactos."</string>
<string name="content_description_directions" msgid="2686791825798189335">"direções para a localização"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"chamada recente. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. clique para ligar de volta"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"O utilizador: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"O Hangouts funciona melhor quando introduz o identificador do Hangouts da pessoa no campo do email ou no campo do telefone."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Mais campos"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Alterar foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Falha ao abrir o editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"A guardar em"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"A guardar atualmente em <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Toque duas vezes para escolher uma conta diferente."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Mais campos"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Alterar foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Ocorreu uma falha ao abrir o editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"A guardar em"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"A visualizar"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"A guardar atualmente em <xliff:g id="ACCOUNT_NAME">%s</xliff:g>... Toque duas vezes para escolher uma conta diferente."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Contactos ligados (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Contacto ligado</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Este contacto"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Possíveis duplicados"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Estes contactos podem ser da mesma pessoa. Pode associá-los num único contacto."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Contactos ligados"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Contactos ligados"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Das suas contas"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Tirar uma foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Todas as fotos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Escolher foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"De <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Eliminar <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Partilhar contactos favoritos"</string>
<string name="share_contacts" msgid="8109287987498711664">"Partilhar todos os contactos"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Falha ao partilhar os contactos."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importar/export. contactos"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exportar contactos"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importar contactos"</string>
<string name="share_error" msgid="948429331673358107">"Não é possível partilhar este contacto."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Não existem contactos para partilhar."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Limpar frequentes"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Selecionar cartão SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Gerir contas"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importar/exportar"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importar"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportar"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Números bloqueados"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"através do <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> através do <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index c77fe60..e202ea5 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Contatos sugeridos"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Todos os contatos"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Contatos vinculados"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> excluído"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Contatos excluídos</item>
<item quantity="other">Contatos excluídos</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Nenhum contato com este marcador"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Nenhum contato nesta conta"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Sua lista de contatos está vazia"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Contato salvo: <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"O contato foi salvo"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Contatos desvinculados"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Não foi possível salvar as alterações do contato"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Ligar novamente"</string>
<string name="returnCall" msgid="8171961914203617813">"Retornar chamada"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Adicionar \"<xliff:g id="EMAIL">%s</xliff:g>\" aos contatos?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"foto do contato"</string>
<string name="description_plus_button" msgid="515164827856229880">"mais"</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="search_settings_description" msgid="2675223022992445813">"Nomes dos seus contatos"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Data"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Marcador"</string>
<string name="change_photo" msgid="8530597935483526383">"Alterar"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Foto principal"</string>
<string name="description_star" msgid="2605854427360036550">"favorito"</string>
<string name="edit_contact" msgid="7529281274005689512">"Editar contato"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"fechar"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nome"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-mail"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefone"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Foto"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Clique para expandir o editor de contatos."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Clique para recolher o editor de contatos."</string>
<string name="content_description_directions" msgid="2686791825798189335">"rotas até o local"</string>
@@ -280,13 +279,14 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"chamada recente. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. clique para retornar a chamada"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Você: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"O Hangouts funciona melhor quando você insere o identificador do Hangouts da pessoa no campo de e-mail ou de telefone."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Mais campos"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Alterar foto"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Falha ao abrir o editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Salvar em"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Salvando em <xliff:g id="ACCOUNT_NAME">%s</xliff:g> no momento. Toque duas vezes para escolher uma conta diferente."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one">Contatos vinculados (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Mais campos"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Alterar foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Falha ao abrir o editor."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Salvar em"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Visualizando"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Salvando em <xliff:g id="ACCOUNT_NAME">%s</xliff:g> no momento. Toque duas vezes para escolher uma conta diferente."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="one">Contato vinculado (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Contatos vinculados (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> contatos vinculados"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Este contato"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Possíveis cópias"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Talvez esses contatos sejam a mesma pessoa. É possível vinculá-los como um único contato."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Contatos vinculados"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Contatos vinculados"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Das suas contas"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Tirar uma foto"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Todas as fotos"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Escolher foto"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"De <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Excluir <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Compartilhar contatos favoritos"</string>
<string name="share_contacts" msgid="8109287987498711664">"Compartilhar todos os contatos"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Falha ao compartilhar contatos."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importar/Exportar contatos"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exportar contatos"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importar contatos"</string>
<string name="share_error" msgid="948429331673358107">"Este contato não pode ser compartilhado."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Não há contatos para compartilhar."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Apagar frequentes"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Selecionar cartão SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Gerenciar contas"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importar/Exportar"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importar"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportar"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Números bloqueados"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"por meio de <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 47c114c..116f394 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Persoane din agendă sugerate"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Toată agenda"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Persoanele de contact au fost asociate"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"S-a șters <xliff:g id="NAME">%s</xliff:g>."</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="few">Persoane de contact șterse</item>
<item quantity="other">Persoane de contact șterse</item>
@@ -114,6 +115,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Nicio persoană de contact cu această etichetă"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Nicio persoană de contact în acest cont"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Lista cu persoane de contact este goală"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"S-a salvat <xliff:g id="DISPLAY_NAME">%s</xliff:g>."</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Persoana din agendă a fost salvată"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Persoanele de contact au fost separate"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Nu s-au putut salva modificările persoanei de contact"</string>
@@ -153,7 +155,6 @@
<string name="callAgain" msgid="3197312117049874778">"Apelați din nou"</string>
<string name="returnCall" msgid="8171961914203617813">"Apelați înapoi"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Adăugați „<xliff:g id="EMAIL">%s</xliff:g>” în agendă?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"fotografia persoanei din agendă"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Numele persoanelor din agenda dvs."</string>
@@ -199,7 +200,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Dată"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etichetă"</string>
<string name="change_photo" msgid="8530597935483526383">"Modificați"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Foto. de bază"</string>
<string name="description_star" msgid="2605854427360036550">"preferate"</string>
<string name="edit_contact" msgid="7529281274005689512">"Editați informațiile despre persoana din agendă"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"închideți"</string>
@@ -276,7 +276,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Nume"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-mail"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fotografie"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Dați clic pentru a extinde editorul persoanei de contact."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Dați clic pentru a restrânge editorul persoanei de contact."</string>
<string name="content_description_directions" msgid="2686791825798189335">"indicații de orientare către locație"</string>
@@ -287,12 +286,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"apel recent. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. dați clic pentru a apela"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Dvs.: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts funcționează mai bine când introduceți identificatorul Hangouts al persoanei în câmpul pentru adresa de e-mail sau în câmpul pentru numărul de telefon."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Mai multe câmpuri"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Schimbați fotografia"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Editorul nu a putut fi deschis."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Se salvează în"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"În prezent se salvează în <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Atingeți de două ori ca să alegeți alt cont."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Mai multe câmpuri"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Schimbați fotografia"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Editorul nu a putut fi deschis."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Se salvează în"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Se afișează"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"În prezent se salvează în <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Atingeți de două ori ca să alegeți alt cont."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="few">Persoane de contact asociate (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Persoane de contact asociate (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Persoană de contact asociată</item>
@@ -320,10 +320,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Această persoană de contact"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Dubluri posibile"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Este posibil ca aceste persoane de contact să fie una și aceeași persoană. Le puteți asocia ca o singură persoană de contact."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Persoane de contact asociate"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Persoane de contact asociate"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Din conturile dvs."</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Fotografiați"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Toate fotografiile"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Alegeți o fotografie"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Din contul <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Ștergeți <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -558,7 +556,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Trimiteți persoanele preferate"</string>
<string name="share_contacts" msgid="8109287987498711664">"Trimiteți toată agenda"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Persoanele de contact nu s-au trimis."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Import/export contacte"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exportați Agenda"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importați Agenda"</string>
<string name="share_error" msgid="948429331673358107">"Această persoană de contact nu poate fi distribuită."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Nu există persoane de contact de trimis."</string>
@@ -573,7 +571,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Șterg. pers. frecv. contact."</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Selectați cardul SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Gestionați conturile"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importați/exportați"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importați"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportați"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Numere blocate"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"de pe <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"La ora <xliff:g id="DATE">%1$s</xliff:g> de pe <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 633472c..114bf8c 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Предлагаемые контакты"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Все контакты"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Контакты связаны"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Контакт <xliff:g id="NAME">%s</xliff:g> удален"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Контакты удалены</item>
<item quantity="few">Контакты удалены</item>
@@ -117,6 +118,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Нет контактов с таким ярлыком"</string>
<string name="emptyAccount" msgid="6873962901497975964">"В этом аккаунте нет контактов"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Контактов нет"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g>: контакт сохранен"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Контакт сохранен"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Контакты разделены"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Не удалось сохранить изменения"</string>
@@ -159,7 +161,6 @@
<string name="callAgain" msgid="3197312117049874778">"Позвонить снова"</string>
<string name="returnCall" msgid="8171961914203617813">"Перезвонить"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Добавить в контакты <xliff:g id="EMAIL">%s</xliff:g>?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"фотография контакта"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</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="search_settings_description" msgid="2675223022992445813">"Имена контактов"</string>
@@ -206,7 +207,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Дата"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Ярлык"</string>
<string name="change_photo" msgid="8530597935483526383">"Изменить"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Основное фото"</string>
<string name="description_star" msgid="2605854427360036550">"избранное"</string>
<string name="edit_contact" msgid="7529281274005689512">"Изменить контакт"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"закрыть"</string>
@@ -283,7 +283,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Имя"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Адрес эл. почты"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Телефон"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Фото"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Нажмите, чтобы развернуть редактор контактов."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Нажмите, чтобы свернуть редактор контактов."</string>
<string name="content_description_directions" msgid="2686791825798189335">"Маршруты"</string>
@@ -294,12 +293,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Недавний вызов. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Нажмите, чтобы перезвонить."</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Вы: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Чтобы обеспечить надежную работу Hangouts, указывайте вместо адреса электронной почты или номера телефона идентификатор пользователя в Hangouts."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Показать другие поля"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Сменить фото"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Не удалось открыть редактор"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Выберите аккаунт"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Данные сохраняются в аккаунте <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Чтобы выбрать другой аккаунт, дважды нажмите здесь."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Показать другие поля"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Сменить фото"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Не удалось открыть редактор"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Сохранение:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Просмотр:"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Данные сохраняются в аккаунте <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Чтобы выбрать другой аккаунт, нажмите дважды."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Связанные контакты (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="few">Связанные контакты (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="many">Связанные контакты (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -331,10 +331,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Этот контакт"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Повторяющиеся контакты"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Возможно, эти контакты относятся к одному человеку. Объедините их."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Связанные контакты"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Связанные контакты"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Из ваших аккаунтов"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Сделать фото"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Все фото"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Выбор фото"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Из <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Удалить данные. <xliff:g id="DATA_TYPE">%s </xliff:g> <xliff:g id="DATA_KIND">%s</xliff:g>."</string>
@@ -569,7 +567,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Поделиться избранными контактами"</string>
<string name="share_contacts" msgid="8109287987498711664">"Поделиться всеми контактами"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Не удалось поделиться контактами"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Импорт/экспорт контактов"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Экспорт контактов"</string>
<string name="dialog_import" msgid="2431698729761448759">"Импорт контактов"</string>
<string name="share_error" msgid="948429331673358107">"Не удалось передать данные."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Видимых контактов нет"</string>
@@ -584,7 +582,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Очистить популярные контакты"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Выбрать SIM-карту"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Настроить аккаунты"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Импорт/экспорт"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Импортировать"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Экспортировать"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Заблокированные номера"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"с помощью <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> с помощью <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 79b7179..b1fc263 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"යෝජිත සම්බන්ධතා"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"සියලුම සම්බන්ධතා"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"සම්බන්ධතා සබැඳි කරන ලදී"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> මකන ලදී"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">සම්බන්ධතා මකන ලදී</item>
<item quantity="other">සම්බන්ධතා මකන ලදී</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"මෙම ලේබලය සහිත සම්බන්ධතා නැත."</string>
<string name="emptyAccount" msgid="6873962901497975964">"මෙම ගිණුමෙහි සම්බන්ධතා නොමැත"</string>
<string name="emptyMainList" msgid="2772242747899664460">"ඔබගේ සම්බන්ධතා ලැයිස්තුව හිස්ය"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> සුරැකිණි"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"සම්බන්ධතාවය සුරකින ලදි"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"සම්බන්ධතා සබැඳි ඉවත් කරන ලදී"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"සම්බන්ධතාවේ වෙනස් කිරීම් සුරැකීමට නොහැකි විය"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"නැවත අමතන්න"</string>
<string name="returnCall" msgid="8171961914203617813">"ඇමතුම නැවත ලබා දෙන්න"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"සම්බන්ධතා වලට \"<xliff:g id="EMAIL">%s</xliff:g>\" එක් කරන්නද?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"සම්බන්ධතා ඡායාරූපය"</string>
<string name="description_plus_button" msgid="515164827856229880">"ධන"</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="search_settings_description" msgid="2675223022992445813">"ඔබගේ සම්බන්ධතා වල නම්"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"දිනය"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"ලේබලය"</string>
<string name="change_photo" msgid="8530597935483526383">"වෙනස් කරන්න"</string>
- <string name="primary_photo" msgid="8517942231868516999">"ප්රාථමික රූප"</string>
<string name="description_star" msgid="2605854427360036550">"ප්රියතම"</string>
<string name="edit_contact" msgid="7529281274005689512">"සම්බන්ධතාව සංස්කරණය කරන්න"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"වසන්න"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"නම"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ඊ-තැපෑල"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"දුරකථනය"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ඡායාරූපය"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"සම්බන්ධ සංස්කාරකය දිගහරින්න ක්ලික් කරන්න."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"සම්බන්ධ සංස්කාරකය හකුලන්න ක්ලික් කරන්න."</string>
<string name="content_description_directions" msgid="2686791825798189335">"ස්ථානයට දිශාවන්"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"මෑත අමන්තුම්. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. ආපසු ඇමතිමට ක්ලික් කරන්න"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"ඔබ: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"ඔබ පුද්ගලයාගේ Hangouts හඳුන්වනය ඊ-තැපැල් හෝ දුරකථන ක්ෂේත්රයට ඇතුළත් කළ විටHangouts වඩා හොඳින් ක්රියා කරයි."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"තව ක්ෂේත්ර"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ඡායාරූපය වෙනස් කරන්න"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"සංස්කාරකය විවෘත කිරීමට නොහැකි විය."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"සුරැකීම"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"දැනට <xliff:g id="ACCOUNT_NAME">%s</xliff:g> වෙත සුරැකේ. වෙනත් ගිණුමක් තේරීමට දෙවරක් තට්ටු කරන්න."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one">සබැඳි කළ සම්බන්ධතා (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="other">සබැඳි කළ සම්බන්ධතා (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"තව ක්ෂේත්ර"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ඡායාරූපය වෙනස් කරන්න"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"සංස්කාරකය විවෘත කිරීමට අසමත් විය."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"වෙත සුරකිමින්"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"බලමින්"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"දැනට <xliff:g id="ACCOUNT_NAME">%s</xliff:g> වෙත සුරැකේ. වෙනත් ගිණුමක් තේරීමට දෙවරක්-තට්ටු කරන්න."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="one">සබැඳි සම්බන්ධතා (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="other">සබැඳි සම්බන්ධතා (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"සබැඳි කළ සම්බන්ධතා <xliff:g id="COUNT">%d</xliff:g>"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"මෙම සම්බන්ධතාව"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"විය හැකි අනුපිටපත්"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"මෙම සම්බන්ධතා එකම පුද්ගලයා විය හැකිය. ඔබට ඒවා තනි සම්බන්ධතාවක් ලෙස සබැඳි කළ හැකිය."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"සබැඳි කළ සම්බන්ධතා"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"සබැඳි සම්බන්ධතා"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"ඔබගේ ගිණුම් වෙතින්"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ඡායාරූපයක් ගන්න"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"සියලු ඡායාරූප"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ඡායාරූපය තෝරන්න"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> වෙතින්"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> මැකීම"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"ප්රියතම සම්බන්ධතා බෙදා ගන්න"</string>
<string name="share_contacts" msgid="8109287987498711664">"සියලු සම්බන්ධතා බෙදා ගන්න"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"සම්බන්ධතා බෙදා ගැනීමට අසමත් විය."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"සම්බන්ධතා ආයාත/නිර්යාත කිරීම"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"සම්බන්ධතා නිර්යාත කරන්න"</string>
<string name="dialog_import" msgid="2431698729761448759">"සම්බන්ධතා ආයාත කරන්න"</string>
<string name="share_error" msgid="948429331673358107">"මෙම සම්බන්ධතාව බෙදා ගත නොහැක."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"බෙදා ගැනීමට සම්බන්ධතා නොමැත."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"නිතරමයන් හිස් කරන්න"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM කාඩ්පත තෝරන්න"</string>
<string name="menu_accounts" msgid="1424330057450189074">"ගිණුම් කළමනාකරණය කරන්න"</string>
- <string name="menu_import_export" msgid="26217871113229507">"ආයාත/නිර්යාත"</string>
+ <string name="menu_import" msgid="6107961135813836467">"ආයාත කරන්න"</string>
+ <string name="menu_export" msgid="2658783911863503902">"නිර්යාත කරන්න"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"අවහිර කළ අංක"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> හරහා"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> ඔස්සේ <xliff:g id="DATE">%1$s</xliff:g>"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 26b957d..46e69e1 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Navrhnuté kontakty"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Všetky kontakty"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontakty boli prepojené"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> – odstránený/-á"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="few">Kontakty boli odstránené</item>
<item quantity="many">Kontakty boli odstránené</item>
@@ -117,6 +118,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"K dispozícii nie sú žiadne kontakty s týmto štítkom"</string>
<string name="emptyAccount" msgid="6873962901497975964">"V tomto účte nie sú žiadne kontakty"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Váš zoznam kontaktov je prázdny"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> sa uložil(a)"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt bol uložený"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontakty boli odpojené"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Nepodarilo sa uložiť zmeny kontaktu"</string>
@@ -159,7 +161,6 @@
<string name="callAgain" msgid="3197312117049874778">"Zavolať znova"</string>
<string name="returnCall" msgid="8171961914203617813">"Zavolať späť"</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_contact_photo" msgid="3387458082667894062">"fotografia kontaktu"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Mená vašich kontaktov"</string>
@@ -206,7 +207,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Dátum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Štítok"</string>
<string name="change_photo" msgid="8530597935483526383">"Zmeniť"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Hlavná fotka"</string>
<string name="description_star" msgid="2605854427360036550">"zaradiť medzi obľúbené"</string>
<string name="edit_contact" msgid="7529281274005689512">"Upraviť kontakt"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"zavrieť"</string>
@@ -283,7 +283,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Meno"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-mailová adresa"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefón"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fotka"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kliknutím rozbalíte editor kontaktov."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kliknutím zbalíte editor kontaktov."</string>
<string name="content_description_directions" msgid="2686791825798189335">"trasa do miesta"</string>
@@ -294,12 +293,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"nedávny hovor. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. kliknutím zavoláte späť"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Vy: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Služba Hangouts funguje lepšie, keď do poľa pre e-mailovú adresu alebo telefón zadáte identifikátor osoby v službe Hangouts."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Ďalšie polia"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Zmeniť fotku"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Nepodarilo sa otvoriť editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Uložiť ako"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Kontakty sa momentálne ukladajú do účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Iný účet vyberiete dvojitým klepnutím."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Ďalšie polia"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Zmeniť fotku"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Nepodarilo sa otvoriť editor"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Ukladá sa do:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Zobrazuje sa"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Kontakty sa momentálne ukladajú do účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Iný účet vyberiete dvojitým klepnutím."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="few">Prepojené kontakty (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="many">Prepojené kontakty (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Prepojené kontakty (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -331,10 +331,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Tento kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Možné duplikáty"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Tieto kontakty môžu patriť jednej osobe. Môžete ich prepojiť do jedného kontaktu."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Prepojené kontakty"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Prepojené kontakty"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Z vašich účtov"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Odfotiť"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Všetky fotky"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Výber fotky"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Z účtu <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Odstrániť položku <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -569,7 +567,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Zdieľať obľúbené kontakty"</string>
<string name="share_contacts" msgid="8109287987498711664">"Zdieľať všetky kontakty"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Nepodarilo sa zdieľať kontakty."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importovať alebo exportovať kontakty"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Export kontaktov"</string>
<string name="dialog_import" msgid="2431698729761448759">"Import kontaktov"</string>
<string name="share_error" msgid="948429331673358107">"Tento kontakt nie je možné zdieľať."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Nemáte žiadne kontakty na zdieľanie"</string>
@@ -584,7 +582,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Vymazať často kontakt. osoby"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Vybrať SIM kartu"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Správa účtov"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Import a export"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importovať"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportovať"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blokované čísla"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">", zdroj: <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g>, zdroj: <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 3a51f99..fb89e81 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Predlagani stiki"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Vsi stiki"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Stika povezana"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Stik <xliff:g id="NAME">%s</xliff:g> je izbrisan"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Stik je izbrisan</item>
<item quantity="two">Stiki so izbrisani</item>
@@ -117,6 +118,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Ni stikov s to oznako"</string>
<string name="emptyAccount" msgid="6873962901497975964">"V tem računu ni stikov"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Seznam stikov je prazen"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Stik <xliff:g id="DISPLAY_NAME">%s</xliff:g> je shranjen"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Stik je shranjen"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Povezava stikov odstranjena"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Sprememb stika ni bilo mogoče shraniti"</string>
@@ -159,7 +161,6 @@
<string name="callAgain" msgid="3197312117049874778">"Ponovi klic"</string>
<string name="returnCall" msgid="8171961914203617813">"Povratni klic"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Želite »<xliff:g id="EMAIL">%s</xliff:g>« dodati stikom?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"fotografija stika"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Imena stikov"</string>
@@ -206,7 +207,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Datum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Dodaj oznako"</string>
<string name="change_photo" msgid="8530597935483526383">"Spremeni"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Glavna fotogr."</string>
<string name="description_star" msgid="2605854427360036550">"priljubljeno"</string>
<string name="edit_contact" msgid="7529281274005689512">"Uredi stik"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"zapri"</string>
@@ -283,7 +283,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Ime"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-pošta"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fotografija"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kliknite, če želite razširiti urejevalnik stikov."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kliknite, če želite strniti urejevalnik stikov."</string>
<string name="content_description_directions" msgid="2686791825798189335">"navodila do mesta"</string>
@@ -294,12 +293,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"nedavni klic. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. kliknite, če želite poklicati nazaj"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Vi: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Pogovori Hangouts delujejo bolje, če v polje za e-pošto ali polje za telefon vnesete identifikator osebe za pogovore Hangouts."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Več polj"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Sprememba fotografije"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Odpiranje urejevalnika ni uspelo."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Shranjevanje v:"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Trenutno se shranjuje v račun <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Če želite izbrati drug račun, se dvakrat dotaknite."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Več polj"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Sprememba fotografije"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Odpiranje urejevalnika ni uspelo."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Shranjevanje v:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Ogled v teku"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Trenutno se shranjuje v račun <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Če želite izbrati drug račun, se dvakrat dotaknite."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Povezani stiki (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="two">Povezani stiki (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="few">Povezani stiki (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -331,10 +331,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ta stik"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Morebitni dvojniki"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Ti stiki so morda ena in ista oseba. Lahko jih združite v en stik."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Povezani stiki"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Povezani stiki"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Iz vaših računov"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Fotografiranje"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Vse fotografije"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Izbira fotografije"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Od: <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Izbriši <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -569,7 +567,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Skupna raba priljubljenih stikov"</string>
<string name="share_contacts" msgid="8109287987498711664">"Skupna raba vseh stikov"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Dajanje stikov v skupno rabo ni uspelo."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Uvoz/izvoz stikov"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Izvoz stikov"</string>
<string name="dialog_import" msgid="2431698729761448759">"Uvoz stikov"</string>
<string name="share_error" msgid="948429331673358107">"Tega stika ni mogoče dati v skupno rabo."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Ni stikov za skupno rabo."</string>
@@ -584,7 +582,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Izbriši seznam pogostih stikov"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Izberite kartico SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Upravljaj račune"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Uvoz/izvoz"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Uvozi"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Izvozi"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blokirane številke"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"prek <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> prek <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml
index bebe53a..ff86b90 100644
--- a/res/values-sq-rAL/strings.xml
+++ b/res/values-sq-rAL/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Kontaktet e sugjeruara"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Të gjitha kontaktet"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontaktet u lidhën"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> u fshi"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kontaktet u fshinë</item>
<item quantity="one">Kontakti u fshi</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Nuk ka kontakte me këtë etiketë"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Nuk ka kontakte në këtë llogari"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Lista e kontakteve të tua është bosh"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> u ruajt"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakti u ruajt"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontaktet u shkëputën"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Ndryshimet e kontaktit nuk mund të ruheshin"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Telefono përsëri"</string>
<string name="returnCall" msgid="8171961914203617813">"Ktheji telefonatën"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Të shtohet \"<xliff:g id="EMAIL">%s</xliff:g>\" te kontaktet?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"fotografia e kontaktit"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="CURRENT_NUMBER">%s</xliff:g> nga gjithsej <xliff:g id="TOTAL_NUMBER">%s</xliff:g> kontakte"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Emrat e kontakteve të tua"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Data"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiketa"</string>
<string name="change_photo" msgid="8530597935483526383">"Ndërro"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Fotografia parësore"</string>
<string name="description_star" msgid="2605854427360036550">"i preferuar"</string>
<string name="edit_contact" msgid="7529281274005689512">"Redakto kontaktin"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"mbyll"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Emri"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Mail-i"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefoni"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fotografia"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kliko për ta zgjeruar redaktorin e kontaktit."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kliko për ta palosur redaktorin e kontaktit."</string>
<string name="content_description_directions" msgid="2686791825798189335">"drejtime për te vendndodhja"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"telefonata e fundit. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. kliko për të ri-telefonuar"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Ti: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Shërbimi \"Hangouts\" funksionon më mirë kur fut identifikuesin e personit në fushën e mail-it ose në fushën e telefonit."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Fusha të tjera"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Ndrysho fotografinë"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Dështoi në hapjen e redaktorit"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Po ruhet në"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Po ruhet aktualisht në <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Trokit dy herë për të zgjedhur një llogari tjetër."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Fusha të tjera"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Ndrysho fotografinë"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Dështoi në hapjen e redaktorit."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Po ruhet në"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Po shikohet"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Po ruhet aktualisht në <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Trokit dy herë për të zgjedhur një llogari tjetër."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Kontakte të lidhura (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Kontakt i lidhur</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ky kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Dublikatat e mundshme"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Këto kontakte mund të jenë i njëjti person. Mund t\'i lidhësh së bashku si një kontakt të vetëm."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Kontaktet e lidhura"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Kontaktet e lidhura"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Nga llogaritë e tua"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Bëj një fotografi"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Të gjitha fotografitë"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Zgjidh fotografinë"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Nga <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Fshi <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Ndaj kontaktet e preferuara"</string>
<string name="share_contacts" msgid="8109287987498711664">"Ndaj të gjitha kontaktet"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Ndarja e kontakteve dështoi."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importo/eksporto kontaktet"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Eksporto kontaktet"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importo kontaktet"</string>
<string name="share_error" msgid="948429331673358107">"Ky kontakt nuk mund të shpërndahet"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Nuk ka kontakte për të shpërndarë"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Pastro kontaktet e shpeshta"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Zgjidh kartën SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Menaxho llogaritë"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importo/eksporto"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importo"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Eksporto"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Numrat e bllokuar"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"nëpërmjet <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> nëpërmjet <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 0d1c345..b59513e 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Предложени контакти"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Сви контакти"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Контакти су обједињени"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> је избрисан/а"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Контакти су избрисани</item>
<item quantity="few">Контакти су избрисани</item>
@@ -114,6 +115,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Нема контаката са овом ознаком"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Нема контаката на овом налогу"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Листа контаката је празна"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Контакт <xliff:g id="DISPLAY_NAME">%s</xliff:g> је сачуван"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Контакт је сачуван"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Контакти су раздвојени"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Чување промена контакта није успело"</string>
@@ -153,7 +155,6 @@
<string name="callAgain" msgid="3197312117049874778">"Позови поново"</string>
<string name="returnCall" msgid="8171961914203617813">"Узврати позив"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Желите ли да додате имејл адресу „<xliff:g id="EMAIL">%s</xliff:g>“ у контакте?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"слика контакта"</string>
<string name="description_plus_button" msgid="515164827856229880">"плус"</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="search_settings_description" msgid="2675223022992445813">"Имена контаката"</string>
@@ -199,7 +200,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Датум"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Ознака"</string>
<string name="change_photo" msgid="8530597935483526383">"Промени"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Главна слика"</string>
<string name="description_star" msgid="2605854427360036550">"омиљено"</string>
<string name="edit_contact" msgid="7529281274005689512">"Измени контакт"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"затворите"</string>
@@ -276,7 +276,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Име"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Имејл"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Телефон"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Слика"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Кликните да бисте проширили уређивач контаката."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Кликните да бисте скупили уређивач контаката."</string>
<string name="content_description_directions" msgid="2686791825798189335">"упутства до локације"</string>
@@ -287,12 +286,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Недавни позив. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Кликните за повратни позив"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Ви: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts ради боље кад унесете Hangouts идентификатор особе у поље за имејл адресу или број телефона."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Још поља"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Промените слику"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Oтварање уређивача није успело."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Чува се"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Тренутно се чува на налогу <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Додирните двапут да бисте изабрали други налог."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Још поља"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Промените слику"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Oтварање уређивача није успело."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Чува се на"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Гледате"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Тренутно се чува на <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Додирните двапут да бисте изабрали други налог."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Обједињени контакти (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="few">Обједињени контакти (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Обједињени контакти (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -320,10 +320,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Овај контакт"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Могући дупликати"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Изгледа да су ови контакти иста особа. Можете да их обједините у један контакт."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Обједињени контакти"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Обједињени контакти"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Са ваших налога"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Сликај"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Све слике"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Изаберите слику"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Са <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Избриши <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -558,7 +556,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Дели омиљене контакте"</string>
<string name="share_contacts" msgid="8109287987498711664">"Дели све контакте"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Дељење контаката није успело."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Увоз/извоз контаката"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Извезите контакте"</string>
<string name="dialog_import" msgid="2431698729761448759">"Увоз контаката"</string>
<string name="share_error" msgid="948429331673358107">"Овај контакт не може да се дели."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Нема контаката за дељење."</string>
@@ -573,7 +571,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Обриши често контактиране"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Изаберите SIM картицу"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Управљај налозима"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Увоз/извоз"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Увeзи"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Извези"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Блокирани бројеви"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"преко <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> преко <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 6d00551..127bb9d 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Föreslagna kontakter"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Alla kontakter"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontakterna har länkats"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> borttagen"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kontakterna har tagits bort</item>
<item quantity="one">Kontakten har tagits bort</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Inga kontakter med den här etiketten"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Det finns inga kontakter på det här kontot"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Kontaktlistan är tom"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> sparad"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt sparad"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Länken mellan kontakterna har tagits bort"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Det gick inte att spara kontaktändringarna"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Ring igen"</string>
<string name="returnCall" msgid="8171961914203617813">"Ring upp"</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_contact_photo" msgid="3387458082667894062">"kontaktbild"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Dina kontakters namn"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Datum"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etikett"</string>
<string name="change_photo" msgid="8530597935483526383">"Ändra"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Primärt foto"</string>
<string name="description_star" msgid="2605854427360036550">"favorit"</string>
<string name="edit_contact" msgid="7529281274005689512">"Redigera kontakt"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"stäng"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Namn"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-post"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Bild"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Klicka om du vill expandera kontaktredigeraren."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Klicka om du vill komprimera kontaktredigeraren."</string>
<string name="content_description_directions" msgid="2686791825798189335">"vägbeskrivning till plats"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"samtal. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. Klicka om du vill ringa upp"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Du: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts fungerar bättre när du anger personens identifierare i Hangouts i e-postfältet eller mobilfältet."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Fler fält"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Byt bild"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Det gick inte att öppna redigeringsappen."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Sparas till"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Kontakterna sparas för närvarande i <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Tryck snabbt två gånger om du vill använda ett annat konto."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Fler fält"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Byt foto"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Det gick inte att öppna redigeraren."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Sparas i"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Visar"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Kontakterna sparas för närvarande i <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Tryck snabbt två gånger om du vill använda ett annat konto."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Länkade kontakter (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Länkad kontakt</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Den här kontakten"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Möjlig dubblett"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Dessa kontakter avser möjligen samma person. Du kan länka samman dem till en enda kontakt."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Länkade kontakter"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Länkade kontakter"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Från dina konton"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Ta en bild"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Alla foton"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Välj bild"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Från <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Radera <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Dela favoritkontakterna"</string>
<string name="share_contacts" msgid="8109287987498711664">"Dela alla kontakter"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Det gick inte att dela kontakterna."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Importera/exportera kontakter"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Exportera kontakter"</string>
<string name="dialog_import" msgid="2431698729761448759">"Importera kontakter"</string>
<string name="share_error" msgid="948429331673358107">"Den här kontakten kan inte delas."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Det finns inga kontakter att dela."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Rensa listan över kontakter"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Välj SIM-kort"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Hantera konton"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Importera/exportera"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Importera"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Exportera"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Blockerade nummer"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index a08fe01..5c3fe7d 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Anwani zilizopendekezwa"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Anwani zote"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Anwani zimeunganishwa"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> amefutwa"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Anwani zimefutwa</item>
<item quantity="one">Anwani imefutwa</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Hakuna anwani zilizo na lebo hii"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Hakuna anwani katika akaunti hii"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Orodha yako ya anwani haina kitu"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> amehifadhiwa"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Anwani imehifadhiwa"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Imetenganisha anwani"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Imeshindwa kuhifadhi mabadiliko ya maelezo ya unayewasiliana naye"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Piga simu tena"</string>
<string name="returnCall" msgid="8171961914203617813">"Mpigie"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Ongeza \"<xliff:g id="EMAIL">%s</xliff:g>\" kwa anwani?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"picha ya anwani"</string>
<string name="description_plus_button" msgid="515164827856229880">"jumlisha"</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="search_settings_description" msgid="2675223022992445813">"Majina ya anwani zako"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Tarehe"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Lebo"</string>
<string name="change_photo" msgid="8530597935483526383">"Badilisha"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Picha ya msingi"</string>
<string name="description_star" msgid="2605854427360036550">"kipendwa"</string>
<string name="edit_contact" msgid="7529281274005689512">"Hariri anwani"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"funga"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Jina"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Barua pepe"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Simu"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Picha"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Bofya ili upanue kihariri cha anwani."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Bofya ili ukunje kihariri cha anwani."</string>
<string name="content_description_directions" msgid="2686791825798189335">"maelekezo ya kwenda mahali"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"simu ya hivi karibuni. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. bofya ili upige simu"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Wewe: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangout hufanya kazi vizuri zaidi unapoweka nambari ya mtu ya utambulisho wa Hangout katika sehemu ya anwani ya barua pepe au sehemu ya nambari ya simu."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Sehemu zaidi"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Badilisha picha"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Imeshindwa kufungua kihariri."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Inahifadhi kwenye"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Kwa sasa inahifadhi katika <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Gonga mara mbili ili ubadilishe akaunti."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Sehemu zingine"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Badilisha picha"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Imeshindwa kufungua kihariri."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Inahifadhi kwenye"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Unaiangalia"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Kwa sasa inahifadhi katika <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Gonga mara mbili ili uchague akaunti tofauti."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Anwani (<xliff:g id="COUNT">%d</xliff:g>) zilizounganishwa</item>
<item quantity="one">Anwani iliyounganishwa</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Anwani hii"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Anwani zinazoweza kurudufishwa"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Anwani hizi zinaweza kuwa za mtu mmoja. Unaweza kuziunganisha zote kuwa anwani moja."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Anwani zilizounganishwa"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Anwani zilizounganishwa"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Kutoka akaunti zako"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Piga picha"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Picha zote"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Chagua picha"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Kutoka kwa <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Futa <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -549,7 +547,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Shiriki anwani unazopenda"</string>
<string name="share_contacts" msgid="8109287987498711664">"Shiriki anwani zote"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Imeshindwa kushiriki anwani."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Leta/Hamisha wawasiliani"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Hamisha anwani"</string>
<string name="dialog_import" msgid="2431698729761448759">"Ingiza anwani"</string>
<string name="share_error" msgid="948429331673358107">"Mwasiliani huyu hawezi kushirikishwa."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Hakuna anwani za kushiriki."</string>
@@ -564,7 +562,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Futa idadi ya mara ambazo unawasiliana nao"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Chagua SIM kadi"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Dhibiti akaunti"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Leta/hamisha"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Leta"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Hamisha"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Nambari zilizozuiwa"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"kupitia <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> kupitia <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 6f6f4e1..8dd1ba9 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -28,10 +28,6 @@
<dimen name="contact_browser_list_top_margin">18dp</dimen>
<dimen name="quick_contact_photo_container_height">360dip</dimen>
- <!-- Height of the selection indicator of a tab. -->
- <dimen name="tab_selected_underline_height">3dp</dimen>
- <!-- Size of text in tabs. -->
- <dimen name="tab_text_size">16sp</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-sw720dp-land/dimens.xml b/res/values-sw720dp-land/dimens.xml
index b89c2c1..baa8498 100644
--- a/res/values-sw720dp-land/dimens.xml
+++ b/res/values-sw720dp-land/dimens.xml
@@ -18,5 +18,4 @@
<dimen name="group_editor_side_padding">64dip</dimen>
<dimen name="contact_detail_list_top_padding">32dip</dimen>
<dimen name="detail_contact_photo_size">256dip</dimen>
- <dimen name="people_activity_landscape_tabs_text_size">16dp</dimen>
</resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 60b62b4..d6ebf9a 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"பரிந்துரைக்கப்பட்ட தொடர்புகள்"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"எல்லா தொடர்புகளும்"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"தொடர்புகள் இணைக்கப்பட்டன"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> நீக்கப்பட்டார்"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">தொடர்புகள் நீக்கப்பட்டன</item>
<item quantity="one">தொடர்பு நீக்கப்பட்டது</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"இந்த லேபிளைக் கொண்ட தொடர்புகள் இல்லை"</string>
<string name="emptyAccount" msgid="6873962901497975964">"இந்தக் கணக்கில் தொடர்புகள் இல்லை"</string>
<string name="emptyMainList" msgid="2772242747899664460">"உங்கள் தொடர்புகள் பட்டியல் காலியாக உள்ளது"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> சேமிக்கப்பட்டது"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"தொடர்பு சேமிக்கப்பட்டது"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"தொடர்புகள் பிரிக்கப்பட்டன"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"தொடர்பு மாற்றங்களைச் சேமிக்க முடியவில்லை"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"மீண்டும் அழை"</string>
<string name="returnCall" msgid="8171961914203617813">"திரும்பி அழை"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" ஐத் தொடர்புகளில் சேர்க்கவா?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"தொடர்பு படம்"</string>
<string name="description_plus_button" msgid="515164827856229880">"சேர்"</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="search_settings_description" msgid="2675223022992445813">"உங்கள் தொடர்புகளின் பெயர்கள்"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"தேதி"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"லேபிளைச் சேர்"</string>
<string name="change_photo" msgid="8530597935483526383">"மாற்று"</string>
- <string name="primary_photo" msgid="8517942231868516999">"முதன்மை படம்"</string>
<string name="description_star" msgid="2605854427360036550">"பிடித்தது"</string>
<string name="edit_contact" msgid="7529281274005689512">"தொடர்பைத் திருத்து"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"மூடும்"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"பெயர்"</string>
<string name="header_email_entry" msgid="8666093061171624478">"மின்னஞ்சல்"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ஃபோன்"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"படம்"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"தொடர்பு திருத்தியை விரிக்க, கிளிக் செய்க."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"தொடர்பு திருத்தியைச் சுருக்க, கிளிக் செய்க."</string>
<string name="content_description_directions" msgid="2686791825798189335">"இடத்தை நோக்கிய திசைகள்"</string>
@@ -280,14 +279,15 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"சமீபத்திய அழைப்பு. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. திரும்ப அழைக்க, கிளிக் செய்க"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"நீங்கள்: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"பிறரின் Hangouts அடையாளத்தை மின்னஞ்சல் அல்லது ஃபோன் புலத்தில் உள்ளிடும் போது, Hangouts இன்னும் சிறப்பாகச் செயல்படும்."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"மேலும் புலங்கள்"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"படத்தை மாற்றவும்"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"எடிட்டரைத் திறக்க முடியவில்லை."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"இதில் சேமிக்கிறது"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"தற்போது <xliff:g id="ACCOUNT_NAME">%s</xliff:g> இல் சேமிக்கிறது. வேறொரு கணக்கைத் தேர்ந்தெடுக்க, இருமுறை தட்டவும்."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">இணைக்கப்பட்ட தொடர்புகள் (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">இணைக்கப்பட்ட தொடர்பு</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"மேலும் புலங்கள்"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"படத்தை மாற்றும்"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"எடிட்டரைத் திறக்க முடியவில்லை."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"இதில் சேமிக்கிறது:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"பார்ப்பது"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"தற்போது <xliff:g id="ACCOUNT_NAME">%s</xliff:g> இல் சேமிக்கிறது. வேறொரு கணக்கைத் தேர்ந்தெடுக்க, இருமுறை தட்டவும்."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">இணைத்த தொடர்புகள் (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="one">இணைத்த தொடர்பு</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> இணைக்கப்பட்ட தொடர்புகள்"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"இந்தத் தொடர்பு"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"சாத்தியமுள்ள நகல்கள்"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"இவை ஒரே பயனருடையதாக இருக்கக்கூடும். அவற்றை ஒரே தொடர்பில் இணைக்கலாம்."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"இணைத்த தொடர்புகள்"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"இணைத்த தொடர்புகள்"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"உங்கள் கணக்குகளில் இருந்து"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"படமெடு"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"எல்லா படங்களும்"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"படத்தைத் தேர்வுசெய்க"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> இலிருந்து"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>ஐ நீக்கு"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"பிடித்த தொடர்புகளைப் பகிர்"</string>
<string name="share_contacts" msgid="8109287987498711664">"எல்லா தொடர்புகளையும் பகிர்"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"தொடர்புகளைப் பகிர முடியவில்லை."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"தொடர்புகளை இறக்குமதி/ஏற்றுமதி செய்தல்"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"தொடர்புகளை ஏற்று"</string>
<string name="dialog_import" msgid="2431698729761448759">"தொடர்புகளை இறக்குமதி செய்"</string>
<string name="share_error" msgid="948429331673358107">"தொடர்பைப் பகிர முடியவில்லை."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"பகிர, தொடர்புகள் இல்லை."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"அடிக்கடி தொடர்புகொண்டவர்களை அழி"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"சிம் ஐத் தேர்ந்தெடுக்கவும்"</string>
<string name="menu_accounts" msgid="1424330057450189074">"கணக்குகளை நிர்வகி"</string>
- <string name="menu_import_export" msgid="26217871113229507">"இறக்குமதி/ஏற்றுமதி"</string>
+ <string name="menu_import" msgid="6107961135813836467">"இறக்கு"</string>
+ <string name="menu_export" msgid="2658783911863503902">"ஏற்று"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"தடுக்கப்பட்ட எண்கள்"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> வழியாக"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> வழியாக <xliff:g id="DATE">%1$s</xliff:g>"</string>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index 463a756..9be46a5 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"సూచిత పరిచయాలు"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"అన్ని పరిచయాలు"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"పరిచయాలు లింక్ చేయబడ్డాయి"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> తొలగించబడింది"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">పరిచయాలు తొలగించబడ్డాయి</item>
<item quantity="one">పరిచయం తొలగించబడింది</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"ఈ లేబుల్తో పరిచయాలు ఏవీ లేవు"</string>
<string name="emptyAccount" msgid="6873962901497975964">"ఈ ఖాతాలో పరిచయాలు ఏవీ లేవు"</string>
<string name="emptyMainList" msgid="2772242747899664460">"మీ పరిచయాల జాబితా ఖాళీగా ఉంది"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> సేవ్ చేయబడింది"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"పరిచయం సేవ్ చేయబడింది"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"పరిచయాలు వేరు చేయబడ్డాయి"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"పరిచయం మార్పులను సేవ్ చేయలేకపోయింది"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"మళ్లీ కాల్ చేయి"</string>
<string name="returnCall" msgid="8171961914203617813">"కాల్ను తిరిగి చేయి"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\"ని పరిచయాలకు జోడించాలా?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"పరిచయ ఫోటో"</string>
<string name="description_plus_button" msgid="515164827856229880">"ప్లస్"</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="search_settings_description" msgid="2675223022992445813">"మీ పరిచయాల యొక్క పేర్లు"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"తేదీ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"లేబుల్"</string>
<string name="change_photo" msgid="8530597935483526383">"మార్చు"</string>
- <string name="primary_photo" msgid="8517942231868516999">"ప్రాథమిక ఫోటో"</string>
<string name="description_star" msgid="2605854427360036550">"ఇష్టంగా గుర్తించు"</string>
<string name="edit_contact" msgid="7529281274005689512">"పరిచయాన్ని సవరించు"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"మూసివేస్తుంది"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"పేరు"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ఇమెయిల్"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"ఫోన్"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"ఫోటో"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"పరిచయ ఎడిటర్ని విస్తరింపజేయడానికి క్లిక్ చేయండి."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"పరిచయ ఎడిటర్ని కుదించడానికి క్లిక్ చేయండి."</string>
<string name="content_description_directions" msgid="2686791825798189335">"స్థానానికి వెళ్లడానికి దిశలు"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"ఇటీవలి కాల్. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. తిరిగి కాల్ చేయడానికి క్లిక్ చేయండి"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"మీరు: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"మీరు ఇమెయిల్ ఫీల్డ్ లేదా ఫోన్ ఫీల్డ్లో వ్యక్తి యొక్క Hangouts ఐడెంటిఫైయర్ని నమోదు చేసినప్పుడు Hangouts ఉత్తమంగా పని చేస్తాయి."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"మరిన్ని ఫీల్డ్లు"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"ఫోటోను మార్చండి"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"ఎడిటర్ను తెరవడం విఫలమైంది."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"దీనికి సేవ్ చేయబడుతోంది"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"ప్రస్తుతం <xliff:g id="ACCOUNT_NAME">%s</xliff:g>కి సేవ్ చేస్తోంది. వేరే ఖాతాను ఎంచుకోవడానికి రెండుసార్లు నొక్కండి."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"మరిన్ని ఫీల్డ్లు"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"ఫోటోను మార్చండి"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"ఎడిటర్ను తెరవడం విఫలమైంది."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"దీనికి సేవ్ చేయబడుతోంది"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"వీక్షించబడుతోంది"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"ప్రస్తుతం <xliff:g id="ACCOUNT_NAME">%s</xliff:g>కి సేవ్ చేస్తోంది. వేరే ఖాతాను ఎంచుకోవడానికి రెండుసార్లు నొక్కండి."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">లింక్ చేయబడిన పరిచయాలు (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">లింక్ చేయబడిన పరిచయం</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"ఈ పరిచయం"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"సంభావ్య నకిలీలు"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"ఈ పరిచయాలు ఒకే వ్యక్తికి సంబంధించినవి అయ్యి ఉండవచ్చు. మీరు వాటిని ఒకే పరిచయంగా లింక్ చేయవచ్చు."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"లింక్ చేయబడిన పరిచయాలు"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"లింక్ చేయబడిన పరిచయాలు"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"మీ ఖాతాల నుండి"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ఫోటో తీయి"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"అన్ని ఫోటోలు"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"ఫోటోను ఎంచుకోండి"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> నుండి"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>ని తొలగిస్తుంది"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"ఇష్టమైన పరిచయాలను భాగస్వామ్యం చేయి"</string>
<string name="share_contacts" msgid="8109287987498711664">"పరిచయాలన్నీ భాగస్వామ్యం చేయి"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"పరిచయాలను భాగస్వామ్యం చేయడంలో విఫలమైంది."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"పరిచయాలను దిగుమతి/ఎగుమతి చేయండి"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"పరిచయాలను ఎగుమతి చేయండి"</string>
<string name="dialog_import" msgid="2431698729761448759">"పరిచయాలను దిగుమతి చేయండి"</string>
<string name="share_error" msgid="948429331673358107">"ఈ పరిచయాన్ని భాగస్వామ్యం చేయడం సాధ్యపడదు."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"భాగస్వామ్యం చేయడానికి పరిచయాలు ఏవీ లేవు."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"తరచుగా ఉన్నవాటిని క్లియర్ చేయి"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM కార్డును ఎంచుకోండి"</string>
<string name="menu_accounts" msgid="1424330057450189074">"ఖాతాలను నిర్వహించు"</string>
- <string name="menu_import_export" msgid="26217871113229507">"దిగుమతి చేయి/ఎగుమతి చేయి"</string>
+ <string name="menu_import" msgid="6107961135813836467">"దిగుమతి చేయి"</string>
+ <string name="menu_export" msgid="2658783911863503902">"ఎగుమతి చేయి"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"బ్లాక్ చేయబడిన నంబర్లు"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> ద్వారా"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> ద్వారా <xliff:g id="DATE">%1$s</xliff:g>"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index bdb7173..557fa32 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"รายชื่อที่แนะนำ"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"รายชื่อติดต่อทั้งหมด"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"ลิงก์รายชื่อติดต่อแล้ว"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"ลบ <xliff:g id="NAME">%s</xliff:g> แล้ว"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">รายชื่อติดต่อที่ลบแล้ว</item>
<item quantity="one">รายชื่อติดต่อที่ลบแล้ว</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"ไม่มีรายชื่อติดต่อที่มีป้ายกำกับนี้"</string>
<string name="emptyAccount" msgid="6873962901497975964">"ไม่มีรายชื่อติดต่อในบัญชีนี้"</string>
<string name="emptyMainList" msgid="2772242747899664460">"รายชื่อติดต่อของคุณว่างเปล่า"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"บันทึก <xliff:g id="DISPLAY_NAME">%s</xliff:g> แล้ว"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"บันทึกรายชื่อติดต่อแล้ว"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"ยกเลิกการลิงก์รายชื่อติดต่อแล้ว"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"ไม่สามารถบันทึกการเปลี่ยนแปลงรายชื่อติดต่อ"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"โทรอีกครั้ง"</string>
<string name="returnCall" msgid="8171961914203617813">"โทรกลับ"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"เพิ่ม \"<xliff:g id="EMAIL">%s</xliff:g>\" ในสมุดโทรศัพท์หรือไม่"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"ภาพของรายชื่อ"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"ชื่อของรายชื่อในสมุดโทรศัพท์ของคุณ"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"วันที่"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"ป้ายกำกับ"</string>
<string name="change_photo" msgid="8530597935483526383">"เปลี่ยน"</string>
- <string name="primary_photo" msgid="8517942231868516999">"รูปภาพหลัก"</string>
<string name="description_star" msgid="2605854427360036550">"รายการโปรด"</string>
<string name="edit_contact" msgid="7529281274005689512">"แก้ไขรายชื่อติดต่อ"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"ปิด"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"ชื่อ"</string>
<string name="header_email_entry" msgid="8666093061171624478">"อีเมล"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"โทรศัพท์"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"รูปภาพ"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"คลิกเพื่อขยายตัวแก้ไขรายชื่อติดต่อ"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"คลิกเพื่อยุบตัวแก้ไขรายชื่อติดต่อ"</string>
<string name="content_description_directions" msgid="2686791825798189335">"เส้นทางไปยังสถานที่"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"โทรล่าสุด <xliff:g id="CALL_TYPE">%s</xliff:g> <xliff:g id="PHONE_NUMBER">%s</xliff:g> <xliff:g id="DATE">%s</xliff:g> คลิกเพื่อโทรกลับ"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"คุณ: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"แฮงเอาท์ทำงานได้ดียิ่งขึ้นเมื่อคุณป้อนตัวระบุแฮงเอาท์ของบุคคลที่ต้องการลงในช่องอีเมลหรือช่องโทรศัพท์"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"ช่องอื่นๆ"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"เปลี่ยนรูปภาพ"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"ไม่สามารถเปิดตัวแก้ไข"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"บันทึกลงใน"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"ขณะนี้กำลังบันทึกไปยัง <xliff:g id="ACCOUNT_NAME">%s</xliff:g> แตะ 2 ครั้งเพื่อเลือกบัญชีอื่น"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"ช่องอื่นๆ"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"เปลี่ยนรูปภาพ"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"ไม่สามารถเปิดตัวแก้ไข"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"บันทึกลงใน"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"กำลังดู"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"ขณะนี้กำลังบันทึกไปยัง <xliff:g id="ACCOUNT_NAME">%s</xliff:g> แตะ 2 ครั้งเพื่อเลือกบัญชีอื่น"</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">รายชื่อติดต่อที่ลิงก์ (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">รายชื่อติดต่อที่ลิงก์</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"รายชื่อติดต่อนี้"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"อาจซ้ำกับรายการอื่น"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"รายชื่อติดต่อเหล่านี้อาจเป็นบุคคลเดียวกัน คุณสามารถลิงก์รายชื่อติดต่อดังกล่าวเป็นรายชื่อติดต่อเดียว"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"รายชื่อติดต่อที่ลิงก์"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"รายชื่อติดต่อที่ลิงก์"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"จากบัญชีของคุณ"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ถ่ายภาพ"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"รูปภาพทั้งหมด"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"เลือกรูปภาพ"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"จาก <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"ลบ<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"แชร์รายชื่อติดต่อโปรด"</string>
<string name="share_contacts" msgid="8109287987498711664">"แชร์รายชื่อติดต่อทั้งหมด"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"ไม่สามารถแชร์รายชื่อติดต่อ"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"นำเข้า/ส่งออกผู้ติดต่อ"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"ส่งออกรายชื่อติดต่อ"</string>
<string name="dialog_import" msgid="2431698729761448759">"นำเข้าสมุดโทรศัพท์"</string>
<string name="share_error" msgid="948429331673358107">"ไม่สามารถแชร์รายชื่อติดต่อนี้ได้"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"ไม่มีรายชื่อติดต่อที่จะแชร์"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"ล้างผู้ที่คุณติดต่อด้วยบ่อยๆ"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"เลือกซิมการ์ด"</string>
<string name="menu_accounts" msgid="1424330057450189074">"จัดการบัญชี"</string>
- <string name="menu_import_export" msgid="26217871113229507">"นำเข้า/ส่งออก"</string>
+ <string name="menu_import" msgid="6107961135813836467">"นำเข้า"</string>
+ <string name="menu_export" msgid="2658783911863503902">"ส่งออก"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"หมายเลขที่ถูกบล็อก"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"ผ่านทาง <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> ผ่านทาง <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 2caa2f8..befa80a 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Mga iminumungkahing contact"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Lahat ng mga contact"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Na-link na ang mga contact"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Na-delete si <xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Na-delete na ang mga contact</item>
<item quantity="other">Na-delete na ang mga contact</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Walang mga contact na mayroong ganitong label"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Walang mga contact sa account na ito"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Walang laman ang iyong listahan ng mga contact"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Na-save si <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Na-save ang contact"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Na-unlink ang mga contact"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Hindi ma-save ang mga pagbabago sa contact"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Tawagan muli"</string>
<string name="returnCall" msgid="8171961914203617813">"Pabalik na tawag"</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_contact_photo" msgid="3387458082667894062">"larawan ng contact"</string>
<string name="description_plus_button" msgid="515164827856229880">"plus"</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="search_settings_description" msgid="2675223022992445813">"Mga pangalan ng iyong mga contact"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Petsa"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Lagyan ng label"</string>
<string name="change_photo" msgid="8530597935483526383">"Baguhin"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Pangunahing larawan"</string>
<string name="description_star" msgid="2605854427360036550">"paborito"</string>
<string name="edit_contact" msgid="7529281274005689512">"I-edit ang Contact"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"isara"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Pangalan"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Email"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telepono"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Larawan"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"I-click upang palawakin ang contact editor."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"I-click upang i-collapse ang contact editor."</string>
<string name="content_description_directions" msgid="2686791825798189335">"mga direksyon sa lokasyon"</string>
@@ -280,15 +279,19 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"kamakailang tawag. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. mag-click upang tumawag"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Ikaw: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Gagana nang mas maayos ang Hangouts kapag inilagay mo ang identifier sa Hangouts ng isang tao sa field ng email o sa field ng telepono."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Higit pang mga field"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Palitan ang larawan"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Hindi nabuksan ang editor."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Sine-save sa"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Kasalukuyang naipon sa <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Mag-double tap upang pumili ng ibang account."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="one">Mga naka-link na contact (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="other">Mga naka-link na contact (<xliff:g id="COUNT">%d</xliff:g>)</item>
- </plurals>
+ <!-- no translation found for editor_more_fields (3630987771304393421) -->
+ <skip />
+ <!-- no translation found for editor_change_photo_content_description (754100561085306263) -->
+ <skip />
+ <!-- no translation found for editor_failed_to_load (1623639078580475818) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_title (4426337993307015833) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_read_only_title (8315171723911587719) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_description (3324358600570627740) -->
+ <skip />
+ <!-- no translation found for editor_linked_contacts_selector_title (249075501821303190) -->
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> (na) naka-link na contact"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
<string name="quickcontact_suggestion_link_button" msgid="3244619714781727946">"I-LINK ANG MGA CONTACT"</string>
@@ -309,10 +312,9 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ang contact na ito"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Mga posibleng duplicate"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Maaaring iisang tao ang mga contact na ito. Maaari mong i-link ang mga ito sa isa\'t isa bilang iisang contact."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Mga naka-link na contact"</string>
+ <!-- no translation found for editor_linked_contacts_title (3077479751631492125) -->
+ <skip />
<string name="from_your_accounts" msgid="1746293107836889912">"Mula sa iyong mga account"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Kumuha ng larawan"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Lahat ng larawan"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Pumili ng larawan"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Mula kay <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"I-delete ang <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +549,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Ibahagi ang mga paboritong contact"</string>
<string name="share_contacts" msgid="8109287987498711664">"Ibahagi ang lahat ng contact"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Nabigong ibahagi ang mga contact."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Mag-import/mag-export ng mga contact"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Mag-export ng mga contact"</string>
<string name="dialog_import" msgid="2431698729761448759">"Mag-import ng mga contact"</string>
<string name="share_error" msgid="948429331673358107">"Hindi maibabahagi ang contact na ito."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Walang ibabahaging mga contact."</string>
@@ -562,7 +564,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"I-clear ang mga madadalas"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Pumili ng SIM card"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Pamahalaan ang mga account"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Mag-import/mag-export"</string>
+ <string name="menu_import" msgid="6107961135813836467">"I-import"</string>
+ <string name="menu_export" msgid="2658783911863503902">"I-export"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Mga naka-block na numero"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"sa pamamagitan ng <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> sa pamamagitan ng <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index ce1c15a..15b8b18 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Önerilen kişiler"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Tüm kişiler"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kişiler arasında bağlantı oluşturuldu"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> silindi"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kişiler silindi</item>
<item quantity="one">Kişi silindi</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Bu etikete sahip kişi yok"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Bu hesapta kişi yok"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Kişi listeniz boş"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> kaydedildi"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kişi kaydedildi"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kişilerin bağlantısı kaldırıldı"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Kişi değişiklikleri kaydedilemedi"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Tekrar çağrı yap"</string>
<string name="returnCall" msgid="8171961914203617813">"Geri ara"</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_contact_photo" msgid="3387458082667894062">"kişi fotoğrafı"</string>
<string name="description_plus_button" msgid="515164827856229880">"artı"</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="search_settings_description" msgid="2675223022992445813">"Kişilerinizin adları"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Tarih"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Etiket"</string>
<string name="change_photo" msgid="8530597935483526383">"Değiştir"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Birincil fotoğraf"</string>
<string name="description_star" msgid="2605854427360036550">"favori"</string>
<string name="edit_contact" msgid="7529281274005689512">"Kişiyi düzenle"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"kapatın"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Ad"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-posta"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Fotoğraf"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kişi düzenleyiciyi genişletmek için tıklayın."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kişi düzenleyiciyi daraltmak için tıklayın."</string>
<string name="content_description_directions" msgid="2686791825798189335">"konum için yol tarifi"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"son gelen çağrı. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. geri aramak için dokunun"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Siz: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Kişinin Hangouts tanımlayıcısını e-posta veya telefon alanına girdiğinizde Hangouts daha iyi çalışır."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Diğer alanlar"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Fotoğrafı değiştir"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Editör açılamadı."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Kaydedilecek hesap:"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Şu anda <xliff:g id="ACCOUNT_NAME">%s</xliff:g> hesabına kaydediliyor. Farklı bir hesap seçmek için iki kez hafifçe dokunun."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Diğer alanlar"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Fotoğrafı değiştirin"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Düzenleyici açılamadı."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Kaydedilecek hesap:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Görüntüleniyor"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Şu anda <xliff:g id="ACCOUNT_NAME">%s</xliff:g> hesabına kaydediliyor. Farklı bir hesap seçmek için iki kez dokunun."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Bağlı kişiler (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Bağlı kişi</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Bu kişi"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Olası kopyalar"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Bu kişiler aynı kişi olabilir. Tek bir kişi olarak birleştirecek şekilde bağlantı oluşturabilirsiniz."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Bağlantılı kişiler"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Bağlı kişiler"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Hesaplarınızdan"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Fotoğraf çek"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Tüm fotoğraflar"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Fotoğraf seçin"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> adlı hesaptan"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Sil: <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Favori kişileri paylaş"</string>
<string name="share_contacts" msgid="8109287987498711664">"Tüm kişileri paylaş"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Kişiler paylaşılamadı."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Kişileri içe/dışa aktar"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Kişileri dışa aktarın"</string>
<string name="dialog_import" msgid="2431698729761448759">"Kişileri içe aktar"</string>
<string name="share_error" msgid="948429331673358107">"Bu kişi paylaşılamıyor."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Paylaşılacak kişi yok."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Sık iletişim kurulanları sil"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM kart seç"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Hesapları yönet"</string>
- <string name="menu_import_export" msgid="26217871113229507">"İçe/Dışa Aktar"</string>
+ <string name="menu_import" msgid="6107961135813836467">"İçe aktar"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Dışa aktar"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Engellenen numaralar"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> aracılığıyla"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="SOURCE">%2$s</xliff:g> üzerinden şu saatte: <xliff:g id="DATE">%1$s</xliff:g>"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 68781a3..3221c72 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Пропоновані контакти"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Усі контакти"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Контакти об’єднано"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Користувача <xliff:g id="NAME">%s</xliff:g> видалено"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Контакти видалено</item>
<item quantity="few">Контакти видалено</item>
@@ -117,6 +118,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Немає контактів із цією міткою"</string>
<string name="emptyAccount" msgid="6873962901497975964">"У цьому обліковому записі немає контактів"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Ваш список контактів порожній"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Контакт <xliff:g id="DISPLAY_NAME">%s</xliff:g> збережено"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Контакт збережено"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Контакти розділено"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Не вдалося зберегти зміни в контакті"</string>
@@ -159,7 +161,6 @@
<string name="callAgain" msgid="3197312117049874778">"Набрати знову"</string>
<string name="returnCall" msgid="8171961914203617813">"Зворот. виклик"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Додати в контакти <xliff:g id="EMAIL">%s</xliff:g>?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"фото контакту"</string>
<string name="description_plus_button" msgid="515164827856229880">"плюс"</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="search_settings_description" msgid="2675223022992445813">"Імена ваших контактів"</string>
@@ -206,7 +207,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Дата"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Мітка"</string>
<string name="change_photo" msgid="8530597935483526383">"Змінити"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Основн. фото"</string>
<string name="description_star" msgid="2605854427360036550">"вибране"</string>
<string name="edit_contact" msgid="7529281274005689512">"Редаг. контакта"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"закрити"</string>
@@ -283,7 +283,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Ім’я"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Електронна пошта"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Телефон"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Фото"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Натисніть, щоб розгорнути редактор контактів."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Натисніть, щоб згорнути редактор контактів."</string>
<string name="content_description_directions" msgid="2686791825798189335">"маршрути до місця"</string>
@@ -294,12 +293,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"Останній дзвінок: <xliff:g id="CALL_TYPE">%s</xliff:g>, <xliff:g id="PHONE_NUMBER">%s</xliff:g>, <xliff:g id="DATE">%s</xliff:g>. Натисніть, щоб зателефонувати"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Ви: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Щоб сервіс Hangouts працював краще, введіть свій ідентифікатор Hangouts у поле \"Електронна адреса\" або \"Телефон\"."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Більше полів"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Змінити фотографію"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Не вдалося відкрити редактор."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Зберігання в обліковий запис"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Зараз контакт зберігається в обліковий запис <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Двічі торкніться, щоб вибрати інший обліковий запис."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Більше полів"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Змініть фотографію"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Не вдалося відкрити редактор."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Зберігання в обліковий запис"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Переглядається"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Наразі контакт зберігається в обліковий запис <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Двічі торкніться, щоб вибрати інший обліковий запис."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Об’єднані контакти (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="few">Об’єднані контакти (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="many">Об’єднані контакти (<xliff:g id="COUNT">%d</xliff:g>)</item>
@@ -331,10 +331,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Цей контакт"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Можливі копії"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Ці контакти можуть стосуватися однієї людини. Ви можете об’єднати їх."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Об’єднані контакти"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Об’єднані контакти"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"З ваших облікових записів"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Сфотографувати"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Усі фотографії"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Вибрати фотографію"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"З облікового запису <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Видалити <xliff:g id="DATA_TYPE">%s </xliff:g> <xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -569,7 +567,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Поділитися вибраними контактами"</string>
<string name="share_contacts" msgid="8109287987498711664">"Поділитися всіма контактами"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Не вдалося поділитися контактами."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Імпорт/експорт контактів"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Експорт контактів"</string>
<string name="dialog_import" msgid="2431698729761448759">"Імпорт контактів"</string>
<string name="share_error" msgid="948429331673358107">"Цей контакт неможливо надіслати."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Немає контактів, якими можна поділитися."</string>
@@ -584,7 +582,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Очистити часті контакти"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Вибрати SIM-карту"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Керувати обліковими записами"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Імпорт або експорт"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Імпортувати"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Експортувати"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Заблоковані номери"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"через <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> через <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index db312db..83183a8 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"مجوزہ رابطے"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"سبھی رابطے"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"رابطے لنک ہو گئے"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> حذف ہو گیا"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">رابطے حذف ہو گئے</item>
<item quantity="one">رابطہ حذف ہو گیا</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"اس لیبل کے ساتھ کوئی رابطے نہیں"</string>
<string name="emptyAccount" msgid="6873962901497975964">"اس اکاؤنٹ میں کوئی رابطے نہیں"</string>
<string name="emptyMainList" msgid="2772242747899664460">"آپ کے رابطوں کی فہرست خالی ہے"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> محفوظ ہو گیا"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"رابطہ محفوظ ہوگیا"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"رابطے اَن لنک ہو گئے"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"رابطہ کی تبدیلیاں محفوظ نہیں ہوسکیں"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"دوبارہ کال کریں"</string>
<string name="returnCall" msgid="8171961914203617813">"کال لوٹائیں"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"\"<xliff:g id="EMAIL">%s</xliff:g>\" کو رابطوں میں شامل کریں؟"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"رابطہ کی تصویر"</string>
<string name="description_plus_button" msgid="515164827856229880">"پلس"</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="search_settings_description" msgid="2675223022992445813">"آپ کے رابطوں کے نام"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"تاریخ"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"لیبل"</string>
<string name="change_photo" msgid="8530597935483526383">"تبدیل کریں"</string>
- <string name="primary_photo" msgid="8517942231868516999">"بنیادی تصویر"</string>
<string name="description_star" msgid="2605854427360036550">"پسندیدہ"</string>
<string name="edit_contact" msgid="7529281274005689512">"رابطہ میں ترمیم کریں"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"بند کریں"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"نام"</string>
<string name="header_email_entry" msgid="8666093061171624478">"ای میل"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"فون"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"تصویر"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"رابطہ ایڈیٹر پھیلانے کیلئے کلک کریں۔"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"رابطہ ایڈیٹر سکیڑنے کیلئے کلک کریں۔"</string>
<string name="content_description_directions" msgid="2686791825798189335">"مقام کیلئے ڈائریکشنز"</string>
@@ -280,15 +279,19 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"حالیہ کال۔ <xliff:g id="CALL_TYPE">%s</xliff:g>۔ <xliff:g id="PHONE_NUMBER">%s</xliff:g>۔ <xliff:g id="DATE">%s</xliff:g>۔ واپسی کال کرنے کیلئے کلک کریں"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"آپ: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"جب آپ کسی شخص کا Hangouts شناخت کنندہ ای میل فیلڈ یا فون فیلڈ میں داخل کرتے ہیں تو Hangouts بہتر کام کرتا ہے۔"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"مزید فیلڈز"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"تصویر بدلیں"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"ایڈیٹر کھولنے میں ناکام۔"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"اس میں محفوظ ہوگا"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"فی الحال <xliff:g id="ACCOUNT_NAME">%s</xliff:g> میں محفوظ کیا جا رہا ہے۔ کوئی مختلف اکاؤنٹ منتخـب کرنے کیلئے دو بار تھپتھپائیں۔"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">لنک کردہ رابطے (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="one">لنک کردہ رابطہ</item>
- </plurals>
+ <!-- no translation found for editor_more_fields (3630987771304393421) -->
+ <skip />
+ <!-- no translation found for editor_change_photo_content_description (754100561085306263) -->
+ <skip />
+ <!-- no translation found for editor_failed_to_load (1623639078580475818) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_title (4426337993307015833) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_read_only_title (8315171723911587719) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_description (3324358600570627740) -->
+ <skip />
+ <!-- no translation found for editor_linked_contacts_selector_title (249075501821303190) -->
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> لنک کردہ رابطے"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
<string name="quickcontact_suggestion_link_button" msgid="3244619714781727946">"رابطے لنک کریں"</string>
@@ -309,10 +312,9 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"یہ رابطہ"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"ممکنہ ڈپلیکیٹس"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"یہ رابطے ایک ہی شخص کے ہو سکتے ہیں۔ آپ انہیں ایک رابطے کے طور پر آپس میں لنک کر سکتے ہیں۔"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"لنک کردہ رابطے"</string>
+ <!-- no translation found for editor_linked_contacts_title (3077479751631492125) -->
+ <skip />
<string name="from_your_accounts" msgid="1746293107836889912">"آپ کے اکاؤنٹس سے"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"ایک تصویر لیں"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"سبھی تصاویر"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"تصویر چنیں"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> سے"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g> حذف کریں"</string>
@@ -547,7 +549,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"پسندیدہ رابطوں کا اشتراک کریں"</string>
<string name="share_contacts" msgid="8109287987498711664">"سارے رابطوں کا اشتراک کریں"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"رابطوں کا اشتراک کرنے میں ناکام۔"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"رابطے درآمد/برآمد کریں"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"رابطے برآمد کریں"</string>
<string name="dialog_import" msgid="2431698729761448759">"رابطے درآمد کریں"</string>
<string name="share_error" msgid="948429331673358107">"اس رابطہ کا اشتراک نہیں کیا جا سکتا۔"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"اشتراک کرنے کے لئے کوئی رابطے نہیں ہیں۔"</string>
@@ -562,7 +564,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"اکثر و بیشتر کو صاف کریں"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM کارڈ منتخب کریں"</string>
<string name="menu_accounts" msgid="1424330057450189074">"اکاؤنٹس کا نظم کریں"</string>
- <string name="menu_import_export" msgid="26217871113229507">"درآمد/برآمد کریں"</string>
+ <string name="menu_import" msgid="6107961135813836467">"درآمد کریں"</string>
+ <string name="menu_export" msgid="2658783911863503902">"برآمد کریں"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"مسدود کردہ نمبرز"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"بذریعہ <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> بذریعہ <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index 39b47b7..1bf3bfd 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Taklif etilgan kontaktlar"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Barcha kontaktlar"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Kontaktlar bog‘landi"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> o‘chirib tashlandi"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Kontaktlar o‘chirildi</item>
<item quantity="one">Kontakt o‘chirildi</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Bunday yorliq bilan birorta kontakt yo‘q"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Bu hisobda hech qanday kontakt yo‘q"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Kontaktlar ro‘yxati bo‘sh"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> saqlandi"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Kontakt saqlandi"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Kontaktlar ajratildi"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Kontakt ma’lumotlariga kiritilgan o‘zgarishlar saqlanmadi."</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Yana qo‘ng‘iroq qilish"</string>
<string name="returnCall" msgid="8171961914203617813">"Qo‘ng‘iroqni qaytarish"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Kontaktlarga \"<xliff:g id="EMAIL">%s</xliff:g>\" qo‘shilsinmi?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"kontakt surati"</string>
<string name="description_plus_button" msgid="515164827856229880">"plyus"</string>
<string name="exporting_contact_list_progress" msgid="560522409559101193">"<xliff:g id="TOTAL_NUMBER">%s</xliff:g> dan <xliff:g id="CURRENT_NUMBER">%s</xliff:g>ta kontakt"</string>
<string name="search_settings_description" msgid="2675223022992445813">"Kontaktlaringiz nomi"</string>
@@ -184,7 +185,7 @@
<string name="upgrade_in_progress" msgid="474511436863451061">"Kontakt ro‘yxati yangilanmoqda."</string>
<string name="search_results_searching" msgid="3984833028938569930">"Qidirilmoqda…"</string>
<string name="menu_display_selected" msgid="6470001164297969034">"Tanlanganni ko‘rsatish"</string>
- <string name="menu_display_all" msgid="8887488642609786198">"Barchasini ko‘rsatish"</string>
+ <string name="menu_display_all" msgid="8887488642609786198">"Hammasini ko‘rsatish"</string>
<string name="menu_select_all" msgid="621719255150713545">"Hammasini belgilash"</string>
<string name="menu_select_none" msgid="7093222469852132345">"Barcha tanlashlarni bekor qilish"</string>
<string name="add_new_entry_for_section" msgid="5223080690667565044">"Yangisini qo‘shish"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Sana"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Yorliq"</string>
<string name="change_photo" msgid="8530597935483526383">"O‘zgartirish"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Asosiy rasm"</string>
<string name="description_star" msgid="2605854427360036550">"ajratilgan"</string>
<string name="edit_contact" msgid="7529281274005689512">"Kontaktni tahrirlash"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"yopish"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Ism"</string>
<string name="header_email_entry" msgid="8666093061171624478">"E-pochta"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Telefon"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Rasm"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Kontaktni tahrirlash oynasini ochish uchun bosing."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Kontaktni tahrirlash oynasini yopish uchun bosing."</string>
<string name="content_description_directions" msgid="2686791825798189335">"manzilga yo\'nalishlar"</string>
@@ -280,13 +279,14 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"so‘nggi qo‘ng‘iroq. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. qaytarib qo‘ng‘iroq qilish uchun bosing"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Siz: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts yanada yaxshi ishlashi uchun e-pochta yoki telefon raqami maydoniga foydalanuvchining Hangouts identifikatorini kiriting."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Boshqa maydonlarni ko‘rsatish"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Suratni o‘zgartirish"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Muharrirni ochib bo‘lmadi."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Qayerga saqlansin"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Hozirda <xliff:g id="ACCOUNT_NAME">%s</xliff:g> hisobiga saqlanmoqda. Boshqa hisobni tanlash uchun ikki marta bosing."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">Bog‘langan kontaktlar (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <string name="editor_more_fields" msgid="3630987771304393421">"Boshqa maydonlarni ko‘rsatish"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Suratni o‘zgartirish"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Muharrirni ochib bo‘lmadi."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Qayerga saqlansin:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Ko‘rilmoqda:"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Ma’lumotlar hozirgi vaqtda <xliff:g id="ACCOUNT_NAME">%s</xliff:g> hisobiga saqlanmoqda. Boshqa hisobni tanlash uchun ikki marta bosing."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
+ <item quantity="other">Bog‘langan kontaktlar (<xliff:g id="COUNT">%d</xliff:g> kishi)</item>
<item quantity="one">Bog‘langan kontakt</item>
</plurals>
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> ta bog‘langan kontaktlar"</string>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Ushbu kontakt"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Takroriy kontaktlar"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Ushbu kontaktlar bitta odamniki bo‘lishi mumkin. Ularni bitta kontaktga bog‘lashingiz mumkin."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Bog‘langan kontaktlar"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Bog‘langan kontaktlar"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Hisoblaringizdan olingan"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Suratga olish"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Barcha suratlar"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Surat tanlash"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"<xliff:g id="ACCOUNT_NAME">%s</xliff:g> tomonidan"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>ni o‘chirish"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Sevimli kontaktlarni yuborish"</string>
<string name="share_contacts" msgid="8109287987498711664">"Barcha kontaktlarni yuborish"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Kontaktlarni yuborib bo‘lmadi."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Kontaktlarni import/eksport qilish"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Kontaktlarni eksport qilish"</string>
<string name="dialog_import" msgid="2431698729761448759">"Kontaktlarni import qilish"</string>
<string name="share_error" msgid="948429331673358107">"Bu kontaktni yuborib bo‘lmaydi."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Yuborish uchun hech qanday kontakt yo‘q."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Tez-tez aloqa qiling. tozalash"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"SIM kartani tanlash"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Hisoblarni boshqarish"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Import/eksport"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Import qilish"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Eksport qilish"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Bloklangan raqamlar"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"<xliff:g id="SOURCE">%1$s</xliff:g> orqali"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> – <xliff:g id="SOURCE">%2$s</xliff:g> orqali"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 8fe5066..e8a7dc1 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -67,6 +67,7 @@
<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="3343535986195643136">"Đã liên kết liên hệ"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"Đã xóa <xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">Liên hệ đã bị xóa</item>
<item quantity="one">Liên hệ đã bị xóa</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Không có liên hệ nào có nhãn này"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Không có danh bạ trong tài khoản này"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Danh sách liên hệ của bạn trống"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"Đã lưu <xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Đã lưu địa chỉ liên hệ"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Đã hủy liên kết liên hệ"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Không thể lưu thay đổi đối với liên hệ"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Gọi lại"</string>
<string name="returnCall" msgid="8171961914203617813">"Gọi lại"</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_contact_photo" msgid="3387458082667894062">"ảnh của liên hệ"</string>
<string name="description_plus_button" msgid="515164827856229880">"cộng"</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="search_settings_description" msgid="2675223022992445813">"Tên danh bạ của bạn"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Ngày"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Nhãn"</string>
<string name="change_photo" msgid="8530597935483526383">"Thay đổi"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Ảnh chính"</string>
<string name="description_star" msgid="2605854427360036550">"Yêu thích"</string>
<string name="edit_contact" msgid="7529281274005689512">"Chỉnh sửa liên hệ"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"đóng"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Tên"</string>
<string name="header_email_entry" msgid="8666093061171624478">"Email"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Điện thoại"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Ảnh"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Nhấp để mở rộng trình chỉnh sửa liên hệ."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Nhấp để thu gọn trình chỉnh sửa liên hệ."</string>
<string name="content_description_directions" msgid="2686791825798189335">"chỉ đường tới địa điểm"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"cuộc gọi gần đây. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. nhấp để gọi lại"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Bạn: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"Hangouts hoạt động tốt hơn khi bạn nhập số nhận dạng Hangouts của người đó vào trường email hoặc trường điện thoại."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Trường khác"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Thay đổi ảnh"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Không mở được trình chỉnh sửa."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Lưu vào"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Hiện đang lưu vào <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Hãy nhấn đúp để chọn tài khoản khác."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Trường khác"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Thay đổi ảnh"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Không mở được trình chỉnh sửa."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Lưu vào"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Xem"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Hiện đang lưu vào <xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Hãy nhấn đúp để chọn tài khoản khác."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">Liên hệ được liên kết (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">Liên hệ được liên kết</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Liên hệ này"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Có thể trùng lặp"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Các liên hệ này có thể là cùng một người. Bạn có thể liên kết chúng với nhau thành một liên hệ duy nhất."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Liên hệ đã liên kết"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Liên hệ đã liên kết"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Từ các tài khoản của bạn"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Chụp ảnh"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Tất cả ảnh"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Chọn ảnh"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Từ <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Xóa <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Chia sẻ liên hệ yêu thích"</string>
<string name="share_contacts" msgid="8109287987498711664">"Chia sẻ tất cả các liên hệ"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Không chia sẻ được liên hệ."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Nhập/xuất danh bạ"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Xuất danh bạ"</string>
<string name="dialog_import" msgid="2431698729761448759">"Nhập danh bạ"</string>
<string name="share_error" msgid="948429331673358107">"Không thể chia sẻ địa chỉ liên hệ này."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Không có liên hệ nào để chia sẻ."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Xóa DS liên hệ thường xuyên"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Chọn thẻ SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Quản lý tài khoản"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Nhập/xuất"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Nhập"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Xuất"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Số bị chặn"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">" qua <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> qua <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-w470dp/dimens.xml b/res/values-w470dp/dimens.xml
deleted file mode 100644
index 2c04e5d..0000000
--- a/res/values-w470dp/dimens.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<resources>
-
- <!-- The width the that the tabs occupy in the ActionBar when in landscape mode.
- 470dp is the height of a "normal" screen. We should leave 240dp for
- the title and menu items -->
- <dimen name="people_activity_landscape_tabs_width">230dip</dimen>
- <!-- The size of the text displayed in the ActionBar tabs in landscape mode.
- Text in the tabs should must be width dependent, otherwise it won't fit in the tabs.
- In portrait mode, the tabs look okay when overflowing their allocated space.
- We have to be more careful in landscape. -->
- <dimen name="people_activity_landscape_tabs_text_size">9dp</dimen>
-
-</resources>
\ No newline at end of file
diff --git a/res/values-w590dp/dimens.xml b/res/values-w590dp/dimens.xml
deleted file mode 100644
index 2fff6ca..0000000
--- a/res/values-w590dp/dimens.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<resources>
-
- <!-- The width the that the tabs occupy in the ActionBar when in landscape mode.
- 590dp is almost the height of a "large" screen. We should leave 240dp for
- the title and menu items -->
- <dimen name="people_activity_landscape_tabs_width">350dip</dimen>
- <!-- The size of the text displayed in the ActionBar tabs in landscape mode.
- Text in the tabs should must be width dependent, otherwise it won't fit in the tabs.
- In portrait mode, the tabs look okay when overflowing their allocated space.
- We have to be more careful in landscape. -->
- <dimen name="people_activity_landscape_tabs_text_size">14dp</dimen>
-
-</resources>
\ No newline at end of file
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 9f21e6c..7ebe53b 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"建议的联系人"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"所有联系人"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"联系人已关联"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"已删除<xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">已删除联系人</item>
<item quantity="one">已删除联系人</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"此标签下没有联系人"</string>
<string name="emptyAccount" msgid="6873962901497975964">"此帐号中没有联系人"</string>
<string name="emptyMainList" msgid="2772242747899664460">"联系人列表是空的"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"已保存<xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"联系人已保存"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"已将联系人取消关联"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"无法保存对联系人的更改"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"重拨"</string>
<string name="returnCall" msgid="8171961914203617813">"回拨"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"将“<xliff:g id="EMAIL">%s</xliff:g>”添加到通讯录?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"联系人照片"</string>
<string name="description_plus_button" msgid="515164827856229880">"添加"</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="search_settings_description" msgid="2675223022992445813">"联系人姓名"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"日期"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"标签"</string>
<string name="change_photo" msgid="8530597935483526383">"更改"</string>
- <string name="primary_photo" msgid="8517942231868516999">"主照片"</string>
<string name="description_star" msgid="2605854427360036550">"收藏"</string>
<string name="edit_contact" msgid="7529281274005689512">"编辑联系人"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"关闭"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"姓名"</string>
<string name="header_email_entry" msgid="8666093061171624478">"电子邮件地址"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"电话号码"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"照片"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"点按即可展开联系人编辑器。"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"点按即可收起联系人编辑器。"</string>
<string name="content_description_directions" msgid="2686791825798189335">"到特定地点的路线"</string>
@@ -280,15 +279,19 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"近期通话:<xliff:g id="CALL_TYPE">%s</xliff:g>,<xliff:g id="PHONE_NUMBER">%s</xliff:g>,<xliff:g id="DATE">%s</xliff:g>。点按可回拨。"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"您:<xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"请将联系人的环聊帐号信息输入到电子邮件地址字段或电话号码字段,以便获得更佳的环聊使用体验。"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"更多字段"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"更换照片"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"无法开启编辑器。"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"保存到"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"目前正在保存到 <xliff:g id="ACCOUNT_NAME">%s</xliff:g>。点按两次可选择其他帐号。"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">已关联的联系人(<xliff:g id="COUNT">%d</xliff:g> 位)</item>
- <item quantity="one">已关联的联系人</item>
- </plurals>
+ <!-- no translation found for editor_more_fields (3630987771304393421) -->
+ <skip />
+ <!-- no translation found for editor_change_photo_content_description (754100561085306263) -->
+ <skip />
+ <!-- no translation found for editor_failed_to_load (1623639078580475818) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_title (4426337993307015833) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_read_only_title (8315171723911587719) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_description (3324358600570627740) -->
+ <skip />
+ <!-- no translation found for editor_linked_contacts_selector_title (249075501821303190) -->
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> 位已关联的联系人"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
<string name="quickcontact_suggestion_link_button" msgid="3244619714781727946">"关联联系人"</string>
@@ -309,10 +312,9 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"此联系人"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"可能重复的联系人"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"这些联系人可能是同一个人。您可以将它们关联在一起,以合并成一个联系人。"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"已关联的联系人"</string>
+ <!-- no translation found for editor_linked_contacts_title (3077479751631492125) -->
+ <skip />
<string name="from_your_accounts" msgid="1746293107836889912">"来自您的帐号"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"拍摄照片"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"所有照片"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"选择照片"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"来源:<xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"删除<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +549,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"分享收藏的联系人"</string>
<string name="share_contacts" msgid="8109287987498711664">"分享所有联系人"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"无法分享联系人。"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"导入/导出联系人"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"导出联系人"</string>
<string name="dialog_import" msgid="2431698729761448759">"导入联系人"</string>
<string name="share_error" msgid="948429331673358107">"无法分享此联系人。"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"没有可分享的联系人。"</string>
@@ -562,7 +564,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"清除常用联系人"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"选择SIM卡"</string>
<string name="menu_accounts" msgid="1424330057450189074">"管理帐号"</string>
- <string name="menu_import_export" msgid="26217871113229507">"导入/导出"</string>
+ <string name="menu_import" msgid="6107961135813836467">"导入"</string>
+ <string name="menu_export" msgid="2658783911863503902">"导出"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"已屏蔽的号码"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"来源:<xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"时间:<xliff:g id="DATE">%1$s</xliff:g>,来源:<xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 8ede85c..655f520 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"建議的聯絡人"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"所有聯絡人"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"已連結聯絡人"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"已刪除<xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">已刪除聯絡人</item>
<item quantity="one">已刪除聯絡人</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"沒有任何聯絡人有此標籤"</string>
<string name="emptyAccount" msgid="6873962901497975964">"此帳戶中沒有聯絡人"</string>
<string name="emptyMainList" msgid="2772242747899664460">"您的聯絡人名單是空白的"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g>已儲存"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"聯絡人記錄已儲存"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"已解除連結聯絡人"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"無法儲存聯絡人變更"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"重撥"</string>
<string name="returnCall" msgid="8171961914203617813">"回覆來電"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"要將「<xliff:g id="EMAIL">%s</xliff:g>」加到通訊錄嗎?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"聯絡人相片"</string>
<string name="description_plus_button" msgid="515164827856229880">"加號"</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="search_settings_description" msgid="2675223022992445813">"您的聯絡人姓名"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"日期"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"標籤"</string>
<string name="change_photo" msgid="8530597935483526383">"變更"</string>
- <string name="primary_photo" msgid="8517942231868516999">"主要相片"</string>
<string name="description_star" msgid="2605854427360036550">"我的最愛"</string>
<string name="edit_contact" msgid="7529281274005689512">"編輯聯絡人"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"關閉"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"名稱"</string>
<string name="header_email_entry" msgid="8666093061171624478">"電郵"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"電話"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"相片"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"按一下以展開聯絡人編輯器。"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"按一下以收合聯絡人編輯器。"</string>
<string name="content_description_directions" msgid="2686791825798189335">"規劃前往特定地點的路線"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"最近通話 (<xliff:g id="CALL_TYPE">%s</xliff:g>、<xliff:g id="PHONE_NUMBER">%s</xliff:g>、<xliff:g id="DATE">%s</xliff:g>)。按一下即可回電"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"您:<xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"當您在電郵欄或手機欄中輸入個人的 Hangouts 識別碼時,Hangouts 會提供更卓越的服務。"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"更多欄位"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"變更相片"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"無法打開編輯器。"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"正在儲存至以下帳戶:"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"目前儲存至 <xliff:g id="ACCOUNT_NAME">%s</xliff:g>。連按兩下即可選擇另一個帳戶。"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"更多欄位"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"變更相片"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"無法打開編輯器。"</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"正在儲存至以下帳戶:"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"正在查看"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"目前儲存至 <xliff:g id="ACCOUNT_NAME">%s</xliff:g>。連按兩下即可選擇另一個帳戶。"</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="other">已連結的聯絡人 (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="one">已連結的聯絡人</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"這個聯絡人"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"可能重複"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"這些聯絡人可能是同一個人,您可連結兩者成為單一聯絡人。"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"已連結的聯絡人"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"已連結的聯絡人"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"來自您的帳戶"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"拍照"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"所有相片"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"選擇相片"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"來自 <xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"刪除<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"分享常用聯絡人"</string>
<string name="share_contacts" msgid="8109287987498711664">"分享所有聯絡人"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"無法分享聯絡人。"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"匯入/匯出聯絡人資料"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"匯出聯絡人"</string>
<string name="dialog_import" msgid="2431698729761448759">"匯入通訊錄"</string>
<string name="share_error" msgid="948429331673358107">"無法分享這位聯絡人的資料。"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"沒有聯絡人可供分享。"</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"清除常用聯絡人"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"選取 SIM 卡"</string>
<string name="menu_accounts" msgid="1424330057450189074">"管理帳戶"</string>
- <string name="menu_import_export" msgid="26217871113229507">"匯入/匯出"</string>
+ <string name="menu_import" msgid="6107961135813836467">"匯入"</string>
+ <string name="menu_export" msgid="2658783911863503902">"匯出"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"已封鎖的號碼"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"透過 <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> (透過 <xliff:g id="SOURCE">%2$s</xliff:g>)"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e7e3592..7a2bac2 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"建議聯絡人"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"所有聯絡人"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"聯絡人連結完成"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"已刪除<xliff:g id="NAME">%s</xliff:g>"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="other">已刪除聯絡人</item>
<item quantity="one">已刪除聯絡人</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"沒有任何聯絡人設有這個標籤"</string>
<string name="emptyAccount" msgid="6873962901497975964">"這個帳戶中沒有聯絡人"</string>
<string name="emptyMainList" msgid="2772242747899664460">"您的聯絡人清單沒有任何項目"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"已儲存<xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"聯絡人已儲存"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"已取消連結聯絡人"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"無法儲存變更後的聯絡人資訊"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"重撥"</string>
<string name="returnCall" msgid="8171961914203617813">"回電"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"要將「<xliff:g id="EMAIL">%s</xliff:g>」加到通訊錄嗎?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"聯絡人相片"</string>
<string name="description_plus_button" msgid="515164827856229880">"加號"</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="search_settings_description" msgid="2675223022992445813">"您的聯絡人姓名"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"日期"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"標籤"</string>
<string name="change_photo" msgid="8530597935483526383">"變更"</string>
- <string name="primary_photo" msgid="8517942231868516999">"主要相片"</string>
<string name="description_star" msgid="2605854427360036550">"我的收藏"</string>
<string name="edit_contact" msgid="7529281274005689512">"編輯聯絡人"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"關閉"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"姓名"</string>
<string name="header_email_entry" msgid="8666093061171624478">"電子郵件"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"電話"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"相片"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"按一下即可展開聯絡人編輯器。"</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"按一下即可收合聯絡人編輯器。"</string>
<string name="content_description_directions" msgid="2686791825798189335">"規劃前往特定地點的路線"</string>
@@ -280,15 +279,19 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"近期通話。<xliff:g id="CALL_TYPE">%s</xliff:g>。<xliff:g id="PHONE_NUMBER">%s</xliff:g>。<xliff:g id="DATE">%s</xliff:g>。按一下即可回電"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"您:<xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"如果您在電子郵件欄位或電話欄位中輸入聯絡人的 Hangouts 識別碼,可讓 Hangouts 的運作效能更佳。"</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"更多欄位"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"更換相片"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"無法開啟編輯器。"</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"儲存到"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"正在儲存到 <xliff:g id="ACCOUNT_NAME">%s</xliff:g>。輕觸兩下即可選擇其他帳戶。"</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
- <item quantity="other">已連結的聯絡人 (<xliff:g id="COUNT">%d</xliff:g> 位)</item>
- <item quantity="one">已連結的聯絡人</item>
- </plurals>
+ <!-- no translation found for editor_more_fields (3630987771304393421) -->
+ <skip />
+ <!-- no translation found for editor_change_photo_content_description (754100561085306263) -->
+ <skip />
+ <!-- no translation found for editor_failed_to_load (1623639078580475818) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_title (4426337993307015833) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_read_only_title (8315171723911587719) -->
+ <skip />
+ <!-- no translation found for editor_account_selector_description (3324358600570627740) -->
+ <skip />
+ <!-- no translation found for editor_linked_contacts_selector_title (249075501821303190) -->
<string name="quickcontact_contacts_number" msgid="6036916944287597682">"<xliff:g id="COUNT">%d</xliff:g> 位已連結的聯絡人"</string>
<string name="quick_contact_display_name_with_phonetic" msgid="3692038078718876610">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> (<xliff:g id="PHONETIC_NAME">%s</xliff:g>)"</string>
<string name="quickcontact_suggestion_link_button" msgid="3244619714781727946">"連結聯絡人"</string>
@@ -309,10 +312,9 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"這位聯絡人"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"可能重複的聯絡人"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"這些聯絡人可能是同一人。您可以將這些聯絡人連結合併成單筆聯絡人資料。"</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"已連結的聯絡人"</string>
+ <!-- no translation found for editor_linked_contacts_title (3077479751631492125) -->
+ <skip />
<string name="from_your_accounts" msgid="1746293107836889912">"來自您的帳戶"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"拍照"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"所有相片"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"選擇相片"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"來自<xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"刪除<xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +549,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"分享常用聯絡人資料"</string>
<string name="share_contacts" msgid="8109287987498711664">"分享所有聯絡人資料"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"無法分享聯絡人資料。"</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"匯入/匯出聯絡人"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"匯出聯絡人"</string>
<string name="dialog_import" msgid="2431698729761448759">"匯入聯絡人"</string>
<string name="share_error" msgid="948429331673358107">"無法分享這位聯絡人。"</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"沒有任何聯絡人資料可分享。"</string>
@@ -562,7 +564,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"清除常用聯絡人"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"選取 SIM 卡"</string>
<string name="menu_accounts" msgid="1424330057450189074">"管理帳戶"</string>
- <string name="menu_import_export" msgid="26217871113229507">"匯入/匯出"</string>
+ <string name="menu_import" msgid="6107961135813836467">"匯入"</string>
+ <string name="menu_export" msgid="2658783911863503902">"匯出"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"已封鎖的號碼"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"透過 <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> (透過 <xliff:g id="SOURCE">%2$s</xliff:g>)"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 5f6dee1..f08eb25 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -67,6 +67,7 @@
<string name="separatorJoinAggregateSuggestions" msgid="2831414448851313345">"Othintana nabo abasikiselwayo"</string>
<string name="separatorJoinAggregateAll" msgid="7939932265026181043">"Bonke othintana nabo"</string>
<string name="contactsJoinedMessage" msgid="3343535986195643136">"Oxhumana nabo baxhunyiwe"</string>
+ <string name="contact_deleted_named_toast" msgid="6558941164987421174">"<xliff:g id="NAME">%s</xliff:g> kususiwe"</string>
<plurals name="contacts_deleted_toast" formatted="false" msgid="1477708624197262295">
<item quantity="one">Oxhumana nabo basusiwe</item>
<item quantity="other">Oxhumana nabo basusiwe</item>
@@ -111,6 +112,7 @@
<string name="emptyGroup" msgid="5102411903247859575">"Abekho oxhumana nabo abanale lebula"</string>
<string name="emptyAccount" msgid="6873962901497975964">"Abekho oxhumana nabo kule akhawunti"</string>
<string name="emptyMainList" msgid="2772242747899664460">"Uhlu lwakho loxhumana nabo alunalutho"</string>
+ <string name="contactSavedNamedToast" msgid="895136068894549611">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> kulondoloziwe"</string>
<string name="contactSavedToast" msgid="9171862279493213075">"Oxhumana naye olondoloziwe"</string>
<string name="contactUnlinkedToast" msgid="7122823195786012553">"Oxhumana nabo basuswe ukuxhumana"</string>
<string name="contactSavedErrorToast" msgid="4827033473908688031">"Ayikwazanga ukulondoloza ushintsho loxhumana naye"</string>
@@ -147,7 +149,6 @@
<string name="callAgain" msgid="3197312117049874778">"Shayela futhi"</string>
<string name="returnCall" msgid="8171961914203617813">"Buyisela ikholi"</string>
<string name="add_contact_dlg_message_fmt" msgid="7986472669444326576">"Faka \"<xliff:g id="EMAIL">%s</xliff:g>\" kothintana nabo?"</string>
- <string name="description_contact_photo" msgid="3387458082667894062">"isithombe sothintana naye"</string>
<string name="description_plus_button" msgid="515164827856229880">"kuhlanganise"</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="search_settings_description" msgid="2675223022992445813">"Amagama othintana nabo"</string>
@@ -192,7 +193,6 @@
<string name="event_edit_field_hint_text" msgid="5794424930242630477">"Idethi"</string>
<string name="group_edit_field_hint_text" msgid="8038224059926963133">"Ilebula"</string>
<string name="change_photo" msgid="8530597935483526383">"Guqula"</string>
- <string name="primary_photo" msgid="8517942231868516999">"Isithombe esiyinhloko"</string>
<string name="description_star" msgid="2605854427360036550">"intandokazi"</string>
<string name="edit_contact" msgid="7529281274005689512">"Hlela othintana naye"</string>
<string name="action_menu_back_from_edit_select" msgid="6435476408621731420">"vala"</string>
@@ -269,7 +269,6 @@
<string name="header_name_entry" msgid="1592791008096288306">"Igama"</string>
<string name="header_email_entry" msgid="8666093061171624478">"I-imeyili"</string>
<string name="header_phone_entry" msgid="8450980572274173570">"Ifoni"</string>
- <string name="header_photo_entry" msgid="4438023151411853238">"Isithombe"</string>
<string name="content_description_expand_editor" msgid="1111381475901897470">"Chofoza ukuze unwebe isihleli soxhumana naye."</string>
<string name="content_description_collapse_editor" msgid="7598061318022977825">"Chofoza ukuze ugoqe isihleli soxhumana naye."</string>
<string name="content_description_directions" msgid="2686791825798189335">"izikhombisi-ndlela eziya endaweni"</string>
@@ -280,12 +279,13 @@
<string name="content_description_recent_call" msgid="5183800406316723676">"ikholi yakamuva. <xliff:g id="CALL_TYPE">%s</xliff:g>. <xliff:g id="PHONE_NUMBER">%s</xliff:g>. <xliff:g id="DATE">%s</xliff:g>. chofoza ukuze uphinde ushaye"</string>
<string name="message_from_you_prefix" msgid="7180706529908434482">"Wena: <xliff:g id="SMS_BODY">%s</xliff:g>"</string>
<string name="contact_editor_hangouts_im_alert" msgid="114855385615225735">"I-Hangouts isebenza kangcono uma ufaka isikhombi somuntu se-Hangouts kunkambu ye-imeyili noma kunkambu yefoni."</string>
- <string name="compact_editor_more_fields" msgid="5987638193568699600">"Izinkambu eziningi"</string>
- <string name="compact_editor_change_photo_content_description" msgid="5495487714301211540">"Guqula isithombe"</string>
- <string name="compact_editor_failed_to_load" msgid="4557094426388044958">"Yehlulekile ukuvula umhleli."</string>
- <string name="compact_editor_account_selector_title" msgid="5119592614151786601">"Ukulondoloza ku-"</string>
- <string name="compact_editor_account_selector_description" msgid="2127184829759350507">"Okwamanje ilondoloza ku-<xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Thepha kabili ukuze ukhethe i-akhawunti ehlukile."</string>
- <plurals name="compact_editor_linked_contacts_selector_title" formatted="false" msgid="9156207930915878316">
+ <string name="editor_more_fields" msgid="3630987771304393421">"Izinkambu eziningi"</string>
+ <string name="editor_change_photo_content_description" msgid="754100561085306263">"Guqula isithombe"</string>
+ <string name="editor_failed_to_load" msgid="1623639078580475818">"Yehlulekile ukuvula umhleli."</string>
+ <string name="editor_account_selector_title" msgid="4426337993307015833">"Ukulondoloza ku-"</string>
+ <string name="editor_account_selector_read_only_title" msgid="8315171723911587719">"Ukubuka"</string>
+ <string name="editor_account_selector_description" msgid="3324358600570627740">"Okwamanje ilondoloza ku-<xliff:g id="ACCOUNT_NAME">%s</xliff:g>. Thepha kabili ukuze ukhethe i-akhawunti ehlukile."</string>
+ <plurals name="editor_linked_contacts_selector_title" formatted="false" msgid="249075501821303190">
<item quantity="one">Oxhumana nabo abaxhunyiwe (<xliff:g id="COUNT">%d</xliff:g>)</item>
<item quantity="other">Oxhumana nabo abaxhunyiwe (<xliff:g id="COUNT">%d</xliff:g>)</item>
</plurals>
@@ -309,10 +309,8 @@
<string name="suggestion_card_this_contact_title" msgid="3039457405374454914">"Lo oxhumana naye"</string>
<string name="suggestion_card_duplicates_title" msgid="9107788743178980902">"Izimpinda ezingenzeka"</string>
<string name="suggestion_card_help_message" msgid="4474061044387181093">"Laba oxhumana nabo kungaba umuntu ofanayo. Ungabaxhumanisa ndawonye njengoxhumana naye oyedwa."</string>
- <string name="compact_editor_linked_contacts_title" msgid="4417919183651782674">"Oxhumana nabo abaxhunyiwe"</string>
+ <string name="editor_linked_contacts_title" msgid="3077479751631492125">"Oxhumana nabo abaxhunyiwe"</string>
<string name="from_your_accounts" msgid="1746293107836889912">"Kusuka kuma-akhawunti wakho"</string>
- <string name="take_a_photo_button" msgid="6268693854069113488">"Thatha isithombe"</string>
- <string name="all_photos_button" msgid="1943122929420111351">"Zonke izithombe"</string>
<string name="photo_picker_title" msgid="5272832995550042801">"Khetha isithombe"</string>
<string name="contact_from_account_name" msgid="2078526819634079406">"Kusuka ku-<xliff:g id="ACCOUNT_NAME">%s</xliff:g>"</string>
<string name="editor_delete_view_description" msgid="8583095381562991959">"Susa <xliff:g id="DATA_TYPE">%s </xliff:g><xliff:g id="DATA_KIND">%s</xliff:g>"</string>
@@ -547,7 +545,7 @@
<string name="share_favorite_contacts" msgid="4280926751003081042">"Yabelana ngoxhumana nabo obathandayo"</string>
<string name="share_contacts" msgid="8109287987498711664">"Yabelana bonke oxhumana nabo"</string>
<string name="share_contacts_failure" msgid="1216431977330560559">"Yehlulekile ukwabelana ngoxhumana nabo."</string>
- <string name="dialog_import_export" msgid="4360648034889921624">"Ngenisa/Thekelisa othintana nabo"</string>
+ <string name="dialog_export" msgid="1628001095187741417">"Thekelisa othintana nabo"</string>
<string name="dialog_import" msgid="2431698729761448759">"Ngenisa othintana nabo"</string>
<string name="share_error" msgid="948429331673358107">"Lona oxhumana naye ngeke ukwazi ukwabelana ngaye."</string>
<string name="no_contact_to_share" msgid="1276397530378323033">"Abekho oxhumana nabo ongabelana nabo."</string>
@@ -562,7 +560,8 @@
<string name="menu_clear_frequents" msgid="7688250191932838833">"Sula oxhumana nabo njalo"</string>
<string name="menu_select_sim" msgid="3603578201960504010">"Khetha ikhadi le-SIM"</string>
<string name="menu_accounts" msgid="1424330057450189074">"Phatha ama-akhawunti"</string>
- <string name="menu_import_export" msgid="26217871113229507">"Ngenisa/Thekelisa"</string>
+ <string name="menu_import" msgid="6107961135813836467">"Ngenisa"</string>
+ <string name="menu_export" msgid="2658783911863503902">"Hambisa"</string>
<string name="menu_blocked_numbers" msgid="5272951629083025995">"Izinombolo ezivinjiwe"</string>
<string name="contact_status_update_attribution" msgid="752179367353018597">"nge <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="7358045508107825068">"<xliff:g id="DATE">%1$s</xliff:g> nge- <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 607b7a0..081d579 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -33,6 +33,7 @@
<color name="action_bar_button_text_color">#FFFFFF</color>
<color name="actionbar_background_color">@color/primary_color</color>
+ <color name="actionbar_background_color_dark">@color/primary_color_dark</color>
<color name="contextual_selection_bar_color">#f6f6f6</color>
<!-- Color of the status bar above the contextual selection bar. -->
@@ -41,9 +42,6 @@
<color name="primary_color_dark">#0277bd</color>
<color name="primary_color">#0288d1</color>
- <color name="group_primary_color_dark">#546E7A</color>
- <color name="group_primary_color">#607D8B</color>
-
<!-- Color of the selected tab underline -->
<color name="contacts_accent_color">#FFFFFF</color>
@@ -73,12 +71,6 @@
<!-- Color of disabled text and unfocused hint text inside the contact editor. 25% black. -->
<color name="editor_disabled_text_color">#40000000</color>
- <!-- Color of button background in compact photo picker. -->
- <color name="google_grey_600">#757575</color>
-
- <!-- Color of button text in compact photo picker, 85% white. -->
- <color name="photo_action_button_color">#D9FFFFFF</color>
-
<!-- Color of text on disabled link contacts button, 25% black. -->
<color name="disabled_button_text">#40000000</color>
@@ -88,6 +80,12 @@
<!-- Color of background of all empty states. -->
<color name="empty_state_background">#efefef</color>
+ <!-- Colors of swipeRefreshLayout's spinning circle. -->
+ <color name="swipe_refresh_color1">#0f9d58</color>
+ <color name="swipe_refresh_color2">#dd4b37</color>
+ <color name="swipe_refresh_color3">#4285f4</color>
+ <color name="swipe_refresh_color4">#f4b400</color>
+
<!-- Color of hamburger icon in promo -->
<color name="hamburger_feature_highlight_inner_color">#00ffffff</color>
@@ -197,11 +195,6 @@
<!-- Color for icons in the actionbar -->
<color name="actionbar_icon_color">#ffffff</color>
- <color name="tab_ripple_color">@color/tab_accent_color</color>
- <color name="tab_accent_color">#ffffff</color>
- <color name="tab_selected_underline_color">@color/tab_accent_color</color>
- <color name="tab_unread_count_background_color">#700f4b70</color>
-
<!-- Color of the title to the Frequently Contacted section -->
<color name="frequently_contacted_title_color">@color/actionbar_background_color</color>
@@ -214,7 +207,6 @@
<color name="actionbar_text_color_black">#DF000000</color>
<!-- Solid grey for status bar overlay-->
<color name="actionbar_color_grey_solid">#777777</color>
- <color name="actionbar_unselected_text_color">#a6ffffff</color>
<!-- Text color of the search box text as entered by user -->
<color name="searchbox_text_color">#000000</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index f3e73ff..f3e2a04 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -16,9 +16,6 @@
<resources>
<dimen name="account_selector_popup_width">400dip</dimen>
- <!-- Account info left margin in Compact editor. -->
- <dimen name="compact_editor_account_left_margin">4dp</dimen>
-
<!-- Initial height of transparent space above QuickContacts -->
<dimen name="quickcontact_starting_empty_height">150dp</dimen>
<!-- Initial size of QuickContact's title size -->
@@ -40,7 +37,16 @@
snaps to the top of the window. -->
<dimen name="quickcontact_snap_to_top_slop_height">33dp</dimen>
- <!-- The ratio of width:height (360:184) for the compact editor contact photo in portrait -->
+ <!-- Account info left margin in editor. -->
+ <dimen name="editor_account_left_margin">4dp</dimen>
+
+ <!-- Margin between name field and whatever fields are above it. -->
+ <dimen name="editor_name_top_margin">8dp</dimen>
+
+ <!-- Top margin for "Saving to" account header text field. -->
+ <dimen name="editor_account_header_top_margin">3dp</dimen>
+
+ <!-- The ratio of width:height (360:184) for the editor contact photo in portrait -->
<item name="editor_portrait_photo_ratio" type="dimen" format="float">1.96</item>
<!-- Padding of the rounded plus/minus/expand/collapse buttons in the editor -->
@@ -90,24 +96,12 @@
padding between TextView's in the readonly Raw Contact Editor. -->
<dimen name="editor_padding_between_read_only_editor_views">9dp</dimen>
- <!-- Padding above and below the photo editor. This value is chosen to give 19dp of apparent
- padding between TextView's and the photo's ImageView. -->
- <dimen name="editor_padding_around_read_only_photo_editor">15dp</dimen>
-
- <!-- Padding below the photo editor. This value is larger than
- editor_padding_between_editor_views, since ImageView's don't have space between the bottom
- of their visual bottom, like an EditText does. -->
- <dimen name="editor_padding_below_photo">9dp</dimen>
-
<!-- Width of the Type-Label in the Editor -->
<dimen name="editor_type_label_width">150dip</dimen>
<!-- Left padding of the label in the add field button for the contact editor -->
<dimen name="editor_add_field_label_left_padding">16dip</dimen>
- <!-- Top margin for the first field of the compact contact editor -->
- <dimen name="editor_compact_first_field_padding">10dp</dimen>
-
<!-- Top and bottom padding for the two text views in editor account header expandable -->
<dimen name="editor_account_header_expandable_top_bottom_padding">24dp</dimen>
@@ -237,16 +231,6 @@
<dimen name="quickcontact_expanding_button_section_height">48dp</dimen>
<dimen name="quickcontact_expanding_button_section_padding">8dp</dimen>
- <!-- The width the that the tabs occupy in the ActionBar when in landscape mode.
- 426dp is the height of a "small" screen. We should leave 240dp for
- the title and menu items -->
- <dimen name="people_activity_landscape_tabs_width">186dip</dimen>
- <!-- The size of the text displayed in the ActionBar tabs in landscape mode.
- Text in the tabs should must be width dependent, otherwise it won't fit in the tabs.
- In portrait mode, the tabs look okay when overflowing their allocated space.
- We have to be more careful in landscape. -->
- <dimen name="people_activity_landscape_tabs_text_size">8dp</dimen>
-
<!-- Top margin of the text message when provider status is busy -->
<dimen name="update_contact_list_top_margin">188dp</dimen>
@@ -260,15 +244,6 @@
<dimen name="contact_browser_list_item_height">56dp</dimen>
- <!-- Ideal item width in photo picker -->
- <dimen name="photo_picker_item_ideal_width">135dp</dimen>
-
- <!-- Margin between name field and whatever fields are above it. -->
- <dimen name="compact_editor_name_top_margin">8dp</dimen>
-
- <!-- Top margin for "Saving to" account header text field. -->
- <dimen name="compact_editor_account_header_top_margin">3dp</dimen>
-
<!-- Navigation drawer header height, the same as the status bar in landscape and portrait modes -->
<dimen name="nav_header_height">24dp</dimen>
@@ -294,6 +269,9 @@
<!-- Minimum height for group name EditText -->
<dimen name="group_name_edit_text_min_height">48dp</dimen>
+ <!-- Distance to pull down before causing a refresh. -->
+ <dimen name="pull_to_refresh_distance">40dp</dimen>
+
<!-- Elevation of contact list header -->
<dimen name="contact_list_header_elevation">2dp</dimen>
@@ -427,17 +405,8 @@
<!-- Offset of bottom margin of the floating action button used when dialpad is up -->
<dimen name="floating_action_button_dialpad_margin_bottom_offset">4dp</dimen>
- <!-- Height of the selection indicator of a tab. -->
- <dimen name="tab_selected_underline_height">2dp</dimen>
<!-- Size of text in tabs. -->
- <dimen name="tab_text_size">14sp</dimen>
<dimen name="tab_elevation">2dp</dimen>
- <dimen name="tab_unread_count_background_size">16dp</dimen>
- <dimen name="tab_unread_count_background_radius">2dp</dimen>
- <dimen name="tab_unread_count_margin_left">10dp</dimen>
- <dimen name="tab_unread_count_margin_top">2dp</dimen>
- <dimen name="tab_unread_count_text_size">12sp</dimen>
- <dimen name="tab_unread_count_text_padding">2dp</dimen>
<!-- Padding around the icon in the search box. -->
<dimen name="search_box_icon_margin">4dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 70ca005..566bd75 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -172,6 +172,9 @@
<!-- Toast shown after two contacts have been linked by a user action. [CHAR LIMIT=NONE] -->
<string name="contactsJoinedMessage">Contacts linked</string>
+ <!-- Toast shown after contact deleted when no display name is given. [CHAR LIMIT=20]-->
+ <string name="contact_deleted_named_toast"><xliff:g id="name">%s</xliff:g> deleted</string>
+
<!-- Toast shown after contacts that the user has selected are deleted by a user action. [CHAR LIMIT=30] -->
<plurals name="contacts_deleted_toast">
<item quantity="one">Contact deleted</item>
@@ -293,6 +296,9 @@
<!-- The text displayed when there's no contacts in the main contacts list [CHAR LIMIT=70] -->
<string name="emptyMainList">Your contacts list is empty</string>
+ <!-- Toast displayed when a contact is saved [CHAR LIMIT=30] -->
+ <string name="contactSavedNamedToast"><xliff:g id="display_name">%s</xliff:g> saved</string>
+
<!-- Toast displayed when a contact is saved [CHAR LIMIT=NONE] -->
<string name="contactSavedToast">Contact saved</string>
@@ -384,12 +390,6 @@
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>
- <!-- String describing the Contact Photo Image
-
- Used by AccessibilityService to announce the purpose of the view.
- -->
- <string name="description_contact_photo">contact photo</string>
-
<!-- String describing the Contact Editor Plus button
Used by AccessibilityService to announce the purpose of the button.
@@ -517,9 +517,6 @@
<!-- Button used for changing a photo in the Raw Contact Editor [CHAR LIMIT=15] -->
<string name="change_photo">Change</string>
- <!-- RadioButton that determines whether a raw contact's photo should be used for the entire contact [CHAR LIMIT=25] -->
- <string name="primary_photo">Primary photo</string>
-
<!-- String describing the Star/Favorite checkbox
Used by AccessibilityService to announce the purpose of the view.
@@ -686,12 +683,12 @@
<!-- Message in the contact editor prompt that asks the user which account they want to save the newly created contact to. [CHAR LIMIT=NONE] -->
<string name="contact_editor_prompt_multiple_accounts">Choose a default account for new contacts:</string>
- <!-- Title of the ContactEditorActivity when creating a new contact. The char
+ <!-- Title of the editor activity when creating a new contact. The char
limit is short and cannot be increased, since this needs to be displayed in a single line
at a pre-determined text size. [CHAR LIMIT=20] -->
<string name="contact_editor_title_new_contact">Add new contact</string>
- <!-- Title of the ContactEditorActivity when editing a contact that already exists. The char
+ <!-- Title of the editor activity when editing a contact that already exists. The char
limit is short and cannot be increased, since this needs to be displayed in a single line
at a pre-determined text size. [CHAR LIMIT=20] -->
<string name="contact_editor_title_existing_contact">Edit contact</string>
@@ -765,8 +762,6 @@
<string name="header_email_entry">Email</string>
<!-- Content description for the phone fields header entry [CHAR LIMIT=NONE] -->
<string name="header_phone_entry">Phone</string>
- <!-- Content description for the camera icon beside the photo section in the Raw Contact Editor [CHAR LIMIT=NONE] -->
- <string name="header_photo_entry">Photo</string>
<!-- Content description for the expand button inside the raw contact editor's header. [CHAR LIMIT=NONE] -->
<string name="content_description_expand_editor">Click to expand contact editor.</string>
@@ -795,23 +790,26 @@
<!-- When a user tries to create an IM Hangouts field, an alert dialog pops up displaying this message. We don't want users entering email addresses of phone numbers into the IM field. [CHAR LIMIT=200] -->
<string name="contact_editor_hangouts_im_alert">Hangouts works better when you enter the person\'s Hangouts identifier into the email field or phone field.</string>
- <!-- Button to expand the compact contact editor to show all available input fields. [CHAR LIMIT=60] -->
- <string name="compact_editor_more_fields">More fields</string>
+ <!-- Button to expand the contact editor to show all available input fields. [CHAR LIMIT=60] -->
+ <string name="editor_more_fields">More fields</string>
- <!-- Content description for the compact contact editor photo overlay which, when clicked, shows a dialog with the options for changing the contact photo. [CHAR LIMIT=30] -->
- <string name="compact_editor_change_photo_content_description">Change photo</string>
+ <!-- Content description for the contact editor photo overlay which, when clicked, shows a dialog with the options for changing the contact photo. [CHAR LIMIT=30] -->
+ <string name="editor_change_photo_content_description">Change photo</string>
<!-- Toast message displayed when the editor fails to load for a contacts. [CHAR LIMIT=NONE] -->
- <string name="compact_editor_failed_to_load">Failed to open editor.</string>
+ <string name="editor_failed_to_load">Failed to open editor.</string>
<!-- Label for the account selector to indicate which account a contact will be saved to. [CHAR LIMIT=30] -->
- <string name="compact_editor_account_selector_title">Saving to</string>
+ <string name="editor_account_selector_title">Saving to</string>
+
+ <!-- Label for the account selector to indicate which read-only account is being viewed. [CHAR LIMIT=30] -->
+ <string name="editor_account_selector_read_only_title">Viewing</string>
<!-- Content description for the account selector to indicate which account a contact will be saved to. [CHAR LIMIT=NONE] -->
- <string name="compact_editor_account_selector_description">Currently saving to <xliff:g id="account_name">%s</xliff:g>. Double-tap to pick a different account.</string>
+ <string name="editor_account_selector_description">Currently saving to <xliff:g id="account_name">%s</xliff:g>. Double-tap to pick a different account.</string>
<!-- Label for the linked contacts selector which indicates the number of raw contacts which have been linked together into the aggregate being viewed. [CHAR LIMIT=40] -->
- <plurals name="compact_editor_linked_contacts_selector_title">
+ <plurals name="editor_linked_contacts_selector_title">
<item quantity="one">Linked contact</item>
<item quantity="other">Linked contacts (<xliff:g id="count">%d</xliff:g>)</item>
</plurals>
@@ -859,17 +857,11 @@
<string name="suggestion_card_help_message">These contacts might be the same person. You can link them together as a single contact.</string>
<!-- Linked contacts title showing in contact editor UI. [CHAR LIMIT=30]-->
- <string name="compact_editor_linked_contacts_title">Linked contacts</string>
+ <string name="editor_linked_contacts_title">Linked contacts</string>
<!-- Title of profile photos that are from your various accounts -->
<string name="from_your_accounts">From your accounts</string>
- <!-- Button used in photo picker to open camera [CHAR LIMIT=30]-->
- <string name="take_a_photo_button">Take a photo</string>
-
- <!-- Button used in photo picker to open photo/gallery [CHAR LIMIT=20]-->
- <string name="all_photos_button">All photos</string>
-
<!-- Title of photo picker [CHAR LIMIT=30]-->
<string name="photo_picker_title">Choose photo</string>
@@ -1603,7 +1595,7 @@
<string name="share_contacts_failure">Failed to share contacts.</string>
<!-- Dialog title when selecting the bulk operation to perform from a list. [CHAR LIMIT=36] -->
- <string name="dialog_import_export">Import/export contacts</string>
+ <string name="dialog_export">Export contacts</string>
<!-- Dialog title when importing contacts from an external source. [CHAR LIMIT=36] -->
<string name="dialog_import">Import contacts</string>
@@ -1652,8 +1644,11 @@
<!-- The menu item to open the list of accounts. [CHAR LIMIT=60]-->
<string name="menu_accounts">Manage accounts</string>
- <!-- The menu item to bulk import or bulk export contacts from SIM card or SD card. [CHAR LIMIT=30]-->
- <string name="menu_import_export">Import/export</string>
+ <!-- The menu item to bulk import contacts from SIM card or SD card. [CHAR LIMIT=30]-->
+ <string name="menu_import">Import</string>
+
+ <!-- The menu item to bulk export contacts from SIM card or SD card. [CHAR LIMIT=30]-->
+ <string name="menu_export">Export</string>
<!-- The menu item to open blocked numbers activity [CHAR LIMIT=60]-->
<string name="menu_blocked_numbers">Blocked numbers</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 432f0a8..e7b6582 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -41,10 +41,6 @@
<style name="PeopleTheme" parent="@android:style/Theme.Material.Light">
<item name="android:actionBarStyle">@style/ContactsActionBarStyle</item>
- <!-- Style for the tab bar (for the divider between tabs) -->
- <item name="android:actionBarTabBarStyle">@style/ContactsActionBarTabBarStyle</item>
- <!-- Style for the tab bar text (for text on tabs) -->
- <item name="android:actionBarTabTextStyle">@style/ContactsActionBarTabTextStyle</item>
<!-- Drawable for the back button -->
<item name="android:homeAsUpIndicator">@drawable/ic_back_arrow</item>
<!-- Style for the overflow button in the actionbar. -->
@@ -103,21 +99,10 @@
<item name="android:listSelector">?android:attr/listChoiceBackgroundIndicator</item>
</style>
- <style name="GroupActivityTheme" parent="@style/PeopleActivityTheme">
- <item name="android:colorPrimaryDark">@color/group_primary_color_dark</item>
- <item name="colorPrimaryDark">@color/group_primary_color_dark</item>
- </style>
-
<style name="PeopleThemeAppCompat" parent="Theme.AppCompat.Light">
<!-- Styles that require AppCompat compatibility, remember to update both sets -->
<item name="android:actionBarStyle">@style/ContactsActionBarStyleAppCompat</item>
<item name="actionBarStyle">@style/ContactsActionBarStyleAppCompat</item>
- <!-- Style for the tab bar (for the divider between tabs) -->
- <item name="android:actionBarTabBarStyle">@style/ContactsActionBarTabBarStyle</item>
- <item name="actionBarTabBarStyle">@style/ContactsActionBarTabBarStyle</item>
- <!-- Style for the tab bar text (for text on tabs) -->
- <item name="android:actionBarTabTextStyle">@style/ContactsActionBarTabTextStyle</item>
- <item name="actionBarTabTextStyle">@style/ContactsActionBarTabTextStyle</item>
<item name="android:actionButtonStyle">@style/ContactsActionButtonStyle</item>
<item name="actionButtonStyle">@style/ContactsActionButtonStyle</item>
<!-- Drawable for the back button -->
@@ -249,22 +234,6 @@
<item name="android:textColor">@color/actionbar_text_color_black</item>
</style>
- <!-- Styling for the tab bar; handles styling of the divider line. -->
- <style name="ContactsActionBarTabBarStyle"
- parent="@android:style/Widget.Material.ActionBar.TabBar">
- <item name="android:showDividers">none</item>
- </style>
-
- <!-- Text style for tabs. -->
- <style name="ContactsActionBarTabTextStyle"
- parent="android:style/Widget.Material.Light.ActionBar.TabText">
- <item name="android:textColor">@color/tab_text_color</item>
- <item name="android:textSize">@dimen/tab_text_size</item>
- <item name="android:fontFamily">@string/tab_font_family</item>
- <item name="android:elevation">0dp</item>
- <item name="android:textStyle">bold</item>
- </style>
-
<!-- Action bar overflow menu icon. -->
<style name="ContactsActionBarOverflowQP"
parent="Widget.AppCompat.Light.ActionButton.Overflow">
diff --git a/res/xml/preference_display_options.xml b/res/xml/preference_display_options.xml
index f7a6514..bf7e871 100644
--- a/res/xml/preference_display_options.xml
+++ b/res/xml/preference_display_options.xml
@@ -51,8 +51,13 @@
<Preference
android:icon="@null"
- android:key="importExport"
- android:title="@string/menu_import_export"/>
+ android:key="import"
+ android:title="@string/menu_import"/>
+
+ <Preference
+ android:icon="@null"
+ android:key="export"
+ android:title="@string/menu_export"/>
<Preference
android:icon="@null"
diff --git a/src-bind/com/android/contactsbind/Assistants.java b/src-bind/com/android/contactsbind/Assistants.java
deleted file mode 100644
index 3fba91c..0000000
--- a/src-bind/com/android/contactsbind/Assistants.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2016 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.contactsbind;
-
-import android.content.Context;
-import android.content.Intent;
-
-/**
- * Creates default implementations of contacts assistants.
- */
-public final class Assistants {
-
- private Assistants() {
- }
-
- /**
- * Returns an Intent to start an Activity to clean up duplicate contacts or null
- * if it is not a supported feature.
- */
- public static Intent getDuplicatesActivityIntent(Context context) {
- return null;
- }
-}
diff --git a/src-bind/com/android/contactsbind/ObjectFactory.java b/src-bind/com/android/contactsbind/ObjectFactory.java
index ecdb967..83b8f4d 100644
--- a/src-bind/com/android/contactsbind/ObjectFactory.java
+++ b/src-bind/com/android/contactsbind/ObjectFactory.java
@@ -15,9 +15,13 @@
import com.android.contacts.common.logging.Logger;
import com.android.contacts.common.preference.PreferenceManager;
+import com.android.contactsbind.search.AutocompleteHelper;
import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
+import android.app.Fragment;
import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
/**
* Creates default bindings for overlays.
@@ -30,7 +34,23 @@
public static PreferenceManager getPreferenceManager(Context context) { return null; }
+ public static AutocompleteHelper getAutocompleteHelper(Context context) {
+ return null;
+ }
+
public static DeviceLocalAccountTypeFactory getDeviceLocalAccountTypeFactory(Context context) {
return new DeviceLocalAccountTypeFactory.Default(context);
}
+
+ public static Fragment getDuplicatesFragment() {
+ return null;
+ }
+
+ public static Fragment getDuplicatesUtilFragment() {
+ return null;
+ }
+
+ public static Intent getContactSheetIntent(Context context, Uri contactLookupUri) {
+ return null;
+ }
}
diff --git a/src-bind/com/android/contactsbind/experiments/Flags.java b/src-bind/com/android/contactsbind/experiments/Flags.java
index e2bfb5c..4c29958 100644
--- a/src-bind/com/android/contactsbind/experiments/Flags.java
+++ b/src-bind/com/android/contactsbind/experiments/Flags.java
@@ -17,8 +17,6 @@
import android.content.Context;
-import com.android.contacts.common.Experiments;
-
import java.util.HashMap;
import java.util.Map;
diff --git a/src-bind/com/android/contactsbind/search/AutocompleteHelper.java b/src-bind/com/android/contactsbind/search/AutocompleteHelper.java
new file mode 100644
index 0000000..c37a828
--- /dev/null
+++ b/src-bind/com/android/contactsbind/search/AutocompleteHelper.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 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.contactsbind.search;
+
+import android.database.Cursor;
+
+public final class AutocompleteHelper {
+
+ public static final String TAG = "Autocomplete";
+
+ public interface Listener {
+ void onAutocompletesAvailable(Cursor cursor);
+ }
+
+ private AutocompleteHelper() {
+ }
+
+ public void setListener(Listener listener) {
+ }
+
+ public void setProjection(String[] projection) {
+ }
+
+ public void setQuery(String query) {
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index c514a45..d4da588 100755
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -51,7 +51,7 @@
import android.util.Log;
import android.widget.Toast;
-import com.android.contacts.activities.ContactEditorBaseActivity;
+import com.android.contacts.activities.ContactEditorActivity;
import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.database.ContactUpdateUtils;
import com.android.contacts.common.model.AccountTypeManager;
@@ -215,13 +215,13 @@
} catch (Exception exception) {
final int resId;
switch (saveMode) {
- case ContactEditorBaseActivity.ContactEditor.SaveMode.SPLIT:
+ case ContactEditorActivity.ContactEditor.SaveMode.SPLIT:
resId = R.string.contactUnlinkErrorToast;
break;
- case ContactEditorBaseActivity.ContactEditor.SaveMode.RELOAD:
+ case ContactEditorActivity.ContactEditor.SaveMode.RELOAD:
resId = R.string.contactJoinErrorToast;
break;
- case ContactEditorBaseActivity.ContactEditor.SaveMode.CLOSE:
+ case ContactEditorActivity.ContactEditor.SaveMode.CLOSE:
resId = R.string.contactSavedErrorToast;
break;
default:
@@ -743,7 +743,8 @@
ContentValues values = new ContentValues();
// TODO: Move this into the contact editor where it belongs. This needs to be integrated
- // with the way other intent extras that are passed to the {@link ContactEditorActivity}.
+ // with the way other intent extras that are passed to the
+ // {@link ContactEditorActivity}.
values.clear();
values.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
values.put(GroupMembership.GROUP_ROW_ID, ContentUris.parseId(groupUri));
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 729d75f..b810eec 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -22,7 +22,6 @@
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PorterDuff;
-import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.Intents;
import android.support.annotation.LayoutRes;
@@ -32,10 +31,7 @@
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
-import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -46,10 +42,9 @@
import android.widget.LinearLayout;
import android.widget.Toast;
-import com.android.contacts.activities.GroupMembersActivity;
+import com.android.contacts.activities.ActionBarAdapter;
import com.android.contacts.common.ContactsUtils;
import com.android.contacts.common.compat.CompatUtils;
-import com.android.contacts.common.editor.SelectAccountDialogFragment;
import com.android.contacts.common.list.AccountFilterActivity;
import com.android.contacts.common.list.ContactListFilter;
import com.android.contacts.common.list.ContactListFilterController;
@@ -61,7 +56,9 @@
import com.android.contacts.common.util.ImplicitIntentsUtil;
import com.android.contacts.common.util.ViewUtil;
import com.android.contacts.editor.ContactEditorFragment;
+import com.android.contacts.editor.SelectAccountDialogFragment;
import com.android.contacts.group.GroupListItem;
+import com.android.contacts.group.GroupMembersFragment;
import com.android.contacts.group.GroupMetaData;
import com.android.contacts.group.GroupNameEditDialogFragment;
import com.android.contacts.group.GroupUtil;
@@ -69,12 +66,13 @@
import com.android.contacts.group.GroupsFragment.GroupsListener;
import com.android.contacts.interactions.AccountFiltersFragment;
import com.android.contacts.interactions.AccountFiltersFragment.AccountFiltersListener;
-import com.android.contacts.quickcontact.QuickContactActivity;
+import com.android.contacts.list.DefaultContactBrowseListFragment;
+import com.android.contacts.list.MultiSelectContactsListFragment;
import com.android.contacts.common.model.account.AccountDisplayInfo;
import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
import com.android.contacts.util.SharedPreferenceUtil;
-import com.android.contactsbind.Assistants;
import com.android.contactsbind.HelpUtils;
+import com.android.contactsbind.ObjectFactory;
import java.util.HashMap;
import java.util.Iterator;
@@ -91,6 +89,15 @@
NavigationView.OnNavigationItemSelectedListener,
SelectAccountDialogFragment.Listener {
+ /** Possible views of Contacts app. */
+ public enum ContactsView {
+ NONE,
+ ALL_CONTACTS,
+ DUPLICATES,
+ GROUP_VIEW,
+ ACCOUNT_VIEW,
+ }
+
protected static String TAG = "ContactsDrawerActivity";
private static final String TAG_GROUPS = "groups";
@@ -99,15 +106,9 @@
private static final String TAG_GROUP_NAME_EDIT_DIALOG = "groupNameEditDialog";
private static final String KEY_NEW_GROUP_ACCOUNT = "newGroupAccount";
+ private static final String KEY_CONTACTS_VIEW = "contactsView";
- protected static final String ACTION_CREATE_GROUP = "createGroup";
-
- // TODO(wenyiw): remove all the code related to these constants after switching to fragments.
- // Positions of "all contacts" and "duplicates" in navigation drawer.
- private static final int ALL_CONTACTS_POSITION = 1;
- private static final int DUPLICATES_POSITION = 2;
- // Gap between two menu groups, including a separator, a menu group header.
- private static final int GAP_BETWEEN_TWO_MENU_GROUPS = 2;
+ protected ContactsView mCurrentView;
private class ContactsActionBarDrawerToggle extends ActionBarDrawerToggle {
@@ -129,6 +130,33 @@
mMenuClickedBefore = true;
}
invalidateOptionsMenu();
+ // Stop search and selection mode like Gmail and Keep. Otherwise, if user switches to
+ // another fragment in navigation drawer, the current search/selection mode will be
+ // overlaid by the action bar of the newly-created fragment.
+ stopSearchAndSelection();
+ }
+
+ private void stopSearchAndSelection() {
+ final MultiSelectContactsListFragment listFragment;
+ if (isAllContactsView() || isAccountView()) {
+ listFragment = getAllFragment();
+ } else if (isGroupView()) {
+ listFragment = getGroupFragment();
+ } else {
+ listFragment = null;
+ }
+ if (listFragment == null) {
+ return;
+ }
+ final ActionBarAdapter actionBarAdapter = listFragment.getActionBarAdapter();
+ if (actionBarAdapter == null) {
+ return;
+ }
+ if (actionBarAdapter.isSearchMode()) {
+ actionBarAdapter.setSearchMode(false);
+ } else if (actionBarAdapter.isSelectionMode()) {
+ actionBarAdapter.setSelectionMode(false);
+ }
}
@Override
@@ -163,17 +191,15 @@
protected GroupsFragment mGroupsFragment;
protected AccountFiltersFragment mAccountFiltersFragment;
- // Checkable menu item lookup maps. Every map declared here should be added to
- // clearCheckedMenus() so that they can be cleared.
- // TODO find a better way to handle selected menu item state, when swicthing to fragments.
- protected Map<Long, MenuItem> mGroupMenuMap = new HashMap<>();
- protected Map<ContactListFilter, MenuItem> mFilterMenuMap = new HashMap<>();
- protected Map<Integer, MenuItem> mIdMenuMap = new HashMap<>();
-
// The account the new group will be created under.
private AccountWithDataSet mNewGroupAccount;
- private int mPositionOfLastGroup;
+ // Checkable menu item lookup maps. Every map declared here should be added to
+ // clearCheckedMenus() so that they can be cleared.
+ // TODO find a better way to handle selected menu item state, when switching to fragments.
+ protected Map<Long, MenuItem> mGroupMenuMap = new HashMap<>();
+ protected Map<ContactListFilter, MenuItem> mFilterMenuMap = new HashMap<>();
+ protected Map<Integer, MenuItem> mIdMenuMap = new HashMap<>();
@Override
protected void onCreate(Bundle savedState) {
@@ -198,57 +224,52 @@
mDrawer.setDrawerListener(mToggle);
mToggle.syncState();
+ // Set up navigation mode.
+ if (savedState != null) {
+ mCurrentView = ContactsView.values()[savedState.getInt(KEY_CONTACTS_VIEW)];
+ } else {
+ mCurrentView = ContactsView.ALL_CONTACTS;
+ }
+
// Set up hamburger menu items.
mNavigationView = (NavigationView) findViewById(R.id.nav_view);
mNavigationView.setNavigationItemSelectedListener(this);
-
- final Menu menu = mNavigationView.getMenu();
-
- final MenuItem allContacts = menu.findItem(R.id.nav_all_contacts);
- mIdMenuMap.put(R.id.nav_all_contacts, allContacts);
-
- if (Assistants.getDuplicatesActivityIntent(this) == null) {
- menu.removeItem(R.id.nav_find_duplicates);
- } else {
- final MenuItem findDup = menu.findItem(R.id.nav_find_duplicates);
- mIdMenuMap.put(R.id.nav_find_duplicates, findDup);
- }
-
- if (!HelpUtils.isHelpAndFeedbackAvailable()) {
- menu.removeItem(R.id.nav_help);
- }
+ setUpMenu();
loadGroupsAndFilters();
- if (isDuplicatesActivity()) {
- clearCheckedMenus();
- mIdMenuMap.get(R.id.nav_find_duplicates).setCheckable(true);
- mIdMenuMap.get(R.id.nav_find_duplicates).setChecked(true);
- maybeUpdateScrollPosition(DUPLICATES_POSITION);
- }
-
if (savedState != null && savedState.containsKey(KEY_NEW_GROUP_ACCOUNT)) {
mNewGroupAccount = AccountWithDataSet.unstringify(
savedState.getString(KEY_NEW_GROUP_ACCOUNT));
}
}
- private void maybeUpdateScrollPosition(int position) {
- if (mDrawer.isDrawerOpen(GravityCompat.START)) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "Don't scroll menu when drawer open");
- return;
+ private void setUpMenu() {
+ final Menu menu = mNavigationView.getMenu();
+
+ if (ObjectFactory.getDuplicatesFragment() == null) {
+ menu.removeItem(R.id.nav_find_duplicates);
+ } else {
+ final MenuItem findDupMenu = menu.findItem(R.id.nav_find_duplicates);
+ mIdMenuMap.put(R.id.nav_find_duplicates, findDupMenu);
+ if (isDuplicatesView()) {
+ updateMenuSelection(findDupMenu);
+ }
}
- final RecyclerView recyclerView = (RecyclerView) mNavigationView.getChildAt(0);
- final LinearLayoutManager layoutManager =
- (LinearLayoutManager) recyclerView.getLayoutManager();
- // Get screen height
- final DisplayMetrics metrics = getResources().getDisplayMetrics();
- final int height = metrics.heightPixels;
+ if (!HelpUtils.isHelpAndFeedbackAvailable()) {
+ menu.removeItem(R.id.nav_help);
+ }
- // Set 1/3 screen height as offset if possible.
- layoutManager.scrollToPositionWithOffset(position, height / 3);
- recyclerView.requestLayout();
+ final MenuItem allContactsMenu = menu.findItem(R.id.nav_all_contacts);
+ mIdMenuMap.put(R.id.nav_all_contacts, allContactsMenu);
+ if (isAllContactsView()) {
+ updateMenuSelection(allContactsMenu);
+ }
+ }
+
+ public Toolbar getToolbar() {
+ return mToolbar;
}
@Override
@@ -257,6 +278,7 @@
if (mNewGroupAccount != null) {
outState.putString(KEY_NEW_GROUP_ACCOUNT, mNewGroupAccount.stringify());
}
+ outState.putInt(KEY_CONTACTS_VIEW, mCurrentView.ordinal());
}
@Override
@@ -276,36 +298,6 @@
}
}
- @Override
- protected void onNewIntent(Intent newIntent) {
- if (ACTION_CREATE_GROUP.equals(newIntent.getAction())) {
- final Uri groupUri = newIntent.getData();
- if (groupUri == null) {
- Toast.makeText(this, R.string.groupSavedErrorToast, Toast.LENGTH_SHORT).show();
- return;
- }
- if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "Received group URI " + groupUri);
- Toast.makeText(this, R.string.groupCreatedToast, Toast.LENGTH_SHORT).show();
- startActivity(GroupUtil.createViewGroupIntent(this, groupUri, /* title */ null));
- if (shouldFinish()) {
- // If we created a group while viewing the members of an existing group (i.e.
- // while on GroupMembersActivity), finish the current GroupMembersActivity so that
- // hitting back from the new GroupMembersActivity that was just stared will open
- // the all contacts list. See b/30047708.
- finish();
- }
- } else {
- super.onNewIntent(newIntent);
- }
- }
-
- /**
- * Returns true if child class is DuplicatesActivity
- */
- protected boolean isDuplicatesActivity() {
- return false;
- }
-
// Set up fragment manager to load groups and filters.
protected void loadGroupsAndFilters() {
final FragmentManager fragmentManager = getFragmentManager();
@@ -350,7 +342,7 @@
subMenu.removeGroup(R.id.nav_groups_items);
mGroupMenuMap = new HashMap<>();
- mPositionOfLastGroup = DUPLICATES_POSITION + GAP_BETWEEN_TWO_MENU_GROUPS;
+ final GroupMetaData groupMetaData = getGroupMetaData();
if (groupListItems != null) {
// Add each group
@@ -358,11 +350,14 @@
if (GroupUtil.isEmptyFFCGroup(groupListItem)) {
continue;
}
- mPositionOfLastGroup++;
final String title = groupListItem.getTitle();
final MenuItem menuItem =
- subMenu.add(R.id.nav_groups_items, Menu.NONE, mPositionOfLastGroup, title);
+ subMenu.add(R.id.nav_groups_items, Menu.NONE, Menu.NONE, title);
mGroupMenuMap.put(groupListItem.getGroupId(), menuItem);
+ if (isGroupView() && groupMetaData != null
+ && groupMetaData.groupId == groupListItem.getGroupId()) {
+ updateMenuSelection(menuItem);
+ }
menuItem.setIcon(R.drawable.ic_menu_label);
menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
@@ -372,6 +367,7 @@
public void run() {
onGroupMenuItemClicked(groupListItem.getGroupId(),
groupListItem.getTitle());
+ updateMenuSelection(menuItem);
}
});
mDrawer.closeDrawer(GravityCompat.START);
@@ -386,10 +382,9 @@
return;
}
- mPositionOfLastGroup++;
// Create a menu item in the sub menu to add new groups
final MenuItem menuItem = subMenu.add(R.id.nav_groups_items, Menu.NONE,
- mPositionOfLastGroup, getString(R.string.menu_new_group_action_bar));
+ Menu.NONE, getString(R.string.menu_new_group_action_bar));
menuItem.setIcon(R.drawable.ic_add);
menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
@@ -405,36 +400,45 @@
}
});
- if (getGroupMetaData() != null) {
- updateGroupMenu(getGroupMetaData());
+ if (isGroupView() && groupMetaData != null) {
+ updateGroupMenu(groupMetaData);
}
}
- protected void updateGroupMenu(GroupMetaData groupMetaData) {
+ public void updateGroupMenu(GroupMetaData groupMetaData) {
clearCheckedMenus();
if (groupMetaData != null && mGroupMenuMap != null
&& mGroupMenuMap.get(groupMetaData.groupId) != null) {
- mGroupMenuMap.get(groupMetaData.groupId).setCheckable(true);
- mGroupMenuMap.get(groupMetaData.groupId).setChecked(true);
- maybeUpdateScrollPosition(mGroupMenuMap.get(groupMetaData.groupId).getOrder());
+ setMenuChecked(mGroupMenuMap.get(groupMetaData.groupId), true);
}
}
- /**
- * Returns group metadata if the child class is {@link GroupMembersActivity}, and null
- * otherwise.
- */
protected GroupMetaData getGroupMetaData() {
return null;
}
- protected void onGroupMenuItemClicked(long groupId, String title) {
- startActivity(GroupUtil.createViewGroupIntent(this, groupId, title));
- if (shouldFinish()) {
- finish();
- }
+ protected boolean isGroupView() {
+ return mCurrentView == ContactsView.GROUP_VIEW;
}
+ protected boolean isDuplicatesView() {
+ return mCurrentView == ContactsView.DUPLICATES;
+ }
+
+ protected boolean isAllContactsView() {
+ return mCurrentView == ContactsView.ALL_CONTACTS;
+ }
+
+ protected boolean isAccountView() {
+ return mCurrentView == ContactsView.ACCOUNT_VIEW;
+ }
+
+ public boolean isInSecondLevel() {
+ return isGroupView() || isDuplicatesView();
+ }
+
+ protected abstract void onGroupMenuItemClicked(long groupId, String title);
+
protected void onCreateGroupMenuItemClicked() {
// Select the account to create the group
final Bundle extras = getIntent().getExtras();
@@ -466,16 +470,17 @@
return;
}
- int positionOfLastFilter = mPositionOfLastGroup + GAP_BETWEEN_TWO_MENU_GROUPS;
for (int i = 0; i < accountFilterItems.size(); i++) {
- positionOfLastFilter++;
final ContactListFilter filter = accountFilterItems.get(i);
final AccountDisplayInfo displayableAccount =
accountDisplayFactory.getAccountDisplayInfoFor(filter);
final CharSequence menuName = displayableAccount.getNameLabel();
final MenuItem menuItem = subMenu.add(R.id.nav_filters_items, Menu.NONE,
- positionOfLastFilter, menuName);
+ Menu.NONE, menuName);
+ if (isAccountView() && filter == mContactListFilterController.getFilter()) {
+ updateMenuSelection(menuItem);
+ }
mFilterMenuMap.put(filter, menuItem);
final Intent intent = new Intent();
intent.putExtra(AccountFilterActivity.EXTRA_CONTACT_LIST_FILTER, filter);
@@ -485,12 +490,8 @@
mToggle.runWhenIdle(new Runnable() {
@Override
public void run() {
- AccountFilterUtil.handleAccountFilterResult(
- mContactListFilterController, AppCompatActivity.RESULT_OK,
- intent);
- if (shouldFinish()) {
- finish();
- }
+ onFilterMenuItemClicked(intent);
+ updateMenuSelection(menuItem);
}
});
mDrawer.closeDrawer(GravityCompat.START);
@@ -512,40 +513,29 @@
menuItem.setActionView(view);
}
- if (getContactListFilter() != null) {
- updateFilterMenu(getContactListFilter());
+ if (isAccountView()) {
+ updateFilterMenu(mContactListFilterController.getFilter());
}
}
- protected void updateFilterMenu(ContactListFilter filter) {
+ public void updateFilterMenu(ContactListFilter filter) {
clearCheckedMenus();
if (filter != null && filter.isContactsFilterType()) {
if (mIdMenuMap != null && mIdMenuMap.get(R.id.nav_all_contacts) != null) {
- mIdMenuMap.get(R.id.nav_all_contacts).setCheckable(true);
- mIdMenuMap.get(R.id.nav_all_contacts).setChecked(true);
- maybeUpdateScrollPosition(ALL_CONTACTS_POSITION);
+ setMenuChecked(mIdMenuMap.get(R.id.nav_all_contacts), true);
}
} else {
if (mFilterMenuMap != null && mFilterMenuMap.get(filter) != null) {
- mFilterMenuMap.get(filter).setCheckable(true);
- mFilterMenuMap.get(filter).setChecked(true);
- maybeUpdateScrollPosition(mFilterMenuMap.get(filter).getOrder());
+ setMenuChecked(mFilterMenuMap.get(filter), true);
}
}
}
- /**
- * Returns the current filter if the child class is PeopleActivity, and null otherwise.
- */
- protected ContactListFilter getContactListFilter() {
- return null;
+ protected void onFilterMenuItemClicked(Intent intent) {
+ AccountFilterUtil.handleAccountFilterResult(mContactListFilterController,
+ AppCompatActivity.RESULT_OK, intent);
}
- /**
- * Returns true if the child activity should finish after launching another activity.
- */
- protected abstract boolean shouldFinish();
-
@Override
public boolean onNavigationItemSelected(final MenuItem item) {
final int id = item.getItemId();
@@ -559,7 +549,10 @@
} else if (id == R.id.nav_all_contacts) {
switchToAllContacts();
} else if (id == R.id.nav_find_duplicates) {
- launchFindDuplicates();
+ if (!isDuplicatesView()) {
+ launchFindDuplicates();
+ updateMenuSelection(item);
+ }
} else if (item.getIntent() != null) {
ImplicitIntentsUtil.startActivityInApp(ContactsDrawerActivity.this,
item.getIntent());
@@ -577,56 +570,54 @@
final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
intent.putExtra(ContactsPreferenceActivity.EXTRA_NEW_LOCAL_PROFILE,
ContactEditorFragment.INTENT_EXTRA_NEW_LOCAL_PROFILE);
- intent.putExtra(ContactsPreferenceActivity.EXTRA_MODE_FULLY_EXPANDED,
- QuickContactActivity.MODE_FULLY_EXPANDED);
- intent.putExtra(ContactsPreferenceActivity.EXTRA_PREVIOUS_SCREEN_TYPE,
- QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE);
return intent;
}
- protected void switchToAllContacts() {
+ public void switchToAllContacts() {
+ resetFilter();
+
+ final Menu menu = mNavigationView.getMenu();
+ final MenuItem allContacts = menu.findItem(R.id.nav_all_contacts);
+ updateMenuSelection(allContacts);
+
+ setTitle(getString(R.string.contactsList));
+ }
+
+ private void resetFilter() {
final Intent intent = new Intent();
- final ContactListFilter filter = createContactsFilter();
+ final ContactListFilter filter = AccountFilterUtil.createContactsFilter(this);
intent.putExtra(AccountFilterActivity.EXTRA_CONTACT_LIST_FILTER, filter);
AccountFilterUtil.handleAccountFilterResult(
mContactListFilterController, AppCompatActivity.RESULT_OK, intent);
- if (shouldFinish()) {
- finish();
- }
}
- protected void launchFindDuplicates() {
- ImplicitIntentsUtil.startActivityInAppIfPossible(this,
- Assistants.getDuplicatesActivityIntent(this));
- }
+ protected abstract void launchFindDuplicates();
- /**
- * Returns a {@link ContactListFilter} of type
- * {@link ContactListFilter#FILTER_TYPE_ALL_ACCOUNTS}, or if a custom "Contacts to display"
- * filter has been set, then one of type {@link ContactListFilter#FILTER_TYPE_CUSTOM}.
- */
- protected ContactListFilter createContactsFilter() {
- final int filterType =
- ContactListFilterController.getInstance(this).isCustomFilterPersisted()
- ? ContactListFilter.FILTER_TYPE_CUSTOM
- : ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS;
- return ContactListFilter.createFilterWithType(filterType);
- }
+ protected abstract DefaultContactBrowseListFragment getAllFragment();
+
+ protected abstract GroupMembersFragment getGroupFragment();
+
+ public abstract void showFabWithAnimation(boolean showFab);
private void clearCheckedMenus() {
clearCheckedMenu(mFilterMenuMap);
clearCheckedMenu(mGroupMenuMap);
clearCheckedMenu(mIdMenuMap);
}
+
private void clearCheckedMenu(Map<?, MenuItem> map) {
final Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
- Entry pair = (Entry)it.next();
- map.get(pair.getKey()).setCheckable(false);
- map.get(pair.getKey()).setChecked(false);
+ Entry pair = (Entry) it.next();
+ setMenuChecked(map.get(pair.getKey()), false);
}
}
+ private void setMenuChecked(MenuItem menuItem, boolean checked) {
+ menuItem.setCheckable(checked);
+ menuItem.setChecked(checked);
+ }
+
private void selectAccountForNewGroup() {
final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(this)
.getGroupWritableAccounts();
@@ -649,11 +640,17 @@
@Override
public void onAccountChosen(AccountWithDataSet account, Bundle extraArgs) {
mNewGroupAccount = account;
- GroupNameEditDialogFragment.newInstanceForCreation(mNewGroupAccount, ACTION_CREATE_GROUP)
+ GroupNameEditDialogFragment.newInstanceForCreation(
+ mNewGroupAccount, GroupUtil.ACTION_CREATE_GROUP)
.show(getFragmentManager(), TAG_GROUP_NAME_EDIT_DIALOG);
}
@Override
public void onAccountSelectorCancelled() {
}
+
+ private void updateMenuSelection(MenuItem menuItem) {
+ clearCheckedMenus();
+ setMenuChecked(menuItem, true);
+ }
}
diff --git a/src/com/android/contacts/GroupListLoader.java b/src/com/android/contacts/GroupListLoader.java
index 4816a5e..51695f5 100644
--- a/src/com/android/contacts/GroupListLoader.java
+++ b/src/com/android/contacts/GroupListLoader.java
@@ -29,12 +29,6 @@
* groups.
*/
public final class GroupListLoader extends CursorLoader {
-
- public final static String DEFAULT_SELECTION =
- Groups.ACCOUNT_TYPE + " NOT NULL AND " +
- Groups.ACCOUNT_NAME + " NOT NULL AND " + Groups.AUTO_ADD + "=0 AND " +
- Groups.FAVORITES + "=0 AND " + Groups.DELETED + "=0";
-
private final static String[] COLUMNS = new String[] {
Groups.ACCOUNT_NAME,
Groups.ACCOUNT_TYPE,
@@ -61,7 +55,7 @@
super(context,
GROUP_LIST_URI,
COLUMNS,
- DEFAULT_SELECTION,
+ GroupUtil.DEFAULT_SELECTION,
null,
GroupUtil.getGroupsSortOrder());
}
diff --git a/src/com/android/contacts/GroupMetaDataLoader.java b/src/com/android/contacts/GroupMetaDataLoader.java
index 18a975d..200d919 100644
--- a/src/com/android/contacts/GroupMetaDataLoader.java
+++ b/src/com/android/contacts/GroupMetaDataLoader.java
@@ -51,7 +51,12 @@
public final static int DELETED = 8;
public GroupMetaDataLoader(Context context, Uri groupUri) {
- super(context, ensureIsGroupUri(groupUri), COLUMNS, GroupListLoader.DEFAULT_SELECTION, null,
+ super(context, ensureIsGroupUri(groupUri), COLUMNS, GroupUtil.DEFAULT_SELECTION, null,
+ GroupUtil.getGroupsSortOrder());
+ }
+
+ public GroupMetaDataLoader(Context context, Uri groupUri, String selection) {
+ super(context, ensureIsGroupUri(groupUri), COLUMNS, selection, null,
GroupUtil.getGroupsSortOrder());
}
@@ -64,7 +69,7 @@
if (groupUri == null) {
throw new IllegalArgumentException("Uri must not be null");
}
- if (!groupUri.toString().startsWith(Groups.CONTENT_URI.toString())) {
+ if (!GroupUtil.isGroupUri(groupUri)) {
throw new IllegalArgumentException("Invalid group Uri: " + groupUri);
}
return groupUri;
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index e046e71..824d4ea 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -20,11 +20,8 @@
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
-import android.content.SharedPreferences;
import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
import android.os.Bundle;
-import android.preference.PreferenceManager;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
@@ -69,41 +66,26 @@
void onAction(int action);
- /**
- * Called when the user selects a tab. The new tab can be obtained using
- * {@link #getCurrentTab}.
- */
- void onSelectedTabChanged();
-
void onUpButtonPressed();
}
private static final String EXTRA_KEY_SEARCH_MODE = "navBar.searchMode";
private static final String EXTRA_KEY_QUERY = "navBar.query";
- private static final String EXTRA_KEY_SELECTED_TAB = "navBar.selectedTab";
private static final String EXTRA_KEY_SELECTED_MODE = "navBar.selectionMode";
- private static final String PERSISTENT_LAST_TAB = "actionBarAdapter.lastTab";
-
private boolean mSelectionMode;
private boolean mSearchMode;
private String mQueryString;
private EditText mSearchView;
private View mClearSearchView;
- /** The view that represents tabs when we are in portrait mode **/
- private View mPortraitTabs;
- /** The view that represents tabs when we are in landscape mode **/
- private View mLandscapeTabs;
private View mSearchContainer;
private View mSelectionContainer;
- private int mMaxPortraitTabHeight;
private int mMaxToolbarContentInsetStart;
private int mActionBarAnimationDuration;
private final Activity mActivity;
- private final SharedPreferences mPrefs;
private Listener mListener;
@@ -122,29 +104,16 @@
private ValueAnimator mStatusBarAnimator;
- public interface TabState {
- public static int ALL = 0;
-
- public static int COUNT = 1;
- public static int DEFAULT = ALL;
- }
-
- private int mCurrentTab = TabState.DEFAULT;
-
public ActionBarAdapter(Activity activity, Listener listener, ActionBar actionBar,
- View portraitTabs, View landscapeTabs, Toolbar toolbar) {
- this(activity, listener, actionBar, portraitTabs, landscapeTabs, toolbar,
- R.string.hint_findContacts);
+ Toolbar toolbar) {
+ this(activity, listener, actionBar, toolbar, R.string.hint_findContacts);
}
public ActionBarAdapter(Activity activity, Listener listener, ActionBar actionBar,
- View portraitTabs, View landscapeTabs, Toolbar toolbar, int searchHintResId) {
+ Toolbar toolbar, int searchHintResId) {
mActivity = activity;
mListener = listener;
mActionBar = actionBar;
- mPrefs = PreferenceManager.getDefaultSharedPreferences(mActivity);
- mPortraitTabs = portraitTabs;
- mLandscapeTabs = landscapeTabs;
mToolbar = toolbar;
mToolBarFrame = (FrameLayout) mToolbar.getParent();
mMaxToolbarContentInsetStart = mToolbar.getContentInsetStart();
@@ -153,7 +122,6 @@
mActivity.getResources().getInteger(R.integer.action_bar_animation_duration);
setupSearchAndSelectionViews();
- setupTabs(mActivity);
}
public void setShowHomeIcon(boolean showHomeIcon) {
@@ -164,22 +132,10 @@
mShowHomeAsUp = showHomeAsUp;
}
- public EditText getSearchView() {
- return mSearchView;
- }
-
public View getSelectionContainer() {
return mSelectionContainer;
}
- private void setupTabs(Context context) {
- final TypedArray attributeArray = context.obtainStyledAttributes(
- new int[]{android.R.attr.actionBarSize});
- mMaxPortraitTabHeight = attributeArray.getDimensionPixelSize(0, 0);
- // Hide tabs initially
- setPortraitTabHeight(0);
- }
-
private void setupSearchAndSelectionViews() {
final LayoutInflater inflater = (LayoutInflater) mToolbar.getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
@@ -234,19 +190,11 @@
if (savedState == null) {
mSearchMode = request.isSearchMode();
mQueryString = request.getQueryString();
- mCurrentTab = loadLastTabPreference();
mSelectionMode = false;
} else {
mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
mSelectionMode = savedState.getBoolean(EXTRA_KEY_SELECTED_MODE);
mQueryString = savedState.getString(EXTRA_KEY_QUERY);
-
- // Just set to the field here. The listener will be notified by update().
- mCurrentTab = savedState.getInt(EXTRA_KEY_SELECTED_TAB);
- }
- if (mCurrentTab >= TabState.COUNT || mCurrentTab < 0) {
- // Invalid tab index was saved (b/12938207). Restore the default.
- mCurrentTab = TabState.DEFAULT;
}
// Show tabs or the expanded {@link SearchView}, depending on whether or not we are in
// search mode.
@@ -289,30 +237,6 @@
}
/**
- * Save the current tab selection, and notify the listener.
- */
- public void setCurrentTab(int tab) {
- setCurrentTab(tab, true);
- }
-
- /**
- * Save the current tab selection.
- */
- public void setCurrentTab(int tab, boolean notifyListener) {
- if (tab == mCurrentTab) {
- return;
- }
- mCurrentTab = tab;
-
- if (notifyListener && mListener != null) mListener.onSelectedTabChanged();
- saveLastTabPreference(mCurrentTab);
- }
-
- public int getCurrentTab() {
- return mCurrentTab;
- }
-
- /**
* @return Whether in search mode, i.e. if the search view is visible/expanded.
*
* Note even if the action bar is in search mode, if the query is empty, the search fragment
@@ -448,18 +372,12 @@
// to adding the desired container.
if (skipAnimation || isSwitchingFromSearchToSelection) {
if (isTabHeightChanging || isSwitchingFromSearchToSelection) {
- mToolbar.removeView(mLandscapeTabs);
mToolbar.removeView(mSearchContainer);
mToolBarFrame.removeView(mSelectionContainer);
if (mSelectionMode) {
- setPortraitTabHeight(0);
addSelectionContainer();
} else if (mSearchMode) {
- setPortraitTabHeight(0);
addSearchContainer();
- } else {
- setPortraitTabHeight(mMaxPortraitTabHeight);
- addLandscapeViewPagerTabs();
}
updateDisplayOptions(isSearchModeChanging);
}
@@ -468,25 +386,21 @@
// Handle a switch to/from selection mode, due to UI interaction.
if (isSelectionModeChanging) {
- mToolbar.removeView(mLandscapeTabs);
if (mSelectionMode) {
addSelectionContainer();
mSelectionContainer.setAlpha(0);
mSelectionContainer.animate().alpha(1).setDuration(mActionBarAnimationDuration);
- animateTabHeightChange(mMaxPortraitTabHeight, 0);
updateDisplayOptions(isSearchModeChanging);
} else {
if (mListener != null) {
mListener.onAction(Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE);
}
mSelectionContainer.setAlpha(1);
- animateTabHeightChange(0, mMaxPortraitTabHeight);
mSelectionContainer.animate().alpha(0).setDuration(mActionBarAnimationDuration)
.withEndAction(new Runnable() {
@Override
public void run() {
updateDisplayOptions(isSearchModeChanging);
- addLandscapeViewPagerTabs();
mToolBarFrame.removeView(mSelectionContainer);
}
});
@@ -495,22 +409,18 @@
// Handle a switch to/from search mode, due to UI interaction.
if (isSearchModeChanging) {
- mToolbar.removeView(mLandscapeTabs);
if (mSearchMode) {
addSearchContainer();
mSearchContainer.setAlpha(0);
mSearchContainer.animate().alpha(1).setDuration(mActionBarAnimationDuration);
- animateTabHeightChange(mMaxPortraitTabHeight, 0);
updateDisplayOptions(isSearchModeChanging);
} else {
mSearchContainer.setAlpha(1);
- animateTabHeightChange(0, mMaxPortraitTabHeight);
mSearchContainer.animate().alpha(0).setDuration(mActionBarAnimationDuration)
.withEndAction(new Runnable() {
@Override
public void run() {
updateDisplayOptions(isSearchModeChanging);
- addLandscapeViewPagerTabs();
mToolbar.removeView(mSearchContainer);
}
});
@@ -584,9 +494,8 @@
mActivity, R.color.contextual_selection_bar_status_bar_color);
runStatusBarAnimation(/* colorTo */ cabStatusBarColor);
} else {
- final int normalStatusBarColor = mActivity instanceof GroupMembersActivity
- ? ContextCompat.getColor(mActivity, R.color.group_primary_color_dark)
- : ContextCompat.getColor(mActivity, R.color.primary_color_dark);
+ final int normalStatusBarColor = ContextCompat.getColor(
+ mActivity, R.color.primary_color_dark);
if (shouldAnimate) {
runStatusBarAnimation(/* colorTo */ normalStatusBarColor);
} else {
@@ -618,13 +527,6 @@
}
}
- private void addLandscapeViewPagerTabs() {
- if (mLandscapeTabs != null) {
- mToolbar.removeView(mLandscapeTabs);
- mToolbar.addView(mLandscapeTabs);
- }
- }
-
private void addSearchContainer() {
mToolbar.removeView(mSearchContainer);
mToolbar.addView(mSearchContainer);
@@ -659,7 +561,6 @@
}
if (!mSearchMode && !mSelectionMode) {
mListener.onAction(Action.STOP_SEARCH_AND_SELECTION_MODE);
- mListener.onSelectedTabChanged();
}
}
updateDisplayOptionsInner();
@@ -675,7 +576,6 @@
outState.putBoolean(EXTRA_KEY_SEARCH_MODE, mSearchMode);
outState.putBoolean(EXTRA_KEY_SELECTED_MODE, mSelectionMode);
outState.putString(EXTRA_KEY_QUERY, mQueryString);
- outState.putInt(EXTRA_KEY_SELECTED_TAB, mCurrentTab);
}
public void setFocusOnSearchView() {
@@ -690,41 +590,4 @@
imm.showSoftInput(view, 0);
}
}
-
- private void saveLastTabPreference(int tab) {
- mPrefs.edit().putInt(PERSISTENT_LAST_TAB, tab).apply();
- }
-
- private int loadLastTabPreference() {
- try {
- return mPrefs.getInt(PERSISTENT_LAST_TAB, TabState.DEFAULT);
- } catch (IllegalArgumentException e) {
- // Preference is corrupt?
- return TabState.DEFAULT;
- }
- }
-
- private void animateTabHeightChange(int start, int end) {
- if (mPortraitTabs == null) {
- return;
- }
- final ValueAnimator animator = ValueAnimator.ofInt(start, end);
- animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator valueAnimator) {
- int value = (Integer) valueAnimator.getAnimatedValue();
- setPortraitTabHeight(value);
- }
- });
- animator.setDuration(100).start();
- }
-
- private void setPortraitTabHeight(int height) {
- if (mPortraitTabs == null) {
- return;
- }
- ViewGroup.LayoutParams layoutParams = mPortraitTabs.getLayoutParams();
- layoutParams.height = height;
- mPortraitTabs.setLayoutParams(layoutParams);
- }
}
diff --git a/src/com/android/contacts/activities/CompactContactEditorActivity.java b/src/com/android/contacts/activities/CompactContactEditorActivity.java
deleted file mode 100644
index fa2cb23..0000000
--- a/src/com/android/contacts/activities/CompactContactEditorActivity.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright (C) 2015 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.DynamicShortcuts;
-import com.android.contacts.R;
-import com.android.contacts.common.activity.RequestPermissionsActivity;
-import com.android.contacts.common.model.RawContactDeltaList;
-import com.android.contacts.detail.PhotoSelectionHandler;
-import com.android.contacts.editor.CompactContactEditorFragment;
-import com.android.contacts.editor.CompactPhotoSelectionFragment;
-import com.android.contacts.editor.PhotoSourceDialogFragment;
-
-import android.app.FragmentTransaction;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-
-import java.io.FileNotFoundException;
-import java.util.ArrayList;
-
-/**
- * Contact editor with only the most important fields displayed initially.
- */
-public class CompactContactEditorActivity extends ContactEditorBaseActivity implements
- PhotoSourceDialogFragment.Listener, CompactPhotoSelectionFragment.Listener {
-
- private static final String TAG_COMPACT_EDITOR = "compact_editor";
- private static final String TAG_PHOTO_SELECTION = "photo_selector";
-
- private static final String STATE_PHOTO_MODE = "photo_mode";
- private static final String STATE_IS_PHOTO_SELECTION = "is_photo_selection";
- private static final String STATE_ACTION_BAR_TITLE = "action_bar_title";
- private static final String STATE_PHOTO_URI = "photo_uri";
-
- /**
- * Displays a PopupWindow with photo edit options.
- */
- private final class CompactPhotoSelectionHandler extends PhotoSelectionHandler {
-
- /**
- * Receiver of photo edit option callbacks.
- */
- private final class CompactPhotoActionListener extends PhotoActionListener {
-
- @Override
- public void onRemovePictureChosen() {
- getEditorFragment().removePhoto();
- if (mIsPhotoSelection) {
- showEditorFragment();
- }
- }
-
- @Override
- public void onPhotoSelected(Uri uri) throws FileNotFoundException {
- mPhotoUri = uri;
- getEditorFragment().updatePhoto(uri);
- if (mIsPhotoSelection) {
- showEditorFragment();
- }
-
- // Re-create the photo handler the next time we need it so that additional photo
- // selections create a new temp file (and don't hit the one that was just added
- // to the cache).
- mPhotoSelectionHandler = null;
- }
-
- @Override
- public Uri getCurrentPhotoUri() {
- return mPhotoUri;
- }
-
- @Override
- public void onPhotoSelectionDismissed() {
- if (mIsPhotoSelection) {
- showEditorFragment();
- }
- }
- }
-
- private final CompactPhotoActionListener mPhotoActionListener;
- private boolean mIsPhotoSelection;
-
- public CompactPhotoSelectionHandler(int photoMode, boolean isPhotoSelection) {
- // We pass a null changeAnchorView since we are overriding onClick so that we
- // can show the photo options in a dialog instead of a ListPopupWindow (which would
- // be anchored at changeAnchorView).
-
- // TODO: empty raw contact delta list
- super(CompactContactEditorActivity.this, /* changeAnchorView =*/ null, photoMode,
- /* isDirectoryContact =*/ false, new RawContactDeltaList());
- mPhotoActionListener = new CompactPhotoActionListener();
- mIsPhotoSelection = isPhotoSelection;
- }
-
- @Override
- public PhotoActionListener getListener() {
- return mPhotoActionListener;
- }
-
- @Override
- protected void startPhotoActivity(Intent intent, int requestCode, Uri photoUri) {
- mPhotoUri = photoUri;
- startActivityForResult(intent, requestCode);
- }
- }
-
- private CompactPhotoSelectionFragment mPhotoSelectionFragment;
- private CompactPhotoSelectionHandler mPhotoSelectionHandler;
- private Uri mPhotoUri;
- private int mPhotoMode;
- private boolean mIsPhotoSelection;
-
- @Override
- public void onCreate(Bundle savedState) {
- super.onCreate(savedState);
-
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
- return;
- }
-
- setContentView(R.layout.compact_contact_editor_activity);
-
- if (savedState == null) {
- // Create the editor and photo selection fragments
- mFragment = new CompactContactEditorFragment();
- mPhotoSelectionFragment = new CompactPhotoSelectionFragment();
- getFragmentManager().beginTransaction()
- .add(R.id.fragment_container, getEditorFragment(), TAG_COMPACT_EDITOR)
- .add(R.id.fragment_container, mPhotoSelectionFragment, TAG_PHOTO_SELECTION)
- .hide(mPhotoSelectionFragment)
- .commit();
- } else {
- // Restore state
- mPhotoMode = savedState.getInt(STATE_PHOTO_MODE);
- mIsPhotoSelection = savedState.getBoolean(STATE_IS_PHOTO_SELECTION);
- mActionBarTitleResId = savedState.getInt(STATE_ACTION_BAR_TITLE);
- mPhotoUri = Uri.parse(savedState.getString(STATE_PHOTO_URI));
-
- // Show/hide the editor and photo selection fragments (w/o animations)
- mFragment = (CompactContactEditorFragment) getFragmentManager()
- .findFragmentByTag(TAG_COMPACT_EDITOR);
- mPhotoSelectionFragment = (CompactPhotoSelectionFragment) getFragmentManager()
- .findFragmentByTag(TAG_PHOTO_SELECTION);
- final FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
- if (mIsPhotoSelection) {
- fragmentTransaction.hide(getEditorFragment()).show(mPhotoSelectionFragment);
- getActionBar().setTitle(getResources().getString(R.string.photo_picker_title));
- } else {
- fragmentTransaction.show(getEditorFragment()).hide(mPhotoSelectionFragment);
- getActionBar().setTitle(getResources().getString(mActionBarTitleResId));
- }
- fragmentTransaction.commit();
- }
-
- // Set listeners
- mFragment.setListener(mFragmentListener);
- mPhotoSelectionFragment.setListener(this);
-
- // Load editor data (even if it's hidden)
- final String action = getIntent().getAction();
- final Uri uri = Intent.ACTION_EDIT.equals(action) ? getIntent().getData() : null;
- mFragment.load(action, uri, getIntent().getExtras());
-
- if (Intent.ACTION_INSERT.equals(action)) {
- DynamicShortcuts.reportShortcutUsed(this, DynamicShortcuts.SHORTCUT_ADD_CONTACT);
- }
- }
-
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(STATE_PHOTO_MODE, mPhotoMode);
- outState.putBoolean(STATE_IS_PHOTO_SELECTION, mIsPhotoSelection);
- outState.putInt(STATE_ACTION_BAR_TITLE, mActionBarTitleResId);
- outState.putString(STATE_PHOTO_URI,
- mPhotoUri != null ? mPhotoUri.toString() : Uri.EMPTY.toString());
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (mPhotoSelectionHandler == null) {
- mPhotoSelectionHandler = (CompactPhotoSelectionHandler) getPhotoSelectionHandler();
- }
- if (mPhotoSelectionHandler.handlePhotoActivityResult(requestCode, resultCode, data)) {
- return;
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
-
- @Override
- public void onBackPressed() {
- if (mIsPhotoSelection) {
- mIsPhotoSelection = false;
- showEditorFragment();
- } else {
- super.onBackPressed();
- }
- }
-
- /**
- * Displays photos from all raw contacts, clicking one set it as the super primary photo.
- */
- public void selectPhoto(ArrayList<CompactPhotoSelectionFragment.Photo> photos, int photoMode) {
- mPhotoMode = photoMode;
- mIsPhotoSelection = true;
- mPhotoSelectionFragment.setPhotos(photos, photoMode);
- showPhotoSelectionFragment();
- }
-
- /**
- * Opens a dialog showing options for the user to change their photo (take, choose, or remove
- * photo).
- */
- public void changePhoto(int photoMode) {
- mPhotoMode = photoMode;
- mIsPhotoSelection = false;
- PhotoSourceDialogFragment.show(this, mPhotoMode);
- }
-
- private void showPhotoSelectionFragment() {
- getFragmentManager().beginTransaction()
- .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
- .hide(getEditorFragment())
- .show(mPhotoSelectionFragment)
- .commit();
- getActionBar().setTitle(getResources().getString(R.string.photo_picker_title));
- }
-
- private void showEditorFragment() {
- getFragmentManager().beginTransaction()
- .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
- .hide(mPhotoSelectionFragment)
- .show((CompactContactEditorFragment) mFragment)
- .commit();
- getActionBar().setTitle(getResources().getString(mActionBarTitleResId));
- mIsPhotoSelection = false;
- }
-
- @Override
- public void onRemovePictureChosen() {
- getPhotoSelectionHandler().getListener().onRemovePictureChosen();
- }
-
- @Override
- public void onTakePhotoChosen() {
- getPhotoSelectionHandler().getListener().onTakePhotoChosen();
- }
-
- @Override
- public void onPickFromGalleryChosen() {
- getPhotoSelectionHandler().getListener().onPickFromGalleryChosen();
- }
-
- @Override
- public void onPhotoSelected(CompactPhotoSelectionFragment.Photo photo) {
- getEditorFragment().setPrimaryPhoto(photo);
- showEditorFragment();
- }
-
- private PhotoSelectionHandler getPhotoSelectionHandler() {
- if (mPhotoSelectionHandler == null) {
- mPhotoSelectionHandler = new CompactPhotoSelectionHandler(
- mPhotoMode, mIsPhotoSelection);
- }
- return mPhotoSelectionHandler;
- }
-
- private CompactContactEditorFragment getEditorFragment() {
- return (CompactContactEditorFragment) mFragment;
- }
-}
diff --git a/src/com/android/contacts/activities/ContactEditorActivity.java b/src/com/android/contacts/activities/ContactEditorActivity.java
index 293e8c0..5022947 100644
--- a/src/com/android/contacts/activities/ContactEditorActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorActivity.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2015 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.
@@ -16,20 +16,306 @@
package com.android.contacts.activities;
-import com.android.contacts.R;
-import com.android.contacts.common.activity.RequestPermissionsActivity;
-import com.android.contacts.editor.ContactEditorFragment;
-import com.android.contacts.util.DialogManager;
-
+import android.app.ActionBar;
+import android.app.Dialog;
+import android.app.FragmentTransaction;
+import android.content.ContentValues;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
+import android.provider.ContactsContract.QuickContact;
+import android.util.Log;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+
+import com.android.contacts.ContactSaveService;
+import com.android.contacts.ContactsActivity;
+import com.android.contacts.DynamicShortcuts;
+import com.android.contacts.R;
+import com.android.contacts.common.activity.RequestPermissionsActivity;
+import com.android.contacts.common.model.RawContactDeltaList;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
+import com.android.contacts.detail.PhotoSelectionHandler;
+import com.android.contacts.editor.ContactEditorFragment;
+import com.android.contacts.editor.EditorIntents;
+import com.android.contacts.editor.PhotoSourceDialogFragment;
+import com.android.contacts.interactions.ContactDeletionInteraction;
+import com.android.contacts.util.DialogManager;
+
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
/**
- * Contact editor with all fields displayed.
+ * Contact editor with only the most important fields displayed initially.
*/
-public class ContactEditorActivity extends ContactEditorBaseActivity
- implements DialogManager.DialogShowingViewActivity {
+public class ContactEditorActivity extends ContactsActivity implements
+ PhotoSourceDialogFragment.Listener,
+ DialogManager.DialogShowingViewActivity {
+ private static final String TAG = "ContactEditorActivity";
+
+ public static final String ACTION_JOIN_COMPLETED = "joinCompleted";
+ public static final String ACTION_SAVE_COMPLETED = "saveCompleted";
+
+ public static final int RESULT_CODE_SPLIT = 2;
+ // 3 used for ContactDeletionInteraction.RESULT_CODE_DELETED
+ public static final int RESULT_CODE_EDITED = 4;
+
+ /**
+ * The contact will be saved to the device local account when this is set for an insert. This
+ * is necessary because {@link android.accounts.Account} cannot be created with null values
+ * for the name and type and an Account is needed for
+ * {@link android.provider.ContactsContract.Intents.Insert#EXTRA_ACCOUNT}
+ */
+ public static final String EXTRA_SAVE_TO_DEVICE_FLAG =
+ "com.android.contacts.SAVE_TO_DEVICE_FLAG";
+
+ private static final String TAG_EDITOR_FRAGMENT = "editor_fragment";
+
+ private static final String STATE_PHOTO_MODE = "photo_mode";
+ private static final String STATE_ACTION_BAR_TITLE = "action_bar_title";
+ private static final String STATE_PHOTO_URI = "photo_uri";
+
+ /**
+ * Boolean intent key that specifies that this activity should finish itself
+ * (instead of launching a new view intent) after the editor changes have been
+ * saved.
+ */
+ public static final String INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED =
+ "finishActivityOnSaveCompleted";
+
+ /**
+ * Contract for contact editors Fragments that are managed by this Activity.
+ */
+ public interface ContactEditor {
+
+ /**
+ * Modes that specify what the AsyncTask has to perform after saving
+ */
+ interface SaveMode {
+ /**
+ * Close the editor after saving
+ */
+ int CLOSE = 0;
+
+ /**
+ * Reload the data so that the user can continue editing
+ */
+ int RELOAD = 1;
+
+ /**
+ * Split the contact after saving
+ */
+ int SPLIT = 2;
+
+ /**
+ * Join another contact after saving
+ */
+ int JOIN = 3;
+
+ /**
+ * Navigate to the editor view after saving.
+ */
+ int EDITOR = 4;
+ }
+
+ /**
+ * The status of the contact editor.
+ */
+ interface Status {
+ /**
+ * The loader is fetching data
+ */
+ int LOADING = 0;
+
+ /**
+ * Not currently busy. We are waiting for the user to enter data
+ */
+ int EDITING = 1;
+
+ /**
+ * The data is currently being saved. This is used to prevent more
+ * auto-saves (they shouldn't overlap)
+ */
+ int SAVING = 2;
+
+ /**
+ * Prevents any more saves. This is used if in the following cases:
+ * - After Save/Close
+ * - After Revert
+ * - After the user has accepted an edit suggestion
+ * - After the user chooses to expand the editor
+ */
+ int CLOSING = 3;
+
+ /**
+ * Prevents saving while running a child activity.
+ */
+ int SUB_ACTIVITY = 4;
+ }
+
+ /**
+ * Sets the hosting Activity that will receive callbacks from the contact editor.
+ */
+ void setListener(ContactEditorFragment.Listener listener);
+
+ /**
+ * Initialize the contact editor.
+ */
+ void load(String action, Uri lookupUri, Bundle intentExtras);
+
+ /**
+ * Applies extras from the hosting Activity to the first writable raw contact.
+ */
+ void setIntentExtras(Bundle extras);
+
+ /**
+ * Saves or creates the contact based on the mode, and if successful
+ * finishes the activity.
+ */
+ boolean save(int saveMode);
+
+ /**
+ * If there are no unsaved changes, just close the editor, otherwise the user is prompted
+ * before discarding unsaved changes.
+ */
+ boolean revert();
+
+ /**
+ * Invoked after the contact is saved.
+ */
+ void onSaveCompleted(boolean hadChanges, int saveMode, boolean saveSucceeded,
+ Uri contactLookupUri, Long joinContactId);
+
+ /**
+ * Invoked after the contact is joined.
+ */
+ void onJoinCompleted(Uri uri);
+ }
+
+ /**
+ * Displays a PopupWindow with photo edit options.
+ */
+ private final class EditorPhotoSelectionHandler extends PhotoSelectionHandler {
+
+ /**
+ * Receiver of photo edit option callbacks.
+ */
+ private final class EditorPhotoActionListener extends PhotoActionListener {
+
+ @Override
+ public void onRemovePictureChosen() {
+ getEditorFragment().removePhoto();
+ }
+
+ @Override
+ public void onPhotoSelected(Uri uri) throws FileNotFoundException {
+ mPhotoUri = uri;
+ getEditorFragment().updatePhoto(uri);
+
+ // Re-create the photo handler the next time we need it so that additional photo
+ // selections create a new temp file (and don't hit the one that was just added
+ // to the cache).
+ mPhotoSelectionHandler = null;
+ }
+
+ @Override
+ public Uri getCurrentPhotoUri() {
+ return mPhotoUri;
+ }
+
+ @Override
+ public void onPhotoSelectionDismissed() {
+ }
+ }
+
+ private final EditorPhotoActionListener mPhotoActionListener;
+
+ public EditorPhotoSelectionHandler(int photoMode) {
+ // We pass a null changeAnchorView since we are overriding onClick so that we
+ // can show the photo options in a dialog instead of a ListPopupWindow (which would
+ // be anchored at changeAnchorView).
+
+ // TODO: empty raw contact delta list
+ super(ContactEditorActivity.this, /* changeAnchorView =*/ null, photoMode,
+ /* isDirectoryContact =*/ false, new RawContactDeltaList());
+ mPhotoActionListener = new EditorPhotoActionListener();
+ }
+
+ @Override
+ public PhotoActionListener getListener() {
+ return mPhotoActionListener;
+ }
+
+ @Override
+ protected void startPhotoActivity(Intent intent, int requestCode, Uri photoUri) {
+ mPhotoUri = photoUri;
+ startActivityForResult(intent, requestCode);
+ }
+ }
+
+ private int mActionBarTitleResId;
+ private ContactEditor mFragment;
+ private boolean mFinishActivityOnSaveCompleted;
+ private DialogManager mDialogManager = new DialogManager(this);
+
+ private EditorPhotoSelectionHandler mPhotoSelectionHandler;
+ private Uri mPhotoUri;
+ private int mPhotoMode;
+
+ private final ContactEditorFragment.Listener mFragmentListener =
+ new ContactEditorFragment.Listener() {
+
+ @Override
+ public void onDeleteRequested(Uri contactUri) {
+ ContactDeletionInteraction.start(
+ ContactEditorActivity.this, contactUri, true);
+ }
+
+ @Override
+ public void onReverted() {
+ finish();
+ }
+
+ @Override
+ public void onSaveFinished(Intent resultIntent) {
+ if (mFinishActivityOnSaveCompleted) {
+ setResult(resultIntent == null ? RESULT_CANCELED : RESULT_OK, resultIntent);
+ } else if (resultIntent != null) {
+ // If it's a smart profile Intent it must be started "for result"
+ if (QuickContact.ACTION_QUICK_CONTACT.equals(resultIntent.getAction())) {
+ ImplicitIntentsUtil.startActivityInApp(
+ ContactEditorActivity.this, resultIntent);
+ } else {
+ startActivityForResult(resultIntent, /* requestCode */ 0);
+ }
+
+ ImplicitIntentsUtil.startActivityInApp(
+ ContactEditorActivity.this, resultIntent);
+ }
+ finish();
+ }
+
+ @Override
+ public void onContactSplit(Uri newLookupUri) {
+ setResult(RESULT_CODE_SPLIT, /* data */ null);
+ finish();
+ }
+
+ @Override
+ public void onContactNotFound() {
+ finish();
+ }
+
+ @Override
+ public void onEditOtherContactRequested(
+ Uri contactLookupUri, ArrayList<ContentValues> values) {
+ final Intent intent = EditorIntents.createEditOtherContactIntent(
+ ContactEditorActivity.this, contactLookupUri, values);
+ ImplicitIntentsUtil.startActivityInApp(
+ ContactEditorActivity.this, intent);
+ finish();
+ }
+ };
@Override
public void onCreate(Bundle savedState) {
@@ -39,15 +325,181 @@
return;
}
+ final Intent intent = getIntent();
+ final String action = intent.getAction();
+
+ // Determine whether or not this activity should be finished after the user is done
+ // editing the contact or if this activity should launch another activity to view the
+ // contact's details.
+ mFinishActivityOnSaveCompleted = intent.getBooleanExtra(
+ INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, false);
+
+ // The only situation where action could be ACTION_JOIN_COMPLETED is if the
+ // user joined the contact with another and closed the activity before
+ // the save operation was completed. The activity should remain closed then.
+ if (ACTION_JOIN_COMPLETED.equals(action)) {
+ finish();
+ return;
+ }
+
+ if (ACTION_SAVE_COMPLETED.equals(action)) {
+ finish();
+ return;
+ }
+
+ final ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ if (Intent.ACTION_EDIT.equals(action)) {
+ mActionBarTitleResId = R.string.contact_editor_title_existing_contact;
+ } else {
+ mActionBarTitleResId = R.string.contact_editor_title_new_contact;
+ }
+ actionBar.setTitle(getResources().getString(mActionBarTitleResId));
+ actionBar.setDisplayShowHomeEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setHomeAsUpIndicator(R.drawable.ic_close_dk);
+ }
+
setContentView(R.layout.contact_editor_activity);
- mFragment = (ContactEditorFragment) getFragmentManager().findFragmentById(
- R.id.contact_editor_fragment);
+ if (savedState == null) {
+ // Create the editor and photo selection fragments
+ mFragment = new ContactEditorFragment();
+ getFragmentManager().beginTransaction()
+ .add(R.id.fragment_container, getEditorFragment(), TAG_EDITOR_FRAGMENT)
+ .commit();
+ } else {
+ // Restore state
+ mPhotoMode = savedState.getInt(STATE_PHOTO_MODE);
+ mActionBarTitleResId = savedState.getInt(STATE_ACTION_BAR_TITLE);
+ mPhotoUri = Uri.parse(savedState.getString(STATE_PHOTO_URI));
+
+ // Show/hide the editor and photo selection fragments (w/o animations)
+ mFragment = (ContactEditorFragment) getFragmentManager()
+ .findFragmentByTag(TAG_EDITOR_FRAGMENT);
+ final FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
+ fragmentTransaction.show(getEditorFragment()).commit();
+ getActionBar().setTitle(getResources().getString(mActionBarTitleResId));
+ }
+
+ // Set listeners
mFragment.setListener(mFragmentListener);
- final String action = getIntent().getAction();
- final Uri uri = ContactEditorBaseActivity.ACTION_EDIT.equals(action)
- || Intent.ACTION_EDIT.equals(action) ? getIntent().getData() : null;
+ // Load editor data (even if it's hidden)
+ final Uri uri = Intent.ACTION_EDIT.equals(action) ? getIntent().getData() : null;
mFragment.load(action, uri, getIntent().getExtras());
+
+ if (Intent.ACTION_INSERT.equals(action)) {
+ DynamicShortcuts.reportShortcutUsed(this, DynamicShortcuts.SHORTCUT_ADD_CONTACT);
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ final InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
+ final View currentFocus = getCurrentFocus();
+ if (imm != null && currentFocus != null) {
+ imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0);
+ }
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+
+ if (mFragment == null) {
+ return;
+ }
+
+ final String action = intent.getAction();
+ if (Intent.ACTION_EDIT.equals(action)) {
+ mFragment.setIntentExtras(intent.getExtras());
+ } else if (ACTION_SAVE_COMPLETED.equals(action)) {
+ mFragment.onSaveCompleted(true,
+ intent.getIntExtra(ContactEditorFragment.SAVE_MODE_EXTRA_KEY,
+ ContactEditor.SaveMode.CLOSE),
+ intent.getBooleanExtra(ContactSaveService.EXTRA_SAVE_SUCCEEDED, false),
+ intent.getData(),
+ intent.getLongExtra(ContactEditorFragment.JOIN_CONTACT_ID_EXTRA_KEY, -1));
+ } else if (ACTION_JOIN_COMPLETED.equals(action)) {
+ mFragment.onJoinCompleted(intent.getData());
+ }
+ }
+
+ @Override
+ protected Dialog onCreateDialog(int id, Bundle args) {
+ if (DialogManager.isManagedId(id)) return mDialogManager.onCreateDialog(id, args);
+
+ // Nobody knows about the Dialog
+ Log.w(TAG, "Unknown dialog requested, id: " + id + ", args: " + args);
+ return null;
+ }
+
+ @Override
+ public DialogManager getDialogManager() {
+ return mDialogManager;
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putInt(STATE_PHOTO_MODE, mPhotoMode);
+ outState.putInt(STATE_ACTION_BAR_TITLE, mActionBarTitleResId);
+ outState.putString(STATE_PHOTO_URI,
+ mPhotoUri != null ? mPhotoUri.toString() : Uri.EMPTY.toString());
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mPhotoSelectionHandler == null) {
+ mPhotoSelectionHandler = (EditorPhotoSelectionHandler) getPhotoSelectionHandler();
+ }
+ if (mPhotoSelectionHandler.handlePhotoActivityResult(requestCode, resultCode, data)) {
+ return;
+ }
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (mFragment != null) {
+ mFragment.revert();
+ }
+ }
+
+ /**
+ * Opens a dialog showing options for the user to change their photo (take, choose, or remove
+ * photo).
+ */
+ public void changePhoto(int photoMode) {
+ mPhotoMode = photoMode;
+ PhotoSourceDialogFragment.show(this, mPhotoMode);
+ }
+
+ @Override
+ public void onRemovePictureChosen() {
+ getPhotoSelectionHandler().getListener().onRemovePictureChosen();
+ }
+
+ @Override
+ public void onTakePhotoChosen() {
+ getPhotoSelectionHandler().getListener().onTakePhotoChosen();
+ }
+
+ @Override
+ public void onPickFromGalleryChosen() {
+ getPhotoSelectionHandler().getListener().onPickFromGalleryChosen();
+ }
+
+ private PhotoSelectionHandler getPhotoSelectionHandler() {
+ if (mPhotoSelectionHandler == null) {
+ mPhotoSelectionHandler = new EditorPhotoSelectionHandler(mPhotoMode);
+ }
+ return mPhotoSelectionHandler;
+ }
+
+ private ContactEditorFragment getEditorFragment() {
+ return (ContactEditorFragment) mFragment;
}
}
diff --git a/src/com/android/contacts/activities/ContactEditorBaseActivity.java b/src/com/android/contacts/activities/ContactEditorBaseActivity.java
deleted file mode 100644
index 55fcddb..0000000
--- a/src/com/android/contacts/activities/ContactEditorBaseActivity.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.app.ActionBar;
-import android.app.Dialog;
-import android.content.ContentValues;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.RawContacts;
-import android.util.Log;
-import android.view.View;
-import android.view.inputmethod.InputMethodManager;
-
-import com.android.contacts.ContactSaveService;
-import com.android.contacts.ContactsActivity;
-import com.android.contacts.R;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.util.ImplicitIntentsUtil;
-import com.android.contacts.editor.ContactEditorBaseFragment;
-import com.android.contacts.editor.ContactEditorFragment;
-import com.android.contacts.editor.EditorIntents;
-import com.android.contacts.interactions.ContactDeletionInteraction;
-import com.android.contacts.util.DialogManager;
-
-import java.util.ArrayList;
-
-/**
- * Base Activity for contact editors.
- */
-abstract public class ContactEditorBaseActivity extends ContactsActivity
- implements DialogManager.DialogShowingViewActivity {
- protected static final String TAG = "ContactEditorActivity";
-
- /**
- * Intent action to edit a contact with all available field inputs displayed.
- *
- * Only used to open the "fully expanded" editor -- {@link ContactEditorActivity}.
- */
- public static final String ACTION_EDIT = "com.android.contacts.action.FULL_EDIT";
-
- /**
- * Intent action to insert a new contact with all available field inputs displayed.
- *
- * Only used to open the "fully expanded" editor -- {@link ContactEditorActivity}.
- */
- public static final String ACTION_INSERT = "com.android.contacts.action.FULL_INSERT";
-
- public static final String ACTION_JOIN_COMPLETED = "joinCompleted";
- public static final String ACTION_SAVE_COMPLETED = "saveCompleted";
-
- public static final int RESULT_CODE_SPLIT = 2;
- // 3 used for ContactDeletionInteraction.RESULT_CODE_DELETED
- public static final int RESULT_CODE_EDITED = 4;
-
- /**
- * The contact will be saved to the device local account when this is set for an insert. This
- * is necessary because {@link android.accounts.Account} cannot be created with null values
- * for the name and type and an Account is needed for
- * {@link android.provider.ContactsContract.Intents.Insert#EXTRA_ACCOUNT}
- */
- public static final String EXTRA_SAVE_TO_DEVICE_FLAG =
- "com.android.contacts.SAVE_TO_DEVICE_FLAG";
-
-
- protected int mActionBarTitleResId;
-
- /**
- * Contract for contact editors Fragments that are managed by this Activity.
- */
- public interface ContactEditor {
-
- /**
- * Modes that specify what the AsyncTask has to perform after saving
- */
- public interface SaveMode {
- /**
- * Close the editor after saving
- */
- public static final int CLOSE = 0;
-
- /**
- * Reload the data so that the user can continue editing
- */
- public static final int RELOAD = 1;
-
- /**
- * Split the contact after saving
- */
- public static final int SPLIT = 2;
-
- /**
- * Join another contact after saving
- */
- public static final int JOIN = 3;
-
- /**
- * Navigate to the compact editor view after saving.
- */
- public static final int COMPACT = 4;
- }
-
- /**
- * The status of the contact editor.
- */
- public interface Status {
- /**
- * The loader is fetching data
- */
- public static final int LOADING = 0;
-
- /**
- * Not currently busy. We are waiting for the user to enter data
- */
- public static final int EDITING = 1;
-
- /**
- * The data is currently being saved. This is used to prevent more
- * auto-saves (they shouldn't overlap)
- */
- public static final int SAVING = 2;
-
- /**
- * Prevents any more saves. This is used if in the following cases:
- * - After Save/Close
- * - After Revert
- * - After the user has accepted an edit suggestion
- * - After the user chooses to expand the compact editor
- */
- public static final int CLOSING = 3;
-
- /**
- * Prevents saving while running a child activity.
- */
- public static final int SUB_ACTIVITY = 4;
- }
-
- /**
- * Sets the hosting Activity that will receive callbacks from the contact editor.
- */
- void setListener(ContactEditorBaseFragment.Listener listener);
-
- /**
- * Initialize the contact editor.
- */
- void load(String action, Uri lookupUri, Bundle intentExtras);
-
- /**
- * Applies extras from the hosting Activity to the first writable raw contact.
- */
- void setIntentExtras(Bundle extras);
-
- /**
- * Saves or creates the contact based on the mode, and if successful
- * finishes the activity.
- */
- boolean save(int saveMode);
-
- /**
- * If there are no unsaved changes, just close the editor, otherwise the user is prompted
- * before discarding unsaved changes.
- */
- boolean revert();
-
- /**
- * Invoked after the contact is saved.
- */
- void onSaveCompleted(boolean hadChanges, int saveMode, boolean saveSucceeded,
- Uri contactLookupUri, Long joinContactId);
-
- /**
- * Invoked after the contact is joined.
- */
- void onJoinCompleted(Uri uri);
- }
-
- /**
- * Boolean intent key that specifies that this activity should finish itself
- * (instead of launching a new view intent) after the editor changes have been
- * saved.
- */
- public static final String INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED =
- "finishActivityOnSaveCompleted";
-
- protected ContactEditor mFragment;
- private boolean mFinishActivityOnSaveCompleted;
-
- private DialogManager mDialogManager = new DialogManager(this);
-
- @Override
- public void onCreate(Bundle savedState) {
- super.onCreate(savedState);
-
- final Intent intent = getIntent();
- final String action = intent.getAction();
-
- // Determine whether or not this activity should be finished after the user is done
- // editing the contact or if this activity should launch another activity to view the
- // contact's details.
- mFinishActivityOnSaveCompleted = intent.getBooleanExtra(
- INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, false);
-
- // The only situation where action could be ACTION_JOIN_COMPLETED is if the
- // user joined the contact with another and closed the activity before
- // the save operation was completed. The activity should remain closed then.
- if (ACTION_JOIN_COMPLETED.equals(action)) {
- finish();
- return;
- }
-
- if (ACTION_SAVE_COMPLETED.equals(action)) {
- finish();
- return;
- }
-
- ActionBar actionBar = getActionBar();
- if (actionBar != null) {
- if (Intent.ACTION_EDIT.equals(action) || ACTION_EDIT.equals(action)) {
- mActionBarTitleResId = R.string.contact_editor_title_existing_contact;
- } else {
- mActionBarTitleResId = R.string.contact_editor_title_new_contact;
- }
- actionBar.setTitle(getResources().getString(mActionBarTitleResId));
- actionBar.setDisplayShowHomeEnabled(true);
- actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.setHomeAsUpIndicator(R.drawable.ic_close_dk);
- }
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- final InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
- final View currentFocus = getCurrentFocus();
- if (imm != null && currentFocus != null) {
- imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0);
- }
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
-
- if (mFragment == null) {
- return;
- }
-
- String action = intent.getAction();
- if (Intent.ACTION_EDIT.equals(action) || ACTION_EDIT.equals(action)) {
- mFragment.setIntentExtras(intent.getExtras());
- } else if (ACTION_SAVE_COMPLETED.equals(action)) {
- mFragment.onSaveCompleted(true,
- intent.getIntExtra(ContactEditorFragment.SAVE_MODE_EXTRA_KEY,
- ContactEditor.SaveMode.CLOSE),
- intent.getBooleanExtra(ContactSaveService.EXTRA_SAVE_SUCCEEDED, false),
- intent.getData(),
- intent.getLongExtra(ContactEditorFragment.JOIN_CONTACT_ID_EXTRA_KEY, -1));
- } else if (ACTION_JOIN_COMPLETED.equals(action)) {
- mFragment.onJoinCompleted(intent.getData());
- }
- }
-
- @Override
- protected Dialog onCreateDialog(int id, Bundle args) {
- if (DialogManager.isManagedId(id)) return mDialogManager.onCreateDialog(id, args);
-
- // Nobody knows about the Dialog
- Log.w(TAG, "Unknown dialog requested, id: " + id + ", args: " + args);
- return null;
- }
-
- @Override
- public void onBackPressed() {
- if (mFragment != null) {
- mFragment.revert();
- }
- }
-
- protected final ContactEditorBaseFragment.Listener mFragmentListener =
- new ContactEditorBaseFragment.Listener() {
-
- @Override
- public void onDeleteRequested(Uri contactUri) {
- ContactDeletionInteraction.start(ContactEditorBaseActivity.this, contactUri, true);
- }
-
- @Override
- public void onReverted() {
- finish();
- }
-
- @Override
- public void onSaveFinished(Intent resultIntent) {
- if (mFinishActivityOnSaveCompleted) {
- setResult(resultIntent == null ? RESULT_CANCELED : RESULT_OK, resultIntent);
- } else if (resultIntent != null) {
- ImplicitIntentsUtil.startActivityInApp(ContactEditorBaseActivity.this,
- resultIntent);
- }
- finish();
- }
-
- @Override
- public void onContactSplit(Uri newLookupUri) {
- setResult(RESULT_CODE_SPLIT, /* data */ null);
- finish();
- }
-
- @Override
- public void onContactNotFound() {
- finish();
- }
-
- @Override
- public void onEditOtherContactRequested(
- Uri contactLookupUri, ArrayList<ContentValues> values) {
- final Intent intent = EditorIntents.createEditOtherContactIntent(
- ContactEditorBaseActivity.this, contactLookupUri, values);
- ImplicitIntentsUtil.startActivityInApp(ContactEditorBaseActivity.this, intent);
- finish();
- }
-
- @Override
- public void onCustomCreateContactActivityRequested(AccountWithDataSet account,
- Bundle intentExtras) {
- final AccountTypeManager accountTypes =
- AccountTypeManager.getInstance(ContactEditorBaseActivity.this);
- final AccountType accountType = accountTypes.getAccountType(
- account.type, account.dataSet);
-
- Intent intent = new Intent();
- intent.setClassName(accountType.syncAdapterPackageName,
- accountType.getCreateContactActivityClassName());
- intent.setAction(Intent.ACTION_INSERT);
- intent.setType(Contacts.CONTENT_ITEM_TYPE);
- if (intentExtras != null) {
- intent.putExtras(intentExtras);
- }
- intent.putExtra(RawContacts.ACCOUNT_NAME, account.name);
- intent.putExtra(RawContacts.ACCOUNT_TYPE, account.type);
- intent.putExtra(RawContacts.DATA_SET, account.dataSet);
- intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_FORWARD_RESULT);
- startActivity(intent);
- finish();
- }
-
- @Override
- public void onCustomEditContactActivityRequested(AccountWithDataSet account,
- Uri rawContactUri, Bundle intentExtras, boolean redirect) {
- final AccountTypeManager accountTypes =
- AccountTypeManager.getInstance(ContactEditorBaseActivity.this);
- final AccountType accountType = accountTypes.getAccountType(
- account.type, account.dataSet);
-
- Intent intent = new Intent();
- intent.setClassName(accountType.syncAdapterPackageName,
- accountType.getEditContactActivityClassName());
- intent.setAction(Intent.ACTION_EDIT);
- intent.setData(rawContactUri);
- if (intentExtras != null) {
- intent.putExtras(intentExtras);
- }
-
- if (redirect) {
- intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_FORWARD_RESULT);
- startActivity(intent);
- finish();
- } else {
- startActivity(intent);
- }
- }
- };
-
- @Override
- public DialogManager getDialogManager() {
- return mDialogManager;
- }
-}
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 46e5d9c..fe95465 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -146,8 +146,7 @@
// Add a shadow under the toolbar.
ViewUtil.addRectangularOutlineProvider(findViewById(R.id.toolbar_parent), getResources());
- mActionBarAdapter = new ActionBarAdapter(this, this, getSupportActionBar(),
- /* portraitTabs */ null, /* landscapeTabs */ null, mToolbar,
+ mActionBarAdapter = new ActionBarAdapter(this, this, getSupportActionBar(), mToolbar,
R.string.enter_contact_name);
mActionBarAdapter.setShowHomeIcon(true);
mActionBarAdapter.setShowHomeAsUp(true);
@@ -436,10 +435,6 @@
}
@Override
- public void onSelectedTabChanged() {
- }
-
- @Override
public void onUpButtonPressed() {
onBackPressed();
}
@@ -658,7 +653,8 @@
private void startCreateNewContactActivity() {
Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
- intent.putExtra(ContactEditorActivity.INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
+ intent.putExtra(ContactEditorActivity.
+ INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
startActivityAndForwardResult(intent);
}
diff --git a/src/com/android/contacts/activities/GroupMembersActivity.java b/src/com/android/contacts/activities/GroupMembersActivity.java
deleted file mode 100644
index c32842a..0000000
--- a/src/com/android/contacts/activities/GroupMembersActivity.java
+++ /dev/null
@@ -1,623 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.app.FragmentManager;
-import android.app.FragmentTransaction;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.provider.ContactsContract.RawContacts;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.view.GravityCompat;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.widget.Toast;
-
-import com.android.contacts.ContactSaveService;
-import com.android.contacts.ContactsDrawerActivity;
-import com.android.contacts.R;
-import com.android.contacts.common.logging.ListEvent;
-import com.android.contacts.common.logging.Logger;
-import com.android.contacts.common.logging.ScreenEvent.ScreenType;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.util.ImplicitIntentsUtil;
-import com.android.contacts.group.GroupMembersFragment;
-import com.android.contacts.group.GroupMetaData;
-import com.android.contacts.group.GroupNameEditDialogFragment;
-import com.android.contacts.group.GroupUtil;
-import com.android.contacts.interactions.GroupDeletionDialogFragment;
-import com.android.contacts.list.ContactsRequest;
-import com.android.contacts.list.MultiSelectContactsListFragment;
-import com.android.contacts.list.UiIntentActions;
-import com.android.contacts.quickcontact.QuickContactActivity;
-
-/**
- * Displays the members of a group and allows the user to edit it.
- */
-public class GroupMembersActivity extends ContactsDrawerActivity implements
- ActionBarAdapter.Listener,
- MultiSelectContactsListFragment.OnCheckBoxListActionListener,
- GroupMembersFragment.GroupMembersListener {
-
- private static final String TAG = "GroupMembers";
-
- private static final String KEY_GROUP_URI = "groupUri";
- private static final String KEY_GROUP_METADATA = "groupMetadata";
- private static final String KEY_IS_EDIT_MODE = "editMode";
-
- private static final String TAG_GROUP_MEMBERS = "groupMembers";
- private static final String TAG_GROUP_NAME_EDIT_DIALOG = "groupNameEditDialog";
-
- private static final String ACTION_DELETE_GROUP = "deleteGroup";
- private static final String ACTION_UPDATE_GROUP = "updateGroup";
- private static final String ACTION_ADD_TO_GROUP = "addToGroup";
- private static final String ACTION_REMOVE_FROM_GROUP = "removeFromGroup";
-
- private static final int RESULT_GROUP_ADD_MEMBER = 100;
-
- /**
- * Starts an Intent to add/remove the raw contacts for the given contact IDs to/from a group.
- * Only the raw contacts that belong to the specified account are added or removed.
- */
- private static class UpdateGroupMembersAsyncTask extends AsyncTask<Void, Void, Intent> {
-
- static final int TYPE_ADD = 0;
- static final int TYPE_REMOVE = 1;
-
- private final Context mContext;
- private final int mType;
- private final long[] mContactIds;
- private final long mGroupId;
- private final String mAccountName;
- private final String mAccountType;
- private final String mDataSet;
-
- private UpdateGroupMembersAsyncTask(int type, Context context, long[] contactIds,
- long groupId, String accountName, String accountType, String dataSet) {
- mContext = context;
- mType = type;
- mContactIds = contactIds;
- mGroupId = groupId;
- mAccountName = accountName;
- mAccountType = accountType;
- mDataSet = dataSet;
- }
-
- @Override
- protected Intent doInBackground(Void... params) {
- final long[] rawContactIds = getRawContactIds();
- if (rawContactIds.length == 0) {
- return null;
- }
- final long[] rawContactIdsToAdd;
- final long[] rawContactIdsToRemove;
- final String action;
- if (mType == TYPE_ADD) {
- rawContactIdsToAdd = rawContactIds;
- rawContactIdsToRemove = null;
- action = GroupMembersActivity.ACTION_ADD_TO_GROUP;
- } else if (mType == TYPE_REMOVE) {
- rawContactIdsToAdd = null;
- rawContactIdsToRemove = rawContactIds;
- action = GroupMembersActivity.ACTION_REMOVE_FROM_GROUP;
- } else {
- throw new IllegalStateException("Unrecognized type " + mType);
- }
- return ContactSaveService.createGroupUpdateIntent(
- mContext, mGroupId, /* newLabel */ null, rawContactIdsToAdd,
- rawContactIdsToRemove, GroupMembersActivity.class, action);
- }
-
- // ContactSaveService will log a warning if the raw contact is already a member and keep
- // going but it is not ideal, we could also prune raw contacts that are already members.
- private long[] getRawContactIds() {
- final Uri.Builder builder = RawContacts.CONTENT_URI.buildUpon();
- // null account names are not valid, see ContactsProvider2#appendAccountFromParameter
- if (mAccountName != null) {
- builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, mAccountName);
- builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, mAccountType);
- }
- if (mDataSet != null) {
- builder.appendQueryParameter(RawContacts.DATA_SET, mDataSet);
- }
- final Uri rawContactUri = builder.build();
- final String[] projection = new String[]{RawContacts._ID};
- final StringBuilder selection = new StringBuilder();
- final String[] selectionArgs = new String[mContactIds.length];
- for (int i = 0; i < mContactIds.length; i++) {
- if (i > 0) {
- selection.append(" OR ");
- }
- selection.append(RawContacts.CONTACT_ID).append("=?");
- selectionArgs[i] = Long.toString(mContactIds[i]);
- }
- final Cursor cursor = mContext.getContentResolver().query(
- rawContactUri, projection, selection.toString(), selectionArgs, null, null);
- final long[] rawContactIds = new long[cursor.getCount()];
- try {
- int i = 0;
- while (cursor.moveToNext()) {
- rawContactIds[i] = cursor.getLong(0);
- i++;
- }
- } finally {
- cursor.close();
- }
- return rawContactIds;
- }
-
- @Override
- protected void onPostExecute(Intent intent) {
- if (intent == null) {
- Toast.makeText(mContext, R.string.groupSavedErrorToast, Toast.LENGTH_SHORT).show();
- } else {
- mContext.startService(intent);
- }
- }
- }
-
- private ActionBarAdapter mActionBarAdapter;
-
- private GroupMembersFragment mMembersFragment;
-
- private Uri mGroupUri;
- private boolean mIsEditMode;
-
- private GroupMetaData mGroupMetaData;
-
- @Override
- public void onCreate(Bundle savedState) {
- super.onCreate(savedState);
-
- // Parse the Intent
- if (savedState != null) {
- mGroupUri = savedState.getParcelable(KEY_GROUP_URI);
- mIsEditMode = savedState.getBoolean(KEY_IS_EDIT_MODE);
- mGroupMetaData = savedState.getParcelable(KEY_GROUP_METADATA);
- } else {
- mGroupUri = getIntent().getData();
- setTitle(getIntent().getStringExtra(GroupUtil.EXTRA_GROUP_NAME));
- }
- if (mGroupUri == null) {
- setResultCanceledAndFinish(R.string.groupLoadErrorToast);
- return;
- }
-
- // Set up the view
- setContentView(R.layout.group_members_activity);
-
- findViewById(R.id.toolbar_frame).setBackgroundColor(
- ContextCompat.getColor(this, R.color.group_primary_color));
-
- // Set up the action bar
- mActionBarAdapter = new ActionBarAdapter(this, this, getSupportActionBar(),
- /* portraitTabs */ null, /* landscapeTabs */ null, mToolbar,
- R.string.enter_contact_name);
- mActionBarAdapter.setShowHomeIcon(true);
-
- // Add the members list fragment
- final FragmentManager fragmentManager = getFragmentManager();
- mMembersFragment = (GroupMembersFragment)
- fragmentManager.findFragmentByTag(TAG_GROUP_MEMBERS);
- if (mMembersFragment == null) {
- mMembersFragment = GroupMembersFragment.newInstance(getIntent().getData());
- fragmentManager.beginTransaction().replace(R.id.fragment_container_inner,
- mMembersFragment, TAG_GROUP_MEMBERS).commitAllowingStateLoss();
- }
- mMembersFragment.setListener(this);
- if (mGroupMetaData != null && mGroupMetaData.editable) {
- mMembersFragment.setCheckBoxListListener(this);
- }
-
- // Delay action bar initialization until after the fragment is added
- final ContactsRequest contactsRequest = new ContactsRequest();
- contactsRequest.setActionCode(ContactsRequest.ACTION_GROUP);
- mActionBarAdapter.initialize(savedState, contactsRequest);
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- if (mActionBarAdapter != null) {
- mActionBarAdapter.onSaveInstanceState(outState);
- }
- outState.putParcelable(KEY_GROUP_URI, mGroupUri);
- outState.putBoolean(KEY_IS_EDIT_MODE, mIsEditMode);
- outState.putParcelable(KEY_GROUP_METADATA, mGroupMetaData);
- }
-
- // Invoked with results from the ContactSaveService
- @Override
- protected void onNewIntent(Intent newIntent) {
- if (ContactsDrawerActivity.ACTION_CREATE_GROUP.equals(newIntent.getAction())) {
- super.onNewIntent(newIntent);
- return;
- }
- if (isDeleteAction(newIntent.getAction())) {
- toast(R.string.groupDeletedToast);
- setResult(RESULT_OK);
- finish();
- } else if (isSaveAction(newIntent.getAction())) {
- final Uri groupUri = newIntent.getData();
- if (groupUri == null) {
- setResultCanceledAndFinish(R.string.groupSavedErrorToast);
- return;
- }
- if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "Received group URI " + groupUri);
-
- mGroupUri = groupUri;
-
- toast(getToastMessageForSaveAction(newIntent.getAction()));
-
- if (mIsEditMode) {
- // If we're removing group members one at a time, don't reload the fragment so
- // the user can continue to remove group members one by one
- if (getGroupCount() == 1) {
- // If we're deleting the last group member, exit edit mode
- onBackPressed();
- }
- } else if (!ACTION_REMOVE_FROM_GROUP.equals(newIntent.getAction())) {
- replaceGroupMembersFragment();
- invalidateOptionsMenu();
- }
- }
- }
-
- private static boolean isDeleteAction(String action) {
- return ACTION_DELETE_GROUP.equals(action);
- }
-
- private static boolean isSaveAction(String action) {
- return ACTION_UPDATE_GROUP.equals(action)
- || ACTION_ADD_TO_GROUP.equals(action)
- || ACTION_REMOVE_FROM_GROUP.equals(action);
- }
-
- private static int getToastMessageForSaveAction(String action) {
- if (ACTION_UPDATE_GROUP.equals(action)) return R.string.groupUpdatedToast;
- if (ACTION_ADD_TO_GROUP.equals(action)) return R.string.groupMembersAddedToast;
- if (ACTION_REMOVE_FROM_GROUP.equals(action)) return R.string.groupMembersRemovedToast;
- throw new IllegalArgumentException("Unhanded contact save action " + action);
- }
-
- private int getGroupCount() {
- return mMembersFragment != null && mMembersFragment.getAdapter() != null
- ? mMembersFragment.getAdapter().getCount() : -1;
- }
-
- private void replaceGroupMembersFragment() {
- mMembersFragment = GroupMembersFragment.newInstance(mGroupUri);
- mMembersFragment.setListener(this);
- final FragmentTransaction transaction = getFragmentManager().beginTransaction();
- addGroupsAndFiltersFragments(transaction);
- transaction.replace(R.id.fragment_container_inner, mMembersFragment, TAG_GROUP_MEMBERS)
- .commitAllowingStateLoss();
- if (mGroupMetaData != null && mGroupMetaData.editable) {
- mMembersFragment.setCheckBoxListListener(this);
- }
- }
-
- @Override
- protected void onGroupMenuItemClicked(long groupId, String title) {
- if (mGroupMetaData.groupId != groupId) {
- super.onGroupMenuItemClicked(groupId, title);
- }
- }
-
- @Override
- protected boolean shouldFinish() {
- return true;
- }
-
- @Override
- protected void launchFindDuplicates() {
- super.launchFindDuplicates();
- finish();
- }
-
- public boolean isEditMode() {
- return mIsEditMode;
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- if (mGroupMetaData == null) {
- // Hide menu options until metadata is fully loaded
- return false;
- }
- super.onCreateOptionsMenu(menu);
- getMenuInflater().inflate(R.menu.view_group, menu);
- return true;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- final boolean isSelectionMode = mActionBarAdapter.isSelectionMode();
- final boolean isGroupEditable = mGroupMetaData != null && mGroupMetaData.editable;
- final boolean isGroupReadOnly = mGroupMetaData != null && mGroupMetaData.readOnly;
-
- setVisible(menu, R.id.menu_add, isGroupEditable && !isSelectionMode);
- setVisible(menu, R.id.menu_rename_group, !isGroupReadOnly && !isSelectionMode);
- setVisible(menu, R.id.menu_delete_group, !isGroupReadOnly && !isSelectionMode);
- setVisible(menu, R.id.menu_edit_group, isGroupEditable && !mIsEditMode && !isSelectionMode
- && !isGroupEmpty());
- setVisible(menu, R.id.menu_remove_from_group, isGroupEditable && isSelectionMode &&
- !mIsEditMode);
-
- return true;
- }
-
- private boolean isGroupEmpty() {
- return mMembersFragment != null && mMembersFragment.getAdapter() != null &&
- mMembersFragment.getAdapter().isEmpty();
- }
-
- private static void setVisible(Menu menu, int id, boolean visible) {
- final MenuItem menuItem = menu.findItem(id);
- if (menuItem != null) {
- menuItem.setVisible(visible);
- }
- }
-
- public void startGroupAddMemberActivity() {
- startActivityForResult(GroupUtil.createPickMemberIntent(this, mGroupMetaData,
- mMembersFragment.getMemberContactIds()), RESULT_GROUP_ADD_MEMBER);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home: {
- onBackPressed();
- return true;
- }
- case R.id.menu_add: {
- startGroupAddMemberActivity();
- return true;
- }
- case R.id.menu_rename_group: {
- GroupNameEditDialogFragment.newInstanceForUpdate(
- new AccountWithDataSet(mGroupMetaData.accountName,
- mGroupMetaData.accountType, mGroupMetaData.dataSet),
- ACTION_UPDATE_GROUP, mGroupMetaData.groupId, mGroupMetaData.groupName)
- .show(getFragmentManager(), TAG_GROUP_NAME_EDIT_DIALOG);
- return true;
- }
- case R.id.menu_delete_group: {
- deleteGroup();
- return true;
- }
- case R.id.menu_edit_group: {
- if (mMembersFragment == null) {
- return false;
- }
- mIsEditMode = true;
- mActionBarAdapter.setSelectionMode(true);
- mMembersFragment.displayDeleteButtons(true);
- return true;
- }
- case R.id.menu_remove_from_group: {
- if (mMembersFragment == null) {
- return false;
- }
- logListEvent();
- removeSelectedContacts();
- return true;
- }
- }
- return super.onOptionsItemSelected(item);
- }
-
- private void deleteGroup() {
- if (mMembersFragment.getMemberCount() == 0) {
- final Intent intent = ContactSaveService.createGroupDeletionIntent(this,
- mGroupMetaData.groupId);
- startService(intent);
- finish();
- } else {
- GroupDeletionDialogFragment.show(getFragmentManager(), mGroupMetaData.groupId,
- mGroupMetaData.groupName);
- }
- }
-
- private void logListEvent() {
- Logger.logListEvent(
- ListEvent.ActionType.REMOVE_LABEL,
- mMembersFragment.getListType(),
- mMembersFragment.getAdapter().getCount(),
- /* clickedIndex */ -1,
- mMembersFragment.getAdapter().getSelectedContactIdsArray().length);
- }
-
- private void removeSelectedContacts() {
- final long[] contactIds = mMembersFragment.getAdapter().getSelectedContactIdsArray();
- new UpdateGroupMembersAsyncTask(UpdateGroupMembersAsyncTask.TYPE_REMOVE,
- this, contactIds, mGroupMetaData.groupId, mGroupMetaData.accountName,
- mGroupMetaData.accountType, mGroupMetaData.dataSet).execute();
-
- mActionBarAdapter.setSelectionMode(false);
- }
-
- @Override
- public void onBackPressed() {
- if (!isSafeToCommitTransactions()) {
- return;
- }
- if (mDrawer.isDrawerOpen(GravityCompat.START)) {
- mDrawer.closeDrawer(GravityCompat.START);
- } else if (mIsEditMode) {
- mIsEditMode = false;
- mActionBarAdapter.setSelectionMode(false);
- if (mMembersFragment != null) {
- mMembersFragment.displayDeleteButtons(false);
- }
- } else if (mActionBarAdapter.isSelectionMode()) {
- mActionBarAdapter.setSelectionMode(false);
- if (mMembersFragment != null) {
- mMembersFragment.displayCheckBoxes(false);
- }
- } else if (mActionBarAdapter.isSearchMode()) {
- mActionBarAdapter.setSearchMode(false);
- } else {
- switchToAllContacts();
- super.onBackPressed();
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == RESULT_GROUP_ADD_MEMBER && resultCode == RESULT_OK && data != null) {
- long[] contactIds = data.getLongArrayExtra(
- UiIntentActions.TARGET_CONTACT_IDS_EXTRA_KEY);
- if (contactIds == null) {
- final long contactId = data.getLongExtra(
- UiIntentActions.TARGET_CONTACT_ID_EXTRA_KEY, -1);
- if (contactId > -1) {
- contactIds = new long[1];
- contactIds[0] = contactId;
- }
- }
- new UpdateGroupMembersAsyncTask(UpdateGroupMembersAsyncTask.TYPE_ADD,
- this, contactIds, mGroupMetaData.groupId, mGroupMetaData.accountName,
- mGroupMetaData.accountType, mGroupMetaData.dataSet).execute();
- }
- }
-
- private void setResultCanceledAndFinish(int resId) {
- toast(resId);
- setResult(RESULT_CANCELED);
- finish();
- }
-
- private void toast(int resId) {
- if (resId >= 0) {
- Toast.makeText(this, resId, Toast.LENGTH_SHORT).show();
- }
- }
-
- // ActionBarAdapter callbacks
-
- @Override
- public void onAction(int action) {
- switch (action) {
- case ActionBarAdapter.Listener.Action.START_SELECTION_MODE:
- if (mMembersFragment != null) {
- if (mIsEditMode) {
- mMembersFragment.displayDeleteButtons(true);
- mActionBarAdapter.setActionBarTitle(getString(R.string.title_edit_group));
- } else {
- mMembersFragment.displayCheckBoxes(true);
- }
- }
- invalidateOptionsMenu();
- showFabWithAnimation(/* showFabWithAnimation = */ false);
- break;
- case ActionBarAdapter.Listener.Action.STOP_SEARCH_AND_SELECTION_MODE:
- mActionBarAdapter.setSearchMode(false);
- if (mMembersFragment != null) {
- if (mIsEditMode) {
- mMembersFragment.displayDeleteButtons(false);
- } else {
- mMembersFragment.displayCheckBoxes(false);
- }
- }
- invalidateOptionsMenu();
- showFabWithAnimation(/* showFabWithAnimation */ true);
- break;
- case ActionBarAdapter.Listener.Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE:
- showFabWithAnimation(/* showFabWithAnimation */ true);
- break;
- }
- }
-
- private void showFabWithAnimation(boolean showFab) {
- // TODO: b/28497108
- }
-
- @Override
- public void onSelectedTabChanged() {
- }
-
- @Override
- public void onUpButtonPressed() {
- onBackPressed();
- }
-
- // MultiSelect checkbox callbacks
-
- @Override
- public void onStartDisplayingCheckBoxes() {
- mActionBarAdapter.setSelectionMode(true);
- }
-
- @Override
- public void onSelectedContactIdsChanged() {
- if (mIsEditMode) {
- mActionBarAdapter.setActionBarTitle(getString(R.string.title_edit_group));
- } else {
- mActionBarAdapter.setSelectionCount(mMembersFragment.getSelectedContactIds().size());
- }
- }
-
- @Override
- public void onStopDisplayingCheckBoxes() {
- mActionBarAdapter.setSelectionMode(false);
- }
-
- // GroupMembersFragment callbacks
-
- @Override
- public void onGroupMetadataLoaded(GroupMetaData groupMetaData) {
- mGroupMetaData = groupMetaData;
- updateGroupMenu(mGroupMetaData);
- setTitle(mGroupMetaData.groupName);
- invalidateOptionsMenu();
- }
-
- @Override
- public void onGroupMetadataLoadFailed() {
- setResultCanceledAndFinish(R.string.groupLoadErrorToast);
- }
-
- protected GroupMetaData getGroupMetaData() {
- return mGroupMetaData;
- }
-
- @Override
- public void onGroupMemberListItemClicked(int position, Uri contactLookupUri) {
- final int count = mMembersFragment.getAdapter().getCount();
- Logger.logListEvent(ListEvent.ActionType.CLICK, ListEvent.ListType.GROUP, count,
- /* clickedIndex */ position, /* numSelected */ 0);
- final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(this,
- contactLookupUri, QuickContactActivity.MODE_FULLY_EXPANDED);
- intent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE, ScreenType.LIST_GROUP);
- startActivity(intent);
- }
-
- @Override
- public void onGroupMemberListItemDeleted(int position, long contactId) {
- final long[] contactIds = new long[1];
- contactIds[0] = contactId;
- new UpdateGroupMembersAsyncTask(UpdateGroupMembersAsyncTask.TYPE_REMOVE,
- this, contactIds, mGroupMetaData.groupId, mGroupMetaData.accountName,
- mGroupMetaData.accountType, mGroupMetaData.dataSet).execute();
- }
-}
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 5b14966..e4dc56d 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -20,115 +20,89 @@
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
-import android.content.ActivityNotFoundException;
+import android.content.ContentResolver;
import android.content.BroadcastReceiver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
+import android.content.SyncStatusObserver;
import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Parcelable;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Intents;
+import android.os.Handler;
+import android.provider.ContactsContract;
import android.provider.ContactsContract.ProviderStatus;
-import android.provider.ContactsContract.QuickContact;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
-import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.GravityCompat;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
+import android.support.v4.widget.SwipeRefreshLayout;
import android.text.TextUtils;
import android.util.Log;
-import android.view.Gravity;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
-import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.widget.ImageButton;
import android.widget.Toast;
-import com.android.contacts.common.model.account.AccountDisplayInfo;
-import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
import com.android.contacts.ContactSaveService;
import com.android.contacts.ContactsDrawerActivity;
import com.android.contacts.R;
-import com.android.contacts.activities.ActionBarAdapter.TabState;
+import com.android.contacts.common.Experiments;
import com.android.contacts.common.activity.RequestPermissionsActivity;
import com.android.contacts.common.compat.CompatUtils;
-import com.android.contacts.common.interactions.ImportExportDialogFragment;
-import com.android.contacts.common.list.ContactEntryListFragment;
import com.android.contacts.common.list.ContactListFilter;
-import com.android.contacts.common.list.ContactListFilterController;
-import com.android.contacts.common.list.DirectoryListLoader;
+import com.android.contacts.common.list.ContactListFilterController.ContactListFilterListener;
import com.android.contacts.common.list.ProviderStatusWatcher;
import com.android.contacts.common.list.ProviderStatusWatcher.ProviderStatusListener;
-import com.android.contacts.common.list.ViewPagerTabs;
-import com.android.contacts.common.logging.ListEvent;
import com.android.contacts.common.logging.Logger;
import com.android.contacts.common.logging.ScreenEvent.ScreenType;
import com.android.contacts.common.model.AccountTypeManager;
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.util.AccountFilterUtil;
import com.android.contacts.common.util.Constants;
import com.android.contacts.common.util.ImplicitIntentsUtil;
import com.android.contacts.common.widget.FloatingActionButtonController;
-import com.android.contacts.editor.EditorIntents;
-import com.android.contacts.interactions.ContactDeletionInteraction;
-import com.android.contacts.interactions.ContactMultiDeletionInteraction;
-import com.android.contacts.interactions.ContactMultiDeletionInteraction.MultiContactDeleteListener;
+import com.android.contacts.group.GroupMembersFragment;
+import com.android.contacts.group.GroupMetaData;
+import com.android.contacts.group.GroupUtil;
import com.android.contacts.list.ContactsIntentResolver;
import com.android.contacts.list.ContactsRequest;
import com.android.contacts.list.ContactsUnavailableFragment;
import com.android.contacts.list.DefaultContactBrowseListFragment;
-import com.android.contacts.list.MultiSelectContactsListFragment.OnCheckBoxListActionListener;
-import com.android.contacts.list.OnContactBrowserActionListener;
-import com.android.contacts.list.OnContactsUnavailableActionListener;
-import com.android.contacts.quickcontact.QuickContactActivity;
-import com.android.contacts.util.DialogManager;
-import com.android.contacts.util.SharedPreferenceUtil;
-import com.android.contacts.widget.FloatingActionButtonBehavior;
+import com.android.contacts.util.SyncUtil;
import com.android.contactsbind.FeatureHighlightHelper;
+import com.android.contactsbind.ObjectFactory;
+import com.android.contactsbind.experiments.Flags;
import java.util.List;
-import java.util.Locale;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Displays a list to browse contacts.
*/
-public class PeopleActivity extends ContactsDrawerActivity implements
- View.OnCreateContextMenuListener,
- View.OnClickListener,
- ActionBarAdapter.Listener,
- DialogManager.DialogShowingViewActivity,
- ContactListFilterController.ContactListFilterListener,
- ProviderStatusListener,
- MultiContactDeleteListener,
- DefaultContactBrowseListFragment.FeatureHighlightCallback {
+public class PeopleActivity extends ContactsDrawerActivity {
private static final String TAG = "PeopleActivity";
+ private static final String TAG_ALL = "contacts-all";
+ private static final String TAG_UNAVAILABLE = "contacts-unavailable";
+ private static final String TAG_GROUP_VIEW = "contacts-groups";
+ private static final String TAG_DUPLICATES = "contacts-duplicates";
+ private static final String TAG_SECOND_LEVEL = "second-level";
+ // Tag for DuplicatesUtilFragment.java
+ public static final String TAG_DUPLICATES_UTIL = "DuplicatesUtilFragment";
- private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!";
-
- private static final int ACTIVITY_REQUEST_CODE_SHARE = 0;
-
- private final DialogManager mDialogManager = new DialogManager(this);
+ private static final String KEY_GROUP_URI = "groupUri";
private ContactsIntentResolver mIntentResolver;
private ContactsRequest mRequest;
- private ActionBarAdapter mActionBarAdapter;
- private List<AccountWithDataSet> mWritableAccounts;
private FloatingActionButtonController mFloatingActionButtonController;
private View mFloatingActionButtonContainer;
private boolean wasLastFabAnimationScaleIn = false;
@@ -139,7 +113,7 @@
private BroadcastReceiver mSaveServiceListener;
- private boolean mOptionsMenuContactsAvailable;
+ private boolean mShouldSwitchToGroupView;
private CoordinatorLayout mLayoutRoot;
@@ -148,38 +122,85 @@
*/
private DefaultContactBrowseListFragment mAllFragment;
- /** ViewPager for swipe */
- private ViewPager mTabPager;
- private ViewPagerTabs mViewPagerTabs;
- private TabPagerAdapter mTabPagerAdapter;
- private String[] mTabTitles;
- private final TabPagerListener mTabPagerListener = new TabPagerListener();
-
- private boolean mEnableDebugMenuOptions;
+ private GroupMembersFragment mMembersFragment;
+ private Uri mGroupUri;
/**
* True if this activity instance is a re-created one. i.e. set true after orientation change.
- * This is set in {@link #onCreate} for later use in {@link #onStart}.
*/
private boolean mIsRecreatedInstance;
- /**
- * If {@link #configureFragments(boolean)} is already called. Used to avoid calling it twice
- * in {@link #onStart}.
- * (This initialization only needs to be done once in onStart() when the Activity was just
- * created from scratch -- i.e. onCreate() was just called)
- */
- private boolean mFragmentInitialized;
-
- /**
- * This is to disable {@link #onOptionsItemSelected} when we trying to stop the activity.
- */
- private boolean mDisableOptionItemSelected;
+ private boolean mShouldSwitchToAllContacts;
/** Sequential ID assigned to each instance; used for logging */
private final int mInstanceId;
private static final AtomicInteger sNextInstanceId = new AtomicInteger();
+ private Object mStatusChangeListenerHandle;
+
+ private final Handler mHandler = new Handler();
+
+ private SyncStatusObserver mSyncStatusObserver = new SyncStatusObserver() {
+ public void onStatusChanged(int which) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ onSyncStateUpdated();
+ }
+ });
+ }
+ };
+
+ // Update sync status for accounts in current ContactListFilter
+ private void onSyncStateUpdated() {
+ if (isAllFragmentInSearchMode() || isAllFragmentInSelectionMode()) {
+ return;
+ }
+
+ final ContactListFilter filter = mContactListFilterController.getFilter();
+ if (filter != null) {
+ final SwipeRefreshLayout swipeRefreshLayout = mAllFragment.getSwipeRefreshLayout();
+ if (swipeRefreshLayout == null) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Can not load swipeRefreshLayout, swipeRefreshLayout is null");
+ }
+ return;
+ }
+
+ final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(this)
+ .getAccounts(/* contactsWritableOnly */ true);
+ final List<Account> syncableAccounts = filter.getSyncableAccounts(accounts);
+ // If one of the accounts is active or pending, use spinning circle to indicate one of
+ // the syncs is in progress.
+ if (syncableAccounts != null && syncableAccounts.size() > 0) {
+ for (Account account: syncableAccounts) {
+ if (SyncUtil.isSyncStatusPendingOrActive(account)
+ || SyncUtil.isUnsyncableGoogleAccount(account)) {
+ swipeRefreshLayout.setRefreshing(true);
+ return;
+ }
+ }
+ }
+ swipeRefreshLayout.setRefreshing(false);
+ }
+ }
+
+ private final ContactListFilterListener mFilterListener = new ContactListFilterListener() {
+ @Override
+ public void onContactListFilterChanged() {
+ final ContactListFilter filter = mContactListFilterController.getFilter();
+ handleFilterChangeForFragment(filter);
+ handleFilterChangeForActivity(filter);
+ }
+ };
+
+ private final ProviderStatusListener mProviderStatusListener = new ProviderStatusListener() {
+ @Override
+ public void onProviderStatusChange() {
+ reloadGroupsAndFiltersIfNeeded();
+ updateViewConfiguration(false);
+ }
+ };
+
public PeopleActivity() {
mInstanceId = sNextInstanceId.getAndIncrement();
mIntentResolver = new ContactsIntentResolver(this);
@@ -192,7 +213,7 @@
return String.format("%s@%d", getClass().getSimpleName(), mInstanceId);
}
- public boolean areContactsAvailable() {
+ private boolean areContactsAvailable() {
return (mProviderStatus != null) && mProviderStatus.equals(ProviderStatus.STATUS_NORMAL);
}
@@ -200,7 +221,7 @@
* Initialize fragments that are (or may not be) in the layout.
*
* For the fragments that are in the layout, we initialize them in
- * {@link #createViewsAndFragments(Bundle)} after inflating the layout.
+ * {@link #createViewsAndFragments()} after inflating the layout.
*
* However, the {@link ContactsUnavailableFragment} is a special fragment which may not
* be in the layout, so we have to do the initialization here.
@@ -211,8 +232,6 @@
public void onAttachFragment(Fragment fragment) {
if (fragment instanceof ContactsUnavailableFragment) {
mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment;
- mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
- new ContactsUnavailableFragmentListener());
}
}
@@ -231,22 +250,17 @@
finish();
return;
}
- mContactListFilterController = ContactListFilterController.getInstance(this);
- mContactListFilterController.checkFilterValidity(false);
- mContactListFilterController.addListener(this);
- mProviderStatusWatcher.addListener(this);
+ mContactListFilterController.addListener(mFilterListener);
+ mProviderStatusWatcher.addListener(mProviderStatusListener);
mIsRecreatedInstance = (savedState != null);
- // Use FILTER_TYPE_ALL_ACCOUNTS filter if the activity is not a re-created one.
- // This is useful when user upgrades app while an account filter or a custom filter was
- // stored in sharedPreference in a previous version of Contacts app.
- final ContactListFilter filter = mIsRecreatedInstance
- ? mContactListFilterController.getFilter() : createContactsFilter();
- persistFilterIfNeeded(filter);
+ if (mIsRecreatedInstance) {
+ mGroupUri = savedState.getParcelable(KEY_GROUP_URI);
+ }
- createViewsAndFragments(savedState);
+ createViewsAndFragments();
if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish");
@@ -254,37 +268,75 @@
getWindow().setBackgroundDrawable(null);
}
- private void maybeShowHamburgerFeatureHighlight() {
- if (!mActionBarAdapter.isSearchMode() && !mActionBarAdapter.isSelectionMode()
- && SharedPreferenceUtil.getShouldShowHamburgerPromo(this)) {
- if (FeatureHighlightHelper.showHamburgerFeatureHighlight(this)) {
- SharedPreferenceUtil.setHamburgerPromoDisplayedBefore(this);
- }
- }
- }
-
@Override
protected void onNewIntent(Intent intent) {
- if (ContactsDrawerActivity.ACTION_CREATE_GROUP.equals(intent.getAction())) {
- super.onNewIntent(intent);
+ if (GroupUtil.ACTION_CREATE_GROUP.equals(intent.getAction())) {
+ mGroupUri = intent.getData();
+ if (mGroupUri == null) {
+ toast(R.string.groupSavedErrorToast);
+ return;
+ }
+ if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "Received group URI " + mGroupUri);
+ switchToOrUpdateGroupView(intent.getAction());
return;
}
+ if (isGroupDeleteAction(intent.getAction())) {
+ toast(R.string.groupDeletedToast);
+ popSecondLevel();
+ mCurrentView = ContactsView.ALL_CONTACTS;
+ showFabWithAnimation(/* showFab */ true);
+ return;
+ }
+
+ if (isGroupSaveAction(intent.getAction())) {
+ mGroupUri = intent.getData();
+ if (mGroupUri == null) {
+ popSecondLevel();
+ toast(R.string.groupSavedErrorToast);
+ return;
+ }
+ if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "Received group URI " + mGroupUri);
+ switchToOrUpdateGroupView(intent.getAction());
+ }
+
setIntent(intent);
+
if (!processIntent(true)) {
finish();
return;
}
- mActionBarAdapter.initialize(null, mRequest);
mContactListFilterController.checkFilterValidity(false);
- // Re-configure fragments.
- configureFragments(true /* from request */);
+ if (!isInSecondLevel()) {
+ // Re-initialize ActionBarAdapter because {@link #onNewIntent(Intent)} doesn't invoke
+ // {@link Fragment#onActivityCreated(Bundle)} where we initialize ActionBarAdapter
+ // initially.
+ mAllFragment.setParameters(/* ContactsRequest */ mRequest, /* fromOnNewIntent */ true);
+ mAllFragment.initializeActionBarAdapter(null);
+ }
+
initializeFabVisibility();
invalidateOptionsMenuIfNeeded();
}
+ private static boolean isGroupDeleteAction(String action) {
+ return GroupUtil.ACTION_DELETE_GROUP.equals(action);
+ }
+
+ private static boolean isGroupSaveAction(String action) {
+ return GroupUtil.ACTION_UPDATE_GROUP.equals(action)
+ || GroupUtil.ACTION_ADD_TO_GROUP.equals(action)
+ || GroupUtil.ACTION_REMOVE_FROM_GROUP.equals(action);
+ }
+
+ private void toast(int resId) {
+ if (resId >= 0) {
+ Toast.makeText(this, resId, Toast.LENGTH_SHORT).show();
+ }
+ }
+
/**
* Resolve the intent and initialize {@link #mRequest}, and launch another activity if redirect
* is needed.
@@ -308,158 +360,112 @@
switch (mRequest.getActionCode()) {
case ContactsRequest.ACTION_VIEW_CONTACT: {
- final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(
- PeopleActivity.this, mRequest.getContactUri(),
- QuickContactActivity.MODE_FULLY_EXPANDED);
- intent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE, ScreenType.UNKNOWN);
- ImplicitIntentsUtil.startActivityInApp(this, intent);
+ ImplicitIntentsUtil.startQuickContact(
+ this, mRequest.getContactUri(), ScreenType.UNKNOWN);
return false;
}
case ContactsRequest.ACTION_INSERT_GROUP: {
onCreateGroupMenuItemClicked();
return true;
}
+ case ContactsRequest.ACTION_VIEW_GROUP:
+ case ContactsRequest.ACTION_EDIT_GROUP: {
+ mShouldSwitchToGroupView = true;
+ return true;
+ }
}
return true;
}
- private void createViewsAndFragments(Bundle savedState) {
+ private void createViewsAndFragments() {
setContentView(R.layout.people_activity);
final FragmentManager fragmentManager = getFragmentManager();
- // Hide all tabs (the current tab will later be reshown once a tab is selected)
- final FragmentTransaction transaction = fragmentManager.beginTransaction();
+ setUpAllFragment(fragmentManager);
- mTabTitles = new String[TabState.COUNT];
- mTabTitles[TabState.ALL] = getString(R.string.all_contacts_tab_label);
- mTabPager = getView(R.id.tab_pager);
- mTabPagerAdapter = new TabPagerAdapter();
- mTabPager.setAdapter(mTabPagerAdapter);
- mTabPager.setOnPageChangeListener(mTabPagerListener);
-
- // Configure toolbar and toolbar tabs. If in landscape mode, we configure tabs differently.
- final ViewPagerTabs portraitViewPagerTabs
- = (ViewPagerTabs) findViewById(R.id.lists_pager_header);
- ViewPagerTabs landscapeViewPagerTabs = null;
- if (portraitViewPagerTabs == null) {
- landscapeViewPagerTabs = (ViewPagerTabs) getLayoutInflater().inflate(
- R.layout.people_activity_tabs_lands, mToolbar, /* attachToRoot = */ false);
- mViewPagerTabs = landscapeViewPagerTabs;
- } else {
- mViewPagerTabs = portraitViewPagerTabs;
+ if (isGroupView()) {
+ mMembersFragment = (GroupMembersFragment)
+ fragmentManager.findFragmentByTag(TAG_GROUP_VIEW);
}
- mViewPagerTabs.setViewPager(mTabPager);
-
- final String ALL_TAG = "tab-pager-all";
-
- // Create the fragments and add as children of the view pager.
- // The pager adapter will only change the visibility; it'll never create/destroy
- // fragments.
- // However, if it's after screen rotation, the fragments have been re-created by
- // the fragment manager, so first see if there're already the target fragments
- // existing.
- mAllFragment = (DefaultContactBrowseListFragment)
- fragmentManager.findFragmentByTag(ALL_TAG);
-
- if (mAllFragment == null) {
- mAllFragment = new DefaultContactBrowseListFragment();
- mAllFragment.setAnimateOnLoad(true);
- transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG);
- }
-
- mAllFragment.setFeatureHighlightCallback(this);
- mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener());
- mAllFragment.setCheckBoxListListener(new CheckBoxListListener());
- mAllFragment.setListType(mContactListFilterController.getFilterListType());
-
- // Hide all fragments for now. We adjust visibility when we get onSelectedTabChanged()
- // from ActionBarAdapter.
- transaction.hide(mAllFragment);
-
- transaction.commitAllowingStateLoss();
- fragmentManager.executePendingTransactions();
-
- mActionBarAdapter = new ActionBarAdapter(this, this, getSupportActionBar(),
- portraitViewPagerTabs, landscapeViewPagerTabs, mToolbar);
- mActionBarAdapter.initialize(savedState, mRequest);
// Configure floating action button
mFloatingActionButtonContainer = findViewById(R.id.floating_action_button_container);
final ImageButton floatingActionButton
= (ImageButton) findViewById(R.id.floating_action_button);
- floatingActionButton.setOnClickListener(this);
+ floatingActionButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ AccountFilterUtil.startEditorIntent(PeopleActivity.this, getIntent(),
+ mContactListFilterController.getFilter());
+ }
+ });
mFloatingActionButtonController = new FloatingActionButtonController(this,
mFloatingActionButtonContainer, floatingActionButton);
- initializeFabVisibility();
invalidateOptionsMenuIfNeeded();
mLayoutRoot = (CoordinatorLayout) findViewById(R.id.root);
- // Setup the FAB to animate upwards when a snackbar is shown in this activity.
- // Normally the layout_behavior attribute could be used for this but for some reason it
- // throws a ClassNotFoundException so the layout parameters are set programmatically.
- final CoordinatorLayout.LayoutParams fabParams = new CoordinatorLayout.LayoutParams(
- (ViewGroup.MarginLayoutParams) mFloatingActionButtonContainer.getLayoutParams());
- fabParams.setBehavior(new FloatingActionButtonBehavior());
- fabParams.gravity = Gravity.BOTTOM | Gravity.END;
- mFloatingActionButtonContainer.setLayoutParams(fabParams);
+ if (mShouldSwitchToGroupView && !mIsRecreatedInstance) {
+ mGroupUri = mRequest.getContactUri();
+ switchToOrUpdateGroupView(GroupUtil.ACTION_SWITCH_GROUP);
+ mShouldSwitchToGroupView = false;
+ }
}
- @Override
- protected void onStart() {
- if (!mFragmentInitialized) {
- mFragmentInitialized = true;
- /* Configure fragments if we haven't.
- *
- * Note it's a one-shot initialization, so we want to do this in {@link #onCreate}.
- *
- * However, because this method may indirectly touch views in fragments but fragments
- * created in {@link #configureContentView} using a {@link FragmentTransaction} will NOT
- * have views until {@link Activity#onCreate} finishes (they would if they were inflated
- * from a layout), we need to do it here in {@link #onStart()}.
- *
- * (When {@link Fragment#onCreateView} is called is different in the former case and
- * in the latter case, unfortunately.)
- *
- * Also, we skip most of the work in it if the activity is a re-created one.
- * (so the argument.)
- */
- configureFragments(!mIsRecreatedInstance);
+ private void setUpAllFragment(FragmentManager fragmentManager) {
+ mAllFragment = (DefaultContactBrowseListFragment)
+ fragmentManager.findFragmentByTag(TAG_ALL);
+
+ if (mAllFragment == null) {
+ mAllFragment = new DefaultContactBrowseListFragment();
+ mAllFragment.setAnimateOnLoad(true);
+ fragmentManager.beginTransaction()
+ .add(R.id.contacts_list_container, mAllFragment, TAG_ALL)
+ .commit();
+ fragmentManager.executePendingTransactions();
}
- super.onStart();
+
+ mAllFragment.setContactsAvailable(areContactsAvailable());
+ mAllFragment.setListType(mContactListFilterController.getFilterListType());
+ mAllFragment.setParameters(/* ContactsRequest */ mRequest, /* fromOnNewIntent */ false);
}
@Override
protected void onPause() {
- mOptionsMenuContactsAvailable = false;
mProviderStatusWatcher.stop();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mSaveServiceListener);
super.onPause();
+ if (Flags.getInstance(this).getBoolean(Experiments.PULL_TO_REFRESH)) {
+ ContentResolver.removeStatusChangeListener(mStatusChangeListenerHandle);
+ onSyncStateUpdated();
+ }
}
@Override
protected void onResume() {
super.onResume();
+ if (mShouldSwitchToAllContacts) {
+ switchToAllContacts();
+ }
+
mProviderStatusWatcher.start();
updateViewConfiguration(true);
- // Re-register the listener, which may have been cleared when onSaveInstanceState was
- // called. See also: onSaveInstanceState
- mActionBarAdapter.setListener(this);
- mDisableOptionItemSelected = false;
- if (mTabPager != null) {
- mTabPager.setOnPageChangeListener(mTabPagerListener);
+ if (Flags.getInstance(this).getBoolean(Experiments.PULL_TO_REFRESH)) {
+ mStatusChangeListenerHandle = ContentResolver.addStatusChangeListener(
+ ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE
+ | ContentResolver.SYNC_OBSERVER_TYPE_PENDING
+ | ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS,
+ mSyncStatusObserver);
+ onSyncStateUpdated();
}
- // Current tab may have changed since the last onSaveInstanceState(). Make sure
- // the actual contents match the tab.
- updateFragmentsVisibility();
- maybeShowHamburgerFeatureHighlight();
+ initializeFabVisibility();
mSaveServiceListener = new SaveServiceListener();
LocalBroadcastManager.getInstance(this).registerReceiver(mSaveServiceListener,
@@ -468,95 +474,26 @@
@Override
protected void onDestroy() {
- mProviderStatusWatcher.removeListener(this);
-
- // Some of variables will be null if this Activity redirects Intent.
- // See also onCreate() or other methods called during the Activity's initialization.
- if (mActionBarAdapter != null) {
- mActionBarAdapter.setListener(null);
- }
- if (mContactListFilterController != null) {
- mContactListFilterController.removeListener(this);
- }
-
+ mProviderStatusWatcher.removeListener(mProviderStatusListener);
+ mContactListFilterController.removeListener(mFilterListener);
super.onDestroy();
}
- private void configureFragments(boolean fromRequest) {
- if (fromRequest) {
- ContactListFilter filter = null;
- int actionCode = mRequest.getActionCode();
- boolean searchMode = mRequest.isSearchMode();
- final int tabToOpen;
- switch (actionCode) {
- case ContactsRequest.ACTION_ALL_CONTACTS:
- filter = createContactsFilter();
- tabToOpen = TabState.ALL;
- break;
- case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
- filter = ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
- tabToOpen = TabState.ALL;
- break;
-
- case ContactsRequest.ACTION_FREQUENT:
- case ContactsRequest.ACTION_STREQUENT:
- case ContactsRequest.ACTION_STARRED:
- tabToOpen = TabState.ALL;
- break;
- case ContactsRequest.ACTION_VIEW_CONTACT:
- tabToOpen = TabState.ALL;
- break;
- default:
- tabToOpen = -1;
- break;
- }
- if (tabToOpen != -1) {
- mActionBarAdapter.setCurrentTab(tabToOpen);
- }
-
- if (filter != null) {
- mContactListFilterController.setContactListFilter(filter, /* persistent */ false);
- searchMode = false;
- }
-
- if (mRequest.getContactUri() != null) {
- searchMode = false;
- }
-
- mActionBarAdapter.setSearchMode(searchMode);
- configureContactListFragmentForRequest();
- }
-
- configureContactListFragment();
-
- invalidateOptionsMenuIfNeeded();
- }
-
private void initializeFabVisibility() {
- final boolean hideFab = mActionBarAdapter.isSearchMode()
- || mActionBarAdapter.isSelectionMode()
- || !shouldShowFabForAccount();
- mFloatingActionButtonContainer.setVisibility(hideFab ? View.GONE : View.VISIBLE);
+ mFloatingActionButtonContainer.setVisibility(shouldHideFab() ? View.GONE : View.VISIBLE);
mFloatingActionButtonController.resetIn();
- wasLastFabAnimationScaleIn = !hideFab;
+ wasLastFabAnimationScaleIn = !shouldHideFab();
}
- private boolean shouldShowFabForAccount() {
- return isCurrentAccountFilterWritable()
- || isAllContactsFilter(mContactListFilterController.getFilter());
+ private boolean shouldHideFab() {
+ if (mAllFragment != null && mAllFragment.getActionBarAdapter() == null
+ || isInSecondLevel()) {
+ return true;
+ }
+ return isAllFragmentInSearchMode() || isAllFragmentInSelectionMode();
}
- private boolean isCurrentAccountFilterWritable() {
- final ContactListFilter currentFilter = mContactListFilterController.getFilter();
- final AccountWithDataSet accountOfCurrentFilter = new AccountWithDataSet(
- currentFilter.accountName, currentFilter.accountType, currentFilter.dataSet);
- return accountOfCurrentFilter.isNullAccount()
- || (mWritableAccounts != null
- && mWritableAccounts.contains(accountOfCurrentFilter));
- }
-
- private void showFabWithAnimation(boolean showFab) {
+ public void showFabWithAnimation(boolean showFab) {
if (mFloatingActionButtonContainer == null) {
return;
}
@@ -576,362 +513,6 @@
}
}
- @Override
- public void onContactListFilterChanged() {
- if (mAllFragment == null || !mAllFragment.isAdded()) {
- return;
- }
-
- setFilterAndUpdateTitle(mContactListFilterController.getFilter());
- // Scroll to top after filter is changed.
- mAllFragment.getListView().setSelection(0);
- showFabWithAnimation(shouldShowFabForAccount());
-
- invalidateOptionsMenuIfNeeded();
- }
-
- /**
- * Handler for action bar actions.
- */
- @Override
- public void onAction(int action) {
- switch (action) {
- case ActionBarAdapter.Listener.Action.START_SELECTION_MODE:
- mAllFragment.displayCheckBoxes(true);
- startSearchOrSelectionMode();
- break;
- case ActionBarAdapter.Listener.Action.START_SEARCH_MODE:
- if (!mIsRecreatedInstance) {
- Logger.logScreenView(this, ScreenType.SEARCH);
- }
- startSearchOrSelectionMode();
- break;
- case ActionBarAdapter.Listener.Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE:
- showFabWithAnimation(shouldShowFabForAccount());
- break;
- case ActionBarAdapter.Listener.Action.STOP_SEARCH_AND_SELECTION_MODE:
- // If queryString is empty, fragment data will not be reloaded,
- // so hamburger promo should be checked now.
- // If not empty, promo should be checked and displayed after reloading. (b/30706521)
- if (TextUtils.isEmpty(mAllFragment.getQueryString())) {
- maybeShowHamburgerFeatureHighlight();
- }
- setQueryTextToFragment("");
- updateFragmentsVisibility();
- invalidateOptionsMenu();
- showFabWithAnimation(shouldShowFabForAccount());
- break;
- case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY:
- final String queryString = mActionBarAdapter.getQueryString();
- setQueryTextToFragment(queryString);
- updateDebugOptionsVisibility(
- ENABLE_DEBUG_OPTIONS_HIDDEN_CODE.equals(queryString));
- break;
- default:
- throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action);
- }
- }
-
- private void startSearchOrSelectionMode() {
- configureFragments(false /* from request */);
- updateFragmentsVisibility();
- invalidateOptionsMenu();
- showFabWithAnimation(/* showFab */ false);
- if (!SharedPreferenceUtil.getHamburgerPromoTriggerActionHappenedBefore(this)) {
- SharedPreferenceUtil.setHamburgerPromoTriggerActionHappenedBefore(this);
- }
- }
-
- @Override
- public void onSelectedTabChanged() {
- updateFragmentsVisibility();
- }
-
- @Override
- public void onUpButtonPressed() {
- onBackPressed();
- }
-
- private void updateDebugOptionsVisibility(boolean visible) {
- if (mEnableDebugMenuOptions != visible) {
- mEnableDebugMenuOptions = visible;
- invalidateOptionsMenu();
- }
- }
-
- /**
- * Updates the fragment/view visibility according to the current mode, such as
- * {@link ActionBarAdapter#isSearchMode()} and {@link ActionBarAdapter#getCurrentTab()}.
- */
- private void updateFragmentsVisibility() {
- int tab = mActionBarAdapter.getCurrentTab();
-
- if (mActionBarAdapter.isSearchMode() || mActionBarAdapter.isSelectionMode()) {
- mTabPagerAdapter.setTabsHidden(true);
- } else {
- // No smooth scrolling if quitting from the search/selection mode.
- final boolean wereTabsHidden = mTabPagerAdapter.areTabsHidden()
- || mActionBarAdapter.isSelectionMode();
- mTabPagerAdapter.setTabsHidden(false);
- if (mTabPager.getCurrentItem() != tab) {
- mTabPager.setCurrentItem(tab, !wereTabsHidden);
- }
- }
- if (!mActionBarAdapter.isSelectionMode()) {
- mAllFragment.displayCheckBoxes(false);
- }
- invalidateOptionsMenu();
- showEmptyStateForTab(tab);
- }
-
- private void showEmptyStateForTab(int tab) {
- if (mContactsUnavailableFragment != null) {
- switch (getTabPositionForTextDirection(tab)) {
- case TabState.ALL:
- mContactsUnavailableFragment.setTabInfo(R.string.noContacts, TabState.ALL);
- break;
- }
- // When using the mContactsUnavailableFragment the ViewPager doesn't contain two views.
- // Therefore, we have to trick the ViewPagerTabs into thinking we have changed tabs
- // when the mContactsUnavailableFragment changes. Otherwise the tab strip won't move.
- mViewPagerTabs.onPageScrolled(tab, 0, 0);
- }
- }
-
- private class TabPagerListener implements ViewPager.OnPageChangeListener {
-
- // This package-protected constructor is here because of a possible compiler bug.
- // PeopleActivity$1.class should be generated due to the private outer/inner class access
- // needed here. But for some reason, PeopleActivity$1.class is missing.
- // Since $1 class is needed as a jvm work around to get access to the inner class,
- // changing the constructor to package-protected or public will solve the problem.
- // To verify whether $1 class is needed, javap PeopleActivity$TabPagerListener and look for
- // references to PeopleActivity$1.
- //
- // When the constructor is private and PeopleActivity$1.class is missing, proguard will
- // correctly catch this and throw warnings and error out the build on user/userdebug builds.
- //
- // All private inner classes below also need this fix.
- TabPagerListener() {}
-
- @Override
- public void onPageScrollStateChanged(int state) {
- if (!mTabPagerAdapter.areTabsHidden()) {
- mViewPagerTabs.onPageScrollStateChanged(state);
- }
- }
-
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- if (!mTabPagerAdapter.areTabsHidden()) {
- mViewPagerTabs.onPageScrolled(position, positionOffset, positionOffsetPixels);
- }
- }
-
- @Override
- public void onPageSelected(int position) {
- // Make sure not in the search mode, in which case position != TabState.ordinal().
- if (!mTabPagerAdapter.areTabsHidden()) {
- mActionBarAdapter.setCurrentTab(position, false);
- mViewPagerTabs.onPageSelected(position);
- showEmptyStateForTab(position);
- invalidateOptionsMenu();
- }
- }
- }
-
- /**
- * Adapter for the {@link ViewPager}. Unlike {@link FragmentPagerAdapter},
- * {@link #instantiateItem} returns existing fragments, and {@link #instantiateItem}/
- * {@link #destroyItem} show/hide fragments instead of attaching/detaching.
- *
- * In search mode, we always show the "all" fragment, and disable the swipe. We change the
- * number of items to 1 to disable the swipe.
- *
- * TODO figure out a more straight way to disable swipe.
- */
- private class TabPagerAdapter extends PagerAdapter {
- private final FragmentManager mFragmentManager;
- private FragmentTransaction mCurTransaction = null;
-
- private boolean mAreTabsHiddenInTabPager;
-
- private Fragment mCurrentPrimaryItem;
-
- public TabPagerAdapter() {
- mFragmentManager = getFragmentManager();
- }
-
- public boolean areTabsHidden() {
- return mAreTabsHiddenInTabPager;
- }
-
- public void setTabsHidden(boolean hideTabs) {
- if (hideTabs == mAreTabsHiddenInTabPager) {
- return;
- }
- mAreTabsHiddenInTabPager = hideTabs;
- notifyDataSetChanged();
- }
-
- @Override
- public int getCount() {
- return mAreTabsHiddenInTabPager ? 1 : TabState.COUNT;
- }
-
- /** Gets called when the number of items changes. */
- @Override
- public int getItemPosition(Object object) {
- if (mAreTabsHiddenInTabPager) {
- if (object == mAllFragment) {
- return 0; // Only 1 page in search mode
- }
- } else {
- if (object == mAllFragment) {
- return getTabPositionForTextDirection(TabState.ALL);
- }
- }
- return POSITION_NONE;
- }
-
- @Override
- public void startUpdate(ViewGroup container) {
- }
-
- private Fragment getFragment(int position) {
- position = getTabPositionForTextDirection(position);
- if (mAreTabsHiddenInTabPager) {
- if (position != 0) {
- // This has only been observed in monkey tests.
- // Let's log this issue, but not crash
- Log.w(TAG, "Request fragment at position=" + position + ", eventhough we " +
- "are in search mode");
- }
- return mAllFragment;
- } else {
- if (position == TabState.ALL) {
- return mAllFragment;
- }
- }
- throw new IllegalArgumentException("position: " + position);
- }
-
- @Override
- public Object instantiateItem(ViewGroup container, int position) {
- if (mCurTransaction == null) {
- mCurTransaction = mFragmentManager.beginTransaction();
- }
- Fragment f = getFragment(position);
- mCurTransaction.show(f);
-
- // Non primary pages are not visible.
- f.setUserVisibleHint(f == mCurrentPrimaryItem);
- return f;
- }
-
- @Override
- public void destroyItem(ViewGroup container, int position, Object object) {
- if (mCurTransaction == null) {
- mCurTransaction = mFragmentManager.beginTransaction();
- }
- mCurTransaction.hide((Fragment) object);
- }
-
- @Override
- public void finishUpdate(ViewGroup container) {
- if (mCurTransaction != null) {
- mCurTransaction.commitAllowingStateLoss();
- mCurTransaction = null;
- mFragmentManager.executePendingTransactions();
- }
- }
-
- @Override
- public boolean isViewFromObject(View view, Object object) {
- return ((Fragment) object).getView() == view;
- }
-
- @Override
- public void setPrimaryItem(ViewGroup container, int position, Object object) {
- Fragment fragment = (Fragment) object;
- if (mCurrentPrimaryItem != fragment) {
- if (mCurrentPrimaryItem != null) {
- mCurrentPrimaryItem.setUserVisibleHint(false);
- }
- if (fragment != null) {
- fragment.setUserVisibleHint(true);
- }
- mCurrentPrimaryItem = fragment;
- }
- }
-
- @Override
- public Parcelable saveState() {
- return null;
- }
-
- @Override
- public void restoreState(Parcelable state, ClassLoader loader) {
- }
-
- @Override
- public CharSequence getPageTitle(int position) {
- return mTabTitles[position];
- }
- }
-
- private void setQueryTextToFragment(String query) {
- mAllFragment.setQueryString(query, true);
- mAllFragment.setVisibleScrollbarEnabled(!mAllFragment.isSearchMode());
- }
-
- private void configureContactListFragmentForRequest() {
- Uri contactUri = mRequest.getContactUri();
- if (contactUri != null) {
- mAllFragment.setSelectedContactUri(contactUri);
- }
-
- setFilterAndUpdateTitle(mContactListFilterController.getFilter());
- setQueryTextToFragment(mActionBarAdapter.getQueryString());
-
- if (mRequest.isDirectorySearchEnabled()) {
- mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
- } else {
- mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
- }
- }
-
- private void configureContactListFragment() {
- // Filter may be changed when this Activity is in background.
- setFilterAndUpdateTitle(mContactListFilterController.getFilter());
-
- mAllFragment.setVerticalScrollbarPosition(getScrollBarPosition());
- mAllFragment.setSelectionVisible(false);
- }
-
- private int getScrollBarPosition() {
- return isRTL() ? View.SCROLLBAR_POSITION_LEFT : View.SCROLLBAR_POSITION_RIGHT;
- }
-
- private boolean isRTL() {
- final Locale locale = Locale.getDefault();
- return TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL;
- }
-
- @Override
- public void onFiltersLoaded(List<ContactListFilter> accountFilterItems) {
- super.onFiltersLoaded(accountFilterItems);
- mWritableAccounts =
- AccountTypeManager.getInstance(this).getAccounts(/* contactWritableOnly */ true);
- initializeFabVisibility();
- }
-
- @Override
- public void onProviderStatusChange() {
- reloadGroupsAndFiltersIfNeeded();
- updateViewConfiguration(false);
- }
-
private void reloadGroupsAndFiltersIfNeeded() {
final int providerStatus = mProviderStatusWatcher.getProviderStatus();
final Menu menu = mNavigationView.getMenu();
@@ -952,51 +533,50 @@
&& (mProviderStatus.equals(providerStatus))) return;
mProviderStatus = providerStatus;
- View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view);
+ final FragmentManager fragmentManager= getFragmentManager();
+ final FragmentTransaction transaction = fragmentManager.beginTransaction();
// Change in CP2's provider status may not take effect immediately, see b/30566908.
// So we need to handle the case where provider status is STATUS_EMPTY and there is
// actually at least one real account (not "local" account) on device.
- if ((mProviderStatus.equals(ProviderStatus.STATUS_EMPTY) && hasNonLocalAccount())
- || mProviderStatus.equals(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 (shouldShowList()) {
if (mAllFragment != null) {
+ transaction.show(mAllFragment);
+ mAllFragment.setContactsAvailable(areContactsAvailable());
mAllFragment.setEnabled(true);
}
+ if (mContactsUnavailableFragment != null) {
+ transaction.hide(mContactsUnavailableFragment);
+ }
} else {
// Setting up the page so that the user can still use the app
// even without an account.
if (mAllFragment != null) {
mAllFragment.setEnabled(false);
+ transaction.hide(mAllFragment);
}
if (mContactsUnavailableFragment == null) {
mContactsUnavailableFragment = new ContactsUnavailableFragment();
- mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
- new ContactsUnavailableFragmentListener());
- getFragmentManager().beginTransaction()
- .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
- .commitAllowingStateLoss();
+ transaction.add(R.id.contacts_list_container, mContactsUnavailableFragment,
+ TAG_UNAVAILABLE);
}
+ transaction.show(mContactsUnavailableFragment);
mContactsUnavailableFragment.updateStatus(mProviderStatus);
-
- // 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);
- }
-
- showEmptyStateForTab(mActionBarAdapter.getCurrentTab());
+ }
+ if (!transaction.isEmpty()) {
+ transaction.commit();
+ fragmentManager.executePendingTransactions();
}
invalidateOptionsMenuIfNeeded();
}
+ private boolean shouldShowList() {
+ return mProviderStatus != null
+ && ((mProviderStatus.equals(ProviderStatus.STATUS_EMPTY) && hasNonLocalAccount())
+ || mProviderStatus.equals(ProviderStatus.STATUS_NORMAL));
+ }
+
// Returns true if there are real accounts (not "local" account) in the list of accounts.
private boolean hasNonLocalAccount() {
final List<AccountWithDataSet> allAccounts =
@@ -1010,359 +590,22 @@
return !allAccounts.get(0).isNullAccount();
}
- private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
- ContactBrowserActionListener() {}
-
- @Override
- public void onSelectionChange() {
-
- }
-
- @Override
- public void onViewContactAction(int position, Uri contactLookupUri,
- boolean isEnterpriseContact) {
- if (isEnterpriseContact) {
- // No implicit intent as user may have a different contacts app in work profile.
- QuickContact.showQuickContact(PeopleActivity.this, new Rect(), contactLookupUri,
- QuickContactActivity.MODE_FULLY_EXPANDED, null);
- } else {
- final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(
- PeopleActivity.this, contactLookupUri,
- QuickContactActivity.MODE_FULLY_EXPANDED);
- final int previousScreen;
- if (mAllFragment.isSearchMode()) {
- previousScreen = ScreenType.SEARCH;
- } else {
- if (isAllContactsFilter(mContactListFilterController.getFilter())) {
- if (position < mAllFragment.getAdapter().getNumberOfFavorites()) {
- previousScreen = ScreenType.FAVORITES;
- } else {
- previousScreen = ScreenType.ALL_CONTACTS;
- }
- } else {
- previousScreen = ScreenType.LIST_ACCOUNT;
- }
- }
- Logger.logListEvent(ListEvent.ActionType.CLICK,
- /* listType */ getListTypeIncludingSearch(),
- /* count */ mAllFragment.getAdapter().getCount(),
- /* clickedIndex */ position, /* numSelected */ 0);
- intent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE, previousScreen);
- ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
- }
- }
-
- @Override
- public void onDeleteContactAction(Uri contactUri) {
- ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
- }
-
- @Override
- public void onFinishAction() {
- onBackPressed();
- }
-
- @Override
- public void onInvalidSelection() {
- ContactListFilter filter;
- ContactListFilter currentFilter = mAllFragment.getFilter();
- if (currentFilter != null
- && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
- filter = createContactsFilter();
- setFilterAndUpdateTitle(filter);
- } else {
- filter = ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
- setFilterAndUpdateTitle(filter, /* restoreSelectedUri */ false);
- }
- persistFilterIfNeeded(filter);
- }
- }
-
- private final class CheckBoxListListener implements OnCheckBoxListActionListener {
- @Override
- public void onStartDisplayingCheckBoxes() {
- mActionBarAdapter.setSelectionMode(true);
- invalidateOptionsMenu();
- }
-
- @Override
- public void onSelectedContactIdsChanged() {
- mActionBarAdapter.setSelectionCount(mAllFragment.getSelectedContactIds().size());
- invalidateOptionsMenu();
- }
-
- @Override
- public void onStopDisplayingCheckBoxes() {
- mActionBarAdapter.setSelectionMode(false);
- }
- }
-
- private class ContactsUnavailableFragmentListener
- implements OnContactsUnavailableActionListener {
- ContactsUnavailableFragmentListener() {}
-
- @Override
- public void onCreateNewContactAction() {
- ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this,
- EditorIntents.createCompactInsertContactIntent(PeopleActivity.this));
- }
-
- @Override
- public void onAddAccountAction() {
- final Intent intent = ImplicitIntentsUtil.getIntentForAddingGoogleAccount();
- ImplicitIntentsUtil.startActivityOutsideApp(PeopleActivity.this, intent);
- }
-
- @Override
- public void onImportContactsFromFileAction() {
- showImportExportDialogFragment();
- }
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- if (!areContactsAvailable()) {
- // If contacts aren't available, hide all menu items.
- return false;
- }
- super.onCreateOptionsMenu(menu);
-
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.people_options, menu);
-
- return true;
- }
-
private void invalidateOptionsMenuIfNeeded() {
- if (isOptionsMenuChanged()) {
+ if (mAllFragment != null
+ && mAllFragment.getOptionsMenuContactsAvailable() != areContactsAvailable()) {
invalidateOptionsMenu();
}
}
- public boolean isOptionsMenuChanged() {
- if (mOptionsMenuContactsAvailable != areContactsAvailable()) {
- return true;
- }
-
- if (mAllFragment != null && mAllFragment.isOptionsMenuChanged()) {
- return true;
- }
-
- return false;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- mOptionsMenuContactsAvailable = areContactsAvailable();
- if (!mOptionsMenuContactsAvailable) {
- return false;
- }
-
- final boolean isSearchOrSelectionMode = mActionBarAdapter.isSearchMode()
- || mActionBarAdapter.isSelectionMode();
- makeMenuItemVisible(menu, R.id.menu_search, !isSearchOrSelectionMode);
-
- final boolean showSelectedContactOptions = mActionBarAdapter.isSelectionMode()
- && mAllFragment.getSelectedContactIds().size() != 0;
- makeMenuItemVisible(menu, R.id.menu_share, showSelectedContactOptions);
- makeMenuItemVisible(menu, R.id.menu_delete, showSelectedContactOptions);
- final boolean showLinkContactsOptions = mActionBarAdapter.isSelectionMode()
- && mAllFragment.getSelectedContactIds().size() > 1;
- makeMenuItemVisible(menu, R.id.menu_join, showLinkContactsOptions);
-
- // Debug options need to be visible even in search mode.
- makeMenuItemVisible(menu, R.id.export_database, mEnableDebugMenuOptions &&
- hasExportIntentHandler());
-
- return true;
- }
-
- private boolean hasExportIntentHandler() {
- final Intent intent = new Intent();
- intent.setAction("com.android.providers.contacts.DUMP_DATABASE");
- final List<ResolveInfo> receivers = getPackageManager().queryIntentActivities(intent,
- PackageManager.MATCH_DEFAULT_ONLY);
- return receivers != null && receivers.size() > 0;
- }
-
- private void makeMenuItemVisible(Menu menu, int itemId, boolean visible) {
- final MenuItem item = menu.findItem(itemId);
- if (item != null) {
- item.setVisible(visible);
- }
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (mDisableOptionItemSelected) {
- return false;
- }
-
- switch (item.getItemId()) {
- case android.R.id.home: {
- // The home icon on the action bar is pressed
- if (mActionBarAdapter.isUpShowing()) {
- // "UP" icon press -- should be treated as "back".
- onBackPressed();
- }
- return true;
- }
- case R.id.menu_search: {
- onSearchRequested();
- return true;
- }
- case R.id.menu_share: {
- shareSelectedContacts();
- return true;
- }
- case R.id.menu_join: {
- Logger.logListEvent(ListEvent.ActionType.LINK,
- /* listType */ getListTypeIncludingSearch(),
- /* count */ mAllFragment.getAdapter().getCount(), /* clickedIndex */ -1,
- /* numSelected */ mAllFragment.getAdapter().getSelectedContactIds().size());
- joinSelectedContacts();
- return true;
- }
- case R.id.menu_delete: {
- deleteSelectedContacts();
- return true;
- }
- case R.id.export_database: {
- final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE");
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
- ImplicitIntentsUtil.startActivityOutsideApp(this, intent);
- return true;
- }
- }
- return super.onOptionsItemSelected(item);
- }
-
- private void showImportExportDialogFragment(){
- ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
- PeopleActivity.class, ImportExportDialogFragment.EXPORT_MODE_ALL_CONTACTS);
- }
-
- @Override
- public boolean onSearchRequested() { // Search key pressed.
- if (!mActionBarAdapter.isSelectionMode()) {
- mActionBarAdapter.setSearchMode(true);
- }
- return true;
- }
-
- /**
- * Share all contacts that are currently selected in mAllFragment. This method is pretty
- * inefficient for handling large numbers of contacts. I don't expect this to be a problem.
- */
- private void shareSelectedContacts() {
- final StringBuilder uriListBuilder = new StringBuilder();
- for (Long contactId : mAllFragment.getSelectedContactIds()) {
- final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
- final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), contactUri);
- if (lookupUri == null) {
- continue;
- }
- final List<String> pathSegments = lookupUri.getPathSegments();
- if (pathSegments.size() < 2) {
- continue;
- }
- final String lookupKey = pathSegments.get(pathSegments.size() - 2);
- if (uriListBuilder.length() > 0) {
- uriListBuilder.append(':');
- }
- uriListBuilder.append(Uri.encode(lookupKey));
- }
- if (uriListBuilder.length() == 0) {
- return;
- }
- final Uri uri = Uri.withAppendedPath(
- Contacts.CONTENT_MULTI_VCARD_URI,
- Uri.encode(uriListBuilder.toString()));
- final Intent intent = new Intent(Intent.ACTION_SEND);
- intent.setType(Contacts.CONTENT_VCARD_TYPE);
- intent.putExtra(Intent.EXTRA_STREAM, uri);
- try {
- startActivityForResult(Intent.createChooser(intent, getResources().getQuantityString(
- R.plurals.title_share_via,
- /* quantity */ mAllFragment.getSelectedContactIds().size()))
- , ACTIVITY_REQUEST_CODE_SHARE);
- } catch (final ActivityNotFoundException ex) {
- Toast.makeText(this, R.string.share_error, Toast.LENGTH_SHORT).show();
- }
- }
-
- private void joinSelectedContacts() {
- final Intent intent = ContactSaveService.createJoinSeveralContactsIntent(
- this, mAllFragment.getSelectedContactIdsArray());
- this.startService(intent);
-
- mActionBarAdapter.setSelectionMode(false);
- }
-
- private void deleteSelectedContacts() {
- ContactMultiDeletionInteraction.start(PeopleActivity.this,
- mAllFragment.getSelectedContactIds());
- }
-
- @Override
- public void onDeletionFinished() {
- // The parameters count and numSelected are both the number of contacts before deletion.
- Logger.logListEvent(ListEvent.ActionType.DELETE,
- /* listType */ getListTypeIncludingSearch(),
- /* count */ mAllFragment.getAdapter().getCount(), /* clickedIndex */ -1,
- /* numSelected */ mAllFragment.getSelectedContactIds().size());
- mActionBarAdapter.setSelectionMode(false);
- }
-
- private int getListTypeIncludingSearch() {
- return mAllFragment.isSearchMode()
- ? ListEvent.ListType.SEARCH_RESULT : mAllFragment.getListType();
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch (requestCode) {
- // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
- // anymore
- case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
- if (resultCode == RESULT_OK) {
- mAllFragment.onPickerResult(data);
- }
- case ACTIVITY_REQUEST_CODE_SHARE:
- Logger.logListEvent(ListEvent.ActionType.SHARE,
- /* listType */ getListTypeIncludingSearch(),
- /* count */ mAllFragment.getAdapter().getCount(), /* clickedIndex */ -1,
- /* numSelected */ mAllFragment.getAdapter().getSelectedContactIds().size());
-
-// TODO fix or remove multipicker code
-// else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
-// // Finish the activity if the sub activity was canceled as back key is used
-// // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
-// finish();
-// }
-// break;
- }
- }
-
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
- // TODO move to the fragment
-
// Bring up the search UI if the user starts typing
final int unicodeChar = event.getUnicodeChar();
if ((unicodeChar != 0)
// If COMBINING_ACCENT is set, it's not a unicode character.
&& ((unicodeChar & KeyCharacterMap.COMBINING_ACCENT) == 0)
&& !Character.isWhitespace(unicodeChar)) {
- if (mActionBarAdapter.isSelectionMode()) {
- // Ignore keyboard input when in selection mode.
- return true;
- }
- String query = new String(new int[]{unicodeChar}, 0, 1);
- if (!mActionBarAdapter.isSearchMode()) {
- mActionBarAdapter.setSearchMode(true);
- mActionBarAdapter.setQueryString(query);
+ if (mAllFragment.onKeyDown(unicodeChar)) {
return true;
}
}
@@ -1376,184 +619,101 @@
return;
}
+ // Handle the back event in drawer first.
if (mDrawer.isDrawerOpen(GravityCompat.START)) {
mDrawer.closeDrawer(GravityCompat.START);
- } else if (FeatureHighlightHelper.tryRemoveHighlight(this)) {
return;
- } else if (mActionBarAdapter.isSelectionMode()) {
- mActionBarAdapter.setSelectionMode(false);
- mAllFragment.displayCheckBoxes(false);
- } else if (mActionBarAdapter.isSearchMode()) {
- mActionBarAdapter.setSearchMode(false);
+ }
+ // Handle the back event in "second level".
+ if (isGroupView()) {
+ onBackPressedGroupView();
+ return;
+ }
+
+ if (isDuplicatesView()) {
+ switchToAllContacts();
+ return;
+ }
+
+ // If feature highlight is present, let it handle the back event before mAllFragment.
+ if (FeatureHighlightHelper.tryRemoveHighlight(this)) {
+ return;
+ }
+
+ // Handle the back event in "first level" - mAllFragment.
+ if (maybeHandleInAllFragment()) {
+ return;
+ }
+
+ super.onBackPressed();
+ }
+
+ private void onBackPressedGroupView() {
+ if (mMembersFragment.isEditMode()) {
+ mMembersFragment.exitEditMode();
+ } else if (mMembersFragment.getActionBarAdapter().isSelectionMode()) {
+ mMembersFragment.getActionBarAdapter().setSelectionMode(false);
+ mMembersFragment.displayCheckBoxes(false);
+ } else if (mMembersFragment.getActionBarAdapter().isSearchMode()) {
+ mMembersFragment.getActionBarAdapter().setSearchMode(false);
+ } else {
+ switchToAllContacts();
+ }
+ }
+
+ // Returns true if back event is handled in this method.
+ private boolean maybeHandleInAllFragment() {
+ if (isAllFragmentInSelectionMode()) {
+ mAllFragment.getActionBarAdapter().setSelectionMode(false);
+ return true;
+ }
+
+ if (isAllFragmentInSearchMode()) {
+ mAllFragment.getActionBarAdapter().setSearchMode(false);
if (mAllFragment.wasSearchResultClicked()) {
mAllFragment.resetSearchResultClicked();
} else {
Logger.logScreenView(this, ScreenType.SEARCH_EXIT);
Logger.logSearchEvent(mAllFragment.createSearchState());
}
- } else if (!isAllContactsFilter(mContactListFilterController.getFilter())) {
- switchToAllContacts();
- } else {
- super.onBackPressed();
+ return true;
}
+
+ if (!AccountFilterUtil.isAllContactsFilter(mContactListFilterController.getFilter())
+ && !mAllFragment.isHidden()) {
+ // If mAllFragment is hidden, then mContactsUnavailableFragment is visible so we
+ // don't need to switch to all contacts.
+ switchToAllContacts();
+ return true;
+ }
+
+ return false;
+ }
+
+ private boolean isAllFragmentInSelectionMode() {
+ return mAllFragment.getActionBarAdapter().isSelectionMode();
+ }
+
+ private boolean isAllFragmentInSearchMode() {
+ return mAllFragment.getActionBarAdapter().isSearchMode();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- mActionBarAdapter.onSaveInstanceState(outState);
-
- // Clear the listener to make sure we don't get callbacks after onSaveInstanceState,
- // in order to avoid doing fragment transactions after it.
- // TODO Figure out a better way to deal with the issue.
- mDisableOptionItemSelected = true;
- mActionBarAdapter.setListener(null);
- if (mTabPager != null) {
- mTabPager.setOnPageChangeListener(null);
- }
+ outState.putParcelable(KEY_GROUP_URI, mGroupUri);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
- // In our own lifecycle, the focus is saved and restore but later taken away by the
- // ViewPager. As a hack, we force focus on the SearchView if we know that we are searching.
- // This fixes the keyboard going away on screen rotation
- if (mActionBarAdapter.isSearchMode()) {
- mActionBarAdapter.setFocusOnSearchView();
- }
- }
-
- @Override
- public DialogManager getDialogManager() {
- return mDialogManager;
- }
-
- @Override
- public void onClick(View view) {
- switch (view.getId()) {
- case R.id.floating_action_button:
- onFabClicked();
- break;
- default:
- Log.wtf(TAG, "Unexpected onClick event from " + view);
- }
- }
-
- public void onFabClicked() {
- final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
- // Copy our extras into the new intent.
- intent.putExtras(getIntent());
-
- final ContactListFilter filter = mContactListFilterController.getFilter();
- // If we are in account view, we pass the account explicitly in order to
- // create contact in the account. This will prevent the default account dialog
- // from being displayed.
- if (!isAllContactsFilter(filter) && filter.accountName != null &&
- filter.accountType != null) {
- final Account account = new Account(filter.accountName, filter.accountType);
- intent.putExtra(Intents.Insert.EXTRA_ACCOUNT, account);
- intent.putExtra(Intents.Insert.EXTRA_DATA_SET, filter.dataSet);
- } else if (isDeviceContactsFilter(filter)) {
- // It's OK to add this even though it's an implicit intent. If a different app
- // receives the intent it should just ignore the flag.
- intent.putExtra(CompactContactEditorActivity.EXTRA_SAVE_TO_DEVICE_FLAG, true);
- }
-
- try {
- ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
- } catch (ActivityNotFoundException ex) {
- Toast.makeText(PeopleActivity.this, R.string.missing_app,
- Toast.LENGTH_SHORT).show();
- }
- }
-
- /**
- * Returns the tab position adjusted for the text direction.
- */
- private int getTabPositionForTextDirection(int position) {
- if (isRTL()) {
- return TabState.COUNT - 1 - position;
- }
- return position;
- }
-
- private void setFilterAndUpdateTitle(ContactListFilter filter) {
- setFilterAndUpdateTitle(filter, true);
- }
-
- private void setFilterAndUpdateTitle(ContactListFilter filter, boolean restoreSelectedUri) {
- mAllFragment.setFilter(filter, restoreSelectedUri);
-
- mAllFragment.setListType(mContactListFilterController.getFilterListType());
-
- updateFilterMenu(filter);
-
- if (getSupportActionBar() != null) {
- String actionBarTitle;
- if (filter.filterType == ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS &&
- filter.accountName == null) {
- actionBarTitle = getString(R.string.account_phone);
- } else if (!TextUtils.isEmpty(filter.accountName)) {
- actionBarTitle = getActionBarTitleForAccount(filter);
- } else {
- actionBarTitle = getString(R.string.contactsList);
- }
- getSupportActionBar().setTitle(actionBarTitle);
- if (CompatUtils.isNCompatible()) {
- this.setTitle(actionBarTitle);
- getWindow().getDecorView()
- .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
- }
- }
- }
-
- private String getActionBarTitleForAccount(ContactListFilter filter) {
- final AccountDisplayInfoFactory factory =
- AccountDisplayInfoFactory.forWritableAccounts(this);
- final AccountDisplayInfo displayableAccount = factory.getAccountDisplayInfoFor(filter);
- if (displayableAccount.hasGoogleAccountType()) {
- return getString(R.string.title_from_google);
- } else {
- return displayableAccount.withFormattedName(this, R.string.title_from_other_accounts)
- .getNameLabel().toString();
- }
- }
-
- // Persist filter only when it's of the type FILTER_TYPE_ALL_ACCOUNTS.
- private void persistFilterIfNeeded(ContactListFilter filter) {
- mContactListFilterController.setContactListFilter(filter,
- /* persistent */ isAllContactsFilter(filter));
- }
-
- private boolean isAllContactsFilter(ContactListFilter filter) {
- return filter != null && filter.isContactsFilterType();
- }
-
- private boolean isDeviceContactsFilter(ContactListFilter filter) {
- return filter.filterType == ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS;
- }
-
- @Override
- protected boolean shouldFinish() {
- return false;
- }
-
- @Override
- protected ContactListFilter getContactListFilter() {
- return mContactListFilterController.getFilter();
- }
-
- @Override
- public void onLoadFinishedCallback() {
- maybeShowHamburgerFeatureHighlight();
+ mGroupUri = savedInstanceState.getParcelable(KEY_GROUP_URI);
}
private void onGroupDeleted(Intent intent) {
- if (!ContactSaveService.canUndo(intent)) {
- return;
- }
+ if (!ContactSaveService.canUndo(intent)) return;
+
Snackbar.make(mLayoutRoot, getString(R.string.groupDeletedToast), Snackbar.LENGTH_LONG)
.setAction(R.string.undo, new View.OnClickListener() {
@Override
@@ -1575,4 +735,121 @@
}
}
}
+
+ @Override
+ protected void onGroupMenuItemClicked(long groupId, String title) {
+ if (isGroupView() && mMembersFragment != null
+ && mMembersFragment.isCurrentGroup(groupId)) {
+ return;
+ }
+ mGroupUri = ContentUris.withAppendedId(ContactsContract.Groups.CONTENT_URI, groupId);
+ switchToOrUpdateGroupView(GroupUtil.ACTION_SWITCH_GROUP);
+ }
+
+ @Override
+ protected void onFilterMenuItemClicked(Intent intent) {
+ // We must pop second level first to "restart" mAllFragment, before changing filter.
+ if (isInSecondLevel()) {
+ popSecondLevel();
+ showFabWithAnimation(/* showFab */ true);
+ }
+ mCurrentView = ContactsView.ACCOUNT_VIEW;
+ super.onFilterMenuItemClicked(intent);
+ }
+
+ private void switchToOrUpdateGroupView(String action) {
+ final boolean shouldUpdate = mMembersFragment != null;
+ switchView(ContactsView.GROUP_VIEW);
+ if (shouldUpdate) {
+ mMembersFragment.updateExistingGroupFragment(mGroupUri, action);
+ }
+ }
+
+ @Override
+ protected void launchFindDuplicates() {
+ switchView(ContactsView.DUPLICATES);
+ }
+
+ private void switchView(ContactsView contactsView) {
+ mCurrentView = contactsView;
+
+ final FragmentManager fragmentManager = getFragmentManager();
+ final FragmentTransaction transaction = fragmentManager.beginTransaction();
+ if (isGroupView()) {
+ if (mMembersFragment == null) {
+ mMembersFragment = GroupMembersFragment.newInstance(mGroupUri);
+ }
+ transaction.replace(
+ R.id.contacts_list_container, mMembersFragment, TAG_GROUP_VIEW);
+ } else if (isDuplicatesView()) {
+ final Fragment duplicatesFragment = ObjectFactory.getDuplicatesFragment();
+ final Fragment duplicatesUtilFragment = ObjectFactory.getDuplicatesUtilFragment();
+ if (duplicatesFragment != null && duplicatesUtilFragment != null) {
+ duplicatesUtilFragment.setTargetFragment(duplicatesFragment, /* requestCode */ 0);
+ transaction.replace(
+ R.id.contacts_list_container, duplicatesFragment, TAG_DUPLICATES);
+ transaction.add(duplicatesUtilFragment, TAG_DUPLICATES_UTIL);
+ }
+ }
+ transaction.addToBackStack(TAG_SECOND_LEVEL);
+ transaction.commit();
+ fragmentManager.executePendingTransactions();
+
+ showFabWithAnimation(/* showFab */ false);
+ }
+
+ @Override
+ public void switchToAllContacts() {
+ if (isInSecondLevel()) {
+ popSecondLevel();
+ }
+ mShouldSwitchToAllContacts = false;
+ mCurrentView = ContactsView.ALL_CONTACTS;
+ showFabWithAnimation(/* showFab */ true);
+
+ super.switchToAllContacts();
+ }
+
+ private void popSecondLevel() {
+ getFragmentManager().popBackStackImmediate(
+ TAG_SECOND_LEVEL, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ mMembersFragment = null;
+ }
+
+ @Override
+ protected DefaultContactBrowseListFragment getAllFragment() {
+ return mAllFragment;
+ }
+
+ @Override
+ protected GroupMembersFragment getGroupFragment() {
+ return mMembersFragment;
+ }
+
+ @Override
+ protected GroupMetaData getGroupMetaData() {
+ return mMembersFragment == null ? null : mMembersFragment.getGroupMetaData();
+ }
+
+ private void handleFilterChangeForFragment(ContactListFilter filter) {
+ mAllFragment.setFilterAndUpdateTitle(filter);
+ // Scroll to top after filter is changed.
+ mAllFragment.scrollToTop();
+ }
+
+ private void handleFilterChangeForActivity(ContactListFilter filter) {
+ // Set mShouldSwitchToAllContacts to true, so that we can switch to all contacts later.
+ if (filter.isContactsFilterType()) {
+ mShouldSwitchToAllContacts = true;
+ }
+
+ // Check menu in navigation drawer.
+ updateFilterMenu(filter);
+
+ if (CompatUtils.isNCompatible()) {
+ getWindow().getDecorView()
+ .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+ }
+ invalidateOptionsMenu();
+ }
}
diff --git a/src/com/android/contacts/common/Experiments.java b/src/com/android/contacts/common/Experiments.java
index 65de230..4487b45 100644
--- a/src/com/android/contacts/common/Experiments.java
+++ b/src/com/android/contacts/common/Experiments.java
@@ -21,6 +21,11 @@
public final class Experiments {
/**
+ * Whether to open contact sheet (aka smart profile) instead of our own QuickContact.
+ */
+ public static final String CONTACT_SHEET = "QuickContact__contact_sheet";
+
+ /**
* Flags for maximum content update time
*/
public static final String DYNAMIC_MAX_CONTENT_CHANGE_UPDATE_DELAY_MILLIS =
@@ -37,6 +42,21 @@
*/
public static final String DYNAMIC_SHORTCUTS = "Shortcuts__dynamic_shortcuts";
+ /**
+ * Experiment to toggle contacts sync using the pull to refresh gesture.
+ */
+ public static final String PULL_TO_REFRESH = "PullToRefresh__pull_to_refresh";
+
+ /**
+ * Search study boolean indicating whether to inject yenta search results before CP2 results.
+ */
+ public static final String SEARCH_YENTA = "Search__yenta";
+
+ /**
+ * The time to wait for Yenta search results before giving up.
+ */
+ public static final String SEARCH_YENTA_TIMEOUT_MILLIS = "Search__yenta_timeout";
+
private Experiments() {
}
}
diff --git a/src/com/android/contacts/common/interactions/ExportDialogFragment.java b/src/com/android/contacts/common/interactions/ExportDialogFragment.java
new file mode 100644
index 0000000..84a43dd
--- /dev/null
+++ b/src/com/android/contacts/common/interactions/ExportDialogFragment.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.common.interactions;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract.Contacts;
+import android.telephony.SubscriptionManager;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.android.contacts.common.R;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
+import com.android.contacts.common.vcard.ExportVCardActivity;
+import com.android.contacts.common.vcard.ShareVCardActivity;
+import com.android.contacts.common.vcard.VCardCommonArguments;
+
+/**
+ * An dialog invoked to import/export contacts.
+ */
+public class ExportDialogFragment extends DialogFragment {
+ public static final String TAG = "ExportDialogFragment";
+
+ public static final int EXPORT_MODE_FAVORITES = 0;
+ public static final int EXPORT_MODE_ALL_CONTACTS = 1;
+ public static final int EXPORT_MODE_DEFAULT = -1;
+
+ private static int mExportMode = EXPORT_MODE_DEFAULT;
+
+ private final String[] LOOKUP_PROJECTION = new String[] {
+ Contacts.LOOKUP_KEY
+ };
+
+ private SubscriptionManager mSubscriptionManager;
+
+ /** Preferred way to show this dialog */
+ public static void show(FragmentManager fragmentManager, Class callingActivity,
+ int exportMode) {
+ final ExportDialogFragment fragment = new ExportDialogFragment();
+ Bundle args = new Bundle();
+ args.putString(VCardCommonArguments.ARG_CALLING_ACTIVITY, callingActivity.getName());
+ fragment.setArguments(args);
+ fragment.show(fragmentManager, TAG);
+ mExportMode = exportMode;
+ }
+
+ @Override
+ public Context getContext() {
+ return getActivity();
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ // Wrap our context to inflate list items using the correct theme
+ final Resources res = getActivity().getResources();
+ final LayoutInflater dialogInflater = (LayoutInflater)getActivity()
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ final String callingActivity = getArguments().getString(
+ VCardCommonArguments.ARG_CALLING_ACTIVITY);
+
+ // Adapter that shows a list of string resources
+ final ArrayAdapter<AdapterEntry> adapter = new ArrayAdapter<AdapterEntry>(getActivity(),
+ R.layout.select_dialog_item) {
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final TextView result = (TextView)(convertView != null ? convertView :
+ dialogInflater.inflate(R.layout.select_dialog_item, parent, false));
+
+ result.setText(getItem(position).mLabel);
+ return result;
+ }
+ };
+
+ if (res.getBoolean(R.bool.config_allow_export)) {
+ adapter.add(new AdapterEntry(getString(R.string.export_to_vcf_file),
+ R.string.export_to_vcf_file));
+ }
+ if (res.getBoolean(R.bool.config_allow_share_contacts)) {
+ if (mExportMode == EXPORT_MODE_FAVORITES) {
+ // share favorite and frequently contacted contacts from Favorites tab
+ adapter.add(new AdapterEntry(getString(R.string.share_favorite_contacts),
+ R.string.share_contacts));
+ } else {
+ // share "all" contacts (in groups selected in "Customize") from All tab for now
+ // TODO: change the string to share_visible_contacts if implemented
+ adapter.add(new AdapterEntry(getString(R.string.share_contacts),
+ R.string.share_contacts));
+ }
+ }
+
+ final DialogInterface.OnClickListener clickListener =
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ boolean dismissDialog;
+ final int resId = adapter.getItem(which).mChoiceResourceId;
+ if (resId == R.string.export_to_vcf_file) {
+ dismissDialog = true;
+ final Intent exportIntent = new Intent(
+ getActivity(), ExportVCardActivity.class);
+ exportIntent.putExtra(VCardCommonArguments.ARG_CALLING_ACTIVITY,
+ callingActivity);
+ getActivity().startActivity(exportIntent);
+ } else if (resId == R.string.share_contacts) {
+ dismissDialog = true;
+ if (mExportMode == EXPORT_MODE_FAVORITES) {
+ doShareFavoriteContacts();
+ } else { // EXPORT_MODE_ALL_CONTACTS
+ final Intent exportIntent = new Intent(
+ getActivity(), ShareVCardActivity.class);
+ exportIntent.putExtra(VCardCommonArguments.ARG_CALLING_ACTIVITY,
+ callingActivity);
+ getActivity().startActivity(exportIntent);
+ }
+ } else {
+ dismissDialog = true;
+ Log.e(TAG, "Unexpected resource: "
+ + getActivity().getResources().getResourceEntryName(resId));
+ }
+ if (dismissDialog) {
+ dialog.dismiss();
+ }
+ }
+ };
+ final TextView title = (TextView) View.inflate(getActivity(), R.layout.dialog_title, null);
+ title.setText(R.string.dialog_export);
+ return new AlertDialog.Builder(getActivity())
+ .setCustomTitle(title)
+ .setSingleChoiceItems(adapter, -1, clickListener)
+ .create();
+ }
+
+ private void doShareFavoriteContacts() {
+ try{
+ final Cursor cursor = getActivity().getContentResolver().query(
+ Contacts.CONTENT_STREQUENT_URI, LOOKUP_PROJECTION, null, null,
+ Contacts.DISPLAY_NAME + " COLLATE NOCASE ASC");
+ if (cursor != null) {
+ try {
+ if (!cursor.moveToFirst()) {
+ Toast.makeText(getActivity(), R.string.no_contact_to_share,
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ // Build multi-vcard Uri for sharing
+ final StringBuilder uriListBuilder = new StringBuilder();
+ int index = 0;
+ do {
+ if (index != 0)
+ uriListBuilder.append(':');
+ uriListBuilder.append(cursor.getString(0));
+ index++;
+ } while (cursor.moveToNext());
+ final Uri uri = Uri.withAppendedPath(
+ Contacts.CONTENT_MULTI_VCARD_URI,
+ Uri.encode(uriListBuilder.toString()));
+
+ final Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.setType(Contacts.CONTENT_VCARD_TYPE);
+ intent.putExtra(Intent.EXTRA_STREAM, uri);
+ ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
+ } finally {
+ cursor.close();
+ }
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Sharing contacts failed", e);
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(getContext(), R.string.share_contacts_failure,
+ Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+ }
+
+ private static class AdapterEntry {
+ public final CharSequence mLabel;
+ public final int mChoiceResourceId;
+ public final int mSubscriptionId;
+
+ public AdapterEntry(CharSequence label, int resId, int subId) {
+ mLabel = label;
+ mChoiceResourceId = resId;
+ mSubscriptionId = subId;
+ }
+
+ public AdapterEntry(String label, int resId) {
+ // Store a nonsense value for mSubscriptionId. If this constructor is used,
+ // the mSubscriptionId value should not be read later.
+ this(label, resId, /* subId = */ -1);
+ }
+ }
+}
diff --git a/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
similarity index 65%
rename from src/com/android/contacts/common/interactions/ImportExportDialogFragment.java
rename to src/com/android/contacts/common/interactions/ImportDialogFragment.java
index 7e1b487..0c0ce73 100644
--- a/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java
+++ b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
@@ -23,10 +23,7 @@
import android.app.FragmentManager;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.Intent;
import android.content.res.Resources;
-import android.database.Cursor;
-import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
import android.telephony.SubscriptionInfo;
@@ -39,40 +36,29 @@
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
-import android.widget.Toast;
import com.android.contacts.common.R;
import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
-import com.android.contacts.common.editor.SelectAccountDialogFragment;
import com.android.contacts.common.model.AccountTypeManager;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.util.AccountSelectionUtil;
import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
-import com.android.contacts.common.util.ImplicitIntentsUtil;
-import com.android.contacts.common.vcard.ExportVCardActivity;
import com.android.contacts.common.vcard.VCardCommonArguments;
-import com.android.contacts.common.vcard.ShareVCardActivity;
-import com.android.contactsbind.analytics.AnalyticsUtil;
+import com.android.contacts.editor.SelectAccountDialogFragment;
import java.util.List;
/**
* An dialog invoked to import/export contacts.
*/
-public class ImportExportDialogFragment extends DialogFragment
+public class ImportDialogFragment extends DialogFragment
implements SelectAccountDialogFragment.Listener {
- public static final String TAG = "ImportExportDialogFragment";
-
- public static final int EXPORT_MODE_FAVORITES = 0;
- public static final int EXPORT_MODE_ALL_CONTACTS = 1;
- public static final int EXPORT_MODE_DEFAULT = -1;
+ public static final String TAG = "ImportDialogFragment";
private static final String KEY_RES_ID = "resourceId";
private static final String KEY_SUBSCRIPTION_ID = "subscriptionId";
- private static final String ARG_CONTACTS_ARE_AVAILABLE = "CONTACTS_ARE_AVAILABLE";
- private static int mExportMode = EXPORT_MODE_DEFAULT;
private final String[] LOOKUP_PROJECTION = new String[] {
Contacts.LOOKUP_KEY
@@ -81,15 +67,12 @@
private SubscriptionManager mSubscriptionManager;
/** Preferred way to show this dialog */
- public static void show(FragmentManager fragmentManager, boolean contactsAreAvailable,
- Class callingActivity, int exportMode) {
- final ImportExportDialogFragment fragment = new ImportExportDialogFragment();
+ public static void show(FragmentManager fragmentManager, Class callingActivity) {
+ final ImportDialogFragment fragment = new ImportDialogFragment();
Bundle args = new Bundle();
- args.putBoolean(ARG_CONTACTS_ARE_AVAILABLE, contactsAreAvailable);
args.putString(VCardCommonArguments.ARG_CALLING_ACTIVITY, callingActivity.getName());
fragment.setArguments(args);
- fragment.show(fragmentManager, ImportExportDialogFragment.TAG);
- mExportMode = exportMode;
+ fragment.show(fragmentManager, TAG);
}
@Override
@@ -108,7 +91,6 @@
final Resources res = getActivity().getResources();
final LayoutInflater dialogInflater = (LayoutInflater)getActivity()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- final boolean contactsAreAvailable = getArguments().getBoolean(ARG_CONTACTS_ARE_AVAILABLE);
final String callingActivity = getArguments().getString(
VCardCommonArguments.ARG_CALLING_ACTIVITY);
@@ -162,24 +144,6 @@
}
}
- if (res.getBoolean(R.bool.config_allow_export)) {
- if (contactsAreAvailable) {
- adapter.add(new AdapterEntry(getString(R.string.export_to_vcf_file),
- R.string.export_to_vcf_file));
- }
- }
- if (res.getBoolean(R.bool.config_allow_share_contacts) && contactsAreAvailable) {
- if (mExportMode == EXPORT_MODE_FAVORITES) {
- // share favorite and frequently contacted contacts from Favorites tab
- adapter.add(new AdapterEntry(getString(R.string.share_favorite_contacts),
- R.string.share_contacts));
- } else {
- // share "all" contacts (in groups selected in "Customize") from All tab for now
- // TODO: change the string to share_visible_contacts if implemented
- adapter.add(new AdapterEntry(getString(R.string.share_contacts),
- R.string.share_contacts));
- }
- }
final DialogInterface.OnClickListener clickListener =
new DialogInterface.OnClickListener() {
@@ -190,24 +154,6 @@
if (resId == R.string.import_from_sim || resId == R.string.import_from_vcf_file) {
dismissDialog = handleImportRequest(resId,
adapter.getItem(which).mSubscriptionId);
- } else if (resId == R.string.export_to_vcf_file) {
- dismissDialog = true;
- final Intent exportIntent = new Intent(
- getActivity(), ExportVCardActivity.class);
- exportIntent.putExtra(VCardCommonArguments.ARG_CALLING_ACTIVITY,
- callingActivity);
- getActivity().startActivity(exportIntent);
- } else if (resId == R.string.share_contacts) {
- dismissDialog = true;
- if (mExportMode == EXPORT_MODE_FAVORITES) {
- doShareFavoriteContacts();
- } else { // EXPORT_MODE_ALL_CONTACTS
- final Intent exportIntent = new Intent(
- getActivity(), ShareVCardActivity.class);
- exportIntent.putExtra(VCardCommonArguments.ARG_CALLING_ACTIVITY,
- callingActivity);
- getActivity().startActivity(exportIntent);
- }
} else {
dismissDialog = true;
Log.e(TAG, "Unexpected resource: "
@@ -219,61 +165,13 @@
}
};
final TextView title = (TextView) View.inflate(getActivity(), R.layout.dialog_title, null);
- title.setText(contactsAreAvailable
- ? R.string.dialog_import_export
- : R.string.dialog_import);
+ title.setText(R.string.dialog_import);
return new AlertDialog.Builder(getActivity())
.setCustomTitle(title)
.setSingleChoiceItems(adapter, -1, clickListener)
.create();
}
- private void doShareFavoriteContacts() {
- try{
- final Cursor cursor = getActivity().getContentResolver().query(
- Contacts.CONTENT_STREQUENT_URI, LOOKUP_PROJECTION, null, null,
- Contacts.DISPLAY_NAME + " COLLATE NOCASE ASC");
- if (cursor != null) {
- try {
- if (!cursor.moveToFirst()) {
- Toast.makeText(getActivity(), R.string.no_contact_to_share,
- Toast.LENGTH_SHORT).show();
- return;
- }
-
- // Build multi-vcard Uri for sharing
- final StringBuilder uriListBuilder = new StringBuilder();
- int index = 0;
- do {
- if (index != 0)
- uriListBuilder.append(':');
- uriListBuilder.append(cursor.getString(0));
- index++;
- } while (cursor.moveToNext());
- final Uri uri = Uri.withAppendedPath(
- Contacts.CONTENT_MULTI_VCARD_URI,
- Uri.encode(uriListBuilder.toString()));
-
- final Intent intent = new Intent(Intent.ACTION_SEND);
- intent.setType(Contacts.CONTENT_VCARD_TYPE);
- intent.putExtra(Intent.EXTRA_STREAM, uri);
- ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
- } finally {
- cursor.close();
- }
- }
- } catch (Exception e) {
- Log.e(TAG, "Sharing contacts failed", e);
- getActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- Toast.makeText(getContext(), R.string.share_contacts_failure,
- Toast.LENGTH_SHORT).show();
- }
- });
- }
- }
-
/**
* Handle "import from SIM" and "import from SD".
*
diff --git a/src/com/android/contacts/common/list/ContactEntryListFragment.java b/src/com/android/contacts/common/list/ContactEntryListFragment.java
index 0c72d68..387b303 100644
--- a/src/com/android/contacts/common/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/common/list/ContactEntryListFragment.java
@@ -119,7 +119,7 @@
private boolean mEnabled = true;
private T mAdapter;
- private View mView;
+ protected View mView;
private ListView mListView;
/**
diff --git a/src/com/android/contacts/common/list/ContactListFilter.java b/src/com/android/contacts/common/list/ContactListFilter.java
index 8e29308..c6baf41 100644
--- a/src/com/android/contacts/common/list/ContactListFilter.java
+++ b/src/com/android/contacts/common/list/ContactListFilter.java
@@ -16,6 +16,7 @@
package com.android.contacts.common.list;
+import android.accounts.Account;
import android.content.SharedPreferences;
import android.graphics.drawable.Drawable;
import android.net.Uri;
@@ -26,6 +27,10 @@
import com.android.contacts.common.logging.ListEvent;
import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.GoogleAccountType;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* Contact list filter parameters.
@@ -386,4 +391,59 @@
return "(unknown)";
}
}
+
+ /**
+ * Returns true if this ContactListFilter contains at least one Google account.
+ * (see {@link #isGoogleAccountType)
+ */
+ public boolean isSyncable(List<AccountWithDataSet> accounts) {
+ // TODO(samchen): Check FILTER_TYPE_CUSTOM
+ if (isGoogleAccountType() && filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
+ return true;
+ }
+ if (filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS
+ || filterType == ContactListFilter.FILTER_TYPE_DEFAULT) {
+ if (accounts != null && accounts.size() > 0) {
+ // If we're showing all contacts and there is any Google account on the device then
+ // we're syncable.
+ for (AccountWithDataSet account : accounts) {
+ if (GoogleAccountType.ACCOUNT_TYPE.equals(account.type)
+ && account.dataSet == null) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns the Google accounts (see {@link #isGoogleAccountType) for this ContactListFilter.
+ */
+ public List<Account> getSyncableAccounts(List<AccountWithDataSet> accounts) {
+ final List<Account> syncableAccounts = new ArrayList<>();
+ // TODO(samchen): Check FILTER_TYPE_CUSTOM
+ if (isGoogleAccountType() && filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
+ syncableAccounts.add(new Account(accountName, accountType));
+ } else if (filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS
+ || filterType == ContactListFilter.FILTER_TYPE_DEFAULT) {
+ if (accounts != null && accounts.size() > 0) {
+ for (AccountWithDataSet account : accounts) {
+ if (GoogleAccountType.ACCOUNT_TYPE.equals(account.type)
+ && account.dataSet == null) {
+ syncableAccounts.add(new Account(account.name, account.type));
+ }
+ }
+ }
+ }
+ return syncableAccounts;
+ }
+
+ /**
+ * Returns true if this ContactListFilter is Google account type. (i.e. where
+ * accountType = "com.google" and dataSet = null)
+ */
+ public boolean isGoogleAccountType() {
+ return GoogleAccountType.ACCOUNT_TYPE.equals(accountType) && dataSet == null;
+ }
}
diff --git a/src/com/android/contacts/common/list/DefaultContactListAdapter.java b/src/com/android/contacts/common/list/DefaultContactListAdapter.java
index cf3f6f6..faade9e 100644
--- a/src/com/android/contacts/common/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/common/list/DefaultContactListAdapter.java
@@ -31,6 +31,7 @@
import android.text.TextUtils;
import android.view.View;
+import com.android.contacts.common.Experiments;
import com.android.contacts.common.compat.ContactsCompat;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.preference.ContactsPreferences;
@@ -115,6 +116,13 @@
loader.setUri(builder.build());
loader.setProjection(getProjection(true));
sortOrder = STREQUENT_SORT;
+ if (Flags.getInstance(getContext()).getBoolean(Experiments.SEARCH_YENTA)
+ && loader instanceof FavoritesAndContactsLoader
+ && directoryId == Directory.DEFAULT) {
+ final FavoritesAndContactsLoader favoritesAndContactsLoader =
+ (FavoritesAndContactsLoader) loader;
+ favoritesAndContactsLoader.setAutocompleteQuery(query);
+ }
}
} else {
final ContactListFilter filter = getFilter();
diff --git a/src/com/android/contacts/common/list/DirectoryListLoader.java b/src/com/android/contacts/common/list/DirectoryListLoader.java
index c45a3ca..13d0f92 100644
--- a/src/com/android/contacts/common/list/DirectoryListLoader.java
+++ b/src/com/android/contacts/common/list/DirectoryListLoader.java
@@ -199,11 +199,13 @@
mDefaultDirectoryList.addRow(new Object[] {
Directory.DEFAULT,
getContext().getString(R.string.contactsList),
+ null,
null
});
mDefaultDirectoryList.addRow(new Object[] {
Directory.LOCAL_INVISIBLE,
getContext().getString(R.string.local_invisible_directory),
+ null,
null
});
}
diff --git a/src/com/android/contacts/common/list/FavoritesAndContactsLoader.java b/src/com/android/contacts/common/list/FavoritesAndContactsLoader.java
index d1ae911..82440b7 100644
--- a/src/com/android/contacts/common/list/FavoritesAndContactsLoader.java
+++ b/src/com/android/contacts/common/list/FavoritesAndContactsLoader.java
@@ -19,32 +19,39 @@
import android.content.CursorLoader;
import android.database.Cursor;
import android.database.MergeCursor;
-import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
+import android.util.Log;
+import com.android.contacts.common.Experiments;
+import com.android.contactsbind.ObjectFactory;
+import com.android.contactsbind.experiments.Flags;
+import com.android.contactsbind.search.AutocompleteHelper;
import com.google.common.collect.Lists;
import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
/**
* A loader for use in the default contact list, which will also query for favorite contacts
* if configured to do so.
*/
-public class FavoritesAndContactsLoader extends CursorLoader {
+public class FavoritesAndContactsLoader extends CursorLoader implements AutocompleteHelper.Listener {
private boolean mLoadFavorites;
private String[] mProjection;
- private Uri mExtraUri;
- private String[] mExtraProjection;
- private String mExtraSelection;
- private String[] mExtraSelectionArgs;
- private boolean mMergeExtraContactsAfterPrimary;
+ private String mAutocompleteQuery;
+ private CountDownLatch mAutocompleteLatch = new CountDownLatch(1);
+ private Cursor mAutocompleteCursor;
+ private int mAutocompleteTimeout;
public FavoritesAndContactsLoader(Context context) {
super(context);
+ mAutocompleteTimeout = Flags.getInstance(context).getInteger(
+ Experiments.SEARCH_YENTA_TIMEOUT_MILLIS);
}
/** Whether to load favorites and merge results in before any other results. */
@@ -52,54 +59,51 @@
mLoadFavorites = flag;
}
+ public void setAutocompleteQuery(String autocompleteQuery) {
+ mAutocompleteQuery = autocompleteQuery;
+ }
+
public void setProjection(String[] projection) {
super.setProjection(projection);
mProjection = projection;
}
- /** Configure an extra query and merge results in before the primary results. */
- public void setLoadExtraContactsFirst(Uri uri, String[] projection) {
- mExtraUri = uri;
- mExtraProjection = projection;
- mMergeExtraContactsAfterPrimary = false;
- }
-
- /** Configure an extra query and merge results in after the primary results. */
- public void setLoadExtraContactsLast(Uri uri, String[] projection, String selection,
- String[] selectionArgs) {
- mExtraUri = uri;
- mExtraProjection = projection;
- mExtraSelection = selection;
- mExtraSelectionArgs = selectionArgs;
- mMergeExtraContactsAfterPrimary = true;
- }
-
- private boolean canLoadExtraContacts() {
- return mExtraUri != null && mExtraProjection != null;
- }
-
@Override
public Cursor loadInBackground() {
List<Cursor> cursors = Lists.newArrayList();
if (mLoadFavorites) {
cursors.add(loadFavoritesContacts());
}
- if (canLoadExtraContacts() && !mMergeExtraContactsAfterPrimary) {
- cursors.add(loadExtraContacts());
+
+ if (mAutocompleteQuery != null) {
+ final AutocompleteHelper autocompleteHelper =
+ ObjectFactory.getAutocompleteHelper(getContext());
+ if (autocompleteHelper != null) {
+ autocompleteHelper.setListener(this);
+ autocompleteHelper.setProjection(mProjection);
+ autocompleteHelper.setQuery(mAutocompleteQuery);
+ try {
+ if (!mAutocompleteLatch.await(mAutocompleteTimeout, TimeUnit.MILLISECONDS)) {
+ logw("Timeout expired before receiving autocompletions");
+ }
+ } catch (InterruptedException e) {
+ logw("Interrupted while waiting for autocompletions");
+ }
+ if (mAutocompleteCursor != null) {
+ cursors.add(mAutocompleteCursor);
+ // TODO: exclude these results from the main loader results, see b/30742359
+ }
+ }
}
- // ContactsCursor.loadInBackground() can return null; MergeCursor
- // correctly handles null cursors.
- Cursor cursor = null;
- try {
- cursor = super.loadInBackground();
- } catch (NullPointerException | SecurityException e) {
- // Ignore NPEs and SecurityExceptions thrown by providers
+
+ // TODO: if the autocomplete experiment in on, only show those results even if they're empty
+ final Cursor contactsCursor = mAutocompleteQuery == null ? loadContacts() : null;
+ if (mAutocompleteQuery == null) {
+ cursors.add(contactsCursor);
}
- final Cursor contactsCursor = cursor;
- cursors.add(contactsCursor);
- if (canLoadExtraContacts() && mMergeExtraContactsAfterPrimary) {
- cursors.add(loadExtraContacts());
- }
+ // Guard against passing an empty array to the MergeCursor constructor
+ if (cursors.isEmpty()) cursors.add(null);
+
return new MergeCursor(cursors.toArray(new Cursor[cursors.size()])) {
@Override
public Bundle getExtras() {
@@ -109,14 +113,41 @@
};
}
- private Cursor loadExtraContacts() {
- return getContext().getContentResolver().query(
- mExtraUri, mExtraProjection, mExtraSelection, mExtraSelectionArgs, null);
+ private Cursor loadContacts() {
+ // ContactsCursor.loadInBackground() can return null; MergeCursor
+ // correctly handles null cursors.
+ try {
+ return super.loadInBackground();
+ } catch (NullPointerException | SecurityException e) {
+ // Ignore NPEs and SecurityExceptions thrown by providers
+ }
+ return null;
}
private Cursor loadFavoritesContacts() {
+ final StringBuilder selection = new StringBuilder();
+ selection.append(Contacts.STARRED + "=?");
+ final ContactListFilter filter =
+ ContactListFilterController.getInstance(getContext()).getFilter();
+ if (filter != null && filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
+ selection.append(" AND ").append(Contacts.IN_VISIBLE_GROUP + "=1");
+ }
return getContext().getContentResolver().query(
- Contacts.CONTENT_URI, mProjection, Contacts.STARRED + "=?", new String[]{"1"},
+ Contacts.CONTENT_URI, mProjection, selection.toString(), new String[]{"1"},
getSortOrder());
}
+
+ @Override
+ public void onAutocompletesAvailable(Cursor cursor) {
+ if (cursor != null && cursor.getCount() > 0) {
+ mAutocompleteCursor = cursor;
+ mAutocompleteLatch.countDown();
+ }
+ }
+
+ private static void logw(String message) {
+ if (Log.isLoggable(AutocompleteHelper.TAG, Log.WARN)) {
+ Log.w(AutocompleteHelper.TAG, message);
+ }
+ }
}
diff --git a/src/com/android/contacts/common/list/MultiSelectEntryContactListAdapter.java b/src/com/android/contacts/common/list/MultiSelectEntryContactListAdapter.java
index 9ab6e1c..dbfd70e 100644
--- a/src/com/android/contacts/common/list/MultiSelectEntryContactListAdapter.java
+++ b/src/com/android/contacts/common/list/MultiSelectEntryContactListAdapter.java
@@ -113,9 +113,6 @@
* Not guaranteed to work with all configurations of this adapter.
*/
public void setDisplayCheckBoxes(boolean showCheckBoxes) {
- if (!mDisplayCheckBoxes && showCheckBoxes) {
- setSelectedContactIds(new TreeSet<Long>());
- }
mDisplayCheckBoxes = showCheckBoxes;
notifyDataSetChanged();
if (mSelectedContactsListener != null) {
diff --git a/src/com/android/contacts/common/list/ViewPagerTabStrip.java b/src/com/android/contacts/common/list/ViewPagerTabStrip.java
deleted file mode 100644
index c8ae21a..0000000
--- a/src/com/android/contacts/common/list/ViewPagerTabStrip.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2014 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.common.list;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import com.android.contacts.common.R;
-
-public class ViewPagerTabStrip extends LinearLayout {
- private int mSelectedUnderlineThickness;
- private final Paint mSelectedUnderlinePaint;
-
- private int mIndexForSelection;
- private float mSelectionOffset;
-
- public ViewPagerTabStrip(Context context) {
- this(context, null);
- }
-
- public ViewPagerTabStrip(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- final Resources res = context.getResources();
-
- mSelectedUnderlineThickness =
- res.getDimensionPixelSize(R.dimen.tab_selected_underline_height);
- int underlineColor = res.getColor(R.color.tab_selected_underline_color);
- int backgroundColor = res.getColor(R.color.actionbar_background_color);
-
- mSelectedUnderlinePaint = new Paint();
- mSelectedUnderlinePaint.setColor(underlineColor);
-
- setBackgroundColor(backgroundColor);
- setWillNotDraw(false);
- }
-
- /**
- * Notifies this view that view pager has been scrolled. We save the tab index
- * and selection offset for interpolating the position and width of selection
- * underline.
- */
- void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- mIndexForSelection = position;
- mSelectionOffset = positionOffset;
- invalidate();
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- int childCount = getChildCount();
-
- // Thick colored underline below the current selection
- if (childCount > 0) {
- View selectedTitle = getChildAt(mIndexForSelection);
-
- if (selectedTitle == null) {
- // The view pager's tab count changed but we weren't notified yet. Ignore this draw
- // pass, when we get a new selection we will update and draw the selection strip in
- // the correct place.
- return;
- }
- int selectedLeft = selectedTitle.getLeft();
- int selectedRight = selectedTitle.getRight();
- final boolean isRtl = isRtl();
- final boolean hasNextTab = isRtl ? mIndexForSelection > 0
- : (mIndexForSelection < (getChildCount() - 1));
- if ((mSelectionOffset > 0.0f) && hasNextTab) {
- // Draw the selection partway between the tabs
- View nextTitle = getChildAt(mIndexForSelection + (isRtl ? -1 : 1));
- int nextLeft = nextTitle.getLeft();
- int nextRight = nextTitle.getRight();
-
- selectedLeft = (int) (mSelectionOffset * nextLeft +
- (1.0f - mSelectionOffset) * selectedLeft);
- selectedRight = (int) (mSelectionOffset * nextRight +
- (1.0f - mSelectionOffset) * selectedRight);
- }
-
- int height = getHeight();
- canvas.drawRect(selectedLeft, height - mSelectedUnderlineThickness,
- selectedRight, height, mSelectedUnderlinePaint);
- }
- }
-
- private boolean isRtl() {
- return getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
- }
-}
\ No newline at end of file
diff --git a/src/com/android/contacts/common/list/ViewPagerTabs.java b/src/com/android/contacts/common/list/ViewPagerTabs.java
deleted file mode 100644
index 48de6af..0000000
--- a/src/com/android/contacts/common/list/ViewPagerTabs.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Copyright (C) 2014 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.common.list;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
-import android.graphics.Outline;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewOutlineProvider;
-import android.widget.FrameLayout;
-import android.widget.HorizontalScrollView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.contacts.common.R;
-import com.android.contacts.common.compat.CompatUtils;
-
-/**
- * Lightweight implementation of ViewPager tabs. This looks similar to traditional actionBar tabs,
- * but allows for the view containing the tabs to be placed anywhere on screen. Text-related
- * attributes can also be assigned in XML - these will get propogated to the child TextViews
- * automatically.
- */
-public class ViewPagerTabs extends HorizontalScrollView implements ViewPager.OnPageChangeListener {
-
- ViewPager mPager;
- private ViewPagerTabStrip mTabStrip;
-
- /**
- * Linearlayout that will contain the TextViews serving as tabs. This is the only child
- * of the parent HorizontalScrollView.
- */
- final int mTextStyle;
- final ColorStateList mTextColor;
- final int mTextSize;
- final boolean mTextAllCaps;
- int mPrevSelected = -1;
- int mSidePadding;
-
- private int[] mTabIcons;
- // For displaying the unread count next to the tab icon.
- private int[] mUnreadCounts;
-
- private static final ViewOutlineProvider VIEW_BOUNDS_OUTLINE_PROVIDER;
- static {
- if (CompatUtils.isLollipopCompatible()) {
- VIEW_BOUNDS_OUTLINE_PROVIDER = new ViewOutlineProvider() {
- @Override
- public void getOutline(View view, Outline outline) {
- outline.setRect(0, 0, view.getWidth(), view.getHeight());
- }
- };
- } else {
- VIEW_BOUNDS_OUTLINE_PROVIDER = null;
- }
- }
-
- private static final int TAB_SIDE_PADDING_IN_DPS = 10;
-
- // TODO: This should use <declare-styleable> in the future
- private static final int[] ATTRS = new int[] {
- android.R.attr.textSize,
- android.R.attr.textStyle,
- android.R.attr.textColor,
- android.R.attr.textAllCaps
- };
-
- /**
- * Simulates actionbar tab behavior by showing a toast with the tab title when long clicked.
- */
- private class OnTabLongClickListener implements OnLongClickListener {
- final int mPosition;
-
- public OnTabLongClickListener(int position) {
- mPosition = position;
- }
-
- @Override
- public boolean onLongClick(View v) {
- final int[] screenPos = new int[2];
- getLocationOnScreen(screenPos);
-
- final Context context = getContext();
- final int width = getWidth();
- final int height = getHeight();
- final int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
-
- Toast toast = Toast.makeText(context, mPager.getAdapter().getPageTitle(mPosition),
- Toast.LENGTH_SHORT);
-
- // Show the toast under the tab
- toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL,
- (screenPos[0] + width / 2) - screenWidth / 2, screenPos[1] + height);
-
- toast.show();
- return true;
- }
- }
-
- public ViewPagerTabs(Context context) {
- this(context, null);
- }
-
- public ViewPagerTabs(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public ViewPagerTabs(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- setFillViewport(true);
-
- mSidePadding = (int) (getResources().getDisplayMetrics().density * TAB_SIDE_PADDING_IN_DPS);
-
- final TypedArray a = context.obtainStyledAttributes(attrs, ATTRS);
- mTextSize = a.getDimensionPixelSize(0, 0);
- mTextStyle = a.getInt(1, 0);
- mTextColor = a.getColorStateList(2);
- mTextAllCaps = a.getBoolean(3, false);
-
- mTabStrip = new ViewPagerTabStrip(context);
- addView(mTabStrip,
- new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
- a.recycle();
-
- if (CompatUtils.isLollipopCompatible()) {
- // enable shadow casting from view bounds
- setOutlineProvider(VIEW_BOUNDS_OUTLINE_PROVIDER);
- }
- }
-
- public void setViewPager(ViewPager viewPager) {
- mPager = viewPager;
- addTabs(mPager.getAdapter());
- }
-
- /**
- * Set the tab icons and initialize an array for unread counts the same length as the icon
- * array.
- *
- * @param tabIcons An array representing the tab icons in order.
- */
- public void configureTabIcons(int[] tabIcons) {
- mTabIcons = tabIcons;
- mUnreadCounts = new int[tabIcons.length];
- }
-
- public void setUnreadCount(int count, int position) {
- if (mUnreadCounts == null || position >= mUnreadCounts.length) {
- return;
- }
- mUnreadCounts[position] = count;
- }
-
- private void addTabs(PagerAdapter adapter) {
- mTabStrip.removeAllViews();
-
- final int count = adapter.getCount();
- for (int i = 0; i < count; i++) {
- addTab(adapter.getPageTitle(i), i);
- }
- }
-
- private void addTab(CharSequence tabTitle, final int position) {
- View tabView;
- if (mTabIcons != null && position < mTabIcons.length) {
- View layout = LayoutInflater.from(getContext()).inflate(
- R.layout.unread_count_tab, null);
- View iconView = layout.findViewById(R.id.icon);
- iconView.setBackgroundResource(mTabIcons[position]);
- iconView.setContentDescription(tabTitle);
- TextView textView = (TextView) layout.findViewById(R.id.count);
- if (mUnreadCounts != null && mUnreadCounts[position] > 0) {
- textView.setText(Integer.toString(mUnreadCounts[position]));
- textView.setVisibility(View.VISIBLE);
- iconView.setContentDescription(getResources().getQuantityString(
- R.plurals.tab_title_with_unread_items,
- mUnreadCounts[position],
- tabTitle.toString(),
- mUnreadCounts[position]));
- } else {
- textView.setVisibility(View.INVISIBLE);
- iconView.setContentDescription(tabTitle);
- }
- tabView = layout;
- } else {
- final TextView textView = new TextView(getContext());
- textView.setText(tabTitle);
- textView.setBackgroundResource(R.drawable.view_pager_tab_background);
-
- // Assign various text appearance related attributes to child views.
- if (mTextStyle > 0) {
- textView.setTypeface(textView.getTypeface(), mTextStyle);
- }
- if (mTextSize > 0) {
- textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
- }
- if (mTextColor != null) {
- textView.setTextColor(mTextColor);
- }
- textView.setAllCaps(mTextAllCaps);
- textView.setGravity(Gravity.CENTER);
-
- tabView = textView;
- }
-
- tabView.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- mPager.setCurrentItem(getRtlPosition(position));
- }
- });
-
- tabView.setOnLongClickListener(new OnTabLongClickListener(position));
-
- tabView.setPadding(mSidePadding, 0, mSidePadding, 0);
-
- mTabStrip.addView(tabView, position, new LinearLayout.LayoutParams(
- LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, 1));
-
- // Default to the first child being selected
- if (position == 0) {
- mPrevSelected = 0;
- tabView.setSelected(true);
- }
- }
-
- /**
- * Remove a tab at a certain index.
- *
- * @param index The index of the tab view we wish to remove.
- */
- public void removeTab(int index) {
- View view = mTabStrip.getChildAt(index);
- if (view != null) {
- mTabStrip.removeView(view);
- }
- }
-
- /**
- * Refresh a tab at a certain index by removing it and reconstructing it.
- *
- * @param index The index of the tab view we wish to update.
- */
- public void updateTab(int index) {
- removeTab(index);
-
- if (index < mPager.getAdapter().getCount()) {
- addTab(mPager.getAdapter().getPageTitle(index), index);
- }
- }
-
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- position = getRtlPosition(position);
- int tabStripChildCount = mTabStrip.getChildCount();
- if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) {
- return;
- }
-
- mTabStrip.onPageScrolled(position, positionOffset, positionOffsetPixels);
- }
-
- @Override
- public void onPageSelected(int position) {
- position = getRtlPosition(position);
- int tabStripChildCount = mTabStrip.getChildCount();
- if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) {
- return;
- }
-
- if (mPrevSelected >= 0 && mPrevSelected < tabStripChildCount) {
- mTabStrip.getChildAt(mPrevSelected).setSelected(false);
- }
- final View selectedChild = mTabStrip.getChildAt(position);
- selectedChild.setSelected(true);
-
- // Update scroll position
- final int scrollPos = selectedChild.getLeft() - (getWidth() - selectedChild.getWidth()) / 2;
- smoothScrollTo(scrollPos, 0);
- mPrevSelected = position;
- }
-
- @Override
- public void onPageScrollStateChanged(int state) {
- }
-
- private int getRtlPosition(int position) {
- if (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
- return mTabStrip.getChildCount() - 1 - position;
- }
- return position;
- }
-}
-
diff --git a/src/com/android/contacts/common/model/AccountTypeManager.java b/src/com/android/contacts/common/model/AccountTypeManager.java
index a083219..705f5bf 100644
--- a/src/com/android/contacts/common/model/AccountTypeManager.java
+++ b/src/com/android/contacts/common/model/AccountTypeManager.java
@@ -25,6 +25,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.SharedPreferences;
import android.content.SyncAdapterType;
import android.content.SyncStatusObserver;
import android.content.pm.PackageManager;
@@ -43,6 +44,7 @@
import android.util.Log;
import android.util.TimingLogger;
+import com.android.contacts.R;
import com.android.contacts.common.MoreContactUtils;
import com.android.contacts.common.list.ContactListFilterController;
import com.android.contacts.common.model.account.AccountType;
@@ -63,6 +65,7 @@
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
@@ -125,11 +128,18 @@
}
@Override
- public void sortAccounts(AccountWithDataSet defaultAccount) {
+ public List<AccountWithDataSet> getGroupWritableAccounts() {
+ return Collections.emptyList();
}
@Override
- public List<AccountWithDataSet> getGroupWritableAccounts() {
+ public Account getDefaultGoogleAccount() {
+ return null;
+ }
+
+ @Override
+ public List<AccountWithDataSet> getSortedAccounts(AccountWithDataSet defaultAccount,
+ boolean contactWritableOnly) {
return Collections.emptyList();
}
@@ -156,16 +166,47 @@
// TODO: Consider splitting this into getContactWritableAccounts() and getAllAccounts()
public abstract List<AccountWithDataSet> getAccounts(boolean contactWritableOnly);
- /**
- * Sort accounts based on default account.
- */
- public abstract void sortAccounts(AccountWithDataSet defaultAccount);
+ public abstract List<AccountWithDataSet> getSortedAccounts(AccountWithDataSet defaultAccount,
+ boolean contactWritableOnly);
/**
* Returns the list of accounts that are group writable.
*/
public abstract List<AccountWithDataSet> getGroupWritableAccounts();
+ /**
+ * Returns the default google account.
+ */
+ public abstract Account getDefaultGoogleAccount();
+
+ static Account getDefaultGoogleAccount(AccountManager accountManager,
+ SharedPreferences prefs, String defaultAccountKey) {
+ // Get all the google accounts on the device
+ final Account[] accounts = accountManager.getAccountsByType(
+ GoogleAccountType.ACCOUNT_TYPE);
+ if (accounts == null || accounts.length == 0) {
+ return null;
+ }
+
+ // Get the default account from preferences
+ final String defaultAccount = prefs.getString(defaultAccountKey, null);
+ final AccountWithDataSet accountWithDataSet = defaultAccount == null ? null :
+ AccountWithDataSet.unstringify(defaultAccount);
+
+ // Look for an account matching the one from preferences
+ if (accountWithDataSet != null) {
+ for (int i = 0; i < accounts.length; i++) {
+ if (TextUtils.equals(accountWithDataSet.name, accounts[i].name)
+ && TextUtils.equals(accountWithDataSet.type, accounts[i].type)) {
+ return accounts[i];
+ }
+ }
+ }
+
+ // Just return the first one
+ return accounts[0];
+ }
+
public abstract AccountType getAccountType(AccountTypeWithDataSet accountTypeWithDataSet);
public final AccountType getAccountType(String accountType, String dataSet) {
@@ -580,7 +621,7 @@
boolean syncable =
ContentResolver.getIsSyncable(account, ContactsContract.AUTHORITY) > 0;
- if (syncable) {
+ if (syncable || GoogleAccountType.ACCOUNT_TYPE.equals(account.type)) {
List<AccountType> accountTypes = accountTypesByType.get(account.type);
if (accountTypes != null) {
// Add an account-with-data-set entry for each account type that is
@@ -705,22 +746,28 @@
}
/**
- * Return list of all known, contact writable {@link AccountWithDataSet}'s.
+ * Return list of all known or contact writable {@link AccountWithDataSet}'s.
+ * {@param contactWritableOnly} whether to restrict to contact writable accounts only
*/
@Override
public List<AccountWithDataSet> getAccounts(boolean contactWritableOnly) {
ensureAccountsLoaded();
- return contactWritableOnly ? mContactWritableAccounts : mAccounts;
+ return Lists.newArrayList(contactWritableOnly ? mContactWritableAccounts : mAccounts);
}
/**
- * Sort accounts based on default account.
+ * Return list of all known or contact writable {@link AccountWithDataSet}'s sorted by
+ * {@code defaultAccount}.
+ * {@param defaultAccount} account to sort by
+ * {@param contactWritableOnly} whether to restrict to contact writable accounts only
*/
@Override
- public void sortAccounts(AccountWithDataSet defaultAccount) {
- Collections.sort(mAccounts, new AccountComparator(defaultAccount));
- Collections.sort(mContactWritableAccounts, new AccountComparator(defaultAccount));
- Collections.sort(mGroupWritableAccounts, new AccountComparator(defaultAccount));
+ public List<AccountWithDataSet> getSortedAccounts(AccountWithDataSet defaultAccount,
+ boolean contactWritableOnly) {
+ final AccountComparator comparator = new AccountComparator(defaultAccount);
+ final List<AccountWithDataSet> accounts = getAccounts(contactWritableOnly);
+ Collections.sort(accounts, comparator);
+ return accounts;
}
/**
@@ -728,7 +775,21 @@
*/
public List<AccountWithDataSet> getGroupWritableAccounts() {
ensureAccountsLoaded();
- return mGroupWritableAccounts;
+ return Lists.newArrayList(mGroupWritableAccounts);
+ }
+
+ /**
+ * Returns the default google account specified in preferences, the first google account
+ * if it is not specified in preferences or is no longer on the device, and null otherwise.
+ */
+ @Override
+ public Account getDefaultGoogleAccount() {
+ final AccountManager accountManager = AccountManager.get(mContext);
+ final SharedPreferences sharedPreferences =
+ mContext.getSharedPreferences(mContext.getPackageName(), Context.MODE_PRIVATE);
+ final String defaultAccountKey =
+ mContext.getResources().getString(R.string.contact_editor_default_account_key);
+ return getDefaultGoogleAccount(accountManager, sharedPreferences, defaultAccountKey);
}
/**
diff --git a/src/com/android/contacts/common/model/Contact.java b/src/com/android/contacts/common/model/Contact.java
index c84ff2a..586f80a 100644
--- a/src/com/android/contacts/common/model/Contact.java
+++ b/src/com/android/contacts/common/model/Contact.java
@@ -472,6 +472,10 @@
return mIsUserProfile;
}
+ public boolean isMultipleRawContacts() {
+ return mRawContacts.size() > 1;
+ }
+
/**
* @return true if all the raw contacts are from SIM accounts, and false otherwise.
*/
diff --git a/src/com/android/contacts/common/model/ContactLoader.java b/src/com/android/contacts/common/model/ContactLoader.java
index a8deff4..027713f 100644
--- a/src/com/android/contacts/common/model/ContactLoader.java
+++ b/src/com/android/contacts/common/model/ContactLoader.java
@@ -100,6 +100,11 @@
this(context, lookupUri, false, false, postViewNotification, false);
}
+ public ContactLoader(Context context, Uri lookupUri, boolean postViewNotification,
+ boolean loadGroupMetaData) {
+ this(context, lookupUri, loadGroupMetaData, false, postViewNotification, false);
+ }
+
public ContactLoader(Context context, Uri lookupUri, boolean loadGroupMetaData,
boolean loadInvitableAccountTypes,
boolean postViewNotification, boolean computeFormattedPhoneNumber) {
diff --git a/src/com/android/contacts/common/model/RawContactDelta.java b/src/com/android/contacts/common/model/RawContactDelta.java
index 85b0930..afa4a13 100644
--- a/src/com/android/contacts/common/model/RawContactDelta.java
+++ b/src/com/android/contacts/common/model/RawContactDelta.java
@@ -30,11 +30,9 @@
import android.util.Log;
import com.android.contacts.common.compat.CompatUtils;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.BuilderWrapper;
-import com.android.contacts.common.model.CPOWrapper;
-import com.android.contacts.common.model.ValuesDelta;
import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -236,6 +234,10 @@
return manager.getAccountType(getAccountType(), getDataSet());
}
+ public AccountWithDataSet getAccountWithDataSet() {
+ return new AccountWithDataSet(getAccountName(), getAccountType(), getDataSet());
+ }
+
public boolean isVisible() {
return getValues().isVisible();
}
diff --git a/src/com/android/contacts/common/model/RawContactDeltaList.java b/src/com/android/contacts/common/model/RawContactDeltaList.java
index 6964643..2f281ef 100644
--- a/src/com/android/contacts/common/model/RawContactDeltaList.java
+++ b/src/com/android/contacts/common/model/RawContactDeltaList.java
@@ -31,8 +31,6 @@
import android.util.Log;
import com.android.contacts.common.compat.CompatUtils;
-import com.android.contacts.common.model.CPOWrapper;
-import com.android.contacts.common.model.ValuesDelta;
import com.google.common.collect.Lists;
diff --git a/src/com/android/contacts/common/model/RawContactModifier.java b/src/com/android/contacts/common/model/RawContactModifier.java
index 3cd200c..5e8941d 100644
--- a/src/com/android/contacts/common/model/RawContactModifier.java
+++ b/src/com/android/contacts/common/model/RawContactModifier.java
@@ -988,8 +988,7 @@
for (DataKind kind : newAccountType.getSortedDataKinds()) {
if (!kind.editable) continue;
final String mimeType = kind.mimeType;
- if (DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME.equals(mimeType)
- || DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(mimeType)) {
+ if (DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(mimeType)) {
// Ignore pseudo data.
continue;
} else if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
@@ -1040,15 +1039,11 @@
return;
}
- boolean supportDisplayName = false;
boolean supportPhoneticFullName = false;
boolean supportPhoneticFamilyName = false;
boolean supportPhoneticMiddleName = false;
boolean supportPhoneticGivenName = false;
for (EditField editField : newDataKind.fieldList) {
- if (StructuredName.DISPLAY_NAME.equals(editField.column)) {
- supportDisplayName = true;
- }
if (DataKind.PSEUDO_COLUMN_PHONETIC_NAME.equals(editField.column)) {
supportPhoneticFullName = true;
}
@@ -1063,26 +1058,6 @@
}
}
- // DISPLAY_NAME <-> PREFIX, GIVEN_NAME, MIDDLE_NAME, FAMILY_NAME, SUFFIX
- final String displayName = values.getAsString(StructuredName.DISPLAY_NAME);
- if (!TextUtils.isEmpty(displayName)) {
- if (!supportDisplayName) {
- // Old data has a display name, while the new account doesn't allow it.
- NameConverter.displayNameToStructuredName(context, displayName, values);
-
- // We don't want to migrate unseen data which may confuse users after the creation.
- values.remove(StructuredName.DISPLAY_NAME);
- }
- } else {
- if (supportDisplayName) {
- // Old data does not have display name, while the new account requires it.
- values.put(StructuredName.DISPLAY_NAME,
- NameConverter.structuredNameToDisplayName(context, values));
- for (String field : NameConverter.STRUCTURED_NAME_FIELDS) {
- values.remove(field);
- }
- }
- }
// Phonetic (full) name <-> PHONETIC_FAMILY_NAME, PHONETIC_MIDDLE_NAME, PHONETIC_GIVEN_NAME
final String phoneticFullName = values.getAsString(DataKind.PSEUDO_COLUMN_PHONETIC_NAME);
diff --git a/src/com/android/contacts/common/model/ValuesDelta.java b/src/com/android/contacts/common/model/ValuesDelta.java
index 844ba36..d6e08a8 100644
--- a/src/com/android/contacts/common/model/ValuesDelta.java
+++ b/src/com/android/contacts/common/model/ValuesDelta.java
@@ -23,9 +23,11 @@
import android.os.Parcelable;
import android.provider.BaseColumns;
import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.text.TextUtils;
import com.android.contacts.common.compat.CompatUtils;
-import com.android.contacts.common.model.BuilderWrapper;
+
import com.google.common.collect.Sets;
import java.util.HashSet;
@@ -83,6 +85,10 @@
return mAfter;
}
+ public ContentValues getBefore() {
+ return mBefore;
+ }
+
public boolean containsKey(String key) {
return ((mAfter != null && mAfter.containsKey(key)) ||
(mBefore != null && mBefore.containsKey(key)));
diff --git a/src/com/android/contacts/common/model/account/AccountType.java b/src/com/android/contacts/common/model/account/AccountType.java
index 0943953..80fb4aa 100644
--- a/src/com/android/contacts/common/model/account/AccountType.java
+++ b/src/com/android/contacts/common/model/account/AccountType.java
@@ -139,28 +139,6 @@
public abstract boolean areContactsWritable();
/**
- * Returns an optional custom edit activity.
- *
- * Only makes sense for non-embedded account types.
- * The activity class should reside in the sync adapter package as determined by
- * {@link #syncAdapterPackageName}.
- */
- public String getEditContactActivityClassName() {
- return null;
- }
-
- /**
- * Returns an optional custom new contact activity.
- *
- * Only makes sense for non-embedded account types.
- * The activity class should reside in the sync adapter package as determined by
- * {@link #syncAdapterPackageName}.
- */
- public String getCreateContactActivityClassName() {
- return null;
- }
-
- /**
* Returns an optional custom invite contact activity.
*
* Only makes sense for non-embedded account types.
diff --git a/src/com/android/contacts/common/model/account/BaseAccountType.java b/src/com/android/contacts/common/model/account/BaseAccountType.java
index 2f47c50..c57fa0e 100644
--- a/src/com/android/contacts/common/model/account/BaseAccountType.java
+++ b/src/com/android/contacts/common/model/account/BaseAccountType.java
@@ -148,72 +148,36 @@
}
protected DataKind addDataKindStructuredName(Context context) throws DefinitionException {
- DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE,
+ final DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE,
R.string.nameLabelsGroup, Weight.NONE, true));
kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
kind.actionBody = new SimpleInflater(Nickname.NAME);
kind.typeOverallMax = 1;
kind.fieldList = Lists.newArrayList();
- kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME,
- R.string.full_name, FLAGS_PERSON_NAME));
- kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
- FLAGS_PERSON_NAME).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
- FLAGS_PERSON_NAME).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
- FLAGS_PERSON_NAME).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
- FLAGS_PERSON_NAME).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
- FLAGS_PERSON_NAME).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
- R.string.name_phonetic_family, FLAGS_PHONETIC));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
- R.string.name_phonetic_middle, FLAGS_PHONETIC));
- kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
- R.string.name_phonetic_given, FLAGS_PHONETIC));
-
- return kind;
- }
-
- protected DataKind addDataKindDisplayName(Context context) throws DefinitionException {
- DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME,
- R.string.nameLabelsGroup, Weight.NONE, true));
- kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
- kind.actionBody = new SimpleInflater(Nickname.NAME);
- kind.typeOverallMax = 1;
-
- kind.fieldList = Lists.newArrayList();
- kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME,
- R.string.full_name, FLAGS_PERSON_NAME).setShortForm(true));
-
- boolean displayOrderPrimary =
+ final boolean displayOrderPrimary =
context.getResources().getBoolean(R.bool.config_editor_field_order_primary);
+ kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
+ FLAGS_PERSON_NAME).setLongForm(true));
if (!displayOrderPrimary) {
- kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
- FLAGS_PERSON_NAME).setLongForm(true));
kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
- FLAGS_PERSON_NAME).setLongForm(true));
+ FLAGS_PERSON_NAME));
kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
FLAGS_PERSON_NAME).setLongForm(true));
kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
- FLAGS_PERSON_NAME).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
- FLAGS_PERSON_NAME).setLongForm(true));
+ FLAGS_PERSON_NAME));
} else {
- kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
- FLAGS_PERSON_NAME).setLongForm(true));
kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
- FLAGS_PERSON_NAME).setLongForm(true));
+ FLAGS_PERSON_NAME));
kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
FLAGS_PERSON_NAME).setLongForm(true));
kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
- FLAGS_PERSON_NAME).setLongForm(true));
- kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
- FLAGS_PERSON_NAME).setLongForm(true));
+ FLAGS_PERSON_NAME));
}
+ kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
+ FLAGS_PERSON_NAME).setLongForm(true));
+
return kind;
}
@@ -891,15 +855,13 @@
AttributeSet attrs) throws DefinitionException, XmlPullParserException,
IOException {
- // Build 3 data kinds:
+ // Build 2 data kinds:
// - StructuredName.CONTENT_ITEM_TYPE
- // - DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME
// - DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME
final boolean displayOrderPrimary =
context.getResources().getBoolean(R.bool.config_editor_field_order_primary);
- final boolean supportsDisplayName = getAttr(attrs, "supportsDisplayName", false);
final boolean supportsPrefix = getAttr(attrs, "supportsPrefix", false);
final boolean supportsMiddleName = getAttr(attrs, "supportsMiddleName", false);
final boolean supportsSuffix = getAttr(attrs, "supportsSuffix", false);
@@ -911,7 +873,6 @@
getAttr(attrs, "supportsPhoneticGivenName", false);
// For now, every things must be supported.
- checkAttributeTrue(supportsDisplayName, "supportsDisplayName");
checkAttributeTrue(supportsPrefix, "supportsPrefix");
checkAttributeTrue(supportsMiddleName, "supportsMiddleName");
checkAttributeTrue(supportsSuffix, "supportsSuffix");
@@ -927,68 +888,28 @@
new SimpleInflater(R.string.nameLabelsGroup),
new SimpleInflater(Nickname.NAME));
- throwIfList(ks);
- kinds.add(ks);
-
- // Note about setLongForm/setShortForm below.
- // We need to set this only when the type supports display name. (=supportsDisplayName)
- // Otherwise (i.e. Exchange) we don't set these flags, but instead make some fields
- // "optional".
-
- ks.fieldList.add(new EditField(StructuredName.DISPLAY_NAME, R.string.full_name,
- FLAGS_PERSON_NAME));
ks.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
FLAGS_PERSON_NAME).setLongForm(true));
- ks.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
- FLAGS_PERSON_NAME).setLongForm(true));
- ks.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
- FLAGS_PERSON_NAME).setLongForm(true));
- ks.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
- FLAGS_PERSON_NAME).setLongForm(true));
+ if (!displayOrderPrimary) {
+ ks.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
+ FLAGS_PERSON_NAME));
+ ks.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
+ FLAGS_PERSON_NAME).setLongForm(true));
+ ks.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
+ FLAGS_PERSON_NAME));
+ } else {
+ ks.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
+ FLAGS_PERSON_NAME));
+ ks.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
+ FLAGS_PERSON_NAME).setLongForm(true));
+ ks.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
+ FLAGS_PERSON_NAME));
+ }
ks.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
FLAGS_PERSON_NAME).setLongForm(true));
- ks.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
- R.string.name_phonetic_family, FLAGS_PHONETIC));
- ks.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
- R.string.name_phonetic_middle, FLAGS_PHONETIC));
- ks.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
- R.string.name_phonetic_given, FLAGS_PHONETIC));
- // Display name
- final DataKind kd = newDataKind(context, parser, attrs, true,
- DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME, null,
- R.string.nameLabelsGroup, Weight.NONE,
- new SimpleInflater(R.string.nameLabelsGroup),
- new SimpleInflater(Nickname.NAME));
- kd.typeOverallMax = 1;
- kinds.add(kd);
-
- kd.fieldList.add(new EditField(StructuredName.DISPLAY_NAME,
- R.string.full_name, FLAGS_PERSON_NAME).setShortForm(true));
-
- if (!displayOrderPrimary) {
- kd.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
- FLAGS_PERSON_NAME).setLongForm(true));
- kd.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
- FLAGS_PERSON_NAME).setLongForm(true));
- kd.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
- FLAGS_PERSON_NAME).setLongForm(true));
- kd.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
- FLAGS_PERSON_NAME).setLongForm(true));
- kd.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
- FLAGS_PERSON_NAME).setLongForm(true));
- } else {
- kd.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
- FLAGS_PERSON_NAME).setLongForm(true));
- kd.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
- FLAGS_PERSON_NAME).setLongForm(true));
- kd.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
- FLAGS_PERSON_NAME).setLongForm(true));
- kd.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
- FLAGS_PERSON_NAME).setLongForm(true));
- kd.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
- FLAGS_PERSON_NAME).setLongForm(true));
- }
+ throwIfList(ks);
+ kinds.add(ks);
// Phonetic name
final DataKind kp = newDataKind(context, parser, attrs, true,
diff --git a/src/com/android/contacts/common/model/account/ExchangeAccountType.java b/src/com/android/contacts/common/model/account/ExchangeAccountType.java
index 7020836..339564b 100644
--- a/src/com/android/contacts/common/model/account/ExchangeAccountType.java
+++ b/src/com/android/contacts/common/model/account/ExchangeAccountType.java
@@ -52,7 +52,6 @@
try {
addDataKindStructuredName(context);
- addDataKindDisplayName(context);
addDataKindPhoneticName(context);
addDataKindNickname(context);
addDataKindPhone(context);
@@ -107,39 +106,6 @@
}
@Override
- protected DataKind addDataKindDisplayName(Context context) throws DefinitionException {
- DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME,
- R.string.nameLabelsGroup, Weight.NONE, true));
-
- boolean displayOrderPrimary =
- context.getResources().getBoolean(R.bool.config_editor_field_order_primary);
- kind.typeOverallMax = 1;
-
- kind.fieldList = Lists.newArrayList();
- kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
- FLAGS_PERSON_NAME).setOptional(true));
- if (!displayOrderPrimary) {
- kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
- R.string.name_family, FLAGS_PERSON_NAME));
- kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
- R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true));
- kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
- R.string.name_given, FLAGS_PERSON_NAME));
- } else {
- kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
- R.string.name_given, FLAGS_PERSON_NAME));
- kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
- R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true));
- kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
- R.string.name_family, FLAGS_PERSON_NAME));
- }
- kind.fieldList.add(new EditField(StructuredName.SUFFIX,
- R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true));
-
- return kind;
- }
-
- @Override
protected DataKind addDataKindPhoneticName(Context context) throws DefinitionException {
DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME,
R.string.name_phonetic, Weight.NONE, true));
diff --git a/src/com/android/contacts/common/model/account/ExternalAccountType.java b/src/com/android/contacts/common/model/account/ExternalAccountType.java
index fc45e0b..685322a 100644
--- a/src/com/android/contacts/common/model/account/ExternalAccountType.java
+++ b/src/com/android/contacts/common/model/account/ExternalAccountType.java
@@ -70,8 +70,6 @@
private static final String TAG_CONTACTS_DATA_KIND = "ContactsDataKind";
private static final String TAG_EDIT_SCHEMA = "EditSchema";
- private static final String ATTR_EDIT_CONTACT_ACTIVITY = "editContactActivity";
- private static final String ATTR_CREATE_CONTACT_ACTIVITY = "createContactActivity";
private static final String ATTR_INVITE_CONTACT_ACTIVITY = "inviteContactActivity";
private static final String ATTR_INVITE_CONTACT_ACTION_LABEL = "inviteContactActionLabel";
private static final String ATTR_VIEW_CONTACT_NOTIFY_SERVICE = "viewContactNotifyService";
@@ -88,8 +86,6 @@
private final boolean mIsExtension;
- private String mEditContactActivityClassName;
- private String mCreateContactActivityClassName;
private String mInviteContactActivity;
private String mInviteActionLabelAttribute;
private int mInviteActionLabelResId;
@@ -136,13 +132,11 @@
needLineNumberInErrorLog = false;
if (mHasEditSchema) {
checkKindExists(StructuredName.CONTENT_ITEM_TYPE);
- checkKindExists(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME);
checkKindExists(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME);
checkKindExists(Photo.CONTENT_ITEM_TYPE);
} else {
// Bring in name and photo from fallback source, which are non-optional
addDataKindStructuredName(context);
- addDataKindDisplayName(context);
addDataKindPhoneticName(context);
addDataKindPhoto(context);
}
@@ -259,16 +253,6 @@
}
@Override
- public String getEditContactActivityClassName() {
- return mEditContactActivityClassName;
- }
-
- @Override
- public String getCreateContactActivityClassName() {
- return mCreateContactActivityClassName;
- }
-
- @Override
public String getInviteContactActivityClassName() {
return mInviteContactActivity;
}
@@ -337,11 +321,7 @@
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, attr + "=" + value);
}
- if (ATTR_EDIT_CONTACT_ACTIVITY.equals(attr)) {
- mEditContactActivityClassName = value;
- } else if (ATTR_CREATE_CONTACT_ACTIVITY.equals(attr)) {
- mCreateContactActivityClassName = value;
- } else if (ATTR_INVITE_CONTACT_ACTIVITY.equals(attr)) {
+ if (ATTR_INVITE_CONTACT_ACTIVITY.equals(attr)) {
mInviteContactActivity = value;
} else if (ATTR_INVITE_CONTACT_ACTION_LABEL.equals(attr)) {
mInviteActionLabelAttribute = value;
diff --git a/src/com/android/contacts/common/model/account/FallbackAccountType.java b/src/com/android/contacts/common/model/account/FallbackAccountType.java
index 7c6d17c..5a75c8e 100644
--- a/src/com/android/contacts/common/model/account/FallbackAccountType.java
+++ b/src/com/android/contacts/common/model/account/FallbackAccountType.java
@@ -38,7 +38,6 @@
try {
addDataKindStructuredName(context);
- addDataKindDisplayName(context);
addDataKindPhoneticName(context);
addDataKindNickname(context);
addDataKindPhone(context);
diff --git a/src/com/android/contacts/common/model/account/GoogleAccountType.java b/src/com/android/contacts/common/model/account/GoogleAccountType.java
index 8c83b90..3cfb44a 100644
--- a/src/com/android/contacts/common/model/account/GoogleAccountType.java
+++ b/src/com/android/contacts/common/model/account/GoogleAccountType.java
@@ -53,7 +53,6 @@
try {
addDataKindStructuredName(context);
- addDataKindDisplayName(context);
addDataKindPhoneticName(context);
addDataKindNickname(context);
addDataKindPhone(context);
diff --git a/src/com/android/contacts/common/model/account/SamsungAccountType.java b/src/com/android/contacts/common/model/account/SamsungAccountType.java
index 85a9ab8..00f6687 100644
--- a/src/com/android/contacts/common/model/account/SamsungAccountType.java
+++ b/src/com/android/contacts/common/model/account/SamsungAccountType.java
@@ -54,7 +54,6 @@
try {
addDataKindStructuredName(context);
- addDataKindDisplayName(context);
addDataKindPhoneticName(context);
addDataKindNickname(context);
addDataKindPhone(context);
diff --git a/src/com/android/contacts/common/model/account/SimAccountType.java b/src/com/android/contacts/common/model/account/SimAccountType.java
index 5d2e52d..e7d7ee2 100644
--- a/src/com/android/contacts/common/model/account/SimAccountType.java
+++ b/src/com/android/contacts/common/model/account/SimAccountType.java
@@ -17,10 +17,14 @@
import android.accounts.AuthenticatorDescription;
import android.content.Context;
+import android.provider.ContactsContract.CommonDataKinds.Nickname;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import com.android.contacts.R;
+import com.android.contacts.common.R;
import com.android.contacts.common.model.dataitem.DataKind;
+import com.google.common.collect.Lists;
+
import java.util.Collections;
/**
@@ -33,12 +37,7 @@
this.iconRes = R.drawable.ic_sim_card_tinted_24dp;
try {
- addDataKindDisplayName(context);
- // SIM cards probably don't natively support full structured name data (separate
- // first and last names) but restricting to just a single field in
- // StructuredNameEditorView will require more significant changes.
addDataKindStructuredName(context);
-
final DataKind phoneKind = addDataKindPhone(context);
phoneKind.typeOverallMax = 1;
// SIM card contacts don't necessarily support separate types (based on data exposed
@@ -67,4 +66,31 @@
public void initializeFieldsFromAuthenticator(AuthenticatorDescription authenticator) {
// Do nothing. We want to use our local icon and title
}
+
+ @Override
+ protected DataKind addDataKindStructuredName(Context context) throws DefinitionException {
+ final DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE,
+ R.string.nameLabelsGroup, Weight.NONE, true));
+ kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
+ kind.actionBody = new SimpleInflater(Nickname.NAME);
+ kind.typeOverallMax = 1;
+
+ final boolean displayOrderPrimary =
+ context.getResources().getBoolean(R.bool.config_editor_field_order_primary);
+
+ kind.fieldList = Lists.newArrayList();
+ if (!displayOrderPrimary) {
+ kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
+ FLAGS_PERSON_NAME));
+ kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
+ FLAGS_PERSON_NAME));
+ } else {
+ kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
+ FLAGS_PERSON_NAME));
+ kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
+ FLAGS_PERSON_NAME));
+ }
+
+ return kind;
+ }
}
diff --git a/src/com/android/contacts/common/preference/ContactsPreferenceActivity.java b/src/com/android/contacts/common/preference/ContactsPreferenceActivity.java
index dbf3cb9..f544c7b 100644
--- a/src/com/android/contacts/common/preference/ContactsPreferenceActivity.java
+++ b/src/com/android/contacts/common/preference/ContactsPreferenceActivity.java
@@ -40,15 +40,11 @@
private static final String TAG_DISPLAY_OPTIONS = "display_options";
private String mNewLocalProfileExtra;
- private String mPreviousScreenExtra;
- private int mModeFullyExpanded;
private boolean mAreContactsAvailable;
private ProviderStatusWatcher mProviderStatusWatcher;
public static final String EXTRA_NEW_LOCAL_PROFILE = "newLocalProfile";
- public static final String EXTRA_MODE_FULLY_EXPANDED = "modeFullyExpanded";
- public static final String EXTRA_PREVIOUS_SCREEN_TYPE = "previousScreenType";
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -62,16 +58,12 @@
mProviderStatusWatcher = ProviderStatusWatcher.getInstance(this);
mNewLocalProfileExtra = getIntent().getStringExtra(EXTRA_NEW_LOCAL_PROFILE);
- mModeFullyExpanded = getIntent().getIntExtra(EXTRA_MODE_FULLY_EXPANDED,
- QuickContact.MODE_LARGE);
- mPreviousScreenExtra = getIntent().getStringExtra(EXTRA_PREVIOUS_SCREEN_TYPE);
final int providerStatus = mProviderStatusWatcher.getProviderStatus();
mAreContactsAvailable = providerStatus == ProviderStatus.STATUS_NORMAL;
if (savedInstanceState == null) {
final DisplayOptionsPreferenceFragment fragment = DisplayOptionsPreferenceFragment
- .newInstance(mNewLocalProfileExtra, mPreviousScreenExtra, mModeFullyExpanded,
- mAreContactsAvailable);
+ .newInstance(mNewLocalProfileExtra, mAreContactsAvailable);
getFragmentManager().beginTransaction()
.replace(android.R.id.content, fragment, TAG_DISPLAY_OPTIONS)
.commit();
diff --git a/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java b/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
index 6593619..89208a8 100644
--- a/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
+++ b/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
@@ -39,7 +39,8 @@
import com.android.contacts.common.R;
import com.android.contacts.common.compat.TelecomManagerUtil;
import com.android.contacts.common.compat.TelephonyManagerCompat;
-import com.android.contacts.common.interactions.ImportExportDialogFragment;
+import com.android.contacts.common.interactions.ImportDialogFragment;
+import com.android.contacts.common.interactions.ExportDialogFragment;
import com.android.contacts.common.list.ContactListFilter;
import com.android.contacts.common.list.ContactListFilterController;
import com.android.contacts.common.logging.ScreenEvent.ScreenType;
@@ -60,9 +61,7 @@
private static final int REQUEST_CODE_CUSTOM_CONTACTS_FILTER = 0;
private static final String ARG_CONTACTS_AVAILABLE = "are_contacts_available";
- private static final String ARG_MODE_FULLY_EXPANDED = "mode_fully_expanded";
private static final String ARG_NEW_LOCAL_PROFILE = "new_local_profile";
- private static final String ARG_PREVIOUS_SCREEN = "previous_screen";
private static final String KEY_ABOUT = "about";
private static final String KEY_ACCOUNTS = "accounts";
@@ -70,7 +69,8 @@
private static final String KEY_BLOCKED_NUMBERS = "blockedNumbers";
private static final String KEY_DISPLAY_ORDER = "displayOrder";
private static final String KEY_CUSTOM_CONTACTS_FILTER = "customContactsFilter";
- private static final String KEY_IMPORT_EXPORT = "importExport";
+ private static final String KEY_IMPORT = "import";
+ private static final String KEY_EXPORT = "export";
private static final String KEY_MY_INFO = "myInfo";
private static final String KEY_SORT_ORDER = "sortOrder";
@@ -113,8 +113,6 @@
}
private String mNewLocalProfileExtra;
- private String mPreviousScreenExtra;
- private int mModeFullyExpanded;
private boolean mAreContactsAvailable;
private boolean mHasProfile;
@@ -147,12 +145,10 @@
};
public static DisplayOptionsPreferenceFragment newInstance(String newLocalProfileExtra,
- String previousScreenExtra, int modeFullyExpanded, boolean areContactsAvailable) {
+ boolean areContactsAvailable) {
final DisplayOptionsPreferenceFragment fragment = new DisplayOptionsPreferenceFragment();
final Bundle args = new Bundle();
args.putString(ARG_NEW_LOCAL_PROFILE, newLocalProfileExtra);
- args.putString(ARG_PREVIOUS_SCREEN, previousScreenExtra);
- args.putInt(ARG_MODE_FULLY_EXPANDED, modeFullyExpanded);
args.putBoolean(ARG_CONTACTS_AVAILABLE, areContactsAvailable);
fragment.setArguments(args);
return fragment;
@@ -175,22 +171,25 @@
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preference_display_options);
- removeUnsupportedPreferences();
- addExtraPreferences();
-
final Bundle args = getArguments();
mNewLocalProfileExtra = args.getString(ARG_NEW_LOCAL_PROFILE);
- mPreviousScreenExtra = args.getString(ARG_PREVIOUS_SCREEN);
- mModeFullyExpanded = args.getInt(ARG_MODE_FULLY_EXPANDED);
mAreContactsAvailable = args.getBoolean(ARG_CONTACTS_AVAILABLE);
+ removeUnsupportedPreferences();
+ addExtraPreferences();
+
mMyInfoPreference = findPreference(KEY_MY_INFO);
final Preference accountsPreference = findPreference(KEY_ACCOUNTS);
accountsPreference.setOnPreferenceClickListener(this);
- final Preference importExportPreference = findPreference(KEY_IMPORT_EXPORT);
- importExportPreference.setOnPreferenceClickListener(this);
+ final Preference importPreference = findPreference(KEY_IMPORT);
+ importPreference.setOnPreferenceClickListener(this);
+
+ final Preference exportPreference = findPreference(KEY_EXPORT);
+ if (exportPreference != null) {
+ exportPreference.setOnPreferenceClickListener(this);
+ }
final Preference blockedNumbersPreference = findPreference(KEY_BLOCKED_NUMBERS);
if (blockedNumbersPreference != null) {
@@ -248,6 +247,10 @@
if (!showBlockedNumbers) {
getPreferenceScreen().removePreference(findPreference(KEY_BLOCKED_NUMBERS));
}
+
+ if (!mAreContactsAvailable) {
+ getPreferenceScreen().removePreference(findPreference(KEY_EXPORT));
+ }
}
private void addExtraPreferences() {
@@ -294,23 +297,22 @@
if (KEY_ABOUT.equals(prefKey)) {
((ContactsPreferenceActivity) getActivity()).showAboutFragment();
return true;
- } else if (KEY_IMPORT_EXPORT.equals(prefKey)) {
- ImportExportDialogFragment.show(getFragmentManager(), mAreContactsAvailable,
- ContactsPreferenceActivity.class,
- ImportExportDialogFragment.EXPORT_MODE_ALL_CONTACTS);
+ } else if (KEY_IMPORT.equals(prefKey)) {
+ ImportDialogFragment.show(getFragmentManager(), ContactsPreferenceActivity.class);
+ return true;
+ } else if (KEY_EXPORT.equals(prefKey)) {
+ ExportDialogFragment.show(getFragmentManager(), ContactsPreferenceActivity.class,
+ ExportDialogFragment.EXPORT_MODE_ALL_CONTACTS);
return true;
} else if (KEY_MY_INFO.equals(prefKey)) {
- final Intent intent;
if (mHasProfile) {
final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, mProfileContactId);
- intent = ImplicitIntentsUtil.composeQuickContactIntent(getContext(), uri,
- mModeFullyExpanded);
- intent.putExtra(mPreviousScreenExtra, ScreenType.ME_CONTACT);
+ ImplicitIntentsUtil.startQuickContact(getActivity(), uri, ScreenType.ME_CONTACT);
} else {
- intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
+ final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
intent.putExtra(mNewLocalProfileExtra, true);
+ ImplicitIntentsUtil.startActivityInApp(getActivity(), intent);
}
- ImplicitIntentsUtil.startActivityInApp(getActivity(), intent);
return true;
} else if (KEY_ACCOUNTS.equals(prefKey)) {
ImplicitIntentsUtil.startActivityOutsideApp(getContext(),
diff --git a/src/com/android/contacts/common/util/AccountFilterUtil.java b/src/com/android/contacts/common/util/AccountFilterUtil.java
index 88c6bed..b89e8b9 100644
--- a/src/com/android/contacts/common/util/AccountFilterUtil.java
+++ b/src/com/android/contacts/common/util/AccountFilterUtil.java
@@ -16,28 +16,33 @@
package com.android.contacts.common.util;
+import android.accounts.Account;
import android.app.Activity;
import android.app.Fragment;
+import android.content.ActivityNotFoundException;
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
-import android.database.Cursor;
import android.graphics.drawable.Drawable;
-import android.provider.ContactsContract;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Intents;
import android.text.TextUtils;
import android.util.Log;
+import android.widget.Toast;
-import com.android.contacts.common.R;
+import com.android.contacts.R;
+import com.android.contacts.activities.ContactEditorActivity;
import com.android.contacts.common.list.AccountFilterActivity;
import com.android.contacts.common.list.ContactListFilter;
import com.android.contacts.common.list.ContactListFilterController;
import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.RawContact;
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.preference.ContactsPreferences;
import com.android.contactsbind.ObjectFactory;
+
import com.google.common.collect.Lists;
import java.util.ArrayList;
@@ -128,9 +133,8 @@
DeviceLocalAccountTypeFactory deviceAccountTypeFactory) {
final ArrayList<ContactListFilter> accountFilters = Lists.newArrayList();
final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(context);
- accountTypeManager.sortAccounts(/* defaultAccount */ getDefaultAccount(context));
- final List<AccountWithDataSet> accounts =
- accountTypeManager.getAccounts(/* contactWritableOnly */ true);
+ final List<AccountWithDataSet> accounts = accountTypeManager.getSortedAccounts(
+ /* defaultAccount */ getDefaultAccount(context), /* contactWritableOnly */ true);
for (AccountWithDataSet account : accounts) {
final AccountType accountType =
@@ -158,4 +162,77 @@
private static AccountWithDataSet getDefaultAccount(Context context) {
return new ContactsPreferences(context).getDefaultAccount();
}
+
+ /**
+ * Returns a {@link ContactListFilter} of type
+ * {@link ContactListFilter#FILTER_TYPE_ALL_ACCOUNTS}, or if a custom "Contacts to display"
+ * filter has been set, then one of type {@link ContactListFilter#FILTER_TYPE_CUSTOM}.
+ */
+ public static ContactListFilter createContactsFilter(Context context) {
+ final int filterType =
+ ContactListFilterController.getInstance(context).isCustomFilterPersisted()
+ ? ContactListFilter.FILTER_TYPE_CUSTOM
+ : ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS;
+ return ContactListFilter.createFilterWithType(filterType);
+ }
+
+ /**
+ * Start editor intent; and if filter is an account filter, we pass account info to editor so
+ * as to create a contact in that account.
+ */
+ public static void startEditorIntent(Context context, Intent src, ContactListFilter filter) {
+ final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
+ intent.putExtras(src);
+
+ // If we are in account view, we pass the account explicitly in order to
+ // create contact in the account. This will prevent the default account dialog
+ // from being displayed.
+ if (!isAllContactsFilter(filter) && filter.accountName != null
+ && filter.accountType != null) {
+ final Account account = new Account(filter.accountName, filter.accountType);
+ intent.putExtra(Intents.Insert.EXTRA_ACCOUNT, account);
+ intent.putExtra(Intents.Insert.EXTRA_DATA_SET, filter.dataSet);
+ } else if (isDeviceContactsFilter(filter)) {
+ // It's OK to add this even though it's an implicit intent. If a different app
+ // receives the intent it should just ignore the flag.
+ intent.putExtra(ContactEditorActivity.EXTRA_SAVE_TO_DEVICE_FLAG, true);
+ }
+
+ try {
+ ImplicitIntentsUtil.startActivityInApp(context, intent);
+ } catch (ActivityNotFoundException ex) {
+ Toast.makeText(context, R.string.missing_app, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ public static boolean isAllContactsFilter(ContactListFilter filter) {
+ return filter != null && filter.isContactsFilterType();
+ }
+
+ public static boolean isDeviceContactsFilter(ContactListFilter filter) {
+ return filter.filterType == ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS;
+ }
+
+ /**
+ * Returns action bar title for filter and returns default title "Contacts" if filter is empty.
+ */
+ public static String getActionBarTitleForFilter(Context context, ContactListFilter filter) {
+ if (filter.filterType == ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS) {
+ return context.getString(R.string.account_phone);
+ } else if (!TextUtils.isEmpty(filter.accountName)) {
+ return getActionBarTitleForAccount(context, filter);
+ }
+ return context.getString(R.string.contactsList);
+ }
+
+ private static String getActionBarTitleForAccount(Context context, ContactListFilter filter) {
+ final AccountDisplayInfoFactory factory =
+ AccountDisplayInfoFactory.forAllAccounts(context);
+ final AccountDisplayInfo account = factory.getAccountDisplayInfoFor(filter);
+ if (account.hasGoogleAccountType()) {
+ return context.getString(R.string.title_from_google);
+ }
+ return account.withFormattedName(context, R.string.title_from_other_accounts)
+ .getNameLabel().toString();
+ }
}
diff --git a/src/com/android/contacts/common/util/ImplicitIntentsUtil.java b/src/com/android/contacts/common/util/ImplicitIntentsUtil.java
index 19d171c..9a0eb93 100644
--- a/src/com/android/contacts/common/util/ImplicitIntentsUtil.java
+++ b/src/com/android/contacts/common/util/ImplicitIntentsUtil.java
@@ -16,6 +16,7 @@
package com.android.contacts.common.util;
+import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -27,8 +28,12 @@
import android.provider.Settings;
import android.text.TextUtils;
+import com.android.contacts.common.Experiments;
+import com.android.contacts.common.logging.ScreenEvent.ScreenType;
import com.android.contacts.common.model.account.GoogleAccountType;
import com.android.contacts.quickcontact.QuickContactActivity;
+import com.android.contactsbind.ObjectFactory;
+import com.android.contactsbind.experiments.Flags;
import java.util.List;
@@ -96,16 +101,68 @@
}
/**
+ * Starts QuickContact in app with the default mode and specified previous screen type.
+ */
+ public static void startQuickContact(Activity activity, Uri contactLookupUri,
+ int previousScreenType) {
+ startQuickContact(activity, contactLookupUri, previousScreenType, /* requestCode */ -1);
+ }
+
+ /**
+ * Starts QuickContact for result with the default mode and specified previous screen type.
+ */
+ public static void startQuickContactForResult(Activity activity, Uri contactLookupUri,
+ int previousScreenType, int requestCode) {
+ startQuickContact(activity, contactLookupUri, previousScreenType, requestCode);
+ }
+
+ private static void startQuickContact(Activity activity, Uri contactLookupUri,
+ int previousScreenType, int requestCode) {
+
+ if (Flags.getInstance(activity).getBoolean(Experiments.CONTACT_SHEET)) {
+ final Intent intent = ObjectFactory.getContactSheetIntent(activity, contactLookupUri);
+ if (intent != null) {
+ // We must start ContactSheet "for result" with a requestCode that is >= 0
+ // so that ContactSheet can validate that the caller is a 1P app.
+ activity.startActivityForResult(intent, requestCode >= 0 ? requestCode : 0);
+ return;
+ }
+ }
+
+ final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(
+ activity, contactLookupUri, previousScreenType);
+
+ // For the non ContactSheet case we only start "for result" if specifically requested.
+ if (requestCode >= 0) {
+ intent.setPackage(activity.getPackageName());
+ activity.startActivityForResult(intent, requestCode);
+ } else {
+ startActivityInApp(activity, intent);
+ }
+ }
+
+ /**
+ * Returns an implicit intent for opening QuickContacts with the default mode and specified
+ * previous screen type.
+ */
+ public static Intent composeQuickContactIntent(Context context, Uri contactLookupUri,
+ int previousScreenType) {
+ return composeQuickContactIntent(context, contactLookupUri,
+ QuickContactActivity.MODE_FULLY_EXPANDED, previousScreenType);
+ }
+
+ /**
* Returns an implicit intent for opening QuickContacts.
*/
public static Intent composeQuickContactIntent(Context context, Uri contactLookupUri,
- int extraMode) {
+ int mode, int previousScreenType) {
final Intent intent = new Intent(context, QuickContactActivity.class);
intent.setAction(QuickContact.ACTION_QUICK_CONTACT);
intent.setData(contactLookupUri);
- intent.putExtra(QuickContact.EXTRA_MODE, extraMode);
+ intent.putExtra(QuickContact.EXTRA_MODE, mode);
// Make sure not to show QuickContacts on top of another QuickContacts.
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ intent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE, previousScreenType);
return intent;
}
@@ -134,7 +191,7 @@
public static Intent getIntentForQuickContactLauncherShortcut(Context context, Uri contactUri) {
final Intent intent = composeQuickContactIntent(context, contactUri,
- QuickContact.MODE_LARGE);
+ QuickContact.MODE_LARGE, ScreenType.UNKNOWN);
intent.setPackage(context.getPackageName());
// When starting from the launcher, start in a new, cleared task.
diff --git a/src/com/android/contacts/common/util/NameConverter.java b/src/com/android/contacts/common/util/NameConverter.java
index 9706353..227a0ec 100644
--- a/src/com/android/contacts/common/util/NameConverter.java
+++ b/src/com/android/contacts/common/util/NameConverter.java
@@ -27,9 +27,6 @@
import com.android.contacts.common.model.dataitem.StructuredNameDataItem;
-import java.util.Map;
-import java.util.TreeMap;
-
/**
* Utility class for converting between a display name and structured name (and vice-versa), via
* calls to the contact provider.
@@ -48,28 +45,6 @@
};
/**
- * Converts the given structured name (provided as a map from {@link StructuredName} fields to
- * corresponding values) into a display name string.
- * <p>
- * Note that this operates via a call back to the ContactProvider, but it does not access the
- * database, so it should be safe to call from the UI thread. See
- * ContactsProvider2.completeName() for the underlying method call.
- * @param context Activity context.
- * @param structuredName The structured name map to convert.
- * @return The display name computed from the structured name map.
- */
- public static String structuredNameToDisplayName(Context context,
- Map<String, String> structuredName) {
- Builder builder = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name");
- for (String key : STRUCTURED_NAME_FIELDS) {
- if (structuredName.containsKey(key)) {
- appendQueryParameter(builder, key, structuredName.get(key));
- }
- }
- return fetchDisplayName(context, builder.build());
- }
-
- /**
* Converts the given structured name (provided as ContentValues) into a display name string.
* @param context Activity context.
* @param values The content values containing values comprising the structured name.
@@ -106,70 +81,13 @@
return displayName;
}
- /**
- * Converts the given display name string into a structured name (as a map from
- * {@link StructuredName} fields to corresponding values).
- * <p>
- * Note that this operates via a call back to the ContactProvider, but it does not access the
- * database, so it should be safe to call from the UI thread.
- * @param context Activity context.
- * @param displayName The display name to convert.
- * @return The structured name map computed from the display name.
- */
- public static Map<String, String> displayNameToStructuredName(Context context,
- String displayName) {
- Map<String, String> structuredName = new TreeMap<String, String>();
- Builder builder = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name");
-
- appendQueryParameter(builder, StructuredName.DISPLAY_NAME, displayName);
- Cursor cursor = context.getContentResolver().query(builder.build(), STRUCTURED_NAME_FIELDS,
- null, null, null);
-
- if (cursor != null) {
- try {
- if (cursor.moveToFirst()) {
- for (int i = 0; i < STRUCTURED_NAME_FIELDS.length; i++) {
- structuredName.put(STRUCTURED_NAME_FIELDS[i], cursor.getString(i));
- }
- }
- } finally {
- cursor.close();
- }
- }
- return structuredName;
- }
-
- /**
- * Converts the given display name string into a structured name (inserting the structured
- * values into a new or existing ContentValues object).
- * <p>
- * Note that this operates via a call back to the ContactProvider, but it does not access the
- * database, so it should be safe to call from the UI thread.
- * @param context Activity context.
- * @param displayName The display name to convert.
- * @param contentValues The content values object to place the structured name values into. If
- * null, a new one will be created and returned.
- * @return The ContentValues object containing the structured name fields derived from the
- * display name.
- */
- public static ContentValues displayNameToStructuredName(Context context, String displayName,
- ContentValues contentValues) {
- if (contentValues == null) {
- contentValues = new ContentValues();
- }
- Map<String, String> mapValues = displayNameToStructuredName(context, displayName);
- for (String key : mapValues.keySet()) {
- contentValues.put(key, mapValues.get(key));
- }
- return contentValues;
- }
-
private static void appendQueryParameter(Builder builder, String field, String value) {
if (!TextUtils.isEmpty(value)) {
builder.appendQueryParameter(field, value);
}
}
+
/**
* Parses phonetic name and returns parsed data (family, middle, given) as ContentValues.
* Parsed data should be {@link StructuredName#PHONETIC_FAMILY_NAME},
diff --git a/src/com/android/contacts/common/vcard/NfcImportVCardActivity.java b/src/com/android/contacts/common/vcard/NfcImportVCardActivity.java
index 0634df4..6093405 100644
--- a/src/com/android/contacts/common/vcard/NfcImportVCardActivity.java
+++ b/src/com/android/contacts/common/vcard/NfcImportVCardActivity.java
@@ -17,6 +17,8 @@
package com.android.contacts.common.vcard;
import android.app.Activity;
+import android.app.Notification;
+import android.app.NotificationManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -27,9 +29,11 @@
import android.nfc.NfcAdapter;
import android.os.AsyncTask;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
import android.provider.ContactsContract.RawContacts;
import android.util.Log;
+import android.widget.Toast;
import com.android.contacts.common.R;
import com.android.contacts.common.activity.RequestPermissionsActivity;
@@ -59,6 +63,12 @@
private NdefRecord mRecord;
private AccountWithDataSet mAccount;
+ private Handler mHandler = new Handler();
+
+ /**
+ * Notification id used when error happened before sending an import request to VCardServer.
+ */
+ private static final int FAILURE_NOTIFICATION_ID = 1;
/* package */ class ImportTask extends AsyncTask<VCardService, Void, ImportRequest> {
@Override
@@ -81,6 +91,10 @@
@Override
public void onPostExecute(ImportRequest request) {
+ if (request == null) {
+ // Finish the activity in case of error so it doesn't stay in view.
+ finish();
+ }
unbindService(NfcImportVCardActivity.this);
}
}
@@ -111,6 +125,8 @@
parser.addInterpreter(detector);
parser.parse(is);
} catch (VCardVersionException e2) {
+ Log.e(TAG, "vCard with unsupported version.");
+ showFailureNotification(R.string.fail_reason_not_supported);
return null;
}
} finally {
@@ -120,14 +136,16 @@
}
}
} catch (IOException e) {
- Log.e(TAG, "Failed reading vcard data", e);
+ Log.e(TAG, "Failed reading vCard data", e);
+ showFailureNotification(R.string.fail_reason_io_error);
return null;
} catch (VCardNestedException e) {
Log.w(TAG, "Nested Exception is found (it may be false-positive).");
// Go through without throwing the Exception, as we may be able to detect the
// version before it
} catch (VCardException e) {
- Log.e(TAG, "Error parsing vcard", e);
+ Log.e(TAG, "Error parsing vCard", e);
+ showFailureNotification(R.string.fail_reason_not_supported);
return null;
}
@@ -242,7 +260,8 @@
Log.i(TAG, "Late import failure -- ignoring");
return;
}
- // TODO: report failure
+ showFailureNotification(R.string.vcard_import_request_rejected_message);
+ finish();
}
@Override
@@ -269,4 +288,22 @@
public void onComplete() {
// do nothing
}
+
+ /* package */ void showFailureNotification(int reasonId) {
+ final NotificationManager notificationManager =
+ (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+ final Notification notification =
+ NotificationImportExportListener.constructImportFailureNotification(
+ this,
+ getString(reasonId));
+ notificationManager.notify(NotificationImportExportListener.FAILURE_NOTIFICATION_TAG,
+ FAILURE_NOTIFICATION_ID, notification);
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(NfcImportVCardActivity.this,
+ getString(R.string.vcard_import_failed), Toast.LENGTH_LONG).show();
+ }
+ });
+ }
}
diff --git a/src/com/android/contacts/editor/AggregationSuggestionEngine.java b/src/com/android/contacts/editor/AggregationSuggestionEngine.java
index 6447ff4..8ababa8 100644
--- a/src/com/android/contacts/editor/AggregationSuggestionEngine.java
+++ b/src/com/android/contacts/editor/AggregationSuggestionEngine.java
@@ -39,6 +39,7 @@
import android.text.TextUtils;
import com.android.contacts.common.model.ValuesDelta;
+import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.compat.AggregationSuggestionsCompat;
import com.google.common.collect.Lists;
@@ -113,12 +114,13 @@
private Handler mMainHandler;
private Handler mHandler;
private long mContactId;
+ private AccountWithDataSet mAccountFilter;
private Listener mListener;
private Cursor mDataCursor;
private ContentObserver mContentObserver;
private Uri mSuggestionsUri;
private int mSuggestionsLimit = 3;
- private boolean mPruneInvisibleContacts = true;
+ private boolean mPruneInvisibleContacts = false;
public AggregationSuggestionEngine(Context context) {
super("AggregationSuggestions", Process.THREAD_PRIORITY_BACKGROUND);
@@ -150,6 +152,10 @@
}
}
+ public void setAccountFilter(AccountWithDataSet account) {
+ mAccountFilter = account;
+ }
+
public void setSuggestionsLimit(int suggestionsLimit) {
mSuggestionsLimit = suggestionsLimit;
}
@@ -435,7 +441,10 @@
suggestion.name = mDataCursor.getString(DataQuery.DISPLAY_NAME);
suggestion.lookupKey = mDataCursor.getString(DataQuery.LOOKUP_KEY);
suggestion.rawContacts = Lists.newArrayList();
- list.add(suggestion);
+ // No restriction, add all suggestions.
+ if (mAccountFilter == null) {
+ list.add(suggestion);
+ }
currentContactId = contactId;
}
@@ -446,6 +455,14 @@
rawContact.accountName = mDataCursor.getString(DataQuery.ACCOUNT_NAME);
rawContact.accountType = mDataCursor.getString(DataQuery.ACCOUNT_TYPE);
rawContact.dataSet = mDataCursor.getString(DataQuery.DATA_SET);
+ final AccountWithDataSet account = new AccountWithDataSet(
+ rawContact.accountName, rawContact.accountType, rawContact.dataSet);
+ // If we're restricting to a certain account, only add the suggestion if
+ // it has a raw contact from that account.
+ if (mAccountFilter != null && mAccountFilter.equals(account)
+ && !list.contains(suggestion)) {
+ list.add(suggestion);
+ }
suggestion.rawContacts.add(rawContact);
}
diff --git a/src/com/android/contacts/editor/BaseRawContactEditorView.java b/src/com/android/contacts/editor/BaseRawContactEditorView.java
deleted file mode 100644
index 1cdfafb..0000000
--- a/src/com/android/contacts/editor/BaseRawContactEditorView.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.editor;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.Data;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.contacts.R;
-import com.android.contacts.common.model.RawContactDelta;
-import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.RawContactModifier;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.AccountType.EditType;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-
-/**
- * Base view that provides common code for the editor interaction for a specific
- * RawContact represented through an {@link RawContactDelta}.
- * <p>
- * Internal updates are performed against {@link ValuesDelta} so that the
- * source {@link RawContact} can be swapped out. Any state-based changes, such as
- * adding {@link Data} rows or changing {@link EditType}, are performed through
- * {@link RawContactModifier} to ensure that {@link AccountType} are enforced.
- */
-public abstract class BaseRawContactEditorView extends LinearLayout {
-
- private PhotoEditorView mPhoto;
-
- private View mAccountHeaderContainer;
- private ImageView mExpandAccountButton;
- private LinearLayout mCollapsibleSection;
- private TextView mAccountName;
- private TextView mAccountType;
-
- protected Listener mListener;
-
- public interface Listener {
- void onExternalEditorRequest(AccountWithDataSet account, Uri uri);
- void onEditorExpansionChanged();
- }
-
- public BaseRawContactEditorView(Context context) {
- super(context);
- }
-
- public BaseRawContactEditorView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mPhoto = (PhotoEditorView)findViewById(R.id.edit_photo);
- mPhoto.setEnabled(isEnabled());
-
- mAccountHeaderContainer = findViewById(R.id.account_header_container);
- mExpandAccountButton = (ImageView) findViewById(R.id.account_expander_icon);
- mExpandAccountButton.setColorFilter(R.color.quantum_black_secondary_text);
- mCollapsibleSection = (LinearLayout) findViewById(R.id.collapsable_section);
- mAccountName = (TextView) findViewById(R.id.account_name);
- mAccountType = (TextView) findViewById(R.id.account_type);
-
- setCollapsed(false);
- setCollapsible(true);
- }
-
- public void setGroupMetaData(Cursor groupMetaData) {
- }
-
-
- public void setListener(Listener listener) {
- mListener = listener;
- }
-
- /**
- * Assign the given {@link Bitmap} to the internal {@link PhotoEditorView}
- * in order to update the {@link RawContactDelta} currently being edited.
- */
- public void setPhotoEntry(Bitmap bitmap) {
- mPhoto.setPhotoEntry(bitmap);
- }
-
- /**
- * Assign the given photo {@link Uri} to UI of the {@link PhotoEditorView}, so that it can
- * display a full sized photo.
- */
- public void setFullSizedPhoto(Uri uri) {
- mPhoto.setFullSizedPhoto(uri);
- }
-
- protected void setHasPhotoEditor(boolean hasPhotoEditor) {
- mPhoto.setVisibility(hasPhotoEditor ? View.VISIBLE : View.GONE);
- }
-
- /**
- * Return true if internal {@link PhotoEditorView} has a {@link Photo} set.
- */
- public boolean hasSetPhoto() {
- return mPhoto.hasSetPhoto();
- }
-
- public PhotoEditorView getPhotoEditor() {
- return mPhoto;
- }
-
- /**
- * @return the RawContact ID that this editor is editing.
- */
- public abstract long getRawContactId();
-
- /**
- * If {@param isCollapsible} is TRUE, then this editor can be collapsed by clicking on its
- * account header.
- */
- public void setCollapsible(boolean isCollapsible) {
- if (isCollapsible) {
- mAccountHeaderContainer.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- final int startingHeight = mCollapsibleSection.getMeasuredHeight();
- final boolean isCollapsed = isCollapsed();
- setCollapsed(!isCollapsed);
- // The slideAndFadeIn animation only looks good when collapsing. For expanding,
- // it looks like the editor is loading sluggishly. I tried animating the
- // clipping bounds instead of the alpha value. But because the editors are very
- // tall, this animation looked very similar to doing no animation at all. It
- // wasn't worth the significant additional complexity.
- if (!isCollapsed) {
- EditorAnimator.getInstance().slideAndFadeIn(mCollapsibleSection,
- startingHeight);
- // We want to place the focus near the top of the screen now that a
- // potentially focused editor is being collapsed.
- EditorAnimator.placeFocusAtTopOfScreenAfterReLayout(mCollapsibleSection);
- } else {
- // When expanding we should scroll the expanded view onto the screen.
- // Otherwise, user's may not notice that any expansion happened.
- EditorAnimator.getInstance().scrollViewToTop(mAccountHeaderContainer);
- mCollapsibleSection.requestFocus();
- }
- if (mListener != null) {
- mListener.onEditorExpansionChanged();
- }
- updateAccountHeaderContentDescription();
- }
- });
- mExpandAccountButton.setVisibility(View.VISIBLE);
- mAccountHeaderContainer.setClickable(true);
- } else {
- mAccountHeaderContainer.setOnClickListener(null);
- mExpandAccountButton.setVisibility(View.GONE);
- mAccountHeaderContainer.setClickable(false);
- }
- }
-
- public boolean isCollapsed() {
- return mCollapsibleSection.getLayoutParams().height == 0;
- }
-
- public void setCollapsed(boolean isCollapsed) {
- final LinearLayout.LayoutParams params
- = (LayoutParams) mCollapsibleSection.getLayoutParams();
- if (isCollapsed) {
- params.height = 0;
- mCollapsibleSection.setLayoutParams(params);
- mExpandAccountButton.setImageDrawable(getContext().getDrawable(
- R.drawable.ic_menu_expand_minimized_24dp));
- } else {
- params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
- mCollapsibleSection.setLayoutParams(params);
- mExpandAccountButton.setImageDrawable(getContext().getDrawable(
- R.drawable.ic_menu_expand_maximized_24dp));
- }
- }
-
- protected void updateAccountHeaderContentDescription() {
- final StringBuilder builder = new StringBuilder();
- builder.append(EditorUiUtils.getAccountInfoContentDescription(
- mAccountName.getText(), mAccountType.getText()));
- if (mExpandAccountButton.getVisibility() == View.VISIBLE) {
- builder.append(getResources().getString(isCollapsed()
- ? R.string.content_description_expand_editor
- : R.string.content_description_collapse_editor));
- }
- mAccountHeaderContainer.setContentDescription(builder);
- }
-
- /**
- * Set the internal state for this view, given a current
- * {@link RawContactDelta} state and the {@link AccountType} that
- * apply to that state.
- */
- public abstract void setState(RawContactDelta state, AccountType source, ViewIdGenerator vig,
- boolean isProfile);
-}
diff --git a/src/com/android/contacts/editor/CancelEditDialogFragment.java b/src/com/android/contacts/editor/CancelEditDialogFragment.java
index ba5f9fa..d467f3c 100644
--- a/src/com/android/contacts/editor/CancelEditDialogFragment.java
+++ b/src/com/android/contacts/editor/CancelEditDialogFragment.java
@@ -35,7 +35,7 @@
* Shows a {@link CancelEditDialogFragment} after setting the given Fragment as the
* target of the dialog.
*/
- public static void show(ContactEditorBaseFragment fragment) {
+ public static void show(ContactEditorFragment fragment) {
final CancelEditDialogFragment dialog = new CancelEditDialogFragment();
dialog.setTargetFragment(fragment, 0);
dialog.show(fragment.getFragmentManager(), TAG);
@@ -69,4 +69,4 @@
*/
void onCancelEditConfirmed();
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/contacts/editor/CompactContactEditorFragment.java b/src/com/android/contacts/editor/CompactContactEditorFragment.java
deleted file mode 100644
index 1d7fa46..0000000
--- a/src/com/android/contacts/editor/CompactContactEditorFragment.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.contacts.editor;
-
-import com.android.contacts.ContactSaveService;
-import com.android.contacts.R;
-import com.android.contacts.activities.CompactContactEditorActivity;
-import com.android.contacts.common.model.RawContactDelta;
-import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.util.ContactPhotoUtils;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-import android.widget.Toast;
-
-import java.io.FileNotFoundException;
-import java.util.ArrayList;
-
-/**
- * Contact editor with only the most important fields displayed initially.
- */
-public class CompactContactEditorFragment extends ContactEditorBaseFragment implements
- CompactRawContactsEditorView.Listener, CompactPhotoEditorView.Listener {
-
- private static final String KEY_PHOTO_RAW_CONTACT_ID = "photo_raw_contact_id";
- private static final String KEY_UPDATED_PHOTOS = "updated_photos";
-
- private long mPhotoRawContactId;
- private Bundle mUpdatedPhotos = new Bundle();
-
- @Override
- public void onCreate(Bundle savedState) {
- super.onCreate(savedState);
-
- if (savedState != null) {
- mPhotoRawContactId = savedState.getLong(KEY_PHOTO_RAW_CONTACT_ID);
- mUpdatedPhotos = savedState.getParcelable(KEY_UPDATED_PHOTOS);
- }
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
- setHasOptionsMenu(true);
-
- final View view = inflater.inflate(
- R.layout.compact_contact_editor_fragment, container, false);
- mContent = (LinearLayout) view.findViewById(R.id.raw_contacts_editor_view);
- return view;
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- outState.putLong(KEY_PHOTO_RAW_CONTACT_ID, mPhotoRawContactId);
- outState.putParcelable(KEY_UPDATED_PHOTOS, mUpdatedPhotos);
- super.onSaveInstanceState(outState);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == android.R.id.home) {
- return revert();
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- protected void bindEditors() {
- if (!isReadyToBindEditors()) {
- return;
- }
-
- // Add input fields for the loaded Contact
- final CompactRawContactsEditorView editorView = getContent();
- editorView.setListener(this);
- editorView.setState(mState, getMaterialPalette(), mViewIdGenerator, mPhotoId,
- mHasNewContact, mIsUserProfile, mAccountWithDataSet);
- if (mHasNewContact && !TextUtils.isEmpty(mReadOnlyDisplayName)) {
- mReadOnlyNameEditorView = editorView.getPrimaryNameEditorView();
- editorView.maybeSetReadOnlyDisplayNameAsPrimary(mReadOnlyDisplayName);
- }
-
- // Set up the photo widget
- editorView.setPhotoListener(this);
- mPhotoRawContactId = editorView.getPhotoRawContactId();
- // If there is an updated full resolution photo apply it now, this will be the case if
- // the user selects or takes a new photo, then rotates the device.
- final Uri uri = (Uri) mUpdatedPhotos.get(String.valueOf(mPhotoRawContactId));
- if (uri != null) {
- editorView.setFullSizePhoto(uri);
- }
-
- // The editor is ready now so make it visible
- editorView.setEnabled(isEnabled());
- editorView.setVisibility(View.VISIBLE);
-
- // Refresh the ActionBar as the visibility of the join command
- // Activity can be null if we have been detached from the Activity.
- invalidateOptionsMenu();
- }
-
- private boolean isReadyToBindEditors() {
- if (mState.isEmpty()) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "No data to bind editors");
- }
- return false;
- }
- if (mIsEdit && !mExistingContactDataReady) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "Existing contact data is not ready to bind editors.");
- }
- return false;
- }
- if (mHasNewContact && !mNewContactDataReady) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "New contact data is not ready to bind editors.");
- }
- return false;
- }
- return true;
- }
-
- @Override
- protected View getAggregationAnchorView(long rawContactId) {
- return getContent().getAggregationAnchorView();
- }
-
- @Override
- protected void setGroupMetaData() {
- if (mGroupMetaData != null) {
- getContent().setGroupMetaData(mGroupMetaData);
- }
- }
-
- @Override
- protected boolean doSaveAction(int saveMode, Long joinContactId) {
- final Intent intent = ContactSaveService.createSaveContactIntent(mContext, mState,
- SAVE_MODE_EXTRA_KEY, saveMode, isEditingUserProfile(),
- ((Activity) mContext).getClass(),
- CompactContactEditorActivity.ACTION_SAVE_COMPLETED, mUpdatedPhotos,
- JOIN_CONTACT_ID_EXTRA_KEY, joinContactId);
- return startSaveService(mContext, intent, saveMode);
- }
-
- @Override
- protected void joinAggregate(final long contactId) {
- final Intent intent = ContactSaveService.createJoinContactsIntent(
- mContext, mContactIdForJoin, contactId, CompactContactEditorActivity.class,
- CompactContactEditorActivity.ACTION_JOIN_COMPLETED);
- mContext.startService(intent);
- }
-
- public void removePhoto() {
- getContent().removePhoto();
- mUpdatedPhotos.remove(String.valueOf(mPhotoRawContactId));
- }
-
- public void updatePhoto(Uri uri) throws FileNotFoundException {
- final Bitmap bitmap = ContactPhotoUtils.getBitmapFromUri(getActivity(), uri);
- if (bitmap == null || bitmap.getHeight() <= 0 || bitmap.getWidth() <= 0) {
- Toast.makeText(mContext, R.string.contactPhotoSavedErrorToast,
- Toast.LENGTH_SHORT).show();
- return;
- }
- mUpdatedPhotos.putParcelable(String.valueOf(mPhotoRawContactId), uri);
- getContent().updatePhoto(uri);
- }
-
- public void setPrimaryPhoto(CompactPhotoSelectionFragment.Photo photo) {
- getContent().setPrimaryPhoto(photo);
-
- // Update the photo ID we will try to match when selecting the photo to display
- mPhotoId = photo.photoId;
- }
-
- @Override
- public void onNameFieldChanged(long rawContactId, ValuesDelta valuesDelta) {
- final Activity activity = getActivity();
- if (activity == null || activity.isFinishing()) {
- return;
- }
- acquireAggregationSuggestions(activity, rawContactId, valuesDelta);
- }
-
- @Override
- public void onRebindEditorsForNewContact(RawContactDelta oldState,
- AccountWithDataSet oldAccount, AccountWithDataSet newAccount) {
- mNewContactAccountChanged = true;
- mAccountWithDataSet = newAccount;
- rebindEditorsForNewContact(oldState, oldAccount, newAccount);
- }
-
- @Override
- public void onBindEditorsFailed() {
- final Activity activity = getActivity();
- if (activity != null && !activity.isFinishing()) {
- Toast.makeText(activity, R.string.compact_editor_failed_to_load,
- Toast.LENGTH_SHORT).show();
- activity.setResult(Activity.RESULT_CANCELED);
- activity.finish();
- }
- }
-
- @Override
- public void onEditorsBound() {
- final Activity activity = getActivity();
- if (activity == null || activity.isFinishing()) {
- return;
- }
- getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupsLoaderListener);
- }
-
- @Override
- public void onPhotoEditorViewClicked() {
- if (isEditingMultipleRawContacts()) {
- final ArrayList<CompactPhotoSelectionFragment.Photo> photos = getContent().getPhotos();
- if (photos.size() > 1) {
- updatePrimaryForSelection(photos);
- // For aggregate contacts, the user may select a new super primary photo from among
- // the (non-default) raw contact photos, or source a new photo.
- getEditorActivity().selectPhoto(photos, getPhotoMode());
- return;
- }
- }
- // For contacts composed of a single writable raw contact, or raw contacts have no more
- // than 1 photo, clicking the photo view simply opens the source photo dialog
- getEditorActivity().changePhoto(getPhotoMode());
- }
-
- // This method override photo's primary flag based on photoId and set the photo currently
- // shown in the editor to be the new primary no matter how many primary photos there are in
- // the photo picker. This is because the photos returned by "getPhoto" may contain 0, 1,
- // or 2+ primary photos and when we link contacts in the editor, the photos returned may change.
- // We need to put check mark on the photo currently shown in editor, so we override "primary".
- // This doesn't modify anything in the database,so there would be no pending changes.
- private void updatePrimaryForSelection(ArrayList<CompactPhotoSelectionFragment.Photo> photos) {
- for (CompactPhotoSelectionFragment.Photo photo : photos) {
- if (photo.photoId == mPhotoId) {
- photo.primary = true;
- } else {
- photo.primary = false;
- }
- updateContentDescription(photo);
- }
- }
-
- private void updateContentDescription(CompactPhotoSelectionFragment.Photo photo) {
- if (!TextUtils.isEmpty(photo.accountType)) {
- photo.contentDescription = getResources().getString(photo.primary ?
- R.string.photo_view_description_checked :
- R.string.photo_view_description_not_checked,
- photo.accountType, photo.accountName);
- photo.contentDescriptionChecked = getResources().getString(
- R.string.photo_view_description_checked,
- photo.accountType, photo.accountName);
- } else {
- photo.contentDescription = getResources().getString(photo.primary ?
- R.string.photo_view_description_checked_no_info :
- R.string.photo_view_description_not_checked_no_info);
- photo.contentDescriptionChecked = getResources().getString(
- R.string.photo_view_description_checked_no_info);
- }
- }
-
- @Override
- public void onRawContactSelected(Uri uri, long rawContactId, boolean isReadOnly) {
- final Activity activity = getActivity();
- if (activity != null && !activity.isFinishing()) {
- final Intent intent = EditorIntents.createEditContactIntentForRawContact(
- activity, uri, rawContactId, isReadOnly);
- activity.startActivity(intent);
- }
- }
-
- @Override
- public Bundle getUpdatedPhotos() {
- return mUpdatedPhotos;
- }
-
- private int getPhotoMode() {
- if (getContent().isWritablePhotoSet()) {
- return isEditingMultipleRawContacts()
- ? PhotoActionPopup.Modes.MULTIPLE_WRITE_ABLE_PHOTOS
- : PhotoActionPopup.Modes.WRITE_ABLE_PHOTO;
- }
- return PhotoActionPopup.Modes.NO_PHOTO;
- }
-
- private CompactContactEditorActivity getEditorActivity() {
- return (CompactContactEditorActivity) getActivity();
- }
-
- private CompactRawContactsEditorView getContent() {
- return (CompactRawContactsEditorView) mContent;
- }
-}
diff --git a/src/com/android/contacts/editor/CompactKindSectionView.java b/src/com/android/contacts/editor/CompactKindSectionView.java
deleted file mode 100644
index f550c6d..0000000
--- a/src/com/android/contacts/editor/CompactKindSectionView.java
+++ /dev/null
@@ -1,606 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.editor;
-
-import com.android.contacts.R;
-import com.android.contacts.common.model.RawContactDelta;
-import com.android.contacts.common.model.RawContactModifier;
-import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.dataitem.DataKind;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.provider.ContactsContract.CommonDataKinds.Event;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
-import android.provider.ContactsContract.CommonDataKinds.Nickname;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Version of {@link KindSectionView} that supports multiple RawContactDeltas.
- */
-public class CompactKindSectionView extends LinearLayout {
-
- /**
- * Marks a name as super primary when it is changed.
- *
- * This is for the case when two or more raw contacts with names are joined where neither is
- * marked as super primary.
- */
- private static final class StructuredNameEditorListener implements Editor.EditorListener {
-
- private final ValuesDelta mValuesDelta;
- private final long mRawContactId;
- private final CompactRawContactsEditorView.Listener mListener;
-
- public StructuredNameEditorListener(ValuesDelta valuesDelta, long rawContactId,
- CompactRawContactsEditorView.Listener listener) {
- mValuesDelta = valuesDelta;
- mRawContactId = rawContactId;
- mListener = listener;
- }
-
- @Override
- public void onRequest(int request) {
- if (request == Editor.EditorListener.FIELD_CHANGED) {
- mValuesDelta.setSuperPrimary(true);
- if (mListener != null) {
- mListener.onNameFieldChanged(mRawContactId, mValuesDelta);
- }
- } else if (request == Editor.EditorListener.FIELD_TURNED_EMPTY) {
- mValuesDelta.setSuperPrimary(false);
- }
- }
-
- @Override
- public void onDeleteRequested(Editor editor) {
- editor.clearAllFields();
- }
- }
-
- /**
- * Clears fields when deletes are requested (on phonetic and nickename fields);
- * does not change the number of editors.
- */
- private static final class OtherNameKindEditorListener implements Editor.EditorListener {
-
- @Override
- public void onRequest(int request) {
- }
-
- @Override
- public void onDeleteRequested(Editor editor) {
- editor.clearAllFields();
- }
- }
-
- /**
- * Updates empty fields when fields are deleted or turns empty.
- * Whether a new empty editor is added is controlled by {@link #setShowOneEmptyEditor} and
- * {@link #setHideWhenEmpty}.
- */
- private class NonNameEditorListener implements Editor.EditorListener {
-
- @Override
- public void onRequest(int request) {
- // If a field has become empty or non-empty, then check if another row
- // can be added dynamically.
- if (request == FIELD_TURNED_EMPTY || request == FIELD_TURNED_NON_EMPTY) {
- updateEmptyEditors(/* shouldAnimate = */ true);
- }
- }
-
- @Override
- public void onDeleteRequested(Editor editor) {
- if (mShowOneEmptyEditor && mEditors.getChildCount() == 1) {
- // If there is only 1 editor in the section, then don't allow the user to
- // delete it. Just clear the fields in the editor.
- editor.clearAllFields();
- } else {
- editor.deleteEditor();
- }
- }
- }
-
- private class EventEditorListener extends NonNameEditorListener {
-
- @Override
- public void onRequest(int request) {
- super.onRequest(request);
- }
-
- @Override
- public void onDeleteRequested(Editor editor) {
- if (editor instanceof EventFieldEditorView){
- final EventFieldEditorView delView = (EventFieldEditorView) editor;
- if (delView.isBirthdayType() && mEditors.getChildCount() > 1) {
- final EventFieldEditorView bottomView = (EventFieldEditorView) mEditors
- .getChildAt(mEditors.getChildCount() - 1);
- bottomView.restoreBirthday();
- }
- }
- super.onDeleteRequested(editor);
- }
- }
-
- private KindSectionDataList mKindSectionDataList;
- private ViewIdGenerator mViewIdGenerator;
- private CompactRawContactsEditorView.Listener mListener;
-
- private boolean mIsUserProfile;
- private boolean mShowOneEmptyEditor = false;
- private boolean mHideIfEmpty = true;
-
- private LayoutInflater mLayoutInflater;
- private ViewGroup mEditors;
- private ImageView mIcon;
-
- public CompactKindSectionView(Context context) {
- this(context, /* attrs =*/ null);
- }
-
- public CompactKindSectionView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
- if (mEditors != null) {
- int childCount = mEditors.getChildCount();
- for (int i = 0; i < childCount; i++) {
- mEditors.getChildAt(i).setEnabled(enabled);
- }
- }
- }
-
- @Override
- protected void onFinishInflate() {
- setDrawingCacheEnabled(true);
- setAlwaysDrawnWithCacheEnabled(true);
-
- mLayoutInflater = (LayoutInflater) getContext().getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
-
- mEditors = (ViewGroup) findViewById(R.id.kind_editors);
- mIcon = (ImageView) findViewById(R.id.kind_icon);
- }
-
- public void setIsUserProfile(boolean isUserProfile) {
- mIsUserProfile = isUserProfile;
- }
-
- /**
- * @param showOneEmptyEditor If true, we will always show one empty editor, otherwise an empty
- * editor will not be shown until the user enters a value. Note, this does not apply
- * to name editors since those are always displayed.
- */
- public void setShowOneEmptyEditor(boolean showOneEmptyEditor) {
- mShowOneEmptyEditor = showOneEmptyEditor;
- }
-
- /**
- * @param hideWhenEmpty If true, the entire section will be hidden if all inputs are empty,
- * otherwise one empty input will always be displayed. Note, this does not apply
- * to name editors since those are always displayed.
- */
- public void setHideWhenEmpty(boolean hideWhenEmpty) {
- mHideIfEmpty = hideWhenEmpty;
- }
-
- /** Binds the given group data to every {@link GroupMembershipView}. */
- public void setGroupMetaData(Cursor cursor) {
- for (int i = 0; i < mEditors.getChildCount(); i++) {
- final View view = mEditors.getChildAt(i);
- if (view instanceof GroupMembershipView) {
- ((GroupMembershipView) view).setGroupMetaData(cursor);
- }
- }
- }
-
- /**
- * Whether this is a name kind section view and all name fields (structured, phonetic,
- * and nicknames) are empty.
- */
- public boolean isEmptyName() {
- if (!StructuredName.CONTENT_ITEM_TYPE.equals(mKindSectionDataList.getMimeType())) {
- return false;
- }
- for (int i = 0; i < mEditors.getChildCount(); i++) {
- final View view = mEditors.getChildAt(i);
- if (view instanceof Editor) {
- final Editor editor = (Editor) view;
- if (!editor.isEmpty()) {
- return false;
- }
- }
- }
- return true;
- }
-
- /**
- * Sets the given display name as the structured name as if the user input it, but
- * without informing editor listeners.
- */
- public void setName(String displayName) {
- if (!StructuredName.CONTENT_ITEM_TYPE.equals(mKindSectionDataList.getMimeType())) {
- return;
- }
- for (int i = 0; i < mEditors.getChildCount(); i++) {
- final View view = mEditors.getChildAt(i);
- if (view instanceof StructuredNameEditorView) {
- final StructuredNameEditorView editor = (StructuredNameEditorView) view;
-
- // Detach listeners since so we don't show suggested aggregations
- final Editor.EditorListener editorListener = editor.getEditorListener();
- editor.setEditorListener(null);
-
- editor.setDisplayName(displayName);
-
- // Reattach listeners
- editor.setEditorListener(editorListener);
-
- return;
- }
- }
- }
-
- public StructuredNameEditorView getPrimaryNameEditorView() {
- if (!StructuredName.CONTENT_ITEM_TYPE.equals(mKindSectionDataList.getMimeType())
- || mEditors.getChildCount() == 0) {
- return null;
- }
- return (StructuredNameEditorView) mEditors.getChildAt(0);
- }
-
- /**
- * Binds views for the given {@link KindSectionData} list.
- *
- * We create a structured name and phonetic name editor for each {@link DataKind} with a
- * {@link StructuredName#CONTENT_ITEM_TYPE} mime type. The number and order of editors are
- * rendered as they are given to {@link #setState}.
- *
- * Empty name editors are never added and at least one structured name editor is always
- * displayed, even if it is empty.
- */
- public void setState(KindSectionDataList kindSectionDataList,
- ViewIdGenerator viewIdGenerator, CompactRawContactsEditorView.Listener listener,
- ValuesDelta primaryValuesDelta) {
- mKindSectionDataList = kindSectionDataList;
- mViewIdGenerator = viewIdGenerator;
- mListener = listener;
-
- // Set the icon using the first DataKind
- final DataKind dataKind = mKindSectionDataList.getDataKind();
- if (dataKind != null) {
- mIcon.setImageDrawable(EditorUiUtils.getMimeTypeDrawable(getContext(),
- dataKind.mimeType));
- if (mIcon.getDrawable() != null) {
- mIcon.setContentDescription(dataKind.titleRes == -1 || dataKind.titleRes == 0
- ? "" : getResources().getString(dataKind.titleRes));
- }
- }
-
- rebuildFromState(primaryValuesDelta);
-
- updateEmptyEditors(/* shouldAnimate = */ false);
- }
-
- private void rebuildFromState(ValuesDelta primaryValuesDelta) {
- mEditors.removeAllViews();
-
- final String mimeType = mKindSectionDataList.getMimeType();
- for (KindSectionData kindSectionData : mKindSectionDataList) {
- if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
- addNameEditorViews(kindSectionData.getAccountType(),
- primaryValuesDelta, kindSectionData.getRawContactDelta());
- } else if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) {
- addGroupEditorView(kindSectionData.getRawContactDelta(),
- kindSectionData.getDataKind());
- } else {
- final Editor.EditorListener editorListener;
- if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType)) {
- editorListener = new OtherNameKindEditorListener();
- } else if (Event.CONTENT_ITEM_TYPE.equals(mimeType)) {
- editorListener = new EventEditorListener();
- } else {
- editorListener = new NonNameEditorListener();
- }
- for (ValuesDelta valuesDelta : kindSectionData.getVisibleValuesDeltas()) {
- addNonNameEditorView(kindSectionData.getRawContactDelta(),
- kindSectionData.getDataKind(), valuesDelta, editorListener);
- }
- }
- }
- }
-
- private void addNameEditorViews(AccountType accountType,
- ValuesDelta valuesDelta, RawContactDelta rawContactDelta) {
- final boolean readOnly = !accountType.areContactsWritable();
-
- if (readOnly) {
- final View nameView = mLayoutInflater.inflate(
- R.layout.structured_name_readonly_editor_view, mEditors,
- /* attachToRoot =*/ false);
-
- // Display name
- ((TextView) nameView.findViewById(R.id.display_name))
- .setText(valuesDelta.getDisplayName());
-
- // Account type info
- final LinearLayout accountTypeLayout = (LinearLayout)
- nameView.findViewById(R.id.account_type);
- accountTypeLayout.setVisibility(View.VISIBLE);
- ((ImageView) accountTypeLayout.findViewById(R.id.account_type_icon))
- .setImageDrawable(accountType.getDisplayIcon(getContext()));
- ((TextView) accountTypeLayout.findViewById(R.id.account_type_name))
- .setText(accountType.getDisplayLabel(getContext()));
-
- mEditors.addView(nameView);
- return;
- }
-
- // Structured name
- final StructuredNameEditorView nameView = (StructuredNameEditorView) mLayoutInflater
- .inflate(R.layout.structured_name_editor_view, mEditors, /* attachToRoot =*/ false);
- if (!mIsUserProfile) {
- // Don't set super primary for the me contact
- nameView.setEditorListener(new StructuredNameEditorListener(
- valuesDelta, rawContactDelta.getRawContactId(), mListener));
- }
- nameView.setDeletable(false);
- nameView.setValues(
- accountType.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME),
- valuesDelta, rawContactDelta, /* readOnly =*/ false, mViewIdGenerator);
-
- // Correct start margin since there is a second icon in the structured name layout
- nameView.findViewById(R.id.kind_icon).setVisibility(View.GONE);
- mEditors.addView(nameView);
-
- // Phonetic name
- final DataKind phoneticNameKind = accountType
- .getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME);
- // The account type doesn't support phonetic name.
- if (phoneticNameKind == null) return;
-
- final PhoneticNameEditorView phoneticNameView = (PhoneticNameEditorView) mLayoutInflater
- .inflate(R.layout.phonetic_name_editor_view, mEditors, /* attachToRoot =*/ false);
- phoneticNameView.setEditorListener(new OtherNameKindEditorListener());
- phoneticNameView.setDeletable(false);
- phoneticNameView.setValues(
- accountType.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME),
- valuesDelta, rawContactDelta, /* readOnly =*/ false, mViewIdGenerator);
-
- // Fix the start margin for phonetic name views
- final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- layoutParams.setMargins(0, 0, 0, 0);
- phoneticNameView.setLayoutParams(layoutParams);
- mEditors.addView(phoneticNameView);
- }
-
- private void addGroupEditorView(RawContactDelta rawContactDelta, DataKind dataKind) {
- final GroupMembershipView view = (GroupMembershipView) mLayoutInflater.inflate(
- R.layout.item_group_membership, mEditors, /* attachToRoot =*/ false);
- view.setKind(dataKind);
- view.setEnabled(isEnabled());
- view.setState(rawContactDelta);
-
- // Correct start margin since there is a second icon in the group layout
- view.findViewById(R.id.kind_icon).setVisibility(View.GONE);
-
- mEditors.addView(view);
- }
-
- private View addNonNameEditorView(RawContactDelta rawContactDelta, DataKind dataKind,
- ValuesDelta valuesDelta, Editor.EditorListener editorListener) {
- // Inflate the layout
- final View view = mLayoutInflater.inflate(
- EditorUiUtils.getLayoutResourceId(dataKind.mimeType), mEditors, false);
- view.setEnabled(isEnabled());
- if (view instanceof Editor) {
- final Editor editor = (Editor) view;
- editor.setDeletable(true);
- editor.setEditorListener(editorListener);
- editor.setValues(dataKind, valuesDelta, rawContactDelta, !dataKind.editable,
- mViewIdGenerator);
- }
- mEditors.addView(view);
-
- return view;
- }
-
- /**
- * Updates the editors being displayed to the user removing extra empty
- * {@link Editor}s, so there is only max 1 empty {@link Editor} view at a time.
- * If there is only 1 empty editor and {@link #setHideWhenEmpty} was set to true,
- * then the entire section is hidden.
- */
- public void updateEmptyEditors(boolean shouldAnimate) {
- final boolean isNameKindSection = StructuredName.CONTENT_ITEM_TYPE.equals(
- mKindSectionDataList.getMimeType());
- final boolean isGroupKindSection = GroupMembership.CONTENT_ITEM_TYPE.equals(
- mKindSectionDataList.getMimeType());
-
- if (isNameKindSection) {
- // The name kind section is always visible
- setVisibility(VISIBLE);
- updateEmptyNameEditors(shouldAnimate);
- } else if (isGroupKindSection) {
- // Check whether metadata has been bound for all group views
- for (int i = 0; i < mEditors.getChildCount(); i++) {
- final View view = mEditors.getChildAt(i);
- if (view instanceof GroupMembershipView) {
- final GroupMembershipView groupView = (GroupMembershipView) view;
- if (!groupView.wasGroupMetaDataBound() || !groupView.accountHasGroups()) {
- setVisibility(GONE);
- return;
- }
- }
- }
- // Check that the user has selected to display all fields
- if (mHideIfEmpty) {
- setVisibility(GONE);
- return;
- }
- setVisibility(VISIBLE);
-
- // We don't check the emptiness of the group views
- } else {
- // Determine if the entire kind section should be visible
- final int editorCount = mEditors.getChildCount();
- final List<View> emptyEditors = getEmptyEditors();
- if (editorCount == emptyEditors.size() && mHideIfEmpty) {
- setVisibility(GONE);
- return;
- }
- setVisibility(VISIBLE);
-
- updateEmptyNonNameEditors(shouldAnimate);
- }
- }
-
- private void updateEmptyNameEditors(boolean shouldAnimate) {
- boolean isEmptyNameEditorVisible = false;
-
- for (int i = 0; i < mEditors.getChildCount(); i++) {
- final View view = mEditors.getChildAt(i);
- if (view instanceof Editor) {
- final Editor editor = (Editor) view;
- if (view instanceof StructuredNameEditorView) {
- // We always show one empty structured name view
- if (editor.isEmpty()) {
- if (isEmptyNameEditorVisible) {
- // If we're already showing an empty editor then hide any other empties
- if (mHideIfEmpty) {
- view.setVisibility(View.GONE);
- }
- } else {
- isEmptyNameEditorVisible = true;
- }
- } else {
- showView(view, shouldAnimate);
- isEmptyNameEditorVisible = true;
- }
- } else {
- // Since we can't add phonetic names and nicknames, just show or hide them
- if (mHideIfEmpty && editor.isEmpty()) {
- hideView(view);
- } else {
- showView(view, /* shouldAnimate =*/ false); // Animation here causes jank
- }
- }
- } else {
- // For read only names, only show them if we're not hiding empty views
- if (mHideIfEmpty) {
- hideView(view);
- } else {
- showView(view, shouldAnimate);
- }
- }
- }
- }
-
- private void updateEmptyNonNameEditors(boolean shouldAnimate) {
- // Prune excess empty editors
- final List<View> emptyEditors = getEmptyEditors();
- if (emptyEditors.size() > 1) {
- // If there is more than 1 empty editor, then remove it from the list of editors.
- int deleted = 0;
- for (final View view : emptyEditors) {
- // If no child {@link View}s are being focused on within this {@link View}, then
- // remove this empty editor. We can assume that at least one empty editor has
- // focus. One way to get two empty editors is by deleting characters from a
- // non-empty editor, in which case this editor has focus. Another way is if
- // there is more values delta so we must also count number of editors deleted.
- if (view.findFocus() == null) {
- deleteView(view, shouldAnimate);
- deleted++;
- if (deleted == emptyEditors.size() - 1) break;
- }
- }
- return;
- }
- // Determine if we should add a new empty editor
- final DataKind dataKind = mKindSectionDataList.get(0).getDataKind();
- final RawContactDelta rawContactDelta =
- mKindSectionDataList.get(0).getRawContactDelta();
- if (dataKind == null // There is nothing we can do.
- // We have already reached the maximum number of editors, don't add any more.
- || !RawContactModifier.canInsert(rawContactDelta, dataKind)
- // We have already reached the maximum number of empty editors, don't add any more.
- || emptyEditors.size() == 1) {
- return;
- }
- // Add a new empty editor
- if (mShowOneEmptyEditor) {
- final String mimeType = mKindSectionDataList.getMimeType();
- if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType) && mEditors.getChildCount() > 0) {
- return;
- }
- final ValuesDelta values = RawContactModifier.insertChild(rawContactDelta, dataKind);
- final Editor.EditorListener editorListener = Event.CONTENT_ITEM_TYPE.equals(mimeType)
- ? new EventEditorListener() : new NonNameEditorListener();
- final View view = addNonNameEditorView(rawContactDelta, dataKind, values,
- editorListener);
- showView(view, shouldAnimate);
- }
- }
-
- private void hideView(View view) {
- view.setVisibility(View.GONE);
- }
-
- private void deleteView(View view, boolean shouldAnimate) {
- if (shouldAnimate) {
- final Editor editor = (Editor) view;
- editor.deleteEditor();
- } else {
- mEditors.removeView(view);
- }
- }
-
- private void showView(View view, boolean shouldAnimate) {
- if (shouldAnimate) {
- view.setVisibility(View.GONE);
- EditorAnimator.getInstance().showFieldFooter(view);
- } else {
- view.setVisibility(View.VISIBLE);
- }
- }
-
- private List<View> getEmptyEditors() {
- final List<View> emptyEditors = new ArrayList<>();
- for (int i = 0; i < mEditors.getChildCount(); i++) {
- final View view = mEditors.getChildAt(i);
- if (view instanceof Editor && ((Editor) view).isEmpty()) {
- emptyEditors.add(view);
- }
- }
- return emptyEditors;
- }
-}
diff --git a/src/com/android/contacts/editor/CompactPhotoEditorView.java b/src/com/android/contacts/editor/CompactPhotoEditorView.java
deleted file mode 100644
index 899e22a..0000000
--- a/src/com/android/contacts/editor/CompactPhotoEditorView.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.editor;
-
-import com.android.contacts.R;
-import com.android.contacts.common.ContactPhotoManager;
-import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
-import com.android.contacts.util.SchedulingUtils;
-import com.android.contacts.widget.QuickContactImageView;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.provider.ContactsContract;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.RelativeLayout;
-
-/**
- * Displays a photo and calls the host back when the user clicks it.
- */
-public class CompactPhotoEditorView extends RelativeLayout implements View.OnClickListener {
-
- /**
- * Callbacks for the host of this view.
- */
- public interface Listener {
-
- /**
- * Invoked when the user wants to change their photo.
- */
- void onPhotoEditorViewClicked();
- }
-
- private Listener mListener;
-
- private final float mLandscapePhotoRatio;
- private final float mPortraitPhotoRatio;
- private final boolean mIsTwoPanel;
-
- private final int mActionBarHeight;
- private final int mStatusBarHeight;
-
- private QuickContactImageView mPhotoImageView;
- private View mPhotoIcon;
- private View mPhotoIconOverlay;
- private View mPhotoTouchInterceptOverlay;
-
- private boolean mReadOnly;
- private boolean mIsNonDefaultPhotoBound;
-
- public CompactPhotoEditorView(Context context) {
- this(context, null);
- }
-
- public CompactPhotoEditorView(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- mLandscapePhotoRatio = getTypedFloat(R.dimen.quickcontact_landscape_photo_ratio);
- mPortraitPhotoRatio = getTypedFloat(R.dimen.editor_portrait_photo_ratio);
- mIsTwoPanel = getResources().getBoolean(R.bool.contacteditor_two_panel);
-
- final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
- new int[] { android.R.attr.actionBarSize });
- mActionBarHeight = (int) styledAttributes.getDimension(0, 0);
- styledAttributes.recycle();
-
- final int resourceId = getResources().getIdentifier(
- "status_bar_height", "dimen", "android");
- mStatusBarHeight = resourceId > 0 ? getResources().getDimensionPixelSize(resourceId) : 0;
- }
-
- private float getTypedFloat(int resourceId) {
- final TypedValue typedValue = new TypedValue();
- getResources().getValue(resourceId, typedValue, /* resolveRefs =*/ true);
- return typedValue.getFloat();
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mPhotoImageView = (QuickContactImageView) findViewById(R.id.photo);
- mPhotoIcon = findViewById(R.id.photo_icon);
- mPhotoIconOverlay = findViewById(R.id.photo_icon_overlay);
- mPhotoTouchInterceptOverlay = findViewById(R.id.photo_touch_intercept_overlay);
- }
-
- public void setListener(Listener listener) {
- mListener = listener;
- }
-
- public void setReadOnly(boolean readOnly) {
- mReadOnly = readOnly;
- if (mReadOnly) {
- mPhotoIcon.setVisibility(View.GONE);
- mPhotoIconOverlay.setVisibility(View.GONE);
- } else {
- mPhotoTouchInterceptOverlay.setOnClickListener(this);
- }
- }
-
- /**
- * Tries to bind a full size photo or a bitmap loaded from the given ValuesDelta,
- * and falls back to the default avatar, tinted using the given MaterialPalette (if it's not
- * null);
- */
- public void setPhoto(ValuesDelta valuesDelta, MaterialPalette materialPalette) {
- // Check if we can update to the full size photo immediately
- final Long photoFileId = EditorUiUtils.getPhotoFileId(valuesDelta);
- if (photoFileId != null) {
- final Uri photoUri = ContactsContract.DisplayPhoto.CONTENT_URI.buildUpon()
- .appendPath(photoFileId.toString()).build();
- setFullSizedPhoto(photoUri);
- adjustDimensions();
- return;
- }
-
- // Use the bitmap image from the values delta
- final Bitmap bitmap = EditorUiUtils.getPhotoBitmap(valuesDelta);
- if (bitmap != null) {
- setPhoto(bitmap);
- adjustDimensions();
- return;
- }
-
- setDefaultPhoto(materialPalette);
- adjustDimensions();
- }
-
- private void adjustDimensions() {
- // Follow the same logic as MultiShrinkScroll.initialize
- SchedulingUtils.doOnPreDraw(this, /* drawNextFrame =*/ false, new Runnable() {
- @Override
- public void run() {
- final int photoHeight, photoWidth;
- if (mIsTwoPanel) {
- photoHeight = getContentViewHeight();
- photoWidth = (int) (photoHeight * mLandscapePhotoRatio);
- } else {
- // Make the photo slightly shorter that it is wide
- photoWidth = getContentViewWidth();
- photoHeight = (int) (photoWidth / mPortraitPhotoRatio);
- }
- final ViewGroup.LayoutParams layoutParams = getLayoutParams();
- layoutParams.height = photoHeight;
- layoutParams.width = photoWidth;
- setLayoutParams(layoutParams);
- }
- });
- }
-
- private int getContentViewWidth() {
- final Activity activity = (Activity) getContext();
- final DisplayMetrics displayMetrics = new DisplayMetrics();
- activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
- return displayMetrics.widthPixels;
- }
-
- // We're calculating the height the hard way because using the height of the content view
- // (found using android.view.Window.ID_ANDROID_CONTENT) with the soft keyboard up when
- // going from portrait to landscape mode results in a very small height value.
- // See b/20526470
- private int getContentViewHeight() {
- final Activity activity = (Activity) getContext();
- final DisplayMetrics displayMetrics = new DisplayMetrics();
- activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
- return displayMetrics.heightPixels - mActionBarHeight - mStatusBarHeight;
- }
-
- /**
- * Whether a removable, non-default photo is bound to this view.
- */
- public boolean isWritablePhotoSet() {
- return !mReadOnly && mIsNonDefaultPhotoBound;
- }
-
- /**
- * Binds the given bitmap.
- */
- private void setPhoto(Bitmap bitmap) {
- mPhotoImageView.setImageBitmap(bitmap);
- mIsNonDefaultPhotoBound = true;
- }
-
- private void setDefaultPhoto(MaterialPalette materialPalette) {
- EditorUiUtils.setDefaultPhoto(mPhotoImageView, getResources(), materialPalette);
- }
-
- /**
- * Binds a full size photo loaded from the given Uri.
- */
- public void setFullSizedPhoto(Uri photoUri) {
- EditorUiUtils.loadPhoto(ContactPhotoManager.getInstance(getContext()),
- mPhotoImageView, photoUri);
- mIsNonDefaultPhotoBound = true;
- }
-
- /**
- * Removes the current bound photo bitmap.
- */
- public void removePhoto() {
- mPhotoImageView.setImageBitmap(/* bitmap =*/ null);
- mIsNonDefaultPhotoBound = false;
- setDefaultPhoto(/* materialPalette =*/ null);
- }
-
- @Override
- public void onClick(View view) {
- if (mListener != null) {
- mListener.onPhotoEditorViewClicked();
- }
- }
-}
diff --git a/src/com/android/contacts/editor/CompactPhotoSelectionFragment.java b/src/com/android/contacts/editor/CompactPhotoSelectionFragment.java
deleted file mode 100644
index 0a8894f..0000000
--- a/src/com/android/contacts/editor/CompactPhotoSelectionFragment.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.contacts.editor;
-
-import com.android.contacts.R;
-import com.android.contacts.common.ContactPhotoManager;
-import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.account.AccountType;
-
-import android.app.Fragment;
-import android.content.Context;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.provider.ContactsContract;
-import android.util.DisplayMetrics;
-import android.view.Display;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.accessibility.AccessibilityEvent;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.GridView;
-import android.widget.ImageView;
-
-import java.util.ArrayList;
-
-/**
- * Displays {@link Photo}s in a grid and calls back the host when one is clicked.
- */
-public class CompactPhotoSelectionFragment extends Fragment {
-
- private static final String STATE_PHOTOS = "photos";
- private static final String STATE_PHOTO_MODE = "photoMode";
- private final int VIEW_TYPE_TAKE_PHOTO = 0;
- private final int VIEW_TYPE_ALL_PHOTOS = 1;
- private final int VIEW_TYPE_IMAGE = 2;
-
- /**
- * Callbacks hosts this Fragment.
- */
- public interface Listener {
-
- /**
- * Invoked when the user wants to change their photo.
- */
- void onPhotoSelected(Photo photo);
- }
-
- /**
- * Holds a photo {@link ValuesDelta} and {@link AccountType} information to draw
- * an account type icon over it.
- */
- public static final class Photo implements Parcelable {
-
- public static final Creator<Photo> CREATOR = new Creator<Photo>() {
-
- public Photo createFromParcel(Parcel in) {
- return new Photo(in);
- }
-
- public Photo[] newArray(int size) {
- return new Photo[size];
- }
- };
-
- public Photo() {
- }
-
- private Photo(Parcel source) {
- readFromParcel(source);
- }
-
- // From AccountType, everything we need to display the account type icon
- public int titleRes;
- public int iconRes;
- public String syncAdapterPackageName;
-
- public String contentDescription;
- public String contentDescriptionChecked; // Talkback announcement when the photo is checked
- public String accountType;
- public String accountName;
-
- public ValuesDelta valuesDelta;
-
- /**
- * Whether the photo is being displayed for the aggregate contact.
- * This may be because it is marked super primary or it is the one quick contacts picked
- * randomly to display because none is marked super primary.
- */
- public boolean primary;
-
- /**
- * Pointer back to the KindSectionDataList this photo came from.
- * See {@link CompactRawContactsEditorView#getPhotos}
- * See {@link CompactRawContactsEditorView#setPrimaryPhoto}
- */
- public int kindSectionDataListIndex = -1;
- public int valuesDeltaListIndex = -1;
-
- /** Newly taken or selected photo that has not yet been saved to CP2. */
- public Uri updatedPhotoUri;
-
- public long photoId;
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(titleRes);
- dest.writeInt(iconRes);
- dest.writeString(syncAdapterPackageName);
- dest.writeParcelable(valuesDelta, flags);
- dest.writeInt(primary ? 1 : 0);
- dest.writeInt(kindSectionDataListIndex);
- dest.writeInt(valuesDeltaListIndex);
- dest.writeParcelable(updatedPhotoUri, flags);
- dest.writeLong(photoId);
- }
-
- private void readFromParcel(Parcel source) {
- final ClassLoader classLoader = getClass().getClassLoader();
- titleRes = source.readInt();
- iconRes = source.readInt();
- syncAdapterPackageName = source.readString();
- valuesDelta = source.readParcelable(classLoader);
- primary = source.readInt() == 1;
- kindSectionDataListIndex = source.readInt();
- valuesDeltaListIndex = source.readInt();
- updatedPhotoUri = source.readParcelable(classLoader);
- photoId = source.readLong();
- }
- }
-
- private final class PhotoAdapter extends BaseAdapter {
-
- private final Context mContext;
- private final LayoutInflater mLayoutInflater;
-
- public PhotoAdapter() {
- mContext = getContext();
- mLayoutInflater = LayoutInflater.from(mContext);
- }
-
- @Override
- public int getCount() {
- return mPhotos == null ? 2 : mPhotos.size() + 2;
- }
-
- @Override
- public Object getItem(int index) {
- return mPhotos == null ? null : mPhotos.get(index);
- }
-
- @Override
- public long getItemId(int index) {
- return index;
- }
-
- @Override
- public int getItemViewType(int index) {
- if (index == 0) {
- return VIEW_TYPE_TAKE_PHOTO;
- } else if (index == 1) {
- return VIEW_TYPE_ALL_PHOTOS;
- } else {
- return VIEW_TYPE_IMAGE;
- }
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if (mPhotos == null) return null;
-
- // when position is 0 or 1, we should make sure account_type *is not* in convertView
- // before reusing it.
- if (getItemViewType(position) == 0){
- if (convertView == null || convertView.findViewById(R.id.account_type) != null) {
- return mLayoutInflater.inflate(R.layout.take_a_photo_button, /* root =*/ null);
- }
- return convertView;
- }
-
- if (getItemViewType(position) == 1) {
- if (convertView == null || convertView.findViewById(R.id.account_type) != null) {
- return mLayoutInflater.inflate(R.layout.all_photos_button, /* root =*/ null);
- }
- return convertView;
- }
-
- // when position greater than 1, we should make sure account_type *is* in convertView
- // before reusing it.
- position -= 2;
-
- final View photoItemView;
- if (convertView == null || convertView.findViewById(R.id.account_type) == null) {
- photoItemView = mLayoutInflater.inflate(
- R.layout.compact_photo_selection_item, /* root =*/ null);
- } else {
- photoItemView = convertView;
- }
-
- final Photo photo = mPhotos.get(position);
-
- // Bind the photo
- final ImageView imageView = (ImageView) photoItemView.findViewById(R.id.image);
- if (photo.updatedPhotoUri != null) {
- EditorUiUtils.loadPhoto(ContactPhotoManager.getInstance(mContext),
- imageView, photo.updatedPhotoUri);
- } else {
- final Long photoFileId = EditorUiUtils.getPhotoFileId(photo.valuesDelta);
- if (photoFileId != null) {
- final Uri photoUri = ContactsContract.DisplayPhoto.CONTENT_URI.buildUpon()
- .appendPath(photoFileId.toString()).build();
- EditorUiUtils.loadPhoto(ContactPhotoManager.getInstance(mContext),
- imageView, photoUri);
- } else {
- imageView.setImageBitmap(EditorUiUtils.getPhotoBitmap(photo.valuesDelta));
- }
- }
-
- // Add the account type icon
- final ImageView accountTypeImageView = (ImageView)
- photoItemView.findViewById(R.id.account_type);
- accountTypeImageView.setImageDrawable(AccountType.getDisplayIcon(
- mContext, photo.titleRes, photo.iconRes, photo.syncAdapterPackageName));
-
- // Display a check icon over the primary photo
- final ImageView checkImageView = (ImageView) photoItemView.findViewById(R.id.check);
- checkImageView.setVisibility(photo.primary ? View.VISIBLE : View.GONE);
-
- photoItemView.setContentDescription(photo.contentDescription);
-
- return photoItemView;
- }
- }
-
- private ArrayList<Photo> mPhotos;
- private int mPhotoMode;
- private Listener mListener;
- private GridView mGridView;
-
- public void setListener(Listener listener) {
- mListener = listener;
- }
-
- public void setPhotos(ArrayList<Photo> photos, int photoMode) {
- mPhotos = photos;
- mPhotoMode = photoMode;
- mGridView.setAccessibilityDelegate(new View.AccessibilityDelegate() {});
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- if (savedInstanceState != null) {
- mPhotos = savedInstanceState.getParcelableArrayList(STATE_PHOTOS);
- mPhotoMode = savedInstanceState.getInt(STATE_PHOTO_MODE, 0);
- }
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
- setHasOptionsMenu(true);
-
- final PhotoAdapter photoAdapter = new PhotoAdapter();
-
- final View view = inflater.inflate(R.layout.compact_photo_selection_fragment,
- container, false);
- mGridView = (GridView) view.findViewById(R.id.grid_view);
- mGridView.setAdapter(photoAdapter);
- mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- final PhotoSourceDialogFragment.Listener listener =
- (PhotoSourceDialogFragment.Listener) getActivity();
- if (position == 0) {
- listener.onTakePhotoChosen();
- } else if (position == 1) {
- listener.onPickFromGalleryChosen();
- } else {
- // Call the host back so it can set the new photo as primary
- final Photo photo = (Photo) photoAdapter.getItem(position - 2);
- if (mListener != null) {
- mListener.onPhotoSelected(photo);
- }
- handleAccessibility(photo, position);
- }
- }
- });
-
- final Display display = getActivity().getWindowManager().getDefaultDisplay();
- final DisplayMetrics outMetrics = new DisplayMetrics ();
- display.getRealMetrics(outMetrics); // real metrics include the navigation Bar
-
- final float numColumns = outMetrics.widthPixels /
- getResources().getDimension(R.dimen.photo_picker_item_ideal_width);
- mGridView.setNumColumns(Math.round(numColumns));
-
- return view;
- }
-
- private void handleAccessibility(Photo photo, int position) {
- // Use custom AccessibilityDelegate when closing this fragment to suppress event.
- mGridView.setAccessibilityDelegate(new View.AccessibilityDelegate() {
- @Override
- public boolean onRequestSendAccessibilityEvent(
- ViewGroup host, View child,AccessibilityEvent event) {
- if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
- return false;
- }
- return super.onRequestSendAccessibilityEvent(host, child, event);
- }
- });
- final ViewGroup clickedView = (ViewGroup) mGridView.getChildAt(position);
- clickedView.announceForAccessibility(photo.contentDescriptionChecked);
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- outState.putParcelableArrayList(STATE_PHOTOS, mPhotos);
- outState.putInt(STATE_PHOTO_MODE, mPhotoMode);
- super.onSaveInstanceState(outState);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- getActivity().onBackPressed();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
- @Override
- public Context getContext() {
- return getActivity();
- }
-}
\ No newline at end of file
diff --git a/src/com/android/contacts/editor/CompactRawContactsEditorView.java b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
deleted file mode 100644
index 40f670a..0000000
--- a/src/com/android/contacts/editor/CompactRawContactsEditorView.java
+++ /dev/null
@@ -1,1106 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.editor;
-
-import android.content.ContentUris;
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.Event;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
-import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Nickname;
-import android.provider.ContactsContract.CommonDataKinds.Note;
-import android.provider.ContactsContract.CommonDataKinds.Organization;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.CommonDataKinds.Relation;
-import android.provider.ContactsContract.CommonDataKinds.SipAddress;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.Pair;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ListPopupWindow;
-import android.widget.TextView;
-
-import com.android.contacts.R;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.RawContactDelta;
-import com.android.contacts.common.model.RawContactDeltaList;
-import com.android.contacts.common.model.RawContactModifier;
-import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.account.AccountDisplayInfo;
-import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.model.account.DeviceLocalAccountType;
-import com.android.contacts.common.model.account.SimAccountType;
-import com.android.contacts.common.model.dataitem.DataKind;
-import com.android.contacts.common.util.AccountsListAdapter;
-import com.android.contacts.common.util.MaterialColorMapUtils;
-import com.android.contacts.util.UiClosables;
-
-import java.io.FileNotFoundException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-
-/**
- * View to display information from multiple {@link RawContactDelta}s grouped together.
- */
-public class CompactRawContactsEditorView extends LinearLayout implements View.OnClickListener {
-
- static final String TAG = "CompactEditorView";
-
- private static final KindSectionDataMapEntryComparator
- KIND_SECTION_DATA_MAP_ENTRY_COMPARATOR = new KindSectionDataMapEntryComparator();
-
- /**
- * Callbacks for hosts of {@link CompactRawContactsEditorView}s.
- */
- public interface Listener {
-
- /**
- * Invoked when the structured name editor field has changed.
- *
- * @param rawContactId The raw contact ID from the underlying {@link RawContactDelta}.
- * @param valuesDelta The values from the underlying {@link RawContactDelta}.
- */
- public void onNameFieldChanged(long rawContactId, ValuesDelta valuesDelta);
-
- /**
- * Invoked when the compact editor should rebind editors for a new account.
- *
- * @param oldState Old data being edited.
- * @param oldAccount Old account associated with oldState.
- * @param newAccount New account to be used.
- */
- public void onRebindEditorsForNewContact(RawContactDelta oldState,
- AccountWithDataSet oldAccount, AccountWithDataSet newAccount);
-
- /**
- * Invoked when no editors could be bound for the contact.
- */
- public void onBindEditorsFailed();
-
- /**
- * Invoked after editors have been bound for the contact.
- */
- public void onEditorsBound();
-
- /**
- * Invoked when a rawcontact from linked contacts is selected in editor.
- */
- public void onRawContactSelected(Uri uri, long rawContactId, boolean isReadOnly);
-
- /**
- * Returns the map of raw contact IDs to newly taken or selected photos that have not
- * yet been saved to CP2.
- */
- public Bundle getUpdatedPhotos();
- }
-
- /**
- * Used to list the account info for the given raw contacts list.
- */
- private static final class RawContactAccountListAdapter extends BaseAdapter {
- private final LayoutInflater mInflater;
- private final Context mContext;
- private final RawContactDeltaList mRawContactDeltas;
-
- public RawContactAccountListAdapter(Context context, RawContactDeltaList rawContactDeltas) {
- mContext = context;
- mRawContactDeltas = new RawContactDeltaList();
- for (RawContactDelta rawContactDelta : rawContactDeltas) {
- if (rawContactDelta.isVisible() && rawContactDelta.getRawContactId() > 0) {
- mRawContactDeltas.add(rawContactDelta);
- }
- }
- mInflater = LayoutInflater.from(context);
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- final View resultView = convertView != null ? convertView
- : mInflater.inflate(R.layout.account_selector_list_item, parent, false);
-
- final RawContactDelta rawContactDelta = mRawContactDeltas.get(position);
-
- final TextView text1 = (TextView) resultView.findViewById(android.R.id.text1);
- final AccountType accountType = rawContactDelta.getRawContactAccountType(mContext);
- text1.setText(accountType.getDisplayLabel(mContext));
-
- final TextView text2 = (TextView) resultView.findViewById(android.R.id.text2);
- final String accountName = rawContactDelta.getAccountName();
- if (TextUtils.isEmpty(accountName) || accountType instanceof DeviceLocalAccountType
- || accountType instanceof SimAccountType) {
- text2.setVisibility(View.GONE);
- } else {
- // Truncate email addresses in the middle so we don't lose the domain
- text2.setText(accountName);
- text2.setEllipsize(TextUtils.TruncateAt.MIDDLE);
- }
-
- final ImageView icon = (ImageView) resultView.findViewById(android.R.id.icon);
- icon.setImageDrawable(accountType.getDisplayIcon(mContext));
-
- return resultView;
- }
-
- @Override
- public int getCount() {
- return mRawContactDeltas.size();
- }
-
- @Override
- public RawContactDelta getItem(int position) {
- return mRawContactDeltas.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return getItem(position).getRawContactId();
- }
- }
-
- /** Used to sort entire kind sections. */
- private static final class KindSectionDataMapEntryComparator implements
- Comparator<Map.Entry<String,KindSectionDataList>> {
-
- final MimeTypeComparator mMimeTypeComparator = new MimeTypeComparator();
-
- @Override
- public int compare(Map.Entry<String, KindSectionDataList> entry1,
- Map.Entry<String, KindSectionDataList> entry2) {
- if (entry1 == entry2) return 0;
- if (entry1 == null) return -1;
- if (entry2 == null) return 1;
-
- final String mimeType1 = entry1.getKey();
- final String mimeType2 = entry2.getKey();
-
- return mMimeTypeComparator.compare(mimeType1, mimeType2);
- }
- }
-
- /**
- * Sorts kinds roughly the same as quick contacts; we diverge in the following ways:
- * <ol>
- * <li>All names are together at the top.</li>
- * <li>IM is moved up after addresses</li>
- * <li>SIP addresses are moved to below phone numbers</li>
- * <li>Group membership is placed at the end</li>
- * </ol>
- */
- private static final class MimeTypeComparator implements Comparator<String> {
-
- private static final List<String> MIME_TYPE_ORDER = Arrays.asList(new String[] {
- StructuredName.CONTENT_ITEM_TYPE,
- Nickname.CONTENT_ITEM_TYPE,
- Organization.CONTENT_ITEM_TYPE,
- Phone.CONTENT_ITEM_TYPE,
- SipAddress.CONTENT_ITEM_TYPE,
- Email.CONTENT_ITEM_TYPE,
- StructuredPostal.CONTENT_ITEM_TYPE,
- Im.CONTENT_ITEM_TYPE,
- Website.CONTENT_ITEM_TYPE,
- Event.CONTENT_ITEM_TYPE,
- Relation.CONTENT_ITEM_TYPE,
- Note.CONTENT_ITEM_TYPE,
- GroupMembership.CONTENT_ITEM_TYPE
- });
-
- @Override
- public int compare(String mimeType1, String mimeType2) {
- if (mimeType1 == mimeType2) return 0;
- if (mimeType1 == null) return -1;
- if (mimeType2 == null) return 1;
-
- int index1 = MIME_TYPE_ORDER.indexOf(mimeType1);
- int index2 = MIME_TYPE_ORDER.indexOf(mimeType2);
-
- // Fallback to alphabetical ordering of the mime type if both are not found
- if (index1 < 0 && index2 < 0) return mimeType1.compareTo(mimeType2);
- if (index1 < 0) return 1;
- if (index2 < 0) return -1;
-
- return index1 < index2 ? -1 : 1;
- }
- }
-
- /**
- * Sorts primary accounts and google account types before others.
- */
- private static final class EditorComparator implements Comparator<KindSectionData> {
-
- private RawContactDeltaComparator mRawContactDeltaComparator;
-
- private EditorComparator(Context context) {
- mRawContactDeltaComparator = new RawContactDeltaComparator(context);
- }
-
- @Override
- public int compare(KindSectionData kindSectionData1, KindSectionData kindSectionData2) {
- if (kindSectionData1 == kindSectionData2) return 0;
- if (kindSectionData1 == null) return -1;
- if (kindSectionData2 == null) return 1;
-
- final RawContactDelta rawContactDelta1 = kindSectionData1.getRawContactDelta();
- final RawContactDelta rawContactDelta2 = kindSectionData2.getRawContactDelta();
-
- if (rawContactDelta1 == rawContactDelta2) return 0;
- if (rawContactDelta1 == null) return -1;
- if (rawContactDelta2 == null) return 1;
-
- return mRawContactDeltaComparator.compare(rawContactDelta1, rawContactDelta2);
- }
- }
-
- public static class SavedState extends BaseSavedState {
-
- public static final Parcelable.Creator<SavedState> CREATOR =
- new Parcelable.Creator<SavedState>() {
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
-
- private boolean mIsExpanded;
-
- public SavedState(Parcelable superState) {
- super(superState);
- }
-
- private SavedState(Parcel in) {
- super(in);
- mIsExpanded = in.readInt() != 0;
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeInt(mIsExpanded ? 1 : 0);
- }
- }
-
- private CompactRawContactsEditorView.Listener mListener;
-
- private AccountTypeManager mAccountTypeManager;
- private AccountDisplayInfoFactory mAccountDisplayInfoFactory;
- private LayoutInflater mLayoutInflater;
-
- private ViewIdGenerator mViewIdGenerator;
- private MaterialColorMapUtils.MaterialPalette mMaterialPalette;
- private long mPhotoId = -1;
- private boolean mHasNewContact;
- private boolean mIsUserProfile;
- private AccountWithDataSet mPrimaryAccount;
- private Map<String,KindSectionDataList> mKindSectionDataMap = new HashMap<>();
-
- // Account header
- private View mAccountHeaderContainer;
- private TextView mAccountHeaderType;
- private TextView mAccountHeaderName;
- private ImageView mAccountHeaderIcon;
- private ImageView mAccountHeaderExpanderIcon;
-
- // Raw contacts selector
- private View mRawContactContainer;
- private TextView mRawContactSummary;
-
- private CompactPhotoEditorView mPhotoView;
- private ViewGroup mKindSectionViews;
- private Map<String,List<CompactKindSectionView>> mKindSectionViewsMap = new HashMap<>();
- private View mMoreFields;
-
- private boolean mIsExpanded;
-
- private long mPhotoRawContactId;
- private ValuesDelta mPhotoValuesDelta;
-
- private Pair<KindSectionData, ValuesDelta> mPrimaryNameKindSectionData;
-
- public CompactRawContactsEditorView(Context context) {
- super(context);
- }
-
- public CompactRawContactsEditorView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- /**
- * Sets the receiver for {@link CompactRawContactsEditorView} callbacks.
- */
- public void setListener(Listener listener) {
- mListener = listener;
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mAccountTypeManager = AccountTypeManager.getInstance(getContext());
- mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forWritableAccounts(getContext());
- mLayoutInflater = (LayoutInflater)
- getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
- // Account header
- mAccountHeaderContainer = findViewById(R.id.account_header_container);
- mAccountHeaderType = (TextView) findViewById(R.id.account_type);
- mAccountHeaderName = (TextView) findViewById(R.id.account_name);
- mAccountHeaderIcon = (ImageView) findViewById(R.id.account_type_icon);
- mAccountHeaderExpanderIcon = (ImageView) findViewById(R.id.account_expander_icon);
-
- // Raw contacts selector
- mRawContactContainer = findViewById(R.id.all_rawcontacts_accounts_container);
- mRawContactSummary = (TextView) findViewById(R.id.rawcontacts_accounts_summary);
-
- mPhotoView = (CompactPhotoEditorView) findViewById(R.id.photo_editor);
- mKindSectionViews = (LinearLayout) findViewById(R.id.kind_section_views);
- mMoreFields = findViewById(R.id.more_fields);
- mMoreFields.setOnClickListener(this);
- }
-
- @Override
- public void onClick(View view) {
- if (view.getId() == R.id.more_fields) {
- showAllFields();
- }
- }
-
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
- final int childCount = mKindSectionViews.getChildCount();
- for (int i = 0; i < childCount; i++) {
- mKindSectionViews.getChildAt(i).setEnabled(enabled);
- }
- }
-
- @Override
- public Parcelable onSaveInstanceState() {
- final Parcelable superState = super.onSaveInstanceState();
- final SavedState savedState = new SavedState(superState);
- savedState.mIsExpanded = mIsExpanded;
- return savedState;
- }
-
- @Override
- public void onRestoreInstanceState(Parcelable state) {
- if(!(state instanceof SavedState)) {
- super.onRestoreInstanceState(state);
- return;
- }
- final SavedState savedState = (SavedState) state;
- super.onRestoreInstanceState(savedState.getSuperState());
- mIsExpanded = savedState.mIsExpanded;
- if (mIsExpanded) {
- showAllFields();
- }
- }
-
- /**
- * Pass through to {@link CompactPhotoEditorView#setListener}.
- */
- public void setPhotoListener(CompactPhotoEditorView.Listener listener) {
- mPhotoView.setListener(listener);
- }
-
- public void removePhoto() {
- mPhotoValuesDelta.setFromTemplate(true);
- mPhotoValuesDelta.put(Photo.PHOTO, (byte[]) null);
-
- mPhotoView.removePhoto();
- }
-
- /**
- * Pass through to {@link CompactPhotoEditorView#setFullSizedPhoto(Uri)}.
- */
- public void setFullSizePhoto(Uri photoUri) {
- mPhotoView.setFullSizedPhoto(photoUri);
- }
-
- public void updatePhoto(Uri photoUri) {
- mPhotoValuesDelta.setFromTemplate(false);
- // Unset primary for all photos
- unsetSuperPrimaryFromAllPhotos();
- // Mark the currently displayed photo as primary
- mPhotoValuesDelta.setSuperPrimary(true);
-
- // Even though high-res photos cannot be saved by passing them via
- // an EntityDeltaList (since they cause the Bundle size limit to be
- // exceeded), we still pass a low-res thumbnail. This simplifies
- // code all over the place, because we don't have to test whether
- // there is a change in EITHER the delta-list OR a changed photo...
- // this way, there is always a change in the delta-list.
- try {
- final byte[] bytes = EditorUiUtils.getCompressedThumbnailBitmapBytes(
- getContext(), photoUri);
- if (bytes != null) {
- mPhotoValuesDelta.setPhoto(bytes);
- }
- } catch (FileNotFoundException e) {
- elog("Failed to get bitmap from photo Uri");
- }
-
- mPhotoView.setFullSizedPhoto(photoUri);
- }
-
- private void unsetSuperPrimaryFromAllPhotos() {
- final List<KindSectionData> kindSectionDataList =
- mKindSectionDataMap.get(Photo.CONTENT_ITEM_TYPE);
- for (KindSectionData kindSectionData : kindSectionDataList) {
- for (ValuesDelta valuesDelta : kindSectionData.getNonEmptyValuesDeltas()) {
- valuesDelta.setSuperPrimary(false);
- }
- }
- }
-
- /**
- * Pass through to {@link CompactPhotoEditorView#isWritablePhotoSet}.
- */
- public boolean isWritablePhotoSet() {
- return mPhotoView.isWritablePhotoSet();
- }
-
- /**
- * Get the raw contact ID for the CompactHeaderView photo.
- */
- public long getPhotoRawContactId() {
- return mPhotoRawContactId;
- }
-
- public StructuredNameEditorView getPrimaryNameEditorView() {
- final CompactKindSectionView primaryNameKindSectionView = getPrimaryNameKindSectionView();
- return primaryNameKindSectionView == null
- ? null : primaryNameKindSectionView.getPrimaryNameEditorView();
- }
-
- /**
- * Returns a data holder for every non-default/non-empty photo from each raw contact, whether
- * the raw contact is writable or not.
- */
- public ArrayList<CompactPhotoSelectionFragment.Photo> getPhotos() {
- final ArrayList<CompactPhotoSelectionFragment.Photo> photos = new ArrayList<>();
-
- final Bundle updatedPhotos = mListener == null ? null : mListener.getUpdatedPhotos();
-
- final List<KindSectionData> kindSectionDataList =
- mKindSectionDataMap.get(Photo.CONTENT_ITEM_TYPE);
- for (int i = 0; i < kindSectionDataList.size(); i++) {
- final KindSectionData kindSectionData = kindSectionDataList.get(i);
- final AccountType accountType = kindSectionData.getAccountType();
- final List<ValuesDelta> valuesDeltas = kindSectionData.getNonEmptyValuesDeltas();
- if (valuesDeltas.isEmpty()) continue;
- for (int j = 0; j < valuesDeltas.size(); j++) {
- final ValuesDelta valuesDelta = valuesDeltas.get(j);
- final Bitmap bitmap = EditorUiUtils.getPhotoBitmap(valuesDelta);
- if (bitmap == null) continue;
-
- final CompactPhotoSelectionFragment.Photo photo =
- new CompactPhotoSelectionFragment.Photo();
- photo.titleRes = accountType.titleRes;
- photo.iconRes = accountType.iconRes;
- photo.syncAdapterPackageName = accountType.syncAdapterPackageName;
- photo.valuesDelta = valuesDelta;
- photo.primary = valuesDelta.isSuperPrimary();
- photo.kindSectionDataListIndex = i;
- photo.valuesDeltaListIndex = j;
- photo.photoId = valuesDelta.getId();
-
- if (updatedPhotos != null) {
- photo.updatedPhotoUri = (Uri) updatedPhotos.get(String.valueOf(
- kindSectionData.getRawContactDelta().getRawContactId()));
- }
-
- final CharSequence accountTypeLabel = accountType.getDisplayLabel(getContext());
- photo.accountType = accountTypeLabel == null ? "" : accountTypeLabel.toString();
- final String accountName = kindSectionData.getRawContactDelta().getAccountName();
- photo.accountName = accountName == null ? "" : accountName;
-
- photos.add(photo);
- }
- }
-
- return photos;
- }
-
- /**
- * Marks the raw contact photo given as primary for the aggregate contact and updates the
- * UI.
- */
- public void setPrimaryPhoto(CompactPhotoSelectionFragment.Photo photo) {
- // Find the values delta to mark as primary
- final KindSectionDataList kindSectionDataList =
- mKindSectionDataMap.get(Photo.CONTENT_ITEM_TYPE);
- if (photo.kindSectionDataListIndex < 0
- || photo.kindSectionDataListIndex >= kindSectionDataList.size()) {
- wlog("Invalid kind section data list index");
- return;
- }
- final KindSectionData kindSectionData =
- kindSectionDataList.get(photo.kindSectionDataListIndex);
- final List<ValuesDelta> valuesDeltaList = kindSectionData.getNonEmptyValuesDeltas();
- if (photo.valuesDeltaListIndex >= valuesDeltaList.size()) {
- wlog("Invalid values delta list index");
- return;
- }
-
- // Update values delta
- final ValuesDelta valuesDelta = valuesDeltaList.get(photo.valuesDeltaListIndex);
- valuesDelta.setFromTemplate(false);
- unsetSuperPrimaryFromAllPhotos();
- valuesDelta.setSuperPrimary(true);
-
- // Update the UI
- mPhotoView.setPhoto(valuesDelta, mMaterialPalette);
- }
-
- public View getAggregationAnchorView() {
- final List<CompactKindSectionView> kindSectionViews = getKindSectionViews(
- StructuredName.CONTENT_ITEM_TYPE);
- if (!kindSectionViews.isEmpty()) {
- return mKindSectionViews.getChildAt(0).findViewById(R.id.anchor_view);
- }
- return null;
- }
-
- public void setGroupMetaData(Cursor groupMetaData) {
- final List<CompactKindSectionView> kindSectionViews = getKindSectionViews(
- GroupMembership.CONTENT_ITEM_TYPE);
- for (CompactKindSectionView kindSectionView : kindSectionViews) {
- kindSectionView.setGroupMetaData(groupMetaData);
- if (mIsExpanded) {
- kindSectionView.setHideWhenEmpty(false);
- kindSectionView.updateEmptyEditors(/* shouldAnimate =*/ true);
- }
- }
- }
-
- public void setState(RawContactDeltaList rawContactDeltas,
- MaterialColorMapUtils.MaterialPalette materialPalette, ViewIdGenerator viewIdGenerator,
- long photoId, boolean hasNewContact, boolean isUserProfile,
- AccountWithDataSet primaryAccount) {
- mKindSectionDataMap.clear();
- mKindSectionViewsMap.clear();
- mKindSectionViews.removeAllViews();
- mMoreFields.setVisibility(View.VISIBLE);
-
- mMaterialPalette = materialPalette;
- mViewIdGenerator = viewIdGenerator;
- mPhotoId = photoId;
-
- mHasNewContact = hasNewContact;
- mIsUserProfile = isUserProfile;
- mPrimaryAccount = primaryAccount;
- if (mPrimaryAccount == null) {
- mPrimaryAccount = ContactEditorUtils.create(getContext()).getOnlyOrDefaultAccount();
- }
- vlog("state: primary " + mPrimaryAccount);
-
- // Parse the given raw contact deltas
- if (rawContactDeltas == null || rawContactDeltas.isEmpty()) {
- elog("No raw contact deltas");
- if (mListener != null) mListener.onBindEditorsFailed();
- return;
- }
- parseRawContactDeltas(rawContactDeltas);
- if (mKindSectionDataMap.isEmpty()) {
- elog("No kind section data parsed from RawContactDelta(s)");
- if (mListener != null) mListener.onBindEditorsFailed();
- return;
- }
-
-
- // Get the primary name kind section data
- mPrimaryNameKindSectionData =
- getOrCreateKindSectionDataList(StructuredName.CONTENT_ITEM_TYPE)
- .getEntryToWrite(/* id =*/ -1, mPrimaryAccount, mIsUserProfile);
- if (mPrimaryNameKindSectionData != null) {
- // Ensure that a structured name and photo exists
- final RawContactDelta rawContactDelta =
- mPrimaryNameKindSectionData.first.getRawContactDelta();
- RawContactModifier.ensureKindExists(
- rawContactDelta,
- rawContactDelta.getAccountType(mAccountTypeManager),
- StructuredName.CONTENT_ITEM_TYPE);
- RawContactModifier.ensureKindExists(
- rawContactDelta,
- rawContactDelta.getAccountType(mAccountTypeManager),
- Photo.CONTENT_ITEM_TYPE);
- }
-
- // Setup the view
- addAccountInfo(rawContactDeltas);
- addPhotoView();
- addKindSectionViews();
-
- mMoreFields.setVisibility(hasMoreFields() ? View.VISIBLE : View.GONE);
-
- if (mIsExpanded) showAllFields();
-
- if (mListener != null) mListener.onEditorsBound();
- }
-
- private void parseRawContactDeltas(RawContactDeltaList rawContactDeltas) {
- // Build the kind section data list map
- vlog("parse: " + rawContactDeltas.size() + " rawContactDelta(s)");
- for (int j = 0; j < rawContactDeltas.size(); j++) {
- final RawContactDelta rawContactDelta = rawContactDeltas.get(j);
- vlog("parse: " + j + " rawContactDelta" + rawContactDelta);
- if (rawContactDelta == null || !rawContactDelta.isVisible()) continue;
- final AccountType accountType = rawContactDelta.getAccountType(mAccountTypeManager);
- if (accountType == null) continue;
- final List<DataKind> dataKinds = accountType.getSortedDataKinds();
- final int dataKindSize = dataKinds == null ? 0 : dataKinds.size();
- vlog("parse: " + dataKindSize + " dataKinds(s)");
- for (int i = 0; i < dataKindSize; i++) {
- final DataKind dataKind = dataKinds.get(i);
- if (dataKind == null || !dataKind.editable) {
- vlog("parse: " + i + " " + dataKind.mimeType + " dropped read-only");
- continue;
- }
- final String mimeType = dataKind.mimeType;
-
- // Skip psuedo mime types
- if (DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME.equals(mimeType)
- || DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(mimeType)) {
- vlog("parse: " + i + " " + dataKind.mimeType + " dropped pseudo type");
- continue;
- }
-
- final KindSectionDataList kindSectionDataList =
- getOrCreateKindSectionDataList(mimeType);
- final KindSectionData kindSectionData =
- new KindSectionData(accountType, dataKind, rawContactDelta);
- kindSectionDataList.add(kindSectionData);
-
- vlog("parse: " + i + " " + dataKind.mimeType + " " +
- kindSectionData.getValuesDeltas().size() + " value(s) " +
- kindSectionData.getNonEmptyValuesDeltas().size() + " non-empty value(s) " +
- kindSectionData.getVisibleValuesDeltas().size() +
- " visible value(s)");
- }
- }
- }
-
- private KindSectionDataList getOrCreateKindSectionDataList(String mimeType) {
- KindSectionDataList kindSectionDataList = mKindSectionDataMap.get(mimeType);
- if (kindSectionDataList == null) {
- kindSectionDataList = new KindSectionDataList();
- mKindSectionDataMap.put(mimeType, kindSectionDataList);
- }
- return kindSectionDataList;
- }
-
- private void addAccountInfo(RawContactDeltaList rawContactDeltas) {
- mAccountHeaderContainer.setVisibility(View.GONE);
- mRawContactContainer.setVisibility(View.GONE);
-
- if (mPrimaryNameKindSectionData == null) return;
- final RawContactDelta rawContactDelta =
- mPrimaryNameKindSectionData.first.getRawContactDelta();
-
- final AccountDisplayInfo account =
- mAccountDisplayInfoFactory.getAccountDisplayInfoFor(rawContactDelta);
-
- // Get the account information for the primary raw contact delta
- final String accountLabel = mIsUserProfile
- ? EditorUiUtils.getAccountHeaderLabelForMyProfile(getContext(), account)
- : account.getNameLabel().toString();
-
- // Either the account header or selector should be shown, not both.
- final List<AccountWithDataSet> accounts =
- AccountTypeManager.getInstance(getContext()).getAccounts(true);
- if (mHasNewContact && !mIsUserProfile) {
- if (accounts.size() > 1) {
- addAccountSelector(rawContactDelta, accountLabel);
- } else {
- addAccountHeader(accountLabel);
- }
- } else if (mIsUserProfile || !shouldHideAccountContainer(rawContactDeltas)) {
- addAccountHeader(accountLabel);
- }
-
- // The raw contact selector should only display linked raw contacts that can be edited in
- // the full editor (i.e. they are not newly created raw contacts)
- final RawContactAccountListAdapter adapter = new RawContactAccountListAdapter(getContext(),
- getRawContactDeltaListForSelector(rawContactDeltas));
- if (adapter.getCount() > 0) {
- final String accountsSummary = getResources().getQuantityString(
- R.plurals.compact_editor_linked_contacts_selector_title,
- adapter.getCount(), adapter.getCount());
- addRawContactAccountSelector(accountsSummary, adapter);
- }
- }
-
- private RawContactDeltaList getRawContactDeltaListForSelector(
- RawContactDeltaList rawContactDeltas) {
- // Sort raw contacts so google accounts come first
- Collections.sort(rawContactDeltas, new RawContactDeltaComparator(getContext()));
-
- final RawContactDeltaList result = new RawContactDeltaList();
- for (RawContactDelta rawContactDelta : rawContactDeltas) {
- if (rawContactDelta.isVisible() && rawContactDelta.getRawContactId() > 0) {
- // Only add raw contacts that can be opened in the editor
- result.add(rawContactDelta);
- }
- }
- // Don't return a list of size 1 that would just open the raw contact being edited
- // in the compact editor in the full editor
- if (result.size() == 1 && result.get(0).getRawContactAccountType(
- getContext()).areContactsWritable()) {
- result.clear();
- return result;
- }
- return result;
- }
-
- // Returns true if there are multiple writable rawcontacts and no read-only ones,
- // or there are both writable and read-only rawcontacts.
- private boolean shouldHideAccountContainer(RawContactDeltaList rawContactDeltas) {
- int writable = 0;
- int readonly = 0;
- for (RawContactDelta rawContactDelta : rawContactDeltas) {
- if (rawContactDelta.isVisible() && rawContactDelta.getRawContactId() > 0) {
- if (rawContactDelta.getRawContactAccountType(getContext()).areContactsWritable()) {
- writable++;
- } else {
- readonly++;
- }
- }
- }
- return (writable > 1 || (writable > 0 && readonly > 0));
- }
-
- private void addAccountHeader(String accountLabel) {
- mAccountHeaderContainer.setVisibility(View.VISIBLE);
-
- // Set the account name
- mAccountHeaderName.setVisibility(View.VISIBLE);
- mAccountHeaderName.setText(accountLabel);
-
- // Set the account type
- final String selectorTitle = getResources().getString(
- R.string.compact_editor_account_selector_title);
- mAccountHeaderType.setText(selectorTitle);
-
- // Set the icon
- if (mPrimaryNameKindSectionData != null) {
- final RawContactDelta rawContactDelta =
- mPrimaryNameKindSectionData.first.getRawContactDelta();
- if (rawContactDelta != null) {
- final AccountType accountType =
- rawContactDelta.getRawContactAccountType(getContext());
- mAccountHeaderIcon.setImageDrawable(accountType.getDisplayIcon(getContext()));
- }
- }
-
- // Set the content description
- mAccountHeaderContainer.setContentDescription(
- EditorUiUtils.getAccountInfoContentDescription(accountLabel,
- selectorTitle));
- }
-
- private void addAccountSelector(final RawContactDelta rawContactDelta, CharSequence nameLabel) {
- // Show save to default account.
- addAccountHeader(nameLabel.toString());
- // Add handlers for choosing another account to save to.
- mAccountHeaderExpanderIcon.setVisibility(View.VISIBLE);
- mAccountHeaderContainer.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final ListPopupWindow popup = new ListPopupWindow(getContext(), null);
- final AccountsListAdapter adapter =
- new AccountsListAdapter(getContext(),
- AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE,
- mPrimaryAccount);
- popup.setWidth(mAccountHeaderContainer.getWidth());
- popup.setAnchorView(mAccountHeaderContainer);
- popup.setAdapter(adapter);
- popup.setModal(true);
- popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
- popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position,
- long id) {
- UiClosables.closeQuietly(popup);
- final AccountWithDataSet newAccount = adapter.getItem(position);
- if (mListener != null && !mPrimaryAccount.equals(newAccount)) {
- mListener.onRebindEditorsForNewContact(
- rawContactDelta,
- mPrimaryAccount,
- newAccount);
- }
- }
- });
- popup.show();
- }
- });
- }
-
- private void addRawContactAccountSelector(String accountsSummary,
- final RawContactAccountListAdapter adapter) {
- mRawContactContainer.setVisibility(View.VISIBLE);
-
- mRawContactSummary.setText(accountsSummary);
-
- mRawContactContainer.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final ListPopupWindow popup = new ListPopupWindow(getContext(), null);
- popup.setWidth(mRawContactContainer.getWidth());
- popup.setAnchorView(mRawContactContainer);
- popup.setAdapter(adapter);
- popup.setModal(true);
- popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
- popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position,
- long id) {
- UiClosables.closeQuietly(popup);
-
- if (mListener != null) {
- final long rawContactId = adapter.getItemId(position);
- final Uri rawContactUri = ContentUris.withAppendedId(
- ContactsContract.RawContacts.CONTENT_URI, rawContactId);
- final RawContactDelta rawContactDelta = adapter.getItem(position);
- final AccountTypeManager accountTypes = AccountTypeManager.getInstance(
- getContext());
- final AccountType accountType = rawContactDelta.getAccountType(
- accountTypes);
- final boolean isReadOnly = !accountType.areContactsWritable();
-
- mListener.onRawContactSelected(rawContactUri, rawContactId, isReadOnly);
- }
- }
- });
- popup.show();
- }
- });
- }
-
- private void addPhotoView() {
- // Get the kind section data and values delta that we will display in the photo view
- final KindSectionDataList kindSectionDataList =
- getOrCreateKindSectionDataList(Photo.CONTENT_ITEM_TYPE);
- final Pair<KindSectionData,ValuesDelta> photoToDisplay =
- kindSectionDataList.getEntryToDisplay(mPhotoId);
- if (photoToDisplay == null) {
- wlog("photo: no kind section data parsed");
- mPhotoView.setVisibility(View.GONE);
- return;
- } else {
- mPhotoView.setVisibility(View.VISIBLE);
- }
-
- // Set the photo view
- mPhotoView.setPhoto(photoToDisplay.second, mMaterialPalette);
-
- // Find the raw contact ID and values delta that will be written when the photo is edited
- final Pair<KindSectionData, ValuesDelta> photoToWrite = kindSectionDataList.getEntryToWrite(
- mPhotoId, mPrimaryAccount, mIsUserProfile);
- if (photoToWrite == null) {
- mPhotoView.setReadOnly(true);
- return;
- }
- mPhotoView.setReadOnly(false);
- mPhotoRawContactId = photoToWrite.first.getRawContactDelta().getRawContactId();
- mPhotoValuesDelta = photoToWrite.second;
- }
-
- private void addKindSectionViews() {
- // Sort the kinds
- final TreeSet<Map.Entry<String,KindSectionDataList>> entries =
- new TreeSet<>(KIND_SECTION_DATA_MAP_ENTRY_COMPARATOR);
- entries.addAll(mKindSectionDataMap.entrySet());
-
- vlog("kind: " + entries.size() + " kindSection(s)");
- int i = -1;
- for (Map.Entry<String, KindSectionDataList> entry : entries) {
- i++;
-
- final String mimeType = entry.getKey();
-
- if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
- if (mPrimaryNameKindSectionData == null) {
- vlog("kind: " + i + " " + mimeType + " dropped");
- continue;
- }
- vlog("kind: " + i + " " + mimeType + " using first entry only");
- final KindSectionDataList kindSectionDataList = new KindSectionDataList();
- kindSectionDataList.add(mPrimaryNameKindSectionData.first);
- final CompactKindSectionView kindSectionView = inflateKindSectionView(
- mKindSectionViews, kindSectionDataList, mimeType,
- mPrimaryNameKindSectionData.second);
- mKindSectionViews.addView(kindSectionView);
-
- // Keep a pointer to all the KindSectionsViews for each mimeType
- getKindSectionViews(mimeType).add(kindSectionView);
- } else {
- final KindSectionDataList kindSectionDataList = entry.getValue();
-
- // Ignore mime types that we've already handled
- if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
- vlog("kind: " + i + " " + mimeType + " dropped");
- continue;
- }
-
- // Don't show more than one group editor on the compact editor.
- // Groups will still be editable for each raw contact individually on the full editor.
- if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)
- && kindSectionDataList.size() > 1) {
- vlog("kind: " + i + " " + mimeType + " dropped");
- continue;
- }
-
- if (kindSectionDataList != null && !kindSectionDataList.isEmpty()) {
- vlog("kind: " + i + " " + mimeType + " " + kindSectionDataList.size() +
- " kindSectionData(s)");
-
- final CompactKindSectionView kindSectionView = inflateKindSectionView(
- mKindSectionViews, kindSectionDataList, mimeType,
- /* primaryValueDelta =*/ null);
- mKindSectionViews.addView(kindSectionView);
-
- // Keep a pointer to all the KindSectionsViews for each mimeType
- getKindSectionViews(mimeType).add(kindSectionView);
- }
- }
- }
- }
-
- private List<CompactKindSectionView> getKindSectionViews(String mimeType) {
- List<CompactKindSectionView> kindSectionViews = mKindSectionViewsMap.get(mimeType);
- if (kindSectionViews == null) {
- kindSectionViews = new ArrayList<>();
- mKindSectionViewsMap.put(mimeType, kindSectionViews);
- }
- return kindSectionViews;
- }
-
- private CompactKindSectionView inflateKindSectionView(ViewGroup viewGroup,
- KindSectionDataList kindSectionDataList, String mimeType,
- ValuesDelta primaryValuesDelta) {
- final CompactKindSectionView kindSectionView = (CompactKindSectionView)
- mLayoutInflater.inflate(R.layout.compact_item_kind_section, viewGroup,
- /* attachToRoot =*/ false);
- kindSectionView.setIsUserProfile(mIsUserProfile);
-
- if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)
- || Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
- // Phone numbers and email addresses are always displayed,
- // even if they are empty
- kindSectionView.setHideWhenEmpty(false);
- }
-
- // Since phone numbers and email addresses displayed even if they are empty,
- // they will be the only types you add new values to initially for new contacts
- kindSectionView.setShowOneEmptyEditor(true);
-
- // Sort non-name editors so they wind up in the order we want
- if (!StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
- Collections.sort(kindSectionDataList, new EditorComparator(getContext()));
- }
-
- kindSectionView.setState(kindSectionDataList, mViewIdGenerator, mListener,
- primaryValuesDelta);
-
- return kindSectionView;
- }
-
- void maybeSetReadOnlyDisplayNameAsPrimary(String readOnlyDisplayName) {
- if (TextUtils.isEmpty(readOnlyDisplayName)) return;
- final CompactKindSectionView primaryNameKindSectionView = getPrimaryNameKindSectionView();
- if (primaryNameKindSectionView != null && primaryNameKindSectionView.isEmptyName()) {
- vlog("name: using read only display name as primary name");
- primaryNameKindSectionView.setName(readOnlyDisplayName);
- }
- }
-
- private CompactKindSectionView getPrimaryNameKindSectionView() {
- final List<CompactKindSectionView> kindSectionViews
- = mKindSectionViewsMap.get(StructuredName.CONTENT_ITEM_TYPE);
- return kindSectionViews == null || kindSectionViews.isEmpty()
- ? null : kindSectionViews.get(0);
- }
-
- private void showAllFields() {
- // Stop hiding empty editors and allow the user to enter values for all kinds now
- for (int i = 0; i < mKindSectionViews.getChildCount(); i++) {
- final CompactKindSectionView kindSectionView =
- (CompactKindSectionView) mKindSectionViews.getChildAt(i);
- kindSectionView.setHideWhenEmpty(false);
- kindSectionView.updateEmptyEditors(/* shouldAnimate =*/ true);
- }
- mIsExpanded = true;
-
- // Hide the more fields button
- mMoreFields.setVisibility(View.GONE);
- }
-
- private boolean hasMoreFields() {
- for (List<CompactKindSectionView> sections : mKindSectionViewsMap.values()) {
- for (CompactKindSectionView section : sections) {
- if (section.getVisibility() != View.VISIBLE) {
- return true;
- }
- }
- }
- return false;
- }
-
- private static void vlog(String message) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, message);
- }
- }
-
- private static void wlog(String message) {
- if (Log.isLoggable(TAG, Log.WARN)) {
- Log.w(TAG, message);
- }
- }
-
- private static void elog(String message) {
- Log.e(TAG, message);
- }
-}
diff --git a/src/com/android/contacts/editor/ContactEditorBaseFragment.java b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
deleted file mode 100644
index 46e6a84..0000000
--- a/src/com/android/contacts/editor/ContactEditorBaseFragment.java
+++ /dev/null
@@ -1,1744 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.contacts.editor;
-
-import android.accounts.Account;
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.LoaderManager;
-import android.content.ActivityNotFoundException;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.CursorLoader;
-import android.content.Intent;
-import android.content.Loader;
-import android.database.Cursor;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.SystemClock;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.Event;
-import android.provider.ContactsContract.CommonDataKinds.Organization;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Intents;
-import android.provider.ContactsContract.RawContacts;
-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.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.LinearLayout;
-import android.widget.ListPopupWindow;
-import android.widget.Toast;
-
-import com.android.contacts.ContactSaveService;
-import com.android.contacts.GroupMetaDataLoader;
-import com.android.contacts.R;
-import com.android.contacts.activities.ContactEditorAccountsChangedActivity;
-import com.android.contacts.activities.ContactEditorBaseActivity;
-import com.android.contacts.activities.ContactEditorBaseActivity.ContactEditor;
-import com.android.contacts.activities.ContactSelectionActivity;
-import com.android.contacts.common.logging.ScreenEvent.ScreenType;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.Contact;
-import com.android.contacts.common.model.ContactLoader;
-import com.android.contacts.common.model.RawContact;
-import com.android.contacts.common.model.RawContactDelta;
-import com.android.contacts.common.model.RawContactDeltaList;
-import com.android.contacts.common.model.RawContactModifier;
-import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.util.ImplicitIntentsUtil;
-import com.android.contacts.common.util.MaterialColorMapUtils;
-import com.android.contacts.editor.AggregationSuggestionEngine.Suggestion;
-import com.android.contacts.list.UiIntentActions;
-import com.android.contacts.quickcontact.QuickContactActivity;
-import com.android.contacts.util.HelpUtils;
-import com.android.contacts.util.PhoneCapabilityTester;
-import com.android.contacts.util.UiClosables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Base Fragment for contact editors.
- */
-abstract public class ContactEditorBaseFragment extends Fragment implements
- ContactEditor, SplitContactConfirmationDialogFragment.Listener,
- JoinContactConfirmationDialogFragment.Listener,
- AggregationSuggestionEngine.Listener, AggregationSuggestionView.Listener,
- CancelEditDialogFragment.Listener {
-
- static final String TAG = "ContactEditor";
-
- protected static final int LOADER_CONTACT = 1;
- protected static final int LOADER_GROUPS = 2;
-
- private static final List<String> VALID_INTENT_ACTIONS = new ArrayList<String>() {{
- add(Intent.ACTION_EDIT);
- add(Intent.ACTION_INSERT);
- add(ContactEditorBaseActivity.ACTION_EDIT);
- add(ContactEditorBaseActivity.ACTION_INSERT);
- add(ContactEditorBaseActivity.ACTION_SAVE_COMPLETED);
- }};
-
- private static final String KEY_ACTION = "action";
- private static final String KEY_URI = "uri";
- private static final String KEY_AUTO_ADD_TO_DEFAULT_GROUP = "autoAddToDefaultGroup";
- private static final String KEY_DISABLE_DELETE_MENU_OPTION = "disableDeleteMenuOption";
- private static final String KEY_NEW_LOCAL_PROFILE = "newLocalProfile";
- private static final String KEY_MATERIAL_PALETTE = "materialPalette";
- private static final String KEY_PHOTO_ID = "photoId";
-
- private static final String KEY_VIEW_ID_GENERATOR = "viewidgenerator";
-
- private static final String KEY_RAW_CONTACTS = "rawContacts";
-
- private static final String KEY_EDIT_STATE = "state";
- private static final String KEY_STATUS = "status";
-
- private static final String KEY_HAS_NEW_CONTACT = "hasNewContact";
- private static final String KEY_NEW_CONTACT_READY = "newContactDataReady";
-
- private static final String KEY_IS_EDIT = "isEdit";
- private static final String KEY_EXISTING_CONTACT_READY = "existingContactDataReady";
-
- private static final String KEY_RAW_CONTACT_DISPLAY_ALONE_IS_READ_ONLY = "isReadOnly";
-
- // Phone option menus
- private static final String KEY_SEND_TO_VOICE_MAIL_STATE = "sendToVoicemailState";
- private static final String KEY_ARE_PHONE_OPTIONS_CHANGEABLE = "arePhoneOptionsChangable";
- private static final String KEY_CUSTOM_RINGTONE = "customRingtone";
-
- private static final String KEY_IS_USER_PROFILE = "isUserProfile";
-
- private static final String KEY_ENABLED = "enabled";
-
- // Aggregation PopupWindow
- private static final String KEY_AGGREGATION_SUGGESTIONS_RAW_CONTACT_ID =
- "aggregationSuggestionsRawContactId";
-
- // Join Activity
- private static final String KEY_CONTACT_ID_FOR_JOIN = "contactidforjoin";
-
- private static final String KEY_READ_ONLY_DISPLAY_NAME = "readOnlyDisplayName";
-
- protected static final int REQUEST_CODE_JOIN = 0;
- protected static final int REQUEST_CODE_ACCOUNTS_CHANGED = 1;
- protected static final int REQUEST_CODE_PICK_RINGTONE = 2;
-
- private static final int CURRENT_API_VERSION = android.os.Build.VERSION.SDK_INT;
-
- /**
- * An intent extra that forces the editor to add the edited contact
- * to the default group (e.g. "My Contacts").
- */
- public static final String INTENT_EXTRA_ADD_TO_DEFAULT_DIRECTORY = "addToDefaultDirectory";
-
- public static final String INTENT_EXTRA_NEW_LOCAL_PROFILE = "newLocalProfile";
-
- public static final String INTENT_EXTRA_DISABLE_DELETE_MENU_OPTION =
- "disableDeleteMenuOption";
-
- /**
- * Intent key to pass the photo palette primary color calculated by
- * {@link com.android.contacts.quickcontact.QuickContactActivity} to the editor and between
- * the compact and fully expanded editors.
- */
- public static final String INTENT_EXTRA_MATERIAL_PALETTE_PRIMARY_COLOR =
- "material_palette_primary_color";
-
- /**
- * Intent key to pass the photo palette secondary color calculated by
- * {@link com.android.contacts.quickcontact.QuickContactActivity} to the editor and between
- * the compact and fully expanded editors.
- */
- public static final String INTENT_EXTRA_MATERIAL_PALETTE_SECONDARY_COLOR =
- "material_palette_secondary_color";
-
- /**
- * Intent key to pass the ID of the photo to display on the editor.
- */
- public static final String INTENT_EXTRA_PHOTO_ID = "photo_id";
-
- /**
- * Intent key to pass the ID of the raw contact id that should be displayed in the full editor
- * by itself.
- */
- public static final String INTENT_EXTRA_RAW_CONTACT_ID_TO_DISPLAY_ALONE =
- "raw_contact_id_to_display_alone";
-
- /**
- * Intent key to pass the boolean value of if the raw contact id that should be displayed
- * in the full editor by itself is read-only.
- */
- public static final String INTENT_EXTRA_RAW_CONTACT_DISPLAY_ALONE_IS_READ_ONLY =
- "raw_contact_display_alone_is_read_only";
-
- /**
- * Intent extra to specify a {@link ContactEditor.SaveMode}.
- */
- public static final String SAVE_MODE_EXTRA_KEY = "saveMode";
-
- /**
- * Intent extra key for the contact ID to join the current contact to after saving.
- */
- public static final String JOIN_CONTACT_ID_EXTRA_KEY = "joinContactId";
-
- /**
- * Callbacks for Activities that host contact editors Fragments.
- */
- public interface Listener {
-
- /**
- * Contact was not found, so somehow close this fragment. This is raised after a contact
- * is removed via Menu/Delete
- */
- void onContactNotFound();
-
- /**
- * Contact was split, so we can close now.
- *
- * @param newLookupUri The lookup uri of the new contact that should be shown to the user.
- * The editor tries best to chose the most natural contact here.
- */
- void onContactSplit(Uri newLookupUri);
-
- /**
- * User has tapped Revert, close the fragment now.
- */
- void onReverted();
-
- /**
- * Contact was saved and the Fragment can now be closed safely.
- */
- void onSaveFinished(Intent resultIntent);
-
- /**
- * User switched to editing a different contact (a suggestion from the
- * aggregation engine).
- */
- void onEditOtherContactRequested(Uri contactLookupUri,
- ArrayList<ContentValues> contentValues);
-
- /**
- * Contact is being created for an external account that provides its own
- * new contact activity.
- */
- void onCustomCreateContactActivityRequested(AccountWithDataSet account,
- Bundle intentExtras);
-
- /**
- * The edited raw contact belongs to an external account that provides
- * its own edit activity.
- *
- * @param redirect indicates that the current editor should be closed
- * before the custom editor is shown.
- */
- void onCustomEditContactActivityRequested(AccountWithDataSet account, Uri rawContactUri,
- Bundle intentExtras, boolean redirect);
-
- /**
- * User has requested that contact be deleted.
- */
- void onDeleteRequested(Uri contactUri);
- }
-
- /**
- * Adapter for aggregation suggestions displayed in a PopupWindow when
- * editor fields change.
- */
- protected static final class AggregationSuggestionAdapter extends BaseAdapter {
- private final LayoutInflater mLayoutInflater;
- private final boolean mSetNewContact;
- private final AggregationSuggestionView.Listener mListener;
- private final List<AggregationSuggestionEngine.Suggestion> mSuggestions;
-
- public AggregationSuggestionAdapter(Activity activity, boolean setNewContact,
- AggregationSuggestionView.Listener listener, List<Suggestion> suggestions) {
- mLayoutInflater = activity.getLayoutInflater();
- mSetNewContact = setNewContact;
- mListener = listener;
- mSuggestions = suggestions;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- final Suggestion suggestion = (Suggestion) getItem(position);
- final AggregationSuggestionView suggestionView =
- (AggregationSuggestionView) mLayoutInflater.inflate(
- R.layout.aggregation_suggestions_item, null);
- suggestionView.setNewContact(mSetNewContact);
- suggestionView.setListener(mListener);
- suggestionView.bindSuggestion(suggestion);
- return suggestionView;
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public Object getItem(int position) {
- return mSuggestions.get(position);
- }
-
- @Override
- public int getCount() {
- return mSuggestions.size();
- }
- }
-
- protected Context mContext;
- protected Listener mListener;
-
- //
- // Views
- //
- protected LinearLayout mContent;
- protected View mAggregationSuggestionView;
- protected ListPopupWindow mAggregationSuggestionPopup;
-
- //
- // Parameters passed in on {@link #load}
- //
- protected String mAction;
- protected Uri mLookupUri;
- protected Bundle mIntentExtras;
- protected boolean mAutoAddToDefaultGroup;
- protected boolean mDisableDeleteMenuOption;
- protected boolean mNewLocalProfile;
- protected MaterialColorMapUtils.MaterialPalette mMaterialPalette;
- protected long mPhotoId = -1;
-
- //
- // Helpers
- //
- protected ContactEditorUtils mEditorUtils;
- protected RawContactDeltaComparator mComparator;
- protected ViewIdGenerator mViewIdGenerator;
- private AggregationSuggestionEngine mAggregationSuggestionEngine;
-
- //
- // Loaded data
- //
- // Used to store existing contact data so it can be re-applied during a rebind call,
- // i.e. account switch. Only used in {@link ContactEditorFragment}.
- protected ImmutableList<RawContact> mRawContacts;
- protected Cursor mGroupMetaData;
-
- //
- // Editor state
- //
- protected RawContactDeltaList mState;
- protected int mStatus;
- protected long mRawContactIdToDisplayAlone = -1;
- protected boolean mRawContactDisplayAloneIsReadOnly = false;
-
- // Whether to show the new contact blank form and if it's corresponding delta is ready.
- protected boolean mHasNewContact;
- protected AccountWithDataSet mAccountWithDataSet;
- protected boolean mNewContactDataReady;
- protected boolean mNewContactAccountChanged;
-
- // Whether it's an edit of existing contact and if it's corresponding delta is ready.
- protected boolean mIsEdit;
- protected boolean mExistingContactDataReady;
-
- // Whether we are editing the "me" profile
- protected boolean mIsUserProfile;
-
- // Phone specific option menu items
- private boolean mSendToVoicemailState;
- private boolean mArePhoneOptionsChangable;
- private String mCustomRingtone;
-
- // Whether editor views and options menu items should be enabled
- private boolean mEnabled = true;
-
- // Aggregation PopupWindow
- private long mAggregationSuggestionsRawContactId;
-
- // Join Activity
- protected long mContactIdForJoin;
-
- // Used to pre-populate the editor with a display name when a user edits a read-only contact.
- protected String mReadOnlyDisplayName;
-
- //
- // Not saved/restored on rotates
- //
-
- // The name editor view for the new raw contact that was created so that the user can
- // edit a read-only contact (to which the new raw contact was joined)
- protected StructuredNameEditorView mReadOnlyNameEditorView;
-
- /**
- * The contact data loader listener.
- */
- protected final LoaderManager.LoaderCallbacks<Contact> mContactLoaderListener =
- new LoaderManager.LoaderCallbacks<Contact>() {
-
- protected long mLoaderStartTime;
-
- @Override
- public Loader<Contact> onCreateLoader(int id, Bundle args) {
- mLoaderStartTime = SystemClock.elapsedRealtime();
- return new ContactLoader(mContext, mLookupUri, true);
- }
-
- @Override
- public void onLoadFinished(Loader<Contact> loader, Contact contact) {
- final long loaderCurrentTime = SystemClock.elapsedRealtime();
- Log.v(TAG, "Time needed for loading: " + (loaderCurrentTime-mLoaderStartTime));
- if (!contact.isLoaded()) {
- // Item has been deleted. Close activity without saving again.
- Log.i(TAG, "No contact found. Closing activity");
- mStatus = Status.CLOSING;
- if (mListener != null) mListener.onContactNotFound();
- return;
- }
-
- mStatus = Status.EDITING;
- mLookupUri = contact.getLookupUri();
- final long setDataStartTime = SystemClock.elapsedRealtime();
- setState(contact);
- setStateForPhoneMenuItems(contact);
- final long setDataEndTime = SystemClock.elapsedRealtime();
-
- Log.v(TAG, "Time needed for setting UI: " + (setDataEndTime - setDataStartTime));
- }
-
- @Override
- public void onLoaderReset(Loader<Contact> loader) {
- }
- };
-
- /**
- * The groups meta data loader listener.
- */
- protected final LoaderManager.LoaderCallbacks<Cursor> mGroupsLoaderListener =
- new LoaderManager.LoaderCallbacks<Cursor>() {
-
- @Override
- public CursorLoader onCreateLoader(int id, Bundle args) {
- return new GroupMetaDataLoader(mContext, ContactsContract.Groups.CONTENT_URI);
- }
-
- @Override
- public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- mGroupMetaData = data;
- setGroupMetaData();
- }
-
- @Override
- public void onLoaderReset(Loader<Cursor> loader) {
- }
- };
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- mContext = activity;
- mEditorUtils = ContactEditorUtils.create(mContext);
- mComparator = new RawContactDeltaComparator(mContext);
- }
-
- @Override
- public void onCreate(Bundle savedState) {
- if (savedState != null) {
- // Restore mUri before calling super.onCreate so that onInitializeLoaders
- // would already have a uri and an action to work with
- mAction = savedState.getString(KEY_ACTION);
- mLookupUri = savedState.getParcelable(KEY_URI);
- }
-
- super.onCreate(savedState);
-
- if (savedState == null) {
- mViewIdGenerator = new ViewIdGenerator();
- } else {
- mViewIdGenerator = savedState.getParcelable(KEY_VIEW_ID_GENERATOR);
-
- mAutoAddToDefaultGroup = savedState.getBoolean(KEY_AUTO_ADD_TO_DEFAULT_GROUP);
- mDisableDeleteMenuOption = savedState.getBoolean(KEY_DISABLE_DELETE_MENU_OPTION);
- mNewLocalProfile = savedState.getBoolean(KEY_NEW_LOCAL_PROFILE);
- mMaterialPalette = savedState.getParcelable(KEY_MATERIAL_PALETTE);
- mPhotoId = savedState.getLong(KEY_PHOTO_ID);
-
- mRawContacts = ImmutableList.copyOf(savedState.<RawContact>getParcelableArrayList(
- KEY_RAW_CONTACTS));
- // NOTE: mGroupMetaData is not saved/restored
-
- // Read state from savedState. No loading involved here
- mState = savedState.<RawContactDeltaList> getParcelable(KEY_EDIT_STATE);
- mStatus = savedState.getInt(KEY_STATUS);
- mRawContactDisplayAloneIsReadOnly = savedState.getBoolean(
- KEY_RAW_CONTACT_DISPLAY_ALONE_IS_READ_ONLY);
-
- mHasNewContact = savedState.getBoolean(KEY_HAS_NEW_CONTACT);
- mNewContactDataReady = savedState.getBoolean(KEY_NEW_CONTACT_READY);
-
- mIsEdit = savedState.getBoolean(KEY_IS_EDIT);
- mExistingContactDataReady = savedState.getBoolean(KEY_EXISTING_CONTACT_READY);
-
- mIsUserProfile = savedState.getBoolean(KEY_IS_USER_PROFILE);
-
- // Phone specific options menus
- mSendToVoicemailState = savedState.getBoolean(KEY_SEND_TO_VOICE_MAIL_STATE);
- mArePhoneOptionsChangable = savedState.getBoolean(KEY_ARE_PHONE_OPTIONS_CHANGEABLE);
- mCustomRingtone = savedState.getString(KEY_CUSTOM_RINGTONE);
-
- mEnabled = savedState.getBoolean(KEY_ENABLED);
-
- // Aggregation PopupWindow
- mAggregationSuggestionsRawContactId = savedState.getLong(
- KEY_AGGREGATION_SUGGESTIONS_RAW_CONTACT_ID);
-
- // Join Activity
- mContactIdForJoin = savedState.getLong(KEY_CONTACT_ID_FOR_JOIN);
-
- mReadOnlyDisplayName = savedState.getString(KEY_READ_ONLY_DISPLAY_NAME);
- }
-
- // mState can still be null because it may not have have finished loading before
- // onSaveInstanceState was called.
- if (mState == null) {
- mState = new RawContactDeltaList();
- }
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- validateAction(mAction);
-
- if (mState.isEmpty()) {
- // The delta list may not have finished loading before orientation change happens.
- // In this case, there will be a saved state but deltas will be missing. Reload from
- // database.
- if (Intent.ACTION_EDIT.equals(mAction) ||
- ContactEditorBaseActivity.ACTION_EDIT.equals(mAction)) {
- // Either
- // 1) orientation change but load never finished.
- // 2) not an orientation change so data needs to be loaded for first time.
- getLoaderManager().initLoader(LOADER_CONTACT, null, mContactLoaderListener);
- getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupsLoaderListener);
- }
- } else {
- // Orientation change, we already have mState, it was loaded by onCreate
- bindEditors();
- }
-
- // Handle initial actions only when existing state missing
- if (savedInstanceState == null) {
- final Account account = mIntentExtras == null ? null :
- (Account) mIntentExtras.getParcelable(Intents.Insert.EXTRA_ACCOUNT);
- final String dataSet = mIntentExtras == null ? null :
- mIntentExtras.getString(Intents.Insert.EXTRA_DATA_SET);
- if (account != null) {
- mAccountWithDataSet = new AccountWithDataSet(account.name, account.type, dataSet);
- }
-
- if (Intent.ACTION_EDIT.equals(mAction) ||
- ContactEditorBaseActivity.ACTION_EDIT.equals(mAction)) {
- mIsEdit = true;
- } else if (Intent.ACTION_INSERT.equals(mAction) ||
- ContactEditorBaseActivity.ACTION_INSERT.equals(mAction)) {
- mHasNewContact = true;
- if (mAccountWithDataSet != null) {
- createContact(mAccountWithDataSet);
- } else if (mIntentExtras != null && mIntentExtras.getBoolean(
- ContactEditorBaseActivity.EXTRA_SAVE_TO_DEVICE_FLAG, false)) {
- createContact(null);
- } else {
- // No Account specified. Let the user choose
- // Load Accounts async so that we can present them
- selectAccountAndCreateContact();
- }
- }
- }
- }
-
- /**
- * Checks if the requested action is valid.
- *
- * @param action The action to test.
- * @throws IllegalArgumentException when the action is invalid.
- */
- private static void validateAction(String action) {
- if (VALID_INTENT_ACTIONS.contains(action)) {
- return;
- }
- throw new IllegalArgumentException(
- "Unknown action " + action + "; Supported actions: " + VALID_INTENT_ACTIONS);
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- outState.putString(KEY_ACTION, mAction);
- outState.putParcelable(KEY_URI, mLookupUri);
- outState.putBoolean(KEY_AUTO_ADD_TO_DEFAULT_GROUP, mAutoAddToDefaultGroup);
- outState.putBoolean(KEY_DISABLE_DELETE_MENU_OPTION, mDisableDeleteMenuOption);
- outState.putBoolean(KEY_NEW_LOCAL_PROFILE, mNewLocalProfile);
- if (mMaterialPalette != null) {
- outState.putParcelable(KEY_MATERIAL_PALETTE, mMaterialPalette);
- }
- outState.putLong(KEY_PHOTO_ID, mPhotoId);
-
- outState.putParcelable(KEY_VIEW_ID_GENERATOR, mViewIdGenerator);
-
- outState.putParcelableArrayList(KEY_RAW_CONTACTS, mRawContacts == null ?
- Lists.<RawContact>newArrayList() : Lists.newArrayList(mRawContacts));
- // NOTE: mGroupMetaData is not saved
-
- if (hasValidState()) {
- // Store entities with modifications
- outState.putParcelable(KEY_EDIT_STATE, mState);
- }
- outState.putInt(KEY_STATUS, mStatus);
- outState.putBoolean(KEY_HAS_NEW_CONTACT, mHasNewContact);
- outState.putBoolean(KEY_NEW_CONTACT_READY, mNewContactDataReady);
- outState.putBoolean(KEY_IS_EDIT, mIsEdit);
- outState.putBoolean(KEY_EXISTING_CONTACT_READY, mExistingContactDataReady);
- outState.putBoolean(KEY_RAW_CONTACT_DISPLAY_ALONE_IS_READ_ONLY,
- mRawContactDisplayAloneIsReadOnly);
-
- outState.putBoolean(KEY_IS_USER_PROFILE, mIsUserProfile);
-
- // Phone specific options
- outState.putBoolean(KEY_SEND_TO_VOICE_MAIL_STATE, mSendToVoicemailState);
- outState.putBoolean(KEY_ARE_PHONE_OPTIONS_CHANGEABLE, mArePhoneOptionsChangable);
- outState.putString(KEY_CUSTOM_RINGTONE, mCustomRingtone);
-
- outState.putBoolean(KEY_ENABLED, mEnabled);
-
- // Aggregation PopupWindow
- outState.putLong(KEY_AGGREGATION_SUGGESTIONS_RAW_CONTACT_ID,
- mAggregationSuggestionsRawContactId);
-
- // Join Activity
- outState.putLong(KEY_CONTACT_ID_FOR_JOIN, mContactIdForJoin);
-
- outState.putString(KEY_READ_ONLY_DISPLAY_NAME, mReadOnlyDisplayName);
-
- super.onSaveInstanceState(outState);
- }
-
- @Override
- public void onStop() {
- super.onStop();
- UiClosables.closeQuietly(mAggregationSuggestionPopup);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- if (mAggregationSuggestionEngine != null) {
- mAggregationSuggestionEngine.quit();
- }
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch (requestCode) {
- case REQUEST_CODE_JOIN: {
- // Ignore failed requests
- if (resultCode != Activity.RESULT_OK) return;
- if (data != null) {
- final long contactId = ContentUris.parseId(data.getData());
- if (hasPendingChanges()) {
- // Ask the user if they want to save changes before doing the join
- JoinContactConfirmationDialogFragment.show(this, contactId);
- } else {
- // Do the join immediately
- joinAggregate(contactId);
- }
- }
- break;
- }
- case REQUEST_CODE_ACCOUNTS_CHANGED: {
- // Bail if the account selector was not successful.
- if (resultCode != Activity.RESULT_OK) {
- if (mListener != null) {
- mListener.onReverted();
- }
- return;
- }
- // If there's an account specified, use it.
- if (data != null) {
- AccountWithDataSet account = data.getParcelableExtra(
- Intents.Insert.EXTRA_ACCOUNT);
- if (account != null) {
- createContact(account);
- return;
- }
- }
- // If there isn't an account specified, then this is likely a phone-local
- // contact, so we should continue setting up the editor by automatically selecting
- // the most appropriate account.
- createContact();
- break;
- }
- case REQUEST_CODE_PICK_RINGTONE: {
- if (data != null) {
- final Uri pickedUri = data.getParcelableExtra(
- RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
- onRingtonePicked(pickedUri);
- }
- break;
- }
- }
- }
-
- private void onRingtonePicked(Uri pickedUri) {
- mCustomRingtone = EditorUiUtils.getRingtoneStringFromUri(pickedUri, CURRENT_API_VERSION);
- Intent intent = ContactSaveService.createSetRingtone(
- mContext, mLookupUri, mCustomRingtone);
- mContext.startService(intent);
- }
-
- //
- // Options menu
- //
-
- private void setStateForPhoneMenuItems(Contact contact) {
- if (contact != null) {
- mSendToVoicemailState = contact.isSendToVoicemail();
- mCustomRingtone = contact.getCustomRingtone();
- mArePhoneOptionsChangable = !contact.isDirectoryEntry()
- && PhoneCapabilityTester.isPhone(mContext);
- }
- }
-
- /**
- * Invalidates the options menu if we are still associated with an Activity.
- */
- protected void invalidateOptionsMenu() {
- final Activity activity = getActivity();
- if (activity != null) {
- activity.invalidateOptionsMenu();
- }
- }
-
- @Override
- public Context getContext() {
- return getActivity();
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) {
- inflater.inflate(R.menu.edit_contact, menu);
- }
-
- @Override
- public void onPrepareOptionsMenu(Menu menu) {
- // This supports the keyboard shortcut to save changes to a contact but shouldn't be visible
- // because the custom action bar contains the "save" button now (not the overflow menu).
- // TODO: Find a better way to handle shortcuts, i.e. onKeyDown()?
- final MenuItem saveMenu = menu.findItem(R.id.menu_save);
- final MenuItem splitMenu = menu.findItem(R.id.menu_split);
- final MenuItem joinMenu = menu.findItem(R.id.menu_join);
- final MenuItem helpMenu = menu.findItem(R.id.menu_help);
- final MenuItem sendToVoiceMailMenu = menu.findItem(R.id.menu_send_to_voicemail);
- final MenuItem ringToneMenu = menu.findItem(R.id.menu_set_ringtone);
- final MenuItem deleteMenu = menu.findItem(R.id.menu_delete);
-
- // Set visibility of menus
-
- // help menu depending on whether this is inserting or editing
- if (isInsert(mAction) || mRawContactIdToDisplayAlone != -1) {
- HelpUtils.prepareHelpMenuItem(mContext, helpMenu, R.string.help_url_people_add);
- splitMenu.setVisible(false);
- joinMenu.setVisible(false);
- deleteMenu.setVisible(false);
- } else if (isEdit(mAction)) {
- HelpUtils.prepareHelpMenuItem(mContext, helpMenu, R.string.help_url_people_edit);
- splitMenu.setVisible(canUnlinkRawContacts());
- // Cannot join a user profile
- joinMenu.setVisible(!isEditingUserProfile());
- deleteMenu.setVisible(!mDisableDeleteMenuOption && !isEditingUserProfile());
- } else {
- // something else, so don't show the help menu
- helpMenu.setVisible(false);
- }
-
- // Save menu is invisible when there's only one read only contact in the editor.
- saveMenu.setVisible(!mRawContactDisplayAloneIsReadOnly);
- if (saveMenu.isVisible()) {
- // Since we're using a custom action layout we have to manually hook up the handler.
- saveMenu.getActionView().setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onOptionsItemSelected(saveMenu);
- }
- });
- }
-
- if (mRawContactIdToDisplayAlone != -1 || mIsUserProfile) {
- sendToVoiceMailMenu.setVisible(false);
- ringToneMenu.setVisible(false);
- } else {
- // Hide telephony-related settings (ringtone, send to voicemail)
- // if we don't have a telephone or are editing a new contact.
- sendToVoiceMailMenu.setChecked(mSendToVoicemailState);
- sendToVoiceMailMenu.setVisible(mArePhoneOptionsChangable);
- ringToneMenu.setVisible(mArePhoneOptionsChangable);
- }
-
- int size = menu.size();
- for (int i = 0; i < size; i++) {
- menu.getItem(i).setEnabled(mEnabled);
- }
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- final Activity activity = getActivity();
- if (activity == null || activity.isFinishing() || activity.isDestroyed()) {
- // If we no longer are attached to a running activity want to
- // drain this event.
- return true;
- }
-
- switch (item.getItemId()) {
- case R.id.menu_save:
- return save(SaveMode.CLOSE);
- case R.id.menu_delete:
- if (mListener != null) mListener.onDeleteRequested(mLookupUri);
- return true;
- case R.id.menu_split:
- return doSplitContactAction();
- case R.id.menu_join:
- return doJoinContactAction();
- case R.id.menu_set_ringtone:
- doPickRingtone();
- return true;
- case R.id.menu_send_to_voicemail:
- // Update state and save
- mSendToVoicemailState = !mSendToVoicemailState;
- item.setChecked(mSendToVoicemailState);
- final Intent intent = ContactSaveService.createSetSendToVoicemail(
- mContext, mLookupUri, mSendToVoicemailState);
- mContext.startService(intent);
- return true;
- }
-
- return false;
- }
-
- @Override
- public boolean revert() {
- if (mState.isEmpty() || !hasPendingChanges()) {
- onCancelEditConfirmed();
- } else {
- CancelEditDialogFragment.show(this);
- }
- return true;
- }
-
- @Override
- public void onCancelEditConfirmed() {
- // When this Fragment is closed we don't want it to auto-save
- mStatus = Status.CLOSING;
- if (mListener != null) {
- mListener.onReverted();
- }
- }
-
- @Override
- public void onSplitContactConfirmed(boolean hasPendingChanges) {
- if (mState.isEmpty()) {
- // This may happen when this Fragment is recreated by the system during users
- // confirming the split action (and thus this method is called just before onCreate()),
- // for example.
- Log.e(TAG, "mState became null during the user's confirming split action. " +
- "Cannot perform the save action.");
- return;
- }
-
- if (!hasPendingChanges && mHasNewContact) {
- // If the user didn't add anything new, we don't want to split out the newly created
- // raw contact into a name-only contact so remove them.
- final Iterator<RawContactDelta> iterator = mState.iterator();
- while (iterator.hasNext()) {
- final RawContactDelta rawContactDelta = iterator.next();
- if (rawContactDelta.getRawContactId() < 0) {
- iterator.remove();
- }
- }
- }
- mState.markRawContactsForSplitting();
- save(SaveMode.SPLIT);
- }
-
- private boolean doSplitContactAction() {
- if (!hasValidState()) return false;
-
- SplitContactConfirmationDialogFragment.show(this, hasPendingChanges());
- return true;
- }
-
- private boolean doJoinContactAction() {
- if (!hasValidState() || mLookupUri == null) {
- return false;
- }
-
- // If we just started creating a new contact and haven't added any data, it's too
- // early to do a join
- if (mState.size() == 1 && mState.get(0).isContactInsert()
- && !hasPendingChanges()) {
- Toast.makeText(mContext, R.string.toast_join_with_empty_contact,
- Toast.LENGTH_LONG).show();
- return true;
- }
-
- showJoinAggregateActivity(mLookupUri);
- return true;
- }
-
- @Override
- public void onJoinContactConfirmed(long joinContactId) {
- doSaveAction(SaveMode.JOIN, joinContactId);
- }
-
- private void doPickRingtone() {
- final Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
- // Allow user to pick 'Default'
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
- // Show only ringtones
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
- // Allow the user to pick a silent ringtone
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
-
- final Uri ringtoneUri = EditorUiUtils.getRingtoneUriFromString(mCustomRingtone,
- CURRENT_API_VERSION);
-
- // Put checkmark next to the current ringtone for this contact
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);
-
- // Launch!
- try {
- startActivityForResult(intent, REQUEST_CODE_PICK_RINGTONE);
- } catch (ActivityNotFoundException ex) {
- Toast.makeText(mContext, R.string.missing_app, Toast.LENGTH_SHORT).show();
- }
- }
-
- @Override
- public boolean save(int saveMode) {
- if (!hasValidState() || mStatus != Status.EDITING) {
- return false;
- }
-
- // If we are about to close the editor - there is no need to refresh the data
- if (saveMode == SaveMode.CLOSE || saveMode == SaveMode.COMPACT
- || saveMode == SaveMode.SPLIT) {
- getLoaderManager().destroyLoader(LOADER_CONTACT);
- }
-
- mStatus = Status.SAVING;
-
- if (!hasPendingChanges()) {
- if (mLookupUri == null && saveMode == SaveMode.RELOAD) {
- // We don't have anything to save and there isn't even an existing contact yet.
- // Nothing to do, simply go back to editing mode
- mStatus = Status.EDITING;
- return true;
- }
- onSaveCompleted(/* hadChanges =*/ false, saveMode,
- /* saveSucceeded =*/ mLookupUri != null, mLookupUri, /* joinContactId =*/ null);
- return true;
- }
-
- setEnabled(false);
-
- return doSaveAction(saveMode, /* joinContactId */ null);
- }
-
- /**
- * Persist the accumulated editor deltas.
- *
- * @param joinContactId the raw contact ID to join the contact being saved to after the save,
- * may be null.
- */
- abstract protected boolean doSaveAction(int saveMode, Long joinContactId);
-
- protected boolean startSaveService(Context context, Intent intent, int saveMode) {
- final boolean result = ContactSaveService.startService(
- context, intent, saveMode);
- if (!result) {
- onCancelEditConfirmed();
- }
- return result;
- }
-
- //
- // State accessor methods
- //
-
- /**
- * Check if our internal {@link #mState} is valid, usually checked before
- * performing user actions.
- */
- protected boolean hasValidState() {
- return mState.size() > 0;
- }
-
- protected boolean isEditingUserProfile() {
- return mNewLocalProfile || mIsUserProfile;
- }
-
- /**
- * Whether the contact being edited spans multiple raw contacts.
- * The may also span multiple accounts.
- */
- public boolean isEditingMultipleRawContacts() {
- return mState.size() > 1;
- }
-
- /**
- * Whether the contact being edited is composed of a single read-only raw contact
- * aggregated with a newly created writable raw contact.
- */
- protected boolean isEditingReadOnlyRawContactWithNewContact() {
- return mHasNewContact && mState.size() == 2;
- }
-
- /**
- * Return true if there are any edits to the current contact which need to
- * be saved.
- */
- protected boolean hasPendingRawContactChanges(Set<String> excludedMimeTypes) {
- final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
- return RawContactModifier.hasChanges(mState, accountTypes, excludedMimeTypes);
- }
-
- /**
- * We allow unlinking only if there is more than one raw contact, it is not a user-profile,
- * and unlinking won't result in an empty contact. For the empty contact case, we only guard
- * against this when there is a single read-only contact in the aggregate. If the user
- * has joined >1 read-only contacts together, we allow them to unlink it, even if they have
- * never added their own information and unlinking will create a name only contact.
- */
- protected boolean canUnlinkRawContacts() {
- return isEditingMultipleRawContacts()
- && !isEditingUserProfile()
- && !isEditingReadOnlyRawContactWithNewContact();
- }
-
- /**
- * Determines if changes were made in the editor that need to be saved, while taking into
- * account that name changes are not real for read-only contacts.
- * See go/editing-read-only-contacts
- */
- protected boolean hasPendingChanges() {
- if (mReadOnlyNameEditorView != null && mReadOnlyDisplayName != null) {
- // We created a new raw contact delta with a default display name.
- // We must test for pending changes while ignoring the default display name.
- final String displayName = mReadOnlyNameEditorView.getDisplayName();
- if (mReadOnlyDisplayName.equals(displayName)) {
- final Set<String> excludedMimeTypes = new HashSet<>();
- excludedMimeTypes.add(StructuredName.CONTENT_ITEM_TYPE);
- return hasPendingRawContactChanges(excludedMimeTypes);
- }
- return true;
- }
- return hasPendingRawContactChanges(/* excludedMimeTypes =*/ null);
- }
-
- /**
- * Whether editor inputs and the options menu should be enabled.
- */
- protected boolean isEnabled() {
- return mEnabled;
- }
-
- /**
- * Returns the palette extra that was passed in.
- */
- protected MaterialColorMapUtils.MaterialPalette getMaterialPalette() {
- return mMaterialPalette;
- }
-
- //
- // Account creation
- //
-
- private void selectAccountAndCreateContact() {
- // If this is a local profile, then skip the logic about showing the accounts changed
- // activity and create a phone-local contact.
- if (mNewLocalProfile) {
- createContact(null);
- return;
- }
-
- // If there is no default account or the accounts have changed such that we need to
- // prompt the user again, then launch the account prompt.
- if (mEditorUtils.shouldShowAccountChangedNotification()) {
- Intent intent = new Intent(mContext, ContactEditorAccountsChangedActivity.class);
- // Prevent a second instance from being started on rotates
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- mStatus = Status.SUB_ACTIVITY;
- startActivityForResult(intent, REQUEST_CODE_ACCOUNTS_CHANGED);
- } else {
- // Otherwise, there should be a default account. Then either create a local contact
- // (if default account is null) or create a contact with the specified account.
- final AccountWithDataSet defaultAccount = mEditorUtils.getOnlyOrDefaultAccount();
- createContact(defaultAccount);
- }
- }
-
- /**
- * Create a contact by automatically selecting the first account. If there's no available
- * account, a device-local contact should be created.
- */
- protected void createContact() {
- final List<AccountWithDataSet> accounts =
- AccountTypeManager.getInstance(mContext).getAccounts(true);
- // No Accounts available. Create a phone-local contact.
- if (accounts.isEmpty()) {
- createContact(null);
- return;
- }
-
- // We have an account switcher in "create-account" screen, so don't need to ask a user to
- // select an account here.
- createContact(accounts.get(0));
- }
-
- /**
- * Shows account creation screen associated with a given account.
- *
- * @param account may be null to signal a device-local contact should be created.
- */
- protected void createContact(AccountWithDataSet account) {
- final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
- final AccountType accountType = accountTypes.getAccountTypeForAccount(account);
-
- if (accountType.getCreateContactActivityClassName() != null) {
- if (mListener != null) {
- mListener.onCustomCreateContactActivityRequested(account, mIntentExtras);
- }
- } else {
- setStateForNewContact(account, accountType, isEditingUserProfile());
- }
- }
-
- //
- // Data binding
- //
-
- private void setState(Contact contact) {
- // If we have already loaded data, we do not want to change it here to not confuse the user
- if (!mState.isEmpty()) {
- Log.v(TAG, "Ignoring background change. This will have to be rebased later");
- return;
- }
-
- // See if this edit operation needs to be redirected to a custom editor
- mRawContacts = contact.getRawContacts();
- if (mRawContacts.size() == 1) {
- RawContact rawContact = mRawContacts.get(0);
- String type = rawContact.getAccountTypeString();
- String dataSet = rawContact.getDataSet();
- AccountType accountType = rawContact.getAccountType(mContext);
- if (accountType.getEditContactActivityClassName() != null &&
- !accountType.areContactsWritable()) {
- if (mListener != null) {
- String name = rawContact.getAccountName();
- long rawContactId = rawContact.getId();
- mListener.onCustomEditContactActivityRequested(
- new AccountWithDataSet(name, type, dataSet),
- ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
- mIntentExtras, true);
- }
- return;
- }
- }
-
- String readOnlyDisplayName = null;
- // Check for writable raw contacts. If there are none, then we need to create one so user
- // can edit. For the user profile case, there is already an editable contact.
- if (!contact.isUserProfile() && !contact.isWritableContact(mContext)) {
- mHasNewContact = true;
-
- // This is potentially an asynchronous call and will add deltas to list.
- selectAccountAndCreateContact();
-
- readOnlyDisplayName = contact.getDisplayName();
- } else {
- mHasNewContact = false;
- }
-
- // This also adds deltas to list. If readOnlyDisplayName is null at this point it is
- // simply ignored later on by the editor.
- setStateForExistingContact(readOnlyDisplayName, contact.isUserProfile(), mRawContacts);
- }
-
- /**
- * Prepare {@link #mState} for a newly created phone-local contact.
- */
- private void setStateForNewContact(AccountWithDataSet account, AccountType accountType,
- boolean isUserProfile) {
- setStateForNewContact(account, accountType, /* oldState =*/ null,
- /* oldAccountType =*/ null, isUserProfile);
- }
-
- /**
- * Prepare {@link #mState} for a newly created phone-local contact, migrating the state
- * specified by oldState and oldAccountType.
- */
- protected void setStateForNewContact(AccountWithDataSet account, AccountType accountType,
- RawContactDelta oldState, AccountType oldAccountType, boolean isUserProfile) {
- mStatus = Status.EDITING;
- mState.add(createNewRawContactDelta(account, accountType, oldState, oldAccountType));
- mIsUserProfile = isUserProfile;
- mNewContactDataReady = true;
- bindEditors();
- }
-
- /**
- * Returns a {@link RawContactDelta} for a new contact suitable for addition into
- * {@link #mState}.
- *
- * If oldState and oldAccountType are specified, the state specified by those parameters
- * is migrated to the result {@link RawContactDelta}.
- */
- private RawContactDelta createNewRawContactDelta(AccountWithDataSet account,
- AccountType accountType, RawContactDelta oldState, AccountType oldAccountType) {
- final RawContact rawContact = new RawContact();
- if (account != null) {
- rawContact.setAccount(account);
- } else {
- rawContact.setAccountToLocal();
- }
-
- final RawContactDelta result = new RawContactDelta(
- ValuesDelta.fromAfter(rawContact.getValues()));
- if (oldState == null) {
- // Parse any values from incoming intent
- RawContactModifier.parseExtras(mContext, accountType, result, mIntentExtras);
- } else {
- RawContactModifier.migrateStateForNewContact(
- mContext, oldState, result, oldAccountType, accountType);
- }
-
- // Ensure we have some default fields (if the account type does not support a field,
- // ensureKind will not add it, so it is safe to add e.g. Event)
- RawContactModifier.ensureKindExists(result, accountType, Phone.CONTENT_ITEM_TYPE);
- RawContactModifier.ensureKindExists(result, accountType, Email.CONTENT_ITEM_TYPE);
- RawContactModifier.ensureKindExists(result, accountType, Organization.CONTENT_ITEM_TYPE);
- RawContactModifier.ensureKindExists(result, accountType, Event.CONTENT_ITEM_TYPE);
- RawContactModifier.ensureKindExists(result, accountType,
- StructuredPostal.CONTENT_ITEM_TYPE);
-
- // Set the correct URI for saving the contact as a profile
- if (mNewLocalProfile) {
- result.setProfileQueryUri();
- }
-
- return result;
- }
-
- /**
- * Prepare {@link #mState} for an existing contact.
- */
- protected void setStateForExistingContact(String readOnlyDisplayName, boolean isUserProfile,
- ImmutableList<RawContact> rawContacts) {
- setEnabled(true);
- mReadOnlyDisplayName = readOnlyDisplayName;
-
- mState.addAll(rawContacts.iterator());
- setIntentExtras(mIntentExtras);
- mIntentExtras = null;
-
- // For user profile, change the contacts query URI
- mIsUserProfile = isUserProfile;
- boolean localProfileExists = false;
-
- if (mIsUserProfile) {
- for (RawContactDelta rawContactDelta : mState) {
- // For profile contacts, we need a different query URI
- rawContactDelta.setProfileQueryUri();
- // Try to find a local profile contact
- if (rawContactDelta.getValues().getAsString(RawContacts.ACCOUNT_TYPE) == null) {
- localProfileExists = true;
- }
- }
- // Editor should always present a local profile for editing
- if (!localProfileExists) {
- mState.add(createLocalRawContactDelta());
- }
- }
- mExistingContactDataReady = true;
- bindEditors();
- }
-
- /**
- * Returns a {@link RawContactDelta} for a local contact suitable for addition into
- * {@link #mState}.
- */
- private static RawContactDelta createLocalRawContactDelta() {
- final RawContact rawContact = new RawContact();
- rawContact.setAccountToLocal();
-
- final RawContactDelta result = new RawContactDelta(
- ValuesDelta.fromAfter(rawContact.getValues()));
- result.setProfileQueryUri();
-
- return result;
- }
-
- /**
- * Sets group metadata on all bound editors.
- */
- abstract protected void setGroupMetaData();
-
- /**
- * Bind editors using {@link #mState} and other members initialized from the loaded (or new)
- * Contact.
- */
- abstract protected void bindEditors();
-
- /**
- * Set the enabled state of editors.
- */
- private void setEnabled(boolean enabled) {
- if (mEnabled != enabled) {
- mEnabled = enabled;
-
- // Enable/disable editors
- if (mContent != null) {
- int count = mContent.getChildCount();
- for (int i = 0; i < count; i++) {
- mContent.getChildAt(i).setEnabled(enabled);
- }
- }
-
- // Enable/disable aggregation suggestion vies
- if (mAggregationSuggestionView != null) {
- LinearLayout itemList = (LinearLayout) mAggregationSuggestionView.findViewById(
- R.id.aggregation_suggestions);
- int count = itemList.getChildCount();
- for (int i = 0; i < count; i++) {
- itemList.getChildAt(i).setEnabled(enabled);
- }
- }
-
- // Maybe invalidate the options menu
- final Activity activity = getActivity();
- if (activity != null) activity.invalidateOptionsMenu();
- }
- }
-
- /**
- * Removes a current editor ({@link #mState}) and rebinds new editor for a new account.
- * Some of old data are reused with new restriction enforced by the new account.
- *
- * @param oldState Old data being edited.
- * @param oldAccount Old account associated with oldState.
- * @param newAccount New account to be used.
- */
- protected void rebindEditorsForNewContact(
- RawContactDelta oldState, AccountWithDataSet oldAccount,
- AccountWithDataSet newAccount) {
- AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
- AccountType oldAccountType = accountTypes.getAccountTypeForAccount(oldAccount);
- AccountType newAccountType = accountTypes.getAccountTypeForAccount(newAccount);
-
- if (newAccountType.getCreateContactActivityClassName() != null) {
- Log.w(TAG, "external activity called in rebind situation");
- if (mListener != null) {
- mListener.onCustomCreateContactActivityRequested(newAccount, mIntentExtras);
- }
- } else {
- mExistingContactDataReady = false;
- mNewContactDataReady = false;
- mState = new RawContactDeltaList();
- setStateForNewContact(newAccount, newAccountType, oldState, oldAccountType,
- isEditingUserProfile());
- if (mIsEdit) {
- setStateForExistingContact(mReadOnlyDisplayName, isEditingUserProfile(),
- mRawContacts);
- }
- }
- }
-
- //
- // ContactEditor
- //
-
- @Override
- public void setListener(Listener listener) {
- mListener = listener;
- }
-
- @Override
- public void load(String action, Uri lookupUri, Bundle intentExtras) {
- mAction = action;
- mLookupUri = lookupUri;
- mIntentExtras = intentExtras;
-
- if (mIntentExtras != null) {
- mAutoAddToDefaultGroup =
- mIntentExtras.containsKey(INTENT_EXTRA_ADD_TO_DEFAULT_DIRECTORY);
- mNewLocalProfile =
- mIntentExtras.getBoolean(INTENT_EXTRA_NEW_LOCAL_PROFILE);
- mDisableDeleteMenuOption =
- mIntentExtras.getBoolean(INTENT_EXTRA_DISABLE_DELETE_MENU_OPTION);
- if (mIntentExtras.containsKey(INTENT_EXTRA_MATERIAL_PALETTE_PRIMARY_COLOR)
- && mIntentExtras.containsKey(INTENT_EXTRA_MATERIAL_PALETTE_SECONDARY_COLOR)) {
- mMaterialPalette = new MaterialColorMapUtils.MaterialPalette(
- mIntentExtras.getInt(INTENT_EXTRA_MATERIAL_PALETTE_PRIMARY_COLOR),
- mIntentExtras.getInt(INTENT_EXTRA_MATERIAL_PALETTE_SECONDARY_COLOR));
- }
- // If the user selected a different photo, don't restore the one from the Intent
- if (mPhotoId < 0) {
- mPhotoId = mIntentExtras.getLong(INTENT_EXTRA_PHOTO_ID);
- }
- mRawContactIdToDisplayAlone = mIntentExtras.getLong(
- INTENT_EXTRA_RAW_CONTACT_ID_TO_DISPLAY_ALONE, -1);
- mRawContactDisplayAloneIsReadOnly = mIntentExtras.getBoolean(
- INTENT_EXTRA_RAW_CONTACT_DISPLAY_ALONE_IS_READ_ONLY);
- }
- }
-
- @Override
- public void setIntentExtras(Bundle extras) {
- if (extras == null || extras.size() == 0) {
- return;
- }
-
- final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
- for (RawContactDelta state : mState) {
- final AccountType type = state.getAccountType(accountTypes);
- if (type.areContactsWritable()) {
- // Apply extras to the first writable raw contact only
- RawContactModifier.parseExtras(mContext, type, state, extras);
- break;
- }
- }
- }
-
- @Override
- public void onJoinCompleted(Uri uri) {
- onSaveCompleted(false, SaveMode.RELOAD, uri != null, uri, /* joinContactId */ null);
- }
-
- @Override
- public void onSaveCompleted(boolean hadChanges, int saveMode, boolean saveSucceeded,
- Uri contactLookupUri, Long joinContactId) {
- if (hadChanges) {
- if (saveSucceeded) {
- switch (saveMode) {
- case SaveMode.JOIN:
- break;
- case SaveMode.SPLIT:
- Toast.makeText(mContext, R.string.contactUnlinkedToast, Toast.LENGTH_SHORT)
- .show();
- break;
- default:
- Toast.makeText(mContext, R.string.contactSavedToast, Toast.LENGTH_SHORT)
- .show();
- }
-
- } else {
- Toast.makeText(mContext, R.string.contactSavedErrorToast, Toast.LENGTH_LONG).show();
- }
- }
- switch (saveMode) {
- case SaveMode.CLOSE: {
- final Intent resultIntent;
- if (saveSucceeded && contactLookupUri != null) {
- final Uri lookupUri = maybeConvertToLegacyLookupUri(
- mContext, contactLookupUri, mLookupUri);
- resultIntent = ImplicitIntentsUtil.composeQuickContactIntent(mContext,
- lookupUri, QuickContactActivity.MODE_FULLY_EXPANDED);
- resultIntent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE,
- ScreenType.EDITOR);
- resultIntent.putExtra(QuickContactActivity.EXTRA_CONTACT_EDITED, true);
- } else {
- resultIntent = null;
- }
- // It is already saved, so prevent it from being saved again
- mStatus = Status.CLOSING;
- if (mListener != null) mListener.onSaveFinished(resultIntent);
- break;
- }
- case SaveMode.COMPACT: {
- // It is already saved, so prevent it from being saved again
- mStatus = Status.CLOSING;
- if (mListener != null) mListener.onSaveFinished(/* resultIntent= */ null);
- break;
- }
- case SaveMode.JOIN:
- if (saveSucceeded && contactLookupUri != null && joinContactId != null) {
- joinAggregate(joinContactId);
- }
- break;
- case SaveMode.RELOAD:
- if (saveSucceeded && contactLookupUri != null) {
- // If this was in INSERT, we are changing into an EDIT now.
- // If it already was an EDIT, we are changing to the new Uri now
- mState = new RawContactDeltaList();
- load(Intent.ACTION_EDIT, contactLookupUri, null);
- mStatus = Status.LOADING;
- getLoaderManager().restartLoader(LOADER_CONTACT, null, mContactLoaderListener);
- }
- break;
-
- case SaveMode.SPLIT:
- mStatus = Status.CLOSING;
- if (mListener != null) {
- mListener.onContactSplit(contactLookupUri);
- } else {
- Log.d(TAG, "No listener registered, can not call onSplitFinished");
- }
- break;
- }
- }
-
- /**
- * Shows a list of aggregates that can be joined into the currently viewed aggregate.
- *
- * @param contactLookupUri the fresh URI for the currently edited contact (after saving it)
- */
- private void showJoinAggregateActivity(Uri contactLookupUri) {
- if (contactLookupUri == null || !isAdded()) {
- return;
- }
-
- mContactIdForJoin = ContentUris.parseId(contactLookupUri);
- final Intent intent = new Intent(mContext, ContactSelectionActivity.class);
- intent.setAction(UiIntentActions.PICK_JOIN_CONTACT_ACTION);
- intent.putExtra(UiIntentActions.TARGET_CONTACT_ID_EXTRA_KEY, mContactIdForJoin);
- startActivityForResult(intent, REQUEST_CODE_JOIN);
- }
-
- //
- // Aggregation PopupWindow
- //
-
- /**
- * Triggers an asynchronous search for aggregation suggestions.
- */
- protected void acquireAggregationSuggestions(Context context,
- long rawContactId, ValuesDelta valuesDelta) {
- if (mAggregationSuggestionsRawContactId != rawContactId
- && mAggregationSuggestionView != null) {
- mAggregationSuggestionView.setVisibility(View.GONE);
- mAggregationSuggestionView = null;
- mAggregationSuggestionEngine.reset();
- }
-
- mAggregationSuggestionsRawContactId = rawContactId;
-
- if (mAggregationSuggestionEngine == null) {
- mAggregationSuggestionEngine = new AggregationSuggestionEngine(context);
- mAggregationSuggestionEngine.setListener(this);
- mAggregationSuggestionEngine.start();
- }
-
- mAggregationSuggestionEngine.setContactId(getContactId());
-
- mAggregationSuggestionEngine.onNameChange(valuesDelta);
- }
-
- /**
- * Returns the contact ID for the currently edited contact or 0 if the contact is new.
- */
- private long getContactId() {
- for (RawContactDelta rawContact : mState) {
- Long contactId = rawContact.getValues().getAsLong(RawContacts.CONTACT_ID);
- if (contactId != null) {
- return contactId;
- }
- }
- return 0;
- }
-
- @Override
- public void onAggregationSuggestionChange() {
- final Activity activity = getActivity();
- if ((activity != null && activity.isFinishing())
- || !isVisible() || mState.isEmpty() || mStatus != Status.EDITING) {
- return;
- }
-
- UiClosables.closeQuietly(mAggregationSuggestionPopup);
-
- if (mAggregationSuggestionEngine.getSuggestedContactCount() == 0) {
- return;
- }
-
- final View anchorView = getAggregationAnchorView(mAggregationSuggestionsRawContactId);
- if (anchorView == null) {
- return; // Raw contact deleted?
- }
- mAggregationSuggestionPopup = new ListPopupWindow(mContext, null);
- mAggregationSuggestionPopup.setAnchorView(anchorView);
- mAggregationSuggestionPopup.setWidth(anchorView.getWidth());
- mAggregationSuggestionPopup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
- mAggregationSuggestionPopup.setAdapter(
- new AggregationSuggestionAdapter(
- getActivity(),
- mState.size() == 1 && mState.get(0).isContactInsert(),
- /* listener =*/ this,
- mAggregationSuggestionEngine.getSuggestions()));
- mAggregationSuggestionPopup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- final AggregationSuggestionView suggestionView = (AggregationSuggestionView) view;
- suggestionView.handleItemClickEvent();
- UiClosables.closeQuietly(mAggregationSuggestionPopup);
- mAggregationSuggestionPopup = null;
- }
- });
- mAggregationSuggestionPopup.show();
- }
-
- /**
- * Returns the raw contact editor view for the given rawContactId that should be used as the
- * anchor for aggregation suggestions.
- */
- abstract protected View getAggregationAnchorView(long rawContactId);
-
- /**
- * Whether the given raw contact ID matches the one used to last load aggregation
- * suggestions.
- */
- protected boolean isAggregationSuggestionRawContactId(long rawContactId) {
- return mAggregationSuggestionsRawContactId == rawContactId;
- }
-
- @Override
- public void onJoinAction(long contactId, List<Long> rawContactIdList) {
- final long rawContactIds[] = new long[rawContactIdList.size()];
- for (int i = 0; i < rawContactIds.length; i++) {
- rawContactIds[i] = rawContactIdList.get(i);
- }
- try {
- JoinSuggestedContactDialogFragment.show(this, rawContactIds);
- } catch (Exception ignored) {
- // No problem - the activity is no longer available to display the dialog
- }
- }
-
- /**
- * Joins the suggested contact (specified by the id's of constituent raw
- * contacts), save all changes, and stay in the editor.
- */
- protected void doJoinSuggestedContact(long[] rawContactIds) {
- if (!hasValidState() || mStatus != Status.EDITING) {
- return;
- }
-
- mState.setJoinWithRawContacts(rawContactIds);
- save(SaveMode.RELOAD);
- }
-
- @Override
- public void onEditAction(Uri contactLookupUri) {
- SuggestionEditConfirmationDialogFragment.show(this, contactLookupUri);
- }
-
- /**
- * Abandons the currently edited contact and switches to editing the suggested
- * one, transferring all the data there
- */
- protected void doEditSuggestedContact(Uri contactUri) {
- if (mListener != null) {
- // make sure we don't save this contact when closing down
- mStatus = Status.CLOSING;
- mListener.onEditOtherContactRequested(
- contactUri, mState.get(0).getContentValues());
- }
- }
-
- //
- // Join Activity
- //
-
- /**
- * Performs aggregation with the contact selected by the user from suggestions or A-Z list.
- */
- abstract protected void joinAggregate(long contactId);
-
- //
- // Utility methods
- //
-
- /**
- * Returns a legacy version of the given contactLookupUri if a legacy Uri was originally
- * passed to the contact editor.
- *
- * @param contactLookupUri The Uri to possibly convert to legacy format.
- * @param requestLookupUri The lookup Uri originally passed to the contact editor
- * (via Intent data), may be null.
- */
- protected static Uri maybeConvertToLegacyLookupUri(Context context, Uri contactLookupUri,
- Uri requestLookupUri) {
- final String legacyAuthority = "contacts";
- final String requestAuthority = requestLookupUri == null
- ? null : requestLookupUri.getAuthority();
- if (legacyAuthority.equals(requestAuthority)) {
- // Build a legacy Uri if that is what was requested by caller
- final long contactId = ContentUris.parseId(Contacts.lookupContact(
- context.getContentResolver(), contactLookupUri));
- final Uri legacyContentUri = Uri.parse("content://contacts/people");
- return ContentUris.withAppendedId(legacyContentUri, contactId);
- }
- // Otherwise pass back a lookup-style Uri
- return contactLookupUri;
- }
-
- /**
- * Whether the argument Intent requested a contact insert action or not.
- */
- protected static boolean isInsert(Intent intent) {
- return intent == null ? false : isInsert(intent.getAction());
- }
-
- protected static boolean isInsert(String action) {
- return Intent.ACTION_INSERT.equals(action)
- || ContactEditorBaseActivity.ACTION_INSERT.equals(action);
- }
-
- protected static boolean isEdit(String action) {
- return Intent.ACTION_EDIT.equals(action)
- || ContactEditorBaseActivity.ACTION_EDIT.equals(action);
- }
-}
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index f10120c..80e1b82 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2015 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.
@@ -16,136 +16,788 @@
package com.android.contacts.editor;
+import android.accounts.Account;
import android.app.Activity;
+import android.app.Fragment;
+import android.app.LoaderManager;
+import android.content.ActivityNotFoundException;
+import android.content.ContentUris;
+import android.content.ContentValues;
import android.content.Context;
+import android.content.CursorLoader;
import android.content.Intent;
+import android.content.Loader;
+import android.database.Cursor;
import android.graphics.Bitmap;
+import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
+import android.os.SystemClock;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Email;
+import android.provider.ContactsContract.CommonDataKinds.Event;
+import android.provider.ContactsContract.CommonDataKinds.Organization;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
+import android.provider.ContactsContract.Intents;
+import android.provider.ContactsContract.RawContacts;
+import android.text.TextUtils;
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.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
import android.widget.LinearLayout;
+import android.widget.ListPopupWindow;
+import android.widget.Toast;
import com.android.contacts.ContactSaveService;
+import com.android.contacts.GroupMetaDataLoader;
import com.android.contacts.R;
import com.android.contacts.activities.ContactEditorActivity;
+import com.android.contacts.activities.ContactEditorActivity.ContactEditor;
+import com.android.contacts.activities.ContactEditorAccountsChangedActivity;
+import com.android.contacts.activities.ContactSelectionActivity;
+import com.android.contacts.common.Experiments;
+import com.android.contacts.common.logging.ScreenEvent.ScreenType;
import com.android.contacts.common.model.AccountTypeManager;
+import com.android.contacts.common.model.Contact;
+import com.android.contacts.common.model.ContactLoader;
+import com.android.contacts.common.model.RawContact;
import com.android.contacts.common.model.RawContactDelta;
import com.android.contacts.common.model.RawContactDeltaList;
+import com.android.contacts.common.model.RawContactModifier;
import com.android.contacts.common.model.ValuesDelta;
import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.detail.PhotoSelectionHandler;
-import com.android.contacts.editor.Editor.EditorListener;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
+import com.android.contacts.common.util.MaterialColorMapUtils;
+import com.android.contacts.editor.AggregationSuggestionEngine.Suggestion;
+import com.android.contacts.group.GroupUtil;
+import com.android.contacts.list.UiIntentActions;
+import com.android.contacts.quickcontact.InvisibleContactUtil;
+import com.android.contacts.quickcontact.QuickContactActivity;
import com.android.contacts.util.ContactPhotoUtils;
+import com.android.contacts.util.HelpUtils;
+import com.android.contacts.util.PhoneCapabilityTester;
+import com.android.contacts.util.UiClosables;
+import com.android.contactsbind.ObjectFactory;
+import com.android.contactsbind.experiments.Flags;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
import java.io.FileNotFoundException;
-import java.util.Collections;
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
/**
- * Contact editor with all fields displayed.
+ * Contact editor with only the most important fields displayed initially.
*/
-public class ContactEditorFragment extends ContactEditorBaseFragment implements
- RawContactReadOnlyEditorView.Listener {
+public class ContactEditorFragment extends Fragment implements
+ ContactEditor, SplitContactConfirmationDialogFragment.Listener,
+ JoinContactConfirmationDialogFragment.Listener,
+ AggregationSuggestionEngine.Listener, AggregationSuggestionView.Listener,
+ CancelEditDialogFragment.Listener,
+ RawContactEditorView.Listener, PhotoEditorView.Listener {
- private static final String KEY_EXPANDED_EDITORS = "expandedEditors";
+ static final String TAG = "ContactEditor";
- private static final String KEY_RAW_CONTACT_ID_REQUESTING_PHOTO = "photorequester";
- private static final String KEY_CURRENT_PHOTO_URI = "currentphotouri";
- private static final String KEY_UPDATED_PHOTOS = "updatedPhotos";
+ private static final int LOADER_CONTACT = 1;
+ private static final int LOADER_GROUPS = 2;
- // Used to store which raw contact editors have been expanded. Keyed on raw contact ids.
- private HashMap<Long, Boolean> mExpandedEditors = new HashMap<Long, Boolean>();
+ private static final String KEY_PHOTO_RAW_CONTACT_ID = "photo_raw_contact_id";
+ private static final String KEY_UPDATED_PHOTOS = "updated_photos";
+
+ private static final List<String> VALID_INTENT_ACTIONS = new ArrayList<String>() {{
+ add(Intent.ACTION_EDIT);
+ add(Intent.ACTION_INSERT);
+ add(ContactEditorActivity.ACTION_SAVE_COMPLETED);
+ }};
+
+ private static final String KEY_ACTION = "action";
+ private static final String KEY_URI = "uri";
+ private static final String KEY_AUTO_ADD_TO_DEFAULT_GROUP = "autoAddToDefaultGroup";
+ private static final String KEY_DISABLE_DELETE_MENU_OPTION = "disableDeleteMenuOption";
+ private static final String KEY_NEW_LOCAL_PROFILE = "newLocalProfile";
+ private static final String KEY_MATERIAL_PALETTE = "materialPalette";
+
+ private static final String KEY_VIEW_ID_GENERATOR = "viewidgenerator";
+
+ private static final String KEY_RAW_CONTACTS = "rawContacts";
+
+ private static final String KEY_EDIT_STATE = "state";
+ private static final String KEY_STATUS = "status";
+
+ private static final String KEY_HAS_NEW_CONTACT = "hasNewContact";
+ private static final String KEY_NEW_CONTACT_READY = "newContactDataReady";
+
+ private static final String KEY_IS_EDIT = "isEdit";
+ private static final String KEY_EXISTING_CONTACT_READY = "existingContactDataReady";
+
+ private static final String KEY_RAW_CONTACT_DISPLAY_ALONE_IS_READ_ONLY = "isReadOnly";
+
+ // Phone option menus
+ private static final String KEY_SEND_TO_VOICE_MAIL_STATE = "sendToVoicemailState";
+ private static final String KEY_ARE_PHONE_OPTIONS_CHANGEABLE = "arePhoneOptionsChangable";
+ private static final String KEY_CUSTOM_RINGTONE = "customRingtone";
+
+ private static final String KEY_IS_USER_PROFILE = "isUserProfile";
+
+ private static final String KEY_ENABLED = "enabled";
+
+ // Aggregation PopupWindow
+ private static final String KEY_AGGREGATION_SUGGESTIONS_RAW_CONTACT_ID =
+ "aggregationSuggestionsRawContactId";
+
+ // Join Activity
+ private static final String KEY_CONTACT_ID_FOR_JOIN = "contactidforjoin";
+
+ private static final String KEY_READ_ONLY_DISPLAY_NAME_ID = "readOnlyDisplayNameId";
+ private static final String KEY_COPY_READ_ONLY_DISPLAY_NAME = "copyReadOnlyDisplayName";
+
+ protected static final int REQUEST_CODE_JOIN = 0;
+ protected static final int REQUEST_CODE_ACCOUNTS_CHANGED = 1;
+ protected static final int REQUEST_CODE_PICK_RINGTONE = 2;
+
+ private static final int CURRENT_API_VERSION = android.os.Build.VERSION.SDK_INT;
/**
- * The raw contact for which we started "take photo" or "choose photo from gallery" most
- * recently. Used to restore {@link #mCurrentPhotoHandler} after orientation change.
+ * An intent extra that forces the editor to add the edited contact
+ * to the default group (e.g. "My Contacts").
*/
- private long mRawContactIdRequestingPhoto;
+ public static final String INTENT_EXTRA_ADD_TO_DEFAULT_DIRECTORY = "addToDefaultDirectory";
+
+ public static final String INTENT_EXTRA_NEW_LOCAL_PROFILE = "newLocalProfile";
+
+ public static final String INTENT_EXTRA_DISABLE_DELETE_MENU_OPTION =
+ "disableDeleteMenuOption";
/**
- * The {@link PhotoHandler} for the photo editor for the {@link #mRawContactIdRequestingPhoto}
- * raw contact.
- *
- * A {@link PhotoHandler} is created for each photo editor in {@link #bindPhotoHandler}, but
- * the only "active" one should get the activity result. This member represents the active
- * one.
+ * Intent key to pass the photo palette primary color calculated by
+ * {@link com.android.contacts.quickcontact.QuickContactActivity} to the editor.
*/
- private PhotoHandler mCurrentPhotoHandler;
- private Uri mCurrentPhotoUri;
+ public static final String INTENT_EXTRA_MATERIAL_PALETTE_PRIMARY_COLOR =
+ "material_palette_primary_color";
+
+ /**
+ * Intent key to pass the photo palette secondary color calculated by
+ * {@link com.android.contacts.quickcontact.QuickContactActivity} to the editor.
+ */
+ public static final String INTENT_EXTRA_MATERIAL_PALETTE_SECONDARY_COLOR =
+ "material_palette_secondary_color";
+
+ /**
+ * Intent key to pass the ID of the photo to display on the editor.
+ */
+ // TODO: This can be cleaned up if we decide to not pass the photo id through
+ // QuickContactActivity.
+ public static final String INTENT_EXTRA_PHOTO_ID = "photo_id";
+
+ /**
+ * Intent extra to specify a {@link ContactEditor.SaveMode}.
+ */
+ public static final String SAVE_MODE_EXTRA_KEY = "saveMode";
+
+ /**
+ * Intent extra key for the contact ID to join the current contact to after saving.
+ */
+ public static final String JOIN_CONTACT_ID_EXTRA_KEY = "joinContactId";
+
+ /**
+ * Callbacks for Activities that host contact editors Fragments.
+ */
+ public interface Listener {
+
+ /**
+ * Contact was not found, so somehow close this fragment. This is raised after a contact
+ * is removed via Menu/Delete
+ */
+ void onContactNotFound();
+
+ /**
+ * Contact was split, so we can close now.
+ *
+ * @param newLookupUri The lookup uri of the new contact that should be shown to the user.
+ * The editor tries best to chose the most natural contact here.
+ */
+ void onContactSplit(Uri newLookupUri);
+
+ /**
+ * User has tapped Revert, close the fragment now.
+ */
+ void onReverted();
+
+ /**
+ * Contact was saved and the Fragment can now be closed safely.
+ */
+ void onSaveFinished(Intent resultIntent);
+
+ /**
+ * User switched to editing a different contact (a suggestion from the
+ * aggregation engine).
+ */
+ void onEditOtherContactRequested(Uri contactLookupUri,
+ ArrayList<ContentValues> contentValues);
+
+ /**
+ * User has requested that contact be deleted.
+ */
+ void onDeleteRequested(Uri contactUri);
+ }
+
+ /**
+ * Adapter for aggregation suggestions displayed in a PopupWindow when
+ * editor fields change.
+ */
+ private static final class AggregationSuggestionAdapter extends BaseAdapter {
+ private final LayoutInflater mLayoutInflater;
+ private final boolean mSetNewContact;
+ private final AggregationSuggestionView.Listener mListener;
+ private final List<AggregationSuggestionEngine.Suggestion> mSuggestions;
+
+ public AggregationSuggestionAdapter(Activity activity, boolean setNewContact,
+ AggregationSuggestionView.Listener listener, List<Suggestion> suggestions) {
+ mLayoutInflater = activity.getLayoutInflater();
+ mSetNewContact = setNewContact;
+ mListener = listener;
+ mSuggestions = suggestions;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final Suggestion suggestion = (Suggestion) getItem(position);
+ final AggregationSuggestionView suggestionView =
+ (AggregationSuggestionView) mLayoutInflater.inflate(
+ R.layout.aggregation_suggestions_item, null);
+ suggestionView.setNewContact(mSetNewContact);
+ suggestionView.setListener(mListener);
+ suggestionView.bindSuggestion(suggestion);
+ return suggestionView;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return mSuggestions.get(position);
+ }
+
+ @Override
+ public int getCount() {
+ return mSuggestions.size();
+ }
+ }
+
+ protected Context mContext;
+ protected Listener mListener;
+
+ //
+ // Views
+ //
+ protected LinearLayout mContent;
+ protected View mAggregationSuggestionView;
+ protected ListPopupWindow mAggregationSuggestionPopup;
+
+ //
+ // Parameters passed in on {@link #load}
+ //
+ protected String mAction;
+ protected Uri mLookupUri;
+ protected Bundle mIntentExtras;
+ protected boolean mAutoAddToDefaultGroup;
+ protected boolean mDisableDeleteMenuOption;
+ protected boolean mNewLocalProfile;
+ protected MaterialColorMapUtils.MaterialPalette mMaterialPalette;
+
+ //
+ // Helpers
+ //
+ protected ContactEditorUtils mEditorUtils;
+ protected RawContactDeltaComparator mComparator;
+ protected ViewIdGenerator mViewIdGenerator;
+ private AggregationSuggestionEngine mAggregationSuggestionEngine;
+
+ //
+ // Loaded data
+ //
+ // Used to store existing contact data so it can be re-applied during a rebind call,
+ // i.e. account switch.
+ protected ImmutableList<RawContact> mRawContacts;
+ protected Cursor mGroupMetaData;
+
+ //
+ // Editor state
+ //
+ protected RawContactDeltaList mState;
+ protected int mStatus;
+ protected long mRawContactIdToDisplayAlone = -1;
+ protected boolean mRawContactDisplayAloneIsReadOnly = false;
+
+ // Whether to show the new contact blank form and if it's corresponding delta is ready.
+ protected boolean mHasNewContact;
+ protected AccountWithDataSet mAccountWithDataSet;
+ protected boolean mNewContactDataReady;
+ protected boolean mNewContactAccountChanged;
+
+ // Whether it's an edit of existing contact and if it's corresponding delta is ready.
+ protected boolean mIsEdit;
+ protected boolean mExistingContactDataReady;
+
+ // Whether we are editing the "me" profile
+ protected boolean mIsUserProfile;
+
+ // Phone specific option menu items
+ private boolean mSendToVoicemailState;
+ private boolean mArePhoneOptionsChangable;
+ private String mCustomRingtone;
+
+ // Whether editor views and options menu items should be enabled
+ private boolean mEnabled = true;
+
+ // Aggregation PopupWindow
+ private long mAggregationSuggestionsRawContactId;
+
+ // Join Activity
+ protected long mContactIdForJoin;
+
+ // Used to pre-populate the editor with a display name when a user edits a read-only contact.
+ protected long mReadOnlyDisplayNameId;
+ protected boolean mCopyReadOnlyName;
+
+ /**
+ * The contact data loader listener.
+ */
+ protected final LoaderManager.LoaderCallbacks<Contact> mContactLoaderListener =
+ new LoaderManager.LoaderCallbacks<Contact>() {
+
+ protected long mLoaderStartTime;
+
+ @Override
+ public Loader<Contact> onCreateLoader(int id, Bundle args) {
+ mLoaderStartTime = SystemClock.elapsedRealtime();
+ return new ContactLoader(mContext, mLookupUri,
+ /* postViewNotification */ true,
+ /* loadGroupMetaData */ true);
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Contact> loader, Contact contact) {
+ final long loaderCurrentTime = SystemClock.elapsedRealtime();
+ Log.v(TAG, "Time needed for loading: " + (loaderCurrentTime-mLoaderStartTime));
+ if (!contact.isLoaded()) {
+ // Item has been deleted. Close activity without saving again.
+ Log.i(TAG, "No contact found. Closing activity");
+ mStatus = Status.CLOSING;
+ if (mListener != null) mListener.onContactNotFound();
+ return;
+ }
+
+ mStatus = Status.EDITING;
+ mLookupUri = contact.getLookupUri();
+ final long setDataStartTime = SystemClock.elapsedRealtime();
+ setState(contact);
+ setStateForPhoneMenuItems(contact);
+ final long setDataEndTime = SystemClock.elapsedRealtime();
+
+ Log.v(TAG, "Time needed for setting UI: " + (setDataEndTime - setDataStartTime));
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Contact> loader) {
+ }
+ };
+
+ /**
+ * The groups meta data loader listener.
+ */
+ protected final LoaderManager.LoaderCallbacks<Cursor> mGroupsLoaderListener =
+ new LoaderManager.LoaderCallbacks<Cursor>() {
+
+ @Override
+ public CursorLoader onCreateLoader(int id, Bundle args) {
+ return new GroupMetaDataLoader(mContext, ContactsContract.Groups.CONTENT_URI,
+ GroupUtil.ALL_GROUPS_SELECTION);
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ mGroupMetaData = data;
+ setGroupMetaData();
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ }
+ };
+
+ private long mPhotoRawContactId;
private Bundle mUpdatedPhotos = new Bundle();
- public ContactEditorFragment() {
+ @Override
+ public Context getContext() {
+ return getActivity();
}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
- final View view = inflater.inflate(R.layout.contact_editor_fragment, container, false);
-
- mContent = (LinearLayout) view.findViewById(R.id.editors);
-
- setHasOptionsMenu(true);
-
- return view;
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ mContext = activity;
+ mEditorUtils = ContactEditorUtils.create(mContext);
+ mComparator = new RawContactDeltaComparator(mContext);
}
@Override
public void onCreate(Bundle savedState) {
+ if (savedState != null) {
+ // Restore mUri before calling super.onCreate so that onInitializeLoaders
+ // would already have a uri and an action to work with
+ mAction = savedState.getString(KEY_ACTION);
+ mLookupUri = savedState.getParcelable(KEY_URI);
+ }
+
super.onCreate(savedState);
- if (savedState != null) {
- mExpandedEditors = (HashMap<Long, Boolean>)
- savedState.getSerializable(KEY_EXPANDED_EDITORS);
- mRawContactIdRequestingPhoto = savedState.getLong(
- KEY_RAW_CONTACT_ID_REQUESTING_PHOTO);
- mCurrentPhotoUri = savedState.getParcelable(KEY_CURRENT_PHOTO_URI);
+ if (savedState == null) {
+ mViewIdGenerator = new ViewIdGenerator();
+
+ // mState can still be null because it may not have have finished loading before
+ // onSaveInstanceState was called.
+ mState = new RawContactDeltaList();
+ } else {
+ mViewIdGenerator = savedState.getParcelable(KEY_VIEW_ID_GENERATOR);
+
+ mAutoAddToDefaultGroup = savedState.getBoolean(KEY_AUTO_ADD_TO_DEFAULT_GROUP);
+ mDisableDeleteMenuOption = savedState.getBoolean(KEY_DISABLE_DELETE_MENU_OPTION);
+ mNewLocalProfile = savedState.getBoolean(KEY_NEW_LOCAL_PROFILE);
+ mMaterialPalette = savedState.getParcelable(KEY_MATERIAL_PALETTE);
+
+ mRawContacts = ImmutableList.copyOf(savedState.<RawContact>getParcelableArrayList(
+ KEY_RAW_CONTACTS));
+ // NOTE: mGroupMetaData is not saved/restored
+
+ // Read state from savedState. No loading involved here
+ mState = savedState.<RawContactDeltaList> getParcelable(KEY_EDIT_STATE);
+ mStatus = savedState.getInt(KEY_STATUS);
+ mRawContactDisplayAloneIsReadOnly = savedState.getBoolean(
+ KEY_RAW_CONTACT_DISPLAY_ALONE_IS_READ_ONLY);
+
+ mHasNewContact = savedState.getBoolean(KEY_HAS_NEW_CONTACT);
+ mNewContactDataReady = savedState.getBoolean(KEY_NEW_CONTACT_READY);
+
+ mIsEdit = savedState.getBoolean(KEY_IS_EDIT);
+ mExistingContactDataReady = savedState.getBoolean(KEY_EXISTING_CONTACT_READY);
+
+ mIsUserProfile = savedState.getBoolean(KEY_IS_USER_PROFILE);
+
+ // Phone specific options menus
+ mSendToVoicemailState = savedState.getBoolean(KEY_SEND_TO_VOICE_MAIL_STATE);
+ mArePhoneOptionsChangable = savedState.getBoolean(KEY_ARE_PHONE_OPTIONS_CHANGEABLE);
+ mCustomRingtone = savedState.getString(KEY_CUSTOM_RINGTONE);
+
+ mEnabled = savedState.getBoolean(KEY_ENABLED);
+
+ // Aggregation PopupWindow
+ mAggregationSuggestionsRawContactId = savedState.getLong(
+ KEY_AGGREGATION_SUGGESTIONS_RAW_CONTACT_ID);
+
+ // Join Activity
+ mContactIdForJoin = savedState.getLong(KEY_CONTACT_ID_FOR_JOIN);
+
+ mReadOnlyDisplayNameId = savedState.getLong(KEY_READ_ONLY_DISPLAY_NAME_ID);
+ mCopyReadOnlyName = savedState.getBoolean(KEY_COPY_READ_ONLY_DISPLAY_NAME, false);
+
+ mPhotoRawContactId = savedState.getLong(KEY_PHOTO_RAW_CONTACT_ID);
mUpdatedPhotos = savedState.getParcelable(KEY_UPDATED_PHOTOS);
- mRawContactIdToDisplayAlone = savedState.getLong(
- ContactEditorBaseFragment.INTENT_EXTRA_RAW_CONTACT_ID_TO_DISPLAY_ALONE, -1);
}
}
@Override
- public void load(String action, Uri lookupUri, Bundle intentExtras) {
- super.load(action, lookupUri, intentExtras);
- if (intentExtras != null) {
- mRawContactIdToDisplayAlone = intentExtras.getLong(
- ContactEditorBaseFragment.INTENT_EXTRA_RAW_CONTACT_ID_TO_DISPLAY_ALONE, -1);
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
+ setHasOptionsMenu(true);
+
+ final View view = inflater.inflate(
+ R.layout.contact_editor_fragment, container, false);
+ mContent = (LinearLayout) view.findViewById(R.id.raw_contacts_editor_view);
+ return view;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ validateAction(mAction);
+
+ if (mState.isEmpty()) {
+ // The delta list may not have finished loading before orientation change happens.
+ // In this case, there will be a saved state but deltas will be missing. Reload from
+ // database.
+ if (Intent.ACTION_EDIT.equals(mAction)) {
+ // Either
+ // 1) orientation change but load never finished.
+ // 2) not an orientation change so data needs to be loaded for first time.
+ getLoaderManager().initLoader(LOADER_CONTACT, null, mContactLoaderListener);
+ getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupsLoaderListener);
+ }
+ } else {
+ // Orientation change, we already have mState, it was loaded by onCreate
+ bindEditors();
+ }
+
+ // Handle initial actions only when existing state missing
+ if (savedInstanceState == null) {
+ final Account account = mIntentExtras == null ? null :
+ (Account) mIntentExtras.getParcelable(Intents.Insert.EXTRA_ACCOUNT);
+ final String dataSet = mIntentExtras == null ? null :
+ mIntentExtras.getString(Intents.Insert.EXTRA_DATA_SET);
+ if (account != null) {
+ mAccountWithDataSet = new AccountWithDataSet(account.name, account.type, dataSet);
+ }
+
+ if (Intent.ACTION_EDIT.equals(mAction)) {
+ mIsEdit = true;
+ } else if (Intent.ACTION_INSERT.equals(mAction)) {
+ mHasNewContact = true;
+ if (mAccountWithDataSet != null) {
+ createContact(mAccountWithDataSet);
+ } else if (mIntentExtras != null && mIntentExtras.getBoolean(
+ ContactEditorActivity.EXTRA_SAVE_TO_DEVICE_FLAG, false)) {
+ createContact(null);
+ } else {
+ // No Account specified. Let the user choose
+ // Load Accounts async so that we can present them
+ selectAccountAndCreateContact();
+ }
+ }
}
}
- @Override
- public void onStart() {
- getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupsLoaderListener);
- super.onStart();
- }
-
- @Override
- public void onExternalEditorRequest(AccountWithDataSet account, Uri uri) {
- if (mListener != null) {
- mListener.onCustomEditContactActivityRequested(account, uri, null, false);
- }
- }
-
- @Override
- public void onEditorExpansionChanged() {
- updatedExpandedEditorsMap();
- }
-
- @Override
- protected void setGroupMetaData() {
- if (mGroupMetaData == null) {
+ /**
+ * Checks if the requested action is valid.
+ *
+ * @param action The action to test.
+ * @throws IllegalArgumentException when the action is invalid.
+ */
+ private static void validateAction(String action) {
+ if (VALID_INTENT_ACTIONS.contains(action)) {
return;
}
- int editorCount = mContent.getChildCount();
- for (int i = 0; i < editorCount; i++) {
- BaseRawContactEditorView editor = (BaseRawContactEditorView) mContent.getChildAt(i);
- editor.setGroupMetaData(mGroupMetaData);
+ throw new IllegalArgumentException(
+ "Unknown action " + action + "; Supported actions: " + VALID_INTENT_ACTIONS);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putString(KEY_ACTION, mAction);
+ outState.putParcelable(KEY_URI, mLookupUri);
+ outState.putBoolean(KEY_AUTO_ADD_TO_DEFAULT_GROUP, mAutoAddToDefaultGroup);
+ outState.putBoolean(KEY_DISABLE_DELETE_MENU_OPTION, mDisableDeleteMenuOption);
+ outState.putBoolean(KEY_NEW_LOCAL_PROFILE, mNewLocalProfile);
+ if (mMaterialPalette != null) {
+ outState.putParcelable(KEY_MATERIAL_PALETTE, mMaterialPalette);
+ }
+ outState.putParcelable(KEY_VIEW_ID_GENERATOR, mViewIdGenerator);
+
+ outState.putParcelableArrayList(KEY_RAW_CONTACTS, mRawContacts == null ?
+ Lists.<RawContact>newArrayList() : Lists.newArrayList(mRawContacts));
+ // NOTE: mGroupMetaData is not saved
+
+ if (hasValidState()) {
+ // Store entities with modifications
+ outState.putParcelable(KEY_EDIT_STATE, mState);
+ }
+ outState.putInt(KEY_STATUS, mStatus);
+ outState.putBoolean(KEY_HAS_NEW_CONTACT, mHasNewContact);
+ outState.putBoolean(KEY_NEW_CONTACT_READY, mNewContactDataReady);
+ outState.putBoolean(KEY_IS_EDIT, mIsEdit);
+ outState.putBoolean(KEY_EXISTING_CONTACT_READY, mExistingContactDataReady);
+ outState.putBoolean(KEY_RAW_CONTACT_DISPLAY_ALONE_IS_READ_ONLY,
+ mRawContactDisplayAloneIsReadOnly);
+
+ outState.putBoolean(KEY_IS_USER_PROFILE, mIsUserProfile);
+
+ // Phone specific options
+ outState.putBoolean(KEY_SEND_TO_VOICE_MAIL_STATE, mSendToVoicemailState);
+ outState.putBoolean(KEY_ARE_PHONE_OPTIONS_CHANGEABLE, mArePhoneOptionsChangable);
+ outState.putString(KEY_CUSTOM_RINGTONE, mCustomRingtone);
+
+ outState.putBoolean(KEY_ENABLED, mEnabled);
+
+ // Aggregation PopupWindow
+ outState.putLong(KEY_AGGREGATION_SUGGESTIONS_RAW_CONTACT_ID,
+ mAggregationSuggestionsRawContactId);
+
+ // Join Activity
+ outState.putLong(KEY_CONTACT_ID_FOR_JOIN, mContactIdForJoin);
+
+ outState.putLong(KEY_READ_ONLY_DISPLAY_NAME_ID, mReadOnlyDisplayNameId);
+ outState.putBoolean(KEY_COPY_READ_ONLY_DISPLAY_NAME, mCopyReadOnlyName);
+
+ outState.putLong(KEY_PHOTO_RAW_CONTACT_ID, mPhotoRawContactId);
+ outState.putParcelable(KEY_UPDATED_PHOTOS, mUpdatedPhotos);
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ UiClosables.closeQuietly(mAggregationSuggestionPopup);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (mAggregationSuggestionEngine != null) {
+ mAggregationSuggestionEngine.quit();
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ case REQUEST_CODE_JOIN: {
+ // Ignore failed requests
+ if (resultCode != Activity.RESULT_OK) return;
+ if (data != null) {
+ final long contactId = ContentUris.parseId(data.getData());
+ if (hasPendingChanges()) {
+ // Ask the user if they want to save changes before doing the join
+ JoinContactConfirmationDialogFragment.show(this, contactId);
+ } else {
+ // Do the join immediately
+ joinAggregate(contactId);
+ }
+ }
+ break;
+ }
+ case REQUEST_CODE_ACCOUNTS_CHANGED: {
+ // Bail if the account selector was not successful.
+ if (resultCode != Activity.RESULT_OK) {
+ if (mListener != null) {
+ mListener.onReverted();
+ }
+ return;
+ }
+ // If there's an account specified, use it.
+ if (data != null) {
+ AccountWithDataSet account = data.getParcelableExtra(
+ Intents.Insert.EXTRA_ACCOUNT);
+ if (account != null) {
+ createContact(account);
+ return;
+ }
+ }
+ // If there isn't an account specified, then this is likely a phone-local
+ // contact, so we should continue setting up the editor by automatically selecting
+ // the most appropriate account.
+ createContact();
+ break;
+ }
+ case REQUEST_CODE_PICK_RINGTONE: {
+ if (data != null) {
+ final Uri pickedUri = data.getParcelableExtra(
+ RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
+ onRingtonePicked(pickedUri);
+ }
+ break;
+ }
+ }
+ }
+
+ private void onRingtonePicked(Uri pickedUri) {
+ mCustomRingtone = EditorUiUtils.getRingtoneStringFromUri(pickedUri, CURRENT_API_VERSION);
+ Intent intent = ContactSaveService.createSetRingtone(
+ mContext, mLookupUri, mCustomRingtone);
+ mContext.startService(intent);
+ }
+
+ //
+ // Options menu
+ //
+
+ private void setStateForPhoneMenuItems(Contact contact) {
+ if (contact != null) {
+ mSendToVoicemailState = contact.isSendToVoicemail();
+ mCustomRingtone = contact.getCustomRingtone();
+ mArePhoneOptionsChangable = !contact.isDirectoryEntry()
+ && PhoneCapabilityTester.isPhone(mContext);
+ }
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) {
+ inflater.inflate(R.menu.edit_contact, menu);
+ }
+
+ @Override
+ public void onPrepareOptionsMenu(Menu menu) {
+ // This supports the keyboard shortcut to save changes to a contact but shouldn't be visible
+ // because the custom action bar contains the "save" button now (not the overflow menu).
+ // TODO: Find a better way to handle shortcuts, i.e. onKeyDown()?
+ final MenuItem saveMenu = menu.findItem(R.id.menu_save);
+ final MenuItem splitMenu = menu.findItem(R.id.menu_split);
+ final MenuItem joinMenu = menu.findItem(R.id.menu_join);
+ final MenuItem helpMenu = menu.findItem(R.id.menu_help);
+ final MenuItem sendToVoiceMailMenu = menu.findItem(R.id.menu_send_to_voicemail);
+ final MenuItem ringToneMenu = menu.findItem(R.id.menu_set_ringtone);
+ final MenuItem deleteMenu = menu.findItem(R.id.menu_delete);
+
+ // Set visibility of menus
+
+ // help menu depending on whether this is inserting or editing
+ if (Intent.ACTION_INSERT.equals(mAction)) {
+ HelpUtils.prepareHelpMenuItem(mContext, helpMenu, R.string.help_url_people_add);
+ splitMenu.setVisible(false);
+ joinMenu.setVisible(false);
+ deleteMenu.setVisible(false);
+ } else if (Intent.ACTION_EDIT.equals(mAction)) {
+ HelpUtils.prepareHelpMenuItem(mContext, helpMenu, R.string.help_url_people_edit);
+ splitMenu.setVisible(canUnlinkRawContacts());
+ // Cannot join a user profile
+ joinMenu.setVisible(!isEditingUserProfile());
+ deleteMenu.setVisible(!mDisableDeleteMenuOption && !isEditingUserProfile());
+ } else {
+ // something else, so don't show the help menu
+ helpMenu.setVisible(false);
+ }
+
+ // Save menu is invisible when there's only one read only contact in the editor.
+ saveMenu.setVisible(!mRawContactDisplayAloneIsReadOnly);
+ if (saveMenu.isVisible()) {
+ // Since we're using a custom action layout we have to manually hook up the handler.
+ saveMenu.getActionView().setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onOptionsItemSelected(saveMenu);
+ }
+ });
+ }
+
+ if (mIsUserProfile) {
+ sendToVoiceMailMenu.setVisible(false);
+ ringToneMenu.setVisible(false);
+ } else {
+ // Hide telephony-related settings (ringtone, send to voicemail)
+ // if we don't have a telephone or are editing a new contact.
+ sendToVoiceMailMenu.setChecked(mSendToVoicemailState);
+ sendToVoiceMailMenu.setVisible(mArePhoneOptionsChangable);
+ ringToneMenu.setVisible(mArePhoneOptionsChangable);
+ }
+
+ int size = menu.size();
+ for (int i = 0; i < size; i++) {
+ menu.getItem(i).setEnabled(mEnabled);
}
}
@@ -154,254 +806,979 @@
if (item.getItemId() == android.R.id.home) {
return revert();
}
- return super.onOptionsItemSelected(item);
+
+ final Activity activity = getActivity();
+ if (activity == null || activity.isFinishing() || activity.isDestroyed()) {
+ // If we no longer are attached to a running activity want to
+ // drain this event.
+ return true;
+ }
+
+ switch (item.getItemId()) {
+ case R.id.menu_save:
+ return save(SaveMode.CLOSE);
+ case R.id.menu_delete:
+ if (mListener != null) mListener.onDeleteRequested(mLookupUri);
+ return true;
+ case R.id.menu_split:
+ return doSplitContactAction();
+ case R.id.menu_join:
+ return doJoinContactAction();
+ case R.id.menu_set_ringtone:
+ doPickRingtone();
+ return true;
+ case R.id.menu_send_to_voicemail:
+ // Update state and save
+ mSendToVoicemailState = !mSendToVoicemailState;
+ item.setChecked(mSendToVoicemailState);
+ final Intent intent = ContactSaveService.createSetSendToVoicemail(
+ mContext, mLookupUri, mSendToVoicemailState);
+ mContext.startService(intent);
+ return true;
+ }
+
+ return false;
}
@Override
- protected void bindEditors() {
- // bindEditors() can only bind views if there is data in mState, so immediately return
- // if mState is null
- if (mState.isEmpty()) {
- return;
- }
-
- // Check if delta list is ready. Delta list is populated from existing data and when
- // editing an read-only contact, it's also populated with newly created data for the
- // blank form. When the data is not ready, skip. This method will be called multiple times.
- if ((mIsEdit && !mExistingContactDataReady) || (mHasNewContact && !mNewContactDataReady)) {
- return;
- }
-
- // Sort the editors
- Collections.sort(mState, mComparator);
-
- // Remove any existing editors and rebuild any visible
- mContent.removeAllViews();
-
- final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
- int numRawContacts = mState.size();
-
- for (int i = 0; i < numRawContacts; i++) {
- // TODO ensure proper ordering of entities in the list
- final RawContactDelta rawContactDelta = mState.get(i);
- if (!rawContactDelta.isVisible()) continue;
-
- final AccountType type = rawContactDelta.getAccountType(accountTypes);
- final long rawContactId = rawContactDelta.getRawContactId();
-
- if (mRawContactIdToDisplayAlone != -1 && mRawContactIdToDisplayAlone != rawContactId) {
- continue;
- }
-
- final BaseRawContactEditorView editor;
- if (!type.areContactsWritable()) {
- editor = (BaseRawContactEditorView) inflater.inflate(
- R.layout.raw_contact_readonly_editor_view, mContent, false);
- } else {
- editor = (RawContactEditorView) inflater.inflate(R.layout.raw_contact_editor_view,
- mContent, false);
- }
- editor.setListener(this);
- editor.setEnabled(isEnabled());
-
- if (mRawContactIdToDisplayAlone != -1) {
- editor.setCollapsed(false);
- } else if (mExpandedEditors.containsKey(rawContactId)) {
- editor.setCollapsed(mExpandedEditors.get(rawContactId));
- } else {
- // By default, only the first editor will be expanded.
- editor.setCollapsed(i != 0);
- }
-
- mContent.addView(editor);
-
- editor.setState(rawContactDelta, type, mViewIdGenerator, isEditingUserProfile());
- if (mRawContactIdToDisplayAlone != -1) {
- editor.setCollapsible(false);
- } else {
- editor.setCollapsible(numRawContacts > 1);
- }
-
- // Set up the photo handler.
- bindPhotoHandler(editor, type, mState);
-
- // If a new photo was chosen but not yet saved, we need to update the UI to
- // reflect this.
- final Uri photoUri = updatedPhotoUriForRawContact(rawContactId);
- if (photoUri != null) editor.setFullSizedPhoto(photoUri);
-
- if (editor instanceof RawContactEditorView) {
- final Activity activity = getActivity();
- final RawContactEditorView rawContactEditor = (RawContactEditorView) editor;
- final ValuesDelta nameValuesDelta = rawContactEditor.getNameEditor().getValues();
- final EditorListener structuredNameListener = new EditorListener() {
-
- @Override
- public void onRequest(int request) {
- // Make sure the activity is running
- if (activity.isFinishing()) {
- return;
- }
- if (!isEditingUserProfile()) {
- if (request == EditorListener.FIELD_CHANGED) {
- if (!nameValuesDelta.isSuperPrimary()) {
- unsetSuperPrimaryForAllNameEditors();
- nameValuesDelta.setSuperPrimary(true);
- }
- acquireAggregationSuggestions(activity,
- rawContactEditor.getNameEditor().getRawContactId(),
- rawContactEditor.getNameEditor().getValues());
- } else if (request == EditorListener.FIELD_TURNED_EMPTY) {
- if (nameValuesDelta.isSuperPrimary()) {
- nameValuesDelta.setSuperPrimary(false);
- }
- }
- }
- }
-
- @Override
- public void onDeleteRequested(Editor removedEditor) {
- }
- };
-
- final StructuredNameEditorView nameEditor = rawContactEditor.getNameEditor();
- nameEditor.setEditorListener(structuredNameListener);
-
- rawContactEditor.setAutoAddToDefaultGroup(mAutoAddToDefaultGroup);
-
- if (!isEditingUserProfile() && isAggregationSuggestionRawContactId(rawContactId)) {
- acquireAggregationSuggestions(activity,
- rawContactEditor.getNameEditor().getRawContactId(),
- rawContactEditor.getNameEditor().getValues());
- }
- }
- }
-
- setGroupMetaData();
-
- // Show editor now that we've loaded state
- mContent.setVisibility(View.VISIBLE);
-
- // Refresh Action Bar as the visibility of the join command
- // Activity can be null if we have been detached from the Activity
- invalidateOptionsMenu();
-
- updatedExpandedEditorsMap();
- }
-
- private void unsetSuperPrimaryForAllNameEditors() {
- for (int i = 0; i < mContent.getChildCount(); i++) {
- final View view = mContent.getChildAt(i);
- if (view instanceof RawContactEditorView) {
- final RawContactEditorView rawContactEditorView = (RawContactEditorView) view;
- final StructuredNameEditorView nameEditorView =
- rawContactEditorView.getNameEditor();
- if (nameEditorView != null) {
- final ValuesDelta valuesDelta = nameEditorView.getValues();
- if (valuesDelta != null) {
- valuesDelta.setSuperPrimary(false);
- }
- }
- }
- }
- }
-
- /**
- * Update the values in {@link #mExpandedEditors}.
- */
- private void updatedExpandedEditorsMap() {
- for (int i = 0; i < mContent.getChildCount(); i++) {
- final View childView = mContent.getChildAt(i);
- if (childView instanceof BaseRawContactEditorView) {
- BaseRawContactEditorView childEditor = (BaseRawContactEditorView) childView;
- mExpandedEditors.put(childEditor.getRawContactId(), childEditor.isCollapsed());
- }
- }
- }
-
- /**
- * If we've stashed a temporary file containing a contact's new photo, return its URI.
- * @param rawContactId identifies the raw-contact whose Bitmap we'll try to return.
- * @return Uru of photo for specified raw-contact, or null
- */
- private Uri updatedPhotoUriForRawContact(long rawContactId) {
- return (Uri) mUpdatedPhotos.get(String.valueOf(rawContactId));
- }
-
- private void bindPhotoHandler(BaseRawContactEditorView editor, AccountType type,
- RawContactDeltaList state) {
- final int mode;
- boolean showIsPrimaryOption;
- if (type.areContactsWritable()) {
- if (editor.hasSetPhoto()) {
- mode = PhotoActionPopup.Modes.WRITE_ABLE_PHOTO;
- showIsPrimaryOption = hasMoreThanOnePhoto();
- } else {
- mode = PhotoActionPopup.Modes.NO_PHOTO;
- showIsPrimaryOption = false;
- }
- } else if (editor.hasSetPhoto() && hasMoreThanOnePhoto()) {
- mode = PhotoActionPopup.Modes.READ_ONLY_PHOTO;
- showIsPrimaryOption = true;
+ public boolean revert() {
+ if (mState.isEmpty() || !hasPendingChanges()) {
+ onCancelEditConfirmed();
} else {
- // Read-only and either no photo or the only photo ==> no options
- editor.getPhotoEditor().setEditorListener(null);
- editor.getPhotoEditor().setShowPrimary(false);
- return;
+ CancelEditDialogFragment.show(this);
}
- if (mRawContactIdToDisplayAlone != -1) {
- showIsPrimaryOption = false;
- }
- final PhotoHandler photoHandler = new PhotoHandler(mContext, editor, mode, state);
- editor.getPhotoEditor().setEditorListener(
- (PhotoHandler.PhotoEditorListener) photoHandler.getListener());
- editor.getPhotoEditor().setShowPrimary(showIsPrimaryOption);
+ return true;
+ }
- // Note a newly created raw contact gets some random negative ID, so any value is valid
- // here. (i.e. don't check against -1 or anything.)
- if (mRawContactIdRequestingPhoto == editor.getRawContactId()) {
- mCurrentPhotoHandler = photoHandler;
+ @Override
+ public void onCancelEditConfirmed() {
+ // When this Fragment is closed we don't want it to auto-save
+ mStatus = Status.CLOSING;
+ if (mListener != null) {
+ mListener.onReverted();
}
}
@Override
+ public void onSplitContactConfirmed(boolean hasPendingChanges) {
+ if (mState.isEmpty()) {
+ // This may happen when this Fragment is recreated by the system during users
+ // confirming the split action (and thus this method is called just before onCreate()),
+ // for example.
+ Log.e(TAG, "mState became null during the user's confirming split action. " +
+ "Cannot perform the save action.");
+ return;
+ }
+
+ if (!hasPendingChanges && mHasNewContact) {
+ // If the user didn't add anything new, we don't want to split out the newly created
+ // raw contact into a name-only contact so remove them.
+ final Iterator<RawContactDelta> iterator = mState.iterator();
+ while (iterator.hasNext()) {
+ final RawContactDelta rawContactDelta = iterator.next();
+ if (rawContactDelta.getRawContactId() < 0) {
+ iterator.remove();
+ }
+ }
+ }
+ mState.markRawContactsForSplitting();
+ save(SaveMode.SPLIT);
+ }
+
+ private boolean doSplitContactAction() {
+ if (!hasValidState()) return false;
+
+ SplitContactConfirmationDialogFragment.show(this, hasPendingChanges());
+ return true;
+ }
+
+ private boolean doJoinContactAction() {
+ if (!hasValidState() || mLookupUri == null) {
+ return false;
+ }
+
+ // If we just started creating a new contact and haven't added any data, it's too
+ // early to do a join
+ if (mState.size() == 1 && mState.get(0).isContactInsert()
+ && !hasPendingChanges()) {
+ Toast.makeText(mContext, R.string.toast_join_with_empty_contact,
+ Toast.LENGTH_LONG).show();
+ return true;
+ }
+
+ showJoinAggregateActivity(mLookupUri);
+ return true;
+ }
+
+ @Override
+ public void onJoinContactConfirmed(long joinContactId) {
+ doSaveAction(SaveMode.JOIN, joinContactId);
+ }
+
+ private void doPickRingtone() {
+ final Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
+ // Allow user to pick 'Default'
+ intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
+ // Show only ringtones
+ intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
+ // Allow the user to pick a silent ringtone
+ intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
+
+ final Uri ringtoneUri = EditorUiUtils.getRingtoneUriFromString(mCustomRingtone,
+ CURRENT_API_VERSION);
+
+ // Put checkmark next to the current ringtone for this contact
+ intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);
+
+ // Launch!
+ try {
+ startActivityForResult(intent, REQUEST_CODE_PICK_RINGTONE);
+ } catch (ActivityNotFoundException ex) {
+ Toast.makeText(mContext, R.string.missing_app, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ @Override
+ public boolean save(int saveMode) {
+ if (!hasValidState() || mStatus != Status.EDITING) {
+ return false;
+ }
+
+ // If we are about to close the editor - there is no need to refresh the data
+ if (saveMode == SaveMode.CLOSE || saveMode == SaveMode.EDITOR
+ || saveMode == SaveMode.SPLIT) {
+ getLoaderManager().destroyLoader(LOADER_CONTACT);
+ }
+
+ mStatus = Status.SAVING;
+
+ if (!hasPendingChanges()) {
+ if (mLookupUri == null && saveMode == SaveMode.RELOAD) {
+ // We don't have anything to save and there isn't even an existing contact yet.
+ // Nothing to do, simply go back to editing mode
+ mStatus = Status.EDITING;
+ return true;
+ }
+ onSaveCompleted(/* hadChanges =*/ false, saveMode,
+ /* saveSucceeded =*/ mLookupUri != null, mLookupUri, /* joinContactId =*/ null);
+ return true;
+ }
+
+ setEnabled(false);
+
+ return doSaveAction(saveMode, /* joinContactId */ null);
+ }
+
+ //
+ // State accessor methods
+ //
+
+ /**
+ * Check if our internal {@link #mState} is valid, usually checked before
+ * performing user actions.
+ */
+ private boolean hasValidState() {
+ return mState.size() > 0;
+ }
+
+ private boolean isEditingUserProfile() {
+ return mNewLocalProfile || mIsUserProfile;
+ }
+
+ /**
+ * Whether the contact being edited spans multiple raw contacts.
+ * The may also span multiple accounts.
+ */
+ private boolean isEditingMultipleRawContacts() {
+ return mState.size() > 1;
+ }
+
+ /**
+ * Whether the contact being edited is composed of a single read-only raw contact
+ * aggregated with a newly created writable raw contact.
+ */
+ private boolean isEditingReadOnlyRawContactWithNewContact() {
+ return mHasNewContact && mState.size() == 2;
+ }
+
+ /**
+ * Return true if there are any edits to the current contact which need to
+ * be saved.
+ */
+ private boolean hasPendingRawContactChanges(Set<String> excludedMimeTypes) {
+ final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
+ return RawContactModifier.hasChanges(mState, accountTypes, excludedMimeTypes);
+ }
+
+ /**
+ * We allow unlinking only if there is more than one raw contact, it is not a user-profile,
+ * and unlinking won't result in an empty contact. For the empty contact case, we only guard
+ * against this when there is a single read-only contact in the aggregate. If the user
+ * has joined >1 read-only contacts together, we allow them to unlink it, even if they have
+ * never added their own information and unlinking will create a name only contact.
+ */
+ private boolean canUnlinkRawContacts() {
+ return isEditingMultipleRawContacts()
+ && !isEditingUserProfile()
+ && !isEditingReadOnlyRawContactWithNewContact();
+ }
+
+ /**
+ * Determines if changes were made in the editor that need to be saved, while taking into
+ * account that name changes are not real for read-only contacts.
+ * See go/editing-read-only-contacts
+ */
+ private boolean hasPendingChanges() {
+ if (isEditingReadOnlyRawContactWithNewContact()) {
+ // We created a new raw contact delta with a default display name.
+ // We must test for pending changes while ignoring the default display name.
+ final ValuesDelta beforeDelta = mState.getByRawContactId(mReadOnlyDisplayNameId)
+ .getSuperPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE);
+ final ValuesDelta pendingDelta = mState
+ .getSuperPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE);
+ if (structuredNamesAreEqual(beforeDelta, pendingDelta)) {
+ final Set<String> excludedMimeTypes = new HashSet<>();
+ excludedMimeTypes.add(StructuredName.CONTENT_ITEM_TYPE);
+ return hasPendingRawContactChanges(excludedMimeTypes);
+ }
+ return true;
+ }
+ return hasPendingRawContactChanges(/* excludedMimeTypes =*/ null);
+ }
+
+ /**
+ * Compares the two {@link ValuesDelta} to see if the structured name is changed. We made a copy
+ * of a read only delta and now we want to check if the copied delta has changes.
+ *
+ * @param before original {@link ValuesDelta}
+ * @param after copied {@link ValuesDelta}
+ * @return true if the copied {@link ValuesDelta} has all the same values in the structured
+ * name fields as the original.
+ */
+ private boolean structuredNamesAreEqual(ValuesDelta before, ValuesDelta after) {
+ if (before == null && after == null) return true;
+ if (before == null || after == null) return false;
+ final ContentValues original = before.getBefore();
+ final ContentValues pending = after.getAfter();
+ if (original != null && pending != null) {
+ final String beforeDisplayName = original.getAsString(
+ StructuredName.DISPLAY_NAME);
+ final String afterDisplayName = pending.getAsString(StructuredName.DISPLAY_NAME);
+ if (!TextUtils.equals(beforeDisplayName, afterDisplayName)) return false;
+
+ final String beforePrefix = original.getAsString(StructuredName.PREFIX);
+ final String afterPrefix = pending.getAsString(StructuredName.PREFIX);
+ if (!TextUtils.equals(beforePrefix, afterPrefix)) return false;
+
+ final String beforeFirstName = original.getAsString(StructuredName.GIVEN_NAME);
+ final String afterFirstName = pending.getAsString(StructuredName.GIVEN_NAME);
+ if (!TextUtils.equals(beforeFirstName, afterFirstName)) return false;
+
+ final String beforeMiddleName = original.getAsString(StructuredName.MIDDLE_NAME);
+ final String afterMiddleName = pending.getAsString(StructuredName.MIDDLE_NAME);
+ if (!TextUtils.equals(beforeMiddleName, afterMiddleName)) return false;
+
+ final String beforeLastName = original.getAsString(StructuredName.FAMILY_NAME);
+ final String afterLastName = pending.getAsString(StructuredName.FAMILY_NAME);
+ if (!TextUtils.equals(beforeLastName, afterLastName)) return false;
+
+ final String beforeSuffix = original.getAsString(StructuredName.SUFFIX);
+ final String afterSuffix = pending.getAsString(StructuredName.SUFFIX);
+ return TextUtils.equals(beforeSuffix, afterSuffix);
+ }
+ return false;
+ }
+
+ /**
+ * Whether editor inputs and the options menu should be enabled.
+ */
+ private boolean isEnabled() {
+ return mEnabled;
+ }
+
+ /**
+ * Returns the palette extra that was passed in.
+ */
+ private MaterialColorMapUtils.MaterialPalette getMaterialPalette() {
+ return mMaterialPalette;
+ }
+
+ //
+ // Account creation
+ //
+
+ private void selectAccountAndCreateContact() {
+ // If this is a local profile, then skip the logic about showing the accounts changed
+ // activity and create a phone-local contact.
+ if (mNewLocalProfile) {
+ createContact(null);
+ return;
+ }
+
+ // If there is no default account or the accounts have changed such that we need to
+ // prompt the user again, then launch the account prompt.
+ if (mEditorUtils.shouldShowAccountChangedNotification()) {
+ Intent intent = new Intent(mContext, ContactEditorAccountsChangedActivity.class);
+ // Prevent a second instance from being started on rotates
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mStatus = Status.SUB_ACTIVITY;
+ startActivityForResult(intent, REQUEST_CODE_ACCOUNTS_CHANGED);
+ } else {
+ // Otherwise, there should be a default account. Then either create a local contact
+ // (if default account is null) or create a contact with the specified account.
+ AccountWithDataSet defaultAccount = mEditorUtils.getOnlyOrDefaultAccount();
+ createContact(defaultAccount);
+ }
+ }
+
+ /**
+ * Create a contact by automatically selecting the first account. If there's no available
+ * account, a device-local contact should be created.
+ */
+ private void createContact() {
+ final List<AccountWithDataSet> accounts =
+ AccountTypeManager.getInstance(mContext).getAccounts(true);
+ // No Accounts available. Create a phone-local contact.
+ if (accounts.isEmpty()) {
+ createContact(null);
+ return;
+ }
+
+ // We have an account switcher in "create-account" screen, so don't need to ask a user to
+ // select an account here.
+ createContact(accounts.get(0));
+ }
+
+ /**
+ * Shows account creation screen associated with a given account.
+ *
+ * @param account may be null to signal a device-local contact should be created.
+ */
+ private void createContact(AccountWithDataSet account) {
+ final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
+ final AccountType accountType = accountTypes.getAccountTypeForAccount(account);
+
+ setStateForNewContact(account, accountType, isEditingUserProfile());
+ }
+
+ //
+ // Data binding
+ //
+
+ private void setState(Contact contact) {
+ // If we have already loaded data, we do not want to change it here to not confuse the user
+ if (!mState.isEmpty()) {
+ Log.v(TAG, "Ignoring background change. This will have to be rebased later");
+ return;
+ }
+ mRawContacts = contact.getRawContacts();
+
+ // Check for writable raw contacts. If there are none, then we need to create one so user
+ // can edit. For the user profile case, there is already an editable contact.
+ if (!contact.isUserProfile() && !contact.isWritableContact(mContext)) {
+ mHasNewContact = true;
+ mReadOnlyDisplayNameId = contact.getNameRawContactId();
+ mCopyReadOnlyName = true;
+ // This is potentially an asynchronous call and will add deltas to list.
+ selectAccountAndCreateContact();
+ } else {
+ mHasNewContact = false;
+ }
+
+ setStateForExistingContact(contact.isUserProfile(), mRawContacts);
+ if (mAutoAddToDefaultGroup
+ && InvisibleContactUtil.isInvisibleAndAddable(contact, getContext())) {
+ InvisibleContactUtil.markAddToDefaultGroup(contact, mState, getContext());
+ }
+ }
+
+ /**
+ * Prepare {@link #mState} for a newly created phone-local contact.
+ */
+ private void setStateForNewContact(AccountWithDataSet account, AccountType accountType,
+ boolean isUserProfile) {
+ setStateForNewContact(account, accountType, /* oldState =*/ null,
+ /* oldAccountType =*/ null, isUserProfile);
+ }
+
+ /**
+ * Prepare {@link #mState} for a newly created phone-local contact, migrating the state
+ * specified by oldState and oldAccountType.
+ */
+ private void setStateForNewContact(AccountWithDataSet account, AccountType accountType,
+ RawContactDelta oldState, AccountType oldAccountType, boolean isUserProfile) {
+ mStatus = Status.EDITING;
+ mState.add(createNewRawContactDelta(account, accountType, oldState, oldAccountType));
+ mIsUserProfile = isUserProfile;
+ mNewContactDataReady = true;
+ bindEditors();
+ }
+
+ /**
+ * Returns a {@link RawContactDelta} for a new contact suitable for addition into
+ * {@link #mState}.
+ *
+ * If oldState and oldAccountType are specified, the state specified by those parameters
+ * is migrated to the result {@link RawContactDelta}.
+ */
+ private RawContactDelta createNewRawContactDelta(AccountWithDataSet account,
+ AccountType accountType, RawContactDelta oldState, AccountType oldAccountType) {
+ final RawContact rawContact = new RawContact();
+ if (account != null) {
+ rawContact.setAccount(account);
+ } else {
+ rawContact.setAccountToLocal();
+ }
+
+ final RawContactDelta result = new RawContactDelta(
+ ValuesDelta.fromAfter(rawContact.getValues()));
+ if (oldState == null) {
+ // Parse any values from incoming intent
+ RawContactModifier.parseExtras(mContext, accountType, result, mIntentExtras);
+ } else {
+ RawContactModifier.migrateStateForNewContact(
+ mContext, oldState, result, oldAccountType, accountType);
+ }
+
+ // Ensure we have some default fields (if the account type does not support a field,
+ // ensureKind will not add it, so it is safe to add e.g. Event)
+ RawContactModifier.ensureKindExists(result, accountType, Phone.CONTENT_ITEM_TYPE);
+ RawContactModifier.ensureKindExists(result, accountType, Email.CONTENT_ITEM_TYPE);
+ RawContactModifier.ensureKindExists(result, accountType, Organization.CONTENT_ITEM_TYPE);
+ RawContactModifier.ensureKindExists(result, accountType, Event.CONTENT_ITEM_TYPE);
+ RawContactModifier.ensureKindExists(result, accountType,
+ StructuredPostal.CONTENT_ITEM_TYPE);
+
+ // Set the correct URI for saving the contact as a profile
+ if (mNewLocalProfile) {
+ result.setProfileQueryUri();
+ }
+
+ return result;
+ }
+
+ /**
+ * Prepare {@link #mState} for an existing contact.
+ */
+ private void setStateForExistingContact(boolean isUserProfile,
+ ImmutableList<RawContact> rawContacts) {
+ setEnabled(true);
+
+ mState.addAll(rawContacts.iterator());
+ setIntentExtras(mIntentExtras);
+ mIntentExtras = null;
+
+ // For user profile, change the contacts query URI
+ mIsUserProfile = isUserProfile;
+ boolean localProfileExists = false;
+
+ if (mIsUserProfile) {
+ for (RawContactDelta rawContactDelta : mState) {
+ // For profile contacts, we need a different query URI
+ rawContactDelta.setProfileQueryUri();
+ // Try to find a local profile contact
+ if (rawContactDelta.getValues().getAsString(RawContacts.ACCOUNT_TYPE) == null) {
+ localProfileExists = true;
+ }
+ }
+ // Editor should always present a local profile for editing
+ // TODO(wjang): Need to figure out when this case comes up. We can't do this if we're
+ // going to prune all but the one raw contact that we're trying to display by itself.
+ if (!localProfileExists && mRawContactIdToDisplayAlone <= 0) {
+ mState.add(createLocalRawContactDelta());
+ }
+ }
+ mExistingContactDataReady = true;
+ bindEditors();
+ }
+
+ /**
+ * Set the enabled state of editors.
+ */
+ private void setEnabled(boolean enabled) {
+ if (mEnabled != enabled) {
+ mEnabled = enabled;
+
+ // Enable/disable editors
+ if (mContent != null) {
+ int count = mContent.getChildCount();
+ for (int i = 0; i < count; i++) {
+ mContent.getChildAt(i).setEnabled(enabled);
+ }
+ }
+
+ // Enable/disable aggregation suggestion vies
+ if (mAggregationSuggestionView != null) {
+ LinearLayout itemList = (LinearLayout) mAggregationSuggestionView.findViewById(
+ R.id.aggregation_suggestions);
+ int count = itemList.getChildCount();
+ for (int i = 0; i < count; i++) {
+ itemList.getChildAt(i).setEnabled(enabled);
+ }
+ }
+
+ // Maybe invalidate the options menu
+ final Activity activity = getActivity();
+ if (activity != null) activity.invalidateOptionsMenu();
+ }
+ }
+
+ /**
+ * Returns a {@link RawContactDelta} for a local contact suitable for addition into
+ * {@link #mState}.
+ */
+ private static RawContactDelta createLocalRawContactDelta() {
+ final RawContact rawContact = new RawContact();
+ rawContact.setAccountToLocal();
+
+ final RawContactDelta result = new RawContactDelta(
+ ValuesDelta.fromAfter(rawContact.getValues()));
+ result.setProfileQueryUri();
+
+ return result;
+ }
+
+ private void copyReadOnlyName() {
+ // We should only ever be doing this if we're creating a new writable contact to attach to
+ // a read only contact.
+ if (!isEditingReadOnlyRawContactWithNewContact()) {
+ return;
+ }
+ final int writableIndex = mState.indexOfFirstWritableRawContact(getContext());
+ final RawContactDelta writable = mState.get(writableIndex);
+ final RawContactDelta readOnly = mState.get(writableIndex == 0 ? 1 : 0);
+ final ValuesDelta writeNameDelta = writable
+ .getSuperPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE);
+ final ValuesDelta readNameDelta = readOnly
+ .getSuperPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE);
+ writeNameDelta.copyStructuredNameFieldsFrom(readNameDelta);
+ mCopyReadOnlyName = false;
+ }
+
+ /**
+ * Bind editors using {@link #mState} and other members initialized from the loaded (or new)
+ * Contact.
+ */
+ protected void bindEditors() {
+ if (!isReadyToBindEditors()) {
+ return;
+ }
+
+ // Add input fields for the loaded Contact
+ final RawContactEditorView editorView = getContent();
+ editorView.setListener(this);
+ if (mCopyReadOnlyName) {
+ copyReadOnlyName();
+ }
+ editorView.setState(mState, getMaterialPalette(), mViewIdGenerator,
+ mHasNewContact, mIsUserProfile, mAccountWithDataSet,
+ mRawContactIdToDisplayAlone, isEditingReadOnlyRawContactWithNewContact());
+
+ // Set up the photo widget
+ editorView.setPhotoListener(this);
+ mPhotoRawContactId = editorView.getPhotoRawContactId();
+ // If there is an updated full resolution photo apply it now, this will be the case if
+ // the user selects or takes a new photo, then rotates the device.
+ final Uri uri = (Uri) mUpdatedPhotos.get(String.valueOf(mPhotoRawContactId));
+ if (uri != null) {
+ editorView.setFullSizePhoto(uri);
+ }
+
+ // The editor is ready now so make it visible
+ editorView.setEnabled(isEnabled());
+ editorView.setVisibility(View.VISIBLE);
+
+ // Refresh the ActionBar as the visibility of the join command
+ // Activity can be null if we have been detached from the Activity.
+ invalidateOptionsMenu();
+ }
+
+ /**
+ * Invalidates the options menu if we are still associated with an Activity.
+ */
+ private void invalidateOptionsMenu() {
+ final Activity activity = getActivity();
+ if (activity != null) {
+ activity.invalidateOptionsMenu();
+ }
+ }
+
+ private boolean isReadyToBindEditors() {
+ if (mState.isEmpty()) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "No data to bind editors");
+ }
+ return false;
+ }
+ if (mIsEdit && !mExistingContactDataReady) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "Existing contact data is not ready to bind editors.");
+ }
+ return false;
+ }
+ if (mHasNewContact && !mNewContactDataReady) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "New contact data is not ready to bind editors.");
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Removes a current editor ({@link #mState}) and rebinds new editor for a new account.
+ * Some of old data are reused with new restriction enforced by the new account.
+ *
+ * @param oldState Old data being edited.
+ * @param oldAccount Old account associated with oldState.
+ * @param newAccount New account to be used.
+ */
+ private void rebindEditorsForNewContact(
+ RawContactDelta oldState, AccountWithDataSet oldAccount,
+ AccountWithDataSet newAccount) {
+ AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
+ AccountType oldAccountType = accountTypes.getAccountTypeForAccount(oldAccount);
+ AccountType newAccountType = accountTypes.getAccountTypeForAccount(newAccount);
+
+ mExistingContactDataReady = false;
+ mNewContactDataReady = false;
+ mState = new RawContactDeltaList();
+ setStateForNewContact(newAccount, newAccountType, oldState, oldAccountType,
+ isEditingUserProfile());
+ if (mIsEdit) {
+ setStateForExistingContact(isEditingUserProfile(), mRawContacts);
+ }
+ }
+
+ //
+ // ContactEditor
+ //
+
+ @Override
+ public void setListener(Listener listener) {
+ mListener = listener;
+ }
+
+ @Override
+ public void load(String action, Uri lookupUri, Bundle intentExtras) {
+ mAction = action;
+ mLookupUri = lookupUri;
+ mIntentExtras = intentExtras;
+
+ if (mIntentExtras != null) {
+ mAutoAddToDefaultGroup =
+ mIntentExtras.containsKey(INTENT_EXTRA_ADD_TO_DEFAULT_DIRECTORY);
+ mNewLocalProfile =
+ mIntentExtras.getBoolean(INTENT_EXTRA_NEW_LOCAL_PROFILE);
+ mDisableDeleteMenuOption =
+ mIntentExtras.getBoolean(INTENT_EXTRA_DISABLE_DELETE_MENU_OPTION);
+ if (mIntentExtras.containsKey(INTENT_EXTRA_MATERIAL_PALETTE_PRIMARY_COLOR)
+ && mIntentExtras.containsKey(INTENT_EXTRA_MATERIAL_PALETTE_SECONDARY_COLOR)) {
+ mMaterialPalette = new MaterialColorMapUtils.MaterialPalette(
+ mIntentExtras.getInt(INTENT_EXTRA_MATERIAL_PALETTE_PRIMARY_COLOR),
+ mIntentExtras.getInt(INTENT_EXTRA_MATERIAL_PALETTE_SECONDARY_COLOR));
+ }
+ }
+ }
+
+ @Override
+ public void setIntentExtras(Bundle extras) {
+ if (extras == null || extras.size() == 0) {
+ return;
+ }
+
+ final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
+ for (RawContactDelta state : mState) {
+ final AccountType type = state.getAccountType(accountTypes);
+ if (type.areContactsWritable()) {
+ // Apply extras to the first writable raw contact only
+ RawContactModifier.parseExtras(mContext, type, state, extras);
+ break;
+ }
+ }
+ }
+
+ @Override
+ public void onJoinCompleted(Uri uri) {
+ onSaveCompleted(false, SaveMode.RELOAD, uri != null, uri, /* joinContactId */ null);
+ }
+
+ @Override
+ public void onSaveCompleted(boolean hadChanges, int saveMode, boolean saveSucceeded,
+ Uri contactLookupUri, Long joinContactId) {
+ if (hadChanges) {
+ if (saveSucceeded) {
+ switch (saveMode) {
+ case SaveMode.JOIN:
+ break;
+ case SaveMode.SPLIT:
+ Toast.makeText(mContext, R.string.contactUnlinkedToast, Toast.LENGTH_SHORT)
+ .show();
+ break;
+ default:
+ final String displayName = getContent().getNameEditorView()
+ .getDisplayName();
+ final String toastMessage;
+ if (!TextUtils.isEmpty(displayName)) {
+ toastMessage = getResources().getString(
+ R.string.contactSavedNamedToast, displayName);
+ } else {
+ toastMessage = getResources().getString(R.string.contactSavedToast);
+ }
+ Toast.makeText(mContext, toastMessage, Toast.LENGTH_SHORT).show();
+ }
+
+ } else {
+ Toast.makeText(mContext, R.string.contactSavedErrorToast, Toast.LENGTH_LONG).show();
+ }
+ }
+ switch (saveMode) {
+ case SaveMode.CLOSE: {
+ Intent resultIntent = null;
+ if (saveSucceeded && contactLookupUri != null) {
+ final Uri lookupUri = ContactEditorUtils.maybeConvertToLegacyLookupUri(
+ mContext, contactLookupUri, mLookupUri);
+ if (Flags.getInstance(mContext).getBoolean(Experiments.CONTACT_SHEET)) {
+ resultIntent = ObjectFactory.getContactSheetIntent(mContext, lookupUri);
+ }
+ if (resultIntent == null) {
+ resultIntent = ImplicitIntentsUtil.composeQuickContactIntent(
+ mContext, lookupUri, ScreenType.EDITOR);
+ resultIntent.putExtra(QuickContactActivity.EXTRA_CONTACT_EDITED, true);
+ }
+ } else {
+ resultIntent = null;
+ }
+ // It is already saved, so prevent it from being saved again
+ mStatus = Status.CLOSING;
+ if (mListener != null) mListener.onSaveFinished(resultIntent);
+ break;
+ }
+ case SaveMode.EDITOR: {
+ // It is already saved, so prevent it from being saved again
+ mStatus = Status.CLOSING;
+ if (mListener != null) mListener.onSaveFinished(/* resultIntent= */ null);
+ break;
+ }
+ case SaveMode.JOIN:
+ if (saveSucceeded && contactLookupUri != null && joinContactId != null) {
+ joinAggregate(joinContactId);
+ }
+ break;
+ case SaveMode.RELOAD:
+ if (saveSucceeded && contactLookupUri != null) {
+ // If this was in INSERT, we are changing into an EDIT now.
+ // If it already was an EDIT, we are changing to the new Uri now
+ mState = new RawContactDeltaList();
+ load(Intent.ACTION_EDIT, contactLookupUri, null);
+ mStatus = Status.LOADING;
+ getLoaderManager().restartLoader(LOADER_CONTACT, null, mContactLoaderListener);
+ }
+ break;
+
+ case SaveMode.SPLIT:
+ mStatus = Status.CLOSING;
+ if (mListener != null) {
+ mListener.onContactSplit(contactLookupUri);
+ } else {
+ Log.d(TAG, "No listener registered, can not call onSplitFinished");
+ }
+ break;
+ }
+ }
+
+ /**
+ * Shows a list of aggregates that can be joined into the currently viewed aggregate.
+ *
+ * @param contactLookupUri the fresh URI for the currently edited contact (after saving it)
+ */
+ private void showJoinAggregateActivity(Uri contactLookupUri) {
+ if (contactLookupUri == null || !isAdded()) {
+ return;
+ }
+
+ mContactIdForJoin = ContentUris.parseId(contactLookupUri);
+ final Intent intent = new Intent(mContext, ContactSelectionActivity.class);
+ intent.setAction(UiIntentActions.PICK_JOIN_CONTACT_ACTION);
+ intent.putExtra(UiIntentActions.TARGET_CONTACT_ID_EXTRA_KEY, mContactIdForJoin);
+ startActivityForResult(intent, REQUEST_CODE_JOIN);
+ }
+
+ //
+ // Aggregation PopupWindow
+ //
+
+ /**
+ * Triggers an asynchronous search for aggregation suggestions.
+ */
+ protected void acquireAggregationSuggestions(Context context,
+ long rawContactId, ValuesDelta valuesDelta) {
+ if (mAggregationSuggestionsRawContactId != rawContactId
+ && mAggregationSuggestionView != null) {
+ mAggregationSuggestionView.setVisibility(View.GONE);
+ mAggregationSuggestionView = null;
+ mAggregationSuggestionEngine.reset();
+ }
+
+ mAggregationSuggestionsRawContactId = rawContactId;
+
+ if (mAggregationSuggestionEngine == null) {
+ mAggregationSuggestionEngine = new AggregationSuggestionEngine(context);
+ mAggregationSuggestionEngine.setListener(this);
+ mAggregationSuggestionEngine.start();
+ }
+
+ mAggregationSuggestionEngine.setContactId(getContactId());
+ mAggregationSuggestionEngine.setAccountFilter(
+ getContent().getCurrentRawContactDelta().getAccountWithDataSet());
+
+ mAggregationSuggestionEngine.onNameChange(valuesDelta);
+ }
+
+ /**
+ * Returns the contact ID for the currently edited contact or 0 if the contact is new.
+ */
+ private long getContactId() {
+ for (RawContactDelta rawContact : mState) {
+ Long contactId = rawContact.getValues().getAsLong(RawContacts.CONTACT_ID);
+ if (contactId != null) {
+ return contactId;
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public void onAggregationSuggestionChange() {
+ final Activity activity = getActivity();
+ if ((activity != null && activity.isFinishing())
+ || !isVisible() || mState.isEmpty() || mStatus != Status.EDITING) {
+ return;
+ }
+
+ UiClosables.closeQuietly(mAggregationSuggestionPopup);
+
+ if (mAggregationSuggestionEngine.getSuggestedContactCount() == 0) {
+ return;
+ }
+
+ final View anchorView = getAggregationAnchorView();
+ if (anchorView == null) {
+ return; // Raw contact deleted?
+ }
+ mAggregationSuggestionPopup = new ListPopupWindow(mContext, null);
+ mAggregationSuggestionPopup.setAnchorView(anchorView);
+ mAggregationSuggestionPopup.setWidth(anchorView.getWidth());
+ mAggregationSuggestionPopup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
+ mAggregationSuggestionPopup.setAdapter(
+ new AggregationSuggestionAdapter(
+ getActivity(),
+ mState.size() == 1 && mState.get(0).isContactInsert(),
+ /* listener =*/ this,
+ mAggregationSuggestionEngine.getSuggestions()));
+ mAggregationSuggestionPopup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ final AggregationSuggestionView suggestionView = (AggregationSuggestionView) view;
+ suggestionView.handleItemClickEvent();
+ UiClosables.closeQuietly(mAggregationSuggestionPopup);
+ mAggregationSuggestionPopup = null;
+ }
+ });
+ mAggregationSuggestionPopup.show();
+ }
+
+ /**
+ * Returns the editor view that should be used as the anchor for aggregation suggestions.
+ */
+ protected View getAggregationAnchorView() {
+ return getContent().getAggregationAnchorView();
+ }
+
+ @Override
+ public void onJoinAction(long contactId, List<Long> rawContactIdList) {
+ final long rawContactIds[] = new long[rawContactIdList.size()];
+ for (int i = 0; i < rawContactIds.length; i++) {
+ rawContactIds[i] = rawContactIdList.get(i);
+ }
+ try {
+ JoinSuggestedContactDialogFragment.show(this, rawContactIds);
+ } catch (Exception ignored) {
+ // No problem - the activity is no longer available to display the dialog
+ }
+ }
+
+ /**
+ * Joins the suggested contact (specified by the id's of constituent raw
+ * contacts), save all changes, and stay in the editor.
+ */
+ public void doJoinSuggestedContact(long[] rawContactIds) {
+ if (!hasValidState() || mStatus != Status.EDITING) {
+ return;
+ }
+
+ mState.setJoinWithRawContacts(rawContactIds);
+ save(SaveMode.RELOAD);
+ }
+
+ @Override
+ public void onEditAction(Uri contactLookupUri) {
+ SuggestionEditConfirmationDialogFragment.show(this, contactLookupUri);
+ }
+
+ /**
+ * Abandons the currently edited contact and switches to editing the suggested
+ * one, transferring all the data there
+ */
+ public void doEditSuggestedContact(Uri contactUri) {
+ if (mListener != null) {
+ // make sure we don't save this contact when closing down
+ mStatus = Status.CLOSING;
+ mListener.onEditOtherContactRequested(
+ contactUri, mState.get(0).getContentValues());
+ }
+ }
+
+ /**
+ * Sets group metadata on all bound editors.
+ */
+ protected void setGroupMetaData() {
+ if (mGroupMetaData != null) {
+ getContent().setGroupMetaData(mGroupMetaData);
+ }
+ }
+
+ /**
+ * Persist the accumulated editor deltas.
+ *
+ * @param joinContactId the raw contact ID to join the contact being saved to after the save,
+ * may be null.
+ */
protected boolean doSaveAction(int saveMode, Long joinContactId) {
final Intent intent = ContactSaveService.createSaveContactIntent(mContext, mState,
SAVE_MODE_EXTRA_KEY, saveMode, isEditingUserProfile(),
- ((Activity) mContext).getClass(), ContactEditorActivity.ACTION_SAVE_COMPLETED,
- mUpdatedPhotos, JOIN_CONTACT_ID_EXTRA_KEY, joinContactId);
+ ((Activity) mContext).getClass(),
+ ContactEditorActivity.ACTION_SAVE_COMPLETED, mUpdatedPhotos,
+ JOIN_CONTACT_ID_EXTRA_KEY, joinContactId);
return startSaveService(mContext, intent, saveMode);
}
- @Override
- public void onSaveInstanceState(Bundle outState) {
- outState.putSerializable(KEY_EXPANDED_EDITORS, mExpandedEditors);
- outState.putLong(KEY_RAW_CONTACT_ID_REQUESTING_PHOTO, mRawContactIdRequestingPhoto);
- outState.putParcelable(KEY_CURRENT_PHOTO_URI, mCurrentPhotoUri);
- outState.putParcelable(KEY_UPDATED_PHOTOS, mUpdatedPhotos);
- outState.putLong(ContactEditorBaseFragment.INTENT_EXTRA_RAW_CONTACT_ID_TO_DISPLAY_ALONE,
- mRawContactIdToDisplayAlone);
- super.onSaveInstanceState(outState);
+ private boolean startSaveService(Context context, Intent intent, int saveMode) {
+ final boolean result = ContactSaveService.startService(
+ context, intent, saveMode);
+ if (!result) {
+ onCancelEditConfirmed();
+ }
+ return result;
}
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (mStatus == Status.SUB_ACTIVITY) {
- mStatus = Status.EDITING;
- }
+ //
+ // Join Activity
+ //
- // See if the photo selection handler handles this result.
- if (mCurrentPhotoHandler != null && mCurrentPhotoHandler.handlePhotoActivityResult(
- requestCode, resultCode, data)) {
- return;
- }
-
- super.onActivityResult(requestCode, resultCode, data);
- }
-
- @Override
+ /**
+ * Performs aggregation with the contact selected by the user from suggestions or A-Z list.
+ */
protected void joinAggregate(final long contactId) {
final Intent intent = ContactSaveService.createJoinContactsIntent(
mContext, mContactIdForJoin, contactId, ContactEditorActivity.class,
@@ -409,196 +1786,87 @@
mContext.startService(intent);
}
- /**
- * Sets the photo stored in mPhoto and writes it to the RawContact with the given id
- */
- private void setPhoto(long rawContact, Bitmap photo, Uri photoUri) {
- 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.setPhotoEntry(photo);
- // Immediately set all other photos as non-primary. Otherwise the UI can display
- // multiple photos as "Primary photo".
- for (int i = 0; i < mContent.getChildCount(); i++) {
- final View childView = mContent.getChildAt(i);
- if (childView instanceof BaseRawContactEditorView
- && childView != requestingEditor) {
- final BaseRawContactEditorView rawContactEditor
- = (BaseRawContactEditorView) childView;
- rawContactEditor.getPhotoEditor().setSuperPrimary(false);
- }
- }
- } else {
- Log.w(TAG, "The contact that requested the photo is no longer present.");
- }
-
- mUpdatedPhotos.putParcelable(String.valueOf(rawContact), photoUri);
+ public void removePhoto() {
+ getContent().removePhoto();
+ mUpdatedPhotos.remove(String.valueOf(mPhotoRawContactId));
}
- /**
- * Finds raw contact editor view for the given rawContactId.
- */
+ public void updatePhoto(Uri uri) throws FileNotFoundException {
+ final Bitmap bitmap = ContactPhotoUtils.getBitmapFromUri(getActivity(), uri);
+ if (bitmap == null || bitmap.getHeight() <= 0 || bitmap.getWidth() <= 0) {
+ Toast.makeText(mContext, R.string.contactPhotoSavedErrorToast,
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ mUpdatedPhotos.putParcelable(String.valueOf(mPhotoRawContactId), uri);
+ getContent().updatePhoto(uri);
+ }
+
+ public void setPrimaryPhoto() {
+ getContent().setPrimaryPhoto();
+ }
+
@Override
- protected View getAggregationAnchorView(long rawContactId) {
- BaseRawContactEditorView editorView = getRawContactEditorView(rawContactId);
- return editorView == null ? null : editorView.findViewById(R.id.anchor_view);
+ public void onNameFieldChanged(long rawContactId, ValuesDelta valuesDelta) {
+ final Activity activity = getActivity();
+ if (activity == null || activity.isFinishing()) {
+ return;
+ }
+ acquireAggregationSuggestions(activity, rawContactId, valuesDelta);
}
- public BaseRawContactEditorView getRawContactEditorView(long rawContactId) {
- for (int i = 0; i < mContent.getChildCount(); i++) {
- final View childView = mContent.getChildAt(i);
- if (childView instanceof BaseRawContactEditorView) {
- final BaseRawContactEditorView editor = (BaseRawContactEditorView) childView;
- if (editor.getRawContactId() == rawContactId) {
- return editor;
- }
- }
- }
- return null;
+ @Override
+ public void onRebindEditorsForNewContact(RawContactDelta oldState,
+ AccountWithDataSet oldAccount, AccountWithDataSet newAccount) {
+ mNewContactAccountChanged = true;
+ mAccountWithDataSet = newAccount;
+ rebindEditorsForNewContact(oldState, oldAccount, newAccount);
}
- /**
- * Returns true if there is currently more than one photo on screen.
- */
- private boolean hasMoreThanOnePhoto() {
- int countWithPicture = 0;
- final int numEntities = mState.size();
- for (int i = 0; i < numEntities; i++) {
- final RawContactDelta entity = mState.get(i);
- if (entity.isVisible()) {
- final ValuesDelta primary = entity.getPrimaryEntry(Photo.CONTENT_ITEM_TYPE);
- if (primary != null && primary.getPhoto() != null) {
- countWithPicture++;
- } else {
- final long rawContactId = entity.getRawContactId();
- final Uri uri = mUpdatedPhotos.getParcelable(String.valueOf(rawContactId));
- if (uri != null) {
- try {
- mContext.getContentResolver().openInputStream(uri);
- countWithPicture++;
- } catch (FileNotFoundException e) {
- }
- }
- }
-
- if (countWithPicture > 1) {
- return true;
- }
- }
+ @Override
+ public void onBindEditorsFailed() {
+ final Activity activity = getActivity();
+ if (activity != null && !activity.isFinishing()) {
+ Toast.makeText(activity, R.string.editor_failed_to_load,
+ Toast.LENGTH_SHORT).show();
+ activity.setResult(Activity.RESULT_CANCELED);
+ activity.finish();
}
- return false;
}
- /**
- * 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 {
-
- final long mRawContactId;
- private final BaseRawContactEditorView mEditor;
- private final PhotoActionListener mPhotoEditorListener;
-
- public PhotoHandler(Context context, BaseRawContactEditorView editor, int photoMode,
- RawContactDeltaList state) {
- super(context, editor.getPhotoEditor().getChangeAnchorView(), photoMode, false, state);
- mEditor = editor;
- mRawContactId = editor.getRawContactId();
- mPhotoEditorListener = new PhotoEditorListener();
+ @Override
+ public void onEditorsBound() {
+ final Activity activity = getActivity();
+ if (activity == null || activity.isFinishing()) {
+ return;
}
+ getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupsLoaderListener);
+ }
- @Override
- public PhotoActionListener getListener() {
- return mPhotoEditorListener;
- }
+ @Override
+ public void onPhotoEditorViewClicked() {
+ // For contacts composed of a single writable raw contact, or raw contacts have no more
+ // than 1 photo, clicking the photo view simply opens the source photo dialog
+ getEditorActivity().changePhoto(getPhotoMode());
+ }
- @Override
- public void startPhotoActivity(Intent intent, int requestCode, Uri photoUri) {
- if (getActivity() == null) {
- return;
- }
- mRawContactIdRequestingPhoto = mEditor.getRawContactId();
- mCurrentPhotoHandler = this;
- mStatus = Status.SUB_ACTIVITY;
- mCurrentPhotoUri = photoUri;
- ContactEditorFragment.this.startActivityForResult(intent, requestCode);
- }
+ @Override
+ public void onRawContactSelected(long rawContactId, boolean isReadOnly) {
+ mRawContactDisplayAloneIsReadOnly = isReadOnly;
+ mRawContactIdToDisplayAlone = rawContactId;
+ bindEditors();
+ }
- private final class PhotoEditorListener extends PhotoSelectionHandler.PhotoActionListener
- implements EditorListener {
+ private int getPhotoMode() {
+ return getContent().isWritablePhotoSet() ? PhotoActionPopup.Modes.WRITE_ABLE_PHOTO
+ : PhotoActionPopup.Modes.NO_PHOTO;
+ }
- @Override
- public void onRequest(int request) {
- if (!hasValidState()) return;
+ private ContactEditorActivity getEditorActivity() {
+ return (ContactEditorActivity) getActivity();
+ }
- if (request == EditorListener.REQUEST_PICK_PHOTO) {
- onClick(mEditor.getPhotoEditor());
- }
- if (request == EditorListener.REQUEST_PICK_PRIMARY_PHOTO) {
- useAsPrimaryChosen();
- }
- }
-
- @Override
- public void onDeleteRequested(Editor removedEditor) {
- // The picture cannot be deleted, it can only be removed, which is handled by
- // onRemovePictureChosen()
- }
-
- /**
- * User has chosen to set the selected photo as the (super) primary photo
- */
- public void useAsPrimaryChosen() {
- // 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);
- }
- }
- bindEditors();
- }
-
- /**
- * User has chosen to remove a picture
- */
- @Override
- public void onRemovePictureChosen() {
- mEditor.setPhotoEntry(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));
- bindEditors();
- }
-
- @Override
- public void onPhotoSelected(Uri uri) throws FileNotFoundException {
- final Bitmap bitmap = ContactPhotoUtils.getBitmapFromUri(mContext, uri);
- setPhoto(mRawContactId, bitmap, uri);
- mCurrentPhotoHandler = null;
- bindEditors();
- }
-
- @Override
- public Uri getCurrentPhotoUri() {
- return mCurrentPhotoUri;
- }
-
- @Override
- public void onPhotoSelectionDismissed() {
- // Nothing to do.
- }
- }
+ private RawContactEditorView getContent() {
+ return (RawContactEditorView) mContent;
}
}
diff --git a/src/com/android/contacts/editor/ContactEditorUtils.java b/src/com/android/contacts/editor/ContactEditorUtils.java
index 3f1a8cb..fc1a887 100644
--- a/src/com/android/contacts/editor/ContactEditorUtils.java
+++ b/src/com/android/contacts/editor/ContactEditorUtils.java
@@ -19,8 +19,11 @@
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
+import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
+import android.net.Uri;
+import android.provider.ContactsContract;
import android.text.TextUtils;
import com.android.contacts.common.model.AccountTypeManager;
@@ -57,6 +60,30 @@
return new ContactEditorUtils(context.getApplicationContext());
}
+ /**
+ * Returns a legacy version of the given contactLookupUri if a legacy Uri was originally
+ * passed to the contact editor.
+ *
+ * @param contactLookupUri The Uri to possibly convert to legacy format.
+ * @param requestLookupUri The lookup Uri originally passed to the contact editor
+ * (via Intent data), may be null.
+ */
+ static Uri maybeConvertToLegacyLookupUri(Context context, Uri contactLookupUri,
+ Uri requestLookupUri) {
+ final String legacyAuthority = "contacts";
+ final String requestAuthority = requestLookupUri == null
+ ? null : requestLookupUri.getAuthority();
+ if (legacyAuthority.equals(requestAuthority)) {
+ // Build a legacy Uri if that is what was requested by caller
+ final long contactId = ContentUris.parseId(ContactsContract.Contacts.lookupContact(
+ context.getContentResolver(), contactLookupUri));
+ final Uri legacyContentUri = Uri.parse("content://contacts/people");
+ return ContentUris.withAppendedId(legacyContentUri, contactId);
+ }
+ // Otherwise pass back a lookup-style Uri
+ return contactLookupUri;
+ }
+
void cleanupForTest() {
mContactsPrefs.clearDefaultAccount();
}
diff --git a/src/com/android/contacts/editor/EditorIntents.java b/src/com/android/contacts/editor/EditorIntents.java
index 14476c8..c4f48e6 100644
--- a/src/com/android/contacts/editor/EditorIntents.java
+++ b/src/com/android/contacts/editor/EditorIntents.java
@@ -23,9 +23,7 @@
import android.provider.ContactsContract.Contacts;
import android.text.TextUtils;
-import com.android.contacts.activities.CompactContactEditorActivity;
import com.android.contacts.activities.ContactEditorActivity;
-import com.android.contacts.activities.ContactEditorBaseActivity;
import com.android.contacts.common.model.RawContactDeltaList;
import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
@@ -40,37 +38,29 @@
}
/**
- * Returns an Intent to start the {@link CompactContactEditorActivity} for an
+ * Returns an Intent to start the {@link ContactEditorActivity} for an
* existing contact.
*/
- public static Intent createCompactEditContactIntent(Context context, Uri contactLookupUri,
+ public static Intent createEditContactIntent(Context context, Uri contactLookupUri,
MaterialPalette materialPalette, long photoId) {
final Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri, context,
- CompactContactEditorActivity.class);
+ ContactEditorActivity.class);
putMaterialPalette(intent, materialPalette);
putPhotoId(intent, photoId);
return intent;
}
/**
- * Returns an Intent to start the {@link CompactContactEditorActivity} for a new contact.
- */
- public static Intent createCompactInsertContactIntent(Context context) {
- return createCompactInsertContactIntent(context, /* rawContactDeltaList =*/ null,
- /* displayName =*/ null, /* phoneticName =*/ null,
- /* isNewLocalProfile =*/ false);
- }
-
- /**
- * Returns an Intent to start the {@link CompactContactEditorActivity} for a new contact with
+ * Returns an Intent to start the {@link ContactEditorActivity} for a new contact with
* the field values specified by rawContactDeltaList pre-populate in the form.
*/
- public static Intent createCompactInsertContactIntent(Context context,
+ public static Intent createInsertContactIntent(Context context,
RawContactDeltaList rawContactDeltaList, String displayName, String phoneticName,
/* Bundle updatedPhotos, */ boolean isNewLocalProfile) {
final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI,
- context, CompactContactEditorActivity.class);
- intent.putExtra(ContactEditorFragment.INTENT_EXTRA_NEW_LOCAL_PROFILE, isNewLocalProfile);
+ context, ContactEditorActivity.class);
+ intent.putExtra(
+ ContactEditorFragment.INTENT_EXTRA_NEW_LOCAL_PROFILE, isNewLocalProfile);
if (rawContactDeltaList != null || displayName != null || phoneticName != null) {
putRawContactDeltaValues(intent, rawContactDeltaList, displayName, phoneticName);
}
@@ -78,8 +68,8 @@
}
/**
- * Returns an Intent to edit a different contact (in the fully expaned editor) with whatever
- * values were already entered on the currently displayed contact editor.
+ * Returns an Intent to edit a different contact in the editor with whatever
+ * values were already entered on the current editor.
*/
public static Intent createEditOtherContactIntent(Context context, Uri contactLookupUri,
ArrayList<ContentValues> contentValues) {
@@ -96,68 +86,20 @@
return intent;
}
- /**
- * Returns an Intent to start the fully expanded {@link ContactEditorActivity} for an
- * existing contact.
- */
- public static Intent createEditContactIntent(Context context, Uri contactLookupUri,
- MaterialPalette materialPalette, long photoId) {
- final Intent intent = new Intent(ContactEditorBaseActivity.ACTION_EDIT, contactLookupUri,
- context, ContactEditorActivity.class);
- addContactIntentFlags(intent);
- putMaterialPalette(intent, materialPalette);
- putPhotoId(intent, photoId);
- return intent;
- }
-
- /**
- * Returns an Intent to start the fully expanded {@link ContactEditorActivity} for a
- * new contact.
- */
- public static Intent createInsertContactIntent(Context context,
- RawContactDeltaList rawContactDeltaList, String displayName, String phoneticName,
- boolean isNewLocalProfile) {
- final Intent intent = new Intent(ContactEditorBaseActivity.ACTION_INSERT,
- Contacts.CONTENT_URI, context, ContactEditorActivity.class);
- intent.putExtra(ContactEditorFragment.INTENT_EXTRA_NEW_LOCAL_PROFILE, isNewLocalProfile);
- addContactIntentFlags(intent);
- putRawContactDeltaValues(intent, rawContactDeltaList, displayName, phoneticName);
- return intent;
- }
-
- /**
- * Returns an Intent to start the full editor for the given raw contact. The full editor will
- * only display this one raw contact.
- */
- public static Intent createEditContactIntentForRawContact(Context context,
- Uri rawContactUri, long rawContactId, boolean isReadOnly) {
- final Intent intent = new Intent(ContactEditorBaseActivity.ACTION_EDIT, rawContactUri,
- context, ContactEditorActivity.class);
- intent.putExtra(ContactEditorFragment.INTENT_EXTRA_RAW_CONTACT_ID_TO_DISPLAY_ALONE,
- rawContactId);
- intent.putExtra(
- ContactEditorBaseFragment.INTENT_EXTRA_RAW_CONTACT_DISPLAY_ALONE_IS_READ_ONLY,
- isReadOnly);
- return intent;
- }
-
- private static void addContactIntentFlags(Intent intent) {
- intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_FORWARD_RESULT);
- }
-
private static void putMaterialPalette(Intent intent, MaterialPalette materialPalette) {
if (materialPalette != null) {
- intent.putExtra(ContactEditorBaseFragment.INTENT_EXTRA_MATERIAL_PALETTE_PRIMARY_COLOR,
+ intent.putExtra(
+ ContactEditorFragment.INTENT_EXTRA_MATERIAL_PALETTE_PRIMARY_COLOR,
materialPalette.mPrimaryColor);
- intent.putExtra(ContactEditorBaseFragment.INTENT_EXTRA_MATERIAL_PALETTE_SECONDARY_COLOR,
+ intent.putExtra(
+ ContactEditorFragment.INTENT_EXTRA_MATERIAL_PALETTE_SECONDARY_COLOR,
materialPalette.mSecondaryColor);
}
}
private static void putPhotoId(Intent intent, long photoId) {
if (photoId >= 0) {
- intent.putExtra(ContactEditorBaseFragment.INTENT_EXTRA_PHOTO_ID, photoId);
+ intent.putExtra(ContactEditorFragment.INTENT_EXTRA_PHOTO_ID, photoId);
}
}
diff --git a/src/com/android/contacts/editor/EditorUiUtils.java b/src/com/android/contacts/editor/EditorUiUtils.java
index 89d830b..83c59df 100644
--- a/src/com/android/contacts/editor/EditorUiUtils.java
+++ b/src/com/android/contacts/editor/EditorUiUtils.java
@@ -270,4 +270,5 @@
bitmap, size, size, /* filter =*/ false);
return ContactPhotoUtils.compressBitmap(bitmapScaled);
}
+
}
diff --git a/src/com/android/contacts/editor/JoinContactConfirmationDialogFragment.java b/src/com/android/contacts/editor/JoinContactConfirmationDialogFragment.java
index 55a066e..d238c38 100644
--- a/src/com/android/contacts/editor/JoinContactConfirmationDialogFragment.java
+++ b/src/com/android/contacts/editor/JoinContactConfirmationDialogFragment.java
@@ -48,7 +48,7 @@
/**
* @param joinContactId The raw contact ID of the contact to join to after confirmation.
*/
- public static void show(ContactEditorBaseFragment fragment, long joinContactId) {
+ public static void show(ContactEditorFragment fragment, long joinContactId) {
final Bundle args = new Bundle();
args.putLong(ARG_JOIN_CONTACT_ID, joinContactId);
diff --git a/src/com/android/contacts/editor/JoinSuggestedContactDialogFragment.java b/src/com/android/contacts/editor/JoinSuggestedContactDialogFragment.java
index 4d35332..8f8b56a 100644
--- a/src/com/android/contacts/editor/JoinSuggestedContactDialogFragment.java
+++ b/src/com/android/contacts/editor/JoinSuggestedContactDialogFragment.java
@@ -28,7 +28,7 @@
private static final String ARG_RAW_CONTACT_IDS = "rawContactIds";
- public static void show(ContactEditorBaseFragment fragment, long[] rawContactIds) {
+ public static void show(ContactEditorFragment fragment, long[] rawContactIds) {
final Bundle args = new Bundle();
args.putLongArray(ARG_RAW_CONTACT_IDS, rawContactIds);
@@ -47,8 +47,8 @@
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
- ContactEditorBaseFragment targetFragment =
- (ContactEditorBaseFragment) getTargetFragment();
+ ContactEditorFragment targetFragment =
+ (ContactEditorFragment) getTargetFragment();
long rawContactIds[] =
getArguments().getLongArray(ARG_RAW_CONTACT_IDS);
targetFragment.doJoinSuggestedContact(rawContactIds);
@@ -58,4 +58,4 @@
.setNegativeButton(android.R.string.no, null)
.create();
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/contacts/editor/KindSectionData.java b/src/com/android/contacts/editor/KindSectionData.java
index 7e2899f..03aa667 100644
--- a/src/com/android/contacts/editor/KindSectionData.java
+++ b/src/com/android/contacts/editor/KindSectionData.java
@@ -16,14 +16,14 @@
package com.android.contacts.editor;
+import android.text.TextUtils;
+
import com.android.contacts.common.model.RawContactDelta;
import com.android.contacts.common.model.ValuesDelta;
import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.common.model.account.AccountType.EditField;
import com.android.contacts.common.model.dataitem.DataKind;
-import android.text.TextUtils;
-
import java.util.ArrayList;
import java.util.List;
@@ -118,4 +118,8 @@
public RawContactDelta getRawContactDelta() {
return mRawContactDelta;
}
+
+ public String getMimeType() {
+ return mDataKind.mimeType;
+ }
}
diff --git a/src/com/android/contacts/editor/KindSectionDataList.java b/src/com/android/contacts/editor/KindSectionDataList.java
deleted file mode 100644
index cb82806..0000000
--- a/src/com/android/contacts/editor/KindSectionDataList.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.contacts.editor;
-
-import com.android.contacts.common.model.RawContactDelta;
-import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.model.dataitem.DataKind;
-import com.android.contacts.common.model.RawContactModifier;
-
-import android.util.Log;
-import android.util.Pair;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Container for multiple {@link KindSectionData} objects. Provides convenience methods for
- * interrogating the collection for a certain KindSectionData item (e.g. the first writable, or
- * "primary", one. Also enforces that only items with the same DataKind/mime-type are added.
- */
-public class KindSectionDataList extends ArrayList<KindSectionData> {
-
- private static final String TAG = CompactRawContactsEditorView.TAG;
-
- /**
- * Returns the mime type for all DataKinds in this List.
- */
- public String getMimeType() {
- if (isEmpty()) return null;
- return get(0).getDataKind().mimeType;
- }
-
- /**
- * Returns the DataKind for all entries in this List.
- */
- public DataKind getDataKind() {
- return isEmpty() ? null : get(0).getDataKind();
- }
-
- /**
- * Returns the primary KindSectionData and ValuesDelta that should be written for this List.
- */
- public Pair<KindSectionData,ValuesDelta> getEntryToWrite(long id,
- AccountWithDataSet primaryAccount, boolean isUserProfile) {
- final String mimeType = getMimeType();
- if (mimeType == null) return null;
-
- if (!isUserProfile) {
- if (id > 0) {
- // Look for a match for the ID that was passed in
- for (KindSectionData kindSectionData : this) {
- if (kindSectionData.getAccountType().areContactsWritable()) {
- final ValuesDelta valuesDelta = kindSectionData.getValuesDeltaById(id);
- if (valuesDelta != null) {
- vlog(mimeType + ": matched kind section data to write by ID");
- return new Pair<>(kindSectionData, valuesDelta);
- }
- }
- }
- }
-
- // Look for a super primary entry
- for (KindSectionData kindSectionData : this) {
- if (kindSectionData.getAccountType().areContactsWritable()) {
- final ValuesDelta valuesDelta = kindSectionData.getSuperPrimaryValuesDelta();
- if (valuesDelta != null) {
- vlog(mimeType + ": matched kind section data to write by super primary");
- return new Pair<>(kindSectionData, valuesDelta);
- }
- }
- }
-
- // Use the first writable contact that matches the primary account
- if (primaryAccount != null) {
- for (KindSectionData kindSectionData : this) {
- if (kindSectionData.getAccountType().areContactsWritable()) {
- if (matchesAccount(primaryAccount, kindSectionData.getRawContactDelta())
- && !kindSectionData.getValuesDeltas().isEmpty()) {
- vlog(mimeType + ": matched kind section data to write by primary " +
- "account");
- return new Pair<>(kindSectionData,
- kindSectionData.getValuesDeltas().get(0));
- }
- }
- }
- }
- }
-
- // Just return the first writable entry.
- for (KindSectionData kindSectionData : this) {
- if (kindSectionData.getAccountType().areContactsWritable()) {
- // Create an entry if necessary
- RawContactModifier.ensureKindExists(kindSectionData.getRawContactDelta(),
- kindSectionData.getAccountType(), mimeType);
-
- if (!kindSectionData.getValuesDeltas().isEmpty()) {
- vlog(mimeType + ": falling back to first kind section data to write");
- return new Pair<>(kindSectionData, kindSectionData.getValuesDeltas().get(0));
- }
- }
- }
-
- wlog(mimeType+ ": no writable kind section data found");
- return null;
- }
-
- /** Whether the given RawContactDelta belong to the given account. */
- private static boolean matchesAccount(AccountWithDataSet accountWithDataSet,
- RawContactDelta rawContactDelta) {
- return Objects.equals(accountWithDataSet.name, rawContactDelta.getAccountName())
- && Objects.equals(accountWithDataSet.type, rawContactDelta.getAccountType())
- && Objects.equals(accountWithDataSet.dataSet, rawContactDelta.getDataSet());
- }
-
- /**
- * Returns the KindSectionData and ValuesDelta that should be displayed to the user.
- */
- public Pair<KindSectionData,ValuesDelta> getEntryToDisplay(long id) {
- final String mimeType = getMimeType();
- if (mimeType == null) return null;
-
- if (id > 0) {
- // Look for a match for the ID that was passed in
- for (KindSectionData kindSectionData : this) {
- final ValuesDelta valuesDelta = kindSectionData.getValuesDeltaById(id);
- if (valuesDelta != null) {
- vlog(mimeType + ": matched kind section data to display by ID");
- return new Pair<>(kindSectionData, valuesDelta);
- }
- }
- }
- // Look for a super primary entry
- for (KindSectionData kindSectionData : this) {
- final ValuesDelta valuesDelta = kindSectionData.getSuperPrimaryValuesDelta();
- if (valuesDelta != null) {
- vlog(mimeType + ": matched kind section data to display by super primary");
- return new Pair<>(kindSectionData, valuesDelta);
- }
- }
-
- // Fall back to the first non-empty value
- for (KindSectionData kindSectionData : this) {
- final ValuesDelta valuesDelta = kindSectionData.getFirstNonEmptyValuesDelta();
- if (valuesDelta != null) {
- vlog(mimeType + ": using first non empty value to display");
- return new Pair<>(kindSectionData, valuesDelta);
- }
- }
-
- for (KindSectionData kindSectionData : this) {
- final List<ValuesDelta> valuesDeltaList = kindSectionData.getValuesDeltas();
- if (!valuesDeltaList.isEmpty()) {
- vlog(mimeType + ": falling back to first empty entry to display");
- final ValuesDelta valuesDelta = valuesDeltaList.get(0);
- return new Pair<>(kindSectionData, valuesDelta);
- }
- }
-
- wlog(mimeType + ": no kind section data found to display");
- return null;
- }
-
- @Override
- public boolean add(KindSectionData kindSectionData) {
- if (kindSectionData == null) throw new NullPointerException();
-
- // Enforce that only entries of the same type are added to this list
- final String listMimeType = getMimeType();
- if (listMimeType != null) {
- final String newEntryMimeType = kindSectionData.getDataKind().mimeType;
- if (!listMimeType.equals(newEntryMimeType)) {
- throw new IllegalArgumentException(
- "Can't add " + newEntryMimeType + " to list with type " + listMimeType);
- }
- }
- return super.add(kindSectionData);
- }
-
- private static void wlog(String message) {
- if (Log.isLoggable(TAG, Log.WARN)) {
- Log.w(TAG, message);
- }
- }
-
- private static void vlog(String message) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, message);
- }
- }
-}
diff --git a/src/com/android/contacts/editor/KindSectionView.java b/src/com/android/contacts/editor/KindSectionView.java
index dddc6aa..4380af9 100644
--- a/src/com/android/contacts/editor/KindSectionView.java
+++ b/src/com/android/contacts/editor/KindSectionView.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 The Android Open Source Project
+ * Copyright (C) 2015 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.
@@ -17,21 +17,25 @@
package com.android.contacts.editor;
import android.content.Context;
-import android.provider.ContactsContract.Data;
-import android.text.TextUtils;
+import android.database.Cursor;
+import android.provider.ContactsContract.CommonDataKinds.Event;
+import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
+import android.provider.ContactsContract.CommonDataKinds.Nickname;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
+import android.widget.TextView;
import com.android.contacts.R;
import com.android.contacts.common.model.RawContactDelta;
import com.android.contacts.common.model.RawContactModifier;
import com.android.contacts.common.model.ValuesDelta;
+import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.common.model.dataitem.DataKind;
-import com.android.contacts.editor.Editor.EditorListener;
import java.util.ArrayList;
import java.util.List;
@@ -41,31 +45,124 @@
* {@link DataKind} around a {@link Data#MIMETYPE}. This view shows a
* section header and a trigger for adding new {@link Data} rows.
*/
-public class KindSectionView extends LinearLayout implements EditorListener {
+public class KindSectionView extends LinearLayout {
- public interface Listener {
+ /**
+ * Marks a name as super primary when it is changed.
+ *
+ * This is for the case when two or more raw contacts with names are joined where neither is
+ * marked as super primary.
+ */
+ private static final class StructuredNameEditorListener implements Editor.EditorListener {
- /**
- * Invoked when any editor that is displayed in this section view is deleted by the user.
- */
- public void onDeleteRequested(Editor editor);
+ private final ValuesDelta mValuesDelta;
+ private final long mRawContactId;
+ private final RawContactEditorView.Listener mListener;
+
+ public StructuredNameEditorListener(ValuesDelta valuesDelta, long rawContactId,
+ RawContactEditorView.Listener listener) {
+ mValuesDelta = valuesDelta;
+ mRawContactId = rawContactId;
+ mListener = listener;
+ }
+
+ @Override
+ public void onRequest(int request) {
+ if (request == Editor.EditorListener.FIELD_CHANGED) {
+ mValuesDelta.setSuperPrimary(true);
+ if (mListener != null) {
+ mListener.onNameFieldChanged(mRawContactId, mValuesDelta);
+ }
+ } else if (request == Editor.EditorListener.FIELD_TURNED_EMPTY) {
+ mValuesDelta.setSuperPrimary(false);
+ }
+ }
+
+ @Override
+ public void onDeleteRequested(Editor editor) {
+ editor.clearAllFields();
+ }
}
+ /**
+ * Clears fields when deletes are requested (on phonetic and nickename fields);
+ * does not change the number of editors.
+ */
+ private static final class OtherNameKindEditorListener implements Editor.EditorListener {
+
+ @Override
+ public void onRequest(int request) {
+ }
+
+ @Override
+ public void onDeleteRequested(Editor editor) {
+ editor.clearAllFields();
+ }
+ }
+
+ /**
+ * Updates empty fields when fields are deleted or turns empty.
+ * Whether a new empty editor is added is controlled by {@link #setShowOneEmptyEditor} and
+ * {@link #setHideWhenEmpty}.
+ */
+ private class NonNameEditorListener implements Editor.EditorListener {
+
+ @Override
+ public void onRequest(int request) {
+ // If a field has become empty or non-empty, then check if another row
+ // can be added dynamically.
+ if (request == FIELD_TURNED_EMPTY || request == FIELD_TURNED_NON_EMPTY) {
+ updateEmptyEditors(/* shouldAnimate = */ true);
+ }
+ }
+
+ @Override
+ public void onDeleteRequested(Editor editor) {
+ if (mShowOneEmptyEditor && mEditors.getChildCount() == 1) {
+ // If there is only 1 editor in the section, then don't allow the user to
+ // delete it. Just clear the fields in the editor.
+ editor.clearAllFields();
+ } else {
+ editor.deleteEditor();
+ }
+ }
+ }
+
+ private class EventEditorListener extends NonNameEditorListener {
+
+ @Override
+ public void onRequest(int request) {
+ super.onRequest(request);
+ }
+
+ @Override
+ public void onDeleteRequested(Editor editor) {
+ if (editor instanceof EventFieldEditorView){
+ final EventFieldEditorView delView = (EventFieldEditorView) editor;
+ if (delView.isBirthdayType() && mEditors.getChildCount() > 1) {
+ final EventFieldEditorView bottomView = (EventFieldEditorView) mEditors
+ .getChildAt(mEditors.getChildCount() - 1);
+ bottomView.restoreBirthday();
+ }
+ }
+ super.onDeleteRequested(editor);
+ }
+ }
+
+ private KindSectionData mKindSectionData;
+ private ViewIdGenerator mViewIdGenerator;
+ private RawContactEditorView.Listener mListener;
+
+ private boolean mIsUserProfile;
+ private boolean mShowOneEmptyEditor = false;
+ private boolean mHideIfEmpty = true;
+
+ private LayoutInflater mLayoutInflater;
private ViewGroup mEditors;
private ImageView mIcon;
- private DataKind mKind;
- private RawContactDelta mState;
- private boolean mReadOnly;
-
- private ViewIdGenerator mViewIdGenerator;
-
- private LayoutInflater mInflater;
-
- private Listener mListener;
-
public KindSectionView(Context context) {
- this(context, null);
+ this(context, /* attrs =*/ null);
}
public KindSectionView(Context context, AttributeSet attrs) {
@@ -81,194 +178,404 @@
mEditors.getChildAt(i).setEnabled(enabled);
}
}
-
- updateEmptyEditors(/* shouldAnimate = */ true);
}
- public boolean isReadOnly() {
- return mReadOnly;
- }
-
- /** {@inheritDoc} */
@Override
protected void onFinishInflate() {
+ super.onFinishInflate();
setDrawingCacheEnabled(true);
setAlwaysDrawnWithCacheEnabled(true);
- mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ mLayoutInflater = (LayoutInflater) getContext().getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
mEditors = (ViewGroup) findViewById(R.id.kind_editors);
mIcon = (ImageView) findViewById(R.id.kind_icon);
}
- @Override
- public void onDeleteRequested(Editor editor) {
- if (getEditorCount() == 1) {
- // If there is only 1 editor in the section, then don't allow the user to delete it.
- // Just clear the fields in the editor.
- editor.clearAllFields();
- } else {
- // If there is a listener, let it decide whether to delete the Editor or the entire
- // KindSectionView so that there is no jank from both animations happening in succession.
- if (mListener != null) {
- editor.markDeleted();
- mListener.onDeleteRequested(editor);
- } else {
- editor.deleteEditor();
+ public void setIsUserProfile(boolean isUserProfile) {
+ mIsUserProfile = isUserProfile;
+ }
+
+ /**
+ * @param showOneEmptyEditor If true, we will always show one empty editor, otherwise an empty
+ * editor will not be shown until the user enters a value. Note, this does not apply
+ * to name editors since those are always displayed.
+ */
+ public void setShowOneEmptyEditor(boolean showOneEmptyEditor) {
+ mShowOneEmptyEditor = showOneEmptyEditor;
+ }
+
+ /**
+ * @param hideWhenEmpty If true, the entire section will be hidden if all inputs are empty,
+ * otherwise one empty input will always be displayed. Note, this does not apply
+ * to name editors since those are always displayed.
+ */
+ public void setHideWhenEmpty(boolean hideWhenEmpty) {
+ mHideIfEmpty = hideWhenEmpty;
+ }
+
+ /** Binds the given group data to every {@link GroupMembershipView}. */
+ public void setGroupMetaData(Cursor cursor) {
+ for (int i = 0; i < mEditors.getChildCount(); i++) {
+ final View view = mEditors.getChildAt(i);
+ if (view instanceof GroupMembershipView) {
+ ((GroupMembershipView) view).setGroupMetaData(cursor);
}
}
}
- @Override
- public void onRequest(int request) {
- // If a field has become empty or non-empty, then check if another row
- // can be added dynamically.
- if (request == FIELD_TURNED_EMPTY || request == FIELD_TURNED_NON_EMPTY) {
- updateEmptyEditors(/* shouldAnimate = */ true);
+ /**
+ * Whether this is a name kind section view and all name fields (structured, phonetic,
+ * and nicknames) are empty.
+ */
+ public boolean isEmptyName() {
+ if (!StructuredName.CONTENT_ITEM_TYPE.equals(mKindSectionData.getMimeType())) {
+ return false;
}
+ for (int i = 0; i < mEditors.getChildCount(); i++) {
+ final View view = mEditors.getChildAt(i);
+ if (view instanceof Editor) {
+ final Editor editor = (Editor) view;
+ if (!editor.isEmpty()) {
+ return false;
+ }
+ }
+ }
+ return true;
}
- public void setListener(Listener listener) {
+ public StructuredNameEditorView getNameEditorView() {
+ if (!StructuredName.CONTENT_ITEM_TYPE.equals(mKindSectionData.getMimeType())
+ || mEditors.getChildCount() == 0) {
+ return null;
+ }
+ return (StructuredNameEditorView) mEditors.getChildAt(0);
+ }
+
+ /**
+ * Binds views for the given {@link KindSectionData}.
+ *
+ * We create a structured name and phonetic name editor for each {@link DataKind} with a
+ * {@link StructuredName#CONTENT_ITEM_TYPE} mime type. The number and order of editors are
+ * rendered as they are given to {@link #setState}.
+ *
+ * Empty name editors are never added and at least one structured name editor is always
+ * displayed, even if it is empty.
+ */
+ public void setState(KindSectionData kindSectionData,
+ ViewIdGenerator viewIdGenerator, RawContactEditorView.Listener listener) {
+ mKindSectionData = kindSectionData;
+ mViewIdGenerator = viewIdGenerator;
mListener = listener;
- }
- public void setState(DataKind kind, RawContactDelta state, boolean readOnly,
- ViewIdGenerator vig) {
- mKind = kind;
- mState = state;
- mReadOnly = readOnly;
- mViewIdGenerator = vig;
-
- setId(mViewIdGenerator.getId(state, kind, null, ViewIdGenerator.NO_VIEW_INDEX));
-
- // TODO: handle resources from remote packages
- final String titleString = (kind.titleRes == -1 || kind.titleRes == 0)
- ? ""
- : getResources().getString(kind.titleRes);
- mIcon.setContentDescription(titleString);
-
- mIcon.setImageDrawable(EditorUiUtils.getMimeTypeDrawable(getContext(), kind.mimeType));
- if (mIcon.getDrawable() == null) {
- mIcon.setContentDescription(null);
+ // Set the icon using the DataKind
+ final DataKind dataKind = mKindSectionData.getDataKind();
+ if (dataKind != null) {
+ mIcon.setImageDrawable(EditorUiUtils.getMimeTypeDrawable(getContext(),
+ dataKind.mimeType));
+ if (mIcon.getDrawable() != null) {
+ mIcon.setContentDescription(dataKind.titleRes == -1 || dataKind.titleRes == 0
+ ? "" : getResources().getString(dataKind.titleRes));
+ }
}
rebuildFromState();
+
updateEmptyEditors(/* shouldAnimate = */ false);
}
- /**
- * Build editors for all current {@link #mState} rows.
- */
private void rebuildFromState() {
- // Remove any existing editors
mEditors.removeAllViews();
- // Check if we are displaying anything here
- boolean hasEntries = mState.hasMimeEntries(mKind.mimeType);
-
- if (hasEntries) {
- for (ValuesDelta entry : mState.getMimeEntries(mKind.mimeType)) {
- // Skip entries that aren't visible
- if (!entry.isVisible()) continue;
-
- createEditorView(entry);
+ final String mimeType = mKindSectionData.getMimeType();
+ if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
+ addNameEditorViews(mKindSectionData.getAccountType(),
+ mKindSectionData.getRawContactDelta());
+ } else if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) {
+ addGroupEditorView(mKindSectionData.getRawContactDelta(),
+ mKindSectionData.getDataKind());
+ } else {
+ final Editor.EditorListener editorListener;
+ if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType)) {
+ editorListener = new OtherNameKindEditorListener();
+ } else if (Event.CONTENT_ITEM_TYPE.equals(mimeType)) {
+ editorListener = new EventEditorListener();
+ } else {
+ editorListener = new NonNameEditorListener();
+ }
+ final List<ValuesDelta> valuesDeltas = mKindSectionData.getVisibleValuesDeltas();
+ for (int i = 0; i < valuesDeltas.size(); i++ ) {
+ addNonNameEditorView(mKindSectionData.getRawContactDelta(),
+ mKindSectionData.getDataKind(), valuesDeltas.get(i), editorListener);
}
}
}
+ private void addNameEditorViews(AccountType accountType, RawContactDelta rawContactDelta) {
+ final boolean readOnly = !accountType.areContactsWritable();
+ final ValuesDelta nameValuesDelta = rawContactDelta
+ .getSuperPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE);
- /**
- * Creates an EditorView for the given entry. This function must be used while constructing
- * the views corresponding to the the object-model. The resulting EditorView is also added
- * to the end of mEditors
- */
- private View createEditorView(ValuesDelta entry) {
- final View view;
- final int layoutResId = EditorUiUtils.getLayoutResourceId(mKind.mimeType);
- try {
- view = mInflater.inflate(layoutResId, mEditors, false);
- } catch (Exception e) {
- throw new RuntimeException(
- "Cannot allocate editor with layout resource ID " +
- layoutResId + " for MIME type " + mKind.mimeType +
- " with error " + e.toString());
+ if (readOnly) {
+ final View nameView = mLayoutInflater.inflate(
+ R.layout.structured_name_readonly_editor_view, mEditors,
+ /* attachToRoot =*/ false);
+
+ // Display name
+ ((TextView) nameView.findViewById(R.id.display_name))
+ .setText(nameValuesDelta.getDisplayName());
+
+ // Account type info
+ final LinearLayout accountTypeLayout = (LinearLayout)
+ nameView.findViewById(R.id.account_type);
+ accountTypeLayout.setVisibility(View.VISIBLE);
+ ((ImageView) accountTypeLayout.findViewById(R.id.account_type_icon))
+ .setImageDrawable(accountType.getDisplayIcon(getContext()));
+ ((TextView) accountTypeLayout.findViewById(R.id.account_type_name))
+ .setText(accountType.getDisplayLabel(getContext()));
+
+ mEditors.addView(nameView);
+ return;
}
+
+ // Structured name
+ final StructuredNameEditorView nameView = (StructuredNameEditorView) mLayoutInflater
+ .inflate(R.layout.structured_name_editor_view, mEditors, /* attachToRoot =*/ false);
+ if (!mIsUserProfile) {
+ // Don't set super primary for the me contact
+ nameView.setEditorListener(new StructuredNameEditorListener(
+ nameValuesDelta, rawContactDelta.getRawContactId(), mListener));
+ }
+ nameView.setDeletable(false);
+ nameView.setValues(
+ accountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE),
+ nameValuesDelta, rawContactDelta, /* readOnly =*/ false, mViewIdGenerator);
+
+ // Correct start margin since there is a second icon in the structured name layout
+ nameView.findViewById(R.id.kind_icon).setVisibility(View.GONE);
+ mEditors.addView(nameView);
+
+ // Phonetic name
+ final DataKind phoneticNameKind = accountType
+ .getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME);
+ // The account type doesn't support phonetic name.
+ if (phoneticNameKind == null) return;
+
+ final PhoneticNameEditorView phoneticNameView = (PhoneticNameEditorView) mLayoutInflater
+ .inflate(R.layout.phonetic_name_editor_view, mEditors, /* attachToRoot =*/ false);
+ phoneticNameView.setEditorListener(new OtherNameKindEditorListener());
+ phoneticNameView.setDeletable(false);
+ phoneticNameView.setValues(
+ accountType.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME),
+ nameValuesDelta, rawContactDelta, /* readOnly =*/ false, mViewIdGenerator);
+
+ // Fix the start margin for phonetic name views
+ final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
+ layoutParams.setMargins(0, 0, 0, 0);
+ phoneticNameView.setLayoutParams(layoutParams);
+ mEditors.addView(phoneticNameView);
+ }
+
+ private void addGroupEditorView(RawContactDelta rawContactDelta, DataKind dataKind) {
+ final GroupMembershipView view = (GroupMembershipView) mLayoutInflater.inflate(
+ R.layout.item_group_membership, mEditors, /* attachToRoot =*/ false);
+ view.setKind(dataKind);
+ view.setEnabled(isEnabled());
+ view.setState(rawContactDelta);
+
+ // Correct start margin since there is a second icon in the group layout
+ view.findViewById(R.id.kind_icon).setVisibility(View.GONE);
+
+ mEditors.addView(view);
+ }
+
+ private View addNonNameEditorView(RawContactDelta rawContactDelta, DataKind dataKind,
+ ValuesDelta valuesDelta, Editor.EditorListener editorListener) {
+ // Inflate the layout
+ final View view = mLayoutInflater.inflate(
+ EditorUiUtils.getLayoutResourceId(dataKind.mimeType), mEditors, false);
view.setEnabled(isEnabled());
if (view instanceof Editor) {
- Editor editor = (Editor) view;
+ final Editor editor = (Editor) view;
editor.setDeletable(true);
- editor.setValues(mKind, entry, mState, mReadOnly, mViewIdGenerator);
- editor.setEditorListener(this);
+ editor.setEditorListener(editorListener);
+ editor.setValues(dataKind, valuesDelta, rawContactDelta, !dataKind.editable,
+ mViewIdGenerator);
}
mEditors.addView(view);
+
return view;
}
/**
* Updates the editors being displayed to the user removing extra empty
* {@link Editor}s, so there is only max 1 empty {@link Editor} view at a time.
+ * If there is only 1 empty editor and {@link #setHideWhenEmpty} was set to true,
+ * then the entire section is hidden.
*/
public void updateEmptyEditors(boolean shouldAnimate) {
+ final boolean isNameKindSection = StructuredName.CONTENT_ITEM_TYPE.equals(
+ mKindSectionData.getMimeType());
+ final boolean isGroupKindSection = GroupMembership.CONTENT_ITEM_TYPE.equals(
+ mKindSectionData.getMimeType());
- final List<View> emptyEditors = getEmptyEditors();
-
- // If there is more than 1 empty editor, then remove it from the list of editors.
- if (emptyEditors.size() > 1) {
- for (final View emptyEditorView : emptyEditors) {
- // If no child {@link View}s are being focused on within this {@link View}, then
- // remove this empty editor. We can assume that at least one empty editor has focus.
- // The only way to get two empty editors is by deleting characters from a non-empty
- // editor, in which case this editor has focus.
- if (emptyEditorView.findFocus() == null) {
- final Editor editor = (Editor) emptyEditorView;
- if (shouldAnimate) {
- editor.deleteEditor();
- } else {
- mEditors.removeView(emptyEditorView);
+ if (isNameKindSection) {
+ // The name kind section is always visible
+ setVisibility(VISIBLE);
+ updateEmptyNameEditors(shouldAnimate);
+ } else if (isGroupKindSection) {
+ // Check whether metadata has been bound for all group views
+ for (int i = 0; i < mEditors.getChildCount(); i++) {
+ final View view = mEditors.getChildAt(i);
+ if (view instanceof GroupMembershipView) {
+ final GroupMembershipView groupView = (GroupMembershipView) view;
+ if (!groupView.wasGroupMetaDataBound() || !groupView.accountHasGroups()) {
+ setVisibility(GONE);
+ return;
}
}
}
- } else if (mKind == null) {
- // There is nothing we can do.
- return;
- } else if (isReadOnly()) {
- // We don't show empty editors for read only data kinds.
- return;
- } else if (!RawContactModifier.canInsert(mState, mKind)) {
- // We have already reached the maximum number of editors. Lets not add any more.
- return;
- } else if (emptyEditors.size() == 1) {
- // We have already reached the maximum number of empty editors. Lets not add any more.
- return;
+ // Check that the user has selected to display all fields
+ if (mHideIfEmpty) {
+ setVisibility(GONE);
+ return;
+ }
+ setVisibility(VISIBLE);
+
+ // We don't check the emptiness of the group views
} else {
- final ValuesDelta values = RawContactModifier.insertChild(mState, mKind);
- final View newField = createEditorView(values);
- if (shouldAnimate) {
- newField.setVisibility(View.GONE);
- EditorAnimator.getInstance().showFieldFooter(newField);
+ // Determine if the entire kind section should be visible
+ final int editorCount = mEditors.getChildCount();
+ final List<View> emptyEditors = getEmptyEditors();
+ if (editorCount == emptyEditors.size() && mHideIfEmpty) {
+ setVisibility(GONE);
+ return;
}
+ setVisibility(VISIBLE);
+
+ updateEmptyNonNameEditors(shouldAnimate);
}
}
- /**
- * Returns a list of empty editor views in this section.
- */
- private List<View> getEmptyEditors() {
- List<View> emptyEditorViews = new ArrayList<View>();
+ private void updateEmptyNameEditors(boolean shouldAnimate) {
+ boolean isEmptyNameEditorVisible = false;
+
for (int i = 0; i < mEditors.getChildCount(); i++) {
- View view = mEditors.getChildAt(i);
- if (((Editor) view).isEmpty()) {
- emptyEditorViews.add(view);
+ final View view = mEditors.getChildAt(i);
+ if (view instanceof Editor) {
+ final Editor editor = (Editor) view;
+ if (view instanceof StructuredNameEditorView) {
+ // We always show one empty structured name view
+ if (editor.isEmpty()) {
+ if (isEmptyNameEditorVisible) {
+ // If we're already showing an empty editor then hide any other empties
+ if (mHideIfEmpty) {
+ view.setVisibility(View.GONE);
+ }
+ } else {
+ isEmptyNameEditorVisible = true;
+ }
+ } else {
+ showView(view, shouldAnimate);
+ isEmptyNameEditorVisible = true;
+ }
+ } else {
+ // Since we can't add phonetic names and nicknames, just show or hide them
+ if (mHideIfEmpty && editor.isEmpty()) {
+ hideView(view);
+ } else {
+ showView(view, /* shouldAnimate =*/ false); // Animation here causes jank
+ }
+ }
+ } else {
+ // For read only names, only show them if we're not hiding empty views
+ if (mHideIfEmpty) {
+ hideView(view);
+ } else {
+ showView(view, shouldAnimate);
+ }
}
}
- return emptyEditorViews;
}
- public int getEditorCount() {
- return mEditors.getChildCount();
+ private void updateEmptyNonNameEditors(boolean shouldAnimate) {
+ // Prune excess empty editors
+ final List<View> emptyEditors = getEmptyEditors();
+ if (emptyEditors.size() > 1) {
+ // If there is more than 1 empty editor, then remove it from the list of editors.
+ int deleted = 0;
+ for (int i = 0; i < emptyEditors.size(); i++) {
+ final View view = emptyEditors.get(i);
+ // If no child {@link View}s are being focused on within this {@link View}, then
+ // remove this empty editor. We can assume that at least one empty editor has
+ // focus. One way to get two empty editors is by deleting characters from a
+ // non-empty editor, in which case this editor has focus. Another way is if
+ // there is more values delta so we must also count number of editors deleted.
+ if (view.findFocus() == null) {
+ deleteView(view, shouldAnimate);
+ deleted++;
+ if (deleted == emptyEditors.size() - 1) break;
+ }
+ }
+ return;
+ }
+ // Determine if we should add a new empty editor
+ final DataKind dataKind = mKindSectionData.getDataKind();
+ final RawContactDelta rawContactDelta = mKindSectionData.getRawContactDelta();
+ if (dataKind == null // There is nothing we can do.
+ // We have already reached the maximum number of editors, don't add any more.
+ || !RawContactModifier.canInsert(rawContactDelta, dataKind)
+ // We have already reached the maximum number of empty editors, don't add any more.
+ || emptyEditors.size() == 1) {
+ return;
+ }
+ // Add a new empty editor
+ if (mShowOneEmptyEditor) {
+ final String mimeType = mKindSectionData.getMimeType();
+ if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType) && mEditors.getChildCount() > 0) {
+ return;
+ }
+ final ValuesDelta values = RawContactModifier.insertChild(rawContactDelta, dataKind);
+ final Editor.EditorListener editorListener = Event.CONTENT_ITEM_TYPE.equals(mimeType)
+ ? new EventEditorListener() : new NonNameEditorListener();
+ final View view = addNonNameEditorView(rawContactDelta, dataKind, values,
+ editorListener);
+ showView(view, shouldAnimate);
+ }
}
- public DataKind getKind() {
- return mKind;
+ private void hideView(View view) {
+ view.setVisibility(View.GONE);
+ }
+
+ private void deleteView(View view, boolean shouldAnimate) {
+ if (shouldAnimate) {
+ final Editor editor = (Editor) view;
+ editor.deleteEditor();
+ } else {
+ mEditors.removeView(view);
+ }
+ }
+
+ private void showView(View view, boolean shouldAnimate) {
+ if (shouldAnimate) {
+ view.setVisibility(View.GONE);
+ EditorAnimator.getInstance().showFieldFooter(view);
+ } else {
+ view.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private List<View> getEmptyEditors() {
+ final List<View> emptyEditors = new ArrayList<>();
+ for (int i = 0; i < mEditors.getChildCount(); i++) {
+ final View view = mEditors.getChildAt(i);
+ if (view instanceof Editor && ((Editor) view).isEmpty()) {
+ emptyEditors.add(view);
+ }
+ }
+ return emptyEditors;
}
}
diff --git a/src/com/android/contacts/editor/LabeledEditorView.java b/src/com/android/contacts/editor/LabeledEditorView.java
index 519abff..8b29b7e 100644
--- a/src/com/android/contacts/editor/LabeledEditorView.java
+++ b/src/com/android/contacts/editor/LabeledEditorView.java
@@ -303,13 +303,13 @@
mEntry.getAsString(mType.customColumn),
getContext().getString(mKind.titleRes)));
} else {
- if (mType != null) {
+ if (mType != null && mType.labelRes > 0 && mKind.titleRes > 0) {
mLabel.setSelection(mEditTypeAdapter.getPosition(mType));
mDeleteContainer.setContentDescription(
getContext().getString(R.string.editor_delete_view_description,
getContext().getString(mType.labelRes),
getContext().getString(mKind.titleRes)));
- } else {
+ } else if (mKind.titleRes > 0) {
mDeleteContainer.setContentDescription(
getContext().getString(R.string.editor_delete_view_description_short,
getContext().getString(mKind.titleRes)));
@@ -380,9 +380,7 @@
}
protected void rebuildValues() {
- if (mKind != null) {
- setValues(mKind, mEntry, mState, mReadOnly, mViewIdGenerator);
- }
+ setValues(mKind, mEntry, mState, mReadOnly, mViewIdGenerator);
}
/**
@@ -411,8 +409,9 @@
final boolean hasTypes = RawContactModifier.hasEditTypes(kind);
setupLabelButton(hasTypes);
mLabel.setEnabled(!readOnly && isEnabled());
- mLabel.setContentDescription(getContext().getResources().getString(mKind.titleRes));
-
+ if (mKind.titleRes > 0) {
+ mLabel.setContentDescription(getContext().getResources().getString(mKind.titleRes));
+ }
mType = RawContactModifier.getCurrentType(entry, kind);
rebuildLabel();
}
diff --git a/src/com/android/contacts/editor/PhotoEditorView.java b/src/com/android/contacts/editor/PhotoEditorView.java
index f69c935..5283009 100644
--- a/src/com/android/contacts/editor/PhotoEditorView.java
+++ b/src/com/android/contacts/editor/PhotoEditorView.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 The Android Open Source Project
+ * Copyright (C) 2015 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.
@@ -16,260 +16,225 @@
package com.android.contacts.editor;
+import android.app.Activity;
import android.content.Context;
+import android.content.res.TypedArray;
import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
import android.net.Uri;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.DisplayPhoto;
+import android.provider.ContactsContract;
import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
import android.view.View;
-import android.widget.Button;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.RadioButton;
+import android.view.ViewGroup;
+import android.widget.RelativeLayout;
import com.android.contacts.R;
-import com.android.contacts.common.ContactPhotoManager.DefaultImageProvider;
-import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
-import com.android.contacts.common.model.RawContactDelta;
import com.android.contacts.common.ContactPhotoManager;
-import com.android.contacts.common.ContactsUtils;
import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.dataitem.DataKind;
-import com.android.contacts.util.ContactPhotoUtils;
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.contacts.util.SchedulingUtils;
+import com.android.contacts.widget.QuickContactImageView;
/**
- * Simple editor for {@link Photo}.
+ * Displays a photo and calls the host back when the user clicks it.
*/
-public class PhotoEditorView extends LinearLayout implements Editor {
+public class PhotoEditorView extends RelativeLayout implements View.OnClickListener {
- private ImageView mPhotoImageView;
- private Button mChangeButton;
- private RadioButton mPrimaryCheckBox;
+ /**
+ * Callbacks for the host of this view.
+ */
+ public interface Listener {
- private ValuesDelta mEntry;
- private EditorListener mListener;
- private ContactPhotoManager mContactPhotoManager;
+ /**
+ * Invoked when the user wants to change their photo.
+ */
+ void onPhotoEditorViewClicked();
+ }
- private boolean mHasSetPhoto = false;
+ private Listener mListener;
+
+ private final float mLandscapePhotoRatio;
+ private final float mPortraitPhotoRatio;
+ private final boolean mIsTwoPanel;
+
+ private final int mActionBarHeight;
+ private final int mStatusBarHeight;
+
+ private QuickContactImageView mPhotoImageView;
+ private View mPhotoIcon;
+ private View mPhotoIconOverlay;
+ private View mPhotoTouchInterceptOverlay;
+ private MaterialPalette mMaterialPalette;
+
+ private boolean mReadOnly;
+ private boolean mIsNonDefaultPhotoBound;
public PhotoEditorView(Context context) {
- super(context);
+ this(context, null);
}
public PhotoEditorView(Context context, AttributeSet attrs) {
super(context, attrs);
+
+ mLandscapePhotoRatio = getTypedFloat(R.dimen.quickcontact_landscape_photo_ratio);
+ mPortraitPhotoRatio = getTypedFloat(R.dimen.editor_portrait_photo_ratio);
+ mIsTwoPanel = getResources().getBoolean(R.bool.contacteditor_two_panel);
+
+ final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
+ new int[] { android.R.attr.actionBarSize });
+ mActionBarHeight = (int) styledAttributes.getDimension(0, 0);
+ styledAttributes.recycle();
+
+ final int resourceId = getResources().getIdentifier(
+ "status_bar_height", "dimen", "android");
+ mStatusBarHeight = resourceId > 0 ? getResources().getDimensionPixelSize(resourceId) : 0;
}
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
+ private float getTypedFloat(int resourceId) {
+ final TypedValue typedValue = new TypedValue();
+ getResources().getValue(resourceId, typedValue, /* resolveRefs =*/ true);
+ return typedValue.getFloat();
}
@Override
- public void editNewlyAddedField() {
- // Never called, since the user never adds a new photo-editor;
- // you can only change the picture in an existing editor.
- }
-
- /** {@inheritDoc} */
- @Override
protected void onFinishInflate() {
super.onFinishInflate();
- mContactPhotoManager = ContactPhotoManager.getInstance(getContext());
- mPhotoImageView = (ImageView) findViewById(R.id.photo);
- mPrimaryCheckBox = (RadioButton) findViewById(R.id.primary_checkbox);
- mChangeButton = (Button) findViewById(R.id.change_button);
- mPrimaryCheckBox = (RadioButton) findViewById(R.id.primary_checkbox);
- if (mChangeButton != null) {
- mChangeButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mListener != null) {
- mListener.onRequest(EditorListener.REQUEST_PICK_PHOTO);
- }
- }
- });
+ mPhotoImageView = (QuickContactImageView) findViewById(R.id.photo);
+ mPhotoIcon = findViewById(R.id.photo_icon);
+ mPhotoIconOverlay = findViewById(R.id.photo_icon_overlay);
+ mPhotoTouchInterceptOverlay = findViewById(R.id.photo_touch_intercept_overlay);
+ }
+
+ public void setListener(Listener listener) {
+ mListener = listener;
+ }
+
+ public void setReadOnly(boolean readOnly) {
+ mReadOnly = readOnly;
+ if (mReadOnly) {
+ mPhotoIcon.setVisibility(View.GONE);
+ mPhotoIconOverlay.setVisibility(View.GONE);
+ mPhotoTouchInterceptOverlay.setClickable(false);
+ } else {
+ mPhotoIcon.setVisibility(View.VISIBLE);
+ mPhotoIconOverlay.setVisibility(View.VISIBLE);
+ mPhotoTouchInterceptOverlay.setOnClickListener(this);
}
- // Turn off own state management. We do this ourselves on rotation.
- mPrimaryCheckBox.setSaveEnabled(false);
- mPrimaryCheckBox.setOnClickListener(new OnClickListener() {
+ }
+
+ public void setPalette(MaterialPalette palette) {
+ mMaterialPalette = palette;
+ }
+
+ /**
+ * Tries to bind a full size photo or a bitmap loaded from the given ValuesDelta,
+ * and falls back to the default avatar, tinted using the given MaterialPalette (if it's not
+ * null);
+ */
+ public void setPhoto(ValuesDelta valuesDelta) {
+ // Check if we can update to the full size photo immediately
+ final Long photoFileId = EditorUiUtils.getPhotoFileId(valuesDelta);
+ if (photoFileId != null) {
+ final Uri photoUri = ContactsContract.DisplayPhoto.CONTENT_URI.buildUpon()
+ .appendPath(photoFileId.toString()).build();
+ setFullSizedPhoto(photoUri);
+ adjustDimensions();
+ return;
+ }
+
+ // Use the bitmap image from the values delta
+ final Bitmap bitmap = EditorUiUtils.getPhotoBitmap(valuesDelta);
+ if (bitmap != null) {
+ setPhoto(bitmap);
+ adjustDimensions();
+ return;
+ }
+
+ setDefaultPhoto(mMaterialPalette);
+ adjustDimensions();
+ }
+
+ private void adjustDimensions() {
+ // Follow the same logic as MultiShrinkScroll.initialize
+ SchedulingUtils.doOnPreDraw(this, /* drawNextFrame =*/ false, new Runnable() {
@Override
- public void onClick(View v) {
- if (mListener != null) {
- mListener.onRequest(EditorListener.REQUEST_PICK_PRIMARY_PHOTO);
+ public void run() {
+ final int photoHeight, photoWidth;
+ if (mIsTwoPanel) {
+ photoHeight = getContentViewHeight();
+ photoWidth = (int) (photoHeight * mLandscapePhotoRatio);
+ } else {
+ // Make the photo slightly shorter that it is wide
+ photoWidth = getContentViewWidth();
+ photoHeight = (int) (photoWidth / mPortraitPhotoRatio);
}
+ final ViewGroup.LayoutParams layoutParams = getLayoutParams();
+ layoutParams.height = photoHeight;
+ layoutParams.width = photoWidth;
+ setLayoutParams(layoutParams);
}
});
}
- /** {@inheritDoc} */
- @Override
- public void onFieldChanged(String column, String value) {
- throw new UnsupportedOperationException("Photos don't support direct field changes");
+ private int getContentViewWidth() {
+ final Activity activity = (Activity) getContext();
+ final DisplayMetrics displayMetrics = new DisplayMetrics();
+ activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
+ return displayMetrics.widthPixels;
}
- /** {@inheritDoc} */
- @Override
- public void setValues(DataKind kind, ValuesDelta values, RawContactDelta state, boolean readOnly,
- ViewIdGenerator vig) {
- mEntry = values;
-
- setId(vig.getId(state, kind, values, 0));
-
- mPrimaryCheckBox.setChecked(values != null && values.isSuperPrimary());
-
- if (values != null) {
- // Try decoding photo if actual entry
- final byte[] photoBytes = values.getAsByteArray(Photo.PHOTO);
- if (photoBytes != null) {
- final Bitmap photo = BitmapFactory.decodeByteArray(photoBytes, 0,
- photoBytes.length);
-
- mPhotoImageView.setImageBitmap(photo);
- mHasSetPhoto = true;
- mEntry.setFromTemplate(false);
-
- if (values.getAfter() == null || values.getAfter().get(Photo.PHOTO) == null) {
- // If the user hasn't updated the PHOTO value, then PHOTO_FILE_ID may contain
- // a reference to a larger version of PHOTO that we can bind to the UI.
- // Otherwise, we need to wait for a call to #setFullSizedPhoto() to update
- // our full sized image.
- final Integer photoFileId = values.getAsInteger(Photo.PHOTO_FILE_ID);
- if (photoFileId != null) {
- final Uri photoUri = DisplayPhoto.CONTENT_URI.buildUpon()
- .appendPath(photoFileId.toString()).build();
- setFullSizedPhoto(photoUri);
- }
- }
-
- } else {
- resetDefault();
- }
- } else {
- resetDefault();
- }
+ // We're calculating the height the hard way because using the height of the content view
+ // (found using android.view.Window.ID_ANDROID_CONTENT) with the soft keyboard up when
+ // going from portrait to landscape mode results in a very small height value.
+ // See b/20526470
+ private int getContentViewHeight() {
+ final Activity activity = (Activity) getContext();
+ final DisplayMetrics displayMetrics = new DisplayMetrics();
+ activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
+ return displayMetrics.heightPixels - mActionBarHeight - mStatusBarHeight;
}
/**
- * Whether to display a "Primary photo" RadioButton. This is only needed if there are multiple
- * candidate photos.
+ * Whether a removable, non-default photo is bound to this view.
*/
- public void setShowPrimary(boolean showPrimaryCheckBox) {
- mPrimaryCheckBox.setVisibility(showPrimaryCheckBox ? View.VISIBLE : View.GONE);
+ public boolean isWritablePhotoSet() {
+ return !mReadOnly && mIsNonDefaultPhotoBound;
}
/**
- * Return true if a valid {@link Photo} has been set.
+ * Binds the given bitmap.
*/
- public boolean hasSetPhoto() {
- return mHasSetPhoto;
+ private void setPhoto(Bitmap bitmap) {
+ mPhotoImageView.setImageBitmap(bitmap);
+ mIsNonDefaultPhotoBound = true;
+ }
+
+ private void setDefaultPhoto(MaterialPalette materialPalette) {
+ mIsNonDefaultPhotoBound = false;
+ EditorUiUtils.setDefaultPhoto(mPhotoImageView, getResources(), materialPalette);
}
/**
- * Assign the given {@link Bitmap} as the new value for the sake of building
- * {@link ValuesDelta}. We may as well bind a thumbnail to the UI while we are at it.
- */
- public void setPhotoEntry(Bitmap photo) {
- if (photo == null) {
- // Clear any existing photo and return
- mEntry.put(Photo.PHOTO, (byte[])null);
- resetDefault();
- return;
- }
-
- final int size = ContactsUtils.getThumbnailSize(getContext());
- final Bitmap scaled = Bitmap.createScaledBitmap(photo, size, size, false);
-
- mPhotoImageView.setImageBitmap(scaled);
- mHasSetPhoto = true;
- mEntry.setFromTemplate(false);
-
- // When the user chooses a new photo mark it as super primary
- mEntry.setSuperPrimary(true);
-
- // Even though high-res photos cannot be saved by passing them via
- // an EntityDeltaList (since they cause the Bundle size limit to be
- // exceeded), we still pass a low-res thumbnail. This simplifies
- // code all over the place, because we don't have to test whether
- // there is a change in EITHER the delta-list OR a changed photo...
- // this way, there is always a change in the delta-list.
- final byte[] compressed = ContactPhotoUtils.compressBitmap(scaled);
- if (compressed != null) {
- mEntry.setPhoto(compressed);
- }
- }
-
- /**
- * Bind the {@param photoUri}'s photo to editor's UI. This doesn't affect {@link ValuesDelta}.
+ * Binds a full size photo loaded from the given Uri.
*/
public void setFullSizedPhoto(Uri photoUri) {
- if (photoUri != null) {
- final DefaultImageProvider fallbackToPreviousImage = new DefaultImageProvider() {
- @Override
- public void applyDefaultImage(ImageView view, int extent, boolean darkTheme,
- DefaultImageRequest defaultImageRequest) {
- // Before we finish setting the full sized image, don't change the current
- // image that is set in any way.
- }
- };
- mContactPhotoManager.loadPhoto(mPhotoImageView, photoUri,
- mPhotoImageView.getWidth(), /* darkTheme = */ false, /* isCircular = */ false,
- /* defaultImageRequest = */ null, fallbackToPreviousImage);
+ EditorUiUtils.loadPhoto(ContactPhotoManager.getInstance(getContext()),
+ mPhotoImageView, photoUri);
+ mIsNonDefaultPhotoBound = true;
+ }
+
+ /**
+ * Removes the current bound photo bitmap.
+ */
+ public void removePhoto() {
+ setDefaultPhoto(mMaterialPalette);
+ }
+
+ @Override
+ public void onClick(View view) {
+ if (mListener != null) {
+ mListener.onPhotoEditorViewClicked();
}
}
-
- /**
- * Set the super primary bit on the photo.
- */
- public void setSuperPrimary(boolean superPrimary) {
- mEntry.put(Photo.IS_SUPER_PRIMARY, superPrimary ? 1 : 0);
- }
-
- protected void resetDefault() {
- // Invalid photo, show default "add photo" place-holder
- mPhotoImageView.setImageDrawable(
- ContactPhotoManager.getDefaultAvatarDrawableForContact(getResources(), false, null));
- mHasSetPhoto = false;
- mEntry.setFromTemplate(true);
- }
-
- /** {@inheritDoc} */
- @Override
- public void setEditorListener(EditorListener listener) {
- mListener = listener;
- }
-
- @Override
- public void setDeletable(boolean deletable) {
- // Photo is not deletable
- }
-
- @Override
- public boolean isEmpty() {
- return !mHasSetPhoto;
- }
-
- @Override
- public void markDeleted() {
- // Photo is not deletable
- }
-
- @Override
- public void deleteEditor() {
- // Photo is not deletable
- }
-
- @Override
- public void clearAllFields() {
- resetDefault();
- }
-
- /**
- * The change drop down menu should be anchored to this view.
- */
- public View getChangeAnchorView() {
- return mChangeButton;
- }
}
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 16d7c9c..bbd23d4 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 The Android Open Source Project
+ * Copyright (C) 2015 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.
@@ -17,72 +17,287 @@
package com.android.contacts.editor;
import android.content.Context;
+import android.content.res.Resources;
import android.database.Cursor;
-import android.os.Bundle;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Parcel;
import android.os.Parcelable;
+import android.provider.ContactsContract.CommonDataKinds.Email;
+import android.provider.ContactsContract.CommonDataKinds.Event;
import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
+import android.provider.ContactsContract.CommonDataKinds.Im;
import android.provider.ContactsContract.CommonDataKinds.Nickname;
+import android.provider.ContactsContract.CommonDataKinds.Note;
+import android.provider.ContactsContract.CommonDataKinds.Organization;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.Photo;
+import android.provider.ContactsContract.CommonDataKinds.Relation;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
+import android.provider.ContactsContract.CommonDataKinds.Website;
+import android.text.TextUtils;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListPopupWindow;
import android.widget.TextView;
+import com.android.contacts.R;
+import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
+import com.android.contacts.common.model.AccountTypeManager;
+import com.android.contacts.common.model.RawContactDelta;
+import com.android.contacts.common.model.RawContactDeltaList;
+import com.android.contacts.common.model.RawContactModifier;
+import com.android.contacts.common.model.ValuesDelta;
import com.android.contacts.common.model.account.AccountDisplayInfo;
import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
-import com.android.contacts.GroupMetaDataLoader;
-import com.android.contacts.R;
import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.AccountType.EditType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.DeviceLocalAccountType;
+import com.android.contacts.common.model.account.SimAccountType;
+import com.android.contacts.common.model.dataitem.CustomDataItem;
import com.android.contacts.common.model.dataitem.DataKind;
-import com.android.contacts.common.model.RawContactDelta;
-import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.RawContactModifier;
+import com.android.contacts.common.util.AccountsListAdapter;
+import com.android.contacts.common.util.MaterialColorMapUtils;
+import com.android.contacts.util.UiClosables;
-import com.google.common.base.Objects;
-
+import java.io.FileNotFoundException;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
/**
- * Custom view that provides all the editor interaction for a specific
- * {@link Contacts} represented through an {@link RawContactDelta}. Callers can
- * reuse this view and quickly rebuild its contents through
- * {@link #setState(RawContactDelta, AccountType, ViewIdGenerator)}.
- * <p>
- * Internal updates are performed against {@link ValuesDelta} so that the
- * source {@link RawContact} can be swapped out. Any state-based changes, such as
- * adding {@link Data} rows or changing {@link EditType}, are performed through
- * {@link RawContactModifier} to ensure that {@link AccountType} are enforced.
+ * View to display information from multiple {@link RawContactDelta}s grouped together.
*/
-public class RawContactEditorView extends BaseRawContactEditorView {
- private static final String KEY_SUPER_INSTANCE_STATE = "superInstanceState";
+public class RawContactEditorView extends LinearLayout implements View.OnClickListener {
- private LayoutInflater mInflater;
+ static final String TAG = "RawContactEditorView";
- private StructuredNameEditorView mName;
- private PhoneticNameEditorView mPhoneticName;
- private TextFieldsEditorView mNickName;
+ /**
+ * Callbacks for hosts of {@link RawContactEditorView}s.
+ */
+ public interface Listener {
- private GroupMembershipView mGroupMembershipView;
+ /**
+ * Invoked when the structured name editor field has changed.
+ *
+ * @param rawContactId The raw contact ID from the underlying {@link RawContactDelta}.
+ * @param valuesDelta The values from the underlying {@link RawContactDelta}.
+ */
+ public void onNameFieldChanged(long rawContactId, ValuesDelta valuesDelta);
- private ViewGroup mFields;
+ /**
+ * Invoked when the editor should rebind editors for a new account.
+ *
+ * @param oldState Old data being edited.
+ * @param oldAccount Old account associated with oldState.
+ * @param newAccount New account to be used.
+ */
+ public void onRebindEditorsForNewContact(RawContactDelta oldState,
+ AccountWithDataSet oldAccount, AccountWithDataSet newAccount);
- private TextView mAccountHeaderTypeTextView;
- private TextView mAccountHeaderNameTextView;
- private ImageView mAccountIconImageView;
+ /**
+ * Invoked when no editors could be bound for the contact.
+ */
+ public void onBindEditorsFailed();
- private long mRawContactId = -1;
- private boolean mAutoAddToDefaultGroup = true;
- private Cursor mGroupMetaData;
- private DataKind mGroupMembershipKind;
- private RawContactDelta mState;
+ /**
+ * Invoked after editors have been bound for the contact.
+ */
+ public void onEditorsBound();
+ /**
+ * Invoked when a rawcontact from linked contacts is selected in editor.
+ */
+ void onRawContactSelected(long rawContactId, boolean isReadOnly);
+ }
+
+ /**
+ * Used to list the account info for the given raw contacts list.
+ */
+ private static final class RawContactAccountListAdapter extends BaseAdapter {
+ private final LayoutInflater mInflater;
+ private final Context mContext;
+ private final RawContactDeltaList mRawContactDeltas;
+
+ public RawContactAccountListAdapter(Context context, RawContactDeltaList rawContactDeltas) {
+ mContext = context;
+ mRawContactDeltas = new RawContactDeltaList();
+ for (RawContactDelta rawContactDelta : rawContactDeltas) {
+ if (rawContactDelta.isVisible() && rawContactDelta.getRawContactId() > 0) {
+ mRawContactDeltas.add(rawContactDelta);
+ }
+ }
+ mInflater = LayoutInflater.from(context);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final View resultView = convertView != null ? convertView
+ : mInflater.inflate(R.layout.account_selector_list_item, parent, false);
+
+ final RawContactDelta rawContactDelta = mRawContactDeltas.get(position);
+
+ final TextView text1 = (TextView) resultView.findViewById(android.R.id.text1);
+ final AccountType accountType = rawContactDelta.getRawContactAccountType(mContext);
+ text1.setText(accountType.getDisplayLabel(mContext));
+
+ final TextView text2 = (TextView) resultView.findViewById(android.R.id.text2);
+ final String accountName = rawContactDelta.getAccountName();
+ if (TextUtils.isEmpty(accountName) || accountType instanceof DeviceLocalAccountType
+ || accountType instanceof SimAccountType) {
+ text2.setVisibility(View.GONE);
+ } else {
+ // Truncate email addresses in the middle so we don't lose the domain
+ text2.setText(accountName);
+ text2.setEllipsize(TextUtils.TruncateAt.MIDDLE);
+ }
+
+ final ImageView icon = (ImageView) resultView.findViewById(android.R.id.icon);
+ icon.setImageDrawable(accountType.getDisplayIcon(mContext));
+
+ return resultView;
+ }
+
+ @Override
+ public int getCount() {
+ return mRawContactDeltas.size();
+ }
+
+ @Override
+ public RawContactDelta getItem(int position) {
+ return mRawContactDeltas.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return getItem(position).getRawContactId();
+ }
+ }
+
+ /**
+ * Sorts kinds roughly the same as quick contacts; we diverge in the following ways:
+ * <ol>
+ * <li>All names are together at the top.</li>
+ * <li>IM is moved up after addresses</li>
+ * <li>SIP addresses are moved to below phone numbers</li>
+ * <li>Group membership is placed at the end</li>
+ * </ol>
+ */
+ private static final class MimeTypeComparator implements Comparator<String> {
+
+ private static final List<String> MIME_TYPE_ORDER = Arrays.asList(new String[] {
+ StructuredName.CONTENT_ITEM_TYPE,
+ Nickname.CONTENT_ITEM_TYPE,
+ Organization.CONTENT_ITEM_TYPE,
+ Phone.CONTENT_ITEM_TYPE,
+ SipAddress.CONTENT_ITEM_TYPE,
+ Email.CONTENT_ITEM_TYPE,
+ StructuredPostal.CONTENT_ITEM_TYPE,
+ Im.CONTENT_ITEM_TYPE,
+ Website.CONTENT_ITEM_TYPE,
+ Event.CONTENT_ITEM_TYPE,
+ Relation.CONTENT_ITEM_TYPE,
+ Note.CONTENT_ITEM_TYPE,
+ GroupMembership.CONTENT_ITEM_TYPE
+ });
+
+ @Override
+ public int compare(String mimeType1, String mimeType2) {
+ if (mimeType1 == mimeType2) return 0;
+ if (mimeType1 == null) return -1;
+ if (mimeType2 == null) return 1;
+
+ int index1 = MIME_TYPE_ORDER.indexOf(mimeType1);
+ int index2 = MIME_TYPE_ORDER.indexOf(mimeType2);
+
+ // Fallback to alphabetical ordering of the mime type if both are not found
+ if (index1 < 0 && index2 < 0) return mimeType1.compareTo(mimeType2);
+ if (index1 < 0) return 1;
+ if (index2 < 0) return -1;
+
+ return index1 < index2 ? -1 : 1;
+ }
+ }
+
+ public static class SavedState extends BaseSavedState {
+
+ public static final Parcelable.Creator<SavedState> CREATOR =
+ new Parcelable.Creator<SavedState>() {
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+
+ private boolean mIsExpanded;
+
+ public SavedState(Parcelable superState) {
+ super(superState);
+ }
+
+ private SavedState(Parcel in) {
+ super(in);
+ mIsExpanded = in.readInt() != 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeInt(mIsExpanded ? 1 : 0);
+ }
+ }
+
+ private RawContactEditorView.Listener mListener;
+
+ private AccountTypeManager mAccountTypeManager;
private AccountDisplayInfoFactory mAccountDisplayInfoFactory;
+ private LayoutInflater mLayoutInflater;
+
+ private ViewIdGenerator mViewIdGenerator;
+ private MaterialColorMapUtils.MaterialPalette mMaterialPalette;
+ private boolean mHasNewContact;
+ private boolean mIsUserProfile;
+ private AccountWithDataSet mPrimaryAccount;
+ private RawContactDeltaList mRawContactDeltas;
+ private RawContactDelta mCurrentRawContactDelta;
+ private long mRawContactIdToDisplayAlone = -1;
+ private boolean mIsEditingReadOnlyRawContactWithNewContact;
+ private Map<String, KindSectionData> mKindSectionDataMap = new HashMap<>();
+ private Set<String> mSortedMimetypes = new TreeSet<>(new MimeTypeComparator());
+
+ // Account header
+ private View mAccountHeaderContainer;
+ private TextView mAccountHeaderType;
+ private TextView mAccountHeaderName;
+ private ImageView mAccountHeaderIcon;
+ private ImageView mAccountHeaderExpanderIcon;
+
+ private PhotoEditorView mPhotoView;
+ private ViewGroup mKindSectionViews;
+ private Map<String, KindSectionView> mKindSectionViewMap = new HashMap<>();
+ private View mMoreFields;
+
+ private boolean mIsExpanded;
+
+ private ValuesDelta mPhotoValuesDelta;
public RawContactEditorView(Context context) {
super(context);
@@ -92,298 +307,733 @@
super(context, attrs);
}
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
-
- View view = getPhotoEditor();
- if (view != null) {
- view.setEnabled(enabled);
- }
-
- if (mName != null) {
- mName.setEnabled(enabled);
- }
-
- if (mPhoneticName != null) {
- mPhoneticName.setEnabled(enabled);
- }
-
- if (mFields != null) {
- int count = mFields.getChildCount();
- for (int i = 0; i < count; i++) {
- mFields.getChildAt(i).setEnabled(enabled);
- }
- }
-
- if (mGroupMembershipView != null) {
- mGroupMembershipView.setEnabled(enabled);
- }
+ /**
+ * Sets the receiver for {@link RawContactEditorView} callbacks.
+ */
+ public void setListener(Listener listener) {
+ mListener = listener;
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ mAccountTypeManager = AccountTypeManager.getInstance(getContext());
+ mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forWritableAccounts(getContext());
+ mLayoutInflater = (LayoutInflater)
+ getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- mName = (StructuredNameEditorView)findViewById(R.id.edit_name);
- mName.setDeletable(false);
+ // Account header
+ mAccountHeaderContainer = findViewById(R.id.account_header_container);
+ mAccountHeaderType = (TextView) findViewById(R.id.account_type);
+ mAccountHeaderName = (TextView) findViewById(R.id.account_name);
+ mAccountHeaderIcon = (ImageView) findViewById(R.id.account_type_icon);
+ mAccountHeaderExpanderIcon = (ImageView) findViewById(R.id.account_expander_icon);
- mPhoneticName = (PhoneticNameEditorView)findViewById(R.id.edit_phonetic_name);
- mPhoneticName.setDeletable(false);
-
- mNickName = (TextFieldsEditorView)findViewById(R.id.edit_nick_name);
-
- mFields = (ViewGroup)findViewById(R.id.sect_fields);
-
- mAccountHeaderTypeTextView = (TextView) findViewById(R.id.account_type);
- mAccountHeaderNameTextView = (TextView) findViewById(R.id.account_name);
- mAccountIconImageView = (ImageView) findViewById(R.id.account_type_icon);
-
- mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forAllAccounts(getContext());
+ mPhotoView = (PhotoEditorView) findViewById(R.id.photo_editor);
+ mKindSectionViews = (LinearLayout) findViewById(R.id.kind_section_views);
+ mMoreFields = findViewById(R.id.more_fields);
+ mMoreFields.setOnClickListener(this);
}
@Override
- protected Parcelable onSaveInstanceState() {
- Bundle bundle = new Bundle();
- // super implementation of onSaveInstanceState returns null
- bundle.putParcelable(KEY_SUPER_INSTANCE_STATE, super.onSaveInstanceState());
- return bundle;
+ public void onClick(View view) {
+ if (view.getId() == R.id.more_fields) {
+ showAllFields();
+ }
}
@Override
- protected void onRestoreInstanceState(Parcelable state) {
- if (state instanceof Bundle) {
- Bundle bundle = (Bundle) state;
- super.onRestoreInstanceState(bundle.getParcelable(KEY_SUPER_INSTANCE_STATE));
+ public void setEnabled(boolean enabled) {
+ super.setEnabled(enabled);
+ final int childCount = mKindSectionViews.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ mKindSectionViews.getChildAt(i).setEnabled(enabled);
+ }
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState() {
+ final Parcelable superState = super.onSaveInstanceState();
+ final SavedState savedState = new SavedState(superState);
+ savedState.mIsExpanded = mIsExpanded;
+ return savedState;
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ if(!(state instanceof SavedState)) {
+ super.onRestoreInstanceState(state);
return;
}
- super.onRestoreInstanceState(state);
+ final SavedState savedState = (SavedState) state;
+ super.onRestoreInstanceState(savedState.getSuperState());
+ mIsExpanded = savedState.mIsExpanded;
+ if (mIsExpanded) {
+ showAllFields();
+ }
}
/**
- * Set the internal state for this view, given a current
- * {@link RawContactDelta} state and the {@link AccountType} that
- * apply to that state.
+ * Pass through to {@link PhotoEditorView#setListener}.
*/
- @Override
- public void setState(RawContactDelta state, AccountType type, ViewIdGenerator vig,
- boolean isProfile) {
+ public void setPhotoListener(PhotoEditorView.Listener listener) {
+ mPhotoView.setListener(listener);
+ }
- mState = state;
+ public void removePhoto() {
+ mPhotoValuesDelta.setFromTemplate(true);
+ mPhotoValuesDelta.put(Photo.PHOTO, (byte[]) null);
+ mPhotoValuesDelta.put(Photo.PHOTO_FILE_ID, (String) null);
- // Remove any existing sections
- mFields.removeAllViews();
+ mPhotoView.removePhoto();
+ }
- // Bail if invalid state or account type
- if (state == null || type == null) return;
+ /**
+ * Pass through to {@link PhotoEditorView#setFullSizedPhoto(Uri)}.
+ */
+ public void setFullSizePhoto(Uri photoUri) {
+ mPhotoView.setFullSizedPhoto(photoUri);
+ }
- setId(vig.getId(state, null, null, ViewIdGenerator.NO_VIEW_INDEX));
+ public void updatePhoto(Uri photoUri) {
+ mPhotoValuesDelta.setFromTemplate(false);
+ // Unset primary for all photos
+ unsetSuperPrimaryFromAllPhotos();
+ // Mark the currently displayed photo as primary
+ mPhotoValuesDelta.setSuperPrimary(true);
- // Make sure we have a StructuredName
- RawContactModifier.ensureKindExists(state, type, StructuredName.CONTENT_ITEM_TYPE);
-
- mRawContactId = state.getRawContactId();
-
- final AccountDisplayInfo account = mAccountDisplayInfoFactory
- .getAccountDisplayInfoFor(state);
-
- final String accountTypeLabel;
- final String accountNameLabel;
- if (isProfile) {
- accountTypeLabel = EditorUiUtils.getAccountHeaderLabelForMyProfile(
- getContext(), account);
- accountNameLabel = account.getNameLabel().toString();
- } else {
- accountTypeLabel = account.getTypeLabel().toString();
- accountNameLabel = account.getNameLabel().toString();
+ // Even though high-res photos cannot be saved by passing them via
+ // an EntityDeltaList (since they cause the Bundle size limit to be
+ // exceeded), we still pass a low-res thumbnail. This simplifies
+ // code all over the place, because we don't have to test whether
+ // there is a change in EITHER the delta-list OR a changed photo...
+ // this way, there is always a change in the delta-list.
+ try {
+ final byte[] bytes = EditorUiUtils.getCompressedThumbnailBitmapBytes(
+ getContext(), photoUri);
+ if (bytes != null) {
+ mPhotoValuesDelta.setPhoto(bytes);
+ }
+ } catch (FileNotFoundException e) {
+ elog("Failed to get bitmap from photo Uri");
}
- if (!account.hasDistinctName()) {
- // Hide this view so the other view will be centered vertically
- mAccountHeaderNameTextView.setVisibility(View.GONE);
- } else {
- mAccountHeaderNameTextView.setVisibility(View.VISIBLE);
- mAccountHeaderNameTextView.setText(accountNameLabel);
- }
- mAccountHeaderTypeTextView.setText(accountTypeLabel);
- updateAccountHeaderContentDescription();
+ mPhotoView.setFullSizedPhoto(photoUri);
+ }
- mAccountIconImageView.setImageDrawable(state.getRawContactAccountType(getContext())
- .getDisplayIcon(getContext()));
-
- // Show photo editor when supported
- RawContactModifier.ensureKindExists(state, type, Photo.CONTENT_ITEM_TYPE);
- setHasPhotoEditor((type.getKindForMimetype(Photo.CONTENT_ITEM_TYPE) != null));
- getPhotoEditor().setEnabled(isEnabled());
- mName.setEnabled(isEnabled());
-
- mPhoneticName.setEnabled(isEnabled());
-
- // Show and hide the appropriate views
- mFields.setVisibility(View.VISIBLE);
- mName.setVisibility(View.VISIBLE);
- mPhoneticName.setVisibility(View.VISIBLE);
-
- mGroupMembershipKind = type.getKindForMimetype(GroupMembership.CONTENT_ITEM_TYPE);
- if (mGroupMembershipKind != null) {
- mGroupMembershipView = (GroupMembershipView)mInflater.inflate(
- R.layout.item_group_membership, mFields, false);
- mGroupMembershipView.setKind(mGroupMembershipKind);
- mGroupMembershipView.setEnabled(isEnabled());
- }
-
- // Create editor sections for each possible data kind
- for (DataKind kind : type.getSortedDataKinds()) {
- // Skip kind of not editable
- if (!kind.editable) continue;
-
- final String mimeType = kind.mimeType;
- if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
- // Handle special case editor for structured name
- final ValuesDelta primary = state.getPrimaryEntry(mimeType);
- mName.setValues(
- type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME),
- primary, state, false, vig);
- final DataKind phoneticNameKind =
- type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME);
- if (phoneticNameKind != null) {
- mPhoneticName.setValues(phoneticNameKind, primary, state, false, vig);
- } else {
- mPhoneticName.setVisibility(View.GONE);
- }
- // It is useful to use Nickname outside of a KindSectionView so that we can treat it
- // as a part of StructuredName's fake KindSectionView, even though it uses a
- // different CP2 mime-type. We do a bit of extra work below to make this possible.
- final DataKind nickNameKind = type.getKindForMimetype(Nickname.CONTENT_ITEM_TYPE);
- if (nickNameKind != null) {
- ValuesDelta primaryNickNameEntry = state.getPrimaryEntry(nickNameKind.mimeType);
- if (primaryNickNameEntry == null) {
- primaryNickNameEntry = RawContactModifier.insertChild(state, nickNameKind);
- }
- mNickName.setValues(nickNameKind, primaryNickNameEntry, state, false, vig);
- mNickName.setDeletable(false);
- } else {
- mPhoneticName.setPadding(0, 0, 0, (int) getResources().getDimension(
- R.dimen.editor_padding_between_editor_views));
- mNickName.setVisibility(View.GONE);
- }
- } else if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
- // Handle special case editor for photos
- final ValuesDelta primary = state.getPrimaryEntry(mimeType);
- getPhotoEditor().setValues(kind, primary, state, false, vig);
- } else if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) {
- if (mGroupMembershipView != null) {
- mGroupMembershipView.setState(state);
- mFields.addView(mGroupMembershipView);
- }
- } else if (DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME.equals(mimeType)
- || DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(mimeType)
- || Nickname.CONTENT_ITEM_TYPE.equals(mimeType)) {
- // Don't create fields for each of these mime-types. They are handled specially.
+ private void unsetSuperPrimaryFromAllPhotos() {
+ for (int i = 0; i < mRawContactDeltas.size(); i++) {
+ final RawContactDelta rawContactDelta = mRawContactDeltas.get(i);
+ if (!rawContactDelta.hasMimeEntries(Photo.CONTENT_ITEM_TYPE)) {
continue;
- } else {
- // Otherwise use generic section-based editors
- if (kind.fieldList == null) continue;
- final KindSectionView section = (KindSectionView)mInflater.inflate(
- R.layout.item_kind_section, mFields, false);
- section.setEnabled(isEnabled());
- section.setState(kind, state, /* readOnly =*/ false, vig);
- mFields.addView(section);
+ }
+ final List<ValuesDelta> photosDeltas =
+ mRawContactDeltas.get(i).getMimeEntries(Photo.CONTENT_ITEM_TYPE);
+ if (photosDeltas == null) {
+ continue;
+ }
+ for (int j = 0; j < photosDeltas.size(); j++) {
+ photosDeltas.get(j).setSuperPrimary(false);
}
}
-
- addToDefaultGroupIfNeeded();
- }
-
- @Override
- public void setGroupMetaData(Cursor groupMetaData) {
- mGroupMetaData = groupMetaData;
- addToDefaultGroupIfNeeded();
- if (mGroupMembershipView != null) {
- mGroupMembershipView.setGroupMetaData(groupMetaData);
- }
- }
-
- public void setAutoAddToDefaultGroup(boolean flag) {
- this.mAutoAddToDefaultGroup = flag;
}
/**
- * If automatic addition to the default group was requested (see
- * {@link #setAutoAddToDefaultGroup}, checks if the raw contact is in any
- * group and if it is not adds it to the default group (in case of Google
- * contacts that's "My Contacts").
+ * Pass through to {@link PhotoEditorView#isWritablePhotoSet}.
*/
- private void addToDefaultGroupIfNeeded() {
- if (!mAutoAddToDefaultGroup || mGroupMetaData == null || mGroupMetaData.isClosed()
- || mState == null) {
+ public boolean isWritablePhotoSet() {
+ return mPhotoView.isWritablePhotoSet();
+ }
+
+ /**
+ * Get the raw contact ID for the current photo.
+ */
+ public long getPhotoRawContactId() {
+ return mCurrentRawContactDelta.getRawContactId();
+ }
+
+ public StructuredNameEditorView getNameEditorView() {
+ final KindSectionView nameKindSectionView = mKindSectionViewMap
+ .get(StructuredName.CONTENT_ITEM_TYPE);
+ return nameKindSectionView == null
+ ? null : nameKindSectionView.getNameEditorView();
+ }
+
+ public RawContactDelta getCurrentRawContactDelta() {
+ return mCurrentRawContactDelta;
+ }
+
+ /**
+ * Marks the raw contact photo given as primary for the aggregate contact.
+ */
+ public void setPrimaryPhoto() {
+
+ // Update values delta
+ final ValuesDelta valuesDelta = mCurrentRawContactDelta
+ .getSuperPrimaryEntry(Photo.CONTENT_ITEM_TYPE);
+ if (valuesDelta == null) {
+ Log.wtf(TAG, "setPrimaryPhoto: had no ValuesDelta for the current RawContactDelta");
+ return;
+ }
+ valuesDelta.setFromTemplate(false);
+ unsetSuperPrimaryFromAllPhotos();
+ valuesDelta.setSuperPrimary(true);
+ }
+
+ public View getAggregationAnchorView() {
+ final StructuredNameEditorView nameEditorView = getNameEditorView();
+ return nameEditorView != null ? nameEditorView.findViewById(R.id.anchor_view) : null;
+ }
+
+ public void setGroupMetaData(Cursor groupMetaData) {
+ final KindSectionView groupKindSectionView =
+ mKindSectionViewMap.get(GroupMembership.CONTENT_ITEM_TYPE);
+ if (groupKindSectionView == null) {
+ return;
+ }
+ groupKindSectionView.setGroupMetaData(groupMetaData);
+ if (mIsExpanded) {
+ groupKindSectionView.setHideWhenEmpty(false);
+ groupKindSectionView.updateEmptyEditors(/* shouldAnimate =*/ true);
+ }
+ }
+
+ public void setState(RawContactDeltaList rawContactDeltas,
+ MaterialColorMapUtils.MaterialPalette materialPalette, ViewIdGenerator viewIdGenerator,
+ boolean hasNewContact, boolean isUserProfile, AccountWithDataSet primaryAccount,
+ long rawContactIdToDisplayAlone, boolean isEditingReadOnlyRawContactWithNewContact) {
+
+ mRawContactDeltas = rawContactDeltas;
+ mRawContactIdToDisplayAlone = rawContactIdToDisplayAlone;
+ mIsEditingReadOnlyRawContactWithNewContact = isEditingReadOnlyRawContactWithNewContact;
+
+ mKindSectionViewMap.clear();
+ mKindSectionViews.removeAllViews();
+ mMoreFields.setVisibility(View.VISIBLE);
+
+ mMaterialPalette = materialPalette;
+ mViewIdGenerator = viewIdGenerator;
+
+ mHasNewContact = hasNewContact;
+ mIsUserProfile = isUserProfile;
+ mPrimaryAccount = primaryAccount;
+ if (mPrimaryAccount == null) {
+ mPrimaryAccount = ContactEditorUtils.create(getContext()).getOnlyOrDefaultAccount();
+ }
+ vlog("state: primary " + mPrimaryAccount);
+
+ // Parse the given raw contact deltas
+ if (rawContactDeltas == null || rawContactDeltas.isEmpty()) {
+ elog("No raw contact deltas");
+ if (mListener != null) mListener.onBindEditorsFailed();
+ return;
+ }
+ pickRawContactDelta();
+ parseRawContactDelta();
+ if (mKindSectionDataMap.isEmpty()) {
+ elog("No kind section data parsed from RawContactDelta(s)");
+ if (mListener != null) mListener.onBindEditorsFailed();
return;
}
- boolean hasGroupMembership = false;
- ArrayList<ValuesDelta> entries = mState.getMimeEntries(GroupMembership.CONTENT_ITEM_TYPE);
- if (entries != null) {
- for (ValuesDelta values : entries) {
- Long id = values.getGroupRowId();
- if (id != null && id.longValue() != 0) {
- hasGroupMembership = true;
- break;
+ final KindSectionData nameSectionData =
+ mKindSectionDataMap.get(StructuredName.CONTENT_ITEM_TYPE);
+ // Ensure that a structured name and photo exists
+ if (nameSectionData != null) {
+ final RawContactDelta rawContactDelta =
+ nameSectionData.getRawContactDelta();
+ RawContactModifier.ensureKindExists(
+ rawContactDelta,
+ rawContactDelta.getAccountType(mAccountTypeManager),
+ StructuredName.CONTENT_ITEM_TYPE);
+ RawContactModifier.ensureKindExists(
+ rawContactDelta,
+ rawContactDelta.getAccountType(mAccountTypeManager),
+ Photo.CONTENT_ITEM_TYPE);
+ }
+
+ // Setup the view
+ addPhotoView();
+ if (isReadOnlyRawContact()) {
+ // We're want to display the inputs fields for a single read only raw contact
+ addReadOnlyRawContactEditorViews();
+ } else {
+ setupEditorNormally();
+ }
+ if (mListener != null) mListener.onEditorsBound();
+ }
+
+ private void setupEditorNormally() {
+ addAccountInfo();
+ addKindSectionViews();
+
+ mMoreFields.setVisibility(hasMoreFields() ? View.VISIBLE : View.GONE);
+
+ if (mIsExpanded) showAllFields();
+ }
+
+ private boolean isReadOnlyRawContact() {
+ return !mCurrentRawContactDelta.getAccountType(mAccountTypeManager).areContactsWritable();
+ }
+
+ private void pickRawContactDelta() {
+ // Build the kind section data list map
+ vlog("parse: " + mRawContactDeltas.size() + " rawContactDelta(s)");
+ for (int j = 0; j < mRawContactDeltas.size(); j++) {
+ final RawContactDelta rawContactDelta = mRawContactDeltas.get(j);
+ vlog("parse: " + j + " rawContactDelta" + rawContactDelta);
+ if (rawContactDelta == null || !rawContactDelta.isVisible()) continue;
+ final AccountType accountType = rawContactDelta.getAccountType(mAccountTypeManager);
+ if (accountType == null) continue;
+
+ if (mRawContactIdToDisplayAlone > 0) {
+ // Look for the raw contact if specified.
+ if (rawContactDelta.getRawContactId().equals(mRawContactIdToDisplayAlone)) {
+ mCurrentRawContactDelta = rawContactDelta;
+ return;
}
+ } else if (mPrimaryAccount != null
+ && mPrimaryAccount.equals(rawContactDelta.getAccountWithDataSet())) {
+ // Otherwise try to find the one that matches the default.
+ mCurrentRawContactDelta = rawContactDelta;
+ return;
+ } else if (accountType.areContactsWritable()){
+ // TODO: Find better raw contact delta
+ // Just select an arbitrary writable contact.
+ mCurrentRawContactDelta = rawContactDelta;
}
}
- if (!hasGroupMembership) {
- long defaultGroupId = getDefaultGroupId();
- if (defaultGroupId != -1) {
- ValuesDelta entry = RawContactModifier.insertChild(mState, mGroupMembershipKind);
- if (entry != null) {
- entry.setGroupRowId(defaultGroupId);
+ }
+
+ private void parseRawContactDelta() {
+ mKindSectionDataMap.clear();
+ mSortedMimetypes.clear();
+
+ final AccountType accountType = mCurrentRawContactDelta.getAccountType(mAccountTypeManager);
+ final List<DataKind> dataKinds = accountType.getSortedDataKinds();
+ final int dataKindSize = dataKinds == null ? 0 : dataKinds.size();
+ vlog("parse: " + dataKindSize + " dataKinds(s)");
+
+ for (int i = 0; i < dataKindSize; i++) {
+ final DataKind dataKind = dataKinds.get(i);
+ if (dataKind == null) {
+ vlog("parse: " + i + " " + dataKind.mimeType + " dropped null data kind");
+ continue;
+ }
+ final String mimeType = dataKind.mimeType;
+
+ // Skip psuedo mime types
+ if (DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME.equals(mimeType)
+ || DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(mimeType)) {
+ vlog("parse: " + i + " " + dataKind.mimeType + " dropped pseudo type");
+ continue;
+ }
+
+ // Skip custom fields
+ // TODO: Handle them when we implement editing custom fields.
+ if (CustomDataItem.MIMETYPE_CUSTOM_FIELD.equals(mimeType)) {
+ vlog("parse: " + i + " " + dataKind.mimeType + " dropped custom field");
+ continue;
+ }
+
+ final KindSectionData kindSectionData =
+ new KindSectionData(accountType, dataKind, mCurrentRawContactDelta);
+ mKindSectionDataMap.put(mimeType, kindSectionData);
+ mSortedMimetypes.add(mimeType);
+
+ vlog("parse: " + i + " " + dataKind.mimeType + " " +
+ kindSectionData.getValuesDeltas().size() + " value(s) " +
+ kindSectionData.getNonEmptyValuesDeltas().size() + " non-empty value(s) " +
+ kindSectionData.getVisibleValuesDeltas().size() +
+ " visible value(s)");
+ }
+ }
+
+ private void addReadOnlyRawContactEditorViews() {
+ mKindSectionViews.removeAllViews();
+ addAccountInfo();
+ final AccountTypeManager accountTypes = AccountTypeManager.getInstance(
+ getContext());
+ final AccountType type = mCurrentRawContactDelta.getAccountType(accountTypes);
+
+ // Bail if invalid state or source
+ if (type == null) return;
+
+ // Make sure we have StructuredName
+ RawContactModifier.ensureKindExists(
+ mCurrentRawContactDelta, type, StructuredName.CONTENT_ITEM_TYPE);
+
+ ValuesDelta primary;
+
+ // Name
+ final Context context = getContext();
+ final Resources res = context.getResources();
+ primary = mCurrentRawContactDelta.getPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE);
+ final String name = primary != null ? primary.getAsString(StructuredName.DISPLAY_NAME) :
+ getContext().getString(R.string.missing_name);
+ final Drawable nameDrawable = context.getDrawable(R.drawable.ic_person_24dp);
+ final String nameContentDescription = res.getString(R.string.header_name_entry);
+ bindData(nameDrawable, nameContentDescription, name, /* type */ null,
+ /* isFirstEntry */ true);
+
+ // Phones
+ final ArrayList<ValuesDelta> phones = mCurrentRawContactDelta
+ .getMimeEntries(Phone.CONTENT_ITEM_TYPE);
+ final Drawable phoneDrawable = context.getDrawable(R.drawable.ic_phone_24dp);
+ final String phoneContentDescription = res.getString(R.string.header_phone_entry);
+ if (phones != null) {
+ boolean isFirstPhoneBound = true;
+ for (ValuesDelta phone : phones) {
+ final String phoneNumber = phone.getPhoneNumber();
+ if (TextUtils.isEmpty(phoneNumber)) {
+ continue;
}
+ final String formattedNumber = PhoneNumberUtilsCompat.formatNumber(
+ phoneNumber, phone.getPhoneNormalizedNumber(),
+ GeoUtil.getCurrentCountryIso(getContext()));
+ CharSequence phoneType = null;
+ if (phone.hasPhoneType()) {
+ phoneType = Phone.getTypeLabel(
+ res, phone.getPhoneType(), phone.getPhoneLabel());
+ }
+ bindData(phoneDrawable, phoneContentDescription, formattedNumber, phoneType,
+ isFirstPhoneBound, true);
+ isFirstPhoneBound = false;
+ }
+ }
+
+ // Emails
+ final ArrayList<ValuesDelta> emails = mCurrentRawContactDelta
+ .getMimeEntries(Email.CONTENT_ITEM_TYPE);
+ final Drawable emailDrawable = context.getDrawable(R.drawable.ic_email_24dp);
+ final String emailContentDescription = res.getString(R.string.header_email_entry);
+ if (emails != null) {
+ boolean isFirstEmailBound = true;
+ for (ValuesDelta email : emails) {
+ final String emailAddress = email.getEmailData();
+ if (TextUtils.isEmpty(emailAddress)) {
+ continue;
+ }
+ CharSequence emailType = null;
+ if (email.hasEmailType()) {
+ emailType = Email.getTypeLabel(
+ res, email.getEmailType(), email.getEmailLabel());
+ }
+ bindData(emailDrawable, emailContentDescription, emailAddress, emailType,
+ isFirstEmailBound);
+ isFirstEmailBound = false;
+ }
+ }
+
+ mKindSectionViews.setVisibility(mKindSectionViews.getChildCount() > 0 ? VISIBLE : GONE);
+ // Hide the "More fields" link
+ mMoreFields.setVisibility(GONE);
+ }
+
+ private void bindData(Drawable icon, String iconContentDescription, CharSequence data,
+ CharSequence type, boolean isFirstEntry) {
+ bindData(icon, iconContentDescription, data, type, isFirstEntry, false);
+ }
+
+ private void bindData(Drawable icon, String iconContentDescription, CharSequence data,
+ CharSequence type, boolean isFirstEntry, boolean forceLTR) {
+ final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ final View field = inflater.inflate(R.layout.item_read_only_field, mKindSectionViews,
+ false);
+ if (isFirstEntry) {
+ final ImageView imageView = (ImageView) field.findViewById(R.id.kind_icon);
+ imageView.setImageDrawable(icon);
+ imageView.setContentDescription(iconContentDescription);
+ } else {
+ final ImageView imageView = (ImageView) field.findViewById(R.id.kind_icon);
+ imageView.setVisibility(View.INVISIBLE);
+ imageView.setContentDescription(null);
+ }
+ final TextView dataView = (TextView) field.findViewById(R.id.data);
+ dataView.setText(data);
+ if (forceLTR) {
+ dataView.setTextDirection(View.TEXT_DIRECTION_LTR);
+ }
+ final TextView typeView = (TextView) field.findViewById(R.id.type);
+ if (!TextUtils.isEmpty(type)) {
+ typeView.setText(type);
+ } else {
+ typeView.setVisibility(View.GONE);
+ }
+ mKindSectionViews.addView(field);
+ }
+
+ private void addAccountInfo() {
+ mAccountHeaderContainer.setVisibility(View.GONE);
+
+ final AccountDisplayInfo account =
+ mAccountDisplayInfoFactory.getAccountDisplayInfoFor(mCurrentRawContactDelta);
+
+ // Get the account information for the primary raw contact delta
+ final String accountLabel = mIsUserProfile
+ ? EditorUiUtils.getAccountHeaderLabelForMyProfile(getContext(), account)
+ : account.getNameLabel().toString();
+
+ // Either the account header or selector should be shown, not both.
+ final List<AccountWithDataSet> accounts =
+ AccountTypeManager.getInstance(getContext()).getAccounts(true);
+
+ if (mHasNewContact && !mIsUserProfile) {
+ if (accounts.size() > 1) {
+ addAccountSelector(mCurrentRawContactDelta, accountLabel);
+ } else {
+ addAccountHeader(accountLabel);
+ }
+ } else {
+ // The raw contact selector should only display linked raw contacts that can be edited
+ // in the full editor (i.e. they are not newly created raw contacts)
+ final RawContactAccountListAdapter adapter = new RawContactAccountListAdapter(
+ getContext(), getRawContactDeltaListForSelector(mRawContactDeltas));
+ if (adapter.getCount() > 0 && !mIsEditingReadOnlyRawContactWithNewContact) {
+ addRawContactAccountSelector(accountLabel, adapter);
+ } else {
+ addAccountHeader(accountLabel);
}
}
}
- /**
- * Returns the default group (e.g. "My Contacts") for the current raw contact's
- * account. Returns -1 if there is no such group.
- */
- private long getDefaultGroupId() {
- String accountType = mState.getAccountType();
- String accountName = mState.getAccountName();
- String accountDataSet = mState.getDataSet();
- mGroupMetaData.moveToPosition(-1);
- while (mGroupMetaData.moveToNext()) {
- String name = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_NAME);
- String type = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_TYPE);
- String dataSet = mGroupMetaData.getString(GroupMetaDataLoader.DATA_SET);
- if (name.equals(accountName) && type.equals(accountType)
- && Objects.equal(dataSet, accountDataSet)) {
- long groupId = mGroupMetaData.getLong(GroupMetaDataLoader.GROUP_ID);
- if (!mGroupMetaData.isNull(GroupMetaDataLoader.AUTO_ADD)
- && mGroupMetaData.getInt(GroupMetaDataLoader.AUTO_ADD) != 0) {
- return groupId;
- }
+ private RawContactDeltaList getRawContactDeltaListForSelector(
+ RawContactDeltaList rawContactDeltas) {
+ // Sort raw contacts so google accounts come first
+ Collections.sort(rawContactDeltas, new RawContactDeltaComparator(getContext()));
+
+ final RawContactDeltaList result = new RawContactDeltaList();
+ for (int i = 0; i < rawContactDeltas.size(); i++) {
+ final RawContactDelta rawContactDelta = rawContactDeltas.get(i);
+ if (rawContactDelta.isVisible() && rawContactDelta.getRawContactId() > 0) {
+ // Only add raw contacts that can be opened in the editor
+ result.add(rawContactDelta);
}
}
- return -1;
+ // Don't return a list of size 1 that would just open the current raw contact being edited.
+ if (result.size() == 1 && result.get(0).getRawContactAccountType(
+ getContext()).areContactsWritable()) {
+ result.clear();
+ return result;
+ }
+ return result;
}
- public StructuredNameEditorView getNameEditor() {
- return mName;
+ private void addAccountHeader(String accountLabel) {
+ mAccountHeaderContainer.setVisibility(View.VISIBLE);
+
+ // Set the account name
+ mAccountHeaderName.setVisibility(View.VISIBLE);
+ mAccountHeaderName.setText(accountLabel);
+
+ // Set the account type
+ final String selectorTitle = getResources().getString(isReadOnlyRawContact() ?
+ R.string.editor_account_selector_read_only_title :
+ R.string.editor_account_selector_title);
+ mAccountHeaderType.setText(selectorTitle);
+
+ // Set the icon
+ final AccountType accountType =
+ mCurrentRawContactDelta.getRawContactAccountType(getContext());
+ mAccountHeaderIcon.setImageDrawable(accountType.getDisplayIcon(getContext()));
+
+ // Set the content description
+ mAccountHeaderContainer.setContentDescription(
+ EditorUiUtils.getAccountInfoContentDescription(accountLabel,
+ selectorTitle));
}
- public TextFieldsEditorView getPhoneticNameEditor() {
- return mPhoneticName;
+ private void addAccountSelector(final RawContactDelta rawContactDelta, CharSequence nameLabel) {
+ final View.OnClickListener onClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ final ListPopupWindow popup = new ListPopupWindow(getContext(), null);
+ final AccountsListAdapter adapter =
+ new AccountsListAdapter(getContext(),
+ AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE,
+ mPrimaryAccount);
+ popup.setWidth(mAccountHeaderContainer.getWidth());
+ popup.setAnchorView(mAccountHeaderContainer);
+ popup.setAdapter(adapter);
+ popup.setModal(true);
+ popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
+ popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position,
+ long id) {
+ UiClosables.closeQuietly(popup);
+ final AccountWithDataSet newAccount = adapter.getItem(position);
+ if (mListener != null && !mPrimaryAccount.equals(newAccount)) {
+ mIsExpanded = false;
+ mListener.onRebindEditorsForNewContact(
+ rawContactDelta,
+ mPrimaryAccount,
+ newAccount);
+ }
+ }
+ });
+ popup.show();
+ }
+ };
+ setUpAccountSelector(nameLabel.toString(), onClickListener);
}
- public TextFieldsEditorView getNickNameEditor() {
- return mNickName;
+ private void addRawContactAccountSelector(String nameLabel,
+ final RawContactAccountListAdapter adapter) {
+ final View.OnClickListener onClickListener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ final ListPopupWindow popup = new ListPopupWindow(getContext(), null);
+ popup.setWidth(mAccountHeaderContainer.getWidth());
+ popup.setAnchorView(mAccountHeaderContainer);
+ popup.setAdapter(adapter);
+ popup.setModal(true);
+ popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
+ popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position,
+ long id) {
+ UiClosables.closeQuietly(popup);
+ final long rawContactId = adapter.getItemId(position);
+ // Only switch if it's actually a different raw contact.
+ if (rawContactId != mCurrentRawContactDelta.getRawContactId()
+ && mListener != null) {
+ final RawContactDelta rawContactDelta = adapter.getItem(position);
+ final AccountTypeManager accountTypes = AccountTypeManager.getInstance(
+ getContext());
+ final AccountType accountType = rawContactDelta.getAccountType(
+ accountTypes);
+ final boolean isReadOnly = !accountType.areContactsWritable();
+ // Reset state.
+ mIsExpanded = false;
+ mListener.onRawContactSelected(rawContactId, isReadOnly);
+ }
+ }
+ });
+ popup.show();
+ }
+ };
+ setUpAccountSelector(nameLabel, onClickListener);
}
- @Override
- public long getRawContactId() {
- return mRawContactId;
+ private void setUpAccountSelector(String nameLabel, OnClickListener listener) {
+ addAccountHeader(nameLabel);
+ // Add handlers for choosing another account to save to.
+ mAccountHeaderExpanderIcon.setVisibility(View.VISIBLE);
+ mAccountHeaderContainer.setOnClickListener(listener);
+ }
+
+ private void addPhotoView() {
+ if (!mCurrentRawContactDelta.hasMimeEntries(Photo.CONTENT_ITEM_TYPE)) {
+ wlog("No photo mimetype for this raw contact.");
+ mPhotoView.setVisibility(GONE);
+ return;
+ } else {
+ mPhotoView.setVisibility(VISIBLE);
+ }
+
+ final ValuesDelta superPrimaryDelta = mCurrentRawContactDelta
+ .getSuperPrimaryEntry(Photo.CONTENT_ITEM_TYPE);
+ if (superPrimaryDelta == null) {
+ Log.wtf(TAG, "addPhotoView: no ValueDelta found for current RawContactDelta"
+ + "that supports a photo.");
+ mPhotoView.setVisibility(GONE);
+ return;
+ }
+ // Set the photo view
+ mPhotoView.setPalette(mMaterialPalette);
+ mPhotoView.setPhoto(superPrimaryDelta);
+
+ if (isReadOnlyRawContact()) {
+ mPhotoView.setReadOnly(true);
+ return;
+ }
+ mPhotoView.setReadOnly(false);
+ mPhotoValuesDelta = superPrimaryDelta;
+ }
+
+ private void addKindSectionViews() {
+ int i = -1;
+
+ for (String mimeType : mSortedMimetypes) {
+ i++;
+ // Ignore mime types that we've already handled
+ if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
+ vlog("kind: " + i + " " + mimeType + " dropped");
+ continue;
+ }
+ final KindSectionView kindSectionView;
+ final KindSectionData kindSectionData = mKindSectionDataMap.get(mimeType);
+ kindSectionView = inflateKindSectionView(mKindSectionViews, kindSectionData, mimeType);
+ mKindSectionViews.addView(kindSectionView);
+
+ // Keep a pointer to the KindSectionView for each mimeType
+ mKindSectionViewMap.put(mimeType, kindSectionView);
+ }
+ }
+
+ private KindSectionView inflateKindSectionView(ViewGroup viewGroup,
+ KindSectionData kindSectionData, String mimeType) {
+ final KindSectionView kindSectionView = (KindSectionView)
+ mLayoutInflater.inflate(R.layout.item_kind_section, viewGroup,
+ /* attachToRoot =*/ false);
+ kindSectionView.setIsUserProfile(mIsUserProfile);
+
+ if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)
+ || Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
+ // Phone numbers and email addresses are always displayed,
+ // even if they are empty
+ kindSectionView.setHideWhenEmpty(false);
+ }
+
+ // Since phone numbers and email addresses displayed even if they are empty,
+ // they will be the only types you add new values to initially for new contacts
+ kindSectionView.setShowOneEmptyEditor(true);
+
+ kindSectionView.setState(kindSectionData, mViewIdGenerator, mListener);
+
+ return kindSectionView;
+ }
+
+ private void showAllFields() {
+ // Stop hiding empty editors and allow the user to enter values for all kinds now
+ for (int i = 0; i < mKindSectionViews.getChildCount(); i++) {
+ final KindSectionView kindSectionView =
+ (KindSectionView) mKindSectionViews.getChildAt(i);
+ kindSectionView.setHideWhenEmpty(false);
+ kindSectionView.updateEmptyEditors(/* shouldAnimate =*/ true);
+ }
+ mIsExpanded = true;
+
+ // Hide the more fields button
+ mMoreFields.setVisibility(View.GONE);
+ }
+
+ private boolean hasMoreFields() {
+ for (KindSectionView section : mKindSectionViewMap.values()) {
+ if (section.getVisibility() != View.VISIBLE) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static void vlog(String message) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, message);
+ }
+ }
+
+ private static void wlog(String message) {
+ if (Log.isLoggable(TAG, Log.WARN)) {
+ Log.w(TAG, message);
+ }
+ }
+
+ private static void elog(String message) {
+ Log.e(TAG, message);
}
}
diff --git a/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java b/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java
deleted file mode 100644
index d55403b..0000000
--- a/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.editor;
-
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.provider.ContactsContract.RawContacts;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.contacts.common.model.account.AccountDisplayInfo;
-import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
-import com.android.contacts.R;
-import com.android.contacts.common.GeoUtil;
-import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
-import com.android.contacts.common.model.RawContactModifier;
-import com.android.contacts.common.model.RawContactDelta;
-import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.model.dataitem.DataKind;
-
-import java.util.ArrayList;
-
-/**
- * Custom view that displays external contacts in the edit screen.
- */
-public class RawContactReadOnlyEditorView extends BaseRawContactEditorView
- implements OnClickListener {
- private LayoutInflater mInflater;
-
- private AccountDisplayInfoFactory mAccountDisplayInfoFactory;
-
- private TextView mName;
- private Button mEditExternallyButton;
- private ViewGroup mGeneral;
-
- private TextView mAccountHeaderTypeTextView;
- private TextView mAccountHeaderNameTextView;
- private ImageView mAccountIconImageView;
-
- private String mAccountName;
- private String mAccountType;
- private String mDataSet;
- private long mRawContactId = -1;
-
- public RawContactReadOnlyEditorView(Context context) {
- super(context);
- }
-
- public RawContactReadOnlyEditorView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
-
- /** {@inheritDoc} */
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mInflater = (LayoutInflater)getContext().getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
-
- mName = (TextView) findViewById(R.id.read_only_name);
- mEditExternallyButton = (Button) findViewById(R.id.button_edit_externally);
- mEditExternallyButton.setOnClickListener(this);
- mGeneral = (ViewGroup)findViewById(R.id.sect_general);
-
- mAccountHeaderTypeTextView = (TextView) findViewById(R.id.account_type);
- mAccountHeaderNameTextView = (TextView) findViewById(R.id.account_name);
- mAccountIconImageView = (ImageView) findViewById(R.id.account_type_icon);
-
- mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forAllAccounts(getContext());
- }
-
- /**
- * Set the internal state for this view, given a current
- * {@link RawContactDelta} state and the {@link AccountType} that
- * apply to that state.
- */
- @Override
- public void setState(RawContactDelta state, AccountType type, ViewIdGenerator vig,
- boolean isProfile) {
- // Remove any existing sections
- mGeneral.removeAllViews();
-
- // Bail if invalid state or source
- if (state == null || type == null) return;
-
- // Make sure we have StructuredName
- RawContactModifier.ensureKindExists(state, type, StructuredName.CONTENT_ITEM_TYPE);
-
- // Fill in the header info
- mAccountName = state.getAccountName();
- mAccountType = state.getAccountType();
- mDataSet = state.getDataSet();
-
-
- final AccountDisplayInfo account = mAccountDisplayInfoFactory
- .getAccountDisplayInfoFor(state);
-
- final String accountTypeLabel;
- final String accountNameLabel;
- if (isProfile) {
- accountTypeLabel = EditorUiUtils.getAccountHeaderLabelForMyProfile(
- getContext(), account);
- accountNameLabel = account.getNameLabel().toString();
- } else {
- accountTypeLabel = account.getTypeLabel().toString();
- accountNameLabel = account.getNameLabel().toString();
- }
-
- if (!account.hasDistinctName()) {
- // Hide this view so the other view will be centered vertically
- mAccountHeaderNameTextView.setVisibility(View.GONE);
- } else {
- mAccountHeaderNameTextView.setVisibility(View.VISIBLE);
- mAccountHeaderNameTextView.setText(accountNameLabel);
- }
- mAccountHeaderTypeTextView.setText(accountTypeLabel);
- updateAccountHeaderContentDescription();
-
- mAccountIconImageView.setImageDrawable(state.getRawContactAccountType(getContext())
- .getDisplayIcon(getContext()));
-
- // TODO: Expose data set in the UI somehow?
-
- mRawContactId = state.getRawContactId();
-
- ValuesDelta primary;
-
- // Photo
- DataKind kind = type.getKindForMimetype(Photo.CONTENT_ITEM_TYPE);
- if (kind != null) {
- RawContactModifier.ensureKindExists(state, type, Photo.CONTENT_ITEM_TYPE);
- boolean hasPhotoEditor = type.getKindForMimetype(Photo.CONTENT_ITEM_TYPE) != null;
- setHasPhotoEditor(hasPhotoEditor);
- primary = state.getPrimaryEntry(Photo.CONTENT_ITEM_TYPE);
- getPhotoEditor().setValues(kind, primary, state, !type.areContactsWritable(), vig);
- }
-
- // Name
- primary = state.getPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE);
- mName.setText(primary != null ? primary.getAsString(StructuredName.DISPLAY_NAME) :
- getContext().getString(R.string.missing_name));
-
- if (type.getEditContactActivityClassName() != null) {
- mEditExternallyButton.setVisibility(View.VISIBLE);
- } else {
- mEditExternallyButton.setVisibility(View.GONE);
- }
-
- final Resources res = getContext().getResources();
- // Phones
- final ArrayList<ValuesDelta> phones = state.getMimeEntries(Phone.CONTENT_ITEM_TYPE);
- final Drawable phoneDrawable = getResources().getDrawable(R.drawable.ic_phone_24dp);
- final String phoneContentDescription = res.getString(R.string.header_phone_entry);
- if (phones != null) {
- boolean isFirstPhoneBound = true;
- for (ValuesDelta phone : phones) {
- final String phoneNumber = phone.getPhoneNumber();
- if (TextUtils.isEmpty(phoneNumber)) {
- continue;
- }
- final String formattedNumber = PhoneNumberUtilsCompat.formatNumber(
- phoneNumber, phone.getPhoneNormalizedNumber(),
- GeoUtil.getCurrentCountryIso(getContext()));
- CharSequence phoneType = null;
- if (phone.hasPhoneType()) {
- phoneType = Phone.getTypeLabel(
- res, phone.getPhoneType(), phone.getPhoneLabel());
- }
- bindData(phoneDrawable, phoneContentDescription, formattedNumber, phoneType,
- isFirstPhoneBound, true);
- isFirstPhoneBound = false;
- }
- }
-
- // Emails
- final ArrayList<ValuesDelta> emails = state.getMimeEntries(Email.CONTENT_ITEM_TYPE);
- final Drawable emailDrawable = getResources().getDrawable(R.drawable.ic_email_24dp);
- final String emailContentDescription = res.getString(R.string.header_email_entry);
- if (emails != null) {
- boolean isFirstEmailBound = true;
- for (ValuesDelta email : emails) {
- final String emailAddress = email.getEmailData();
- if (TextUtils.isEmpty(emailAddress)) {
- continue;
- }
- CharSequence emailType = null;
- if (email.hasEmailType()) {
- emailType = Email.getTypeLabel(
- res, email.getEmailType(), email.getEmailLabel());
- }
- bindData(emailDrawable, emailContentDescription, emailAddress, emailType,
- isFirstEmailBound);
- isFirstEmailBound = false;
- }
- }
-
- // Hide mGeneral if it's empty
- if (mGeneral.getChildCount() > 0) {
- mGeneral.setVisibility(View.VISIBLE);
- } else {
- mGeneral.setVisibility(View.GONE);
- }
- }
-
- private void bindData(Drawable icon, String iconContentDescription, CharSequence data,
- CharSequence type, boolean isFirstEntry) {
- bindData(icon, iconContentDescription, data, type, isFirstEntry, false);
- }
-
- private void bindData(Drawable icon, String iconContentDescription, CharSequence data,
- CharSequence type, boolean isFirstEntry, boolean forceLTR) {
- final View field = mInflater.inflate(R.layout.item_read_only_field, mGeneral, false);
- if (isFirstEntry) {
- final ImageView imageView = (ImageView) field.findViewById(R.id.kind_icon);
- imageView.setImageDrawable(icon);
- imageView.setContentDescription(iconContentDescription);
- } else {
- final ImageView imageView = (ImageView) field.findViewById(R.id.kind_icon);
- imageView.setVisibility(View.INVISIBLE);
- imageView.setContentDescription(null);
- }
- final TextView dataView = (TextView) field.findViewById(R.id.data);
- dataView.setText(data);
- if (forceLTR) {
- dataView.setTextDirection(View.TEXT_DIRECTION_LTR);
- }
- final TextView typeView = (TextView) field.findViewById(R.id.type);
- if (!TextUtils.isEmpty(type)) {
- typeView.setText(type);
- } else {
- typeView.setVisibility(View.GONE);
- }
-
- mGeneral.addView(field);
- }
-
- @Override
- public long getRawContactId() {
- return mRawContactId;
- }
-
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.button_edit_externally) {
- if (mListener != null) {
- mListener.onExternalEditorRequest(
- new AccountWithDataSet(mAccountName, mAccountType, mDataSet),
- ContentUris.withAppendedId(RawContacts.CONTENT_URI, mRawContactId));
- }
- }
- }
-}
diff --git a/src/com/android/contacts/common/editor/SelectAccountDialogFragment.java b/src/com/android/contacts/editor/SelectAccountDialogFragment.java
similarity index 97%
rename from src/com/android/contacts/common/editor/SelectAccountDialogFragment.java
rename to src/com/android/contacts/editor/SelectAccountDialogFragment.java
index 96da89a..34fac4f 100644
--- a/src/com/android/contacts/common/editor/SelectAccountDialogFragment.java
+++ b/src/com/android/contacts/editor/SelectAccountDialogFragment.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.contacts.common.editor;
+package com.android.contacts.editor;
import android.app.Activity;
import android.app.AlertDialog;
@@ -44,9 +44,6 @@
private static final String KEY_LIST_FILTER = "list_filter";
private static final String KEY_EXTRA_ARGS = "extra_args";
- public SelectAccountDialogFragment() { // All fragments must have a public default constructor.
- }
-
/**
* Show the dialog.
*
diff --git a/src/com/android/contacts/editor/SplitContactConfirmationDialogFragment.java b/src/com/android/contacts/editor/SplitContactConfirmationDialogFragment.java
index f3d0ef4..0c04466 100644
--- a/src/com/android/contacts/editor/SplitContactConfirmationDialogFragment.java
+++ b/src/com/android/contacts/editor/SplitContactConfirmationDialogFragment.java
@@ -49,7 +49,7 @@
void onSplitContactConfirmed(boolean hasPendingChanges);
}
- public static void show(ContactEditorBaseFragment fragment, boolean hasPendingChanges) {
+ public static void show(ContactEditorFragment fragment, boolean hasPendingChanges) {
final Bundle args = new Bundle();
args.putBoolean(ARG_HAS_PENDING_CHANGES, hasPendingChanges);
@@ -65,7 +65,8 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mHasPendingChanges = getArguments().getBoolean(ARG_HAS_PENDING_CHANGES);
+ mHasPendingChanges = getArguments() == null
+ ? false : getArguments().getBoolean(ARG_HAS_PENDING_CHANGES);
}
@Override
@@ -80,7 +81,9 @@
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- final Listener targetListener = (Listener) getTargetFragment();
+ final Listener targetListener = getTargetFragment() == null
+ ? (Listener) getActivity()
+ : (Listener) getTargetFragment();
targetListener.onSplitContactConfirmed(mHasPendingChanges);
}
});
diff --git a/src/com/android/contacts/editor/StructuredNameEditorView.java b/src/com/android/contacts/editor/StructuredNameEditorView.java
index 2fcc19d..5aca809 100644
--- a/src/com/android/contacts/editor/StructuredNameEditorView.java
+++ b/src/com/android/contacts/editor/StructuredNameEditorView.java
@@ -21,35 +21,18 @@
import android.content.res.Resources;
import android.os.Parcel;
import android.os.Parcelable;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.text.TextUtils;
import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
import com.android.contacts.R;
import com.android.contacts.common.model.RawContactDelta;
import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.common.model.dataitem.DataItem;
import com.android.contacts.common.model.dataitem.DataKind;
import com.android.contacts.common.model.dataitem.StructuredNameDataItem;
import com.android.contacts.common.util.NameConverter;
-import java.util.HashMap;
-import java.util.Map;
-
/**
- * A dedicated editor for structured name. When the user collapses/expands
- * the structured name, it will reparse or recompose the name, but only
- * if the user has made changes. This distinction will be particularly
- * obvious if the name has a non-standard structure. Consider this structure:
- * first name="John Doe", family name="". As long as the user does not change
- * the full name, expand and collapse will preserve this. However, if the user
- * changes "John Doe" to "Jane Doe" and then expands the view, we will reparse
- * and show first name="Jane", family name="Doe".
+ * A dedicated editor for structured name.
*/
public class StructuredNameEditorView extends TextFieldsEditorView {
@@ -92,18 +75,6 @@
updateEmptiness();
}
- /**
- * Displays the icon and name for the given account under the name name input fields.
- */
- public void setAccountType(AccountType accountType) {
- final LinearLayout layout = (LinearLayout) findViewById(R.id.account_type);
- layout.setVisibility(View.VISIBLE);
- final ImageView imageView = (ImageView) layout.findViewById(R.id.account_type_icon);
- imageView.setImageDrawable(accountType.getDisplayIcon(getContext()));
- final TextView textView = (TextView) layout.findViewById(R.id.account_type_name);
- textView.setText(accountType.getDisplayLabel(getContext()));
- }
-
@Override
public void onFieldChanged(String column, String value) {
if (!isFieldChanged(column, value)) {
@@ -114,148 +85,16 @@
saveValue(column, value);
mChanged = true;
- // Next make sure the display name and the structured name are synced
- if (hasShortAndLongForms()) {
- if (areOptionalFieldsVisible()) {
- rebuildFullName(getValues());
- } else {
- rebuildStructuredName(getValues());
- }
- }
-
- // Then notify the listener, which will rely on the display and structured names to be
- // synced (in order to provide aggregate suggestions).
+ // Then notify the listener.
notifyEditorListener();
}
- @Override
- protected void onOptionalFieldVisibilityChange() {
- if (hasShortAndLongForms()) {
- if (areOptionalFieldsVisible()) {
- switchFromFullNameToStructuredName();
- } else {
- switchFromStructuredNameToFullName();
- }
- }
-
- super.onOptionalFieldVisibilityChange();
- }
-
- private void switchFromFullNameToStructuredName() {
- ValuesDelta values = getValues();
-
- if (!mChanged) {
- for (String field : NameConverter.STRUCTURED_NAME_FIELDS) {
- values.put(field, mSnapshot.getContentValues().getAsString(field));
- }
- return;
- }
-
- String displayName = values.getDisplayName();
- Map<String, String> structuredNameMap = NameConverter.displayNameToStructuredName(
- getContext(), displayName);
- if (!structuredNameMap.isEmpty()) {
- eraseFullName(values);
- for (String field : structuredNameMap.keySet()) {
- values.put(field, structuredNameMap.get(field));
- }
- }
-
- mSnapshot.getContentValues().clear();
- mSnapshot.getContentValues().putAll(values.getCompleteValues());
- mSnapshot.setDisplayName(displayName);
- }
-
- private void switchFromStructuredNameToFullName() {
- ValuesDelta values = getValues();
-
- if (!mChanged) {
- values.setDisplayName(mSnapshot.getDisplayName());
- return;
- }
-
- Map<String, String> structuredNameMap = valuesToStructuredNameMap(values);
- String displayName = NameConverter.structuredNameToDisplayName(getContext(),
- structuredNameMap);
- if (!TextUtils.isEmpty(displayName)) {
- eraseStructuredName(values);
- values.put(StructuredName.DISPLAY_NAME, displayName);
- }
-
- mSnapshot.getContentValues().clear();
- mSnapshot.setDisplayName(values.getDisplayName());
- mSnapshot.setMimeType(StructuredName.CONTENT_ITEM_TYPE);
- for (String field : structuredNameMap.keySet()) {
- mSnapshot.getContentValues().put(field, structuredNameMap.get(field));
- }
- }
-
- private Map<String, String> valuesToStructuredNameMap(ValuesDelta values) {
- Map<String, String> structuredNameMap = new HashMap<String, String>();
- for (String key : NameConverter.STRUCTURED_NAME_FIELDS) {
- structuredNameMap.put(key, values.getAsString(key));
- }
- return structuredNameMap;
- }
-
- private void eraseFullName(ValuesDelta values) {
- values.setDisplayName(null);
- }
-
- private void rebuildFullName(ValuesDelta values) {
- Map<String, String> structuredNameMap = valuesToStructuredNameMap(values);
- String displayName = NameConverter.structuredNameToDisplayName(getContext(),
- structuredNameMap);
- values.setDisplayName(displayName);
- }
-
- private void eraseStructuredName(ValuesDelta values) {
- for (String field : NameConverter.STRUCTURED_NAME_FIELDS) {
- values.putNull(field);
- }
- }
-
- private void rebuildStructuredName(ValuesDelta values) {
- String displayName = values.getDisplayName();
- Map<String, String> structuredNameMap = NameConverter.displayNameToStructuredName(
- getContext(), displayName);
- for (String field : structuredNameMap.keySet()) {
- values.put(field, structuredNameMap.get(field));
- }
- }
-
- /**
- * Set the display name onto the text field directly. This does not affect the underlying
- * data structure so it is similar to the user typing the value in on the field directly.
- *
- * @param name The name to set on the text field.
- */
- public void setDisplayName(String name) {
- // For now, assume the first text field is the name.
- // TODO: Find a better way to get a hold of the name field,
- // including given_name and family_name.
- super.setValue(0, name);
- getValues().setDisplayName(name);
- rebuildStructuredName(getValues());
- super.setValue(1, getValues().getAsString(StructuredName.GIVEN_NAME));
- super.setValue(3, getValues().getAsString(StructuredName.FAMILY_NAME));
- }
-
/**
* Returns the display name currently displayed in the editor.
*/
public String getDisplayName() {
- final ValuesDelta valuesDelta = getValues();
- rebuildFullName(valuesDelta);
- if (hasShortAndLongForms() && areOptionalFieldsVisible()) {
- final Map<String, String> structuredNameMap = valuesToStructuredNameMap(valuesDelta);
- final String displayName = NameConverter.structuredNameToDisplayName(
- getContext(), structuredNameMap);
- if (!TextUtils.isEmpty(displayName)) {
- return displayName;
- }
- }
- return valuesDelta.getDisplayName();
+ return NameConverter.structuredNameToDisplayName(getContext(),
+ getValues().getCompleteValues());
}
@Override
diff --git a/src/com/android/contacts/editor/SuggestionEditConfirmationDialogFragment.java b/src/com/android/contacts/editor/SuggestionEditConfirmationDialogFragment.java
index c13d5ea..9408c7e 100644
--- a/src/com/android/contacts/editor/SuggestionEditConfirmationDialogFragment.java
+++ b/src/com/android/contacts/editor/SuggestionEditConfirmationDialogFragment.java
@@ -29,7 +29,7 @@
private static final String ARG_CONTACT_URI = "contactUri";
- public static void show(ContactEditorBaseFragment fragment, Uri contactUri) {
+ public static void show(ContactEditorFragment fragment, Uri contactUri) {
final Bundle args = new Bundle();
args.putParcelable(ARG_CONTACT_URI, contactUri);
@@ -49,8 +49,8 @@
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
- final ContactEditorBaseFragment targetFragment =
- (ContactEditorBaseFragment) getTargetFragment();
+ final ContactEditorFragment targetFragment =
+ (ContactEditorFragment) getTargetFragment();
final Uri contactUri =
getArguments().getParcelable(ARG_CONTACT_URI);
targetFragment.doEditSuggestedContact(contactUri);
diff --git a/src/com/android/contacts/editor/TextFieldsEditorView.java b/src/com/android/contacts/editor/TextFieldsEditorView.java
index 8bdbcd4..6fd03bf 100644
--- a/src/com/android/contacts/editor/TextFieldsEditorView.java
+++ b/src/com/android/contacts/editor/TextFieldsEditorView.java
@@ -112,7 +112,7 @@
mPreviousViewHeight = mFields.getHeight();
// Save focus
- final View focusedChild = getFocusedChild();
+ final View focusedChild = findFocus();
final int focusedViewId = focusedChild == null ? -1 : focusedChild.getId();
// Reconfigure GUI
diff --git a/src/com/android/contacts/editor/ViewIdGenerator.java b/src/com/android/contacts/editor/ViewIdGenerator.java
index e7e7948..ad99bf8 100644
--- a/src/com/android/contacts/editor/ViewIdGenerator.java
+++ b/src/com/android/contacts/editor/ViewIdGenerator.java
@@ -25,7 +25,7 @@
import com.android.contacts.common.model.dataitem.DataKind;
/**
- * A class that provides unique view ids for {@link ContentEditorView}, {@link KindSectionView},
+ * A class that provides unique view ids for {@link ContentEditorView},
* {@link LabeledEditorView} and {@link EditView} on {@link EditContactActivity}.
* It is used to assign a unique but consistent id to each view across {@link EditContactActivity}'s
* lifecycle, so that we can re-construct view state (e.g. focused view) when the screen rotates.
diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index d7070f0..809cf20 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -18,31 +18,46 @@
import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader;
+import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
+import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
+import android.widget.Toast;
+import com.android.contacts.ContactSaveService;
+import com.android.contacts.ContactsDrawerActivity;
import com.android.contacts.GroupMetaDataLoader;
import com.android.contacts.R;
-import com.android.contacts.activities.GroupMembersActivity;
+import com.android.contacts.activities.ActionBarAdapter;
import com.android.contacts.common.list.ContactsSectionIndexer;
-import com.android.contacts.common.list.MultiSelectEntryContactListAdapter;
+import com.android.contacts.common.list.MultiSelectEntryContactListAdapter.DeleteContactListener;
+import com.android.contacts.common.logging.ListEvent;
import com.android.contacts.common.logging.ListEvent.ListType;
+import com.android.contacts.common.logging.Logger;
+import com.android.contacts.common.logging.ScreenEvent;
import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
import com.android.contacts.group.GroupMembersAdapter.GroupMembersQuery;
+import com.android.contacts.interactions.GroupDeletionDialogFragment;
+import com.android.contacts.list.ContactsRequest;
import com.android.contacts.list.MultiSelectContactsListFragment;
+import com.android.contacts.list.UiIntentActions;
import java.util.ArrayList;
import java.util.HashSet;
@@ -50,33 +65,21 @@
import java.util.Set;
/** Displays the members of a group. */
-public class GroupMembersFragment extends MultiSelectContactsListFragment<GroupMembersAdapter>
- implements MultiSelectEntryContactListAdapter.DeleteContactListener {
+public class GroupMembersFragment extends MultiSelectContactsListFragment<GroupMembersAdapter> {
private static final String TAG = "GroupMembers";
+ private static final String KEY_IS_EDIT_MODE = "editMode";
private static final String KEY_GROUP_URI = "groupUri";
private static final String KEY_GROUP_METADATA = "groupMetadata";
+ public static final String TAG_GROUP_NAME_EDIT_DIALOG = "groupNameEditDialog";
+
private static final String ARG_GROUP_URI = "groupUri";
private static final int LOADER_GROUP_METADATA = 0;
- /** Callbacks for hosts of {@link GroupMembersFragment}. */
- public interface GroupMembersListener {
-
- /** Invoked after group metadata for the passed in group URI has loaded. */
- void onGroupMetadataLoaded(GroupMetaData groupMetaData);
-
- /** Invoked if group metadata can't be loaded for the passed in group URI. */
- void onGroupMetadataLoadFailed();
-
- /** Invoked when a group member in the list is clicked. */
- void onGroupMemberListItemClicked(int position, Uri contactLookupUri);
-
- /** Invoked when a the delete button for a group member in the list is clicked. */
- void onGroupMemberListItemDeleted(int position, long contactId);
- }
+ private static final int RESULT_GROUP_ADD_MEMBER = 100;
/** Filters out duplicate contacts. */
private class FilterCursorWrapper extends CursorWrapper {
@@ -178,20 +181,22 @@
}
}
- private final LoaderCallbacks<Cursor> mGroupMetadataCallbacks = new LoaderCallbacks<Cursor>() {
+ private final LoaderCallbacks<Cursor> mGroupMetaDataCallbacks = new LoaderCallbacks<Cursor>() {
@Override
public CursorLoader onCreateLoader(int id, Bundle args) {
- return new GroupMetaDataLoader(getActivity(), mGroupUri);
+ return new GroupMetaDataLoader(mActivity, mGroupUri);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor == null || cursor.isClosed() || !cursor.moveToNext()) {
Log.e(TAG, "Failed to load group metadata for " + mGroupUri);
- if (mListener != null) {
- mListener.onGroupMetadataLoadFailed();
- }
+ Toast.makeText(getContext(), R.string.groupLoadErrorToast, Toast.LENGTH_SHORT)
+ .show();
+ // TODO: we probably shouldn't finish mActivity.
+ mActivity.setResult(AppCompatActivity.RESULT_CANCELED);
+ mActivity.finish();
return;
}
mGroupMetaData = new GroupMetaData(getActivity(), cursor);
@@ -202,9 +207,13 @@
public void onLoaderReset(Loader<Cursor> loader) {}
};
+ private ActionBarAdapter mActionBarAdapter;
+
+ private ContactsDrawerActivity mActivity;
+
private Uri mGroupUri;
- private GroupMembersListener mListener;
+ private boolean mIsEditMode;
private GroupMetaData mGroupMetaData;
@@ -223,12 +232,219 @@
setPhotoLoaderEnabled(true);
setSectionHeaderDisplayEnabled(true);
setHasOptionsMenu(true);
-
setListType(ListType.GROUP);
}
- public void setListener(GroupMembersListener listener) {
- mListener = listener;
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ if (mGroupMetaData == null) {
+ // Hide menu options until metadata is fully loaded
+ return;
+ }
+ inflater.inflate(R.menu.view_group, menu);
+ }
+
+ @Override
+ public void onPrepareOptionsMenu(Menu menu) {
+ final boolean isSelectionMode = mActionBarAdapter.isSelectionMode();
+ final boolean isGroupEditable = mGroupMetaData != null && mGroupMetaData.editable;
+ final boolean isGroupReadOnly = mGroupMetaData != null && mGroupMetaData.readOnly;
+
+ setVisible(menu, R.id.menu_add, isGroupEditable && !isSelectionMode);
+ setVisible(menu, R.id.menu_rename_group, !isGroupReadOnly && !isSelectionMode);
+ setVisible(menu, R.id.menu_delete_group, !isGroupReadOnly && !isSelectionMode);
+ setVisible(menu, R.id.menu_edit_group, isGroupEditable && !mIsEditMode && !isSelectionMode
+ && !isGroupEmpty());
+ setVisible(menu, R.id.menu_remove_from_group, isGroupEditable && isSelectionMode &&
+ !mIsEditMode);
+ }
+
+ private boolean isGroupEmpty() {
+ return getAdapter() != null && getAdapter().isEmpty();
+ }
+
+ private static void setVisible(Menu menu, int id, boolean visible) {
+ final MenuItem menuItem = menu.findItem(id);
+ if (menuItem != null) {
+ menuItem.setVisible(visible);
+ }
+ }
+
+ private void startGroupAddMemberActivity() {
+ startActivityForResult(GroupUtil.createPickMemberIntent(getContext(), mGroupMetaData,
+ getMemberContactIds()), RESULT_GROUP_ADD_MEMBER);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home: {
+ mActivity.onBackPressed();
+ return true;
+ }
+ case R.id.menu_add: {
+ startGroupAddMemberActivity();
+ return true;
+ }
+ case R.id.menu_rename_group: {
+ GroupNameEditDialogFragment.newInstanceForUpdate(
+ new AccountWithDataSet(mGroupMetaData.accountName,
+ mGroupMetaData.accountType, mGroupMetaData.dataSet),
+ GroupUtil.ACTION_UPDATE_GROUP, mGroupMetaData.groupId,
+ mGroupMetaData.groupName).show(getFragmentManager(),
+ TAG_GROUP_NAME_EDIT_DIALOG);
+ return true;
+ }
+ case R.id.menu_delete_group: {
+ deleteGroup();
+ return true;
+ }
+ case R.id.menu_edit_group: {
+ mIsEditMode = true;
+ mActionBarAdapter.setSelectionMode(true);
+ displayDeleteButtons(true);
+ return true;
+ }
+ case R.id.menu_remove_from_group: {
+ logListEvent();
+ removeSelectedContacts();
+ return true;
+ }
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void removeSelectedContacts() {
+ final long[] contactIds = getAdapter().getSelectedContactIdsArray();
+ new UpdateGroupMembersAsyncTask(UpdateGroupMembersAsyncTask.TYPE_REMOVE,
+ getContext(), contactIds, mGroupMetaData.groupId, mGroupMetaData.accountName,
+ mGroupMetaData.accountType, mGroupMetaData.dataSet).execute();
+
+ mActionBarAdapter.setSelectionMode(false);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == RESULT_GROUP_ADD_MEMBER && resultCode ==
+ Activity.RESULT_OK && data != null) {
+ long[] contactIds = data.getLongArrayExtra(
+ UiIntentActions.TARGET_CONTACT_IDS_EXTRA_KEY);
+ if (contactIds == null) {
+ final long contactId = data.getLongExtra(
+ UiIntentActions.TARGET_CONTACT_ID_EXTRA_KEY, -1);
+ if (contactId > -1) {
+ contactIds = new long[1];
+ contactIds[0] = contactId;
+ }
+ }
+ new UpdateGroupMembersAsyncTask(
+ UpdateGroupMembersAsyncTask.TYPE_ADD,
+ getContext(), contactIds, mGroupMetaData.groupId, mGroupMetaData.accountName,
+ mGroupMetaData.accountType, mGroupMetaData.dataSet).execute();
+ }
+ }
+
+ private final ActionBarAdapter.Listener mActionBarListener = new ActionBarAdapter.Listener() {
+ @Override
+ public void onAction(int action) {
+ switch (action) {
+ case ActionBarAdapter.Listener.Action.START_SELECTION_MODE:
+ if (mIsEditMode) {
+ displayDeleteButtons(true);
+ mActionBarAdapter.setActionBarTitle(getString(R.string.title_edit_group));
+ } else {
+ displayCheckBoxes(true);
+ }
+ mActivity.invalidateOptionsMenu();
+ break;
+ case ActionBarAdapter.Listener.Action.STOP_SEARCH_AND_SELECTION_MODE:
+ mActionBarAdapter.setSearchMode(false);
+ if (mIsEditMode) {
+ displayDeleteButtons(false);
+ } else {
+ displayCheckBoxes(false);
+ }
+ mActivity.invalidateOptionsMenu();
+ break;
+ case ActionBarAdapter.Listener.Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE:
+ break;
+ }
+ }
+
+ @Override
+ public void onUpButtonPressed() {
+ mActivity.onBackPressed();
+ }
+ };
+
+ private final OnCheckBoxListActionListener mCheckBoxListener =
+ new OnCheckBoxListActionListener() {
+ @Override
+ public void onStartDisplayingCheckBoxes() {
+ mActionBarAdapter.setSelectionMode(true);
+ }
+
+ @Override
+ public void onSelectedContactIdsChanged() {
+ if (mActionBarAdapter == null) {
+ return;
+ }
+ if (mIsEditMode) {
+ mActionBarAdapter.setActionBarTitle(getString(R.string.title_edit_group));
+ } else {
+ mActionBarAdapter.setSelectionCount(getSelectedContactIds().size());
+ }
+ }
+
+ @Override
+ public void onStopDisplayingCheckBoxes() {
+ mActionBarAdapter.setSelectionMode(false);
+ }
+ };
+
+ private void logListEvent() {
+ Logger.logListEvent(
+ ListEvent.ActionType.REMOVE_LABEL,
+ getListType(),
+ getAdapter().getCount(),
+ /* clickedIndex */ -1,
+ getAdapter().getSelectedContactIdsArray().length);
+ }
+
+ private void deleteGroup() {
+ if (getMemberCount() == 0) {
+ final Intent intent = ContactSaveService.createGroupDeletionIntent(
+ getContext(), mGroupMetaData.groupId);
+ getContext().startService(intent);
+ mActivity.switchToAllContacts();
+ } else {
+ GroupDeletionDialogFragment.show(getFragmentManager(), mGroupMetaData.groupId,
+ mGroupMetaData.groupName);
+ }
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ mActivity = (ContactsDrawerActivity) getActivity();
+ mActionBarAdapter = new ActionBarAdapter(mActivity, mActionBarListener,
+ mActivity.getSupportActionBar(), mActivity.getToolbar(),
+ R.string.enter_contact_name);
+ mActionBarAdapter.setShowHomeIcon(true);
+ final ContactsRequest contactsRequest = new ContactsRequest();
+ contactsRequest.setActionCode(ContactsRequest.ACTION_GROUP);
+ mActionBarAdapter.initialize(savedInstanceState, contactsRequest);
+ if (mGroupMetaData != null) {
+ mActivity.setTitle(mGroupMetaData.groupName);
+ if (mGroupMetaData.editable) {
+ setCheckBoxListListener(mCheckBoxListener);
+ }
+ }
+ }
+
+ @Override
+ public ActionBarAdapter getActionBarAdapter() {
+ return mActionBarAdapter;
}
public void displayDeleteButtons(boolean displayDeleteButtons) {
@@ -243,21 +459,35 @@
return mGroupMemberContactIds.size();
}
+ public boolean isEditMode() {
+ return mIsEditMode;
+ }
+
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
if (savedState == null) {
mGroupUri = getArguments().getParcelable(ARG_GROUP_URI);
} else {
+ mIsEditMode = savedState.getBoolean(KEY_IS_EDIT_MODE);
mGroupUri = savedState.getParcelable(KEY_GROUP_URI);
mGroupMetaData = savedState.getParcelable(KEY_GROUP_METADATA);
}
+ maybeAttachCheckBoxListener();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ // Re-register the listener, which may have been cleared when onSaveInstanceState was
+ // called. See also: onSaveInstanceState
+ mActionBarAdapter.setListener(mActionBarListener);
}
@Override
protected void startLoading() {
if (mGroupMetaData == null || !mGroupMetaData.isValid()) {
- getLoaderManager().restartLoader(LOADER_GROUP_METADATA, null, mGroupMetadataCallbacks);
+ getLoaderManager().restartLoader(LOADER_GROUP_METADATA, null, mGroupMetaDataCallbacks);
} else {
onGroupMetadataLoaded();
}
@@ -273,7 +503,7 @@
bindMembersCount(cursorWrapper.getCount());
super.onLoadFinished(loader, cursorWrapper);
// Update state of menu items (e.g. "Remove contacts") based on number of group members.
- getActivity().invalidateOptionsMenu();
+ mActivity.invalidateOptionsMenu();
}
}
@@ -296,6 +526,11 @@
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
+ if (mActionBarAdapter != null) {
+ mActionBarAdapter.setListener(null);
+ mActionBarAdapter.onSaveInstanceState(outState);
+ }
+ outState.putBoolean(KEY_IS_EDIT_MODE, mIsEditMode);
outState.putParcelable(KEY_GROUP_URI, mGroupUri);
outState.putParcelable(KEY_GROUP_METADATA, mGroupMetaData);
}
@@ -305,9 +540,9 @@
maybeAttachCheckBoxListener();
- if (mListener != null) {
- mListener.onGroupMetadataLoaded(mGroupMetaData);
- }
+ mActivity.setTitle(mGroupMetaData.groupName);
+ mActivity.updateGroupMenu(mGroupMetaData);
+ mActivity.invalidateOptionsMenu();
// Start loading the group members
super.startLoading();
@@ -316,12 +551,7 @@
private void maybeAttachCheckBoxListener() {
// Don't attach the multi select check box listener if we can't edit the group
if (mGroupMetaData != null && mGroupMetaData.editable) {
- try {
- setCheckBoxListListener((OnCheckBoxListActionListener) getActivity());
- } catch (ClassCastException e) {
- throw new ClassCastException(getActivity() + " must implement " +
- OnCheckBoxListActionListener.class.getSimpleName());
- }
+ setCheckBoxListListener(mCheckBoxListener);
}
}
@@ -330,7 +560,7 @@
final GroupMembersAdapter adapter = new GroupMembersAdapter(getContext());
adapter.setSectionHeaderDisplayEnabled(true);
adapter.setDisplayPhotos(true);
- adapter.setDeleteContactListener(this);
+ adapter.setDeleteContactListener(new DeletionListener());
return adapter;
}
@@ -364,7 +594,8 @@
addContactsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- ((GroupMembersActivity) getActivity()).startGroupAddMemberActivity();
+ startActivityForResult(GroupUtil.createPickMemberIntent(getContext(),
+ mGroupMetaData, getMemberContactIds()), RESULT_GROUP_ADD_MEMBER);
}
});
return view;
@@ -380,25 +611,93 @@
super.onItemClick(position, id);
return;
}
- if (mListener != null) {
- mListener.onGroupMemberListItemClicked(position, uri);
- }
+ final int count = getAdapter().getCount();
+ Logger.logListEvent(ListEvent.ActionType.CLICK, ListEvent.ListType.GROUP, count,
+ /* clickedIndex */ position, /* numSelected */ 0);
+ ImplicitIntentsUtil.startQuickContact(
+ getActivity(), uri, ScreenEvent.ScreenType.LIST_GROUP);
}
@Override
protected boolean onItemLongClick(int position, long id) {
- final Activity activity = getActivity();
- if (activity != null && activity instanceof GroupMembersActivity) {
- if (((GroupMembersActivity) activity).isEditMode()) {
- return true;
- }
+ if (mActivity != null && mIsEditMode) {
+ return true;
}
return super.onItemLongClick(position, id);
}
+ private final class DeletionListener implements DeleteContactListener {
+ @Override
+ public void onContactDeleteClicked(int position) {
+ final long contactId = getAdapter().getContactId(position);
+ final long[] contactIds = new long[1];
+ contactIds[0] = contactId;
+ new UpdateGroupMembersAsyncTask(UpdateGroupMembersAsyncTask.TYPE_REMOVE,
+ getContext(), contactIds, mGroupMetaData.groupId, mGroupMetaData.accountName,
+ mGroupMetaData.accountType, mGroupMetaData.dataSet).execute();
+ }
+ }
+
+ public GroupMetaData getGroupMetaData() {
+ return mGroupMetaData;
+ }
+
+ public boolean isCurrentGroup(long groupId) {
+ return mGroupMetaData != null && mGroupMetaData.groupId == groupId;
+ }
+
@Override
- public void onContactDeleteClicked(int position) {
- final long contactId = getAdapter().getContactId(position);
- mListener.onGroupMemberListItemDeleted(position, contactId);
+ public void onDestroy() {
+ if (mActionBarAdapter != null) {
+ mActionBarAdapter.setListener(null);
+ }
+ super.onDestroy();
+ }
+
+ public void updateExistingGroupFragment(Uri newGroupUri, String action) {
+ if (!GroupUtil.ACTION_SWITCH_GROUP.equals(action)) {
+ toast(getToastMessageForSaveAction(action));
+ }
+
+ if (isEditMode() && getGroupCount() == 1) {
+ // If we're deleting the last group member, exit edit mode
+ exitEditMode();
+ } else if (!GroupUtil.ACTION_REMOVE_FROM_GROUP.equals(action)) {
+ mGroupUri = newGroupUri;
+ mGroupMetaData = null; // Clear mGroupMetaData to trigger a new load.
+ reloadData();
+ mActivity.invalidateOptionsMenu();
+ }
+ }
+
+ private static int getToastMessageForSaveAction(String action) {
+ switch(action) {
+ case GroupUtil.ACTION_UPDATE_GROUP:
+ return R.string.groupUpdatedToast;
+ case GroupUtil.ACTION_ADD_TO_GROUP:
+ return R.string.groupMembersAddedToast;
+ case GroupUtil.ACTION_REMOVE_FROM_GROUP:
+ return R.string.groupMembersRemovedToast;
+ case GroupUtil.ACTION_CREATE_GROUP:
+ return R.string.groupCreatedToast;
+ default:
+ throw new IllegalArgumentException("Unhandled contact save action " + action);
+ }
+ }
+
+ private void toast(int resId) {
+ if (resId >= 0) {
+ Toast.makeText(getContext(), resId, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ private int getGroupCount() {
+ return getAdapter() != null ? getAdapter().getCount() : -1;
+ }
+
+ public void exitEditMode() {
+ mIsEditMode = false;
+ mActionBarAdapter.setSelectionMode(false);
+ displayDeleteButtons(false);
}
}
diff --git a/src/com/android/contacts/group/GroupUtil.java b/src/com/android/contacts/group/GroupUtil.java
index 6539bc8..1a99a65 100644
--- a/src/com/android/contacts/group/GroupUtil.java
+++ b/src/com/android/contacts/group/GroupUtil.java
@@ -16,7 +16,6 @@
package com.android.contacts.group;
-import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
@@ -28,7 +27,6 @@
import com.android.contacts.GroupListLoader;
import com.android.contacts.activities.ContactSelectionActivity;
-import com.android.contacts.activities.GroupMembersActivity;
import com.android.contacts.common.list.ContactsSectionIndexer;
import com.android.contacts.common.model.account.GoogleAccountType;
import com.android.contacts.list.UiIntentActions;
@@ -44,12 +42,24 @@
*/
public final class GroupUtil {
+ public final static String ALL_GROUPS_SELECTION =
+ Groups.ACCOUNT_TYPE + " NOT NULL AND " + Groups.ACCOUNT_NAME + " NOT NULL AND "
+ + Groups.DELETED + "=0";
+
+ public final static String DEFAULT_SELECTION = ALL_GROUPS_SELECTION + " AND "
+ + Groups.AUTO_ADD + "=0 AND " + Groups.FAVORITES + "=0";
+
+ public static final String ACTION_ADD_TO_GROUP = "addToGroup";
+ public static final String ACTION_CREATE_GROUP = "createGroup";
+ public static final String ACTION_DELETE_GROUP = "deleteGroup";
+ public static final String ACTION_REMOVE_FROM_GROUP = "removeFromGroup";
+ public static final String ACTION_SWITCH_GROUP = "switchGroup";
+ public static final String ACTION_UPDATE_GROUP = "updateGroup";
+
// System IDs of FFC groups in Google accounts
private static final Set<String> FFC_GROUPS =
new HashSet(Arrays.asList("Friends", "Family", "Coworkers"));
- public static final String EXTRA_GROUP_NAME = "groupName";
-
private GroupUtil() {
}
@@ -88,21 +98,6 @@
isFirstGroupInAccount, memberCount, isReadOnly, systemId);
}
- /** Returns an Intent to view the details of the group identified by the given URI. */
- public static Intent createViewGroupIntent(Context context, Uri groupUri, String title) {
- final Intent intent = new Intent(context, GroupMembersActivity.class);
- intent.setAction(Intent.ACTION_VIEW);
- intent.setData(groupUri);
- intent.putExtra(EXTRA_GROUP_NAME, title);
- return intent;
- }
-
- /** Returns an Intent to view the details of the group identified by the given ID. */
- public static Intent createViewGroupIntent(Context context, long groupId, String title) {
- return createViewGroupIntent(context,
- ContentUris.withAppendedId(Groups.CONTENT_URI, groupId), title);
- }
-
/** Returns an Intent to pick contacts to add to a group. */
public static Intent createPickMemberIntent(Context context,
GroupMetaData groupMetaData, ArrayList<String> memberContactIds) {
@@ -131,6 +126,13 @@
}
/**
+ * Returns true the URI is a group URI.
+ */
+ public static boolean isGroupUri(Uri uri) {
+ return uri != null && uri.toString().startsWith(Groups.CONTENT_URI.toString());
+ }
+
+ /**
* Sort groups alphabetically and in a localized way.
*/
public static String getGroupsSortOrder() {
diff --git a/src/com/android/contacts/group/UpdateGroupMembersAsyncTask.java b/src/com/android/contacts/group/UpdateGroupMembersAsyncTask.java
new file mode 100644
index 0000000..9b255eb
--- /dev/null
+++ b/src/com/android/contacts/group/UpdateGroupMembersAsyncTask.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2016 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.group;
+
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.RawContacts;
+import android.widget.Toast;
+
+import com.android.contacts.ContactSaveService;
+import com.android.contacts.R;
+import com.android.contacts.activities.PeopleActivity;
+
+/**
+ * Starts an Intent to add/remove the raw contacts for the given contact IDs to/from a group.
+ * Only the raw contacts that belong to the specified account are added or removed.
+ */
+public class UpdateGroupMembersAsyncTask extends AsyncTask<Void, Void, Intent> {
+ static final int TYPE_ADD = 0;
+ static final int TYPE_REMOVE = 1;
+
+ private final Context mContext;
+ private final int mType;
+ private final long[] mContactIds;
+ private final long mGroupId;
+ private final String mAccountName;
+ private final String mAccountType;
+ private final String mDataSet;
+
+ public UpdateGroupMembersAsyncTask(int type, Context context, long[] contactIds,
+ long groupId, String accountName, String accountType, String dataSet) {
+ mContext = context;
+ mType = type;
+ mContactIds = contactIds;
+ mGroupId = groupId;
+ mAccountName = accountName;
+ mAccountType = accountType;
+ mDataSet = dataSet;
+ }
+
+ @Override
+ protected Intent doInBackground(Void... params) {
+ final long[] rawContactIds = getRawContactIds();
+ if (rawContactIds.length == 0) {
+ return null;
+ }
+ final long[] rawContactIdsToAdd;
+ final long[] rawContactIdsToRemove;
+ final String action;
+ if (mType == TYPE_ADD) {
+ rawContactIdsToAdd = rawContactIds;
+ rawContactIdsToRemove = null;
+ action = GroupUtil.ACTION_ADD_TO_GROUP;
+ } else if (mType == TYPE_REMOVE) {
+ rawContactIdsToAdd = null;
+ rawContactIdsToRemove = rawContactIds;
+ action = GroupUtil.ACTION_REMOVE_FROM_GROUP;
+ } else {
+ throw new IllegalStateException("Unrecognized type " + mType);
+ }
+ return ContactSaveService.createGroupUpdateIntent(
+ mContext, mGroupId, /* newLabel */ null, rawContactIdsToAdd,
+ rawContactIdsToRemove, PeopleActivity.class, action);
+ }
+
+ // TODO(wjang): prune raw contacts that are already in the group; ContactSaveService will
+ // log a warning if the raw contact is already a member and keep going but it is not ideal.
+ private long[] getRawContactIds() {
+ final Uri.Builder builder = RawContacts.CONTENT_URI.buildUpon();
+ // null account names are not valid, see ContactsProvider2#appendAccountFromParameter
+ if (mAccountName != null) {
+ builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, mAccountName);
+ builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, mAccountType);
+ }
+ if (mDataSet != null) {
+ builder.appendQueryParameter(RawContacts.DATA_SET, mDataSet);
+ }
+ final Uri rawContactUri = builder.build();
+ final String[] projection = new String[]{ContactsContract.RawContacts._ID};
+ final StringBuilder selection = new StringBuilder();
+ final String[] selectionArgs = new String[mContactIds.length];
+ for (int i = 0; i < mContactIds.length; i++) {
+ if (i > 0) {
+ selection.append(" OR ");
+ }
+ selection.append(ContactsContract.RawContacts.CONTACT_ID).append("=?");
+ selectionArgs[i] = Long.toString(mContactIds[i]);
+ }
+ final Cursor cursor = mContext.getContentResolver().query(
+ rawContactUri, projection, selection.toString(), selectionArgs, null, null);
+ final long[] rawContactIds = new long[cursor.getCount()];
+ try {
+ int i = 0;
+ while (cursor.moveToNext()) {
+ rawContactIds[i] = cursor.getLong(0);
+ i++;
+ }
+ } finally {
+ cursor.close();
+ }
+ return rawContactIds;
+ }
+
+ @Override
+ protected void onPostExecute(Intent intent) {
+ if (intent == null) {
+ Toast.makeText(mContext, R.string.groupSavedErrorToast, Toast.LENGTH_SHORT).show();
+ } else {
+ mContext.startService(intent);
+ }
+ }
+}
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index c9a5a9b..ec500f3 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -66,6 +66,7 @@
Entity.DATA_SET, // 2
Entity.CONTACT_ID, // 3
Entity.LOOKUP_KEY, // 4
+ Entity.DISPLAY_NAME, // 5
};
private static final int COLUMN_INDEX_RAW_CONTACT_ID = 0;
@@ -73,9 +74,11 @@
private static final int COLUMN_INDEX_DATA_SET = 2;
private static final int COLUMN_INDEX_CONTACT_ID = 3;
private static final int COLUMN_INDEX_LOOKUP_KEY = 4;
+ private static final int COLUMN_INDEX_DISPLAY_NAME = 5;
private boolean mActive;
private Uri mContactUri;
+ private String mDisplayName;
private boolean mFinishActivityWhenDone;
private Context mContext;
private AlertDialog mDialog;
@@ -248,6 +251,7 @@
final String dataSet = cursor.getString(COLUMN_INDEX_DATA_SET);
contactId = cursor.getLong(COLUMN_INDEX_CONTACT_ID);
lookupKey = cursor.getString(COLUMN_INDEX_LOOKUP_KEY);
+ mDisplayName = cursor.getString(COLUMN_INDEX_DISPLAY_NAME);
AccountType type = accountTypes.getAccountType(accountType, dataSet);
boolean writable = type == null || type.areContactsWritable();
if (writable) {
@@ -338,8 +342,14 @@
if (isAdded() && mFinishActivityWhenDone) {
getActivity().setResult(RESULT_CODE_DELETED);
getActivity().finish();
- final String deleteToastMessage = getResources().getQuantityString(R.plurals
- .contacts_deleted_toast, /* quantity */ 1);
+ final String deleteToastMessage;
+ if (mDisplayName == null) {
+ deleteToastMessage = getResources().getQuantityString(
+ R.plurals.contacts_deleted_toast, /* quantity */ 1);
+ } else {
+ deleteToastMessage = getResources().getString(
+ R.string.contact_deleted_named_toast, mDisplayName);
+ }
Toast.makeText(mContext, deleteToastMessage, Toast.LENGTH_LONG).show();
}
}
diff --git a/src/com/android/contacts/interactions/ContactMultiDeletionInteraction.java b/src/com/android/contacts/interactions/ContactMultiDeletionInteraction.java
index 173f66e..ff0d978 100644
--- a/src/com/android/contacts/interactions/ContactMultiDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactMultiDeletionInteraction.java
@@ -75,21 +75,22 @@
private TreeSet<Long> mContactIds;
private Context mContext;
private AlertDialog mDialog;
+ private MultiContactDeleteListener mListener;
/**
* Starts the interaction.
*
- * @param activity the activity within which to start the interaction
+ * @param hostFragment the fragment within which to start the interaction
* @param contactIds the IDs of contacts to be deleted
* @return the newly created interaction
*/
public static ContactMultiDeletionInteraction start(
- Activity activity, TreeSet<Long> contactIds) {
+ Fragment hostFragment, TreeSet<Long> contactIds) {
if (contactIds == null) {
return null;
}
- final FragmentManager fragmentManager = activity.getFragmentManager();
+ final FragmentManager fragmentManager = hostFragment.getFragmentManager();
ContactMultiDeletionInteraction fragment =
(ContactMultiDeletionInteraction) fragmentManager.findFragmentByTag(FRAGMENT_TAG);
if (fragment == null) {
@@ -291,13 +292,10 @@
protected void doDeleteContact(long[] contactIds) {
mContext.startService(ContactSaveService.createDeleteMultipleContactsIntent(mContext,
contactIds));
- notifyListenerActivity();
+ mListener.onDeletionFinished();
}
- private void notifyListenerActivity() {
- if (getActivity() instanceof MultiContactDeleteListener) {
- final MultiContactDeleteListener listener = (MultiContactDeleteListener) getActivity();
- listener.onDeletionFinished();
- }
+ public void setListener(MultiContactDeleteListener listener) {
+ mListener = listener;
}
}
diff --git a/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java b/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
index e247536..5c5609d 100644
--- a/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
+++ b/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
@@ -23,6 +23,7 @@
import android.os.Bundle;
import com.android.contacts.ContactSaveService;
+import com.android.contacts.ContactsDrawerActivity;
import com.android.contacts.R;
/**
@@ -64,8 +65,9 @@
protected void deleteGroup() {
final long groupId = getArguments().getLong(ARG_GROUP_ID);
- getActivity().startService(ContactSaveService.createGroupDeletionIntent(
+ final ContactsDrawerActivity activity = ((ContactsDrawerActivity) getActivity());
+ activity.startService(ContactSaveService.createGroupDeletionIntent(
getActivity(), groupId));
- getActivity().finish();
+ activity.switchToAllContacts();
}
}
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 752201b..c8da194 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -92,7 +92,7 @@
private boolean mSelectionVerified;
private int mLastSelectedPosition = -1;
private boolean mRefreshingContactUri;
- private ContactListFilter mFilter;
+ protected ContactListFilter mFilter;
private String mPersistentSelectionPrefix = PERSISTENT_SELECTION_PREFIX;
protected OnContactBrowserActionListener mListener;
@@ -194,11 +194,7 @@
}
}
- public void setFilter(ContactListFilter filter) {
- setFilter(filter, true);
- }
-
- public void setFilter(ContactListFilter filter, boolean restoreSelectedUri) {
+ public void updateListFilter(ContactListFilter filter, boolean restoreSelectedUri) {
if (mFilter == null && filter == null) {
return;
}
@@ -210,17 +206,11 @@
Log.v(TAG, "New filter: " + filter);
- setListType(filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS
- ? ListType.ALL_CONTACTS : ListType.ACCOUNT);
+ setListType(filter.toListType());
setLogListEvents(true);
-
mFilter = filter;
mLastSelectedPosition = -1;
- if (filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
- saveFilter();
- }
-
if (restoreSelectedUri) {
mSelectedContactUri = null;
restoreSelectedUri(true);
@@ -679,9 +669,4 @@
return mPersistentSelectionPrefix + "-" + mFilter.getId();
}
}
-
- public boolean isOptionsMenuChanged() {
- // This fragment does not have an option menu of its own
- return false;
- }
}
diff --git a/src/com/android/contacts/list/ContactsIntentResolver.java b/src/com/android/contacts/list/ContactsIntentResolver.java
index 354ea3a..8e93baf 100644
--- a/src/com/android/contacts/list/ContactsIntentResolver.java
+++ b/src/com/android/contacts/list/ContactsIntentResolver.java
@@ -35,6 +35,7 @@
import android.util.Log;
import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.group.GroupUtil;
/**
* Parses a Contacts intent, extracting all relevant parts and packaging them
@@ -150,11 +151,19 @@
if (ContactsContract.Contacts.CONTENT_TYPE.equals(resolvedType)
|| android.provider.Contacts.People.CONTENT_TYPE.equals(resolvedType)) {
request.setActionCode(ContactsRequest.ACTION_ALL_CONTACTS);
- } else {
+ } else if (!GroupUtil.isGroupUri(intent.getData())){
request.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
request.setContactUri(intent.getData());
intent.setAction(Intent.ACTION_DEFAULT);
intent.setData(null);
+ } else {
+ request.setActionCode(ContactsRequest.ACTION_VIEW_GROUP);
+ request.setContactUri(intent.getData());
+ }
+ } else if (Intent.ACTION_EDIT.equals(action)) {
+ if (GroupUtil.isGroupUri(intent.getData())){
+ request.setActionCode(ContactsRequest.ACTION_EDIT_GROUP);
+ request.setContactUri(intent.getData());
}
// Since this is the filter activity it receives all intents
// dispatched from the SearchManager for security reasons
diff --git a/src/com/android/contacts/list/ContactsRequest.java b/src/com/android/contacts/list/ContactsRequest.java
index e9b3a86..de6a4ba 100644
--- a/src/com/android/contacts/list/ContactsRequest.java
+++ b/src/com/android/contacts/list/ContactsRequest.java
@@ -45,6 +45,12 @@
/** Create a new group */
public static final int ACTION_INSERT_GROUP = 22;
+ /** View a group */
+ public static final int ACTION_VIEW_GROUP = 23;
+
+ /** Edit a group */
+ public static final int ACTION_EDIT_GROUP = 24;
+
/** Show all starred contacts */
public static final int ACTION_STARRED = 30;
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index 1b122cc..488463d 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -17,9 +17,11 @@
import android.app.Fragment;
import android.content.Context;
+import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.PorterDuff;
import android.os.Bundle;
+import android.provider.ContactsContract.ProviderStatus;
import android.support.v4.content.ContextCompat;
import android.view.Gravity;
import android.view.LayoutInflater;
@@ -33,8 +35,9 @@
import android.widget.TextView;
import com.android.contacts.R;
-import com.android.contacts.activities.ActionBarAdapter.TabState;
import com.android.contacts.common.compat.ProviderStatusCompat;
+import com.android.contacts.common.interactions.ImportDialogFragment;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
/**
* Fragment shown when contacts are unavailable. It contains provider status
@@ -49,19 +52,10 @@
private Button mImportContactsButton;
private ProgressBar mProgress;
private View mButtonsContainer;
- private int mNoContactsMsgResId = -1;
- private int mLastTab = -1;
-
- private OnContactsUnavailableActionListener mListener;
private Integer mProviderStatus;
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
-
- @Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.contacts_unavailable_fragment, null);
@@ -101,11 +95,6 @@
return mView;
}
- public void setOnContactsUnavailableActionListener(
- OnContactsUnavailableActionListener listener) {
- mListener = listener;
- }
-
public void updateStatus(int providerStatus) {
mProviderStatus = providerStatus;
if (mView == null) {
@@ -125,10 +114,7 @@
* Update views in the fragment when provider status is empty.
*/
private void updateViewsForEmptyStatus() {
- setTabInfo(mNoContactsMsgResId, mLastTab);
- if (mLastTab == TabState.ALL) {
- updateButtonVisibilty(View.VISIBLE);
- }
+ updateButtonVisibility(View.VISIBLE);
mProgress.setVisibility(View.GONE);
}
@@ -141,7 +127,7 @@
mMessageView.setText(resId);
mMessageView.setVisibility(View.VISIBLE);
mImageView.setVisibility(View.GONE);
- updateButtonVisibilty(View.GONE);
+ updateButtonVisibility(View.GONE);
mProgress.setVisibility(View.VISIBLE);
final ViewGroup.MarginLayoutParams layoutParams =
@@ -154,43 +140,23 @@
@Override
public void onClick(View v) {
- if (mListener == null) {
- return;
- }
switch (v.getId()) {
case R.id.add_account_button:
- mListener.onAddAccountAction();
+ final Intent intent = ImplicitIntentsUtil.getIntentForAddingGoogleAccount();
+ ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
break;
case R.id.import_contacts_button:
- mListener.onImportContactsFromFileAction();
+ ImportDialogFragment.show(getFragmentManager(), getActivity().getClass());
break;
}
}
- /**
- * Set the message to be shown if no data is available for the selected tab
- *
- * @param resId - String resource ID of the message , -1 means view will not be visible
- */
- public void setTabInfo(int resId, int callerTab) {
- mNoContactsMsgResId = resId;
- mLastTab = callerTab;
- if ((mMessageView != null) && (mProviderStatus != null) &&
- mProviderStatus.equals(ProviderStatusCompat.STATUS_EMPTY)) {
- if (resId != -1) {
- mMessageView.setText(mNoContactsMsgResId);
- mMessageView.setGravity(Gravity.CENTER_HORIZONTAL);
- mMessageView.setVisibility(View.VISIBLE);
- if (callerTab == TabState.ALL) {
- updateButtonVisibilty(View.VISIBLE);
- }
- } else {
- mMessageView.setVisibility(View.GONE);
- }
- }
+ private boolean areContactsAvailable() {
+ return (mProviderStatus != null) && mProviderStatus.equals(ProviderStatus.STATUS_NORMAL);
}
- private void updateButtonVisibilty(int visibility) {
+
+ private void updateButtonVisibility(int visibility) {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
mAddAccountButton.setVisibility(visibility);
mImportContactsButton.setVisibility(visibility);
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index afaafb7..c9c5915 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -15,15 +15,31 @@
*/
package com.android.contacts.list;
+import android.accounts.Account;
+import android.app.Activity;
+import android.content.ActivityNotFoundException;
+import android.content.ContentResolver;
+import android.content.ContentUris;
import android.content.Context;
import android.content.CursorLoader;
+import android.content.Intent;
import android.content.Loader;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.database.Cursor;
+import android.graphics.Rect;
import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract;
import android.provider.ContactsContract.Directory;
+import android.support.v4.widget.SwipeRefreshLayout;
import android.text.TextUtils;
+import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
@@ -32,32 +48,172 @@
import android.widget.ImageView;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
+import android.widget.Toast;
+import com.android.contacts.ContactSaveService;
+import com.android.contacts.ContactsDrawerActivity;
import com.android.contacts.R;
-import com.android.contacts.activities.PeopleActivity;
+import com.android.contacts.activities.ActionBarAdapter;
+import com.android.contacts.common.Experiments;
+import com.android.contacts.common.list.ContactEntryListFragment;
import com.android.contacts.common.list.ContactListAdapter;
import com.android.contacts.common.list.ContactListFilter;
+import com.android.contacts.common.list.ContactListFilterController;
import com.android.contacts.common.list.ContactListItemView;
import com.android.contacts.common.list.DefaultContactListAdapter;
+import com.android.contacts.common.list.DirectoryListLoader;
import com.android.contacts.common.list.FavoritesAndContactsLoader;
+import com.android.contacts.common.logging.ListEvent;
+import com.android.contacts.common.logging.Logger;
+import com.android.contacts.common.logging.ScreenEvent;
+import com.android.contacts.common.model.AccountTypeManager;
import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.util.AccountFilterUtil;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
+import com.android.contacts.interactions.ContactDeletionInteraction;
+import com.android.contacts.interactions.ContactMultiDeletionInteraction;
+import com.android.contacts.interactions.ContactMultiDeletionInteraction.MultiContactDeleteListener;
+import com.android.contacts.quickcontact.QuickContactActivity;
+import com.android.contacts.util.SharedPreferenceUtil;
+import com.android.contacts.util.SyncUtil;
+import com.android.contactsbind.experiments.Flags;
+import com.android.contactsbind.FeatureHighlightHelper;
+
+import java.util.List;
+import java.util.Locale;
/**
* Fragment containing a contact list used for browsing (as compared to
* picking a contact with one of the PICK intents).
*/
public class DefaultContactBrowseListFragment extends ContactBrowseListFragment {
+
+ private static final String TAG = "DefaultListFragment";
+ private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!";
+ private static final String KEY_DELETION_IN_PROGRESS = "deletionInProgress";
+
+ private static final int ACTIVITY_REQUEST_CODE_SHARE = 0;
+
private View mSearchHeaderView;
private View mSearchProgress;
private View mEmptyAccountView;
private View mEmptyHomeView;
private View mAccountFilterContainer;
private TextView mSearchProgressText;
- private FeatureHighlightCallback mCallback;
+ private SwipeRefreshLayout mSwipeRefreshLayout;
- public interface FeatureHighlightCallback {
- void onLoadFinishedCallback();
- }
+ private boolean mContactsAvailable;
+ private boolean mEnableDebugMenuOptions;
+ private boolean mIsRecreatedInstance;
+ private boolean mOptionsMenuContactsAvailable;
+
+ /**
+ * If {@link #configureFragment()} is already called. Used to avoid calling it twice
+ * in {@link #onResume()}.
+ * (This initialization only needs to be done once in onResume() when the Activity was just
+ * created from scratch -- i.e. onCreate() was just called)
+ */
+ private boolean mFragmentInitialized;
+
+ private boolean mFromOnNewIntent;
+
+ /**
+ * This is to tell whether we need to restart ContactMultiDeletionInteraction and set listener.
+ * if screen is rotated while deletion dialog is shown.
+ */
+ private boolean mIsDeletionInProgress;
+
+ /**
+ * This is to disable {@link #onOptionsItemSelected} when we trying to stop the
+ * activity/fragment.
+ */
+ private boolean mDisableOptionItemSelected;
+
+ private ActionBarAdapter mActionBarAdapter;
+ private ContactsDrawerActivity mActivity;
+ private ContactsRequest mContactsRequest;
+ private ContactListFilterController mContactListFilterController;
+
+ private final ActionBarAdapter.Listener mActionBarListener = new ActionBarAdapter.Listener() {
+ @Override
+ public void onAction(int action) {
+ switch (action) {
+ case ActionBarAdapter.Listener.Action.START_SELECTION_MODE:
+ displayCheckBoxes(true);
+ startSearchOrSelectionMode();
+ break;
+ case ActionBarAdapter.Listener.Action.START_SEARCH_MODE:
+ if (!mIsRecreatedInstance) {
+ Logger.logScreenView(mActivity, ScreenEvent.ScreenType.SEARCH);
+ }
+ startSearchOrSelectionMode();
+ break;
+ case ActionBarAdapter.Listener.Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE:
+ mActivity.showFabWithAnimation(/* showFab */ true);
+ break;
+ case ActionBarAdapter.Listener.Action.STOP_SEARCH_AND_SELECTION_MODE:
+ // If queryString is empty, fragment data will not be reloaded,
+ // so hamburger promo should be checked now.
+ // Otherwise, promo should be checked and displayed after reloading, b/30706521.
+ if (TextUtils.isEmpty(getQueryString())) {
+ maybeShowHamburgerFeatureHighlight();
+ }
+ setQueryTextToFragment("");
+ maybeHideCheckBoxes();
+ mActivity.invalidateOptionsMenu();
+ mActivity.showFabWithAnimation(/* showFab */ true);
+ // Determine whether the account has pullToRefresh feature
+ if (Flags.getInstance(getContext()).getBoolean(Experiments.PULL_TO_REFRESH)) {
+ setSwipeRefreshLayoutEnabledOrNot(getFilter());
+ }
+ break;
+ case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY:
+ final String queryString = mActionBarAdapter.getQueryString();
+ setQueryTextToFragment(queryString);
+ updateDebugOptionsVisibility(
+ ENABLE_DEBUG_OPTIONS_HIDDEN_CODE.equals(queryString));
+ break;
+ default:
+ throw new IllegalStateException("Unknown ActionBarAdapter action: " + action);
+ }
+ }
+
+ private void startSearchOrSelectionMode() {
+ configureContactListFragment();
+ maybeHideCheckBoxes();
+ mActivity.invalidateOptionsMenu();
+ mActivity.showFabWithAnimation(/* showFab */ false);
+
+ final Context context = getContext();
+ if (!SharedPreferenceUtil.getHamburgerPromoTriggerActionHappenedBefore(context)) {
+ SharedPreferenceUtil.setHamburgerPromoTriggerActionHappenedBefore(context);
+ }
+ }
+
+ private void updateDebugOptionsVisibility(boolean visible) {
+ if (mEnableDebugMenuOptions != visible) {
+ mEnableDebugMenuOptions = visible;
+ mActivity.invalidateOptionsMenu();
+ }
+ }
+
+ private void setQueryTextToFragment(String query) {
+ setQueryString(query, true);
+ setVisibleScrollbarEnabled(!isSearchMode());
+ }
+
+ @Override
+ public void onUpButtonPressed() {
+ mActivity.onBackPressed();
+ }
+ };
+
+ private final View.OnClickListener mAddContactListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ AccountFilterUtil.startEditorIntent(getContext(), mActivity.getIntent(), getFilter());
+ }
+ };
public DefaultContactBrowseListFragment() {
setPhotoLoaderEnabled(true);
@@ -67,10 +223,7 @@
setSectionHeaderDisplayEnabled(true);
setVisibleScrollbarEnabled(true);
setDisplayDirectoryHeader(false);
- }
-
- public void setFeatureHighlightCallback(FeatureHighlightCallback callback) {
- mCallback = callback;
+ setHasOptionsMenu(true);
}
@Override
@@ -81,17 +234,29 @@
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (loader.getId() == Directory.DEFAULT) {
- bindListHeader(data.getCount());
+ bindListHeader(data == null ? 0 : data.getCount());
}
super.onLoadFinished(loader, data);
- if (!isSearchMode() && mCallback != null) {
- mCallback.onLoadFinishedCallback();
+ if (!isSearchMode()) {
+ maybeShowHamburgerFeatureHighlight();
+ }
+ }
+
+ private void maybeShowHamburgerFeatureHighlight() {
+ if (mActionBarAdapter!= null && !mActionBarAdapter.isSearchMode()
+ && !mActionBarAdapter.isSelectionMode()
+ && SharedPreferenceUtil.getShouldShowHamburgerPromo(getContext())) {
+ if (FeatureHighlightHelper.showHamburgerFeatureHighlight(mActivity)) {
+ SharedPreferenceUtil.setHamburgerPromoDisplayedBefore(getContext());
+ }
}
}
private void bindListHeader(int numberOfContacts) {
final ContactListFilter filter = getFilter();
- if (!isSearchMode() && numberOfContacts <= 0) {
+ // If the phone has at least one Google account whose sync status is unsyncable or pending
+ // or active, we have to make mAccountFilterContainer visible.
+ if (!isSearchMode() && numberOfContacts <= 0 && shouldShowEmptyView(filter)) {
if (filter != null && filter.isContactsFilterType()) {
makeViewVisible(mEmptyHomeView);
} else {
@@ -114,6 +279,38 @@
}
}
+ /**
+ * If at least one Google account is unsyncable or its sync status is pending or active, we
+ * should not show empty view even if the number of contacts is 0. We should show sync status
+ * with empty list instead.
+ */
+ private boolean shouldShowEmptyView(ContactListFilter filter) {
+ if (filter == null) {
+ return true;
+ }
+ // TODO(samchen) : Check ContactListFilter.FILTER_TYPE_CUSTOM
+ if (ContactListFilter.FILTER_TYPE_DEFAULT == filter.filterType
+ || ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS == filter.filterType) {
+ final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(getContext())
+ .getAccounts(/* contactsWritableOnly */ true);
+ final List<Account> syncableAccounts = filter.getSyncableAccounts(accounts);
+
+ if (syncableAccounts != null && syncableAccounts.size() > 0) {
+ for (Account account : syncableAccounts) {
+ if (SyncUtil.isSyncStatusPendingOrActive(account)
+ || SyncUtil.isUnsyncableGoogleAccount(account)) {
+ return false;
+ }
+ }
+ }
+ } else if (ContactListFilter.FILTER_TYPE_ACCOUNT == filter.filterType) {
+ final Account account = new Account(filter.accountName, filter.accountType);
+ return !(SyncUtil.isSyncStatusPendingOrActive(account)
+ || SyncUtil.isUnsyncableGoogleAccount(account));
+ }
+ return true;
+ }
+
// Show the view that's specified by id and hide the other two.
private void makeViewVisible(View view) {
mEmptyAccountView.setVisibility(view == mEmptyAccountView ? View.VISIBLE : View.GONE);
@@ -122,6 +319,12 @@
view == mAccountFilterContainer ? View.VISIBLE : View.GONE);
}
+ public void scrollToTop() {
+ if (getListView() != null) {
+ getListView().setSelection(0);
+ }
+ }
+
@Override
protected void onItemClick(int position, long id) {
final Uri uri = getAdapter().getContactUri(position);
@@ -146,6 +349,11 @@
}
@Override
+ public ContactListFilter getFilter() {
+ return mContactListFilterController.getFilter();
+ }
+
+ @Override
protected View inflateView(LayoutInflater inflater, ViewGroup container) {
final View view = inflater.inflate(R.layout.contact_list_content, null);
@@ -176,12 +384,7 @@
// Set up add contact button.
final Button addContactButton =
(Button) emptyHomeView.findViewById(R.id.add_contact_button);
- addContactButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ((PeopleActivity) getActivity()).onFabClicked();
- }
- });
+ addContactButton.setOnClickListener(mAddContactListener);
return emptyHomeView;
}
@@ -202,22 +405,35 @@
// Set up add contact button.
final Button addContactButton =
(Button) emptyAccountView.findViewById(R.id.add_contact_button);
- addContactButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ((PeopleActivity) getActivity()).onFabClicked();
- }
- });
+ addContactButton.setOnClickListener(mAddContactListener);
return emptyAccountView;
}
@Override
+ public void onCreate(Bundle savedState) {
+ super.onCreate(savedState);
+ mIsRecreatedInstance = (savedState != null);
+ mContactListFilterController = ContactListFilterController.getInstance(getContext());
+ mContactListFilterController.checkFilterValidity(false);
+ // Use FILTER_TYPE_ALL_ACCOUNTS filter if the instance is not a re-created one.
+ // This is useful when user upgrades app while an account filter was
+ // stored in sharedPreference in a previous version of Contacts app.
+ final ContactListFilter filter = mIsRecreatedInstance
+ ? getFilter()
+ : AccountFilterUtil.createContactsFilter(getContext());
+ setContactListFilter(filter);
+ }
+
+ @Override
protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
super.onCreateView(inflater, container);
+ if (Flags.getInstance(getContext()).getBoolean(Experiments.PULL_TO_REFRESH)) {
+ initSwipeRefreshLayout();
+ }
// Putting the header view inside a container will allow us to make
// it invisible later. See checkHeaderViewVisibility()
- FrameLayout headerContainer = new FrameLayout(inflater.getContext());
+ final FrameLayout headerContainer = new FrameLayout(inflater.getContext());
mSearchHeaderView = inflater.inflate(R.layout.search_header, null, false);
headerContainer.addView(mSearchHeaderView);
getListView().addHeaderView(headerContainer, null, false);
@@ -227,6 +443,173 @@
mSearchProgressText = (TextView) mSearchHeaderView.findViewById(R.id.totalContactsText);
}
+ private void initSwipeRefreshLayout() {
+ mSwipeRefreshLayout = (SwipeRefreshLayout) mView.findViewById(R.id.swipe_refresh);
+ if (mSwipeRefreshLayout == null) {
+ return;
+ }
+
+ mSwipeRefreshLayout.setEnabled(true);
+ // Request sync contacts
+ mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+ @Override
+ public void onRefresh() {
+ syncContacts(mFilter);
+ }
+ });
+ mSwipeRefreshLayout.setColorSchemeResources(
+ R.color.swipe_refresh_color1,
+ R.color.swipe_refresh_color2,
+ R.color.swipe_refresh_color3,
+ R.color.swipe_refresh_color4);
+ mSwipeRefreshLayout.setDistanceToTriggerSync(
+ (int) getResources().getDimension(R.dimen.pull_to_refresh_distance));
+ }
+
+ /**
+ * Request sync for the Google accounts (not include Google+ accounts) specified by the given
+ * filter.
+ */
+ private void syncContacts(ContactListFilter filter) {
+ if (filter == null) {
+ return;
+ }
+ final Bundle bundle = new Bundle();
+ bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
+ bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
+
+ final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(
+ getContext()).getAccounts(/* contactsWritableOnly */ true);
+ final List<Account> syncableAccounts = filter.getSyncableAccounts(accounts);
+ if (syncableAccounts != null && syncableAccounts.size() > 0) {
+ for (Account account : syncableAccounts) {
+ // We can prioritize Contacts sync if sync is not initialized yet.
+ if (!SyncUtil.isSyncStatusPendingOrActive(account)
+ || SyncUtil.isUnsyncableGoogleAccount(account)) {
+ ContentResolver.requestSync(account, ContactsContract.AUTHORITY, bundle);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ mActivity = (ContactsDrawerActivity) getActivity();
+ mActionBarAdapter = new ActionBarAdapter(mActivity, mActionBarListener,
+ mActivity.getSupportActionBar(), mActivity.getToolbar(),
+ R.string.enter_contact_name);
+ mActionBarAdapter.setShowHomeIcon(true);
+ initializeActionBarAdapter(savedInstanceState);
+ if (isSearchMode()) {
+ mActionBarAdapter.setFocusOnSearchView();
+ }
+
+ setCheckBoxListListener(new CheckBoxListListener());
+ setOnContactListActionListener(new ContactBrowserActionListener());
+ if (savedInstanceState != null && savedInstanceState.getBoolean(KEY_DELETION_IN_PROGRESS)) {
+ deleteSelectedContacts();
+ }
+
+ setDirectorySearchMode();
+ }
+
+ public void initializeActionBarAdapter(Bundle savedInstanceState) {
+ if (mActionBarAdapter != null) {
+ mActionBarAdapter.initialize(savedInstanceState, mContactsRequest);
+ }
+ }
+
+ private void configureFragment() {
+ if (mFragmentInitialized && !mFromOnNewIntent) {
+ return;
+ }
+
+ mFragmentInitialized = true;
+
+ if (mFromOnNewIntent || !mIsRecreatedInstance) {
+ mFromOnNewIntent = false;
+ configureFragmentForRequest();
+ }
+
+ configureContactListFragment();
+ }
+
+ private void configureFragmentForRequest() {
+ ContactListFilter filter = null;
+ final int actionCode = mContactsRequest.getActionCode();
+ boolean searchMode = mContactsRequest.isSearchMode();
+ switch (actionCode) {
+ case ContactsRequest.ACTION_ALL_CONTACTS:
+ filter = AccountFilterUtil.createContactsFilter(getContext());
+ break;
+ case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
+ filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
+ break;
+
+ case ContactsRequest.ACTION_FREQUENT:
+ case ContactsRequest.ACTION_STREQUENT:
+ case ContactsRequest.ACTION_STARRED:
+ case ContactsRequest.ACTION_VIEW_CONTACT:
+ default:
+ break;
+ }
+
+ if (filter != null) {
+ setContactListFilter(filter);
+ searchMode = false;
+ }
+
+ if (mContactsRequest.getContactUri() != null) {
+ searchMode = false;
+ }
+
+ mActionBarAdapter.setSearchMode(searchMode);
+ configureContactListFragmentForRequest();
+ }
+
+ private void configureContactListFragmentForRequest() {
+ final Uri contactUri = mContactsRequest.getContactUri();
+ if (contactUri != null) {
+ setSelectedContactUri(contactUri);
+ }
+
+ setQueryString(mActionBarAdapter.getQueryString(), true);
+ setVisibleScrollbarEnabled(!isSearchMode());
+ }
+
+ private void setDirectorySearchMode() {
+ if (mContactsRequest.isDirectorySearchEnabled()) {
+ setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
+ } else {
+ setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ configureFragment();
+ maybeShowHamburgerFeatureHighlight();
+ // Re-register the listener, which may have been cleared when onSaveInstanceState was
+ // called. See also: onSaveInstanceState
+ mActionBarAdapter.setListener(mActionBarListener);
+ mDisableOptionItemSelected = false;
+ maybeHideCheckBoxes();
+ }
+
+ private void maybeHideCheckBoxes() {
+ if (!mActionBarAdapter.isSelectionMode()) {
+ displayCheckBoxes(false);
+ }
+ }
+
+ public ActionBarAdapter getActionBarAdapter(){
+ return mActionBarAdapter;
+ }
+
@Override
protected void setSearchMode(boolean flag) {
super.setSearchMode(flag);
@@ -275,4 +658,412 @@
}
}
}
-}
\ No newline at end of file
+
+ public SwipeRefreshLayout getSwipeRefreshLayout() {
+ return mSwipeRefreshLayout;
+ }
+
+ private final class CheckBoxListListener implements OnCheckBoxListActionListener {
+ @Override
+ public void onStartDisplayingCheckBoxes() {
+ mActionBarAdapter.setSelectionMode(true);
+ mActivity.invalidateOptionsMenu();
+ }
+
+ @Override
+ public void onSelectedContactIdsChanged() {
+ mActionBarAdapter.setSelectionCount(getSelectedContactIds().size());
+ mActivity.invalidateOptionsMenu();
+ }
+
+ @Override
+ public void onStopDisplayingCheckBoxes() {
+ mActionBarAdapter.setSelectionMode(false);
+ }
+ }
+
+ public void setFilterAndUpdateTitle(ContactListFilter filter) {
+ setFilterAndUpdateTitle(filter, true);
+ }
+
+ private void setFilterAndUpdateTitle(ContactListFilter filter, boolean restoreSelectedUri) {
+ setContactListFilter(filter);
+ updateListFilter(filter, restoreSelectedUri);
+ mActivity.setTitle(AccountFilterUtil.getActionBarTitleForFilter(mActivity, filter));
+
+ // Determine whether the account has pullToRefresh feature
+ if (Flags.getInstance(getContext()).getBoolean(Experiments.PULL_TO_REFRESH)) {
+ setSwipeRefreshLayoutEnabledOrNot(filter);
+ }
+ }
+
+ private void setSwipeRefreshLayoutEnabledOrNot(ContactListFilter filter) {
+ final SwipeRefreshLayout swipeRefreshLayout = getSwipeRefreshLayout();
+ if (swipeRefreshLayout == null) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Can not load swipeRefreshLayout, swipeRefreshLayout is null");
+ }
+ return;
+ }
+
+ swipeRefreshLayout.setRefreshing(false);
+ swipeRefreshLayout.setEnabled(false);
+
+ if (filter != null && !mActionBarAdapter.isSearchMode()
+ && !mActionBarAdapter.isSelectionMode()) {
+ final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(getContext())
+ .getAccounts(/* contactsWritableOnly */ true);
+ if (filter.isSyncable(accounts)) {
+ swipeRefreshLayout.setEnabled(true);
+ }
+ }
+ }
+
+ private void configureContactListFragment() {
+ // Filter may be changed when activity is in background.
+ setFilterAndUpdateTitle(getFilter());
+ setVerticalScrollbarPosition(getScrollBarPosition());
+ setSelectionVisible(false);
+ mActivity.invalidateOptionsMenu();
+ }
+
+ private int getScrollBarPosition() {
+ final Locale locale = Locale.getDefault();
+ final boolean isRTL =
+ TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL;
+ return isRTL ? View.SCROLLBAR_POSITION_LEFT : View.SCROLLBAR_POSITION_RIGHT;
+ }
+
+ private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
+ ContactBrowserActionListener() {}
+
+ @Override
+ public void onSelectionChange() {
+ }
+
+ @Override
+ public void onViewContactAction(int position, Uri contactLookupUri,
+ boolean isEnterpriseContact) {
+ if (isEnterpriseContact) {
+ // No implicit intent as user may have a different contacts app in work profile.
+ ContactsContract.QuickContact.showQuickContact(getContext(), new Rect(),
+ contactLookupUri, QuickContactActivity.MODE_FULLY_EXPANDED, null);
+ } else {
+ final int previousScreen;
+ if (isSearchMode()) {
+ previousScreen = ScreenEvent.ScreenType.SEARCH;
+ } else {
+ if (isAllContactsFilter(getFilter())) {
+ if (position < getAdapter().getNumberOfFavorites()) {
+ previousScreen = ScreenEvent.ScreenType.FAVORITES;
+ } else {
+ previousScreen = ScreenEvent.ScreenType.ALL_CONTACTS;
+ }
+ } else {
+ previousScreen = ScreenEvent.ScreenType.LIST_ACCOUNT;
+ }
+ }
+
+ Logger.logListEvent(ListEvent.ActionType.CLICK,
+ /* listType */ getListTypeIncludingSearch(),
+ /* count */ getAdapter().getCount(),
+ /* clickedIndex */ position, /* numSelected */ 0);
+
+ ImplicitIntentsUtil.startQuickContact(
+ getActivity(), contactLookupUri, previousScreen);
+ }
+ }
+
+ @Override
+ public void onDeleteContactAction(Uri contactUri) {
+ ContactDeletionInteraction.start(mActivity, contactUri, false);
+ }
+
+ @Override
+ public void onFinishAction() {
+ mActivity.onBackPressed();
+ }
+
+ @Override
+ public void onInvalidSelection() {
+ ContactListFilter filter;
+ ContactListFilter currentFilter = getFilter();
+ if (currentFilter != null
+ && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
+ filter = AccountFilterUtil.createContactsFilter(getContext());
+ setFilterAndUpdateTitle(filter);
+ } else {
+ filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
+ setFilterAndUpdateTitle(filter, /* restoreSelectedUri */ false);
+ }
+ setContactListFilter(filter);
+ }
+ }
+
+ private boolean isAllContactsFilter(ContactListFilter filter) {
+ return filter != null && filter.isContactsFilterType();
+ }
+
+ public void setContactsAvailable(boolean contactsAvailable) {
+ mContactsAvailable = contactsAvailable;
+ }
+
+ /**
+ * Set filter via ContactListFilterController
+ */
+ private void setContactListFilter(ContactListFilter filter) {
+ mContactListFilterController.setContactListFilter(filter,
+ /* persistent */ isAllContactsFilter(filter));
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ if (!mContactsAvailable || mActivity.isInSecondLevel()) {
+ // If contacts aren't available or this fragment is not visible, hide all menu items.
+ return;
+ }
+ super.onCreateOptionsMenu(menu, inflater);
+ inflater.inflate(R.menu.people_options, menu);
+ }
+
+ @Override
+ public void onPrepareOptionsMenu(Menu menu) {
+ mOptionsMenuContactsAvailable = mContactsAvailable;
+ if (!mOptionsMenuContactsAvailable) {
+ return;
+ }
+
+ final boolean isSearchOrSelectionMode = mActionBarAdapter.isSearchMode()
+ || mActionBarAdapter.isSelectionMode();
+ makeMenuItemVisible(menu, R.id.menu_search, !isSearchOrSelectionMode);
+
+ final boolean showSelectedContactOptions = mActionBarAdapter.isSelectionMode()
+ && getSelectedContactIds().size() != 0;
+ makeMenuItemVisible(menu, R.id.menu_share, showSelectedContactOptions);
+ makeMenuItemVisible(menu, R.id.menu_delete, showSelectedContactOptions);
+ final boolean showLinkContactsOptions = mActionBarAdapter.isSelectionMode()
+ && getSelectedContactIds().size() > 1;
+ makeMenuItemVisible(menu, R.id.menu_join, showLinkContactsOptions);
+
+ // Debug options need to be visible even in search mode.
+ makeMenuItemVisible(menu, R.id.export_database, mEnableDebugMenuOptions &&
+ hasExportIntentHandler());
+ }
+
+ private void makeMenuItemVisible(Menu menu, int itemId, boolean visible) {
+ final MenuItem item = menu.findItem(itemId);
+ if (item != null) {
+ item.setVisible(visible);
+ }
+ }
+
+ private boolean hasExportIntentHandler() {
+ final Intent intent = new Intent();
+ intent.setAction("com.android.providers.contacts.DUMP_DATABASE");
+ final List<ResolveInfo> receivers =
+ getContext().getPackageManager().queryIntentActivities(intent,
+ PackageManager.MATCH_DEFAULT_ONLY);
+ return receivers != null && receivers.size() > 0;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (mDisableOptionItemSelected) {
+ return false;
+ }
+
+ switch (item.getItemId()) {
+ case android.R.id.home: {
+ // The home icon on the action bar is pressed
+ if (mActionBarAdapter.isUpShowing()) {
+ // "UP" icon press -- should be treated as "back".
+ mActivity.onBackPressed();
+ }
+ return true;
+ }
+ case R.id.menu_search: {
+ if (!mActionBarAdapter.isSelectionMode()) {
+ mActionBarAdapter.setSearchMode(true);
+ }
+ return true;
+ }
+ case R.id.menu_share: {
+ shareSelectedContacts();
+ return true;
+ }
+ case R.id.menu_join: {
+ Logger.logListEvent(ListEvent.ActionType.LINK,
+ /* listType */ getListTypeIncludingSearch(),
+ /* count */ getAdapter().getCount(), /* clickedIndex */ -1,
+ /* numSelected */ getAdapter().getSelectedContactIds().size());
+ joinSelectedContacts();
+ return true;
+ }
+ case R.id.menu_delete: {
+ deleteSelectedContacts();
+ return true;
+ }
+ case R.id.export_database: {
+ final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE");
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ ImplicitIntentsUtil.startActivityOutsideApp(getContext(), intent);
+ return true;
+ }
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * Share all contacts that are currently selected. This method is pretty inefficient for
+ * handling large numbers of contacts. I don't expect this to be a problem.
+ */
+ private void shareSelectedContacts() {
+ final StringBuilder uriListBuilder = new StringBuilder();
+ for (Long contactId : getSelectedContactIds()) {
+ final Uri contactUri = ContentUris.withAppendedId(
+ ContactsContract.Contacts.CONTENT_URI, contactId);
+ final Uri lookupUri = ContactsContract.Contacts.getLookupUri(
+ getContext().getContentResolver(), contactUri);
+ if (lookupUri == null) {
+ continue;
+ }
+ final List<String> pathSegments = lookupUri.getPathSegments();
+ if (pathSegments.size() < 2) {
+ continue;
+ }
+ final String lookupKey = pathSegments.get(pathSegments.size() - 2);
+ if (uriListBuilder.length() > 0) {
+ uriListBuilder.append(':');
+ }
+ uriListBuilder.append(Uri.encode(lookupKey));
+ }
+ if (uriListBuilder.length() == 0) {
+ return;
+ }
+ final Uri uri = Uri.withAppendedPath(
+ ContactsContract.Contacts.CONTENT_MULTI_VCARD_URI,
+ Uri.encode(uriListBuilder.toString()));
+ final Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.setType(ContactsContract.Contacts.CONTENT_VCARD_TYPE);
+ intent.putExtra(Intent.EXTRA_STREAM, uri);
+ try {
+ startActivityForResult(Intent.createChooser(intent, getResources().getQuantityString(
+ R.plurals.title_share_via,/* quantity */ getSelectedContactIds().size()))
+ , ACTIVITY_REQUEST_CODE_SHARE);
+ } catch (final ActivityNotFoundException ex) {
+ Toast.makeText(getContext(), R.string.share_error, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ private void joinSelectedContacts() {
+ final Context context = getContext();
+ final Intent intent = ContactSaveService.createJoinSeveralContactsIntent(
+ context, getSelectedContactIdsArray());
+ context.startService(intent);
+
+ mActionBarAdapter.setSelectionMode(false);
+ }
+
+ private void deleteSelectedContacts() {
+ final ContactMultiDeletionInteraction multiDeletionInteraction =
+ ContactMultiDeletionInteraction.start(this, getSelectedContactIds());
+ multiDeletionInteraction.setListener(new MultiDeleteListener());
+ mIsDeletionInProgress = true;
+ }
+
+ private final class MultiDeleteListener implements MultiContactDeleteListener {
+ @Override
+ public void onDeletionFinished() {
+ // The parameters count and numSelected are both the number of contacts before deletion.
+ Logger.logListEvent(ListEvent.ActionType.DELETE,
+ /* listType */ getListTypeIncludingSearch(),
+ /* count */ getAdapter().getCount(), /* clickedIndex */ -1,
+ /* numSelected */ getSelectedContactIds().size());
+ mActionBarAdapter.setSelectionMode(false);
+ mIsDeletionInProgress = false;
+ }
+ }
+
+ private int getListTypeIncludingSearch() {
+ return isSearchMode() ? ListEvent.ListType.SEARCH_RESULT : getListType();
+ }
+
+ public void setParameters(ContactsRequest contactsRequest, boolean fromOnNewIntent) {
+ mContactsRequest = contactsRequest;
+ mFromOnNewIntent = fromOnNewIntent;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
+ // anymore
+ case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
+ if (resultCode == Activity.RESULT_OK) {
+ onPickerResult(data);
+ }
+ case ACTIVITY_REQUEST_CODE_SHARE:
+ Logger.logListEvent(ListEvent.ActionType.SHARE,
+ /* listType */ getListTypeIncludingSearch(),
+ /* count */ getAdapter().getCount(), /* clickedIndex */ -1,
+ /* numSelected */ getAdapter().getSelectedContactIds().size());
+
+// TODO fix or remove multipicker code: ag/54762
+// else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
+// // Finish the activity if the sub activity was canceled as back key is used
+// // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
+// finish();
+// }
+// break;
+ }
+ }
+
+ public boolean getOptionsMenuContactsAvailable() {
+ return mOptionsMenuContactsAvailable;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ // Clear the listener to make sure we don't get callbacks after onSaveInstanceState,
+ // in order to avoid doing fragment transactions after it.
+ // TODO Figure out a better way to deal with the issue (ag/120686).
+ if (mActionBarAdapter != null) {
+ mActionBarAdapter.setListener(null);
+ mActionBarAdapter.onSaveInstanceState(outState);
+ }
+ mDisableOptionItemSelected = true;
+ outState.putBoolean(KEY_DELETION_IN_PROGRESS, mIsDeletionInProgress);
+ }
+
+ @Override
+ public void onPause() {
+ mOptionsMenuContactsAvailable = false;
+ super.onPause();
+ }
+
+ @Override
+ public void onDestroy() {
+ if (mActionBarAdapter != null) {
+ mActionBarAdapter.setListener(null);
+ }
+ super.onDestroy();
+ }
+
+ public boolean onKeyDown(int unicodeChar) {
+ if (mActionBarAdapter.isSelectionMode()) {
+ // Ignore keyboard input when in selection mode.
+ return true;
+ }
+
+ if (!mActionBarAdapter.isSearchMode()) {
+ final String query = new String(new int[]{unicodeChar}, 0, 1);
+ mActionBarAdapter.setSearchMode(true);
+ mActionBarAdapter.setQueryString(query);
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/src/com/android/contacts/list/MultiSelectContactsListFragment.java b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
index f5c6d34..41fd11e 100644
--- a/src/com/android/contacts/list/MultiSelectContactsListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
@@ -34,6 +34,7 @@
import android.widget.TextView;
import com.android.contacts.R;
+import com.android.contacts.activities.ActionBarAdapter;
import com.android.contacts.common.list.ContactEntryListFragment;
import com.android.contacts.common.list.MultiSelectEntryContactListAdapter;
import com.android.contacts.common.list.MultiSelectEntryContactListAdapter.SelectedContactsListener;
@@ -129,13 +130,18 @@
final TreeSet<Long> selectedContactIds = (TreeSet<Long>)
savedInstanceState.getSerializable(EXTRA_KEY_SELECTED_CONTACTS);
getAdapter().setSelectedContactIds(selectedContactIds);
- if (mCheckBoxListListener != null) {
- mCheckBoxListListener.onSelectedContactIdsChanged();
- }
mSearchResultClicked = savedInstanceState.getBoolean(KEY_SEARCH_RESULT_CLICKED);
}
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ if (mCheckBoxListListener != null) {
+ mCheckBoxListListener.onSelectedContactIdsChanged();
+ }
+ }
+
public TreeSet<Long> getSelectedContactIds() {
return getAdapter().getSelectedContactIds();
}
@@ -453,4 +459,10 @@
listView.getPaddingBottom());
}
+ /**
+ * Returns the {@link ActionBarAdapter} object associated with list fragment.
+ */
+ public ActionBarAdapter getActionBarAdapter() {
+ return null;
+ }
}
diff --git a/src/com/android/contacts/list/OnContactsUnavailableActionListener.java b/src/com/android/contacts/list/OnContactsUnavailableActionListener.java
deleted file mode 100644
index cc381e4..0000000
--- a/src/com/android/contacts/list/OnContactsUnavailableActionListener.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.contacts.list;
-
-/**
- * Action callbacks that can be sent by the "contacts unavailable" fragment.
- */
-public interface OnContactsUnavailableActionListener {
-
- /**
- * Creates a new contact.
- */
- void onCreateNewContactAction();
-
- /**
- * Initiates addition of a contacts account.
- */
- void onAddAccountAction();
-
- /**
- * Initiates contact import from a file.
- */
- void onImportContactsFromFileAction();
-}
diff --git a/src/com/android/contacts/quickcontact/InvisibleContactUtil.java b/src/com/android/contacts/quickcontact/InvisibleContactUtil.java
index c8bb98d..b31c07b 100644
--- a/src/com/android/contacts/quickcontact/InvisibleContactUtil.java
+++ b/src/com/android/contacts/quickcontact/InvisibleContactUtil.java
@@ -1,7 +1,9 @@
package com.android.contacts.quickcontact;
-import com.google.common.collect.Iterables;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
import com.android.contacts.ContactSaveService;
import com.android.contacts.common.model.AccountTypeManager;
@@ -17,9 +19,7 @@
import com.android.contacts.common.model.dataitem.GroupMembershipDataItem;
import com.android.contacts.group.GroupMetaData;
-import android.content.Context;
-import android.content.Intent;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
+import com.google.common.collect.Iterables;
import java.util.List;
@@ -70,14 +70,28 @@
}
public static void addToDefaultGroup(Contact contactData, Context context) {
+ final RawContactDeltaList contactDeltaList = contactData.createRawContactDeltaList();
+ if (markAddToDefaultGroup(contactData, contactDeltaList, context)) {
+ // Fire off the intent. we don't need a callback, as the database listener
+ // should update the ui
+ final Intent intent = ContactSaveService.createSaveContactIntent(
+ context,
+ contactDeltaList, "", 0, false, QuickContactActivity.class,
+ Intent.ACTION_VIEW, null, /* joinContactIdExtraKey =*/ null,
+ /* joinContactId =*/ null);
+ ContactSaveService.startService(context, intent);
+ }
+ }
+
+ public static boolean markAddToDefaultGroup(Contact contactData,
+ RawContactDeltaList rawContactDeltaList, Context context) {
final long defaultGroupId = getDefaultGroupId(contactData.getGroupMetaData());
// there should always be a default group (otherwise the button would be invisible),
// but let's be safe here
- if (defaultGroupId == -1) return;
+ if (defaultGroupId == -1) return false;
// add the group membership to the current state
- final RawContactDeltaList contactDeltaList = contactData.createRawContactDeltaList();
- final RawContactDelta rawContactEntityDelta = contactDeltaList.get(0);
+ final RawContactDelta rawContactEntityDelta = rawContactDeltaList.get(0);
final AccountTypeManager accountTypes = AccountTypeManager.getInstance(
context);
@@ -86,17 +100,9 @@
GroupMembership.CONTENT_ITEM_TYPE);
final ValuesDelta entry = RawContactModifier.insertChild(rawContactEntityDelta,
groupMembershipKind);
- if (entry == null) return;
+ if (entry == null) return false;
entry.setGroupRowId(defaultGroupId);
-
- // and fire off the intent. we don't need a callback, as the database listener
- // should update the ui
- final Intent intent = ContactSaveService.createSaveContactIntent(
- context,
- contactDeltaList, "", 0, false, QuickContactActivity.class,
- Intent.ACTION_VIEW, null, /* joinContactIdExtraKey =*/ null,
- /* joinContactId =*/ null);
- ContactSaveService.startService(context, intent);
+ return true;
}
/** return default group id or -1 if no group or several groups are marked as default */
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 4ab1953..87c339a 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -22,7 +22,6 @@
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.app.Activity;
-import android.app.Fragment;
import android.app.LoaderManager.LoaderCallbacks;
import android.app.SearchManager;
import android.content.ActivityNotFoundException;
@@ -108,7 +107,8 @@
import com.android.contacts.DynamicShortcuts;
import com.android.contacts.NfcHandler;
import com.android.contacts.R;
-import com.android.contacts.activities.ContactEditorBaseActivity;
+import com.android.contacts.activities.ContactEditorActivity;
+import com.android.contacts.activities.ContactSelectionActivity;
import com.android.contacts.common.CallUtil;
import com.android.contacts.common.ClipboardUtils;
import com.android.contacts.common.Collapser;
@@ -120,7 +120,6 @@
import com.android.contacts.common.compat.EventCompat;
import com.android.contacts.common.compat.MultiWindowCompat;
import com.android.contacts.common.dialog.CallSubjectDialog;
-import com.android.contacts.common.editor.SelectAccountDialogFragment;
import com.android.contacts.common.interactions.TouchPointManager;
import com.android.contacts.common.lettertiles.LetterTileDrawable;
import com.android.contacts.common.list.ShortcutIntentBuilder;
@@ -134,9 +133,9 @@
import com.android.contacts.common.model.Contact;
import com.android.contacts.common.model.ContactLoader;
import com.android.contacts.common.model.RawContact;
+import com.android.contacts.common.model.RawContactDeltaList;
import com.android.contacts.common.model.ValuesDelta;
import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.model.dataitem.CustomDataItem;
import com.android.contacts.common.model.dataitem.DataItem;
import com.android.contacts.common.model.dataitem.DataKind;
@@ -164,11 +163,13 @@
import com.android.contacts.editor.AggregationSuggestionEngine.Suggestion;
import com.android.contacts.editor.ContactEditorFragment;
import com.android.contacts.editor.EditorIntents;
+import com.android.contacts.editor.SplitContactConfirmationDialogFragment;
import com.android.contacts.interactions.CalendarInteractionsLoader;
import com.android.contacts.interactions.CallLogInteractionsLoader;
import com.android.contacts.interactions.ContactDeletionInteraction;
import com.android.contacts.interactions.ContactInteraction;
import com.android.contacts.interactions.SmsInteractionsLoader;
+import com.android.contacts.list.UiIntentActions;
import com.android.contacts.quickcontact.ExpandingEntryCardView.Entry;
import com.android.contacts.quickcontact.ExpandingEntryCardView.EntryContextMenuInfo;
import com.android.contacts.quickcontact.ExpandingEntryCardView.EntryTag;
@@ -204,8 +205,8 @@
* data asynchronously, and then shows a popup with details centered around
* {@link Intent#getSourceBounds()}.
*/
-public class QuickContactActivity extends ContactsActivity
- implements AggregationSuggestionEngine.Listener {
+public class QuickContactActivity extends ContactsActivity implements
+ AggregationSuggestionEngine.Listener, SplitContactConfirmationDialogFragment.Listener {
/**
* QuickContacts immediately takes up the full screen. All possible information is shown.
@@ -237,11 +238,14 @@
private static final int SCRIM_COLOR = Color.argb(0xC8, 0, 0, 0);
private static final int REQUEST_CODE_CONTACT_SELECTION_ACTIVITY = 2;
private static final String MIMETYPE_SMS = "vnd.android-dir/mms-sms";
+ private static final int REQUEST_CODE_JOIN = 3;
/** This is the Intent action to install a shortcut in the launcher. */
private static final String ACTION_INSTALL_SHORTCUT =
"com.android.launcher.action.INSTALL_SHORTCUT";
+ public static final String ACTION_SPLIT_COMPLETED = "splitCompleted";
+
@SuppressWarnings("deprecation")
private static final String LEGACY_AUTHORITY = android.provider.Contacts.AUTHORITY;
@@ -307,7 +311,6 @@
private String mPermissionExplanationCardSubHeader = "";
private MultiShrinkScroller mScroller;
- private SelectAccountDialogFragmentListener mSelectAccountFragmentListener;
private AsyncTask<Void, Void, Cp2DataCardModel> mEntriesAndActionsTask;
private AsyncTask<Void, Void, Void> mRecentDataTask;
@@ -799,36 +802,6 @@
}
}
- /**
- * Headless fragment used to handle account selection callbacks invoked from
- * {@link DirectoryContactUtil}.
- */
- public static class SelectAccountDialogFragmentListener extends Fragment
- implements SelectAccountDialogFragment.Listener {
-
- private QuickContactActivity mQuickContactActivity;
-
- public SelectAccountDialogFragmentListener() {}
-
- @Override
- public void onAccountChosen(AccountWithDataSet account, Bundle extraArgs) {
- DirectoryContactUtil.createCopy(mQuickContactActivity.mContactData.getContentValues(),
- account, mQuickContactActivity);
- }
-
- @Override
- public void onAccountSelectorCancelled() {}
-
- /**
- * Set the parent activity. Since rotation can cause this fragment to be used across
- * more than one activity instance, we need to explicitly set this value instead
- * of making this class non-static.
- */
- public void setQuickContactActivity(QuickContactActivity quickContactActivity) {
- mQuickContactActivity = quickContactActivity;
- }
- }
-
final MultiShrinkScrollerListener mMultiShrinkScrollerListener
= new MultiShrinkScrollerListener() {
@Override
@@ -978,6 +951,9 @@
}
mIsRecreatedInstance = savedInstanceState != null;
+ if (mIsRecreatedInstance) {
+ mPreviousContactId = savedInstanceState.getLong(KEY_PREVIOUS_CONTACT_ID);
+ }
mShouldLog = true;
// There're 3 states for each permission:
@@ -1150,16 +1126,6 @@
setHeaderNameText(R.string.missing_name);
- mSelectAccountFragmentListener= (SelectAccountDialogFragmentListener) getFragmentManager()
- .findFragmentByTag(FRAGMENT_TAG_SELECT_ACCOUNT);
- if (mSelectAccountFragmentListener == null) {
- mSelectAccountFragmentListener = new SelectAccountDialogFragmentListener();
- getFragmentManager().beginTransaction().add(0, mSelectAccountFragmentListener,
- FRAGMENT_TAG_SELECT_ACCOUNT).commit();
- mSelectAccountFragmentListener.setRetainInstance(true);
- }
- mSelectAccountFragmentListener.setQuickContactActivity(this);
-
SchedulingUtils.doOnPreDraw(mScroller, /* drawNextFrame = */ true,
new Runnable() {
@Override
@@ -1210,13 +1176,21 @@
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
final boolean deletedOrSplit = requestCode == REQUEST_CODE_CONTACT_EDITOR_ACTIVITY &&
(resultCode == ContactDeletionInteraction.RESULT_CODE_DELETED ||
- resultCode == ContactEditorBaseActivity.RESULT_CODE_SPLIT);
+ resultCode == ContactEditorActivity.RESULT_CODE_SPLIT);
setResult(resultCode, data);
if (deletedOrSplit) {
finish();
} else if (requestCode == REQUEST_CODE_CONTACT_SELECTION_ACTIVITY &&
resultCode != RESULT_CANCELED) {
processIntent(data);
+ } else if (requestCode == REQUEST_CODE_JOIN) {
+ // Ignore failed requests
+ if (resultCode != Activity.RESULT_OK) {
+ processIntent(data);
+ }
+ if (data != null) {
+ joinAggregate(ContentUris.parseId(data.getData()));
+ }
}
}
@@ -1248,9 +1222,15 @@
finish();
return;
}
+ if (ACTION_SPLIT_COMPLETED.equals(intent.getAction())) {
+ Toast.makeText(this, R.string.contactUnlinkedToast, Toast.LENGTH_SHORT).show();
+ finish();
+ return;
+ }
+
Uri lookupUri = intent.getData();
if (intent.getBooleanExtra(EXTRA_CONTACT_EDITED, false)) {
- setResult(ContactEditorBaseActivity.RESULT_CODE_EDITED);
+ setResult(ContactEditorActivity.RESULT_CODE_EDITED);
}
// Check to see whether it comes from the old version.
@@ -2895,7 +2875,7 @@
}
private Intent getEditContactIntent() {
- return EditorIntents.createCompactEditContactIntent(QuickContactActivity.this,
+ return EditorIntents.createEditContactIntent(QuickContactActivity.this,
mContactData.getLookupUri(),
mHasComputedThemeColor
? new MaterialPalette(mColorFilterColor, mStatusBarColor) : null,
@@ -3021,6 +3001,14 @@
editMenuItem.setVisible(false);
}
+ final MenuItem splitMenuItem = menu.findItem(R.id.menu_split);
+ splitMenuItem.setVisible(isContactEditable() && !mContactData.isUserProfile()
+ && mContactData.isMultipleRawContacts());
+
+ final MenuItem joinMenuItem = menu.findItem(R.id.menu_join);
+ joinMenuItem.setVisible(!InvisibleContactUtil.isInvisibleAndAddable(mContactData, this)
+ && isContactEditable() && !mContactData.isUserProfile());
+
final MenuItem deleteMenuItem = menu.findItem(R.id.menu_delete);
deleteMenuItem.setVisible(isContactEditable() && !mContactData.isUserProfile());
@@ -3094,8 +3082,8 @@
intent.putExtra(Intents.Insert.DATA, values);
// If the contact can only export to the same account, add it to the intent.
- // Otherwise the ContactEditorFragment will show a dialog for selecting an
- // account.
+ // Otherwise the ContactEditorFragment will show a dialog for selecting
+ // an account.
if (mContactData.getDirectoryExportSupport() ==
Directory.EXPORT_SUPPORT_SAME_ACCOUNT_ONLY) {
intent.putExtra(Intents.Insert.EXTRA_ACCOUNT,
@@ -3107,7 +3095,8 @@
// Add this flag to disable the delete menu option on directory contact joins
// with local contacts. The delete option is ambiguous when joining contacts.
- intent.putExtra(ContactEditorFragment.INTENT_EXTRA_DISABLE_DELETE_MENU_OPTION,
+ intent.putExtra(
+ ContactEditorFragment.INTENT_EXTRA_DISABLE_DELETE_MENU_OPTION,
true);
intent.setPackage(getPackageName());
@@ -3122,6 +3111,10 @@
editContact();
}
return true;
+ case R.id.menu_split:
+ return doSplitContactAction();
+ case R.id.menu_join:
+ return doJoinContactAction();
case R.id.menu_delete:
Logger.logQuickContactEvent(mReferrer, mContactType, CardType.UNKNOWN_CARD,
ActionType.REMOVE, /* thirdPartyAction */ null);
@@ -3154,4 +3147,52 @@
return super.onOptionsItemSelected(item);
}
}
+
+ private boolean doJoinContactAction() {
+ if (mContactData == null) return false;
+
+ mPreviousContactId = mContactData.getId();
+ final Intent intent = new Intent(this, ContactSelectionActivity.class);
+ intent.setAction(UiIntentActions.PICK_JOIN_CONTACT_ACTION);
+ intent.putExtra(UiIntentActions.TARGET_CONTACT_ID_EXTRA_KEY, mPreviousContactId);
+ startActivityForResult(intent, REQUEST_CODE_JOIN);
+ return true;
+ }
+
+ /**
+ * Performs aggregation with the contact selected by the user from suggestions or A-Z list.
+ */
+ private void joinAggregate(final long contactId) {
+ final Intent intent = ContactSaveService.createJoinContactsIntent(
+ this, mPreviousContactId, contactId, QuickContactActivity.class,
+ Intent.ACTION_VIEW);
+ this.startService(intent);
+ }
+
+ private boolean doSplitContactAction() {
+ if (mContactData == null) return false;
+
+ final SplitContactConfirmationDialogFragment dialog = new
+ SplitContactConfirmationDialogFragment();
+ dialog.show(getFragmentManager(), "splitContact");
+ return true;
+ }
+
+ @Override
+ public void onSplitContactConfirmed(boolean hasPendingChanges) {
+ final RawContactDeltaList rawContactDeltaList= mContactData.createRawContactDeltaList();
+ rawContactDeltaList.markRawContactsForSplitting();
+ final Intent intent = ContactSaveService.createSaveContactIntent(this,
+ rawContactDeltaList,
+ /* saveModeExtraKey */ "",
+ /* saveMode */ 0,
+ mContactData.isUserProfile(),
+ ((Activity) this).getClass(),
+ ACTION_SPLIT_COMPLETED,
+ /* updatedPhotos */ null,
+ /* joinContactIdExtraKey =*/ null,
+ /* joinContactId =*/ null);
+ ContactSaveService.startService(this, intent,
+ ContactEditorActivity.ContactEditor.SaveMode.SPLIT);
+ }
}
diff --git a/src/com/android/contacts/util/SyncUtil.java b/src/com/android/contacts/util/SyncUtil.java
new file mode 100644
index 0000000..cef2223
--- /dev/null
+++ b/src/com/android/contacts/util/SyncUtil.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2016 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.util;
+
+import android.accounts.Account;
+import android.content.ContentResolver;
+import android.provider.ContactsContract;
+
+import com.android.contacts.common.model.account.GoogleAccountType;
+
+import java.util.List;
+
+/**
+ * Utilities related to sync.
+ */
+public final class SyncUtil {
+ private static final String TAG = "SyncUtil";
+
+ private SyncUtil() {
+ }
+
+ public static final boolean isSyncStatusPendingOrActive(Account account) {
+ if (account == null) {
+ return false;
+ }
+ return ContentResolver.isSyncPending(account, ContactsContract.AUTHORITY)
+ || ContentResolver.isSyncActive(account, ContactsContract.AUTHORITY);
+ }
+
+ /**
+ * Returns true if the given Google account is not syncable.
+ */
+ public static final boolean isUnsyncableGoogleAccount(Account account) {
+ if (account == null || !GoogleAccountType.ACCOUNT_TYPE.equals(account.type)) {
+ return false;
+ }
+ return ContentResolver.getIsSyncable(account, ContactsContract.AUTHORITY) <= 0;
+ }
+}
diff --git a/src/com/android/contacts/widget/FloatingActionButtonBehavior.java b/src/com/android/contacts/widget/FloatingActionButtonBehavior.java
deleted file mode 100644
index 44ca81e..0000000
--- a/src/com/android/contacts/widget/FloatingActionButtonBehavior.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2015 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.widget;
-
-import android.content.Context;
-import android.support.design.widget.CoordinatorLayout;
-import android.support.design.widget.Snackbar.SnackbarLayout;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.FrameLayout;
-
-/**
- * Implements custom behavior for the movement of the FAB in response to the Snackbar.
- * Because we are not using the design framework FloatingActionButton widget, we need to manually
- * implement the Material Design behavior of having the FAB translate upward and downward with
- * the appearance and disappearance of a Snackbar.
- */
-public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<FrameLayout> {
-
- public FloatingActionButtonBehavior() {
- }
-
- public FloatingActionButtonBehavior(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- public boolean layoutDependsOn(CoordinatorLayout parent, FrameLayout child, View dependency) {
- return dependency instanceof SnackbarLayout;
- }
-
- @Override
- public boolean onDependentViewChanged(CoordinatorLayout parent, FrameLayout child,
- View dependency) {
- float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
- child.setTranslationY(translationY);
- return true;
- }
-}
diff --git a/tests/Android.mk b/tests/Android.mk
index 6b31593..1148966 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -5,8 +5,6 @@
LOCAL_MODULE_TAGS := tests
LOCAL_CERTIFICATE := shared
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
-
LOCAL_SRC_FILES := $(call all-java-files-under, src)
res_dirs := res ../res-icons
@@ -20,6 +18,7 @@
LOCAL_MIN_SDK_VERSION := 21
LOCAL_STATIC_JAVA_LIBRARIES += \
+ android-support-test \
hamcrest-library \
mockito-target-minus-junit4
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 65be28a..4e53114 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -98,6 +98,11 @@
android:label="Contacts app tests">
</instrumentation>
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.contacts"
+ android:label="Contacts app tests">
+ </instrumentation>
+
<instrumentation android:name="com.android.contacts.ContactsLaunchPerformance"
android:targetPackage="com.android.contacts"
android:label="Contacts launch performance">
diff --git a/tests/res/xml/contacts_contactsdatakind.xml b/tests/res/xml/contacts_contactsdatakind.xml
index c289e6e..c7d3bd9 100644
--- a/tests/res/xml/contacts_contactsdatakind.xml
+++ b/tests/res/xml/contacts_contactsdatakind.xml
@@ -30,7 +30,6 @@
>
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsPrefix="true"
supportsMiddleName="true"
supportsSuffix="true"
diff --git a/tests/res/xml/contacts_fallback.xml b/tests/res/xml/contacts_fallback.xml
index 7034d5e..7e731f4 100644
--- a/tests/res/xml/contacts_fallback.xml
+++ b/tests/res/xml/contacts_fallback.xml
@@ -30,7 +30,6 @@
>
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsPrefix="true"
supportsMiddleName="true"
supportsSuffix="true"
diff --git a/tests/res/xml/missing_contacts_base.xml b/tests/res/xml/missing_contacts_base.xml
index 2c9aa6d..66917b3 100644
--- a/tests/res/xml/missing_contacts_base.xml
+++ b/tests/res/xml/missing_contacts_base.xml
@@ -25,7 +25,6 @@
<EditSchema>
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsPrefix="true"
supportsMiddleName="true"
supportsSuffix="true"
diff --git a/tests/res/xml/missing_contacts_name_attr1.xml b/tests/res/xml/missing_contacts_name_attr1.xml
deleted file mode 100644
index b7b0f19..0000000
--- a/tests/res/xml/missing_contacts_name_attr1.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?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.
- */
--->
-
-<!-- XML for must-have checks. Missing one of the "support*" attributes". -->
-
-<ContactsAccountType
- xmlns:android="http://schemas.android.com/apk/res/android"
- >
- <EditSchema>
- <DataKind kind="name"
- maxOccurs="1"
- supportsPrefix="true"
- supportsMiddleName="true"
- supportsSuffix="true"
- supportsPhoneticFamilyName="true"
- supportsPhoneticMiddleName="true"
- supportsPhoneticGivenName="true"
- />
- <DataKind kind="photo" maxOccurs="1" />
- </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/missing_contacts_name_attr2.xml b/tests/res/xml/missing_contacts_name_attr2.xml
index 41be9e8..77f25d2 100644
--- a/tests/res/xml/missing_contacts_name_attr2.xml
+++ b/tests/res/xml/missing_contacts_name_attr2.xml
@@ -25,7 +25,6 @@
<EditSchema>
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsMiddleName="true"
supportsSuffix="true"
supportsPhoneticFamilyName="true"
diff --git a/tests/res/xml/missing_contacts_name_attr3.xml b/tests/res/xml/missing_contacts_name_attr3.xml
index e639a76..d06c4c1 100644
--- a/tests/res/xml/missing_contacts_name_attr3.xml
+++ b/tests/res/xml/missing_contacts_name_attr3.xml
@@ -25,7 +25,6 @@
<EditSchema>
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsPrefix="true"
supportsSuffix="true"
supportsPhoneticFamilyName="true"
diff --git a/tests/res/xml/missing_contacts_name_attr4.xml b/tests/res/xml/missing_contacts_name_attr4.xml
index b42cdcd..6d597fe 100644
--- a/tests/res/xml/missing_contacts_name_attr4.xml
+++ b/tests/res/xml/missing_contacts_name_attr4.xml
@@ -25,7 +25,6 @@
<EditSchema>
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsPrefix="true"
supportsMiddleName="true"
supportsPhoneticFamilyName="true"
diff --git a/tests/res/xml/missing_contacts_name_attr5.xml b/tests/res/xml/missing_contacts_name_attr5.xml
index 3778d2f..cf2d5cc 100644
--- a/tests/res/xml/missing_contacts_name_attr5.xml
+++ b/tests/res/xml/missing_contacts_name_attr5.xml
@@ -25,7 +25,6 @@
<EditSchema>
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsPrefix="true"
supportsMiddleName="true"
supportsSuffix="true"
diff --git a/tests/res/xml/missing_contacts_name_attr6.xml b/tests/res/xml/missing_contacts_name_attr6.xml
index b3a3411..cfa589b 100644
--- a/tests/res/xml/missing_contacts_name_attr6.xml
+++ b/tests/res/xml/missing_contacts_name_attr6.xml
@@ -25,7 +25,6 @@
<EditSchema>
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsPrefix="true"
supportsMiddleName="true"
supportsSuffix="true"
diff --git a/tests/res/xml/missing_contacts_name_attr7.xml b/tests/res/xml/missing_contacts_name_attr7.xml
index c87e4f1..7b08706 100644
--- a/tests/res/xml/missing_contacts_name_attr7.xml
+++ b/tests/res/xml/missing_contacts_name_attr7.xml
@@ -25,7 +25,6 @@
<EditSchema>
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsPrefix="true"
supportsMiddleName="true"
supportsSuffix="true"
diff --git a/tests/res/xml/missing_contacts_photo.xml b/tests/res/xml/missing_contacts_photo.xml
index 87f4fc6..d73529c 100644
--- a/tests/res/xml/missing_contacts_photo.xml
+++ b/tests/res/xml/missing_contacts_photo.xml
@@ -25,7 +25,6 @@
<EditSchema>
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsPrefix="true"
supportsMiddleName="true"
supportsSuffix="true"
diff --git a/tests/res/xml/test_basic_contacts.xml b/tests/res/xml/test_basic_contacts.xml
index 0047204..56e6e16 100644
--- a/tests/res/xml/test_basic_contacts.xml
+++ b/tests/res/xml/test_basic_contacts.xml
@@ -56,7 +56,6 @@
<!-- Fallback/Google definition. Supports all. -->
<DataKind kind="name"
maxOccurs="1"
- supportsDisplayName="true"
supportsPrefix="true"
supportsMiddleName="true"
supportsSuffix="true"
@@ -68,7 +67,6 @@
<!-- Exchange definition. No display-name, no phonetic-middle.
<DataKind kind="name"
- supportsDisplayName="false"
supportsPrefix="true"
supportsMiddleName="true"
supportsSuffix="true"
diff --git a/tests/src/com/android/contacts/common/RawContactModifierTests.java b/tests/src/com/android/contacts/common/RawContactModifierTests.java
index 755838b..9765af6 100644
--- a/tests/src/com/android/contacts/common/RawContactModifierTests.java
+++ b/tests/src/com/android/contacts/common/RawContactModifierTests.java
@@ -830,7 +830,7 @@
assertEquals("Expected to create organization", 1, count);
}
- public void testMigrateWithDisplayNameFromGoogleToExchange1() {
+ public void testMigrateNameFromGoogleToExchange() {
AccountType oldAccountType = new GoogleAccountType(getContext(), "");
AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
DataKind kind = newAccountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE);
@@ -866,91 +866,6 @@
assertEquals("PHONETIC_GIVEN", output.getAsString(StructuredName.PHONETIC_GIVEN_NAME));
}
- public void testMigrateWithDisplayNameFromGoogleToExchange2() {
- AccountType oldAccountType = new GoogleAccountType(getContext(), "");
- AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
- DataKind kind = newAccountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE);
-
- ContactsMockContext context = new ContactsMockContext(getContext());
- MockContentProvider provider = context.getContactsProvider();
-
- String inputDisplayName = "prefix given middle family suffix";
- // The method will ask the provider to split/join StructuredName.
- Uri uriForBuildDisplayName =
- ContactsContract.AUTHORITY_URI
- .buildUpon()
- .appendPath("complete_name")
- .appendQueryParameter(StructuredName.DISPLAY_NAME, inputDisplayName)
- .build();
- provider.expectQuery(uriForBuildDisplayName)
- .returnRow("prefix", "given", "middle", "family", "suffix")
- .withProjection(StructuredName.PREFIX, StructuredName.GIVEN_NAME,
- StructuredName.MIDDLE_NAME, StructuredName.FAMILY_NAME,
- StructuredName.SUFFIX);
-
- RawContactDelta oldState = new RawContactDelta();
- ContentValues mockNameValues = new ContentValues();
- mockNameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
- mockNameValues.put(StructuredName.DISPLAY_NAME, inputDisplayName);
- oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
-
- RawContactDelta newState = new RawContactDelta();
- RawContactModifier.migrateStructuredName(context, oldState, newState, kind);
- List<ValuesDelta> list = newState.getMimeEntries(StructuredName.CONTENT_ITEM_TYPE);
- assertEquals(1, list.size());
-
- ContentValues outputValues = list.get(0).getAfter();
- assertEquals("prefix", outputValues.getAsString(StructuredName.PREFIX));
- assertEquals("given", outputValues.getAsString(StructuredName.GIVEN_NAME));
- assertEquals("middle", outputValues.getAsString(StructuredName.MIDDLE_NAME));
- assertEquals("family", outputValues.getAsString(StructuredName.FAMILY_NAME));
- assertEquals("suffix", outputValues.getAsString(StructuredName.SUFFIX));
- }
-
- public void testMigrateWithStructuredNameFromExchangeToGoogle() {
- AccountType oldAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
- AccountType newAccountType = new GoogleAccountType(getContext(), "");
- DataKind kind = newAccountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE);
-
- ContactsMockContext context = new ContactsMockContext(getContext());
- MockContentProvider provider = context.getContactsProvider();
-
- // The method will ask the provider to split/join StructuredName.
- Uri uriForBuildDisplayName =
- ContactsContract.AUTHORITY_URI
- .buildUpon()
- .appendPath("complete_name")
- .appendQueryParameter(StructuredName.PREFIX, "prefix")
- .appendQueryParameter(StructuredName.GIVEN_NAME, "given")
- .appendQueryParameter(StructuredName.MIDDLE_NAME, "middle")
- .appendQueryParameter(StructuredName.FAMILY_NAME, "family")
- .appendQueryParameter(StructuredName.SUFFIX, "suffix")
- .build();
- provider.expectQuery(uriForBuildDisplayName)
- .returnRow("prefix given middle family suffix")
- .withProjection(StructuredName.DISPLAY_NAME);
-
- RawContactDelta oldState = new RawContactDelta();
- ContentValues mockNameValues = new ContentValues();
- mockNameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
- mockNameValues.put(StructuredName.PREFIX, "prefix");
- mockNameValues.put(StructuredName.GIVEN_NAME, "given");
- mockNameValues.put(StructuredName.MIDDLE_NAME, "middle");
- mockNameValues.put(StructuredName.FAMILY_NAME, "family");
- mockNameValues.put(StructuredName.SUFFIX, "suffix");
- oldState.addEntry(ValuesDelta.fromAfter(mockNameValues));
-
- RawContactDelta newState = new RawContactDelta();
- RawContactModifier.migrateStructuredName(context, oldState, newState, kind);
-
- List<ValuesDelta> list = newState.getMimeEntries(StructuredName.CONTENT_ITEM_TYPE);
- assertNotNull(list);
- assertEquals(1, list.size());
- ContentValues outputValues = list.get(0).getAfter();
- assertEquals("prefix given middle family suffix",
- outputValues.getAsString(StructuredName.DISPLAY_NAME));
- }
-
public void testMigratePostalFromGoogleToExchange() {
AccountType oldAccountType = new GoogleAccountType(getContext(), "");
AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE);
diff --git a/tests/src/com/android/contacts/common/model/AccountTypeManagerTest.java b/tests/src/com/android/contacts/common/model/AccountTypeManagerTest.java
index b8ebdd2..82200ed 100644
--- a/tests/src/com/android/contacts/common/model/AccountTypeManagerTest.java
+++ b/tests/src/com/android/contacts/common/model/AccountTypeManagerTest.java
@@ -16,16 +16,26 @@
package com.android.contacts.common.model;
+import android.accounts.Account;
+import android.accounts.AccountManager;
import android.content.Context;
+import android.content.SharedPreferences;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.common.model.account.AccountTypeWithDataSet;
import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.GoogleAccountType;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import static org.mockito.Mockito.when;
+
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
@@ -39,6 +49,23 @@
*/
@SmallTest
public class AccountTypeManagerTest extends AndroidTestCase {
+
+ private static final Account[] ACCOUNTS = new Account[2];
+ static {
+ ACCOUNTS[0] = new Account("name1", GoogleAccountType.ACCOUNT_TYPE);
+ ACCOUNTS[1] = new Account("name2", GoogleAccountType.ACCOUNT_TYPE);
+ }
+
+ @Mock private AccountManager mAccountManager;
+ @Mock private SharedPreferences mPrefs;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ System.setProperty("dexmaker.dexcache", getContext().getCacheDir().getPath());
+ MockitoAnnotations.initMocks(this);
+ }
+
public void testFindAllInvitableAccountTypes() {
final Context c = getContext();
@@ -195,4 +222,52 @@
return false;
}
}
+
+
+ public void testGetDefaultAccount_NoAccounts() {
+ assertNull(getDefaultGoogleAccountName());
+ }
+
+ public void testGetDefaultAccount_NoAccounts_DefaultPreferenceSet() {
+ when(mPrefs.getString(Mockito.anyString(), Mockito.anyString())).thenReturn(
+ getDefaultAccountPreference("name1", GoogleAccountType.ACCOUNT_TYPE));
+ assertNull(getDefaultGoogleAccountName());
+ }
+
+ public void testGetDefaultAccount_NoDefaultAccountPreferenceSet() {
+ when(mAccountManager.getAccountsByType(Mockito.anyString())).thenReturn(ACCOUNTS);
+ assertEquals("name1", getDefaultGoogleAccountName());
+ }
+
+ public void testGetDefaultAccount_DefaultAccountPreferenceSet() {
+ when(mAccountManager.getAccountsByType(Mockito.anyString())).thenReturn(ACCOUNTS);
+ when(mPrefs.getString(Mockito.anyString(), Mockito.anyString())).thenReturn(
+ getDefaultAccountPreference("name2", GoogleAccountType.ACCOUNT_TYPE));
+ assertEquals("name2", getDefaultGoogleAccountName());
+ }
+
+ public void testGetDefaultAccount_DefaultAccountPreferenceSet_NonGoogleAccountType() {
+ when(mAccountManager.getAccountsByType(Mockito.anyString())).thenReturn(ACCOUNTS);
+ when(mPrefs.getString(Mockito.anyString(), Mockito.anyString())).thenReturn(
+ getDefaultAccountPreference("name3", "type3"));
+ assertEquals("name1", getDefaultGoogleAccountName());
+ }
+
+ public void testGetDefaultAccount_DefaultAccountPreferenceSet_UnknownName() {
+ when(mAccountManager.getAccountsByType(Mockito.anyString())).thenReturn(ACCOUNTS);
+ when(mPrefs.getString(Mockito.anyString(), Mockito.anyString())).thenReturn(
+ getDefaultAccountPreference("name4",GoogleAccountType.ACCOUNT_TYPE));
+ assertEquals("name1", getDefaultGoogleAccountName());
+ }
+
+ private final String getDefaultGoogleAccountName() {
+ // We don't need the real preference key value since it's mocked
+ final Account account = AccountTypeManager.getDefaultGoogleAccount(
+ mAccountManager, mPrefs, "contact_editor_default_account_key");
+ return account == null ? null : account.name;
+ }
+
+ private static final String getDefaultAccountPreference(String name, String type) {
+ return new AccountWithDataSet(name, type, /* dataSet */ null).stringify();
+ }
}
diff --git a/tests/src/com/android/contacts/common/model/account/ExternalAccountTypeTest.java b/tests/src/com/android/contacts/common/model/account/ExternalAccountTypeTest.java
index 50a5110..684a379 100644
--- a/tests/src/com/android/contacts/common/model/account/ExternalAccountTypeTest.java
+++ b/tests/src/com/android/contacts/common/model/account/ExternalAccountTypeTest.java
@@ -92,7 +92,6 @@
// Let's just check if the DataKinds are registered.
assertNotNull(type.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE));
- assertNotNull(type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME));
assertNotNull(type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME));
assertNotNull(type.getKindForMimetype(Email.CONTENT_ITEM_TYPE));
assertNotNull(type.getKindForMimetype(StructuredPostal.CONTENT_ITEM_TYPE));
@@ -130,7 +129,6 @@
checkEditSchema_mustHaveChecks(R.xml.missing_contacts_base, true);
checkEditSchema_mustHaveChecks(R.xml.missing_contacts_photo, false);
checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name, false);
- checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr1, false);
checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr2, false);
checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr3, false);
checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr4, false);
@@ -161,12 +159,11 @@
// Shouldn't have a "null" mimetype.
assertTrue(type.getKindForMimetype(null) == null);
- // 3 kinds are defined in XML and 4 are added by default.
- assertEquals(4 + 3, type.getSortedDataKinds().size());
+ // 3 kinds are defined in XML and 3 are added by default.
+ assertEquals(3 + 3, type.getSortedDataKinds().size());
// Check for the default kinds.
assertNotNull(type.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE));
- assertNotNull(type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME));
assertNotNull(type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME));
assertNotNull(type.getKindForMimetype(Photo.CONTENT_ITEM_TYPE));
diff --git a/tests/src/com/android/contacts/common/test/mocks/MockAccountTypeManager.java b/tests/src/com/android/contacts/common/test/mocks/MockAccountTypeManager.java
index b46c49d..f4ec238 100644
--- a/tests/src/com/android/contacts/common/test/mocks/MockAccountTypeManager.java
+++ b/tests/src/com/android/contacts/common/test/mocks/MockAccountTypeManager.java
@@ -15,6 +15,8 @@
*/
package com.android.contacts.common.test.mocks;
+import android.accounts.Account;
+
import com.android.contacts.common.model.AccountTypeManager;
import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.common.model.account.AccountTypeWithDataSet;
@@ -66,7 +68,10 @@
}
@Override
- public void sortAccounts(AccountWithDataSet account) {}
+ public List<AccountWithDataSet> getSortedAccounts(AccountWithDataSet account,
+ boolean writableOnly) {
+ return Arrays.asList(mAccounts);
+ }
@Override
public List<AccountWithDataSet> getGroupWritableAccounts() {
@@ -74,6 +79,11 @@
}
@Override
+ public Account getDefaultGoogleAccount() {
+ return null;
+ }
+
+ @Override
public Map<AccountTypeWithDataSet, AccountType> getUsableInvitableAccountTypes() {
return Maps.newHashMap(); // Always returns empty
}
diff --git a/tests/src/com/android/contacts/common/util/NameConverterTests.java b/tests/src/com/android/contacts/common/util/NameConverterTests.java
deleted file mode 100644
index 5a261eb..0000000
--- a/tests/src/com/android/contacts/common/util/NameConverterTests.java
+++ /dev/null
@@ -1,101 +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.common.util;
-
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.text.TextUtils;
-
-import com.android.contacts.common.util.NameConverter;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Tests for {@link NameConverter}.
- */
-@SmallTest
-public class NameConverterTests extends AndroidTestCase {
-
- public void testStructuredNameToDisplayName() {
- Map<String, String> structuredName = new HashMap<String, String>();
- structuredName.put(StructuredName.PREFIX, "Mr.");
- structuredName.put(StructuredName.GIVEN_NAME, "John");
- structuredName.put(StructuredName.MIDDLE_NAME, "Quincy");
- structuredName.put(StructuredName.FAMILY_NAME, "Adams");
- structuredName.put(StructuredName.SUFFIX, "Esquire");
-
- assertEquals("Mr. John Quincy Adams, Esquire",
- NameConverter.structuredNameToDisplayName(mContext, structuredName));
-
- structuredName.remove(StructuredName.SUFFIX);
- assertEquals("Mr. John Quincy Adams",
- NameConverter.structuredNameToDisplayName(mContext, structuredName));
-
- structuredName.remove(StructuredName.MIDDLE_NAME);
- assertEquals("Mr. John Adams",
- NameConverter.structuredNameToDisplayName(mContext, structuredName));
- }
-
- public void testDisplayNameToStructuredName() {
- assertStructuredName("Mr. John Quincy Adams, Esquire",
- "Mr.", "John", "Quincy", "Adams", "Esquire");
- assertStructuredName("John Doe", null, "John", null, "Doe", null);
- assertStructuredName("Ms. Jane Eyre", "Ms.", "Jane", null, "Eyre", null);
- assertStructuredName("Dr Leo Spaceman, PhD", "Dr", "Leo", null, "Spaceman", "PhD");
- }
-
- /**
- * Helper method to check whether a given display name parses out to the other parameters.
- * @param displayName Display name to break into a structured name.
- * @param prefix Expected prefix (null if not expected).
- * @param givenName Expected given name (null if not expected).
- * @param middleName Expected middle name (null if not expected).
- * @param familyName Expected family name (null if not expected).
- * @param suffix Expected suffix (null if not expected).
- */
- private void assertStructuredName(String displayName, String prefix,
- String givenName, String middleName, String familyName, String suffix) {
- Map<String, String> structuredName = NameConverter.displayNameToStructuredName(mContext,
- displayName);
- checkNameComponent(StructuredName.PREFIX, prefix, structuredName);
- checkNameComponent(StructuredName.GIVEN_NAME, givenName, structuredName);
- checkNameComponent(StructuredName.MIDDLE_NAME, middleName, structuredName);
- checkNameComponent(StructuredName.FAMILY_NAME, familyName, structuredName);
- checkNameComponent(StructuredName.SUFFIX, suffix, structuredName);
- assertEquals(0, structuredName.size());
- }
-
- /**
- * Checks that the given field and value are present in the structured name map (or not present
- * if the given value is null). If the value is present and matches, the key is removed from
- * the map - once all components of the name are checked, the map should be empty.
- * @param field Field to check.
- * @param value Expected value for the field (null if it is not expected to be populated).
- * @param structuredName The map of structured field names to values.
- */
- private void checkNameComponent(String field, String value,
- Map<String, String> structuredName) {
- if (TextUtils.isEmpty(value)) {
- assertNull(structuredName.get(field));
- } else {
- assertEquals(value, structuredName.get(field));
- }
- structuredName.remove(field);
- }
-}
diff --git a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
index f943aaa..9152956 100644
--- a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
+++ b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
@@ -107,33 +107,33 @@
}
public void testSingleWritableRawContact() {
- expectQuery().returnRow(1, WRITABLE_ACCOUNT_TYPE, null, 13, "foo");
+ expectQuery().returnRow(1, WRITABLE_ACCOUNT_TYPE, null, 13, "foo", "baz");
assertWithMessageId(R.string.deleteConfirmation);
}
public void testReadOnlyRawContacts() {
- expectQuery().returnRow(1, READONLY_ACCOUNT_TYPE, null, 13, "foo");
+ expectQuery().returnRow(1, READONLY_ACCOUNT_TYPE, null, 13, "foo", "baz");
assertWithMessageId(R.string.readOnlyContactWarning);
}
public void testMixOfWritableAndReadOnlyRawContacts() {
expectQuery()
- .returnRow(1, WRITABLE_ACCOUNT_TYPE, null, 13, "foo")
- .returnRow(2, READONLY_ACCOUNT_TYPE, null, 13, "foo");
+ .returnRow(1, WRITABLE_ACCOUNT_TYPE, null, 13, "foo", "baz")
+ .returnRow(2, READONLY_ACCOUNT_TYPE, null, 13, "foo", "baz");
assertWithMessageId(R.string.readOnlyContactDeleteConfirmation);
}
public void testMultipleWritableRawContacts() {
expectQuery()
- .returnRow(1, WRITABLE_ACCOUNT_TYPE, null, 13, "foo")
- .returnRow(2, WRITABLE_ACCOUNT_TYPE, null, 13, "foo");
+ .returnRow(1, WRITABLE_ACCOUNT_TYPE, null, 13, "foo", "baz")
+ .returnRow(2, WRITABLE_ACCOUNT_TYPE, null, 13, "foo", "baz");
assertWithMessageId(R.string.multipleContactDeleteConfirmation);
}
private Query expectQuery() {
return mContactsProvider.expectQuery(ENTITY_URI).withProjection(
Entity.RAW_CONTACT_ID, Entity.ACCOUNT_TYPE, Entity.DATA_SET, Entity.CONTACT_ID,
- Entity.LOOKUP_KEY);
+ Entity.LOOKUP_KEY, Entity.DISPLAY_NAME);
}
private void assertWithMessageId(int messageId) {
diff --git a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
index 4a93364..32930f9 100644
--- a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
+++ b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
@@ -45,6 +45,7 @@
import android.widget.Toast;
import com.android.contacts.GroupListLoader;
+import com.android.contacts.group.GroupUtil;
import com.android.contacts.list.UiIntentActions;
import com.android.contacts.tests.R;
import com.android.contacts.tests.quickcontact.QuickContactTestsActivity;
@@ -578,14 +579,14 @@
intent.setData(ContentUris.withAppendedId(Groups.CONTENT_URI, groupId));
// TODO: ContactsProvider2#getType does handle the group mimetype
intent.setClassName("com.google.android.contacts",
- "com.android.contacts.activities.GroupMembersActivity");
+ "com.android.contacts.activities.PeopleActivity");
return intent;
}
private long findArbitraryGroup() {
final Cursor cursor = getContentResolver().query(Groups.CONTENT_URI,
new String[] { Groups._ID },
- GroupListLoader.DEFAULT_SELECTION,
+ GroupUtil.DEFAULT_SELECTION,
null,
"RANDOM() LIMIT 1");
try {
diff --git a/tests/src/com/android/contacts/util/SyncUtilTests.java b/tests/src/com/android/contacts/util/SyncUtilTests.java
new file mode 100644
index 0000000..372a652
--- /dev/null
+++ b/tests/src/com/android/contacts/util/SyncUtilTests.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2016 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.util;
+
+import android.accounts.Account;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for SyncUtil.
+ */
+@SmallTest
+public class SyncUtilTests extends AndroidTestCase {
+ private static final String TAG = "SyncUtilTests";
+
+ private static final String GOOGLE_TYPE = "com.google";
+ private static final String NOT_GOOGLE_TYPE = "com.abc";
+ private static final String ACCOUNT_NAME = "ACCOUNT_NAME";
+
+ private final Account mGoogleAccount;
+ private final Account mOtherAccount;
+
+ public SyncUtilTests() {
+ mGoogleAccount = new Account(ACCOUNT_NAME, GOOGLE_TYPE);
+ mOtherAccount = new Account(ACCOUNT_NAME, NOT_GOOGLE_TYPE);
+ }
+
+ public void testIsUnsyncableGoogleAccount() throws Exception {
+ // The account names of mGoogleAccount and mOtherAccount are not valid, so both accounts
+ // are not syncable.
+ assertTrue(SyncUtil.isUnsyncableGoogleAccount(mGoogleAccount));
+ assertFalse(SyncUtil.isUnsyncableGoogleAccount(mOtherAccount));
+ assertFalse(SyncUtil.isUnsyncableGoogleAccount(null));
+ }
+}