diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 559e60f..a673ec4 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -120,5 +120,10 @@
             android:exported="true">
         </provider>
 
+        <provider android:name="RawContactsChangeNotificationProvider"
+          android:authorities="com.android.contacts.raw_contacts"
+          android:exported="true">
+        </provider>
+
     </application>
 </manifest>
diff --git a/README-tests.md b/README-tests.md
new file mode 100644
index 0000000..8351c6c
--- /dev/null
+++ b/README-tests.md
@@ -0,0 +1,7 @@
+# Running tests
+
+Use the following command to run the unit tests.
+
+```
+atest ContactsProviderTests ContactsProviderTests2
+```
\ No newline at end of file
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
new file mode 100644
index 0000000..d7be97d
--- /dev/null
+++ b/res/values-as/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core এপসমূহ"</string>
+    <string name="app_label" msgid="3389954322874982620">"সম্পৰ্কসমূহৰ সঞ্চয়াগাৰ"</string>
+    <string name="provider_label" msgid="6012150850819899907">"সম্পর্কবোৰ"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"সম্পৰ্কসূচী আপগ্ৰেড কৰিবলৈ অধিক মেম\'ৰিৰ প্ৰয়োজন।"</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"সম্পৰ্কসূচীৰ বাবে সঞ্চয়াগাৰ আপগ্ৰেড কৰিথকা হৈছে"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="2581831842693151968">"আপগ্ৰেড প্ৰক্ৰিয়া সম্পূৰ্ণ কৰিবলৈ টিপক।"</string>
+    <string name="default_directory" msgid="93961630309570294">"সম্পর্কসূচী"</string>
+    <string name="local_invisible_directory" msgid="705244318477396120">"অন্যান্য"</string>
+    <string name="voicemail_from_column" msgid="435732568832121444">"ইয়াৰ পৰা অহা ভইচমেল "</string>
+    <string name="debug_dump_title" msgid="4916885724165570279">"সম্পৰ্কসূচীৰ ডেটাবেছ প্ৰতিলিপি কৰক"</string>
+    <string name="debug_dump_database_message" msgid="406438635002392290">"আপুনি এই কাৰ্যবোৰ কৰিবলৈ লৈছে ১) সকলো সম্পৰ্ক সম্বন্ধীয় তথ্য় আৰু কল লগ সন্নিবিষ্ট থকা আপোনাৰ ডেটাবেছক আভ্য়ন্তৰীণ সঞ্চয়াগাৰলৈ প্ৰতিলিপি কৰা আৰু ২) ইয়াক ইমেইল কৰা। ডিভাইচৰ পৰা সফলতাৰে প্ৰতিলিপি কৰাৰ বা ইমেইল পোৱাৰ পিছত উক্ত প্ৰতিলিপি মচিবলৈ নাপাহৰিব।"</string>
+    <string name="debug_dump_delete_button" msgid="7832879421132026435">"এতিয়াই মচক"</string>
+    <string name="debug_dump_start_button" msgid="2837506913757600001">"আৰম্ভ কৰক"</string>
+    <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"আপোনাৰ ফাইল পঠাবলৈ কোনো প্ৰ\'গ্ৰাম বাছনি কৰক"</string>
+    <string name="debug_dump_email_subject" msgid="108188398416385976">"সম্পৰ্কসূচী Db সংলগ্ন কৰা হ\'ল"</string>
+    <string name="debug_dump_email_body" msgid="4577749800871444318">"মোৰ সকলো সম্পৰ্ক তথ্য়সহ মোৰ সম্পৰ্কসূচী সংলগ্ন কৰা হ\'ল। সাবধানে চলাব।"</string>
+</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 489b5b7..47fc931 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -27,7 +27,7 @@
     <string name="voicemail_from_column" msgid="435732568832121444">"Hlasová zpráva od uživatele "</string>
     <string name="debug_dump_title" msgid="4916885724165570279">"Kopírování databáze kontaktů"</string>
     <string name="debug_dump_database_message" msgid="406438635002392290">"Chystáte se 1) vytvořit v interním úložišti kopii databáze obsahující všechny informace o kontaktech a veškerou historii hovorů a 2) odeslat ji e-mailem. Po úspěšném zkopírování ze zařízení nebo přijetí e-mailem ji nezapomeňte ihned odstranit."</string>
-    <string name="debug_dump_delete_button" msgid="7832879421132026435">"Smazat nyní"</string>
+    <string name="debug_dump_delete_button" msgid="7832879421132026435">"Smazat teď"</string>
     <string name="debug_dump_start_button" msgid="2837506913757600001">"Spustit"</string>
     <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"Vyberte program pro odeslání souboru."</string>
     <string name="debug_dump_email_subject" msgid="108188398416385976">"Databáze kontaktů v příloze"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index fde3a2f..04cd39e 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -18,15 +18,15 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android-kerneapplikationer"</string>
     <string name="app_label" msgid="3389954322874982620">"Lagring af kontakter"</string>
-    <string name="provider_label" msgid="6012150850819899907">"Kontaktpersoner"</string>
+    <string name="provider_label" msgid="6012150850819899907">"Kontakter"</string>
     <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Opgradering af kontaktpersoner kræver mere hukommelse."</string>
     <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Opgraderer lagring af kontaktpersoner"</string>
     <string name="upgrade_out_of_memory_notification_text" msgid="2581831842693151968">"Tryk for at gennemføre opgraderingen."</string>
-    <string name="default_directory" msgid="93961630309570294">"Kontaktpersoner"</string>
+    <string name="default_directory" msgid="93961630309570294">"Kontakter"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Andre"</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Telefonsvarerbesked fra "</string>
     <string name="debug_dump_title" msgid="4916885724165570279">"Kopiér database med kontaktpersoner"</string>
-    <string name="debug_dump_database_message" msgid="406438635002392290">"Du er ved at 1) lave en kopi af din database, som indeholder alle oplysninger om dine kontaktpersoner og alle opkaldslister, til det interne lager, og 2) sende den som e-mail. Husk at slette kopien, så snart du har kopieret den fra enheden, eller e-mailen er modtaget."</string>
+    <string name="debug_dump_database_message" msgid="406438635002392290">"Du er ved at 1) lave en kopi af din database, som indeholder alle oplysninger om dine kontaktpersoner og alle opkaldslister, til det interne lager, og 2) sende den som mail. Husk at slette kopien, så snart du har kopieret den fra enheden, eller mailen er modtaget."</string>
     <string name="debug_dump_delete_button" msgid="7832879421132026435">"Slet nu"</string>
     <string name="debug_dump_start_button" msgid="2837506913757600001">"Start"</string>
     <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"Vælg et program, for at sende din fil"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 3266571..4af29ec 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -26,7 +26,7 @@
     <string name="local_invisible_directory" msgid="705244318477396120">"سایر موارد"</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"پست صوتی از "</string>
     <string name="debug_dump_title" msgid="4916885724165570279">"کپی پایگاه داده مخاطبین"</string>
-    <string name="debug_dump_database_message" msgid="406438635002392290">"شما در شرف ۱) ایجاد یک کپی از پایگاه داده‌ در حافظه داخلی هستید، این کپی حاوی همه اطلاعات مربوط به مخاطبین و همه گزارشات تماس است و همچنین می‌خواهید ۲) آنرا رایانامه کنید. به خاطر داشته باشید که به محض کپی کردن این نسخه در دستگاه یا دریافت رایانامه، آنرا حذف کنید."</string>
+    <string name="debug_dump_database_message" msgid="406438635002392290">"شما در شرف ۱) ایجاد یک کپی از پایگاه داده‌ در حافظه داخلی هستید، این کپی حاوی همه اطلاعات مربوط به مخاطبین و همه گزارشات تماس است و همچنین می‌خواهید ۲) آنرا ایمیل کنید. به خاطر داشته باشید که به محض کپی کردن این نسخه در دستگاه یا دریافت ایمیل، آنرا حذف کنید."</string>
     <string name="debug_dump_delete_button" msgid="7832879421132026435">"اکنون حذف شود"</string>
     <string name="debug_dump_start_button" msgid="2837506913757600001">"شروع"</string>
     <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"یک برنامه را برای ارسال فایل خود انتخاب کنید"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index a4f324e..171febe 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -29,7 +29,7 @@
     <string name="debug_dump_database_message" msgid="406438635002392290">"आपण 1) आपल्‍या डेटाबेसची प्रत बनवणार आहात जिच्‍यामध्‍ये सर्व संपर्कांसंबंधी माहिती आणि अंतर्गत संचयनावरील कॉल लॉग समाविष्‍ट असतात आणि 2) ती ईमेल करणार आहात. आपण डिव्‍हाइसवरून यशस्‍वीरित्‍या प्रत कॉपी केल्‍यानंतर किंवा ईमेल प्राप्त केल्‍यानंतर लगेच ती हटविण्‍याचे लक्षात ठेवा."</string>
     <string name="debug_dump_delete_button" msgid="7832879421132026435">"आता हटवा"</string>
     <string name="debug_dump_start_button" msgid="2837506913757600001">"प्रारंभ करा"</string>
-    <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"आपली फाईल पाठविण्‍यासाठी एक प्रोग्राम निवडा"</string>
+    <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"तुमची फाईल पाठविण्‍यासाठी एक प्रोग्राम निवडा"</string>
     <string name="debug_dump_email_subject" msgid="108188398416385976">"संपर्क Db संलग्‍न केला"</string>
     <string name="debug_dump_email_body" msgid="4577749800871444318">"संलग्‍न केलेला माझ्‍या सर्व संपर्क माहितीसह माझा संपर्क डेटाबेस आहे. काळजीपूर्वक हाताळणी करा."</string>
 </resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
new file mode 100644
index 0000000..c6bfa21
--- /dev/null
+++ b/res/values-or/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="sharedUserLabel" msgid="8024311725474286801">"Android କୋର୍ ଆପ୍"</string>
+    <string name="app_label" msgid="3389954322874982620">"ଯୋଗାଯୋଗ ଷ୍ଟୋରେଜ୍"</string>
+    <string name="provider_label" msgid="6012150850819899907">"ଯୋଗାଯୋଗ"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"ଯୋଗାଯୋଗ ଅପଗ୍ରେଡ୍ ପାଇଁ ଅଧିକ ମେମୋରୀ ଦରକାର।"</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"ଯୋଗାଯୋଗ ପାଇଁ ଷ୍ଟୋରେଜ୍ ଅପଗ୍ରେଡ୍ କରାଯାଉଛି"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="2581831842693151968">"ଅପଗ୍ରେଡ୍ ସମ୍ପୂର୍ଣ୍ଣ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
+    <string name="default_directory" msgid="93961630309570294">"ଯୋଗାଯୋଗ"</string>
+    <string name="local_invisible_directory" msgid="705244318477396120">"ଅନ୍ୟାନ୍ୟ"</string>
+    <string name="voicemail_from_column" msgid="435732568832121444">"ଏହାଙ୍କଠାରୁ ଭଏସମେଲ୍‌ "</string>
+    <string name="debug_dump_title" msgid="4916885724165570279">"ଯୋଗାଯୋଗ ଡାଟାବେସ୍ କପୀ କରନ୍ତୁ"</string>
+    <string name="debug_dump_database_message" msgid="406438635002392290">"ଆପଣ 1) ଇଣ୍ଟର୍ନଲ ଷ୍ଟୋରେଜରେ ନିଜ ଡାଟାବେସ୍‌ର ଏକ କପୀ ବନାନ୍ତୁ, ଯେଉଁଥିରେ ଯୋଗାଯୋଗ ସମ୍ବନ୍ଧିତ ସମସ୍ତ ତଥ୍ୟ ଏବଂ କଲ୍ ଲଗ୍ ସାମିଲ ରହିବ ଏବଂ 2) ଏହାକୁ ଇମେଲ୍ କରନ୍ତୁ। ମନେରଖନ୍ତୁ, ଡିଭାଇସ୍‌ରୁ ସଫଳତାପୂର୍ବକ ଏହାର କପୀ କରିସାରିବା ପରେ କିମ୍ୱା ଇମେଲ୍ ପ୍ରାପ୍ତ ହୋଇସାରିବା ପରେ, ଏହି କପୀକୁ ଡିଲିଟ୍ କରିଦେବେ।"</string>
+    <string name="debug_dump_delete_button" msgid="7832879421132026435">"ବର୍ତ୍ତମାନ ଡିଲିଟ୍ କରନ୍ତୁ"</string>
+    <string name="debug_dump_start_button" msgid="2837506913757600001">"ଆରମ୍ଭ କରନ୍ତୁ"</string>
+    <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"ନିଜ ଫାଇଲ ପଠାଇବା ପାଇଁ ଗୋଟିଏ ପ୍ରୋଗ୍ରାମ୍ ବାଛନ୍ତୁ"</string>
+    <string name="debug_dump_email_subject" msgid="108188398416385976">"ଯୋଗାଯୋଗ Db ଆଟାଚ୍ କରାଗଲା"</string>
+    <string name="debug_dump_email_body" msgid="4577749800871444318">"ମୋର ସମସ୍ତ ଯୋଗାଯୋଗ ସୂଚନା ସହିତ ମୋର ଯୋଗାଯୋଗ ଡାଟାବେସ୍‌କୁ ଆଟାଚ୍ କରାଯାଇଛି। ସାବଧାନତାର ସହ କାମ କରନ୍ତୁ।"</string>
+</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index f259d83..decb5b6 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -26,7 +26,7 @@
     <string name="local_invisible_directory" msgid="705244318477396120">"其他"</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"語音郵件寄件者： "</string>
     <string name="debug_dump_title" msgid="4916885724165570279">"複製聯絡人資料庫"</string>
-    <string name="debug_dump_database_message" msgid="406438635002392290">"您即將要 1) 將您的資料庫 (包含所有聯絡人相關資訊及所有通話紀錄) 複製到內部儲存空間，以及 2) 透過電子郵件傳送副本。提醒您，當您順利複製裝置上的資料或收到電子郵件後，請儘快刪除副本。"</string>
+    <string name="debug_dump_database_message" msgid="406438635002392290">"您即將要 1) 將您的資料庫 (包含所有聯絡人相關資訊及所有通話記錄) 複製到內部儲存空間，以及 2) 透過電子郵件傳送副本。提醒您，當您順利複製裝置上的資料或收到電子郵件後，請儘快刪除副本。"</string>
     <string name="debug_dump_delete_button" msgid="7832879421132026435">"立即刪除"</string>
     <string name="debug_dump_start_button" msgid="2837506913757600001">"開始"</string>
     <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"選擇要傳送檔案的程式"</string>
diff --git a/run-all-tests.sh b/run-all-tests.sh
deleted file mode 100755
index 84a2ce3..0000000
--- a/run-all-tests.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# 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.
-#
-
-set -e
-
-cd $ANDROID_BUILD_TOP
-
-. build/envsetup.sh
-
-mmm -j32 packages/providers/ContactsProvider
-adb install -t -r -g $ANDROID_PRODUCT_OUT/system/priv-app/ContactsProvider/ContactsProvider.apk
-adb install -t -r -g $ANDROID_PRODUCT_OUT/data/app/ContactsProviderTests/ContactsProviderTests.apk
-adb install -t -r -g $ANDROID_PRODUCT_OUT/data/app/ContactsProviderTests2/ContactsProviderTests2.apk
-
-runtest() {
-    log=/tmp/$$.log
-    adb shell am instrument -w "${@}" |& tee $log
-    if grep -q FAILURES $log || ! grep -P -q 'OK \([1-9]' $log ; then
-        return 1
-    else
-        return 0
-    fi
-
-}
-
-runtest com.android.providers.contacts.tests
-runtest com.android.providers.contacts.tests2
\ No newline at end of file
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index 6834589..f522e41 100644
--- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -136,9 +136,10 @@
      *   1100-1199 N
      *   1200-1299 O
      *   1300-1399 P
+     *   1400-1499 Q
      * </pre>
      */
-    static final int DATABASE_VERSION = 1300;
+    static final int DATABASE_VERSION = 1400;
     private static final int MINIMUM_SUPPORTED_VERSION = 700;
 
     @VisibleForTesting
@@ -333,9 +334,6 @@
         public static final String RAW_ENTITIES = "view_raw_entities";
         public static final String GROUPS = "view_groups";
 
-        /** The data_usage_stat table joined with other tables. */
-        public static final String DATA_USAGE_STAT = "view_data_usage_stat";
-
         /** The data_usage_stat table with the low-res columns. */
         public static final String DATA_USAGE_LR = "view_data_usage";
         public static final String STREAM_ITEMS = "view_stream_items";
@@ -422,11 +420,6 @@
         public static final String CONCRETE_PHOTO_FILE_ID = Tables.CONTACTS + "."
                 + Contacts.PHOTO_FILE_ID;
 
-        public static final String CONCRETE_RAW_TIMES_CONTACTED = Tables.CONTACTS + "."
-                + Contacts.RAW_TIMES_CONTACTED;
-        public static final String CONCRETE_RAW_LAST_TIME_CONTACTED = Tables.CONTACTS + "."
-                + Contacts.RAW_LAST_TIME_CONTACTED;
-
         public static final String CONCRETE_STARRED = Tables.CONTACTS + "." + Contacts.STARRED;
         public static final String CONCRETE_PINNED = Tables.CONTACTS + "." + Contacts.PINNED;
         public static final String CONCRETE_CUSTOM_RINGTONE = Tables.CONTACTS + "."
