Merge "Fix conditional in AccountTypeProvider" into ub-contactsdialer-i-dev
diff --git a/Android.mk b/Android.mk
index 47653cd..1c3fae9 100644
--- a/Android.mk
+++ b/Android.mk
@@ -23,9 +23,6 @@
     $(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 5bdf99d..f76f836 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -15,24 +15,582 @@
 -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.contacts"
-    android:versionCode="10700"
-    android:versionName="1.7.0">
+          package="com.android.contacts"
+          android:versionCode="10700"
+          android:versionName="1.7.0">
 
-    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="25" />
+    <uses-sdk
+        android:minSdkVersion="21"
+        android:targetSdkVersion="25"/>
 
-    <original-package android:name="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
         android:name="com.android.contacts.ContactsApplication"
-        android:label="@string/applicationLabel"
-        android:icon="@mipmap/ic_contacts_launcher"
-        android:taskAffinity="android.task.contacts"
         android:hardwareAccelerated="true"
+        android:icon="@mipmap/ic_contacts_launcher"
+        android:label="@string/applicationLabel"
         android:supportsRtl="true"
-        android:usesCleartextTraffic="false"
-    />
+        android:taskAffinity="android.task.contacts"
+        android:usesCleartextTraffic="false">
+        <!-- The main Contacts activity with the contact list, favorites, and groups. -->
+        <activity
+            android:name=".activities.PeopleActivity"
+            android:alwaysRetainTaskState="true"
+            android:launchMode="singleTop"
+            android:resizeableActivity="true"
+            android:theme="@style/PeopleActivityTheme"
+            >
+            <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:clearTaskOnLaunch="true"
+            android:launchMode="singleTop"
+            android:theme="@style/ContactPickerTheme"
+            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:exported="true"
+            android:targetActivity=".activities.PeopleActivity"
+            />
+
+        <!-- Backwards compatibility: "Contacts" from Gingerbread and earlier -->
+        <activity-alias
+            android:name="DialtactsContactsEntryActivity"
+            android:exported="true"
+            android:targetActivity=".activities.PeopleActivity"
+            />
+
+        <!-- Used to set options -->
+        <activity
+            android:name=".preference.ContactsPreferenceActivity"
+            android:exported="false"
+            android:label="@string/activity_title_settings"
+            android:launchMode="singleTop"
+            android:theme="@style/ContactsPreferencesTheme"/>
+
+        <activity
+            android:name=".activities.LicenseActivity"
+            android:exported="true"
+            android:label="@string/activity_title_licenses"
+            android:theme="@style/ContactsPreferencesTheme"/>
+
+        <!-- Used to filter contacts list by account -->
+        <activity
+            android:name=".list.AccountFilterActivity"
+            android:label="@string/activity_title_contacts_filter"
+            android:theme="@style/ContactListFilterTheme"/>
+
+        <!-- Used to select display and sync groups -->
+        <activity
+            android:name=".list.CustomContactListFilterActivity"
+            android:label="@string/custom_list_filter"
+            android:theme="@style/ContactListFilterTheme"/>
+
+        <activity
+            android:name=".activities.RequestPermissionsActivity"
+            android:exported="false"
+            android:theme="@style/PeopleTheme"/>
+
+        <activity
+            android:name=".activities.RequestDesiredPermissionsActivity"
+            android:exported="false"
+            android:theme="@style/PeopleTheme"/>
+
+        <activity
+            android:name=".activities.RequestImportVCardPermissionsActivity"
+            android:exported="false"
+            android:theme="@style/PeopleTheme"/>
+
+        <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:excludeFromRecents="true"
+            android:launchMode="singleTop"
+            android:taskAffinity=""
+            android:theme="@style/Theme.QuickContact"
+            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:icon="@drawable/logo_quick_contacts_color_44in48dp"
+            android:label="@string/shortcutContact"
+            android:targetActivity=".activities.ContactSelectionActivity">
+
+            <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:icon="@drawable/logo_quick_contacts_dialer_color_44in48dp"
+            android:label="@string/shortcutDialContact"
+            android:targetActivity=".activities.ContactSelectionActivity">
+
+            <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:icon="@drawable/logo_quick_contacts_mail_color_44in48dp"
+            android:label="@string/shortcutMessageContact"
+            android:targetActivity=".activities.ContactSelectionActivity">
+
+            <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:exported="false"
+            android:theme="@style/ContactEditorAccountsChangedActivityTheme"
+            android:windowSoftInputMode="adjustResize"/>
+
+        <!-- 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>
+
+        <!-- Keep support for apps that expect the Compact editor -->
+        <activity-alias
+            android:name="com.android.contacts.activities.CompactContactEditorActivity"
+            android:exported="true"
+            android:targetActivity=".activities.ContactEditorActivity">
+            <intent-filter android:priority="-1">
+                <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-alias>
+
+        <activity
+            android:name=".activities.ContactEditorSpringBoardActivity"
+            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=".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=".util.EmptyService"
+            android:exported="false"/>
+
+        <!-- Service to save a contact -->
+        <service
+            android:name=".ContactSaveService"
+            android:exported="false"/>
+
+        <!-- Service to import contacts from the SIM card -->
+        <service
+            android:name=".SimImportService"
+            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=".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=".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=".vcard.CancelActivity"
+            android:theme="@style/BackgroundOnlyTheme"/>
+
+        <activity
+            android:name=".vcard.SelectAccountActivity"
+            android:theme="@style/BackgroundOnlyTheme"/>
+
+        <activity
+            android:name=".vcard.ExportVCardActivity"
+            android:theme="@style/BackgroundOnlyTheme"/>
+
+        <activity
+            android:name=".vcard.ShareVCardActivity"
+            android:theme="@style/BackgroundOnlyTheme"/>
+
+        <activity
+            android:name=".activities.SimImportActivity"
+            android:label="@string/sim_import_title"
+            android:theme="@style/PeopleThemeAppCompat.FullScreenDialog.SimImportActivity"/>
+
+
+        <service
+            android:name=".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.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:exported="true"
+            android:permission="android.permission.WRITE_CONTACTS">
+            <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:exported="false"
+            android:grantUriPermissions="true">
+            <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
deleted file mode 100644
index ac5e50d..0000000
--- a/AndroidManifest_common.xml
+++ /dev/null
@@ -1,527 +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.
--->
-
-<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=".preference.ContactsPreferenceActivity"
-            android:label="@string/activity_title_settings"
-            android:theme="@style/ContactsPreferencesTheme"
-            android:launchMode="singleTop"
-            android:exported="false"/>
-
-        <activity android:name=".activities.LicenseActivity"
-            android:label="@string/activity_title_licenses"
-            android:theme="@style/ContactsPreferencesTheme"
-            android:exported="true" />
-
-        <!-- Used to filter contacts list by account -->
-        <activity
-            android:name=".list.AccountFilterActivity"
-            android:label="@string/activity_title_contacts_filter"
-            android:theme="@style/ContactListFilterTheme" />
-
-        <!-- Used to select display and sync groups -->
-        <activity
-            android:name=".list.CustomContactListFilterActivity"
-            android:label="@string/custom_list_filter"
-            android:theme="@style/ContactListFilterTheme" />
-
-        <activity
-            android:name=".activities.RequestPermissionsActivity"
-            android:theme="@style/PeopleTheme"
-            android:exported="false"/>
-
-        <activity
-            android:name=".activities.RequestDesiredPermissionsActivity"
-            android:theme="@style/PeopleTheme"
-            android:exported="false"/>
-
-        <activity
-            android:name=".activities.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>
-
-         <!-- Keep support for apps that expect the Compact editor -->
-         <activity-alias android:name="com.android.contacts.activities.CompactContactEditorActivity"
-             android:exported="true"
-             android:targetActivity=".activities.ContactEditorActivity">
-             <intent-filter android:priority="-1">
-                 <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-alias>
-
-         <activity
-            android:name=".activities.ContactEditorSpringBoardActivity"
-            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=".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=".util.EmptyService"
-            android:exported="false" />
-
-        <!-- Service to save a contact -->
-        <service
-            android:name=".ContactSaveService"
-            android:exported="false" />
-
-         <!-- Service to import contacts from the SIM card -->
-         <service
-             android:name=".SimImportService"
-             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=".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=".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=".vcard.CancelActivity"
-            android:theme="@style/BackgroundOnlyTheme" />
-
-        <activity android:name=".vcard.SelectAccountActivity"
-            android:theme="@style/BackgroundOnlyTheme" />
-
-        <activity android:name=".vcard.ExportVCardActivity"
-            android:theme="@style/BackgroundOnlyTheme" />
-
-        <activity android:name=".vcard.ShareVCardActivity"
-                  android:theme="@style/BackgroundOnlyTheme" />
-
-         <activity android:name=".activities.SimImportActivity"
-             android:theme="@style/PeopleThemeAppCompat.FullScreenDialog.SimImportActivity"
-             android:label="@string/sim_import_title" />
-
-
-        <service
-            android:name=".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.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/src/com/android/contacts/util/concurrent/ContactsExecutors.java b/src/com/android/contacts/util/concurrent/ContactsExecutors.java
index bf18876..58a6c1f 100644
--- a/src/com/android/contacts/util/concurrent/ContactsExecutors.java
+++ b/src/com/android/contacts/util/concurrent/ContactsExecutors.java
@@ -25,6 +25,7 @@
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
 
 /**
  * Provides some common executors for use with {@link Futures}
@@ -170,15 +171,15 @@
             RunnableScheduledFuture<T> {
 
         private final Handler mHandler;
-        private final TimeUnit mUnit;
-        private final long mDelay;
+        private final long mDelayMillis;
         private final Callable<T> mTask;
         private final SettableFuture<T> mDelegate = SettableFuture.create();
 
+        private final AtomicLong mStart = new AtomicLong(-1);
+
         private HandlerFuture(Handler handler, long delay, TimeUnit timeUnit, Callable<T> task) {
             mHandler = handler;
-            mUnit = timeUnit;
-            mDelay = delay;
+            mDelayMillis = timeUnit.toMillis(delay);
             mTask = task;
         }
 
@@ -189,12 +190,18 @@
 
         @Override
         public long getDelay(TimeUnit unit) {
-            return unit.convert(mDelay, mUnit);
+            long start = mStart.get();
+            if (start < 0) {
+                return mDelayMillis;
+            }
+            long remaining = mDelayMillis - (System.currentTimeMillis() - start);
+            return TimeUnit.MILLISECONDS.convert(remaining, unit);
         }
 
         @Override
         public int compareTo(Delayed o) {
-            return Long.compare(mDelay, o.getDelay(mUnit));
+            return Long.compare(getDelay(TimeUnit.MILLISECONDS),
+                    o.getDelay(TimeUnit.MILLISECONDS));
         }
 
         @Override
@@ -210,6 +217,10 @@
 
         @Override
         public void run() {
+            if (!mStart.compareAndSet(-1, System.currentTimeMillis())) {
+                // Already started
+                return;
+            }
             try {
                 mDelegate.set(mTask.call());
             } catch (Exception e) {