Fix errors during reverse number lookup.

- GoogleAuthUtil.getToken() is not multi-thread safe and causes bind errors
when called at the same time by multiple threads.  Switched to process
getToken() serially.  Also save token to be re-used instead of fetching new
token for each request.
- Safe guard json parsing by adding explicit JSONException check when looking
for json arrays by name.
- Added thread pool instead of starting a new async task for each people and
image lookup.

Bug: 10462306
Bug: 10492891
Change-Id: I832a9f6657d1b5747d75cd93ea49a6df73c889db
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 3e1a2ef..d26e6fb 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -21,7 +21,6 @@
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
 import android.graphics.Bitmap;
-import android.os.AsyncTask;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
 
@@ -359,7 +358,7 @@
     public void lookupPhoneNumber(String phoneNumber) {
         if (mPhoneNumberService != null) {
             mPhoneNumberService.getPhoneNumberInfo(phoneNumber,
-                    new PhoneNumberService.PhoneNumberServiceListener() {
+                    new PhoneNumberService.NumberLookupListener() {
                         @Override
                         public void onPhoneNumberInfoComplete(
                                 final PhoneNumberService.PhoneNumberInfo info) {
@@ -368,8 +367,8 @@
                             }
                             // TODO(klp): Ui is sometimes null due to something being shutdown.
                             if (getUi() != null) {
-                                if (info.getName() != null) {
-                                    getUi().setPrimaryName(info.getName(), false);
+                                if (info.getDisplayName() != null) {
+                                    getUi().setPrimaryName(info.getDisplayName(), false);
                                 }
 
                                 if (info.getImageUrl() != null) {
@@ -424,23 +423,14 @@
 
     private void fetchImage(final String url) {
         if (url != null) {
-            new AsyncTask<Void, Void, Bitmap>() {
-
+            mPhoneNumberService.fetchImage(url, new PhoneNumberService.ImageLookupListener() {
                 @Override
-                protected Bitmap doInBackground(Void... params) {
-                    // Fetch the image
-                    return mPhoneNumberService.fetchImage(url);
-                }
-
-                @Override
-                protected void onPostExecute(Bitmap bitmap) {
-                    // TODO(klp): same as above, figure out why it's null.
+                public void onImageFetchComplete(Bitmap bitmap) {
                     if (getUi() != null) {
                         getUi().setPrimaryImage(bitmap);
                     }
                 }
-
-            }.execute();
+            });
         }
     }
 
diff --git a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
index 4566388..1fc2858 100644
--- a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
+++ b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
@@ -19,14 +19,27 @@
 import android.graphics.Bitmap;
 
 /**
- *
+ * Provides phone number lookup services.
  */
 public interface PhoneNumberService {
-    public void getPhoneNumberInfo(String phoneNumber, PhoneNumberServiceListener listener);
 
-    public Bitmap fetchImage(String url);
+    /**
+     * Get a phone number number asynchronously.
+     *
+     * @param phoneNumber The phone number to lookup.
+     * @param listener The listener to notify when the phone number lookup is complete.
+     */
+    public void getPhoneNumberInfo(String phoneNumber, NumberLookupListener listener);
 
-    public interface PhoneNumberServiceListener {
+    /**
+     * Get an image asynchronously.
+     *
+     * @param url The url to fetch the image from.
+     * @param listener The listener to notify when the image lookup is complete.
+     */
+    public void fetchImage(String url, ImageLookupListener listener);
+
+    public interface NumberLookupListener {
 
         /**
          * Callback when a phone number has been looked up.
@@ -36,8 +49,18 @@
         public void onPhoneNumberInfoComplete(PhoneNumberInfo info);
     }
 
+    public interface ImageLookupListener {
+
+        /**
+         * Callback when a image has been fetched.
+         *
+         * @param bitmap The fetched image.
+         */
+        public void onImageFetchComplete(Bitmap bitmap);
+    }
+
     public interface PhoneNumberInfo {
-        public String getName();
+        public String getDisplayName();
         public String getPhoneNumber();
         public String getImageUrl();
     }