Merge "Don't show Note and Nickname if they are empty database rows; some clean up"
diff --git a/tests/src/com/android/contacts/ContactLoaderTest.java b/tests/src/com/android/contacts/ContactLoaderTest.java
index 8b58ee1..926e0f0 100644
--- a/tests/src/com/android/contacts/ContactLoaderTest.java
+++ b/tests/src/com/android/contacts/ContactLoaderTest.java
@@ -21,43 +21,25 @@
 import com.android.contacts.views.ContactLoader;
 
 import android.content.ContentUris;
-import android.content.Loader;
-import android.content.Loader.OnLoadCompleteListener;
 import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
 import android.provider.ContactsContract.CommonDataKinds;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.DisplayNameSources;
 import android.provider.ContactsContract.RawContacts;
-import android.provider.ContactsContract.RawContactsEntity;
-import android.provider.ContactsContract.StatusUpdates;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.RawContacts.Data;
 import android.provider.ContactsContract.RawContacts.Entity;
-import android.test.AndroidTestCase;
+import android.provider.ContactsContract.RawContactsEntity;
+import android.provider.ContactsContract.StatusUpdates;
 import android.test.AssertionFailedError;
-
-import java.util.concurrent.ArrayBlockingQueue;
+import android.test.LoaderTestCase;
 
 /**
  * Runs ContactLoader tests for the the contact-detail and editor view.
  */
-public class ContactLoaderTest extends AndroidTestCase {
-    private ContactsMockContext mMockContext;
-    private MockContentProvider mContactsProvider;
-
-    static {
-        // Need to force class loading of AsyncTask on the main thread...
-        new AsyncTask<Void, Void, Void>() {
-            @Override
-            protected Void doInBackground(Void... args) {return null;}
-            @Override
-            protected void onPostExecute(Void result) {}
-        };
-    }
+public class ContactLoaderTest extends LoaderTestCase {
+    ContactsMockContext mMockContext;
+    MockContentProvider mContactsProvider;
 
     @Override
     protected void setUp() throws Exception {
@@ -90,59 +72,6 @@
                 "Expected Exception " + expectedException + " which was not thrown");
     }
 
-    /**
-     * Runs a Loader synchronously and returns the result of the load. The loader will
-     * be started, stopped, and destroyed by this method so it cannot be reused.
-     *
-     * @param loader The loader to run synchronously
-     * @return The result from the loader
-     */
-    private <T> T getLoaderResultSynchronously(final Loader<T> loader) {
-        // The test thread blocks on this queue until the loader puts it's result in
-        final ArrayBlockingQueue<T> queue = new ArrayBlockingQueue<T>(1);
-
-        // This callback runs on the "main" thread and unblocks the test thread
-        // when it puts the result into the blocking queue
-        final OnLoadCompleteListener<T> listener = new OnLoadCompleteListener<T>() {
-            public void onLoadComplete(Loader<T> completedLoader, T data) {
-                // Shut the loader down
-                completedLoader.unregisterListener(this);
-                completedLoader.stopLoading();
-                completedLoader.destroy();
-
-                // Store the result, unblocking the test thread
-                queue.add(data);
-            }
-        };
-
-        // This handler runs on the "main" thread of the process since AsyncTask
-        // is documented as needing to run on the main thread and many Loaders use
-        // AsyncTask
-        final Handler mainThreadHandler = new Handler(Looper.getMainLooper()) {
-            @Override
-            public void handleMessage(Message msg) {
-                loader.registerListener(0, listener);
-                loader.startLoading();
-            }
-        };
-
-        // Ask the main thread to start the loading process
-        mainThreadHandler.sendEmptyMessage(0);
-
-        // Block on the queue waiting for the result of the load to be inserted
-        T result;
-        while (true) {
-            try {
-                result = queue.take();
-                break;
-            } catch (InterruptedException e) {
-                throw new RuntimeException("waiting thread interrupted", e);
-            }
-        }
-
-        return result;
-    }
-
     private ContactLoader.Result assertLoadContact(Uri uri) {
         final ContactLoader loader = new ContactLoader(mMockContext, uri);
         return getLoaderResultSynchronously(loader);
@@ -447,8 +376,8 @@
         mContactsProvider.verify();
     }
 
-    private class ContactQueries {
-        private void fetchRawContacts(final long contactId, final long dataId,
+    class ContactQueries {
+        void fetchRawContacts(final long contactId, final long dataId,
                 final long rawContactId) {
             mContactsProvider.expectQuery(RawContactsEntity.CONTENT_URI)
                 .withDefaultProjection(new String[] {
@@ -485,7 +414,7 @@
                         "syn1", "syn2", "syn3", "syn4");
         }
 
-        private void fetchSocial(final Uri dataUri, final long expectedContactId) {
+        void fetchSocial(final Uri dataUri, final long expectedContactId) {
             mContactsProvider.expectQuery(dataUri)
                     .withProjection(
                             Contacts._ID, StatusUpdates.STATUS, StatusUpdates.STATUS_RES_PACKAGE,
@@ -501,7 +430,7 @@
                             0, StatusUpdates.AVAILABLE);
         }
 
-        private void fetchHeaderData(final Uri uri, final long expectedRawContactId,
+        void fetchHeaderData(final Uri uri, final long expectedRawContactId,
                 final String expectedEncodedLookup) {
             mContactsProvider.expectQuery(uri)
                     .withProjection(
@@ -532,7 +461,7 @@
                             null);
         }
 
-        private void fetchHeaderDataNoResult(final Uri uri) {
+        void fetchHeaderDataNoResult(final Uri uri) {
             mContactsProvider.expectQuery(uri)
                     .withProjection(
                             Contacts.NAME_RAW_CONTACT_ID,
@@ -549,19 +478,19 @@
                             Contacts.CONTACT_STATUS_LABEL);
         }
 
-        private void fetchLookupAndId(final Uri sourceUri, final long expectedContactId,
+        void fetchLookupAndId(final Uri sourceUri, final long expectedContactId,
                 final String expectedEncodedLookup) {
             mContactsProvider.expectQuery(sourceUri)
                     .withProjection(Contacts.LOOKUP_KEY, Contacts._ID)
                     .returnRow(expectedEncodedLookup, expectedContactId);
         }
 
-        private void fetchLookupAndIdNoResult(final Uri sourceUri) {
+        void fetchLookupAndIdNoResult(final Uri sourceUri) {
             mContactsProvider.expectQuery(sourceUri)
                     .withProjection(Contacts.LOOKUP_KEY, Contacts._ID);
         }
 
-        private void fetchContactIdAndLookupFromRawContactUri(final Uri rawContactUri,
+        void fetchContactIdAndLookupFromRawContactUri(final Uri rawContactUri,
                 final long expectedContactId, final String expectedEncodedLookup) {
             // TODO: use a lighter query by joining rawcontacts with contacts in provider
             // (See ContactContracts.java)