@@ -471,10 +464,6 @@
                 Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE;
         public static final String CONCRETE_SEND_TO_VOICEMAIL =
                 Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL;
-        public static final String CONCRETE_RAW_LAST_TIME_CONTACTED =
-                Tables.RAW_CONTACTS + "." + RawContacts.RAW_LAST_TIME_CONTACTED;
-        public static final String CONCRETE_RAW_TIMES_CONTACTED =
-                Tables.RAW_CONTACTS + "." + RawContacts.RAW_TIMES_CONTACTED;
         public static final String CONCRETE_STARRED =
                 Tables.RAW_CONTACTS + "." + RawContacts.STARRED;
         public static final String CONCRETE_PINNED =
@@ -748,18 +737,6 @@
         public static final String RAW_TIMES_USED = Data.RAW_TIMES_USED;
         public static final String LR_TIMES_USED = Data.LR_TIMES_USED;
 
-        public static final String CONCRETE_RAW_LAST_TIME_USED =
-                Tables.DATA_USAGE_STAT + "." + RAW_LAST_TIME_USED;
-
-        public static final String CONCRETE_RAW_TIMES_USED =
-                Tables.DATA_USAGE_STAT + "." + RAW_TIMES_USED;
-
-        public static final String CONCRETE_LR_LAST_TIME_USED =
-                Tables.DATA_USAGE_STAT + "." + LR_LAST_TIME_USED;
-
-        public static final String CONCRETE_LR_TIMES_USED =
-                Tables.DATA_USAGE_STAT + "." + LR_TIMES_USED;
-
         /** type: INTEGER */
         public static final String USAGE_TYPE_INT = "usage_type";
         public static final String CONCRETE_USAGE_TYPE =
@@ -928,60 +905,6 @@
         }
     }
 
-    /** Placeholder for the methods to build the "low-res" SQL expressions. */
-    @VisibleForTesting
-    interface LowRes {
-        /** To be replaced with a real column name.  Only used within this interface. */
-        String TEMPLATE_PLACEHOLDER = "XX";
-
-        /**
-         * To be replaced with a constant in the expression.
-         * Only used within this interface.
-         */
-        String CONSTANT_PLACEHOLDER = "YY";
-
-        /** Only used within this interface. */
-        int TIMES_USED_GRANULARITY = 10;
-
-        /** Only used within this interface. */
-        int LAST_TIME_USED_GRANULARITY = 24 * 60 * 60;
-
-        /**
-         * Template to build the "low-res times used/contacted".  Only used within this interface.
-         * The outermost cast is needed to tell SQLite that the result is of the integer type.
-         */
-        String TEMPLATE_TIMES_USED =
-                ("cast(ifnull((case when (XX) <= 0 then 0"
-                + " when (XX) < (YY) then (XX)"
-                + " else (cast((XX) as int) / (YY)) * (YY) end), 0) as int)")
-                .replaceAll(CONSTANT_PLACEHOLDER, String.valueOf(TIMES_USED_GRANULARITY));
-
-        /**
-         * Template to build the "low-res last time used/contacted".
-         * Only used within this interface.
-         * The outermost cast is needed to tell SQLite that the result is of the integer type.
-         */
-        String TEMPLATE_LAST_TIME_USED =
-                ("cast((cast((XX) as int) / (YY)) * (YY) as int)")
-                .replaceAll(CONSTANT_PLACEHOLDER, String.valueOf(LAST_TIME_USED_GRANULARITY));
-
-        /**
-         * Build the SQL expression for the "low-res times used/contacted" expression from the
-         * give column name.
-         */
-        static String getTimesUsedExpression(String column) {
-            return TEMPLATE_TIMES_USED.replaceAll(TEMPLATE_PLACEHOLDER, column);
-        }
-
-        /**
-         * Build the SQL expression for the "low-res last time used/contacted" expression from the
-         * give column name.
-         */
-        static String getLastTimeUsedExpression(String column) {
-            return TEMPLATE_LAST_TIME_USED.replaceAll(TEMPLATE_PLACEHOLDER, column);
-        }
-    }
-
     private static final String TAG = "ContactsDatabaseHelper";
 
     private static final String DATABASE_NAME = "contacts2.db";
@@ -1895,7 +1818,7 @@
         db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS + ";");
         db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_ENTITIES + ";");
         db.execSQL("DROP VIEW IF EXISTS " + Views.ENTITIES + ";");
-        db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_STAT + ";");
+        db.execSQL("DROP VIEW IF EXISTS view_data_usage_stat;");
         db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_LR + ";");
         db.execSQL("DROP VIEW IF EXISTS " + Views.STREAM_ITEMS + ";");
         db.execSQL("DROP VIEW IF EXISTS " + Views.METADATA_SYNC_STATE + ";");
@@ -1971,15 +1894,11 @@
                 + ContactsColumns.CONCRETE_SEND_TO_VOICEMAIL
                         + " AS " + Contacts.SEND_TO_VOICEMAIL + ","
 
-                + ContactsColumns.CONCRETE_RAW_LAST_TIME_CONTACTED
-                        + " AS " + Contacts.RAW_LAST_TIME_CONTACTED + ","
-                + ContactsColumns.CONCRETE_RAW_TIMES_CONTACTED
-                        + " AS " + Contacts.RAW_TIMES_CONTACTED + ","
+                + "0 AS " + Contacts.RAW_LAST_TIME_CONTACTED + ","
+                + "0 AS " + Contacts.RAW_TIMES_CONTACTED + ","
 
-                + LowRes.getLastTimeUsedExpression(ContactsColumns.CONCRETE_RAW_LAST_TIME_CONTACTED)
-                        + " AS " + Contacts.LR_LAST_TIME_CONTACTED + ","
-                + LowRes.getTimesUsedExpression(ContactsColumns.CONCRETE_RAW_TIMES_CONTACTED)
-                        + " AS " + Contacts.LR_TIMES_CONTACTED + ","
+                + "0 AS " + Contacts.LR_LAST_TIME_CONTACTED + ","
+                + "0 AS " + Contacts.LR_TIMES_CONTACTED + ","
 
                 + ContactsColumns.CONCRETE_STARRED
                         + " AS " + Contacts.STARRED + ","
@@ -2050,12 +1969,10 @@
         String rawContactOptionColumns =
                 RawContacts.CUSTOM_RINGTONE + ","
                 + RawContacts.SEND_TO_VOICEMAIL + ","
-                + RawContacts.RAW_LAST_TIME_CONTACTED + ","
-                + LowRes.getLastTimeUsedExpression(RawContacts.RAW_LAST_TIME_CONTACTED)
-                        + " AS " + RawContacts.LR_LAST_TIME_CONTACTED + ","
-                + RawContacts.RAW_TIMES_CONTACTED + ","
-                + LowRes.getTimesUsedExpression(RawContacts.RAW_TIMES_CONTACTED)
-                        + " AS " + RawContacts.LR_TIMES_CONTACTED + ","
+                + "0 AS " + RawContacts.RAW_LAST_TIME_CONTACTED + ","
+                + "0 AS " + RawContacts.LR_LAST_TIME_CONTACTED + ","
+                + "0 AS " + RawContacts.RAW_TIMES_CONTACTED + ","
+                + "0 AS " + RawContacts.LR_TIMES_CONTACTED + ","
                 + RawContacts.STARRED + ","
                 + RawContacts.PINNED;
 
@@ -2093,10 +2010,8 @@
                 + contactNameColumns + ", "
                 + baseContactColumns + ", "
 
-                + ContactsColumns.CONCRETE_RAW_LAST_TIME_CONTACTED
-                        + " AS " + Contacts.RAW_LAST_TIME_CONTACTED + ", "
-                + LowRes.getLastTimeUsedExpression(ContactsColumns.CONCRETE_RAW_LAST_TIME_CONTACTED)
-                        + " AS " + Contacts.LR_LAST_TIME_CONTACTED + ", "
+                + "0 AS " + Contacts.RAW_LAST_TIME_CONTACTED + ", "
+                + "0 AS " + Contacts.LR_LAST_TIME_CONTACTED + ", "
 
                 + ContactsColumns.CONCRETE_SEND_TO_VOICEMAIL
                         + " AS " + Contacts.SEND_TO_VOICEMAIL + ", "
@@ -2105,10 +2020,8 @@
                 + ContactsColumns.CONCRETE_PINNED
                 + " AS " + Contacts.PINNED + ", "
 
-                + ContactsColumns.CONCRETE_RAW_TIMES_CONTACTED
-                        + " AS " + Contacts.RAW_TIMES_CONTACTED + ", "
-                + LowRes.getTimesUsedExpression(ContactsColumns.CONCRETE_RAW_TIMES_CONTACTED)
-                        + " AS " + Contacts.LR_TIMES_CONTACTED;
+                + "0 AS " + Contacts.RAW_TIMES_CONTACTED + ", "
+                + "0 AS " + Contacts.LR_TIMES_CONTACTED;
 
         String contactsSelect = "SELECT "
                 + ContactsColumns.CONCRETE_ID + " AS " + Contacts._ID + ","
@@ -2198,44 +2111,22 @@
         db.execSQL("CREATE VIEW " + Views.ENTITIES + " AS "
                 + entitiesSelect);
 
-        // Data usage view, with the low res columns, with no joins.
+        // View on top of DATA_USAGE_STAT, which is always empty.
         final String dataUsageViewSelect = "SELECT "
                 + DataUsageStatColumns._ID + ", "
                 + DataUsageStatColumns.DATA_ID + ", "
                 + DataUsageStatColumns.USAGE_TYPE_INT + ", "
-                + DataUsageStatColumns.RAW_TIMES_USED + ", "
-                + DataUsageStatColumns.RAW_LAST_TIME_USED + ","
-                + LowRes.getTimesUsedExpression(DataUsageStatColumns.RAW_TIMES_USED)
-                    + " AS " + DataUsageStatColumns.LR_TIMES_USED + ","
-                + LowRes.getLastTimeUsedExpression(DataUsageStatColumns.RAW_LAST_TIME_USED)
-                    + " AS " + DataUsageStatColumns.LR_LAST_TIME_USED
-                + " FROM " + Tables.DATA_USAGE_STAT;
+                + "0 AS " + DataUsageStatColumns.RAW_TIMES_USED + ", "
+                + "0 AS " + DataUsageStatColumns.RAW_LAST_TIME_USED + ","
+                + "0 AS " + DataUsageStatColumns.LR_TIMES_USED + ","
+                + "0 AS " + DataUsageStatColumns.LR_LAST_TIME_USED
+                + " FROM " + Tables.DATA_USAGE_STAT
+                + " WHERE 0";
 
         // When the data_usage_stat table is needed with the low-res columns, use this, which is
         // faster than the DATA_USAGE_STAT view since it doesn't involve joins.
         db.execSQL("CREATE VIEW " + Views.DATA_USAGE_LR + " AS " + dataUsageViewSelect);
 
-        String dataUsageStatSelect = "SELECT "
-                + DataUsageStatColumns.CONCRETE_ID + " AS " + DataUsageStatColumns._ID + ", "
-                + DataUsageStatColumns.DATA_ID + ", "
-                + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", "
-                + MimetypesColumns.CONCRETE_MIMETYPE + " AS " + Data.MIMETYPE + ", "
-                + DataUsageStatColumns.USAGE_TYPE_INT + ", "
-                + DataUsageStatColumns.RAW_TIMES_USED + ", "
-                + DataUsageStatColumns.RAW_LAST_TIME_USED + ", "
-                + DataUsageStatColumns.LR_TIMES_USED + ", "
-                + DataUsageStatColumns.LR_LAST_TIME_USED
-                + " FROM " + Views.DATA_USAGE_LR + " AS " + Tables.DATA_USAGE_STAT
-                + " JOIN " + Tables.DATA + " ON ("
-                +   DataColumns.CONCRETE_ID + "=" + DataUsageStatColumns.CONCRETE_DATA_ID + ")"
-                + " JOIN " + Tables.RAW_CONTACTS + " ON ("
-                +   RawContactsColumns.CONCRETE_ID + "=" + DataColumns.CONCRETE_RAW_CONTACT_ID
-                    + " )"
-                + " JOIN " + Tables.MIMETYPES + " ON ("
-                +   MimetypesColumns.CONCRETE_ID + "=" + DataColumns.CONCRETE_MIMETYPE_ID + ")";
-
-        db.execSQL("CREATE VIEW " + Views.DATA_USAGE_STAT + " AS " + dataUsageStatSelect);
-
         String streamItemSelect = "SELECT " +
                 StreamItemsColumns.CONCRETE_ID + ", " +
                 ContactsColumns.CONCRETE_ID + " AS " + StreamItems.CONTACT_ID + ", " +
@@ -2676,6 +2567,12 @@
             oldVersion = 1300;
         }
 
+        if (isUpgradeRequired(oldVersion, newVersion, 1400)) {
+            ContactsProvider2.deleteDataUsage(db);
+            upgradeViewsAndTriggers = true;
+            oldVersion = 1400;
+        }
+
         // We extracted "calls" and "voicemail_status" at this point, but we can't remove them here
         // yet, until CallLogDatabaseHelper moves the data.
 
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 54b4a27..3b93e71 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -216,15 +216,6 @@
     private static final String WRITE_PERMISSION = "android.permission.WRITE_CONTACTS";
     private static final String INTERACT_ACROSS_USERS = "android.permission.INTERACT_ACROSS_USERS";
 
-    /* package */ static final String UPDATE_TIMES_CONTACTED_CONTACTS_TABLE =
-          "UPDATE " + Tables.CONTACTS + " SET " + Contacts.RAW_TIMES_CONTACTED + "=" +
-          " ifnull(" + Contacts.RAW_TIMES_CONTACTED + ",0)+1" +
-          " WHERE " + Contacts._ID + "=?";
-
-    /* package */ static final String UPDATE_TIMES_CONTACTED_RAWCONTACTS_TABLE =
-          "UPDATE " + Tables.RAW_CONTACTS + " SET " + RawContacts.RAW_TIMES_CONTACTED + "=" +
-          " ifnull(" + RawContacts.RAW_TIMES_CONTACTED + ",0)+1 " +
-          " WHERE " + RawContacts.CONTACT_ID + "=?";
 
     /* package */ static final String PHONEBOOK_COLLATOR_NAME = "PHONEBOOK";
 
@@ -310,9 +301,6 @@
     public static final ProfileAwareUriMatcher sUriMatcher =
             new ProfileAwareUriMatcher(UriMatcher.NO_MATCH);
 
-    private static final String FREQUENT_ORDER_BY = DataUsageStatColumns.RAW_TIMES_USED + " DESC,"
-            + Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
-
     public static final int CONTACTS = 1000;
     public static final int CONTACTS_ID = 1001;
     public static final int CONTACTS_LOOKUP = 1002;
@@ -595,36 +583,6 @@
             " WHERE " + RawContacts.CONTACT_ID + " = ?1 AND " + Contacts.PINNED + " <= " +
             PinnedPositions.DEMOTED;
 
