Add GAL support to Dialer

Add BIND_DIRECTORY_SEARCH permission to manifest. Use new methods
for GAL support. Change SmartDialing cursor and adapter to use
PhoneNumberListAdapter projections directly.

Bug:
Change-Id: I5f8181cfeec7adab4865e680ebc85ba2b476fc39
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 91e228e..178b3e8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -20,6 +20,7 @@
     <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+    <uses-permission android:name="android.permission.BIND_DIRECTORY_SEARCH" />
     <uses-permission android:name="android.permission.READ_CALL_LOG" />
     <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
     <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 8cac17e..89e5b5a 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -176,6 +176,12 @@
                 }
 
                 @Override
+                public void onCallNumberDirectly(String phoneNumber) {
+                    Intent intent = CallUtil.getCallIntent(phoneNumber, getCallOrigin());
+                    startActivity(intent);
+                }
+
+                @Override
                 public void onShortcutIntentCreated(Intent intent) {
                     Log.w(TAG, "Unsupported intent has come (" + intent + "). Ignoring.");
                 }
diff --git a/src/com/android/dialer/NewSearchFragment.java b/src/com/android/dialer/NewSearchFragment.java
index 0ddee42..e8e40d6 100644
--- a/src/com/android/dialer/NewSearchFragment.java
+++ b/src/com/android/dialer/NewSearchFragment.java
@@ -29,6 +29,10 @@
 
     private OnListFragmentScrolledListener mActivityScrollListener;
 
+    public NewSearchFragment() {
+        setDirectorySearchEnabled(true);
+    }
+
     @Override
     public void onAttach(Activity activity) {
         super.onAttach(activity);
diff --git a/src/com/android/dialer/dialpad/SmartDialCursorLoader.java b/src/com/android/dialer/dialpad/SmartDialCursorLoader.java
index 715f1e7..ee4a7a1 100644
--- a/src/com/android/dialer/dialpad/SmartDialCursorLoader.java
+++ b/src/com/android/dialer/dialpad/SmartDialCursorLoader.java
@@ -24,6 +24,7 @@
 import android.telephony.PhoneNumberUtils;
 import android.util.Log;
 
+import com.android.contacts.common.list.PhoneNumberListAdapter.PhoneQuery;
 import com.android.dialer.database.DialerDatabaseHelper;
 import com.android.dialer.database.DialerDatabaseHelper.ContactNumber;
 
@@ -44,29 +45,6 @@
     private String mQuery;
     private SmartDialNameMatcher mNameMatcher;
 
-    /** Constructs the columns of the cursor to be used. */
-    public static class SmartDialPhoneQuery {
-        public static final String[] PROJECTION_PRIMARY = new String[] {
-            Phone._ID,                          // 0
-            Phone.TYPE,                         // 1
-            Phone.LABEL,                        // 2
-            Phone.NUMBER,                       // 3
-            Phone.CONTACT_ID,                   // 4
-            Phone.LOOKUP_KEY,                   // 5
-            Phone.PHOTO_ID,                     // 6
-            Phone.DISPLAY_NAME_PRIMARY,         // 7
-        };
-
-        public static final int SMARTDIAL_ID          = 0;
-        public static final int SMARTDIAL_TYPE         = 1;
-        public static final int SMARTDIAL_LABEL        = 2;
-        public static final int SMARTDIAL_NUMBER       = 3;
-        public static final int SMARTDIAL_CONTACT_ID   = 4;
-        public static final int SMARTDIAL_LOOKUP_KEY   = 5;
-        public static final int SMARTDIAL_PHOTO_ID     = 6;
-        public static final int SMARTDIAL_DISPLAY_NAME = 7;
-    }
-
     public SmartDialCursorLoader(Context context) {
         super(context);
         mContext = context;
@@ -107,10 +85,16 @@
         }
 
         /** Constructs a cursor for the returned array of results. */
-        final MatrixCursor cursor = new MatrixCursor(SmartDialPhoneQuery.PROJECTION_PRIMARY);
+        final MatrixCursor cursor = new MatrixCursor(PhoneQuery.PROJECTION_PRIMARY);
+        Object[] row = new Object[PhoneQuery.PROJECTION_PRIMARY.length];
         for (ContactNumber contact : allMatches) {
-            cursor.addRow(new Object[] {contact.dataId, null, null, contact.phoneNumber, contact.id,
-                    contact.lookupKey, contact.photoId, contact.displayName});
+            row[PhoneQuery.PHONE_ID] = contact.dataId;
+            row[PhoneQuery.PHONE_NUMBER] = contact.phoneNumber;
+            row[PhoneQuery.CONTACT_ID] = contact.id;
+            row[PhoneQuery.LOOKUP_KEY] = contact.lookupKey;
+            row[PhoneQuery.PHOTO_ID] = contact.photoId;
+            row[PhoneQuery.DISPLAY_NAME] = contact.displayName;
+            cursor.addRow(row);
         }
         return cursor;
     }
