Merge "Batch add and remove group members in group editor"
diff --git a/res/menu/actions.xml b/res/menu/actions.xml
index 7bd3765..fd2b967 100644
--- a/res/menu/actions.xml
+++ b/res/menu/actions.xml
@@ -17,17 +17,20 @@
     <item
         android:id="@+id/menu_search"
         android:icon="@android:drawable/ic_menu_search"
-        android:title="@string/menu_search" />
+        android:title="@string/menu_search"
+        android:showAsAction="ifRoom" />
 
     <item
         android:id="@+id/menu_add_contact"
         android:icon="@drawable/ic_menu_add_contact_holo_light"
-        android:title="@string/menu_new_contact_action_bar" />
+        android:title="@string/menu_new_contact_action_bar"
+        android:showAsAction="ifRoom" />
 
     <item
         android:id="@+id/menu_add_group"
         android:icon="@drawable/ic_menu_display_all_holo_light"
-        android:title="@string/menu_new_group_action_bar" />
+        android:title="@string/menu_new_group_action_bar"
+        android:showAsAction="ifRoom" />
 
     <item
         android:id="@+id/menu_contacts_filter"
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 01f0e62..8fdccfc 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -161,7 +161,7 @@
         <attr name="call_log_list_item_height" format="dimension" />
     </declare-styleable>
 
-    <style name="PeopleTheme" parent="android:Theme.Holo.Light">
+    <style name="PeopleTheme" parent="android:Theme.Holo.Light.SplitActionBarWhenNarrow">
         <item name="list_item_height">?android:attr/listPreferredItemHeight</item>
         <item name="activated_background">@drawable/list_item_activated_background</item>
         <item name="section_header_background">@drawable/list_title_holo</item>
diff --git a/src/com/android/contacts/GroupMetaDataLoader.java b/src/com/android/contacts/GroupMetaDataLoader.java
index 8533bb6..f11217c 100644
--- a/src/com/android/contacts/GroupMetaDataLoader.java
+++ b/src/com/android/contacts/GroupMetaDataLoader.java
@@ -35,6 +35,8 @@
         Groups.FAVORITES,
         Groups.GROUP_IS_READ_ONLY,
         Groups.DELETED,
+        Groups.ACTION,
+        Groups.ACTION_URI,
     };
 
     public final static int ACCOUNT_NAME = 0;
@@ -45,6 +47,8 @@
     public final static int FAVORITES = 5;
     public final static int IS_READ_ONLY = 6;
     public final static int DELETED = 7;
+    public final static int ACTION = 8;
+    public final static int ACTION_URI = 9;
 
     public GroupMetaDataLoader(Context context, Uri groupUri) {
         super(context, ensureIsGroupUri(groupUri), COLUMNS, Groups.ACCOUNT_TYPE + " NOT NULL AND "
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 74f05c2..500ad1e 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -479,10 +479,12 @@
             case START_SEARCH_MODE:
                 clearSearch();
                 updateFragmentsVisibility();
+                invalidateOptionsMenu();
                 break;
             case STOP_SEARCH_MODE:
                 clearSearch();
                 updateFragmentsVisibility();
+                invalidateOptionsMenu();
                 break;
             case CHANGE_SEARCH_QUERY:
                 loadSearch(mActionBarAdapter.getQueryString());
@@ -515,6 +517,7 @@
                     mTabPager.setCurrentItem(tab.ordinal(), false /* no smooth scroll */);
                 }
             }
+            invalidateOptionsMenu();
             return;
         }
 
@@ -570,6 +573,7 @@
             ft.commit();
             fragmentManager.executePendingTransactions();
         }
+        invalidateOptionsMenu();
     }
 
     private class TabPagerListener implements ViewPager.OnPageChangeListener {
@@ -586,6 +590,7 @@
             // Make sure not in the search mode, in which case position != TabState.ordinal().
             if (!mTabPagerAdapter.isSearchMode()) {
                 mActionBarAdapter.setCurrentTab(TabState.fromInt(position), false);
+                invalidateOptionsMenu();
             }
         }
     }
@@ -1057,30 +1062,12 @@
     }
 
     @Override
-    public boolean onCreatePanelMenu(int featureId, Menu menu) {
-        // No menu if contacts are unavailable
-        if (!areContactsAvailable()) {
-            return false;
-        }
-
-        return super.onCreatePanelMenu(featureId, menu);
-    }
-
-    @Override
-    public boolean onPreparePanel(int featureId, View view, Menu menu) {
-        // No menu if contacts are unavailable
-        if (!areContactsAvailable()) {
-            return false;
-        }
-
-        return super.onPreparePanel(featureId, view, menu);
-    }
-
-    @Override
     public boolean onCreateOptionsMenu(Menu menu) {
-        if (!areContactsAvailable()) {
-            return false;
-        }
+//      STOPSHIP Un-comment it once b/5027071 is fixed.
+//        if (!areContactsAvailable()) {
+//            If contacts aren't available, hide all menu items.
+//            return false;
+//        }
         super.onCreateOptionsMenu(menu);
 
         MenuInflater inflater = getMenuInflater();
@@ -1136,8 +1123,12 @@
     public boolean onPrepareOptionsMenu(Menu menu) {
         mOptionsMenuContactsAvailable = areContactsAvailable();
         if (!mOptionsMenuContactsAvailable) {
+            // STOPSHIP Remove makeAllMenuItemsVisible()when STOPSHIP in onCreateOptionsMenu() is
+            // fixed.
+            makeAllMenuItemsVisible(menu, false);
             return false;
         }
+        makeAllMenuItemsVisible(menu, true);
 
         final MenuItem searchMenu = menu.findItem(R.id.menu_search);
         final MenuItem addContactMenu = menu.findItem(R.id.menu_add_contact);
@@ -1149,9 +1140,6 @@
         if (mActionBarAdapter.isSearchMode()) {
             addContactMenu.setVisible(false);
             addGroupMenu.setVisible(false);
-            if (searchMenu != null) {
-                searchMenu.setVisible(false); // Don't show the search menu in search mode.
-            }
         } else {
             switch (mActionBarAdapter.getCurrentTab()) {
                 case FAVORITES:
@@ -1168,6 +1156,11 @@
             }
         }
 
+        if (searchMenu != null) {
+            // Don't show the search menu in search mode.
+            searchMenu.setVisible(!mActionBarAdapter.isSearchMode());
+        }
+
         MenuItem settings = menu.findItem(R.id.menu_settings);
         if (settings != null) {
             settings.setVisible(!ContactsPreferenceActivity.isEmpty(this));
@@ -1176,6 +1169,13 @@
         return true;
     }
 
+    private void makeAllMenuItemsVisible(Menu menu, boolean visible) {
+        final int itemCount = menu.size();
+        for (int i = 0; i < itemCount; i++) {
+            menu.getItem(i).setVisible(visible);
+        }
+    }
+
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index f58d99a..c5f6ef4 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -35,6 +35,7 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -248,6 +249,11 @@
             mGroupId = cursor.getLong(GroupMetaDataLoader.GROUP_ID);
             mGroupName = cursor.getString(GroupMetaDataLoader.TITLE);
             updateTitle(mGroupName);
+
+            // TODO: Replace by real button
+            final String action = cursor.getString(GroupMetaDataLoader.ACTION);
+            final String actionUri = cursor.getString(GroupMetaDataLoader.ACTION_URI);
+            Log.d(TAG, "Group open action: " + action + ", uri: " + actionUri);
         }
     }