-    // Contacts contacted within the last 3 days (in seconds)
-    private static final long LAST_TIME_USED_3_DAYS_SEC = 3L * 24 * 60 * 60;
-
-    // Contacts contacted within the last 7 days (in seconds)
-    private static final long LAST_TIME_USED_7_DAYS_SEC = 7L * 24 * 60 * 60;
-
-    // Contacts contacted within the last 14 days (in seconds)
-    private static final long LAST_TIME_USED_14_DAYS_SEC = 14L * 24 * 60 * 60;
-
-    // Contacts contacted within the last 30 days (in seconds)
-    private static final long LAST_TIME_USED_30_DAYS_SEC = 30L * 24 * 60 * 60;
-
-    private static final String RAW_TIME_SINCE_LAST_USED_SEC =
-            "(strftime('%s', 'now') - " + DataUsageStatColumns.RAW_LAST_TIME_USED + "/1000)";
-
-    private static final String LR_TIME_SINCE_LAST_USED_SEC =
-            "(strftime('%s', 'now') - " + DataUsageStatColumns.LR_LAST_TIME_USED + "/1000)";
-
-    private static final String SORT_BY_DATA_USAGE =
-            "(CASE WHEN " + RAW_TIME_SINCE_LAST_USED_SEC + " < " + LAST_TIME_USED_3_DAYS_SEC +
-            " THEN 0 " +
-                    " WHEN " + RAW_TIME_SINCE_LAST_USED_SEC + " < " + LAST_TIME_USED_7_DAYS_SEC +
-            " THEN 1 " +
-                    " WHEN " + RAW_TIME_SINCE_LAST_USED_SEC + " < " + LAST_TIME_USED_14_DAYS_SEC +
-            " THEN 2 " +
-                    " WHEN " + RAW_TIME_SINCE_LAST_USED_SEC + " < " + LAST_TIME_USED_30_DAYS_SEC +
-            " THEN 3 " +
-            " ELSE 4 END), " +
-            DataUsageStatColumns.RAW_TIMES_USED + " DESC";
-
     /*
      * Sorting order for email address suggestions: first starred, then the rest.
      * Within the two groups:
@@ -637,7 +595,6 @@
     private static final String EMAIL_FILTER_SORT_ORDER =
         Contacts.STARRED + " DESC, "
         + Data.IS_SUPER_PRIMARY + " DESC, "
-        + SORT_BY_DATA_USAGE + ", "
         + Contacts.IN_VISIBLE_GROUP + " DESC, "
         + Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC, "
         + Data.CONTACT_ID + ", "
@@ -676,7 +633,7 @@
             .add(Contacts.DISPLAY_NAME_SOURCE)
             .add(Contacts.IN_DEFAULT_DIRECTORY)
             .add(Contacts.IN_VISIBLE_GROUP)
-            .add(Contacts.LR_LAST_TIME_CONTACTED)
+            .add(Contacts.LR_LAST_TIME_CONTACTED, "0")
             .add(Contacts.LOOKUP_KEY)
             .add(Contacts.PHONETIC_NAME)
             .add(Contacts.PHONETIC_NAME_STYLE)
@@ -693,7 +650,7 @@
             .add(ContactsColumns.PHONEBOOK_BUCKET_ALTERNATIVE)
             .add(Contacts.STARRED)
             .add(Contacts.PINNED)
-            .add(Contacts.LR_TIMES_CONTACTED)
+            .add(Contacts.LR_TIMES_CONTACTED, "0")
             .add(Contacts.HAS_PHONE_NUMBER)
             .add(Contacts.CONTACT_LAST_UPDATED_TIMESTAMP)
             .build();
@@ -796,8 +753,8 @@
             .build();
 
     private static final ProjectionMap sDataUsageColumns = ProjectionMap.builder()
-            .add(Data.LR_TIMES_USED, Tables.DATA_USAGE_STAT + "." + Data.LR_TIMES_USED)
-            .add(Data.LR_LAST_TIME_USED, Tables.DATA_USAGE_STAT + "." + Data.LR_LAST_TIME_USED)
+            .add(Data.LR_TIMES_USED, "0")
+            .add(Data.LR_LAST_TIME_USED, "0")
             .build();
 
     /** Contains just BaseColumns._COUNT */
@@ -830,12 +787,8 @@
 
     private static final ProjectionMap sStrequentFrequentProjectionMap = ProjectionMap.builder()
             .addAll(sContactsProjectionMap)
-            // Note this should ideally be "lowres(SUM)" rather than "SUM(lowres)", but we do it
-            // this way for performance reasons.
-            .add(DataUsageStatColumns.LR_TIMES_USED,
-                    "SUM(" + DataUsageStatColumns.CONCRETE_LR_TIMES_USED + ")")
-            .add(DataUsageStatColumns.LR_LAST_TIME_USED,
-                    "MAX(" + DataUsageStatColumns.CONCRETE_LR_LAST_TIME_USED + ")")
+            .add(DataUsageStatColumns.LR_TIMES_USED, "0")
+            .add(DataUsageStatColumns.LR_LAST_TIME_USED, "0")
             .build();
 
     /**
@@ -847,8 +800,8 @@
     private static final ProjectionMap sStrequentPhoneOnlyProjectionMap
             = ProjectionMap.builder()
             .addAll(sContactsProjectionMap)
-            .add(DataUsageStatColumns.LR_TIMES_USED)
-            .add(DataUsageStatColumns.LR_LAST_TIME_USED)
+            .add(DataUsageStatColumns.LR_TIMES_USED, "0")
+            .add(DataUsageStatColumns.LR_LAST_TIME_USED, "0")
             .add(Phone.NUMBER)
             .add(Phone.TYPE)
             .add(Phone.LABEL)
@@ -1527,6 +1480,10 @@
     private boolean mSyncToNetwork;
     private boolean mSyncToMetadataNetWork;
 
+    private boolean mRawContactInserted;
+    private boolean mRawContactUpdated;
+    private boolean mRawContactDeleted;
+
     private LocaleSet mCurrentLocales;
     private int mContactsAccountCount;
 
@@ -2629,6 +2586,22 @@
 
         getContext().getContentResolver().notifyChange(MetadataSync.METADATA_AUTHORITY_URI,
                 null, syncToMetadataNetwork);
+
+        if (mRawContactInserted) {
+            getContext().getContentResolver().notifyChange(
+                    RawContacts.RAW_CONTACTS_NOTIFICATION_INSERT_URI, null);
+            mRawContactInserted = false;
+        }
+        if (mRawContactUpdated) {
+            getContext().getContentResolver().notifyChange(
+                    RawContacts.RAW_CONTACTS_NOTIFICATION_UPDATE_URI, null);
+            mRawContactUpdated = false;
+        }
+        if (mRawContactDeleted) {
+            getContext().getContentResolver().notifyChange(
+                    RawContacts.RAW_CONTACTS_NOTIFICATION_DELETE_URI, null);
+            mRawContactDeleted = false;
+        }
     }
 
     protected void setProviderStatus(int status) {
@@ -2930,6 +2903,7 @@
         }
 
         mProviderStatusUpdateNeeded = true;
+        mRawContactInserted = true;
         return rawContactId;
     }
 
@@ -3698,7 +3672,7 @@
             }
 
             case CONTACTS_DELETE_USAGE: {
-                return deleteDataUsage();
+                return deleteDataUsage(db);
             }
 
             case RAW_CONTACTS:
@@ -3920,6 +3894,9 @@
         if (!contactIsSingleton) {
             mAggregator.get().updateAggregateData(mTransactionContext.get(), contactId);
         }
+        if (count != 0) {
+            mRawContactDeleted = true;
+        }
         return count;
     }
 
@@ -4002,8 +3979,7 @@
                 /* callerIsMetadataSyncAdapter =*/false);
     }
 
-    private int deleteDataUsage() {
-        final SQLiteDatabase db = mDbHelper.get().getWritableDatabase();
+    static int deleteDataUsage(SQLiteDatabase db) {
         db.execSQL("UPDATE " + Tables.RAW_CONTACTS + " SET " +
                 Contacts.RAW_TIMES_CONTACTED + "=0," +
                 Contacts.RAW_LAST_TIME_CONTACTED + "=NULL");
@@ -4247,7 +4223,7 @@
             }
 
             case DATA_USAGE_FEEDBACK_ID: {
-                count = handleDataUsageFeedback(uri) ? 1 : 0;
+                count = 0;
                 break;
             }
 
@@ -4521,21 +4497,20 @@
      * LAST_TIME_CONTACTED.
      */
     private ContentValues fixUpUsageColumnsForEdit(ContentValues cv) {
-        if (!cv.containsKey(Contacts.LR_LAST_TIME_CONTACTED)
-                && !cv.containsKey(Contacts.LR_TIMES_CONTACTED)) {
+        final boolean hasLastTime = cv.containsKey(Contacts.LR_LAST_TIME_CONTACTED);
+        final boolean hasTimes = cv.containsKey(Contacts.LR_TIMES_CONTACTED);
+        if (!hasLastTime && !hasTimes) {
             return cv;
         }
         final ContentValues ret = new ContentValues(cv);
-
-        ContactsDatabaseHelper.copyLongValue(
-                ret, Contacts.RAW_LAST_TIME_CONTACTED,
-                ret, Contacts.LR_LAST_TIME_CONTACTED);
-        ContactsDatabaseHelper.copyLongValue(
-                ret, Contacts.RAW_TIMES_CONTACTED,
-                ret, Contacts.LR_TIMES_CONTACTED);
-
-        ret.remove(Contacts.LR_LAST_TIME_CONTACTED);
-        ret.remove(Contacts.LR_TIMES_CONTACTED);
+        if (hasLastTime) {
+            ret.putNull(Contacts.RAW_LAST_TIME_CONTACTED);
+            ret.remove(Contacts.LR_LAST_TIME_CONTACTED);
+        }
+        if (hasTimes) {
+            ret.put(Contacts.RAW_TIMES_CONTACTED, 0);
+            ret.remove(Contacts.LR_TIMES_CONTACTED);
+        }
         return ret;
     }
 
@@ -4694,6 +4669,9 @@
             }
             mTransactionContext.get().markRawContactChangedOrDeletedOrInserted(rawContactId);
         }
+        if (count != 0) {
+            mRawContactUpdated = true;
+        }
         return count;
     }
 
@@ -4797,12 +4775,12 @@
         ContactsDatabaseHelper.copyLongValue(
                 values, RawContacts.SEND_TO_VOICEMAIL,
                 inputValues, Contacts.SEND_TO_VOICEMAIL);
-        ContactsDatabaseHelper.copyLongValue(
-                values, RawContacts.RAW_LAST_TIME_CONTACTED,
-                inputValues, Contacts.RAW_LAST_TIME_CONTACTED);
-        ContactsDatabaseHelper.copyLongValue(
-                values, RawContacts.RAW_TIMES_CONTACTED,
-                inputValues, Contacts.RAW_TIMES_CONTACTED);
+        if (inputValues.containsKey(RawContacts.RAW_LAST_TIME_CONTACTED)) {
+            values.putNull(RawContacts.RAW_LAST_TIME_CONTACTED);
+        }
+        if (inputValues.containsKey(RawContacts.RAW_TIMES_CONTACTED)) {
+            values.put(RawContacts.RAW_TIMES_CONTACTED, 0);
+        }
         ContactsDatabaseHelper.copyLongValue(
                 values, RawContacts.STARRED,
                 inputValues, Contacts.STARRED);
@@ -4862,12 +4840,12 @@
         ContactsDatabaseHelper.copyLongValue(
                 values, RawContacts.SEND_TO_VOICEMAIL,
                 inputValues, Contacts.SEND_TO_VOICEMAIL);
-        ContactsDatabaseHelper.copyLongValue(
-                values, RawContacts.RAW_LAST_TIME_CONTACTED,
-                inputValues, Contacts.RAW_LAST_TIME_CONTACTED);
-        ContactsDatabaseHelper.copyLongValue(
-                values, RawContacts.RAW_TIMES_CONTACTED,
-                inputValues, Contacts.RAW_TIMES_CONTACTED);
+        if (inputValues.containsKey(RawContacts.RAW_LAST_TIME_CONTACTED)) {
+            values.putNull(RawContacts.RAW_LAST_TIME_CONTACTED);
+        }
+        if (inputValues.containsKey(RawContacts.RAW_TIMES_CONTACTED)) {
+            values.put(RawContacts.RAW_TIMES_CONTACTED, 0);
+        }
         ContactsDatabaseHelper.copyLongValue(
                 values, RawContacts.STARRED,
                 inputValues, Contacts.STARRED);
@@ -4881,11 +4859,6 @@
         int rslt = db.update(Tables.CONTACTS, values, Contacts._ID + "=?",
                 mSelectionArgs1);
 
-        if (inputValues.containsKey(Contacts.RAW_LAST_TIME_CONTACTED) &&
-                !inputValues.containsKey(Contacts.RAW_TIMES_CONTACTED)) {
-            db.execSQL(UPDATE_TIMES_CONTACTED_CONTACTS_TABLE, mSelectionArgs1);
-            db.execSQL(UPDATE_TIMES_CONTACTED_RAWCONTACTS_TABLE, mSelectionArgs1);
-        }
         return rslt;
     }
 
@@ -5112,20 +5085,6 @@
                         dataValues, null, null, /* callerIsSyncAdapter =*/true,
                         /* callerIsMetadataSyncAdapter =*/true);
 
-                // Update UsageStats.
-                for (int j = 0; j < fieldData.mUsageStatsList.size(); j++) {
-                    final UsageStats usageStats = fieldData.mUsageStatsList.get(j);
-                    final String usageType = usageStats.mUsageType;
-                    final int typeInt = getDataUsageFeedbackType(usageType.toLowerCase(), null);
-                    final long lastTimeUsed = usageStats.mLastTimeUsed;
-                    final int timesUsed = usageStats.mTimesUsed;
-                    ContentValues usageStatsValues = new ContentValues();
-                    usageStatsValues.put(DataUsageStatColumns.DATA_ID, dataId);
-                    usageStatsValues.put(DataUsageStatColumns.USAGE_TYPE_INT, typeInt);
-                    usageStatsValues.put(DataUsageStatColumns.RAW_LAST_TIME_USED, lastTimeUsed);
-                    usageStatsValues.put(DataUsageStatColumns.RAW_TIMES_USED, timesUsed);
-                    updateDataUsageStats(db, usageStatsValues);
-                }
             }
         }
 
@@ -6000,11 +5959,8 @@
             }
             case CONTACTS_STREQUENT_FILTER:
             case CONTACTS_STREQUENT: {
-                // Basically the resultant SQL should look like this:
-                // (SQL for listing starred items)
-                // UNION ALL
-                // (SQL for listing frequently contacted items)
-                // ORDER BY ...
+                // Note we used to use a union query to merge starred contacts and frequent
+                // contacts. Since we no longer have frequent contacts, we don't use union any more.
 
                 final boolean phoneOnly = readBooleanQueryParameter(
                         uri, ContactsContract.STREQUENT_PHONE_ONLY, false);
@@ -6027,9 +5983,6 @@
                 // String that will store the query for starred contacts. For phone only queries,
                 // these will return a list of all phone numbers that belong to starred contacts.
                 final String starredInnerQuery;
-                // String that will store the query for frequents. These JOINS can be very slow
-                // if assembled in the wrong order. Be sure to test changes against huge databases.
-                final String frequentInnerQuery;
 
                 if (phoneOnly) {
                     final StringBuilder tableBuilder = new StringBuilder();
@@ -6067,7 +6020,7 @@
                             phoneMimeTypeId + ", " + sipMimeTypeId + ")) AND (" +
                             RawContacts.CONTACT_ID + " IN " + Tables.DEFAULT_DIRECTORY + ")"));
                     starredInnerQuery = qb.buildQuery(subProjection, null, null,
-                        null, Data.IS_SUPER_PRIMARY + " DESC," + SORT_BY_DATA_USAGE, null);
+                        null, Data.IS_SUPER_PRIMARY + " DESC", null);
 
                     qb = new SQLiteQueryBuilder();
                     qb.setStrict(true);
@@ -6095,9 +6048,6 @@
                             DataColumns.MIMETYPE_ID + " IN (" +
                             phoneMimeTypeId + ", " + sipMimeTypeId + ")) AND (" +
                             RawContacts.CONTACT_ID + " IN " + Tables.DEFAULT_DIRECTORY + ")"));
-                    frequentInnerQuery = qb.buildQuery(subProjection, null, null, null,
-                            SORT_BY_DATA_USAGE, "25");
-
                 } else {
                     // Build the first query for starred contacts
                     qb.setStrict(true);
@@ -6108,53 +6058,9 @@
                             DbQueryUtils.concatenateClauses(selection, Contacts.STARRED + "=1"),
                             Contacts._ID, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC",
                             null);
-
-                    // Reset the builder, and build the second query for frequents contacts
-                    qb = new SQLiteQueryBuilder();
-                    qb.setStrict(true);
-
-                    setTablesAndProjectionMapForContacts(qb, projection, true);
-                    qb.setProjectionMap(sStrequentFrequentProjectionMap);
-                    qb.appendWhere(DbQueryUtils.concatenateClauses(
-                            selection,
-                            "(" + Contacts.STARRED + " =0 OR " + Contacts.STARRED + " IS NULL)"));
-                    // Note frequentInnerQuery is a grouping query, so the "IN default_directory"
-                    // selection needs to be in HAVING, not in WHERE.
-                    final String HAVING =
-                            RawContacts.CONTACT_ID + " IN " + Tables.DEFAULT_DIRECTORY;
-                    frequentInnerQuery = qb.buildQuery(subProjection,
-                            null, Contacts._ID, HAVING, SORT_BY_DATA_USAGE, "25");
                 }
 
-                // We need to wrap the inner queries in an extra select, because they contain
-                // their own SORT and LIMIT
-
-                // Phone numbers that were used more than 30 days ago are dropped from frequents
-                final String frequentQuery = "SELECT * FROM (" + frequentInnerQuery + ") WHERE " +
-                        LR_TIME_SINCE_LAST_USED_SEC + "<" + LAST_TIME_USED_30_DAYS_SEC;
-                final String starredQuery = "SELECT * FROM (" + starredInnerQuery + ")";
-
-                // Put them together
-                final String unionQuery =
-                        qb.buildUnionQuery(new String[] {starredQuery, frequentQuery}, null, null);
-
-                // Here, we need to use selection / selectionArgs (supplied from users) "twice",
-                // as we want them both for starred items and for frequently contacted items.
-                //
-                // e.g. if the user specify selection = "starred =?" and selectionArgs = "0",
-                // the resultant SQL should be like:
-                // SELECT ... WHERE starred =? AND ...
-                // UNION ALL
-                // SELECT ... WHERE starred =? AND ...
-                String[] doubledSelectionArgs = null;
-                if (selectionArgs != null) {
-                    final int length = selectionArgs.length;
-                    doubledSelectionArgs = new String[length * 2];
-                    System.arraycopy(selectionArgs, 0, doubledSelectionArgs, 0, length);
-                    System.arraycopy(selectionArgs, 0, doubledSelectionArgs, length, length);
-                }
-
-                Cursor cursor = db.rawQuery(unionQuery, doubledSelectionArgs);
+                Cursor cursor = db.rawQuery(starredInnerQuery, selectionArgs);
                 if (cursor != null) {
                     cursor.setNotificationUri(
                             getContext().getContentResolver(), ContactsContract.AUTHORITY_URI);
@@ -6166,12 +6072,8 @@
                 setTablesAndProjectionMapForContacts(qb, projection, true);
                 qb.setProjectionMap(sStrequentFrequentProjectionMap);
                 groupBy = Contacts._ID;
-                having = Contacts._ID + " IN " + Tables.DEFAULT_DIRECTORY;
-                if (!TextUtils.isEmpty(sortOrder)) {
-                    sortOrder = FREQUENT_ORDER_BY + ", " + sortOrder;
-                } else {
-                    sortOrder = FREQUENT_ORDER_BY;
-                }
+                selection = "(0)";
+                selectionArgs = null;
                 break;
             }
 
