Retrieve the user's real name from the system

Also use a loader instead of an async task.

Change-Id: Ie9c033be0807bebdb559d9ce255a49b52a00134a
diff --git a/src/com/android/email/activity/setup/AccountSetupBasics.java b/src/com/android/email/activity/setup/AccountSetupBasics.java
index 21d761d..f463eea 100644
--- a/src/com/android/email/activity/setup/AccountSetupBasics.java
+++ b/src/com/android/email/activity/setup/AccountSetupBasics.java
@@ -24,11 +24,16 @@
 import android.app.Dialog;
 import android.app.DialogFragment;
 import android.app.FragmentTransaction;
+import android.app.LoaderManager;
 import android.content.Context;
+import android.content.CursorLoader;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.Loader;
+import android.database.Cursor;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.provider.ContactsContract;
 import android.text.Editable;
 import android.text.TextUtils;
 import android.text.TextWatcher;
@@ -39,7 +44,6 @@
 import android.widget.Toast;
 
 import com.android.email.EmailAddressValidator;
-import com.android.email.Preferences;
 import com.android.email.R;
 import com.android.email.activity.ActivityHelper;
 import com.android.email.activity.UiUtilities;
@@ -51,14 +55,10 @@
 import com.android.emailcommon.provider.EmailContent;
 import com.android.emailcommon.provider.HostAuth;
 import com.android.emailcommon.service.ServiceProxy;
-import com.android.emailcommon.utility.EmailAsyncTask;
 import com.android.emailcommon.utility.Utility;
 import com.android.mail.utils.LogUtils;
 
 import java.net.URISyntaxException;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.FutureTask;
 
 /**
  * Prompts the user for the email address and password. Also prompts for "Use this account as
@@ -119,8 +119,8 @@
     private boolean mPaused;
     private boolean mReportAccountAuthenticatorError;
 
-    // FutureTask to look up the owner
-    FutureTask<String> mOwnerLookupTask;
+    private static final int OWNER_NAME_LOADER_ID = 0;
+    private String mOwnerName;
 
     public static void actionNewAccount(Activity fromActivity) {
         final Intent i = new Intent(fromActivity, AccountSetupBasics.class);
@@ -302,10 +302,30 @@
             mProvider = (Provider) savedInstanceState.getSerializable(STATE_KEY_PROVIDER);
         }
 
-        // Launch a worker to look up the owner name.  It should be ready well in advance of
+        // Launch a loader to look up the owner name.  It should be ready well in advance of
         // the time the user clicks next or manual.
-        mOwnerLookupTask = new FutureTask<String>(mOwnerLookupCallable);
-        EmailAsyncTask.runAsyncParallel(mOwnerLookupTask);
+        getLoaderManager().initLoader(OWNER_NAME_LOADER_ID, null,
+                new LoaderManager.LoaderCallbacks<Cursor>() {
+                    @Override
+                    public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
+                        return new CursorLoader(AccountSetupBasics.this,
+                                ContactsContract.Profile.CONTENT_URI,
+                                new String[] {ContactsContract.Profile.DISPLAY_NAME_PRIMARY},
+                                null, null, null);
+                    }
+
+                    @Override
+                    public void onLoadFinished(final Loader<Cursor> loader, final Cursor data) {
+                        if (data != null && data.moveToFirst()) {
+                            mOwnerName = data.getString(data.getColumnIndex(
+                                    ContactsContract.Profile.DISPLAY_NAME_PRIMARY));
+                        }
+                    }
+
+                    @Override
+                    public void onLoaderReset(final Loader<Cursor> loader) {
+                    }
+                });
     }
 
     @Override
@@ -398,39 +418,10 @@
      * Return an existing username if found, or null.  This is the result of the Callable (below).
      */
     private String getOwnerName() {
-        try {
-            return mOwnerLookupTask.get();
-        } catch (InterruptedException e) {
-            return null;
-        } catch (ExecutionException e) {
-            return null;
-        }
+        return mOwnerName;
     }
 
     /**
-     * Callable that returns the username (based on other accounts) or null.
-     */
-    private final Callable<String> mOwnerLookupCallable = new Callable<String>() {
-        @Override
-        public String call() {
-            final Context context = AccountSetupBasics.this;
-
-            final long lastUsedAccountId =
-                    Preferences.getPreferences(context).getLastUsedAccountId();
-            final long defaultId = Account.getDefaultAccountId(context, lastUsedAccountId);
-
-            if (defaultId != -1) {
-                final Account account = Account.restoreAccountWithId(context, defaultId);
-                if (account != null) {
-                    return account.getSenderName();
-                }
-            }
-
-            return null;
-        }
-    };
-
-    /**
      * Finish the auto setup process, in some cases after showing a warning dialog.
      */
     private void finishAutoSetup() {