Upgrading QSB->Contacts integration for tablet UI

Change-Id: Ic6ff3639b808936c29b08c751b6475ebd0bdad3c
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4a2f95d..fa4d3b1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -212,6 +212,15 @@
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.TAB" />
             </intent-filter>
+
+            <intent-filter>
+                <action android:name="android.intent.action.SEARCH" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <meta-data android:name="android.app.searchable"
+                android:resource="@xml/searchable"
+            />
         </activity>
         
         <activity android:name=".activities.ContactSelectionActivity"
@@ -291,16 +300,7 @@
 
         <!-- The contacts search/filter UI -->
         <activity-alias android:name="SearchResultsActivity"
-            android:targetActivity=".activities.ContactSearchActivity"
-        >
-            <intent-filter>
-                <action android:name="android.intent.action.SEARCH" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-
-            <meta-data android:name="android.app.searchable"
-                android:resource="@xml/searchable"
-            />
+            android:targetActivity=".activities.ContactBrowserActivity">
         </activity-alias>
 
         <!-- Used to set options -->
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index ab6576e..aa75414 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -172,6 +172,16 @@
         mHasActionBar = getWindow().hasFeature(Window.FEATURE_ACTION_BAR);
         mContactContentDisplayed = findViewById(R.id.detail_container) != null;
 
+        Uri contactUri = null;
+        if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT) {
+            contactUri = mRequest.getContactUri();
+            if (!mContactContentDisplayed) {
+                startActivity(new Intent(Intent.ACTION_VIEW, contactUri));
+                finish();
+                return;
+            }
+        }
+
         if (mHasActionBar) {
             mActionBarAdapter = new ActionBarAdapter(this);
             mActionBarAdapter.onCreate(savedState, mRequest, getActionBar());
@@ -180,7 +190,10 @@
             // TODO: request may ask for FREQUENT - set the filter accordingly
         }
 
-        configureListFragment();
+        configureListFragment(contactUri);
+        if (contactUri != null) {
+            setSelectedContactUri(contactUri);
+        }
 
         if (mContactContentDisplayed) {
             setupContactDetailFragment(mListFragment.getSelectedContactUri());
@@ -225,7 +238,7 @@
         return TextUtils.isEmpty(uriString) ? null : Uri.parse(uriString);
     }
 
-    private void configureListFragment() {
+    private void configureListFragment(Uri selectedContactUri) {
         boolean searchMode = mSearchMode;
         if (mHasActionBar) {
             searchMode = mActionBarAdapter.isSearchMode();
@@ -270,12 +283,18 @@
             }
         }
 
-        if (mListFragment.getSelectedContactUri() == null) {
-            Uri defaultUri = getDefaultSelectedContactUri();
-            if (defaultUri != null) {
-                mListFragment.setSelectedContactUri(defaultUri);
-                mListFragment.requestSelectionOnScreen(false);
-            }
+        Uri selectUri;
+        if (selectedContactUri != null) {
+            selectUri = selectedContactUri;
+        } else if (mListFragment.getSelectedContactUri() == null) {
+            selectUri = getDefaultSelectedContactUri();
+        } else {
+            selectUri = null;
+        }
+
+        if (selectUri != null) {
+            mListFragment.setSelectedContactUri(selectUri);
+            mListFragment.requestSelectionOnScreen(false);
         }
 
         if (replaceList) {
@@ -403,7 +422,7 @@
      */
     @Override
     public void onAction() {
-        configureListFragment();
+        configureListFragment(null);
         setupContactDetailFragment(mListFragment.getSelectedContactUri());
     }
 
diff --git a/src/com/android/contacts/list/ContactsIntentResolver.java b/src/com/android/contacts/list/ContactsIntentResolver.java
index 0570b2c..79dc1b0 100644
--- a/src/com/android/contacts/list/ContactsIntentResolver.java
+++ b/src/com/android/contacts/list/ContactsIntentResolver.java
@@ -183,7 +183,8 @@
                 newIntent.setData(data);
                 request.setRedirectIntent(newIntent);
             } else {
-                request.setRedirectIntent(new Intent(Intent.ACTION_VIEW, data));
+                request.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
+                request.setContactUri(data);
             }
         } else if (Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED.equals(action)) {
             request.setRedirectIntent(new Intent(Intent.ACTION_CALL_PRIVILEGED, intent.getData()));
diff --git a/src/com/android/contacts/list/ContactsRequest.java b/src/com/android/contacts/list/ContactsRequest.java
index 33f1685..e8ccb43 100644
--- a/src/com/android/contacts/list/ContactsRequest.java
+++ b/src/com/android/contacts/list/ContactsRequest.java
@@ -17,6 +17,7 @@
 package com.android.contacts.list;
 
 import android.content.Intent;
+import android.net.Uri;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -64,6 +65,9 @@
     /** Show all phone numbers and create an SMS shortcut for the picked number */
     public static final int ACTION_CREATE_SHORTCUT_SMS = 130;
 
+    /** Show all contacts and activate the specified one */
+    public static final int ACTION_VIEW_CONTACT = 140;
+
     private boolean mValid = true;
     private int mActionCode = ACTION_DEFAULT;
     private Intent mRedirectIntent;
@@ -80,6 +84,7 @@
     private String mGroupName;
     private boolean mLegacyCompatibilityMode;
     private boolean mDirectorySearchEnabled = true;
+    private Uri mContactUri;
 
     /**
      * Copies all fields.
@@ -96,6 +101,7 @@
         mGroupName = request.mGroupName;
         mLegacyCompatibilityMode = request.mLegacyCompatibilityMode;
         mDirectorySearchEnabled = request.mDirectorySearchEnabled;
+        mContactUri = request.mContactUri;
     }
 
     public static Parcelable.Creator<ContactsRequest> CREATOR = new Creator<ContactsRequest>() {
@@ -105,10 +111,11 @@
         }
 
         public ContactsRequest createFromParcel(Parcel source) {
+            ClassLoader classLoader = this.getClass().getClassLoader();
             ContactsRequest request = new ContactsRequest();
             request.mValid = source.readInt() != 0;
             request.mActionCode = source.readInt();
-            request.mRedirectIntent = source.readParcelable(this.getClass().getClassLoader());
+            request.mRedirectIntent = source.readParcelable(classLoader);
             request.mTitle = source.readCharSequence();
             request.mSearchMode = source.readInt() != 0;
             request.mQueryString = source.readString();
@@ -117,6 +124,7 @@
             request.mGroupName = source.readString();
             request.mLegacyCompatibilityMode  = source.readInt() != 0;
             request.mDirectorySearchEnabled = source.readInt() != 0;
+            request.mContactUri = source.readParcelable(classLoader);
             return request;
         }
     };
@@ -133,6 +141,7 @@
         dest.writeString(mGroupName);
         dest.writeInt(mLegacyCompatibilityMode ? 1 : 0);
         dest.writeInt(mDirectorySearchEnabled ? 1 : 0);
+        dest.writeParcelable(mContactUri, 0);
     }
 
     public int describeContents() {
@@ -230,4 +239,12 @@
     public void setDirectorySearchEnabled(boolean flag) {
         mDirectorySearchEnabled = flag;
     }
+
+    public Uri getContactUri() {
+        return mContactUri;
+    }
+
+    public void setContactUri(Uri contactUri) {
+        this.mContactUri = contactUri;
+    }
 }