@@ -8042,17 +7944,20 @@
             SQLiteQueryBuilder qb, String[] projection, boolean includeDataUsageStat) {
         StringBuilder sb = new StringBuilder();
         if (includeDataUsageStat) {
-            sb.append(Views.DATA_USAGE_STAT + " AS " + Tables.DATA_USAGE_STAT);
+            // The result will always be empty, but we still need the columns.
+            sb.append(Tables.DATA_USAGE_STAT);
             sb.append(" INNER JOIN ");
         }
 
         sb.append(Views.CONTACTS);
 
         // Just for frequently contacted contacts in Strequent URI handling.
+        // We no longer support frequent, so we do "(0)", but we still need to execute the query
+        // for the columns.
         if (includeDataUsageStat) {
             sb.append(" ON (" +
                     DbQueryUtils.concatenateClauses(
-                            DataUsageStatColumns.CONCRETE_RAW_TIMES_USED + " > 0",
+                            "(0)",
                             RawContacts.CONTACT_ID + "=" + Views.CONTACTS + "." + Contacts._ID) +
                     ")");
         }
@@ -8438,38 +8343,20 @@
     }
 
     private void appendDataUsageStatJoin(StringBuilder sb, int usageType, String dataIdColumn) {
-        if (usageType != USAGE_TYPE_ALL) {
-            sb.append(" LEFT OUTER JOIN " + Views.DATA_USAGE_LR +
-                    " as " + Tables.DATA_USAGE_STAT +
-                    " ON (" + DataUsageStatColumns.CONCRETE_DATA_ID + "=");
-            sb.append(dataIdColumn);
-            sb.append(" AND " + DataUsageStatColumns.CONCRETE_USAGE_TYPE + "=");
-            sb.append(usageType);
-            sb.append(")");
-        } else {
-            sb.append(
-                    " LEFT OUTER JOIN " +
-                        "(SELECT " +
-                            DataUsageStatColumns.DATA_ID + " as STAT_DATA_ID," +
-                            " SUM(ifnull(" + DataUsageStatColumns.RAW_TIMES_USED +
-                                ",0)) as " + DataUsageStatColumns.RAW_TIMES_USED + ", " +
-                            " MAX(ifnull(" + DataUsageStatColumns.RAW_LAST_TIME_USED +
-                                ",0)) as " + DataUsageStatColumns.RAW_LAST_TIME_USED + "," +
-
-                            // Note this is not ideal -- we should use "lowres(sum(LR_TIMES_USED))"
-                            // here, but for performance reasons we just do it simple.
-                            " SUM(ifnull(" + DataUsageStatColumns.LR_TIMES_USED +
-                                ",0)) as " + DataUsageStatColumns.LR_TIMES_USED + ", " +
-
-                            " MAX(ifnull(" + DataUsageStatColumns.LR_LAST_TIME_USED +
-                                ",0)) as " + DataUsageStatColumns.LR_LAST_TIME_USED +
-                        " FROM " + Views.DATA_USAGE_LR + " GROUP BY " +
-                            DataUsageStatColumns.DATA_ID + ") as " + Tables.DATA_USAGE_STAT
-                    );
-            sb.append(" ON (STAT_DATA_ID=");
-            sb.append(dataIdColumn);
-            sb.append(")");
-        }
+        sb.append(
+                // 0 rows, just populate the columns.
+                " LEFT OUTER JOIN " +
+                "(SELECT " +
+                "0 as STAT_DATA_ID," +
+                "0 as " + DataUsageStatColumns.RAW_TIMES_USED + ", " +
+                "0 as " + DataUsageStatColumns.RAW_LAST_TIME_USED + "," +
+                "0 as " + DataUsageStatColumns.LR_TIMES_USED + ", " +
+                "0 as " + DataUsageStatColumns.LR_LAST_TIME_USED +
+                " where 0) as " + Tables.DATA_USAGE_STAT
+        );
+        sb.append(" ON (STAT_DATA_ID=");
+        sb.append(dataIdColumn);
+        sb.append(")");
     }
 
     private void appendContactPresenceJoin(
@@ -9180,6 +9067,7 @@
                         updateValues.put(Photo.PHOTO, processor.getThumbnailPhotoBytes());
                         update(ContentUris.withAppendedId(Data.CONTENT_URI, mDataId),
                                 updateValues, null, null);
+                        mRawContactUpdated = true;
                     } else {
                         // Insert a new primary data record with the photo.
                         ContentValues insertValues = new ContentValues();
@@ -9844,181 +9732,6 @@
         db.execSQL(UNDEMOTE_RAW_CONTACT, arg);
     }
 
