Make ContactSelectionActivity useable

This fixes the glaring bugs with ContactSelectionActivity.
It doesn't attempt to unify the ContactSelectionActivity
styling with the search styling in PeopleActivity.

Also fix a FAB RTL issue

Bug: 16164583
Bug: 15596131
Change-Id: I4d5b2cc8c5d20ae5cc2caa3e26550a51acc2d966
diff --git a/res/layout-sw600dp/contact_picker.xml b/res/layout-sw600dp/contact_picker.xml
deleted file mode 100644
index 558c604..0000000
--- a/res/layout-sw600dp/contact_picker.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    style="@style/ContactPickerLayout"
-    android:orientation="vertical"
-    android:layout_height="match_parent">
-    <!-- Right bound should be aligned to ListView's right edge. -->
-    <!--
-      The SearchView should have a max width to prevent the dialog from resizing to the
-      full screen width of the device. The precise value of the max width is not as important
-      because the SearchView can take on a smaller width than the max width, so in some cases it
-      will take on the automatically computed width of a dialog (based on the dialog contents)
-      from the framework.
-    -->
-    <view
-        class="android.widget.SearchView"
-        android:id="@+id/search_view"
-        android:layout_width="match_parent"
-        android:maxWidth="@dimen/contact_picker_search_view_max_width"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="0dip"
-        android:layout_marginRight="@dimen/list_visible_scrollbar_padding"
-        android:layout_marginStart="0dip"
-        android:layout_marginEnd="@dimen/list_visible_scrollbar_padding"
-        android:paddingRight="0dip"
-        android:paddingEnd="0dip"
-        android:iconifiedByDefault="false" />
-    <!--
-      This will contain an appropriate contacts list. Add a min height to prevent
-      the dialog from resizing too much when the search results change. The activity dialog
-      is wrap content for height in the framework, so there is no way around this.
-    -->
-    <FrameLayout
-        android:id="@+id/list_container"
-        android:layout_width="match_parent"
-        android:minHeight="@dimen/contact_picker_contact_list_min_height"
-        android:layout_height="0dip"
-        android:layout_weight="1" />
-
-    <!-- This should look like a menu on the split action bar. -->
-    <LinearLayout
-        android:id="@+id/new_contact"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:minHeight="48dip"
-        android:background="@drawable/gray_action_bar_background"
-        android:paddingLeft="16dip"
-        android:paddingRight="16dip"
-        android:paddingStart="16dip"
-        android:paddingEnd="16dip">
-        <TextView
-            android:id="@android:id/title"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:layout_gravity="center"
-            android:gravity="center"
-            android:duplicateParentState="true"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:textColor="@color/action_bar_button_text_color"
-            style="@android:style/Widget.Holo.Light.ActionBar.TabText"
-            android:text="@string/pickerNewContactText"/>
-    </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/contact_picker.xml b/res/layout/contact_picker.xml
index 2752b0c..b6741cf 100644
--- a/res/layout/contact_picker.xml
+++ b/res/layout/contact_picker.xml
@@ -14,26 +14,16 @@
      limitations under the License.
 -->
 
-<view
+<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    class="com.android.contacts.widget.FullHeightLinearLayout"
     style="@style/ContactPickerLayout"
-    android:orientation="vertical"
-    android:layout_height="match_parent">
-    <view
-        class="android.widget.SearchView"
-        android:id="@+id/search_view"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="0dip"
-        android:layout_marginRight="32dip"
-        android:layout_marginStart="0dip"
-        android:layout_marginEnd="32dip"
-        android:iconifiedByDefault="false" />
-    <!-- will contain an appropriate contacts list -->
+    android:layout_height="match_parent"
+    android:layout_width="match_parent">
+
     <FrameLayout
         android:id="@+id/list_container"
         android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1" />
-</view>
+        android:layout_height="match_parent" />
+
+    <include layout="@layout/floating_action_button" />
+</RelativeLayout>
diff --git a/res/layout/floating_action_button.xml b/res/layout/floating_action_button.xml
new file mode 100644
index 0000000..dd41dbe
--- /dev/null
+++ b/res/layout/floating_action_button.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- This expects to be included inside a RelativeLayout -->
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/floating_action_button_container"
+    android:layout_width="@dimen/floating_action_button_width"
+    android:layout_height="@dimen/floating_action_button_height"
+    android:layout_marginEnd="@dimen/floating_action_button_margin_right"
+    android:layout_marginBottom="@dimen/floating_action_button_margin_bottom"
+    android:layout_alignParentEnd="true"
+    android:layout_alignParentBottom="true">
+
+    <ImageButton
+        android:id="@+id/floating_action_button"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@drawable/floating_action_button"
+        android:contentDescription="@string/action_menu_add_new_contact_button"
+        android:src="@drawable/ic_person_add_24dp"/>
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/people_activity.xml b/res/layout/people_activity.xml
index bcdf08f..6b65945 100644
--- a/res/layout/people_activity.xml
+++ b/res/layout/people_activity.xml
@@ -43,21 +43,5 @@
             android:layout_width="match_parent" />
     </FrameLayout>
 