diff --git a/src/com/android/dialer/list/SmartDialNumberListAdapter.java b/src/com/android/dialer/list/SmartDialNumberListAdapter.java
index 0413c4e..c5ce59a 100644
--- a/src/com/android/dialer/list/SmartDialNumberListAdapter.java
+++ b/src/com/android/dialer/list/SmartDialNumberListAdapter.java
@@ -26,8 +26,8 @@
 
 import com.android.contacts.common.list.ContactListItemView;
 import com.android.contacts.common.list.PhoneNumberListAdapter;
+import com.android.contacts.common.list.PhoneNumberListAdapter.PhoneQuery;
 import com.android.dialer.dialpad.SmartDialCursorLoader;
-import com.android.dialer.dialpad.SmartDialCursorLoader.SmartDialPhoneQuery;
 import com.android.dialer.dialpad.SmartDialNameMatcher;
 import com.android.dialer.dialpad.SmartDialPrefix;
 import com.android.dialer.dialpad.SmartDialMatchPosition;
@@ -56,7 +56,7 @@
      */
     public void configureLoader(SmartDialCursorLoader loader) {
         if (DEBUG) {
-            Log.v(TAG, "Congifugure Loader with query" + getQueryString());
+            Log.v(TAG, "Configure Loader with query" + getQueryString());
         }
 
         if (getQueryString() == null) {
@@ -78,19 +78,19 @@
     protected void setHighlight(ContactListItemView view, Cursor cursor) {
         view.clearHighlightSequences();
 
-        if (mNameMatcher.matches(cursor.getString(SmartDialPhoneQuery.SMARTDIAL_DISPLAY_NAME))) {
+        if (mNameMatcher.matches(cursor.getString(PhoneQuery.DISPLAY_NAME))) {
             final ArrayList<SmartDialMatchPosition> nameMatches = mNameMatcher.getMatchPositions();
             for (SmartDialMatchPosition match:nameMatches) {
                 view.addNameHighlightSequence(match.start, match.end);
                 if (DEBUG) {
-                    Log.v(TAG, cursor.getString(SmartDialPhoneQuery.SMARTDIAL_DISPLAY_NAME) + " " +
+                    Log.v(TAG, cursor.getString(PhoneQuery.DISPLAY_NAME) + " " +
                             mNameMatcher.getQuery() + " " + String.valueOf(match.start));
                 }
             }
         }
 
         final SmartDialMatchPosition numberMatch = mNameMatcher.matchesNumber(cursor.getString(
-                SmartDialPhoneQuery.SMARTDIAL_NUMBER));
+                PhoneQuery.PHONE_NUMBER));
         if (numberMatch != null) {
             view.addNumberHighlightSequence(numberMatch.start, numberMatch.end);
         }
@@ -104,7 +104,7 @@
     public Uri getDataUri(int position) {
         Cursor cursor = ((Cursor)getItem(position));
         if (cursor != null) {
-            long id = cursor.getLong(SmartDialPhoneQuery.SMARTDIAL_ID);
+            long id = cursor.getLong(PhoneQuery.PHONE_ID);
             return ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, id);
         } else {
             Log.w(TAG, "Cursor was null in getDataUri() call. Returning null instead.");