-    private boolean handleDataUsageFeedback(Uri uri) {
-        final long currentTimeMillis = Clock.getInstance().currentTimeMillis();
-        final String usageType = uri.getQueryParameter(DataUsageFeedback.USAGE_TYPE);
-        final String[] ids = uri.getLastPathSegment().trim().split(",");
-        final ArrayList<Long> dataIds = new ArrayList<Long>(ids.length);
-
-        for (String id : ids) {
-            dataIds.add(Long.valueOf(id));
-        }
-        final boolean successful;
-        if (TextUtils.isEmpty(usageType)) {
-            Log.w(TAG, "Method for data usage feedback isn't specified. Ignoring.");
-            successful = false;
-        } else {
-            successful = updateDataUsageStat(dataIds, usageType, currentTimeMillis) > 0;
-        }
-
-        // Handle old API. This doesn't affect the result of this entire method.
-        final StringBuilder rawContactIdSelect = new StringBuilder();
-        rawContactIdSelect.append("SELECT " + Data.RAW_CONTACT_ID + " FROM " + Tables.DATA +
-                " WHERE " + Data._ID + " IN (");
-        for (int i = 0; i < ids.length; i++) {
-            if (i > 0) {
-                rawContactIdSelect.append(",");
-            }
-            rawContactIdSelect.append(ids[i]);
-        }
-        rawContactIdSelect.append(")");
-
-        final SQLiteDatabase db = mDbHelper.get().getWritableDatabase();
-
-        final Set<Long> rawContactIds = new ArraySet<>();
-        final Cursor cursor = db.rawQuery(rawContactIdSelect.toString(), null);
-        try {
-            cursor.moveToPosition(-1);
-            while (cursor.moveToNext()) {
-                final long rid =   cursor.getLong(0);
-                mTransactionContext.get().markRawContactMetadataDirty(rid,
-                        /* isMetadataSyncAdapter =*/false);
-                rawContactIds.add(rid);
-            }
-        } finally {
-            cursor.close();
-        }
-
-        mSelectionArgs1[0] = String.valueOf(currentTimeMillis);
-        final String rids = TextUtils.join(",", rawContactIds);
-
-        db.execSQL("UPDATE " + Tables.RAW_CONTACTS +
-                " SET " + RawContacts.RAW_LAST_TIME_CONTACTED + "=?" +
-                "," + RawContacts.RAW_TIMES_CONTACTED + "=" +
-                    "ifnull(" + RawContacts.RAW_TIMES_CONTACTED + ",0) + 1" +
-                " WHERE " + RawContacts._ID + " IN (" + rids + ")"
-                , mSelectionArgs1);
-        db.execSQL("UPDATE " + Tables.CONTACTS +
-                " SET " + Contacts.RAW_LAST_TIME_CONTACTED + "=?1" +
-                "," + Contacts.RAW_TIMES_CONTACTED + "=" +
-                    "ifnull(" + Contacts.RAW_TIMES_CONTACTED + ",0) + 1" +
-                "," + Contacts.CONTACT_LAST_UPDATED_TIMESTAMP + "=?1" +
-                " WHERE " + Contacts._ID + " IN (SELECT " + RawContacts.CONTACT_ID +
-                    " FROM " + Tables.RAW_CONTACTS +
-                    " WHERE " + RawContacts._ID + " IN (" + rids + "))"
-                , mSelectionArgs1);
-
-        return successful;
-    }
-
-    private interface DataUsageStatQuery {
-        String TABLE = Tables.DATA_USAGE_STAT;
-        String[] COLUMNS = new String[] {DataUsageStatColumns._ID};
-        int ID = 0;
-        String SELECTION = DataUsageStatColumns.DATA_ID + " =? AND "
-                + DataUsageStatColumns.USAGE_TYPE_INT + " =?";
-    }
-
-    /**
-     * Update {@link Tables#DATA_USAGE_STAT}.
-     *
-     * @return the number of rows affected.
-     */
-    @VisibleForTesting
-    /* package */ int updateDataUsageStat(
-            List<Long> dataIds, String type, long currentTimeMillis) {
-
-        final SQLiteDatabase db = mDbHelper.get().getWritableDatabase();
-
-        final String typeString = String.valueOf(getDataUsageFeedbackType(type, null));
-        final String currentTimeMillisString = String.valueOf(currentTimeMillis);
-
-        for (long dataId : dataIds) {
-            final String dataIdString = String.valueOf(dataId);
-            mSelectionArgs2[0] = dataIdString;
-            mSelectionArgs2[1] = typeString;
-            final Cursor cursor = db.query(DataUsageStatQuery.TABLE,
-                    DataUsageStatQuery.COLUMNS, DataUsageStatQuery.SELECTION,
-                    mSelectionArgs2, null, null, null);
-            try {
-                if (cursor.moveToFirst()) {
-                    final long id = cursor.getLong(DataUsageStatQuery.ID);
-
-                    mSelectionArgs2[0] = currentTimeMillisString;
-                    mSelectionArgs2[1] = String.valueOf(id);
-
-                    db.execSQL("UPDATE " + Tables.DATA_USAGE_STAT +
-                            " SET " + DataUsageStatColumns.RAW_TIMES_USED + "=" +
-                                "ifnull(" + DataUsageStatColumns.RAW_TIMES_USED +",0)+1" +
-                            "," + DataUsageStatColumns.RAW_LAST_TIME_USED + "=?" +
-                            " WHERE " + DataUsageStatColumns._ID + "=?",
-                            mSelectionArgs2);
-                } else {
-                    mSelectionArgs4[0] = dataIdString;
-                    mSelectionArgs4[1] = typeString;
-                    mSelectionArgs4[2] = "1"; // times used
-                    mSelectionArgs4[3] = currentTimeMillisString;
-                    db.execSQL("INSERT INTO " + Tables.DATA_USAGE_STAT +
-                            "(" + DataUsageStatColumns.DATA_ID +
-                            "," + DataUsageStatColumns.USAGE_TYPE_INT +
-                            "," + DataUsageStatColumns.RAW_TIMES_USED +
-                            "," + DataUsageStatColumns.RAW_LAST_TIME_USED +
-                            ") VALUES (?,?,?,?)",
-                            mSelectionArgs4);
-                }
-            } finally {
-                cursor.close();
-            }
-        }
-
-        return dataIds.size();
-    }
-
-    /**
-     * Directly update {@link Tables#DATA_USAGE_STAT}; used for metadata sync.
-     * Update or insert usageType, lastTimeUsed, and timesUsed for specific dataId.
-     */
-    private void updateDataUsageStats(SQLiteDatabase db, ContentValues values) {
-        final String dataId = values.getAsString(DataUsageStatColumns.DATA_ID);
-        final String type = values.getAsString(DataUsageStatColumns.USAGE_TYPE_INT);
-        final String lastTimeUsed = values.getAsString(DataUsageStatColumns.RAW_LAST_TIME_USED);
-        final String timesUsed = values.getAsString(DataUsageStatColumns.RAW_TIMES_USED);
-
-        mSelectionArgs2[0] = dataId;
-        mSelectionArgs2[1] = type;
-        final Cursor cursor = db.query(DataUsageStatQuery.TABLE,
-                DataUsageStatQuery.COLUMNS, DataUsageStatQuery.SELECTION,
-                mSelectionArgs2, null, null, null);
-
-        try {
-            if (cursor.moveToFirst()) {
-                final long id = cursor.getLong(DataUsageStatQuery.ID);
-
-                mSelectionArgs3[0] = lastTimeUsed;
-                mSelectionArgs3[1] = timesUsed;
-                mSelectionArgs3[2] = String.valueOf(id);
-                db.execSQL("UPDATE " + Tables.DATA_USAGE_STAT +
-                        " SET " + DataUsageStatColumns.RAW_LAST_TIME_USED + "=?" +
-                        "," + DataUsageStatColumns.RAW_TIMES_USED + "=?" +
-                        " WHERE " + DataUsageStatColumns._ID + "=?",
-                        mSelectionArgs3);
-            } else {
-                mSelectionArgs4[0] = dataId;
-                mSelectionArgs4[1] = type;
-                mSelectionArgs4[2] = timesUsed;
-                mSelectionArgs4[3] = lastTimeUsed;
-                db.execSQL("INSERT INTO " + Tables.DATA_USAGE_STAT +
-                        "(" + DataUsageStatColumns.DATA_ID +
-                        "," + DataUsageStatColumns.USAGE_TYPE_INT +
-                        "," + DataUsageStatColumns.RAW_TIMES_USED +
-                        "," + DataUsageStatColumns.RAW_LAST_TIME_USED +
-                        ") VALUES (?,?,?,?)",
-                        mSelectionArgs4);
-            }
-        } finally {
-            cursor.close();
-        }
-    }
 
     /**
      * Returns a sort order String for promoting data rows (email addresses, phone numbers, etc.)
diff --git a/src/com/android/providers/contacts/NameSplitter.java b/src/com/android/providers/contacts/NameSplitter.java
index 50b50fb..ddd294f 100644
--- a/src/com/android/providers/contacts/NameSplitter.java
+++ b/src/com/android/providers/contacts/NameSplitter.java
@@ -945,33 +945,6 @@
             bestGuess = guess;
         }
 
-        guess = guessFullNameStyle(name.middleName);
-        if (guess != FullNameStyle.UNDEFINED) {
-            if (guess != FullNameStyle.CJK && guess != FullNameStyle.WESTERN) {
-                name.fullNameStyle = guess;
-                return;
-            }
-            bestGuess = guess;
-        }
-
-        guess = guessFullNameStyle(name.prefix);
-        if (guess != FullNameStyle.UNDEFINED) {
-            if (guess != FullNameStyle.CJK && guess != FullNameStyle.WESTERN) {
-                name.fullNameStyle = guess;
-                return;
-            }
-            bestGuess = guess;
-        }
-
-        guess = guessFullNameStyle(name.suffix);
-        if (guess != FullNameStyle.UNDEFINED) {
-            if (guess != FullNameStyle.CJK && guess != FullNameStyle.WESTERN) {
-                name.fullNameStyle = guess;
-                return;
-            }
-            bestGuess = guess;
-        }
-
         name.fullNameStyle = bestGuess;
     }
 
diff --git a/src/com/android/providers/contacts/RawContactsChangeNotificationProvider.java b/src/com/android/providers/contacts/RawContactsChangeNotificationProvider.java
new file mode 100644
index 0000000..76749ab
--- /dev/null
+++ b/src/com/android/providers/contacts/RawContactsChangeNotificationProvider.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.contacts;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+/**
+ * An empty provider to support RawContacts change notification.
+ */
+public class RawContactsChangeNotificationProvider extends ContentProvider {
+    public static final String AUTHORITY = "com.android.contacts.raw_contacts";
+
+    @Override
+    public boolean onCreate() {
+        return true;
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        // Not needed.
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        // Not needed.
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        // Not needed.
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        // Not needed.
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] inProjection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        // Not needed.
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 15a90fa..9d20e76 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -36,14 +36,8 @@
         </service>
     </application>
 
-    <!--
-    The test declared in this instrumentation will be run along with tests declared by
-    all other applications via the command: "adb shell itr".
-    The "itr" command will find all tests declared by all applications. If you want to run just these
-    tests on their own then use the command:
-    "adb shell am instrument -w com.android.providers.contacts.tests/android.test.InstrumentationTestRunner"
-    -->
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
+    <instrumentation
+        android:name="android.support.test.runner.AndroidJUnitRunner"
         android:targetPackage="com.android.providers.contacts"
         android:label="Contacts Provider Tests">
     </instrumentation>
diff --git a/tests/AndroidTest.xml b/tests/AndroidTest.xml
index 3c4a3ab..cdf0c7d 100644
--- a/tests/AndroidTest.xml
+++ b/tests/AndroidTest.xml
@@ -20,9 +20,8 @@
 
     <option name="test-suite-tag" value="apct" />
     <option name="test-tag" value="ContactsProviderTests" />
-    <test class="com.android.tradefed.testtype.InstrumentationTest" >
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.providers.contacts.tests" />
-        <option name="runner" value="android.test.InstrumentationTestRunner" />
         <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
index 74642cb..91a76a3 100644
--- a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
@@ -1234,14 +1234,13 @@
     private static final String[] DATA_USAGE_PROJECTION =
             new String[] {Data.DATA1, Data.TIMES_USED, Data.LAST_TIME_USED};
 
-    protected void assertDataUsageCursorContains(Uri uri, String data1, int timesUsed,
-            int lastTimeUsed) {
+    protected void assertDataUsageZero(Uri uri, String data1) {
         final Cursor cursor = mResolver.query(uri, DATA_USAGE_PROJECTION, null, null,
                 null);
         try {
             dumpCursor(cursor);
-            assertCursorHasAnyRecordMatch(cursor, cv(Data.DATA1, data1, Data.TIMES_USED, timesUsed,
-                    Data.LAST_TIME_USED, lastTimeUsed));
+            assertCursorHasAnyRecordMatch(cursor, cv(Data.DATA1, data1, Data.TIMES_USED, 0,
+                    Data.LAST_TIME_USED, 0));
         } finally {
             cursor.close();
         }
diff --git a/tests/src/com/android/providers/contacts/BaseDatabaseHelperUpgradeTest.java b/tests/src/com/android/providers/contacts/BaseDatabaseHelperUpgradeTest.java
index 0eb12ad..8498913 100644
--- a/tests/src/com/android/providers/contacts/BaseDatabaseHelperUpgradeTest.java
+++ b/tests/src/com/android/providers/contacts/BaseDatabaseHelperUpgradeTest.java
@@ -15,9 +15,10 @@
  */
 package com.android.providers.contacts;
 
+import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
-import android.test.AndroidTestCase;
+import android.support.test.InstrumentationRegistry;
 
 import junit.framework.AssertionFailedError;
 
@@ -29,7 +30,7 @@
  * Run the test like this: <code> runtest -c com.android.providers.contacts.BaseDatabaseHelperUpgradeTest
  * contactsprov </code>
  */
-public abstract class BaseDatabaseHelperUpgradeTest extends AndroidTestCase {
+public abstract class BaseDatabaseHelperUpgradeTest extends FixedAndroidTestCase {
 
     protected static final String INTEGER = "INTEGER";
     protected static final String TEXT = "TEXT";
diff --git a/tests/src/com/android/providers/contacts/CallLogInsertionHelperTest.java b/tests/src/com/android/providers/contacts/CallLogInsertionHelperTest.java
index 7bb88a8..6122ff0 100644
--- a/tests/src/com/android/providers/contacts/CallLogInsertionHelperTest.java
+++ b/tests/src/com/android/providers/contacts/CallLogInsertionHelperTest.java
@@ -19,12 +19,10 @@
 import android.content.ContentValues;
 import android.provider.CallLog.Calls;
 
-import android.test.AndroidTestCase;
-
 /**
  * Test cases for {@link com.android.providers.contacts.DefaultCallLogInsertionHelper}.
  */
-public class CallLogInsertionHelperTest extends AndroidTestCase {
+public class CallLogInsertionHelperTest extends FixedAndroidTestCase {
 
     /**
      * The default insertion helper under test.
diff --git a/tests/src/com/android/providers/contacts/CallLogMigrationTest.java b/tests/src/com/android/providers/contacts/CallLogMigrationTest.java
index 3cbecb8..767b62f 100644
--- a/tests/src/com/android/providers/contacts/CallLogMigrationTest.java
+++ b/tests/src/com/android/providers/contacts/CallLogMigrationTest.java
@@ -18,7 +18,6 @@
 import android.content.Context;
 import android.database.DatabaseUtils;
 import android.database.sqlite.SQLiteDatabase;
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.LargeTest;
 
 import java.io.File;
@@ -28,7 +27,7 @@
 import java.io.OutputStream;
 
 @LargeTest
-public class CallLogMigrationTest extends AndroidTestCase {
+public class CallLogMigrationTest extends FixedAndroidTestCase {
 
     private void writeAssetFileToDisk(String assetName, File diskPath) throws IOException {
         final Context context = getTestContext();
diff --git a/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java b/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
index 8e71bef..a19a2f2 100644
--- a/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
+++ b/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
@@ -17,11 +17,8 @@
 package com.android.providers.contacts;
 
 import android.provider.ContactsContract.FullNameStyle;
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Log;
 
-import java.text.Collator;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -30,7 +27,7 @@
 import java.util.Locale;
 
 @SmallTest
-public class ContactLocaleUtilsTest extends AndroidTestCase {
+public class ContactLocaleUtilsTest extends FixedAndroidTestCase {
     private static final String TAG = "ContactLocaleUtilsTest";
 
     private static final String PHONE_NUMBER_1 = "+1 (650) 555-1212";
diff --git a/tests/src/com/android/providers/contacts/ContactsDatabaseHelperTest.java b/tests/src/com/android/providers/contacts/ContactsDatabaseHelperTest.java
index 8cf9ea4..a9867c5 100644
--- a/tests/src/com/android/providers/contacts/ContactsDatabaseHelperTest.java
+++ b/tests/src/com/android/providers/contacts/ContactsDatabaseHelperTest.java
@@ -29,12 +29,11 @@
 import android.test.MoreAsserts;
 import android.test.suitebuilder.annotation.LargeTest;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Log;
 
-import com.android.providers.contacts.ContactsDatabaseHelper.LowRes;
 import com.android.providers.contacts.ContactsDatabaseHelper.MimetypesColumns;
 import com.android.providers.contacts.ContactsDatabaseHelper.RawContactsColumns;
 import com.android.providers.contacts.ContactsDatabaseHelper.Tables;
+
 import com.google.android.collect.Sets;
 
 import java.util.HashSet;
@@ -455,48 +454,6 @@
         }
     }
 
-    private Integer checkGetTimesUsedExpression(Integer value) {
-        return getIntegerFromExpression(LowRes.getTimesUsedExpression(
-                value == null ? "NULL" : String.valueOf(value)));
-    }
-
-    public void testGetTimesUsedExpression() {
-        assertEquals((Object) 0, checkGetTimesUsedExpression(null));
-        assertEquals((Object) 0, checkGetTimesUsedExpression(-1));
-        assertEquals((Object) 0, checkGetTimesUsedExpression(-10));
-        assertEquals((Object) 0, checkGetTimesUsedExpression(0));
-        for (int i = 1; i < 10; i++) {
-            assertEquals("value=" + i, (Object) i, checkGetTimesUsedExpression(i));
-        }
-        for (int i = 10; i < 20; i++) {
-            assertEquals("value=" + i, (Object) 10, checkGetTimesUsedExpression(i));
-        }
-        for (int i = 20; i < 30; i++) {
-            assertEquals("value=" + i, (Object) 20, checkGetTimesUsedExpression(i));
-        }
-
-        assertEquals((Object) 123450, checkGetTimesUsedExpression(123456));
-    }
-
-    private Integer checkGetLastTimeUsedExpression(Integer value) {
-        return getIntegerFromExpression(LowRes.getLastTimeUsedExpression(
-                value == null ? "NULL" : String.valueOf(value)));
-    }
-
-    public void testGetLastTimeUsedExpression() {
-        assertEquals((Object) null, checkGetLastTimeUsedExpression(null));
-        assertEquals((Object) 0, checkGetLastTimeUsedExpression(0));
-        assertEquals((Object) 0, checkGetLastTimeUsedExpression(1));
-        assertEquals((Object) 0, checkGetLastTimeUsedExpression(86399));
-        assertEquals((Object) 86400, checkGetLastTimeUsedExpression(86400));
-
-        for (int i = 1; i < 3; i++) {
-            assertEquals((Object) (86400 * i), checkGetLastTimeUsedExpression(86400 * i));
-            assertEquals((Object) (86400 * i), checkGetLastTimeUsedExpression(86400 * i + 1));
-            assertEquals((Object) (86400 * i), checkGetLastTimeUsedExpression(86400 * i + 86399));
-        }
-    }
-
     public void testNotifyProviderStatusChange() throws Exception {
         final AtomicReference<Uri> calledUri = new AtomicReference<>();
 
diff --git a/tests/src/com/android/providers/contacts/ContactsIcuTest.java b/tests/src/com/android/providers/contacts/ContactsIcuTest.java
index 16583ae..7d3bdcf 100644
--- a/tests/src/com/android/providers/contacts/ContactsIcuTest.java
+++ b/tests/src/com/android/providers/contacts/ContactsIcuTest.java
@@ -17,14 +17,13 @@
 
 import android.icu.text.AlphabeticIndex;
 import android.icu.text.AlphabeticIndex.ImmutableIndex;
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.Suppress;
 import android.util.Log;
 
 import java.util.Arrays;
 import java.util.Locale;
 
-public class ContactsIcuTest extends AndroidTestCase {
+public class ContactsIcuTest extends FixedAndroidTestCase {
     private static final String TAG = "ContactsIcuTest";
 
     private static ImmutableIndex buildIndex(String... localeTags) {
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index 6c76709..88e32e6 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -985,11 +985,10 @@
         Uri rowUri = mResolver.insert(RawContacts.CONTENT_URI, values);
         long rawContactId = ContentUris.parseId(rowUri);
 
-        values.put(RawContacts.LAST_TIME_CONTACTED, 86400);
-        values.put(RawContacts.TIMES_CONTACTED, 10);
+        values.put(RawContacts.LAST_TIME_CONTACTED, 0);
+        values.put(RawContacts.TIMES_CONTACTED, 0);
 
         assertStoredValues(rowUri, values);
-        assertSelection(RawContacts.CONTENT_URI, values, RawContacts._ID, rawContactId);
         assertNetworkNotified(true);
     }
 
@@ -1334,12 +1333,11 @@
         values.put(Contacts.DISPLAY_NAME, "Meghan Knox");
         values.put(Contacts.CUSTOM_RINGTONE, "d");
         values.put(Contacts.SEND_TO_VOICEMAIL, 1);
-        values.put(Contacts.LAST_TIME_CONTACTED, 86400);
-        values.put(Contacts.TIMES_CONTACTED, 54320);
+        values.put(Contacts.LAST_TIME_CONTACTED, 0);
+        values.put(Contacts.TIMES_CONTACTED, 0);
         values.put(Contacts.STARRED, 1);
 
         assertStoredValues(ContentUris.withAppendedId(Phone.CONTENT_URI, phoneId), values);
-        assertSelection(Phone.CONTENT_URI, values, Data._ID, phoneId);
     }
 
     public void testPhonesWithMergedContacts() {
@@ -2519,13 +2517,12 @@
         values.put(Contacts.DISPLAY_NAME, "Meghan Knox");
         values.put(Contacts.CUSTOM_RINGTONE, "d");
         values.put(Contacts.SEND_TO_VOICEMAIL, 1);
-        values.put(Contacts.LAST_TIME_CONTACTED, 86400);
-        values.put(Contacts.TIMES_CONTACTED, 54320);
+        values.put(Contacts.LAST_TIME_CONTACTED, 0);
+        values.put(Contacts.TIMES_CONTACTED, 0);
         values.put(Contacts.STARRED, 1);
 
         assertStoredValues(Email.CONTENT_URI, values);
         assertStoredValues(ContentUris.withAppendedId(Email.CONTENT_URI, emailId), values);
-        assertSelection(Email.CONTENT_URI, values, Data._ID, emailId);
 
         // Check if the provider detects duplicated email addresses.
         final Uri emailUri2 = insertEmail(rawContactId, "meghan@acme.com");
@@ -2718,12 +2715,6 @@
         assertStoredValuesOrderly(filterUri, v3, v1, v2);
     }
 
-    /**
-     * Test primary emails are sorted below emails used last.
-     *
-     * primary may be set without super primary.  Only super primary indicates "default" in the
-     * contact ui.
-     */
     public void testEmailFilterUsageOverPrimarySort() {
         final long rawContactId = RawContactUtil.createRawContact(mResolver, TestUtil.ACCOUNT_1);
         final Uri emailUri1 = insertEmail(rawContactId, "account1@testemail.com");
@@ -2739,9 +2730,9 @@
         final ContentValues v2 = cv(Email.ADDRESS, "account2@testemail.com");
         final ContentValues v3 = cv(Email.ADDRESS, "account3@testemail.com");
 
-        // Test that account 3 is first even though account 1 and 2 have higher usage.
+        // No usage stats any more, so v3 is still the first.
         Uri filterUri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "acc");
-        assertStoredValuesOrderly(filterUri, v1, v2, v3);
+        assertStoredValuesOrderly(filterUri, v3, v1, v2);
     }
 
     /** Tests {@link DataUsageFeedback} correctly promotes a data row instead of a raw contact. */
@@ -2788,13 +2779,13 @@
                         RawContacts.TIMES_CONTACTED, 0
                         ),
                 cv(RawContacts._ID, rawContactId2,
-                        RawContacts.TIMES_CONTACTED, 1
+                        RawContacts.TIMES_CONTACTED, 0
                         )
                 );
 
-        // account3@email.com should be the first.
-        assertStoredValuesOrderly(filterUri1, new ContentValues[] { v3, v1, v2 });
-        assertStoredValuesOrderly(filterUri3, new ContentValues[] { v3, v1, v2 });
+        // No more interaction counter, so the order doesn't change.
+        assertStoredValuesOrderly(filterUri1, new ContentValues[] { v1, v2, v3 });
+        assertStoredValuesOrderly(filterUri3, new ContentValues[] { v1, v2, v3 });
     }
 
     public void testAddQueryParametersFromUri() {
@@ -2873,71 +2864,6 @@
         }
     }
 
-    /**
-     * Tests {@link DataUsageFeedback} correctly bucketize contacts using each
-     * {@link DataUsageStatColumns#RAW_LAST_TIME_USED}
-     */
-    public void testEmailFilterSortOrderWithOldHistory() {
-        long rawContactId1 = RawContactUtil.createRawContact(mResolver);
-        long dataId1 = ContentUris.parseId(insertEmail(rawContactId1, "address1@email.com"));
-        long dataId2 = ContentUris.parseId(insertEmail(rawContactId1, "address2@email.com"));
-        long dataId3 = ContentUris.parseId(insertEmail(rawContactId1, "address3@email.com"));
-        long dataId4 = ContentUris.parseId(insertEmail(rawContactId1, "address4@email.com"));
-
-        Uri filterUri1 = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, "address");
-
-        ContentValues v1 = new ContentValues();
-        v1.put(Email.ADDRESS, "address1@email.com");
-        ContentValues v2 = new ContentValues();
-        v2.put(Email.ADDRESS, "address2@email.com");
-        ContentValues v3 = new ContentValues();
-        v3.put(Email.ADDRESS, "address3@email.com");
-        ContentValues v4 = new ContentValues();
-        v4.put(Email.ADDRESS, "address4@email.com");
-
-        final ContactsProvider2 provider = (ContactsProvider2) getProvider();
-
-        long nowInMillis = System.currentTimeMillis();
-        long yesterdayInMillis = (nowInMillis - 24 * 60 * 60 * 1000);
-        long sevenDaysAgoInMillis = (nowInMillis - 7 * 24 * 60 * 60 * 1000);
-        long oneYearAgoInMillis = (nowInMillis - 365L * 24 * 60 * 60 * 1000);
-
-        // address4 is contacted just once yesterday.
-        provider.updateDataUsageStat(Arrays.asList(dataId4),
-                DataUsageFeedback.USAGE_TYPE_LONG_TEXT, yesterdayInMillis);
-
-        // address3 is contacted twice 1 week ago.
-        provider.updateDataUsageStat(Arrays.asList(dataId3),
-                DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis);
-        provider.updateDataUsageStat(Arrays.asList(dataId3),
-                DataUsageFeedback.USAGE_TYPE_LONG_TEXT, sevenDaysAgoInMillis);
-
-        // address2 is contacted three times 1 year ago.
-        provider.updateDataUsageStat(Arrays.asList(dataId2),
-                DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis);
-        provider.updateDataUsageStat(Arrays.asList(dataId2),
-                DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis);
-        provider.updateDataUsageStat(Arrays.asList(dataId2),
-                DataUsageFeedback.USAGE_TYPE_LONG_TEXT, oneYearAgoInMillis);
-
-        // auto-complete should prefer recently contacted methods
-        assertStoredValuesOrderly(filterUri1, new ContentValues[] { v4, v3, v2, v1 });
-
-        // Pretend address2 is contacted right now
-        provider.updateDataUsageStat(Arrays.asList(dataId2),
-                DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis);
-
-        // Now address2 is the most recently used address
-        assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v4, v3, v1 });
-
-        // Pretend address1 is contacted right now
-        provider.updateDataUsageStat(Arrays.asList(dataId1),
-                DataUsageFeedback.USAGE_TYPE_LONG_TEXT, nowInMillis);
-
-        // address2 is preferred to address1 as address2 is used 4 times in total
-        assertStoredValuesOrderly(filterUri1, new ContentValues[] { v2, v1, v4, v3 });
-    }
-
     public void testUpdateFromMetadataEntry() {
         String accountType1 = "accountType1";
         String accountName1 = "accountName1";
@@ -3030,8 +2956,7 @@
         assertStoredValue(dataUri2, Data.IS_SUPER_PRIMARY, 0);
         final Uri dataUriWithUsageType = Data.CONTENT_URI.buildUpon().appendQueryParameter(
                 DataUsageFeedback.USAGE_TYPE, usageTypeString).build();
-        assertDataUsageCursorContains(dataUriWithUsageType, emailAddress, 5,
-                1111111 / 86400 * 86400);
+        assertDataUsageZero(dataUriWithUsageType, emailAddress);
 
         // Update AggregationException table.
         RawContactInfo aggregationContact = new RawContactInfo(
@@ -3496,9 +3421,8 @@
                 StatusUpdates.CAPABILITY_HAS_CAMERA | StatusUpdates.CAPABILITY_HAS_VIDEO);
         Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
 
-        values.put(Contacts.TIMES_CONTACTED, 4);
+        values.put(Contacts.TIMES_CONTACTED, 0);
         assertStoredValues(contactUri, values);
-        assertSelection(Contacts.CONTENT_URI, values, Contacts._ID, contactId);
     }
 
     public void testQueryContactWithStatusUpdate() {
@@ -3510,10 +3434,9 @@
         values.put(Contacts.CONTACT_CHAT_CAPABILITY, StatusUpdates.CAPABILITY_HAS_CAMERA);
         Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
 
-        values.put(Contacts.TIMES_CONTACTED, 4);
+        values.put(Contacts.TIMES_CONTACTED, 0);
 
         assertStoredValuesWithProjection(contactUri, values);
-        assertSelectionWithProjection(Contacts.CONTENT_URI, values, Contacts._ID, contactId);
     }
 
     public void testQueryContactFilterByName() {
@@ -3534,7 +3457,7 @@
         values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE);
 
         Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goulash");
