Merge "Create new SIM contacts import screen." into ub-contactsdialer-h-dev
diff --git a/Android.mk b/Android.mk
index 2ed0e69..a03d671 100644
--- a/Android.mk
+++ b/Android.mk
@@ -23,6 +23,9 @@
$(support_library_root_dir)/v7/recyclerview/res
LOCAL_ASSET_DIR := $(addprefix $(LOCAL_PATH)/, $(asset_dirs))
+LOCAL_FULL_MANIFEST_FILE := $(LOCAL_PATH)/AndroidManifest.xml
+LOCAL_FULL_LIBS_MANIFEST_FILES := $(LOCAL_PATH)/AndroidManifest_common.xml
+
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages com.android.contacts.common \
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6144e55..78060a8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -25,36 +25,6 @@
<!-- Contacts permission listed first because order determines
order that permissions are requested with some OEMs -->
- <uses-permission android:name="android.permission.READ_CONTACTS" />
- <uses-permission android:name="android.permission.WRITE_CONTACTS" />
- <uses-permission android:name="android.permission.GET_ACCOUNTS" />
- <uses-permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED" />
- <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.CALL_PHONE" />
- <uses-permission android:name="android.permission.READ_PROFILE" />
- <uses-permission android:name="android.permission.WRITE_PROFILE" />
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.NFC" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.WAKE_LOCK" />
- <uses-permission android:name="android.permission.WRITE_SETTINGS" />
- <uses-permission android:name="android.permission.USE_CREDENTIALS" />
- <uses-permission android:name="android.permission.VIBRATE" />
- <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
- <!-- Following used for QuickContacts -->
- <uses-permission android:name="android.permission.READ_CALL_LOG" />
- <uses-permission android:name="android.permission.READ_SMS" />
- <uses-permission android:name="android.permission.READ_CALENDAR" />
- <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"/>
<application
android:name="com.android.contacts.ContactsApplication"
@@ -65,457 +35,5 @@
android:hardwareAccelerated="true"
android:supportsRtl="true"
android:usesCleartextTraffic="false"
- >
-
- <!-- The main Contacts activity with the contact list, favorites, and groups. -->
- <activity android:name=".activities.PeopleActivity"
- android:theme="@style/PeopleActivityTheme"
- android:alwaysRetainTaskState="true"
- android:launchMode="singleTop"
- android:resizeableActivity="true"
- >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.APP_CONTACTS" />
- </intent-filter>
- <intent-filter>
- <action android:name="com.android.contacts.action.LIST_DEFAULT" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.TAB" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="com.android.contacts.action.LIST_CONTACTS" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.TAB" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="com.android.contacts.action.LIST_ALL_CONTACTS" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.TAB" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="com.android.contacts.action.LIST_CONTACTS_WITH_PHONES" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.TAB" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="com.android.contacts.action.LIST_STARRED" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.TAB" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="com.android.contacts.action.LIST_FREQUENT" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.TAB" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="com.android.contacts.action.LIST_STREQUENT" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.TAB" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="android.intent.action.SEARCH" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.dir/contact" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="android.intent.action.SEARCH" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <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>
- <action android:name="android.intent.action.INSERT" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.dir/group" />
- </intent-filter>
-
- <meta-data android:name="android.app.searchable"
- android:resource="@xml/searchable"
- />
-
- <meta-data android:name="android.app.shortcuts"
- android:resource="@xml/shortcuts"
- />
-
- </activity>
-
- <activity android:name=".activities.ContactSelectionActivity"
- android:theme="@style/ContactPickerTheme"
- android:launchMode="singleTop"
- android:clearTaskOnLaunch="true"
- android:uiOptions="splitActionBarWhenNarrow"
- android:windowSoftInputMode="adjustResize">
- <intent-filter>
- <action android:name="android.intent.action.INSERT_OR_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="android.intent.action.PICK" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.dir/contact" />
- <data android:mimeType="vnd.android.cursor.dir/person" />
- <data android:mimeType="vnd.android.cursor.dir/phone_v2" />
- <data android:mimeType="vnd.android.cursor.dir/phone" />
- <data android:mimeType="vnd.android.cursor.dir/postal-address_v2" />
- <data android:mimeType="vnd.android.cursor.dir/postal-address" />
- <data android:mimeType="vnd.android.cursor.dir/email_v2" />
- <data android:mimeType="vnd.android.cursor.dir/group"/>
- </intent-filter>
-
- <intent-filter>
- <action android:name="android.intent.action.GET_CONTENT" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/contact" />
- <data android:mimeType="vnd.android.cursor.item/person" />
- <data android:mimeType="vnd.android.cursor.item/phone_v2" />
- <data android:mimeType="vnd.android.cursor.item/phone" />
- <data android:mimeType="vnd.android.cursor.item/postal-address_v2" />
- <data android:mimeType="vnd.android.cursor.item/postal-address" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="com.android.contacts.action.JOIN_CONTACT" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <!-- Backwards compatibility: somebody may have hard coded this activity name -->
- <activity-alias android:name="ContactsListActivity"
- android:targetActivity=".activities.PeopleActivity"
- />
-
- <!-- Backwards compatibility: "Contacts" from Honeycomb -->
- <activity-alias android:name=".activities.ContactsFrontDoor"
- android:targetActivity=".activities.PeopleActivity"
- android:exported="true"
- />
-
- <!-- Backwards compatibility: "Contacts" from Gingerbread and earlier -->
- <activity-alias android:name="DialtactsContactsEntryActivity"
- android:targetActivity=".activities.PeopleActivity"
- android:exported="true"
- />
-
- <!-- Used to set options -->
- <activity
- android:name=".common.preference.ContactsPreferenceActivity"
- android:label="@string/activity_title_settings"
- android:theme="@style/ContactsPreferencesTheme"
- android:launchMode="singleTop"
- android:exported="false"/>
-
- <activity android:name=".common.activity.LicenseActivity"
- android:label="@string/activity_title_licenses"
- android:theme="@style/ContactsPreferencesTheme"
- android:exported="false" />
-
- <!-- Used to filter contacts list by account -->
- <activity
- android:name=".common.list.AccountFilterActivity"
- android:label="@string/activity_title_contacts_filter"
- android:theme="@style/ContactListFilterTheme" />
-
- <!-- Used to select display and sync groups -->
- <activity
- android:name=".common.list.CustomContactListFilterActivity"
- android:label="@string/custom_list_filter"
- android:theme="@style/ContactListFilterTheme" />
-
- <activity
- android:name=".common.activity.RequestPermissionsActivity"
- android:theme="@style/PeopleTheme"
- android:exported="false"/>
-
- <activity
- android:name=".common.activity.RequestDesiredPermissionsActivity"
- android:theme="@style/PeopleTheme"
- android:exported="false"/>
-
- <activity
- android:name=".common.activity.RequestImportVCardPermissionsActivity"
- android:theme="@style/PeopleTheme"
- android:exported="false"/>
-
- <activity
- android:name=".activities.ShowOrCreateActivity"
- android:theme="@android:style/Theme.Material.Light.Dialog.NoActionBar">
-
- <intent-filter>
- <action android:name="com.android.contacts.action.SHOW_OR_CREATE_CONTACT" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="mailto" />
- <data android:scheme="tel" />
- </intent-filter>
- </activity>
-
- <activity
- android:name=".quickcontact.QuickContactActivity"
- android:theme="@style/Theme.QuickContact"
- android:launchMode="singleTop"
- android:excludeFromRecents="true"
- android:taskAffinity=""
- android:windowSoftInputMode="stateUnchanged">
-
- <intent-filter>
- <action android:name="com.android.contacts.action.QUICK_CONTACT" />
- <action android:name="android.provider.action.QUICK_CONTACT" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/contact" />
- <data android:mimeType="vnd.android.cursor.item/person" />
- </intent-filter>
-
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <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>
- </activity>
-
- <receiver
- android:name=".quickcontact.QuickContactBroadcastReceiver"
- android:exported="false" />
-
- <activity-alias android:name="ContactShortcut"
- android:targetActivity=".activities.ContactSelectionActivity"
- android:label="@string/shortcutContact"
- android:icon="@drawable/logo_quick_contacts_color_44in48dp">
-
- <intent-filter>
- <action android:name="android.intent.action.CREATE_SHORTCUT" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
-
- </activity-alias>
-
- <activity-alias android:name="alias.DialShortcut"
- android:targetActivity=".activities.ContactSelectionActivity"
- android:label="@string/shortcutDialContact"
- android:icon="@drawable/logo_quick_contacts_dialer_color_44in48dp">
-
- <intent-filter>
- <action android:name="android.intent.action.CREATE_SHORTCUT" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.CAR_MODE" />
- </intent-filter>
-
- </activity-alias>
-
- <activity-alias android:name="alias.MessageShortcut"
- android:targetActivity=".activities.ContactSelectionActivity"
- android:label="@string/shortcutMessageContact"
- android:icon="@drawable/logo_quick_contacts_mail_color_44in48dp">
-
- <intent-filter>
- <action android:name="android.intent.action.CREATE_SHORTCUT" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
-
- </activity-alias>
-
- <!-- Accounts changed prompt that can appear when creating a new contact. -->
- <activity
- android:name=".activities.ContactEditorAccountsChangedActivity"
- android:theme="@style/ContactEditorAccountsChangedActivityTheme"
- android:windowSoftInputMode="adjustResize"
- android:exported="false"/>
-
- <!-- Edit or create a contact with only the most important fields displayed initially. -->
- <activity
- android:name=".activities.ContactEditorActivity"
- android:theme="@style/EditorActivityTheme"
- android:windowSoftInputMode="stateHidden|adjustResize">
-
- <intent-filter>
- <action android:name="android.intent.action.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=".activities.ContactEditorSpringBoardActivity"
- android:noHistory="true"
- android:theme="@style/TransparentThemeAppCompat">
-
- <intent-filter>
- <action android:name="android.intent.action.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>
-
- </activity>
-
-
- <activity android:name=".common.test.FragmentTestActivity">
- <intent-filter>
- <category android:name="android.intent.category.TEST" />
- </intent-filter>
- </activity>
-
- <!-- Stub service used to keep our process alive long enough for
- background threads to finish their operations. -->
- <service
- android:name=".common.util.EmptyService"
- android:exported="false" />
-
- <!-- Service to save a contact -->
- <service
- android:name=".ContactSaveService"
- android:exported="false" />
-
- <!-- Attaches a photo to a contact. Started from external applications -->
- <activity android:name=".activities.AttachPhotoActivity"
- android:label="@string/attach_photo_dialog_title"
- android:taskAffinity="">
- <intent-filter>
- <action android:name="android.intent.action.ATTACH_DATA" />
- <data android:mimeType="image/*" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <!-- vCard related -->
- <activity android:name=".common.vcard.ImportVCardActivity"
- android:configChanges="orientation|screenSize|keyboardHidden"
- android:theme="@style/BackgroundOnlyTheme">
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <data android:mimeType="text/directory" />
- <data android:mimeType="text/vcard" />
- <data android:mimeType="text/x-vcard" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <activity android:name=".common.vcard.NfcImportVCardActivity"
- android:configChanges="orientation|screenSize|keyboardHidden"
- android:theme="@style/BackgroundOnlyTheme">
- <intent-filter>
- <action android:name="android.nfc.action.NDEF_DISCOVERED" />
- <data android:mimeType="text/vcard" />
- <data android:mimeType="text/x-vcard" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <activity android:name=".common.vcard.CancelActivity"
- android:theme="@style/BackgroundOnlyTheme" />
-
- <activity android:name=".common.vcard.SelectAccountActivity"
- android:theme="@style/BackgroundOnlyTheme" />
-
- <activity android:name=".common.vcard.ExportVCardActivity"
- android:theme="@style/BackgroundOnlyTheme" />
-
- <activity android:name=".common.vcard.ShareVCardActivity"
- android:theme="@style/BackgroundOnlyTheme" />
-
- <service
- android:name=".common.vcard.VCardService"
- android:exported="false" />
- <!-- end vCard related -->
-
- <!-- Intercept Dialer Intents for devices without a phone.
- This activity should have the same intent filters as the DialtactsActivity,
- so that its capturing the same events. Omit android.intent.category.LAUNCHER, because
- we don't want this to show up in the Launcher. The priorities of the intent-filters
- are set lower, so that the user does not see a disambig dialog -->
- <activity
- android:name="com.android.contacts.NonPhoneActivity"
- android:theme="@style/NonPhoneActivityTheme">
- <intent-filter android:priority="-1">
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.DEFAULT"/>
- <category android:name="android.intent.category.BROWSABLE"/>
- </intent-filter>
- <intent-filter android:priority="-1">
- <action android:name="android.intent.action.VIEW"/>
- <category android:name="android.intent.category.DEFAULT"/>
- <category android:name="android.intent.category.BROWSABLE"/>
- <data android:scheme="tel"/>
- </intent-filter>
- <intent-filter android:priority="-1">
- <action android:name="android.intent.action.VIEW"/>
- <category android:name="android.intent.category.DEFAULT"/>
- <category android:name="android.intent.category.BROWSABLE"/>
- <data android:mimeType="vnd.android.cursor.dir/calls"/>
- </intent-filter>
- </activity>
-
- <activity android:name="com.android.contacts.common.dialog.CallSubjectDialog"
- android:theme="@style/Theme.CallSubjectDialogTheme"
- android:windowSoftInputMode="stateVisible|adjustResize">
- <intent-filter>
- <action android:name="android.intent.action.VIEW"/>
- </intent-filter>
- </activity>
-
- <!-- Service that is exclusively for the Phone application that sends out a view
- notification. This service might be removed in future versions of the app.
-
- This is called explicitly by the phone app via package name and class.
- (PhoneUtils.sendViewNotificationAsync()). If this service moves, then phone
- needs to be changed as well.
- -->
- <service android:name=".ViewNotificationService"
- android:permission="android.permission.WRITE_CONTACTS"
- android:exported="true">
- <intent-filter>
- <action android:name="com.android.contacts.VIEW_NOTIFICATION"/>
- <data android:mimeType="vnd.android.cursor.item/contact"/>
- </intent-filter>
- </service>
-
- <!-- Service used to run JobScheduler jobs -->
- <service android:name="com.android.contacts.ContactsJobService"
- android:permission="android.permission.BIND_JOB_SERVICE" />
-
- <provider
- android:name="android.support.v4.content.FileProvider"
- android:authorities="@string/contacts_file_provider_authority"
- android:grantUriPermissions="true"
- android:exported="false">
- <meta-data
- android:name="android.support.FILE_PROVIDER_PATHS"
- android:resource="@xml/file_paths" />
- </provider>
-
- <meta-data android:name="android.nfc.disable_beam_default" android:value="true" />
-
- </application>
+ />
</manifest>
diff --git a/AndroidManifest_common.xml b/AndroidManifest_common.xml
new file mode 100644
index 0000000..c616c1e
--- /dev/null
+++ b/AndroidManifest_common.xml
@@ -0,0 +1,505 @@
+<?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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.contacts">
+
+ <original-package android:name="com.android.contacts" />
+
+ <!-- Contacts permission listed first because order determines
+ order that permissions are requested with some OEMs -->
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
+ <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+ <uses-permission android:name="android.permission.GET_ACCOUNTS" />
+ <uses-permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED" />
+ <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+ <uses-permission android:name="android.permission.CALL_PHONE" />
+ <uses-permission android:name="android.permission.READ_PROFILE" />
+ <uses-permission android:name="android.permission.WRITE_PROFILE" />
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.NFC" />
+ <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
+ <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+ <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+ <uses-permission android:name="android.permission.VIBRATE" />
+ <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+ <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
+ <!-- Following used for QuickContacts -->
+ <uses-permission android:name="android.permission.READ_CALL_LOG" />
+ <uses-permission android:name="android.permission.READ_SMS" />
+ <uses-permission android:name="android.permission.READ_CALENDAR" />
+ <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"/>
+
+ <application>
+ <!-- The main Contacts activity with the contact list, favorites, and groups. -->
+ <activity android:name=".activities.PeopleActivity"
+ android:theme="@style/PeopleActivityTheme"
+ android:alwaysRetainTaskState="true"
+ android:launchMode="singleTop"
+ android:resizeableActivity="true"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.APP_CONTACTS" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="com.android.contacts.action.LIST_DEFAULT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.TAB" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="com.android.contacts.action.LIST_CONTACTS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.TAB" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="com.android.contacts.action.LIST_ALL_CONTACTS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.TAB" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="com.android.contacts.action.LIST_CONTACTS_WITH_PHONES" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.TAB" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="com.android.contacts.action.LIST_STARRED" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.TAB" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="com.android.contacts.action.LIST_FREQUENT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.TAB" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="com.android.contacts.action.LIST_STREQUENT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.TAB" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="android.intent.action.SEARCH" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/contact" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="android.intent.action.SEARCH" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <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>
+ <action android:name="android.intent.action.INSERT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/group" />
+ </intent-filter>
+
+ <meta-data android:name="android.app.searchable"
+ android:resource="@xml/searchable"
+ />
+
+ <meta-data android:name="android.app.shortcuts"
+ android:resource="@xml/shortcuts"
+ />
+
+ </activity>
+
+ <activity android:name=".activities.ContactSelectionActivity"
+ android:theme="@style/ContactPickerTheme"
+ android:launchMode="singleTop"
+ android:clearTaskOnLaunch="true"
+ android:uiOptions="splitActionBarWhenNarrow"
+ android:windowSoftInputMode="adjustResize">
+ <intent-filter>
+ <action android:name="android.intent.action.INSERT_OR_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="android.intent.action.PICK" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/contact" />
+ <data android:mimeType="vnd.android.cursor.dir/person" />
+ <data android:mimeType="vnd.android.cursor.dir/phone_v2" />
+ <data android:mimeType="vnd.android.cursor.dir/phone" />
+ <data android:mimeType="vnd.android.cursor.dir/postal-address_v2" />
+ <data android:mimeType="vnd.android.cursor.dir/postal-address" />
+ <data android:mimeType="vnd.android.cursor.dir/email_v2" />
+ <data android:mimeType="vnd.android.cursor.dir/group"/>
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="android.intent.action.GET_CONTENT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.item/contact" />
+ <data android:mimeType="vnd.android.cursor.item/person" />
+ <data android:mimeType="vnd.android.cursor.item/phone_v2" />
+ <data android:mimeType="vnd.android.cursor.item/phone" />
+ <data android:mimeType="vnd.android.cursor.item/postal-address_v2" />
+ <data android:mimeType="vnd.android.cursor.item/postal-address" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="com.android.contacts.action.JOIN_CONTACT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <!-- Backwards compatibility: somebody may have hard coded this activity name -->
+ <activity-alias android:name="ContactsListActivity"
+ android:targetActivity=".activities.PeopleActivity"
+ />
+
+ <!-- Backwards compatibility: "Contacts" from Honeycomb -->
+ <activity-alias android:name=".activities.ContactsFrontDoor"
+ android:targetActivity=".activities.PeopleActivity"
+ android:exported="true"
+ />
+
+ <!-- Backwards compatibility: "Contacts" from Gingerbread and earlier -->
+ <activity-alias android:name="DialtactsContactsEntryActivity"
+ android:targetActivity=".activities.PeopleActivity"
+ android:exported="true"
+ />
+
+ <!-- Used to set options -->
+ <activity
+ android:name=".common.preference.ContactsPreferenceActivity"
+ android:label="@string/activity_title_settings"
+ android:theme="@style/ContactsPreferencesTheme"
+ android:launchMode="singleTop"
+ android:exported="false"/>
+
+ <activity android:name=".common.activity.LicenseActivity"
+ android:label="@string/activity_title_licenses"
+ android:theme="@style/ContactsPreferencesTheme"
+ android:exported="false" />
+
+ <!-- Used to filter contacts list by account -->
+ <activity
+ android:name=".common.list.AccountFilterActivity"
+ android:label="@string/activity_title_contacts_filter"
+ android:theme="@style/ContactListFilterTheme" />
+
+ <!-- Used to select display and sync groups -->
+ <activity
+ android:name=".common.list.CustomContactListFilterActivity"
+ android:label="@string/custom_list_filter"
+ android:theme="@style/ContactListFilterTheme" />
+
+ <activity
+ android:name=".common.activity.RequestPermissionsActivity"
+ android:theme="@style/PeopleTheme"
+ android:exported="false"/>
+
+ <activity
+ android:name=".common.activity.RequestDesiredPermissionsActivity"
+ android:theme="@style/PeopleTheme"
+ android:exported="false"/>
+
+ <activity
+ android:name=".common.activity.RequestImportVCardPermissionsActivity"
+ android:theme="@style/PeopleTheme"
+ android:exported="false"/>
+
+ <activity
+ android:name=".activities.ShowOrCreateActivity"
+ android:theme="@android:style/Theme.Material.Light.Dialog.NoActionBar">
+
+ <intent-filter>
+ <action android:name="com.android.contacts.action.SHOW_OR_CREATE_CONTACT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="mailto" />
+ <data android:scheme="tel" />
+ </intent-filter>
+ </activity>
+
+ <activity
+ android:name=".quickcontact.QuickContactActivity"
+ android:theme="@style/Theme.QuickContact"
+ android:launchMode="singleTop"
+ android:excludeFromRecents="true"
+ android:taskAffinity=""
+ android:windowSoftInputMode="stateUnchanged">
+
+ <intent-filter>
+ <action android:name="com.android.contacts.action.QUICK_CONTACT" />
+ <action android:name="android.provider.action.QUICK_CONTACT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.item/contact" />
+ <data android:mimeType="vnd.android.cursor.item/person" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <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>
+ </activity>
+
+ <receiver
+ android:name=".quickcontact.QuickContactBroadcastReceiver"
+ android:exported="false" />
+
+ <activity-alias android:name="ContactShortcut"
+ android:targetActivity=".activities.ContactSelectionActivity"
+ android:label="@string/shortcutContact"
+ android:icon="@drawable/logo_quick_contacts_color_44in48dp">
+
+ <intent-filter>
+ <action android:name="android.intent.action.CREATE_SHORTCUT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+
+ </activity-alias>
+
+ <activity-alias android:name="alias.DialShortcut"
+ android:targetActivity=".activities.ContactSelectionActivity"
+ android:label="@string/shortcutDialContact"
+ android:icon="@drawable/logo_quick_contacts_dialer_color_44in48dp">
+
+ <intent-filter>
+ <action android:name="android.intent.action.CREATE_SHORTCUT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.CAR_MODE" />
+ </intent-filter>
+
+ </activity-alias>
+
+ <activity-alias android:name="alias.MessageShortcut"
+ android:targetActivity=".activities.ContactSelectionActivity"
+ android:label="@string/shortcutMessageContact"
+ android:icon="@drawable/logo_quick_contacts_mail_color_44in48dp">
+
+ <intent-filter>
+ <action android:name="android.intent.action.CREATE_SHORTCUT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+
+ </activity-alias>
+
+ <!-- Accounts changed prompt that can appear when creating a new contact. -->
+ <activity
+ android:name=".activities.ContactEditorAccountsChangedActivity"
+ android:theme="@style/ContactEditorAccountsChangedActivityTheme"
+ android:windowSoftInputMode="adjustResize"
+ android:exported="false"/>
+
+ <!-- Edit or create a contact with only the most important fields displayed initially. -->
+ <activity
+ android:name=".activities.ContactEditorActivity"
+ android:theme="@style/EditorActivityTheme"
+ android:windowSoftInputMode="stateHidden|adjustResize">
+
+ <intent-filter>
+ <action android:name="android.intent.action.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=".activities.ContactEditorSpringBoardActivity"
+ android:noHistory="true"
+ android:theme="@style/TransparentThemeAppCompat">
+
+ <intent-filter>
+ <action android:name="android.intent.action.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>
+ </activity>
+
+ <activity android:name=".common.test.FragmentTestActivity">
+ <intent-filter>
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+
+ <!-- Stub service used to keep our process alive long enough for
+ background threads to finish their operations. -->
+ <service
+ android:name=".common.util.EmptyService"
+ android:exported="false" />
+
+ <!-- Service to save a contact -->
+ <service
+ android:name=".ContactSaveService"
+ android:exported="false" />
+
+ <!-- Attaches a photo to a contact. Started from external applications -->
+ <activity android:name=".activities.AttachPhotoActivity"
+ android:label="@string/attach_photo_dialog_title"
+ android:taskAffinity="">
+ <intent-filter>
+ <action android:name="android.intent.action.ATTACH_DATA" />
+ <data android:mimeType="image/*" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <!-- vCard related -->
+ <activity android:name=".common.vcard.ImportVCardActivity"
+ android:configChanges="orientation|screenSize|keyboardHidden"
+ android:theme="@style/BackgroundOnlyTheme">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <data android:mimeType="text/directory" />
+ <data android:mimeType="text/vcard" />
+ <data android:mimeType="text/x-vcard" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".common.vcard.NfcImportVCardActivity"
+ android:configChanges="orientation|screenSize|keyboardHidden"
+ android:theme="@style/BackgroundOnlyTheme">
+ <intent-filter>
+ <action android:name="android.nfc.action.NDEF_DISCOVERED" />
+ <data android:mimeType="text/vcard" />
+ <data android:mimeType="text/x-vcard" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".common.vcard.CancelActivity"
+ android:theme="@style/BackgroundOnlyTheme" />
+
+ <activity android:name=".common.vcard.SelectAccountActivity"
+ android:theme="@style/BackgroundOnlyTheme" />
+
+ <activity android:name=".common.vcard.ExportVCardActivity"
+ android:theme="@style/BackgroundOnlyTheme" />
+
+ <activity android:name=".common.vcard.ShareVCardActivity"
+ android:theme="@style/BackgroundOnlyTheme" />
+
+ <service
+ android:name=".common.vcard.VCardService"
+ android:exported="false" />
+ <!-- end vCard related -->
+
+ <!-- Intercept Dialer Intents for devices without a phone.
+ This activity should have the same intent filters as the DialtactsActivity,
+ so that its capturing the same events. Omit android.intent.category.LAUNCHER, because
+ we don't want this to show up in the Launcher. The priorities of the intent-filters
+ are set lower, so that the user does not see a disambig dialog -->
+ <activity
+ android:name="com.android.contacts.NonPhoneActivity"
+ android:theme="@style/NonPhoneActivityTheme">
+ <intent-filter android:priority="-1">
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.BROWSABLE"/>
+ </intent-filter>
+ <intent-filter android:priority="-1">
+ <action android:name="android.intent.action.VIEW"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.BROWSABLE"/>
+ <data android:scheme="tel"/>
+ </intent-filter>
+ <intent-filter android:priority="-1">
+ <action android:name="android.intent.action.VIEW"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.BROWSABLE"/>
+ <data android:mimeType="vnd.android.cursor.dir/calls"/>
+ </intent-filter>
+ </activity>
+
+ <activity android:name="com.android.contacts.common.dialog.CallSubjectDialog"
+ android:theme="@style/Theme.CallSubjectDialogTheme"
+ android:windowSoftInputMode="stateVisible|adjustResize">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW"/>
+ </intent-filter>
+ </activity>
+
+ <!-- Service that is exclusively for the Phone application that sends out a view
+ notification. This service might be removed in future versions of the app.
+
+ This is called explicitly by the phone app via package name and class.
+ (PhoneUtils.sendViewNotificationAsync()). If this service moves, then phone
+ needs to be changed as well.
+ -->
+ <service android:name=".ViewNotificationService"
+ android:permission="android.permission.WRITE_CONTACTS"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="com.android.contacts.VIEW_NOTIFICATION"/>
+ <data android:mimeType="vnd.android.cursor.item/contact"/>
+ </intent-filter>
+ </service>
+
+ <!-- Service used to run JobScheduler jobs -->
+ <service android:name="com.android.contacts.ContactsJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE" />
+
+ <provider
+ android:name="android.support.v4.content.FileProvider"
+ android:authorities="@string/contacts_file_provider_authority"
+ android:grantUriPermissions="true"
+ android:exported="false">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/file_paths" />
+ </provider>
+
+ <meta-data android:name="android.nfc.disable_beam_default" android:value="true" />
+
+ </application>
+</manifest>
diff --git a/res/drawable-hdpi/ic_link_grey600_drawable_24dp.png b/res/drawable-hdpi/ic_link_grey600_drawable_24dp.png
deleted file mode 100644
index 31fcce2..0000000
--- a/res/drawable-hdpi/ic_link_grey600_drawable_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_link_grey600_drawable_24dp.png b/res/drawable-mdpi/ic_link_grey600_drawable_24dp.png
deleted file mode 100644
index 65997eb..0000000
--- a/res/drawable-mdpi/ic_link_grey600_drawable_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_link_grey600_drawable_24dp.png b/res/drawable-xhdpi/ic_link_grey600_drawable_24dp.png
deleted file mode 100644
index 9f37410..0000000
--- a/res/drawable-xhdpi/ic_link_grey600_drawable_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_link_grey600_drawable_24dp.png b/res/drawable-xxhdpi/ic_link_grey600_drawable_24dp.png
deleted file mode 100644
index 140daef..0000000
--- a/res/drawable-xxhdpi/ic_link_grey600_drawable_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_link_grey600_drawable_24dp.png b/res/drawable-xxxhdpi/ic_link_grey600_drawable_24dp.png
deleted file mode 100644
index 6fe9b8c..0000000
--- a/res/drawable-xxxhdpi/ic_link_grey600_drawable_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_assistant.xml b/res/drawable/ic_assistant.xml
new file mode 100644
index 0000000..3391beb
--- /dev/null
+++ b/res/drawable/ic_assistant.xml
@@ -0,0 +1,25 @@
+<?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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M19,2L5,2c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h4l3,3 3,-3h4c1.1,0 2,-0.9 2,-2L21,4c0,-1.1 -0.9,-2 -2,-2zM13.88,12.88L12,17l-1.88,-4.12L6,11l4.12,-1.88L12,5l1.88,4.12L18,11l-4.12,1.88z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_group_add.xml b/res/drawable/ic_group_add.xml
new file mode 100644
index 0000000..6d8776e
--- /dev/null
+++ b/res/drawable/ic_group_add.xml
@@ -0,0 +1,25 @@
+<?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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M8,10L5,10L5,7L3,7v3L0,10v2h3v3h2v-3h3v-2zM18,11c1.66,0 2.99,-1.34 2.99,-3S19.66,5 18,5c-0.32,0 -0.63,0.05 -0.91,0.14 0.57,0.81 0.9,1.79 0.9,2.86s-0.34,2.04 -0.9,2.86c0.28,0.09 0.59,0.14 0.91,0.14zM13,11c1.66,0 2.99,-1.34 2.99,-3S14.66,5 13,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM19.62,13.16c0.83,0.73 1.38,1.66 1.38,2.84v2h3v-2c0,-1.54 -2.37,-2.49 -4.38,-2.84zM13,13c-2,0 -6,1 -6,3v2h12v-2c0,-2 -4,-3 -6,-3z"/>
+</vector>
\ No newline at end of file
diff --git a/res/layout-land/contact_editor_fragment.xml b/res/layout-land/contact_editor_fragment.xml
index 6b02462..7f98765 100644
--- a/res/layout-land/contact_editor_fragment.xml
+++ b/res/layout-land/contact_editor_fragment.xml
@@ -44,8 +44,6 @@
android:layout_height="wrap_content"
android:orientation="vertical">
- <include layout="@layout/editor_all_rawcontacts_accounts_selector" />
-
<include layout="@layout/editor_account_header" />
<include layout="@layout/contact_editor_fields" />
diff --git a/res/layout/contact_editor_fragment.xml b/res/layout/contact_editor_fragment.xml
index 85c4cf1..690be8c 100644
--- a/res/layout/contact_editor_fragment.xml
+++ b/res/layout/contact_editor_fragment.xml
@@ -39,7 +39,6 @@
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" />
diff --git a/res/layout/editor_all_rawcontacts_accounts_selector.xml b/res/layout/editor_all_rawcontacts_accounts_selector.xml
deleted file mode 100644
index 5606422..0000000
--- a/res/layout/editor_all_rawcontacts_accounts_selector.xml
+++ /dev/null
@@ -1,59 +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.
--->
-
-<!-- Header at the top of a raw contact editor. This allows users to change the account that
- the raw contact is saved in. -->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/all_rawcontacts_accounts_container"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:minHeight="@dimen/editor_min_line_item_height"
- android:orientation="horizontal"
- android:visibility="gone" >
-
- <ImageView
- android:src="@drawable/ic_link_grey600_drawable_24dp"
- android:tint="@color/editor_icon_color"
- style="@style/EditSelectorIconStyle"/>
-
- <TextView
- android:id="@+id/rawcontacts_accounts_summary"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginStart="@dimen/editor_account_left_margin"
- android:textSize="16sp"
- android:singleLine="true"
- android:layout_weight="1"
- android:textColor="@color/primary_text_color"
- android:textAlignment="viewStart"
- android:layout_gravity="center_vertical"
- android:gravity="center_vertical"
- android:ellipsize="end" />
-
- <ImageView
- android:src="@drawable/ic_menu_expand_minimized_24dp"
- android:tint="@color/quantum_black_secondary_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical|end"
- android:layout_alignParentEnd="true"
- android:paddingStart="@dimen/editor_round_button_padding_left"
- android:paddingEnd="@dimen/editor_round_button_padding_right"
- android:paddingTop="@dimen/editor_round_button_padding_top"
- android:paddingBottom="@dimen/editor_round_button_padding_bottom"/>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/res/menu/activity_main_drawer.xml b/res/menu/activity_main_drawer.xml
index a006761..4082f5f 100644
--- a/res/menu/activity_main_drawer.xml
+++ b/res/menu/activity_main_drawer.xml
@@ -24,9 +24,9 @@
android:icon="@drawable/ic_menu_filter"
android:title="@string/contactsList" />
<item
- android:id="@+id/nav_find_duplicates"
- android:icon="@drawable/ic_menu_duplicates"
- android:title="@string/menu_duplicates"/>
+ android:id="@+id/nav_assistant"
+ android:icon="@drawable/ic_assistant"
+ android:title="@string/menu_assistant"/>
</group>
<group android:id="@+id/groups">
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5ec6f1c..e5d6413 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -899,8 +899,8 @@
<!-- Text shown in the contacts app while the background process updates contacts after a locale change [CHAR LIMIT=150]-->
<string name="locale_change_in_progress">Contact list is being updated to reflect the change of language.\n\nPlease wait…</string>
- <!-- The menu item to open the link/merge duplicates activity. [CHAR LIMIT=20]-->
- <string name="menu_duplicates">Duplicates</string>
+ <!-- The menu item to open the Google contacts assistant. [CHAR LIMIT=20]-->
+ <string name="menu_assistant">Assistant</string>
<!-- Open drawer content descriptions [CHAR LIMIT=40] -->
<string name="navigation_drawer_open">Open navigation drawer</string>
diff --git a/src-bind/com/android/contactsbind/ObjectFactory.java b/src-bind/com/android/contactsbind/ObjectFactory.java
index 83b8f4d..e336e4f 100644
--- a/src-bind/com/android/contactsbind/ObjectFactory.java
+++ b/src-bind/com/android/contactsbind/ObjectFactory.java
@@ -42,11 +42,7 @@
return new DeviceLocalAccountTypeFactory.Default(context);
}
- public static Fragment getDuplicatesFragment() {
- return null;
- }
-
- public static Fragment getDuplicatesUtilFragment() {
+ public static Fragment getAssistantFragment() {
return null;
}
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 3fc3c9d..68b9884 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -20,13 +20,13 @@
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
+import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.provider.ContactsContract.Intents;
import android.support.annotation.LayoutRes;
import android.support.design.widget.NavigationView;
-import android.support.v4.content.ContextCompat;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
@@ -49,6 +49,8 @@
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.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.preference.ContactsPreferenceActivity;
import com.android.contacts.common.util.AccountFilterUtil;
@@ -69,8 +71,6 @@
import com.android.contacts.interactions.AccountFiltersFragment.AccountFiltersListener;
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.HelpUtils;
import com.android.contactsbind.ObjectFactory;
@@ -94,7 +94,7 @@
public enum ContactsView {
NONE,
ALL_CONTACTS,
- DUPLICATES,
+ ASSISTANT,
GROUP_VIEW,
ACCOUNT_VIEW,
}
@@ -223,8 +223,15 @@
mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
mToggle = new ContactsActionBarDrawerToggle(this, mDrawer, mToolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
+
mDrawer.setDrawerListener(mToggle);
- mToggle.syncState();
+ // Set fallback handler for when drawer is disabled.
+ mToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
// Set up navigation mode.
if (savedState != null) {
@@ -246,16 +253,32 @@
}
}
+ public void setDrawerLockMode(boolean enabled) {
+ // Prevent drawer from being opened by sliding from the start of screen.
+ mDrawer.setDrawerLockMode(enabled ? DrawerLayout.LOCK_MODE_UNLOCKED
+ : DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
+
+ // Order of these statements matter.
+ // Display back button and disable drawer indicator.
+ if (enabled) {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(false);
+ mToggle.setDrawerIndicatorEnabled(true);
+ } else {
+ mToggle.setDrawerIndicatorEnabled(false);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+ }
+
private void setUpMenu() {
final Menu menu = mNavigationView.getMenu();
- if (ObjectFactory.getDuplicatesFragment() == null) {
- menu.removeItem(R.id.nav_find_duplicates);
+ if (ObjectFactory.getAssistantFragment() == null) {
+ menu.removeItem(R.id.nav_assistant);
} else {
- final MenuItem findDupMenu = menu.findItem(R.id.nav_find_duplicates);
- mIdMenuMap.put(R.id.nav_find_duplicates, findDupMenu);
- if (isDuplicatesView()) {
- updateMenuSelection(findDupMenu);
+ final MenuItem assistantMenu = menu.findItem(R.id.nav_assistant);
+ mIdMenuMap.put(R.id.nav_assistant, assistantMenu);
+ if (isAssistantView()) {
+ updateMenuSelection(assistantMenu);
}
}
@@ -306,6 +329,18 @@
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+ mToggle.syncState();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mToggle.onConfigurationChanged(newConfig);
+ }
+
// Set up fragment manager to load groups and filters.
protected void loadGroupsAndFilters() {
final FragmentManager fragmentManager = getFragmentManager();
@@ -429,8 +464,8 @@
return mCurrentView == ContactsView.GROUP_VIEW;
}
- protected boolean isDuplicatesView() {
- return mCurrentView == ContactsView.DUPLICATES;
+ protected boolean isAssistantView() {
+ return mCurrentView == ContactsView.ASSISTANT;
}
protected boolean isAllContactsView() {
@@ -442,7 +477,7 @@
}
public boolean isInSecondLevel() {
- return isGroupView() || isDuplicatesView();
+ return isGroupView() || isAssistantView();
}
protected abstract void onGroupMenuItemClicked(long groupId, String title);
@@ -556,9 +591,9 @@
HelpUtils.launchHelpAndFeedbackForMainScreen(ContactsDrawerActivity.this);
} else if (id == R.id.nav_all_contacts) {
switchToAllContacts();
- } else if (id == R.id.nav_find_duplicates) {
- if (!isDuplicatesView()) {
- launchFindDuplicates();
+ } else if (id == R.id.nav_assistant) {
+ if (!isAssistantView()) {
+ launchAssistant();
updateMenuSelection(item);
}
} else if (item.getIntent() != null) {
@@ -599,7 +634,7 @@
mContactListFilterController, AppCompatActivity.RESULT_OK, intent);
}
- protected abstract void launchFindDuplicates();
+ protected abstract void launchAssistant();
protected abstract DefaultContactBrowseListFragment getAllFragment();
diff --git a/src/com/android/contacts/activities/ContactEditorActivity.java b/src/com/android/contacts/activities/ContactEditorActivity.java
index 5022947..1845a52 100644
--- a/src/com/android/contacts/activities/ContactEditorActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorActivity.java
@@ -288,9 +288,6 @@
} else {
startActivityForResult(resultIntent, /* requestCode */ 0);
}
-
- ImplicitIntentsUtil.startActivityInApp(
- ContactEditorActivity.this, resultIntent);
}
finish();
}
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 935c66f..5621c1b 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -91,9 +91,11 @@
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_ASSISTANT = "contacts-assistant";
+ public static final String TAG_SECOND_LEVEL = "second-level";
+ public static final String TAG_THIRD_LEVEL = "third-level";
+
+ public static final String TAG_DUPLICATES = "DuplicatesFragment";
public static final String TAG_DUPLICATES_UTIL = "DuplicatesUtilFragment";
private static final String KEY_GROUP_URI = "groupUri";
@@ -626,8 +628,8 @@
return;
}
- if (isDuplicatesView()) {
- switchToAllContacts();
+ if (isAssistantView()) {
+ onBackPressedAssistantView();
return;
}
@@ -657,6 +659,14 @@
}
}
+ private void onBackPressedAssistantView() {
+ if (!popThirdLevel()) {
+ switchToAllContacts();
+ } else {
+ setDrawerLockMode(/* enabled */ true);
+ }
+ }
+
// Returns true if back event is handled in this method.
private boolean maybeHandleInAllFragment() {
if (isAllFragmentInSelectionMode()) {
@@ -764,8 +774,8 @@
}
@Override
- protected void launchFindDuplicates() {
- switchView(ContactsView.DUPLICATES);
+ protected void launchAssistant() {
+ switchView(ContactsView.ASSISTANT);
}
private void switchView(ContactsView contactsView) {
@@ -779,20 +789,14 @@
}
transaction.replace(
R.id.contacts_list_container, mMembersFragment, TAG_GROUP_VIEW);
- } else if (isDuplicatesView()) {
- Fragment duplicatesFragment = fragmentManager.findFragmentByTag(TAG_DUPLICATES);
- Fragment duplicatesUtilFragment =
- fragmentManager.findFragmentByTag(TAG_DUPLICATES_UTIL);
- if (duplicatesFragment == null || duplicatesUtilFragment == null) {
- duplicatesFragment = ObjectFactory.getDuplicatesFragment();
- duplicatesUtilFragment = ObjectFactory.getDuplicatesUtilFragment();
- duplicatesUtilFragment.setTargetFragment(duplicatesFragment, /* requestCode */ 0);
+ } else if(isAssistantView()) {
+ Fragment assistantFragment = fragmentManager.findFragmentByTag(TAG_ASSISTANT);
+ if (assistantFragment == null) {
+ assistantFragment = ObjectFactory.getAssistantFragment();
}
- transaction.replace(
- R.id.contacts_list_container, duplicatesFragment, TAG_DUPLICATES);
- if (!duplicatesUtilFragment.isAdded()) {
- transaction.add(duplicatesUtilFragment, TAG_DUPLICATES_UTIL);
- resetToolBarStatusBarColor();
+ if (assistantFragment != null) {
+ transaction.replace(
+ R.id.contacts_list_container, assistantFragment, TAG_ASSISTANT);
}
resetToolBarStatusBarColor();
}
@@ -816,6 +820,11 @@
super.switchToAllContacts();
}
+ private boolean popThirdLevel() {
+ return getFragmentManager().popBackStackImmediate(
+ TAG_THIRD_LEVEL, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ }
+
private void popSecondLevel() {
getFragmentManager().popBackStackImmediate(
TAG_SECOND_LEVEL, FragmentManager.POP_BACK_STACK_INCLUSIVE);
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 0542436..48e4bee 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -143,8 +143,6 @@
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";
@@ -350,7 +348,6 @@
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;
@@ -497,8 +494,6 @@
// 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);
@@ -629,8 +624,6 @@
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);
@@ -780,7 +773,7 @@
}
// Save menu is invisible when there's only one read only contact in the editor.
- saveMenu.setVisible(!mRawContactDisplayAloneIsReadOnly);
+ saveMenu.setVisible(!isEditingReadOnlyRawContact());
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() {
@@ -1009,6 +1002,16 @@
}
/**
+ * @return true if the single raw contact we're looking at is read-only.
+ */
+ private boolean isEditingReadOnlyRawContact() {
+ return hasValidState() && mRawContactIdToDisplayAlone > 0
+ && !mState.getByRawContactId(mRawContactIdToDisplayAlone)
+ .getAccountType(AccountTypeManager.getInstance(mContext))
+ .areContactsWritable();
+ }
+
+ /**
* Return true if there are any edits to the current contact which need to
* be saved.
*/
@@ -1249,6 +1252,7 @@
// 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, StructuredName.CONTENT_ITEM_TYPE);
RawContactModifier.ensureKindExists(result, accountType, Phone.CONTENT_ITEM_TYPE);
RawContactModifier.ensureKindExists(result, accountType, Email.CONTENT_ITEM_TYPE);
RawContactModifier.ensureKindExists(result, accountType, Organization.CONTENT_ITEM_TYPE);
@@ -1859,13 +1863,6 @@
getEditorActivity().changePhoto(getPhotoMode());
}
- @Override
- public void onRawContactSelected(long rawContactId, boolean isReadOnly) {
- mRawContactDisplayAloneIsReadOnly = isReadOnly;
- mRawContactIdToDisplayAlone = rawContactId;
- bindEditors();
- }
-
private int getPhotoMode() {
return getContent().isWritablePhotoSet() ? PhotoActionPopup.Modes.WRITE_ABLE_PHOTO
: PhotoActionPopup.Modes.NO_PHOTO;
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index bbd23d4..d3c7535 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -44,7 +44,6 @@
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;
@@ -62,8 +61,6 @@
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.CustomDataItem;
import com.android.contacts.common.model.dataitem.DataKind;
import com.android.contacts.common.util.AccountsListAdapter;
@@ -73,7 +70,6 @@
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;
@@ -120,76 +116,7 @@
* 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>
@@ -578,7 +505,6 @@
}
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);
@@ -618,15 +544,17 @@
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");
+ // Skip null and un-editable fields.
+ if (dataKind == null || !dataKind.editable) {
+ vlog("parse: " + i +
+ (dataKind == null ? " dropped null data kind"
+ : " dropped uneditable mimetype: " + dataKind.mimeType));
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)) {
+ if (DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(mimeType)) {
vlog("parse: " + i + " " + dataKind.mimeType + " dropped pseudo type");
continue;
}
@@ -777,51 +705,16 @@
? EditorUiUtils.getAccountHeaderLabelForMyProfile(getContext(), account)
: account.getNameLabel().toString();
- // Either the account header or selector should be shown, not both.
+ addAccountHeader(accountLabel);
+
+ // If we're saving a new contact and there are multiple accounts, add the account selector.
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);
- }
+ if (mHasNewContact && !mIsUserProfile && accounts.size() > 1) {
+ addAccountSelector(mCurrentRawContactDelta);
}
}
- 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);
- }
- }
- // 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;
- }
-
private void addAccountHeader(String accountLabel) {
mAccountHeaderContainer.setVisibility(View.VISIBLE);
@@ -846,8 +739,10 @@
selectorTitle));
}
- private void addAccountSelector(final RawContactDelta rawContactDelta, CharSequence nameLabel) {
- final View.OnClickListener onClickListener = new View.OnClickListener() {
+ private void addAccountSelector(final RawContactDelta rawContactDelta) {
+ // 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);
@@ -877,53 +772,7 @@
});
popup.show();
}
- };
- setUpAccountSelector(nameLabel.toString(), onClickListener);
- }
-
- 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);
- }
-
- 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() {