-    <FrameLayout
-        android:id="@+id/floating_action_button_container"
-        android:layout_width="@dimen/floating_action_button_width"
-        android:layout_height="@dimen/floating_action_button_height"
-        android:layout_marginRight="@dimen/floating_action_button_margin_right"
-        android:layout_marginBottom="@dimen/floating_action_button_margin_bottom"
-        android:layout_alignParentRight="true"
-        android:layout_alignParentBottom="true">
-
-        <ImageButton
-            android:id="@+id/floating_action_button"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:background="@drawable/floating_action_button"
-            android:contentDescription="@string/action_menu_add_new_contact_button"
-            android:src="@drawable/ic_person_add_24dp"/>
-    </FrameLayout>
+    <include layout="@layout/floating_action_button" />
 </RelativeLayout>
diff --git a/res/menu/contact_picker_options.xml b/res/menu/contact_picker_options.xml
deleted file mode 100644
index 89196ba..0000000
--- a/res/menu/contact_picker_options.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<!-- Used with DialtactsActivity's search mode. -->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:id="@+id/create_new_contact"
-        android:title="@string/pickerNewContactText"
-        android:showAsAction="ifRoom" />
-</menu>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 5823ed7..57c9358 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -111,6 +111,11 @@
         <item name="android:icon">@android:color/transparent</item>
     </style>
 
+    <style name="ContactsPickerActionBarStyle" parent="@style/ContactsActionBarStyle">
+        <!-- when first loading, don't show title or up button -->
+        <item name="android:displayOptions"></item>
+    </style>
+
     <!-- Styling for tabs. -->
     <style name="ContactsActionBarTabStyle" parent="@android:style/Widget.Material.Light.ActionBar.TabView">
         <item name="android:background">@drawable/action_bar_tab</item>
@@ -163,7 +168,9 @@
         <item name="android:listSelector">?android:attr/listChoiceBackgroundIndicator</item>
     </style>
 
-    <style name="ContactPickerTheme" parent="@style/PeopleTheme" />
+    <style name="ContactPickerTheme" parent="@style/PeopleTheme" >
+        <item name="android:actionBarStyle">@style/ContactsPickerActionBarStyle</item>
+    </style>
 
     <style name="ContactPickerLayout" parent="ContactPickerTheme">
         <item name="android:layout_width">match_parent</item>
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 0c784cb..4375cb7 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -30,13 +30,12 @@
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.View.OnFocusChangeListener;
 import android.view.inputmethod.InputMethodManager;
+import android.widget.ImageButton;
 import android.widget.SearchView;
 import android.widget.SearchView.OnCloseListener;
 import android.widget.SearchView.OnQueryTextListener;
@@ -45,6 +44,7 @@
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
 import com.android.contacts.common.list.ContactEntryListFragment;
+import com.android.contacts.common.util.ViewUtil;
 import com.android.contacts.list.ContactPickerFragment;
 import com.android.contacts.list.ContactsIntentResolver;
 import com.android.contacts.list.ContactsRequest;
@@ -75,9 +75,6 @@
     private static final String KEY_ACTION_CODE = "actionCode";
     private static final int DEFAULT_DIRECTORY_RESULT_LIMIT = 20;
 
-    // Delay to allow the UI to settle before making search view visible
-    private static final int FOCUS_DELAY = 200;
-
     private ContactsIntentResolver mIntentResolver;
     protected ContactEntryListFragment<?> mListFragment;
 
@@ -85,10 +82,6 @@
 
     private ContactsRequest mRequest;
     private SearchView mSearchView;
-    /**
-     * Can be null. If null, the "Create New Contact" button should be on the menu.
-     */
-    private View mCreateNewContactButton;
 
     public ContactSelectionActivity() {
         mIntentResolver = new ContactsIntentResolver(this);
@@ -137,14 +130,16 @@
 
         prepareSearchViewAndActionBar();
 
-        mCreateNewContactButton = findViewById(R.id.new_contact);
-        if (mCreateNewContactButton != null) {
-            if (shouldShowCreateNewContactButton()) {
-                mCreateNewContactButton.setVisibility(View.VISIBLE);
-                mCreateNewContactButton.setOnClickListener(this);
-            } else {
-                mCreateNewContactButton.setVisibility(View.GONE);
-            }
+        // Configure action button
+        final View floatingActionButtonContainer = findViewById(
+                R.id.floating_action_button_container);
+        if (shouldShowCreateNewContactButton()) {
+            ViewUtil.setupFloatingActionButton(floatingActionButtonContainer, getResources());
+            final ImageButton floatingActionButton
+                    = (ImageButton) findViewById(R.id.floating_action_button);
+            floatingActionButton.setOnClickListener(this);
+        } else {
+            floatingActionButtonContainer.setVisibility(View.GONE);
         }
     }
 
@@ -169,67 +164,33 @@
             return;
         }
 