-        values.put(Contacts.TIMES_CONTACTED, 4);
+        values.put(Contacts.TIMES_CONTACTED, 0);
         assertStoredValuesWithProjection(filterUri1, values);
 
         assertContactFilter(contactId, "goolash");
@@ -3569,7 +3492,7 @@
         values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE);
 
         Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "goog411@acme.com");
-        values.put(Contacts.TIMES_CONTACTED, 4);
+        values.put(Contacts.TIMES_CONTACTED, 0);
         assertStoredValuesWithProjection(filterUri1, values);
 
         assertContactFilter(contactId, "goog");
@@ -3596,7 +3519,7 @@
         values.put(Contacts.CONTACT_PRESENCE, StatusUpdates.INVISIBLE);
 
         Uri filterUri1 = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, "18004664411");
-        values.put(Contacts.TIMES_CONTACTED, 4);
+        values.put(Contacts.TIMES_CONTACTED, 0);
         assertStoredValuesWithProjection(filterUri1, values);
 
         assertContactFilter(contactId, "18004664411");
@@ -3611,7 +3534,7 @@
 
     /**
      * Checks ContactsProvider2 works well with strequent Uris. The provider should return starred
-     * contacts and frequently used contacts.
+     * contacts.
      */
     public void testQueryContactStrequent() {
         ContentValues values1 = new ContentValues();
@@ -3644,20 +3567,20 @@
         // Send feedback for the 3rd phone number, pretending we called that person via phone.
         sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3);
 
-        values3.put(Contacts.TIMES_CONTACTED, 10); // Low res.
+        values3.put(Contacts.TIMES_CONTACTED, 0);
 
         // After the feedback, 3rd contact should be shown after starred one.
         assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI,
-                new ContentValues[] { values4, values3 });
+                new ContentValues[] { values4 });
 
         sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1);
         // Twice.
         sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1);
 
         // After the feedback, 1st and 3rd contacts should be shown after starred one.
-        values1.put(Contacts.TIMES_CONTACTED, 2);
+        values1.put(Contacts.TIMES_CONTACTED, 0);
         assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI,
-                new ContentValues[] { values4, values1, values3 });
+                new ContentValues[] { values4 });
 
         // With phone-only parameter, 1st and 4th contacts shouldn't be returned because:
         // 1st: feedbacks are only about email, not about phone call.
@@ -3665,48 +3588,7 @@
         Uri phoneOnlyStrequentUri = Contacts.CONTENT_STREQUENT_URI.buildUpon()
                 .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true")
                 .build();
-        assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { values3 });
-
-        // Now the 4th contact has three phone numbers, one of which is called twice and
-        // the other once
-        final String phoneNumber4 = "18004664414";
-        final String phoneNumber5 = "18004664415";
-        final String phoneNumber6 = "18004664416";
-        insertPhoneNumber(rawContactId4, phoneNumber4);
-        insertPhoneNumber(rawContactId4, phoneNumber5);
-        insertPhoneNumber(rawContactId4, phoneNumber6);
-        values3.put(Phone.NUMBER, phoneNumber3);
-        values4.put(Phone.NUMBER, phoneNumber4);
-
-        sendFeedback(phoneNumber5, DataUsageFeedback.USAGE_TYPE_CALL, values4);
-        sendFeedback(phoneNumber5, DataUsageFeedback.USAGE_TYPE_CALL, values4);
-        sendFeedback(phoneNumber6, DataUsageFeedback.USAGE_TYPE_CALL, values4);
-
-        // Create a ContentValues object representing the second phone number of contact 4
-        final ContentValues values5 = new ContentValues(values4);
-        values5.put(Phone.NUMBER, phoneNumber5);
-
-        // Create a ContentValues object representing the third phone number of contact 4
-        final ContentValues values6 = new ContentValues(values4);
-        values6.put(Phone.NUMBER, phoneNumber6);
-
-        // Phone only strequent should return all phone numbers belonging to the 4th contact,
-        // and then contact 3.
-        assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] {values5, values6,
-                values4, values3});
-
-        // Send feedback for the 2rd phone number, pretending we send the person a SMS message.
-        sendFeedback(phoneNumber2, DataUsageFeedback.USAGE_TYPE_SHORT_TEXT, values1);
-
-        values1.put(Contacts.TIMES_CONTACTED, 1); // Low res.
-
-        // SMS feedback shouldn't affect phone-only results.
-        assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] {values5, values6,
-                values4, values3});
-
-        values4.remove(Phone.NUMBER);
-        Uri filterUri = Uri.withAppendedPath(Contacts.CONTENT_STREQUENT_FILTER_URI, "fay");
-        assertStoredValues(filterUri, values4);
+        assertStoredValuesOrderly(phoneOnlyStrequentUri, new ContentValues[] { });
     }
 
     public void testQueryContactStrequentFrequentOrder() {
@@ -3804,27 +3686,14 @@
         // before cid5 and cid6, which were contacted at the same time.
         // cid2 will not show up because it was contacted more than 30 days ago
 
-        assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI,
-                cv(Contacts._ID, cid8),
-                cv(Contacts._ID, cid7),
-                cv(Contacts._ID, cid1),
-                cv(Contacts._ID, cid5),
-                cv(Contacts._ID, cid6),
-                cv(Contacts._ID, cid3),
-                cv(Contacts._ID, cid4));
+        assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI);
 
         // Check the order -- phone only frequent, which is data based.
         // Note this is based on data, and only looks at phone numbers, so the order is different
         // now.
         // did1, did2 will not show up because they were used to make calls more than 30 days ago.
         assertStoredValuesOrderly(Contacts.CONTENT_STREQUENT_URI.buildUpon()
-                    .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "1").build(),
-                cv(Data._ID, did8),
-                cv(Data._ID, did7),
-                cv(Data._ID, did5),
-                cv(Data._ID, did6),
-                cv(Data._ID, did3),
-                cv(Data._ID, did4));
+                    .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "1").build());
     }
 
     /**
@@ -3850,32 +3719,32 @@
 
         sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1);
 
-        assertStoredValues(Contacts.CONTENT_FREQUENT_URI, values1);
+        assertStoredValues(Contacts.CONTENT_FREQUENT_URI);
 
         // Pretend email was sent to the address twice.
         sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2);
         sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2);
 
-        values1.put(Contacts.TIMES_CONTACTED, 1);
-        values2.put(Contacts.TIMES_CONTACTED, 2);
-        assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values2, values1});
+        values1.put(Contacts.TIMES_CONTACTED, 0);
+        values2.put(Contacts.TIMES_CONTACTED, 0);
+        assertStoredValues(Contacts.CONTENT_FREQUENT_URI);
 
         for (int i = 0; i < 10; i++) {
             sendFeedback(phoneNumber3, DataUsageFeedback.USAGE_TYPE_CALL, values3);
         }
 
-        values3.put(Contacts.TIMES_CONTACTED, 10); // low res.
+        values3.put(Contacts.TIMES_CONTACTED, 0);
 
-        assertStoredValues(Contacts.CONTENT_FREQUENT_URI,
-                new ContentValues[] {values3, values2, values1});
+        assertStoredValues(Contacts.CONTENT_FREQUENT_URI);
+
 
         // Test it works with selection/selectionArgs
         assertStoredValues(Contacts.CONTENT_FREQUENT_URI,
-                Contacts.STARRED + "=?", new String[] {"0"},
-                new ContentValues[] {values2, values1});
+                Contacts.STARRED + "=?", new String[] {"0"}
+                );
         assertStoredValues(Contacts.CONTENT_FREQUENT_URI,
-                Contacts.STARRED + "=?", new String[] {"1"},
-                new ContentValues[] {values3});
+                Contacts.STARRED + "=?", new String[] {"1"}
+                );
 
         values3.put(Contacts.STARRED, 0);
         assertEquals(1,
@@ -3883,11 +3752,11 @@
                         String.valueOf(contactId3)),
                 values3, null, null));
         assertStoredValues(Contacts.CONTENT_FREQUENT_URI,
-                Contacts.STARRED + "=?", new String[] {"0"},
-                new ContentValues[] {values3, values2, values1});
+                Contacts.STARRED + "=?", new String[] {"0"}
+                );
         assertStoredValues(Contacts.CONTENT_FREQUENT_URI,
-                Contacts.STARRED + "=?", new String[] {"1"},
-                new ContentValues[] {});
+                Contacts.STARRED + "=?", new String[] {"1"}
+                );
     }
 
     public void testQueryContactFrequentExcludingInvisible() {
@@ -3904,17 +3773,19 @@
         sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2);
 
         // First, we have two contacts in frequent.
-        assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values2, values1});
+        assertStoredValues(Contacts.CONTENT_FREQUENT_URI);
 
         // Contact 2 goes invisible.
         markInvisible(cid2);
 
         // Now we have only 1 frequent.
-        assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values1});
+        assertStoredValues(Contacts.CONTENT_FREQUENT_URI);
 
     }
 
     public void testQueryDataUsageStat() {
+        // Now all data usage stats are zero as of Q.
+
         ContentValues values1 = new ContentValues();
         final String email1 = "a@acme.com";
         final long cid1 = createContact(values1, "Noah", "Tever", "18004664411",
@@ -3925,51 +3796,48 @@
 
         sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1);
 
-        assertDataUsageCursorContains(Data.CONTENT_URI, "a@acme.com", 1, 0);
+        assertDataUsageZero(Data.CONTENT_URI, "a@acme.com");
 
         sMockClock.setCurrentTimeMillis(86400 + 123);
         sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1);
 
-        assertDataUsageCursorContains(Data.CONTENT_URI, "a@acme.com", 2, 86400);
+        assertDataUsageZero(Data.CONTENT_URI, "a@acme.com");
 
         sMockClock.setCurrentTimeMillis(86400 * 3 + 123);
         for (int i = 0; i < 11; i++) {
             sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_SHORT_TEXT, values1);
         }
 
-        // Note here, "a@acme.com" has two data stats rows, 2 and 11.  What we get here's the sum
-        // of the lowres values, so # times will be 12, instead of 10 (which is the lowres of the
-        // sum).
-        assertDataUsageCursorContains(Data.CONTENT_URI, "a@acme.com", 12, 86400 * 3);
+        assertDataUsageZero(Data.CONTENT_URI, "a@acme.com");
 
         final Uri dataUriWithUsageTypeLongText = Data.CONTENT_URI.buildUpon().appendQueryParameter(
                 DataUsageFeedback.USAGE_TYPE, DataUsageFeedback.USAGE_TYPE_LONG_TEXT).build();
 
-        assertDataUsageCursorContains(dataUriWithUsageTypeLongText, "a@acme.com", 2, 86400 * 1);
+        assertDataUsageZero(dataUriWithUsageTypeLongText, "a@acme.com");
 
         sMockClock.setCurrentTimeMillis(86400 * 4 + 123);
         sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_CALL, values1);
         sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_CALL, values1);
         sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_CALL, values1);
 
-        assertDataUsageCursorContains(Data.CONTENT_URI, "a@acme.com", 15, 86400 * 4);
+        assertDataUsageZero(Data.CONTENT_URI, "a@acme.com");
 
         sMockClock.setCurrentTimeMillis(86400 * 5 + 123);
         for (int i = 0; i < 10; i++) {
             sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_CALL, values1);
         }
-        assertDataUsageCursorContains(Data.CONTENT_URI, "a@acme.com", 22, 86400 * 5);
+        assertDataUsageZero(Data.CONTENT_URI, "a@acme.com");
 
         sMockClock.setCurrentTimeMillis(86400 * 6 + 123);
         for (int i = 0; i < 10; i++) {
             sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_CALL, values1);
         }
-        assertDataUsageCursorContains(Data.CONTENT_URI, "a@acme.com", 32, 86400 * 6);
+        assertDataUsageZero(Data.CONTENT_URI, "a@acme.com");
 
         final Uri dataUriWithUsageTypeCall = Data.CONTENT_URI.buildUpon().appendQueryParameter(
                 DataUsageFeedback.USAGE_TYPE, DataUsageFeedback.USAGE_TYPE_CALL).build();
 
-        assertDataUsageCursorContains(dataUriWithUsageTypeCall, "a@acme.com", 20, 86400 * 6);
+        assertDataUsageZero(dataUriWithUsageTypeCall, "a@acme.com");
     }
 
     public void testQueryContactGroup() {
@@ -4171,11 +4039,10 @@
         long nonProfileRawContactId = createBasicNonProfileContact(nonProfileValues);
         long nonProfileContactId = queryContactId(nonProfileRawContactId);
 
-        nonProfileValues.put(Contacts.TIMES_CONTACTED, 4);
-        profileValues.put(Contacts.TIMES_CONTACTED, 4);
+        nonProfileValues.put(Contacts.TIMES_CONTACTED, 0);
+        profileValues.put(Contacts.TIMES_CONTACTED, 0);
 
         assertStoredValues(Contacts.CONTENT_URI, nonProfileValues);
-        assertSelection(Contacts.CONTENT_URI, nonProfileValues, Contacts._ID, nonProfileContactId);
 
         assertStoredValues(Profile.CONTENT_URI, profileValues);
     }
@@ -4187,7 +4054,7 @@
         // Create a non-profile contact - this should be returned.
         ContentValues nonProfileValues = new ContentValues();
         createBasicNonProfileContact(nonProfileValues);
-        nonProfileValues.put(Contacts.TIMES_CONTACTED, 4);
+        nonProfileValues.put(Contacts.TIMES_CONTACTED, 0);
         assertStoredValues(Contacts.CONTENT_URI, new ContentValues[] {nonProfileValues});
     }
 
@@ -4195,7 +4062,7 @@
         ContentValues profileValues = new ContentValues();
         createBasicProfileContact(profileValues);
 
-        profileValues.put(Contacts.TIMES_CONTACTED, 4);
+        profileValues.put(Contacts.TIMES_CONTACTED, 0);
         assertStoredValues(Profile.CONTENT_URI, profileValues);
     }
 
@@ -4244,7 +4111,7 @@
 
         // The raw contact view doesn't include the photo ID.
         profileValues.remove(Contacts.PHOTO_ID);
-        profileValues.put(Contacts.TIMES_CONTACTED, 4);
+        profileValues.put(Contacts.TIMES_CONTACTED, 0);
         assertStoredValues(Profile.CONTENT_RAW_CONTACTS_URI, profileValues);
     }
 
@@ -4254,7 +4121,7 @@
 
         // The raw contact view doesn't include the photo ID.
         profileValues.remove(Contacts.PHOTO_ID);
-        profileValues.put(Contacts.TIMES_CONTACTED, 4);
+        profileValues.put(Contacts.TIMES_CONTACTED, 0);
         assertStoredValues(ContentUris.withAppendedId(
                 Profile.CONTENT_RAW_CONTACTS_URI, profileRawContactId), profileValues);
     }
@@ -7191,7 +7058,7 @@
         assertMetadataNetworkNotified(true);
     }
 
-    public void testMarkAsMetadataDirtyForUsageStatsChange() {
+    public void testMarkAsMetadataNotDirtyForUsageStatsChange() {
         // Enable metadataSync flag.
         final ContactsProvider2 cp = (ContactsProvider2) getProvider();
         cp.setMetadataSyncForTest(true);
@@ -7200,9 +7067,9 @@
         final long did1a = ContentUris.parseId(insertEmail(rid1, "email_1_a@email.com"));
         updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, did1a);
 
-        assertMetadataDirty(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rid1),
-                true);
-        assertMetadataNetworkNotified(true);
+        // Usage feedback no longer works, so "false".
+        assertMetadataDirty(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rid1), false);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testMarkAsMetadataDirtyForDataPrimarySettingInsert() {
@@ -8821,7 +8688,7 @@
         }
     }
 
-    public void testMarkMetadataDirtyWhenDataUsageUpdate() {
+    public void testMarkMetadataNotDirtyWhenDataUsageUpdate() {
         // Enable metadataSync flag.
         final ContactsProvider2 cp = (ContactsProvider2) getProvider();
         cp.setMetadataSyncForTest(true);
@@ -8834,9 +8701,10 @@
         updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, did1a);
 
         assertDirty(rawContactUri, false);
-        assertMetadataDirty(rawContactUri, true);
+        // Usage feedback no longer works, so "false".
+        assertMetadataDirty(rawContactUri, false);
         assertNetworkNotified(false);
-        assertMetadataNetworkNotified(true);
+        assertMetadataNetworkNotified(false);
     }
 
     public void testDataUsageFeedbackAndDelete() {
@@ -8882,24 +8750,24 @@
         // Test 1. touch data 1a
         updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, did1a);
 
-        // Now, there's a single frequent.  (contact 1)
-        assertRowCount(1, Contacts.CONTENT_STREQUENT_URI, null, null);
+        // (We no longer populate frequent, so 0.)
+        assertRowCount(0, Contacts.CONTENT_STREQUENT_URI, null, null);
 
         sMockClock.advanceDay();
 
         // Test 2. touch data 1a, 2a and 3a
         updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_LONG_TEXT, did1a, did2a, did3a);
 
-        // Now, contact 1 and 3 are in frequent.
-        assertRowCount(2, Contacts.CONTENT_STREQUENT_URI, null, null);
+        // (We no longer populate frequent, so 0.)
+        assertRowCount(0, Contacts.CONTENT_STREQUENT_URI, null, null);
 
         sMockClock.advanceDay();
 
         // Test 2. touch data 2p (call)
         updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_CALL, did2p);
 
-        // There're still two frequent.
-        assertRowCount(2, Contacts.CONTENT_STREQUENT_URI, null, null);
+        // (We no longer populate frequent, so 0.)
+        assertRowCount(0, Contacts.CONTENT_STREQUENT_URI, null, null);
 
         sMockClock.advanceDay();
 
@@ -8907,68 +8775,32 @@
         updateDataUsageFeedback(DataUsageFeedback.USAGE_TYPE_SHORT_TEXT, did2p, did3p);
 
         // Let's check the tables.
-// TODO more tests?
+
         // Fist, check the data_usage_stat table, which has no public URI.
         assertStoredValuesDb("SELECT " + DataUsageStatColumns.DATA_ID +
                 "," + DataUsageStatColumns.USAGE_TYPE_INT +
                 "," + DataUsageStatColumns.RAW_TIMES_USED +
                 "," + DataUsageStatColumns.RAW_LAST_TIME_USED +
-                " FROM " + Tables.DATA_USAGE_STAT, null,
-                cv(DataUsageStatColumns.DATA_ID, did1a,
-                        DataUsageStatColumns.USAGE_TYPE_INT,
-                            DataUsageStatColumns.USAGE_TYPE_INT_LONG_TEXT,
-                        DataUsageStatColumns.RAW_TIMES_USED, 2,
-                        DataUsageStatColumns.RAW_LAST_TIME_USED, startTime + 86400
-                        ),
-                cv(DataUsageStatColumns.DATA_ID, did2a,
-                        DataUsageStatColumns.USAGE_TYPE_INT,
-                            DataUsageStatColumns.USAGE_TYPE_INT_LONG_TEXT,
-                        DataUsageStatColumns.RAW_TIMES_USED, 1,
-                        DataUsageStatColumns.RAW_LAST_TIME_USED, startTime + 86400
-                        ),
-                cv(DataUsageStatColumns.DATA_ID, did3a,
-                        DataUsageStatColumns.USAGE_TYPE_INT,
-                            DataUsageStatColumns.USAGE_TYPE_INT_LONG_TEXT,
-                        DataUsageStatColumns.RAW_TIMES_USED, 1,
-                        DataUsageStatColumns.RAW_LAST_TIME_USED, startTime + 86400
-                        ),
-                cv(DataUsageStatColumns.DATA_ID, did2p,
-                        DataUsageStatColumns.USAGE_TYPE_INT,
-                            DataUsageStatColumns.USAGE_TYPE_INT_CALL,
-                        DataUsageStatColumns.RAW_TIMES_USED, 1,
-                        DataUsageStatColumns.RAW_LAST_TIME_USED, startTime + 86400 * 2
-                        ),
-                cv(DataUsageStatColumns.DATA_ID, did2p,
-                        DataUsageStatColumns.USAGE_TYPE_INT,
-                            DataUsageStatColumns.USAGE_TYPE_INT_SHORT_TEXT,
-                        DataUsageStatColumns.RAW_TIMES_USED, 1,
-                        DataUsageStatColumns.RAW_LAST_TIME_USED, startTime + 86400 * 3
-                        ),
-                cv(DataUsageStatColumns.DATA_ID, did3p,
-                        DataUsageStatColumns.USAGE_TYPE_INT,
-                            DataUsageStatColumns.USAGE_TYPE_INT_SHORT_TEXT,
-                        DataUsageStatColumns.RAW_TIMES_USED, 1,
-                        DataUsageStatColumns.RAW_LAST_TIME_USED, startTime + 86400 * 3
-                        )
+                " FROM " + Tables.DATA_USAGE_STAT, null
                 );
 
         // Next, check the raw_contacts table
         assertStoredValuesWithProjection(RawContacts.CONTENT_URI,
                 cv(RawContacts._ID, rid1,
-                        RawContacts.TIMES_CONTACTED, 2,
-                        RawContacts.LAST_TIME_CONTACTED, (startTime + 86400) / 86400 * 86400
+                        RawContacts.TIMES_CONTACTED, 0,
+                        RawContacts.LAST_TIME_CONTACTED, 0
                         ),
                 cv(RawContacts._ID, rid2,
-                        RawContacts.TIMES_CONTACTED, 3,
-                        RawContacts.LAST_TIME_CONTACTED, (startTime + 86400 * 3) / 86400 * 86400
+                        RawContacts.TIMES_CONTACTED, 0,
+                        RawContacts.LAST_TIME_CONTACTED, 0
                         ),
                 cv(RawContacts._ID, rid3,
-                        RawContacts.TIMES_CONTACTED, 2,
-                        RawContacts.LAST_TIME_CONTACTED, (startTime + 86400 * 3) / 86400 * 86400
+                        RawContacts.TIMES_CONTACTED, 0,
+                        RawContacts.LAST_TIME_CONTACTED, 0
                         ),
                 cv(RawContacts._ID, rid4,
                         RawContacts.TIMES_CONTACTED, 0,
-                        RawContacts.LAST_TIME_CONTACTED, null // 4 wasn't touched.
+                        RawContacts.LAST_TIME_CONTACTED, 0
                         )
                 );
 
@@ -8979,12 +8811,12 @@
         // at once.
         assertStoredValuesWithProjection(Contacts.CONTENT_URI,
                 cv(Contacts._ID, cid1,
-                        Contacts.TIMES_CONTACTED, 4,
-                        Contacts.LAST_TIME_CONTACTED, (startTime + 86400 * 3) / 86400 * 86400
+                        Contacts.TIMES_CONTACTED, 0,
+                        Contacts.LAST_TIME_CONTACTED, 0
                         ),
                 cv(Contacts._ID, cid3,
-                        Contacts.TIMES_CONTACTED, 2,
-                        Contacts.LAST_TIME_CONTACTED, (startTime + 86400 * 3) / 86400 * 86400
+                        Contacts.TIMES_CONTACTED, 0,
+                        Contacts.LAST_TIME_CONTACTED, 0
                         ),
                 cv(Contacts._ID, cid4,
                         Contacts.TIMES_CONTACTED, 0,
@@ -9937,7 +9769,7 @@
     private void sendFeedback(String data1, String usageType, ContentValues values) {
         final long dataId = getStoredLongValue(Data.CONTENT_URI,
                 Data.DATA1 + "=?", new String[] { data1 }, Data._ID);
-        MoreAsserts.assertNotEqual(0, updateDataUsageFeedback(usageType, dataId));
+        assertEquals(0, updateDataUsageFeedback(usageType, dataId));
         if (values != null && values.containsKey(Contacts.TIMES_CONTACTED)) {
             values.put(Contacts.TIMES_CONTACTED, values.getAsInteger(Contacts.TIMES_CONTACTED) + 1);
         }
@@ -9946,7 +9778,7 @@
     private void updateDataUsageFeedback(String usageType, Uri resultUri) {
         final long id = ContentUris.parseId(resultUri);
         final boolean successful = updateDataUsageFeedback(usageType, id) > 0;
-        assertTrue(successful);
+        assertFalse(successful); // shouldn't succeed
     }
 
     private int updateDataUsageFeedback(String usageType, long... ids) {
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2TransactionTest.java b/tests/src/com/android/providers/contacts/ContactsProvider2TransactionTest.java
index 03c9e75..d7b78d6 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2TransactionTest.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2TransactionTest.java
@@ -197,7 +197,7 @@
     private void checkStoredContact() {
         assertStoredValues(Contacts.CONTENT_URI, cv(
                 Contacts.DISPLAY_NAME, "Regular Contact",
-                RawContacts.LAST_TIME_CONTACTED, 86400 * 21
+                RawContacts.LAST_TIME_CONTACTED, 0
                 ));
     }
 
@@ -227,7 +227,7 @@
     private void checkStoredProfile() {
         assertStoredValues(Profile.CONTENT_URI, cv(
                 Contacts.DISPLAY_NAME, "Profile Contact",
-                RawContacts.LAST_TIME_CONTACTED, 86400 * 11
+                RawContacts.LAST_TIME_CONTACTED, 0
                 ));
     }
 
diff --git a/tests/src/com/android/providers/contacts/ContactsTaskSchedulerTest.java b/tests/src/com/android/providers/contacts/ContactsTaskSchedulerTest.java
index df7196d..fe53c28 100644
--- a/tests/src/com/android/providers/contacts/ContactsTaskSchedulerTest.java
+++ b/tests/src/com/android/providers/contacts/ContactsTaskSchedulerTest.java
@@ -15,7 +15,6 @@
  */
 package com.android.providers.contacts;
 
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.LargeTest;
 
 import java.util.ArrayList;
@@ -25,7 +24,7 @@
 import java.util.concurrent.TimeUnit;
 
 @LargeTest
-public class ContactsTaskSchedulerTest extends AndroidTestCase {
+public class ContactsTaskSchedulerTest extends FixedAndroidTestCase {
     private static final int SHUTDOWN_SECONDS = 3;
 
     private static class MyContactsTaskScheduler extends ContactsTaskScheduler {
diff --git a/tests/src/com/android/providers/contacts/EnterpriseContactsCursorWrapperTest.java b/tests/src/com/android/providers/contacts/EnterpriseContactsCursorWrapperTest.java
index 66cebfc..7ae7b57 100644
--- a/tests/src/com/android/providers/contacts/EnterpriseContactsCursorWrapperTest.java
+++ b/tests/src/com/android/providers/contacts/EnterpriseContactsCursorWrapperTest.java
@@ -19,7 +19,6 @@
 import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.provider.ContactsContract.PhoneLookup;
-import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -27,7 +26,7 @@
 
 
 @SmallTest
-public class EnterpriseContactsCursorWrapperTest extends AndroidTestCase {
+public class EnterpriseContactsCursorWrapperTest extends FixedAndroidTestCase {
 
     public void testWrappedResults() {
         final String[] projection = new String[] {
diff --git a/tests/src/com/android/providers/contacts/FastScrollingIndexCacheTest.java b/tests/src/com/android/providers/contacts/FastScrollingIndexCacheTest.java
index 4580ce1..08625cd 100644
--- a/tests/src/com/android/providers/contacts/FastScrollingIndexCacheTest.java
+++ b/tests/src/com/android/providers/contacts/FastScrollingIndexCacheTest.java
@@ -20,14 +20,13 @@
 import android.os.Bundle;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.RawContacts;
-import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.providers.contacts.util.MockSharedPreferences;
 
 @SmallTest
-public class FastScrollingIndexCacheTest extends AndroidTestCase {
+public class FastScrollingIndexCacheTest extends FixedAndroidTestCase {
     private MockSharedPreferences mPrefs;
     private FastScrollingIndexCache mCache;
 
diff --git a/tests/src/com/android/providers/contacts/FixedAndroidTestCase.java b/tests/src/com/android/providers/contacts/FixedAndroidTestCase.java
new file mode 100644
index 0000000..5254c5d
--- /dev/null
+++ b/tests/src/com/android/providers/contacts/FixedAndroidTestCase.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.providers.contacts;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.test.AndroidTestCase;
+
+/**
+ * {@link FixedAndroidTestCase#getTestContext} isn't set when executed on the support test runner. This
+ * class works around that.
+ */
+public class FixedAndroidTestCase extends AndroidTestCase {
+    @Override
+    public Context getTestContext() {
+        return InstrumentationRegistry.getContext();
+    }
+}
diff --git a/tests/src/com/android/providers/contacts/MetadataEntryParserTest.java b/tests/src/com/android/providers/contacts/MetadataEntryParserTest.java
index be4df57..fe6ed13 100644
--- a/tests/src/com/android/providers/contacts/MetadataEntryParserTest.java
+++ b/tests/src/com/android/providers/contacts/MetadataEntryParserTest.java
@@ -17,7 +17,6 @@
 package com.android.providers.contacts;
 
 import android.content.Context;
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 import com.android.providers.contacts.MetadataEntryParser.AggregationData;
 import com.android.providers.contacts.MetadataEntryParser.FieldData;
@@ -41,7 +40,7 @@
  * </code>
  */
 @SmallTest
-public class MetadataEntryParserTest extends AndroidTestCase {
+public class MetadataEntryParserTest extends FixedAndroidTestCase {
 
     public void testErrorForEmptyInput() {
         try {
diff --git a/tests/src/com/android/providers/contacts/NameSplitterTest.java b/tests/src/com/android/providers/contacts/NameSplitterTest.java
index d9007fc..e0e5753 100644
--- a/tests/src/com/android/providers/contacts/NameSplitterTest.java
+++ b/tests/src/com/android/providers/contacts/NameSplitterTest.java
@@ -233,6 +233,25 @@
         assertFullNameStyle(FullNameStyle.CHINESE, "\uFF5C--(\u675C\u9D51)");
     }
 
+    public void testGuessFullNameStyleChineseMixed() {
+        createNameSplitter(Locale.CHINA);
+        // Both first and last names are Chinese.
+        assertFullNameStyle(FullNameStyle.CHINESE, "\u675C \u9D51");
+        // Last name is Chinese, first name is English.
+        assertFullNameStyle(FullNameStyle.CHINESE, "\u675C Juan");
+        // Last name is English, first name is Chinese.
+        assertFullNameStyle(FullNameStyle.CHINESE, "Du \u9D51");
+        // Both first and last names are English, prefix, middle, suffix are all Chinese.
+        Name name = new Name();
+        name.prefix = "\u524D";
+        name.givenNames = "Du";
+        name.middleName = "\u5C0F";
+        name.familyName = "Juan";
+        name.suffix = "\u540E";
+        mNameSplitter.guessNameStyle(name);
+        // guessFullNameStyle() only look at last and first name.
+        assertEquals(FullNameStyle.WESTERN, name.fullNameStyle);
+    }
 
     public void testGuessPhoneticNameStyle() {
 
diff --git a/tests/src/com/android/providers/contacts/PhoneLookupWithStarPrefixTest.java b/tests/src/com/android/providers/contacts/PhoneLookupWithStarPrefixTest.java
index cd86a42..d595580 100644
--- a/tests/src/com/android/providers/contacts/PhoneLookupWithStarPrefixTest.java
+++ b/tests/src/com/android/providers/contacts/PhoneLookupWithStarPrefixTest.java
@@ -16,12 +16,11 @@
 
 package com.android.providers.contacts;
 
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.LargeTest;
 import android.test.suitebuilder.annotation.SmallTest;
 
 @LargeTest
-public class PhoneLookupWithStarPrefixTest extends AndroidTestCase {
+public class PhoneLookupWithStarPrefixTest extends FixedAndroidTestCase {
 
     @SmallTest
     public void testNormalizeNumberWithStar() {
diff --git a/tests/src/com/android/providers/contacts/PhotoLoadingTestCase.java b/tests/src/com/android/providers/contacts/PhotoLoadingTestCase.java
index 4b159a8..41fe1b0 100644
--- a/tests/src/com/android/providers/contacts/PhotoLoadingTestCase.java
+++ b/tests/src/com/android/providers/contacts/PhotoLoadingTestCase.java
@@ -16,8 +16,9 @@
 
 package com.android.providers.contacts;
 
+import android.content.Context;
 import android.content.res.Resources;
-import android.test.AndroidTestCase;
+import android.support.test.InstrumentationRegistry;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.google.android.collect.Maps;
@@ -31,7 +32,7 @@
  * Adds support for loading photo files easily from test resources.
  */
 @SmallTest
-public class PhotoLoadingTestCase extends AndroidTestCase {
+public class PhotoLoadingTestCase extends FixedAndroidTestCase {
 
     private Map<Integer, PhotoEntry> photoResourceCache = Maps.newHashMap();
     protected static enum PhotoSize {
diff --git a/tests/src/com/android/providers/contacts/PhotoPriorityResolverTest.java b/tests/src/com/android/providers/contacts/PhotoPriorityResolverTest.java
index b105595..a2dd81d 100644
--- a/tests/src/com/android/providers/contacts/PhotoPriorityResolverTest.java
+++ b/tests/src/com/android/providers/contacts/PhotoPriorityResolverTest.java
@@ -16,7 +16,6 @@
 
 package com.android.providers.contacts;
 
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.MediumTest;
 
 /**
@@ -29,7 +28,7 @@
  * </code>
  */
 @MediumTest
-public class PhotoPriorityResolverTest extends AndroidTestCase {
+public class PhotoPriorityResolverTest extends FixedAndroidTestCase {
 
     public void testLoadPicturePriorityFromXml() {
         PhotoPriorityResolver resolver = new PhotoPriorityResolver(getContext());
diff --git a/tests/src/com/android/providers/contacts/PhotoProcessorTest.java b/tests/src/com/android/providers/contacts/PhotoProcessorTest.java
index 4b59be9..ab7b7fc 100644
--- a/tests/src/com/android/providers/contacts/PhotoProcessorTest.java
+++ b/tests/src/com/android/providers/contacts/PhotoProcessorTest.java
@@ -20,7 +20,6 @@
 import android.graphics.Color;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.providers.contacts.tests.R;
@@ -34,7 +33,7 @@
  * Most of tests are covered by {@link PhotoStoreTest}.
  */
 @SmallTest
-public class PhotoProcessorTest extends AndroidTestCase {
+public class PhotoProcessorTest extends FixedAndroidTestCase {
 
     public void testTransparency() throws IOException {
         final Drawable source = getTestContext().getResources().getDrawable(
diff --git a/tests/src/com/android/providers/contacts/VoicemailProviderTest.java b/tests/src/com/android/providers/contacts/VoicemailProviderTest.java
index d20b9b3..9f9ef00 100644
--- a/tests/src/com/android/providers/contacts/VoicemailProviderTest.java
+++ b/tests/src/com/android/providers/contacts/VoicemailProviderTest.java
@@ -21,10 +21,8 @@
 
 import android.content.ContentUris;
 import android.content.ContentValues;
-import android.database.ContentObserver;
 import android.database.Cursor;
 import android.net.Uri;
-import android.os.Handler;
 import android.os.ParcelFileDescriptor;
 import android.os.Process;
 import android.provider.CallLog;
@@ -741,28 +739,6 @@
         assertStoredValues(uri, values);
     }
 
-    public void testStatusUpdate_observerNotified() throws Exception {
-        Uri uri = insertTestStatusEntry();
-        ContentValues values = getTestStatusValues();
-        values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_NO_CONNECTION);
-        values.put(Status.NOTIFICATION_CHANNEL_STATE,
-            Status.NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING);
-        values.put(Status.SOURCE_TYPE,
-            "vvm_type_test2");
-        Boolean[] observerTriggered = new Boolean[]{false};
-        mResolver.registerContentObserver(Status.CONTENT_URI, true,
-            new ContentObserver(new Handler()) {
-                @Override
-                public void onChange(boolean selfChange, Uri uri) {
-                    observerTriggered[0] = true;
-                }
-            });
-
-        mResolver.update(uri, values, null, null);
-
-        assertTrue(observerTriggered[0]);
-    }
-
     public void testStatusUpsert() throws Exception {
         ContentValues values = getTestStatusValues();
         mResolver.insert(statusUri(), values);
diff --git a/tests/src/com/android/providers/contacts/aggregation/util/ContactMatcherTest.java b/tests/src/com/android/providers/contacts/aggregation/util/ContactMatcherTest.java
index 301902a..09a0b78 100644
--- a/tests/src/com/android/providers/contacts/aggregation/util/ContactMatcherTest.java
+++ b/tests/src/com/android/providers/contacts/aggregation/util/ContactMatcherTest.java
@@ -16,12 +16,12 @@
 package com.android.providers.contacts.aggregation.util;
 
 import com.android.providers.contacts.ContactsDatabaseHelper.NameLookupType;
+import com.android.providers.contacts.FixedAndroidTestCase;
 
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
 @SmallTest
-public class ContactMatcherTest extends AndroidTestCase {
+public class ContactMatcherTest extends FixedAndroidTestCase {
 
     public void testMatchName_invalidHexDecimal() {
         final ContactMatcher matcher = new ContactMatcher();
diff --git a/tests/src/com/android/providers/contacts/enterprise/EnterprisePolicyGuardTest.java b/tests/src/com/android/providers/contacts/enterprise/EnterprisePolicyGuardTest.java
index 99ff9a1..c068459 100644
--- a/tests/src/com/android/providers/contacts/enterprise/EnterprisePolicyGuardTest.java
+++ b/tests/src/com/android/providers/contacts/enterprise/EnterprisePolicyGuardTest.java
@@ -24,7 +24,6 @@
 import android.os.UserManager;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Directory;
-import android.test.AndroidTestCase;
 import android.test.mock.MockContext;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -36,12 +35,14 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import com.android.providers.contacts.FixedAndroidTestCase;
+
 
 /**
  * Unit tests for {@link EnterprisePolicyGuard}.
  */
 @SmallTest
-public class EnterprisePolicyGuardTest extends AndroidTestCase {
+public class EnterprisePolicyGuardTest extends FixedAndroidTestCase {
     private static final String SYSTEM_PROPERTY_DEXMAKER_DEXCACHE = "dexmaker.dexcache";
 
     private static final int CONTACT_ID = 10;
diff --git a/tests/src/com/android/providers/contacts/sqlite/DatabaseAnalyzerTest.java b/tests/src/com/android/providers/contacts/sqlite/DatabaseAnalyzerTest.java
index 568e1e8..8367ef5 100644
--- a/tests/src/com/android/providers/contacts/sqlite/DatabaseAnalyzerTest.java
+++ b/tests/src/com/android/providers/contacts/sqlite/DatabaseAnalyzerTest.java
@@ -16,14 +16,14 @@
 
 package com.android.providers.contacts.sqlite;
 
-import android.test.AndroidTestCase;
 
 import com.android.providers.contacts.ContactsDatabaseHelper;
+import com.android.providers.contacts.FixedAndroidTestCase;
 import com.android.providers.contacts.TestUtils;
 
 import java.util.List;
 
-public class DatabaseAnalyzerTest extends AndroidTestCase {
+public class DatabaseAnalyzerTest extends FixedAndroidTestCase {
     public void testFindTableViewsAllowingColumns() {
         final ContactsDatabaseHelper dbh =
                 ContactsDatabaseHelper.getNewInstanceForTest(getContext(),
diff --git a/tests/src/com/android/providers/contacts/sqlite/SqlCheckerTest.java b/tests/src/com/android/providers/contacts/sqlite/SqlCheckerTest.java
index ee2b5be..b69b427 100644
--- a/tests/src/com/android/providers/contacts/sqlite/SqlCheckerTest.java
+++ b/tests/src/com/android/providers/contacts/sqlite/SqlCheckerTest.java
@@ -15,16 +15,16 @@
  */
 package com.android.providers.contacts.sqlite;
 
-import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 
+import com.android.providers.contacts.FixedAndroidTestCase;
 import com.android.providers.contacts.sqlite.SqlChecker.InvalidSqlException;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-public class SqlCheckerTest extends AndroidTestCase {
+public class SqlCheckerTest extends FixedAndroidTestCase {
     private ArrayList<String> getTokens(String sql) {
         final ArrayList<String> tokens = new ArrayList<>();
 
diff --git a/tests/src/com/android/providers/contacts/util/SelectionBuilderTest.java b/tests/src/com/android/providers/contacts/util/SelectionBuilderTest.java
index 7adbeca..4615fbd 100644
--- a/tests/src/com/android/providers/contacts/util/SelectionBuilderTest.java
+++ b/tests/src/com/android/providers/contacts/util/SelectionBuilderTest.java
@@ -16,14 +16,15 @@
 
 package com.android.providers.contacts.util;
 
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.providers.contacts.FixedAndroidTestCase;
+
 /**
  * Unit tests for {@link SelectionBuilder}.
  */
 @SmallTest
-public class SelectionBuilderTest extends AndroidTestCase {
+public class SelectionBuilderTest extends FixedAndroidTestCase {
     public void testEmptyClauses() {
         assertEquals(null, new SelectionBuilder(null).build());
         assertEquals(null, new SelectionBuilder("").build());
diff --git a/tests/src/com/android/providers/contacts/util/TypedUriMatcherImplTest.java b/tests/src/com/android/providers/contacts/util/TypedUriMatcherImplTest.java
index 329e6e2..d2a7b14 100644
--- a/tests/src/com/android/providers/contacts/util/TypedUriMatcherImplTest.java
+++ b/tests/src/com/android/providers/contacts/util/TypedUriMatcherImplTest.java
@@ -17,9 +17,10 @@
 package com.android.providers.contacts.util;
 
 import android.net.Uri;
-import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.providers.contacts.FixedAndroidTestCase;
+
 /**
  * Unit tests for {@link TypedUriMatcherImpl}.
  * Run the test like this:
@@ -28,7 +29,7 @@
  * </code>
  */
 @SmallTest
-public class TypedUriMatcherImplTest extends AndroidTestCase {
+public class TypedUriMatcherImplTest extends FixedAndroidTestCase {
     /** URI type used for testing. */
     private static enum TestUriType implements UriType {
         NO_MATCH(null),
diff --git a/tests/src/com/android/providers/contacts/util/UserUtilsTest.java b/tests/src/com/android/providers/contacts/util/UserUtilsTest.java
index 611ad3f..93613cf 100644
--- a/tests/src/com/android/providers/contacts/util/UserUtilsTest.java
+++ b/tests/src/com/android/providers/contacts/util/UserUtilsTest.java
@@ -15,21 +15,19 @@
  */
 package com.android.providers.contacts.util;
 
-import com.android.providers.contacts.ContactsActor;
-import com.android.providers.contacts.ContactsActor.MockUserManager;
-import com.android.providers.contacts.SynchronousContactsProvider2;
-
-import android.content.ContentProvider;
-import android.content.Context;
-import android.os.UserManager;
-import android.provider.ContactsContract;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
 import static com.android.providers.contacts.ContactsActor.PACKAGE_GREY;
 
+import android.content.Context;
+import android.provider.ContactsContract;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.providers.contacts.ContactsActor;
+import com.android.providers.contacts.ContactsActor.MockUserManager;
+import com.android.providers.contacts.FixedAndroidTestCase;
+import com.android.providers.contacts.SynchronousContactsProvider2;
+
 @SmallTest
-public class UserUtilsTest extends AndroidTestCase {
+public class UserUtilsTest extends FixedAndroidTestCase {
 
     protected ContactsActor mActor;
 
diff --git a/tests2/AndroidTest.xml b/tests2/AndroidTest.xml
index 29fdc83..957350b 100644
--- a/tests2/AndroidTest.xml
+++ b/tests2/AndroidTest.xml
@@ -20,9 +20,8 @@
 
     <option name="test-suite-tag" value="apct" />
     <option name="test-tag" value="ContactsProviderTests2" />
-    <test class="com.android.tradefed.testtype.InstrumentationTest" >
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.providers.contacts.tests2" />
-        <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
         <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/tests2/src/com/android/providers/contacts/tests2/AllUriTest.java b/tests2/src/com/android/providers/contacts/tests2/AllUriTest.java
index 2aa6a61..30fd3be 100644
--- a/tests2/src/com/android/providers/contacts/tests2/AllUriTest.java
+++ b/tests2/src/com/android/providers/contacts/tests2/AllUriTest.java
@@ -371,14 +371,18 @@
     public void testSelect() {
         for (String[] path : URIs) {
             if (!supportsQuery(path)) continue;
-            final Uri uri = getUri(path);
+            try {
+                final Uri uri = getUri(path);
 
-            checkQueryExecutable(uri, // uri
-                    null, // projection
-                    null, // selection
-                    null, // selection args
-                    null // sort order
-                    );
+                checkQueryExecutable(uri, // uri
+                        null, // projection
+                        null, // selection
+                        null, // selection args
+                        null // sort order
+                        );
+            } catch (Throwable th) {
+                addFailure("Failed: URI=" + path[0] + " Message=" + th.getMessage(), th);
+            }
         }
         failIfFailed();
     }
@@ -386,12 +390,16 @@
     public void testNoHiddenColumns() {
         for (String[] path : URIs) {
             if (!supportsQuery(path)) continue;
-            final Uri uri = getUri(path);
+            try {
+                final Uri uri = getUri(path);
 
-            for (String column : getColumns(uri)) {
-                if (column.toLowerCase().startsWith(ContactsContract.HIDDEN_COLUMN_PREFIX)) {
-                    addFailure("Uri " + uri + " returned hidden column " + column, null);
+                for (String column : getColumns(uri)) {
+                    if (column.toLowerCase().startsWith(ContactsContract.HIDDEN_COLUMN_PREFIX)) {
+                        addFailure("Uri " + uri + " returned hidden column " + column, null);
+                    }
                 }
+            } catch (Throwable th) {
+                addFailure("Failed: URI=" + path[0] + " Message=" + th.getMessage(), th);
             }
         }
         failIfFailed();
@@ -649,41 +657,45 @@
         for (String[] path : URIs) {
             final Uri uri = getUri(path);
 
-            cv.clear();
-            if (supportsQuery(path)) {
-                cv.put(getColumns(uri)[0], 1);
-            } else {
-                cv.put("_id", 1);
-            }
-            if (uri.toString().contains("syncstate")) {
-                cv.put(SyncState.ACCOUNT_NAME, "abc");
-                cv.put(SyncState.ACCOUNT_TYPE, "def");
-            }
-
-            checkExecutable("insert", uri, supportsInsert(path), () -> {
-                final Uri newUri = mResolver.insert(uri, cv);
-                if (newUri == null) {
-                    addFailure("Insert for '" + uri + "' returned null.", null);
+            try {
+                cv.clear();
+                if (supportsQuery(path)) {
+                    cv.put(getColumns(uri)[0], 1);
                 } else {
-                    // "profile/raw_contacts/#" is missing update support.  too late to add, so
-                    // just skip.
-                    if (!newUri.toString().startsWith(
-                            "content://com.android.contacts/profile/raw_contacts/")) {
-                        checkExecutable("insert -> update", newUri, true, () -> {
-                            mResolver.update(newUri, cv, null, null);
+                    cv.put("_id", 1);
+                }
+                if (uri.toString().contains("syncstate")) {
+                    cv.put(SyncState.ACCOUNT_NAME, "abc");
+                    cv.put(SyncState.ACCOUNT_TYPE, "def");
+                }
+
+                checkExecutable("insert", uri, supportsInsert(path), () -> {
+                    final Uri newUri = mResolver.insert(uri, cv);
+                    if (newUri == null) {
+                        addFailure("Insert for '" + uri + "' returned null.", null);
+                    } else {
+                        // "profile/raw_contacts/#" is missing update support.  too late to add, so
+                        // just skip.
+                        if (!newUri.toString().startsWith(
+                                "content://com.android.contacts/profile/raw_contacts/")) {
+                            checkExecutable("insert -> update", newUri, true, () -> {
+                                mResolver.update(newUri, cv, null, null);
+                            });
+                        }
+                        checkExecutable("insert -> delete", newUri, true, () -> {
+                            mResolver.delete(newUri, null, null);
                         });
                     }
-                    checkExecutable("insert -> delete", newUri, true, () -> {
-                        mResolver.delete(newUri, null, null);
-                    });
-                }
-            });
-            checkExecutable("update", uri, supportsUpdate(path), () -> {
-                mResolver.update(uri, cv, "1=2", null);
-            });
-            checkExecutable("delete", uri, supportsDelete(path), () -> {
-                mResolver.delete(uri, "1=2", null);
-            });
+                });
+                checkExecutable("update", uri, supportsUpdate(path), () -> {
+                    mResolver.update(uri, cv, "1=2", null);
+                });
+                checkExecutable("delete", uri, supportsDelete(path), () -> {
+                    mResolver.delete(uri, "1=2", null);
+                });
+            } catch (Throwable th) {
+                addFailure("Failed: URI=" + uri + " Message=" + th.getMessage(), th);
+            }
         }
         failIfFailed();
     }