-        // If ActionBar is available, show SearchView on it. If not, show SearchView inside the
-        // Activity's layout.
         final ActionBar actionBar = getActionBar();
-        if (actionBar != null) {
-            final View searchViewOnLayout = findViewById(R.id.search_view);
-            if (searchViewOnLayout != null) {
-                searchViewOnLayout.setVisibility(View.GONE);
-            }
+        final View searchViewContainer = LayoutInflater.from(actionBar.getThemedContext())
+                .inflate(R.layout.custom_action_bar, null);
+        mSearchView = (SearchView) searchViewContainer.findViewById(R.id.search_view);
 
-            final View searchViewContainer = LayoutInflater.from(actionBar.getThemedContext())
-                    .inflate(R.layout.custom_action_bar, null);
-            mSearchView = (SearchView) searchViewContainer.findViewById(R.id.search_view);
+        // In order to make the SearchView look like "shown via search menu", we need to
+        // manually setup its state. See also DialtactsActivity.java and ActionBarAdapter.java.
+        mSearchView.setIconifiedByDefault(true);
+        mSearchView.setQueryHint(getString(R.string.hint_findContacts));
+        mSearchView.setIconified(false);
 
-            // In order to make the SearchView look like "shown via search menu", we need to
-            // manually setup its state. See also DialtactsActivity.java and ActionBarAdapter.java.
-            mSearchView.setIconifiedByDefault(true);
-            mSearchView.setQueryHint(getString(R.string.hint_findContacts));
-            mSearchView.setIconified(false);
+        mSearchView.setOnQueryTextListener(this);
+        mSearchView.setOnCloseListener(this);
+        mSearchView.setOnQueryTextFocusChangeListener(this);
 
-            mSearchView.setOnQueryTextListener(this);
-            mSearchView.setOnCloseListener(this);
-            mSearchView.setOnQueryTextFocusChangeListener(this);
-
-            actionBar.setCustomView(searchViewContainer,
-                    new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
-            actionBar.setDisplayShowCustomEnabled(true);
-            actionBar.setDisplayShowHomeEnabled(true);
-            actionBar.setDisplayHomeAsUpEnabled(true);
-        } else {
-            mSearchView = (SearchView) findViewById(R.id.search_view);
-            mSearchView.setQueryHint(getString(R.string.hint_findContacts));
-            mSearchView.setOnQueryTextListener(this);
-
-            // This is a hack to prevent the search view from grabbing focus
-            // at this point.  If search view were visible, it would always grabs focus
-            // because it is the first focusable widget in the window.
-            mSearchView.setVisibility(View.INVISIBLE);
-            mSearchView.postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    mSearchView.setVisibility(View.VISIBLE);
-                }
-            }, FOCUS_DELAY);
-        }
+        actionBar.setCustomView(searchViewContainer,
+                new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+        actionBar.setDisplayShowCustomEnabled(true);
+        actionBar.setDisplayShowHomeEnabled(true);
+        actionBar.setDisplayHomeAsUpEnabled(true);
+        actionBar.setDisplayShowTitleEnabled(false);
 
         // Clear focus and suppress keyboard show-up.
         mSearchView.clearFocus();
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        // If we want "Create New Contact" button but there's no such a button in the layout,
-        // try showing a menu for it.
-        if (shouldShowCreateNewContactButton() && mCreateNewContactButton == null) {
-            MenuInflater inflater = getMenuInflater();
-            inflater.inflate(R.menu.contact_picker_options, menu);
-        }
-        return true;
-    }
-
-    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case android.R.id.home:
@@ -237,10 +198,6 @@
                 setResult(RESULT_CANCELED);
                 finish();
                 return true;
-            case R.id.create_new_contact: {
-                startCreateNewContactActivity();
-                return true;
-            }
         }
         return super.onOptionsItemSelected(item);
     }
@@ -601,7 +558,7 @@
     @Override
     public void onClick(View view) {
         switch (view.getId()) {
-            case R.id.new_contact: {
+            case R.id.floating_action_button: {
                 startCreateNewContactActivity();
                 break;
             }