Add group menu options in group details fragment

- Move "new contact" and "new group" menu items into
list fragment (instead of details fragment or
people activity), so it works according to the current
tab esp for the phone
- Move group menu items into group detail fragment
- Remove custom "new contact" button
- Add some fixes for menu items / fragments going into and
out of search mode

Change-Id: I1f2a4d7e90b4e5d438bb271f0a66e21d8069b189
diff --git a/res/menu-xlarge/actions.xml b/res/menu-xlarge/actions.xml
new file mode 100644
index 0000000..60788e0
--- /dev/null
+++ b/res/menu-xlarge/actions.xml
@@ -0,0 +1,54 @@
+<?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.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/menu_search"
+        android:showAsAction="always"
+        android:actionViewClass="android.widget.SearchView" />
+
+    <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:showAsAction="withText|always" />
+
+    <item
+        android:id="@+id/menu_add_group"
+        android:icon="@drawable/ic_menu_display_all_holo_light"
+        android:title="@string/menu_new_contact_action_bar"
+        android:showAsAction="withText|always" />
+
+    <item
+        android:id="@+id/menu_contacts_filter"
+        android:icon="@drawable/ic_menu_settings_holo_light"
+        android:title="@string/menu_contacts_filter" />
+
+    <item
+        android:id="@+id/menu_settings"
+        android:icon="@drawable/ic_menu_settings_holo_light"
+        android:title="@string/menu_settings" />
+
+    <item
+        android:id="@+id/menu_accounts"
+        android:icon="@drawable/ic_menu_accounts_holo_light"
+        android:title="@string/menu_accounts" />
+
+    <item
+        android:id="@+id/menu_import_export"
+        android:icon="@drawable/ic_menu_import_export_holo_light"
+        android:title="@string/menu_import_export" />
+
+</menu>
diff --git a/res/menu/view.xml b/res/menu-xlarge/view_contact.xml
similarity index 100%
rename from res/menu/view.xml
rename to res/menu-xlarge/view_contact.xml
diff --git a/res/menu-xlarge/view_group.xml b/res/menu-xlarge/view_group.xml
new file mode 100644
index 0000000..8b0867b
--- /dev/null
+++ b/res/menu-xlarge/view_group.xml
@@ -0,0 +1,34 @@
+<?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.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/menu_edit_group"
+        android:icon="@drawable/ic_menu_compose_holo_light"
+        android:title="@string/menu_editGroup"
+        android:alphabeticShortcut="e"
+        android:showAsAction="always" />
+
+    <item
+        android:id="@+id/menu_rename_group"
+        android:icon="@drawable/ic_menu_settings_holo_light"
+        android:title="@string/menu_renameGroup" />
+
+    <item
+        android:id="@+id/menu_delete_group"
+        android:icon="@drawable/ic_menu_trash_holo_light"
+        android:title="@string/menu_deleteGroup" />
+</menu>
diff --git a/res/menu/actions.xml b/res/menu/actions.xml
index 083d352..98d36a5 100644
--- a/res/menu/actions.xml
+++ b/res/menu/actions.xml
@@ -20,8 +20,14 @@
         android:actionViewClass="android.widget.SearchView" />
 
     <item
-        android:id="@+id/menu_add"
-        android:showAsAction="always" />
+        android:id="@+id/menu_add_contact"
+        android:icon="@drawable/ic_menu_add_contact_holo_light"
+        android:title="@string/menu_new_contact_action_bar" />
+
+    <item
+        android:id="@+id/menu_add_group"
+        android:icon="@drawable/ic_menu_display_all_holo_light"
+        android:title="@string/menu_new_contact_action_bar" />
 
     <item
         android:id="@+id/menu_contacts_filter"
@@ -43,13 +49,4 @@
         android:icon="@drawable/ic_menu_import_export_holo_light"
         android:title="@string/menu_import_export" />
 
-    <item
-        android:id="@+id/menu_rename_group"
-        android:icon="@drawable/ic_menu_settings_holo_light"
-        android:title="@string/menu_renameGroup" />
-
-    <item
-        android:id="@+id/menu_delete_group"
-        android:icon="@drawable/ic_menu_trash_holo_light"
-        android:title="@string/menu_deleteGroup" />
 </menu>
diff --git a/res/menu/view_contact.xml b/res/menu/view_contact.xml
new file mode 100644
index 0000000..7cf17d6
--- /dev/null
+++ b/res/menu/view_contact.xml
@@ -0,0 +1,39 @@
+<?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.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/menu_edit"
+        android:icon="@drawable/ic_menu_compose_holo_light"
+        android:title="@string/menu_editContact"
+        android:alphabeticShortcut="e" />
+
+    <item
+        android:id="@+id/menu_share"
+        android:icon="@drawable/ic_menu_share_holo_light"
+        android:title="@string/menu_share"
+        android:alphabeticShortcut="s" />
+
+    <item
+        android:id="@+id/menu_options"
+        android:icon="@drawable/ic_menu_mark"
+        android:title="@string/menu_contactOptions" />
+
+    <item
+        android:id="@+id/menu_delete"
+        android:icon="@drawable/ic_menu_trash_holo_light"
+        android:title="@string/menu_deleteContact" />
+</menu>
diff --git a/res/menu/view_group.xml b/res/menu/view_group.xml
new file mode 100644
index 0000000..3ff6ac6
--- /dev/null
+++ b/res/menu/view_group.xml
@@ -0,0 +1,33 @@
+<?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.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/menu_edit_group"
+        android:icon="@drawable/ic_menu_compose_holo_light"
+        android:title="@string/menu_editGroup"
+        android:alphabeticShortcut="e" />
+
+    <item
+        android:id="@+id/menu_rename_group"
+        android:icon="@drawable/ic_menu_settings_holo_light"
+        android:title="@string/menu_renameGroup" />
+
+    <item
+        android:id="@+id/menu_delete_group"
+        android:icon="@drawable/ic_menu_trash_holo_light"
+        android:title="@string/menu_deleteGroup" />
+</menu>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 52facac..52eab2f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -118,6 +118,9 @@
     <!-- Menu item that splits an item from the contact detail into a separate aggregate -->
     <string name="menu_splitAggregate">Separate</string>
 
+    <!-- Menu item that edits the currently selected group [CHAR LIMIT=30] -->
+    <string name="menu_editGroup">Edit group</string>
+
     <!-- Menu item that renames the currently selected group [CHAR LIMIT=30] -->
     <string name="menu_renameGroup">Rename group</string>
 
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 4b0f0e4..9e325cf 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -133,19 +133,22 @@
 
     private ContactListFilterController mContactListFilterController;
 
-    private View mAddContactImageView;
-
     private ContactsUnavailableFragment mContactsUnavailableFragment;
     private ProviderStatusLoader mProviderStatusLoader;
     private int mProviderStatus = -1;
 
     private boolean mOptionsMenuContactsAvailable;
-    private boolean mOptionsMenuGroupActionsEnabled;
 
     private DefaultContactBrowseListFragment mContactsFragment;
     private StrequentContactListFragment mFavoritesFragment;
     private GroupBrowseListFragment mGroupsFragment;
 
+    private enum TabState {
+        FAVORITES, CONTACTS, GROUPS
+    }
+
+    private TabState mSelectedTab;
+
     public PeopleActivity() {
         mIntentResolver = new ContactsIntentResolver(this);
         // TODO: Get rid of the ContactListFilterController class because there aren't any
@@ -190,17 +193,6 @@
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
 
-        mAddContactImageView = getLayoutInflater().inflate(
-                R.layout.add_contact_menu_item, null, false);
-        View item = mAddContactImageView.findViewById(R.id.menu_item);
-        item.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
-                startActivityForResult(intent, SUBACTIVITY_NEW_CONTACT);
-            }
-        });
-
         configureContentView(true, savedState);
     }
 
@@ -273,19 +265,19 @@
             Tab favoritesTab = actionBar.newTab();
             favoritesTab.setText(getString(R.string.strequentList));
             favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment,
-                    mContactDetailFragment));
+                    mContactDetailFragment, TabState.FAVORITES));
             actionBar.addTab(favoritesTab);
 
             Tab peopleTab = actionBar.newTab();
             peopleTab.setText(getString(R.string.people));
             peopleTab.setTabListener(new TabChangeListener(mContactsFragment,
-                    mContactDetailFragment));
+                    mContactDetailFragment, TabState.CONTACTS));
             actionBar.addTab(peopleTab);
 
             Tab groupsTab = actionBar.newTab();
             groupsTab.setText(getString(R.string.contactsGroupsLabel));
             groupsTab.setTabListener(new TabChangeListener(mGroupsFragment,
-                    mGroupDetailFragment));
+                    mGroupDetailFragment, TabState.GROUPS));
             actionBar.addTab(groupsTab);
             actionBar.setDisplayShowTitleEnabled(true);
 
@@ -293,7 +285,7 @@
             boolean showHomeIcon = a.getBoolean(R.styleable.ActionBarHomeIcon_show_home_icon, true);
             actionBar.setDisplayShowHomeEnabled(showHomeIcon);
 
-            invalidateOptionsMenu();
+            invalidateOptionsMenuIfNeeded();
         }
 
         configureFragments(savedState == null);
@@ -312,10 +304,12 @@
          * null for smaller screen sizes).
          */
         private final Fragment mDetailFragment;
+        private final TabState mTabState;
 
-        public TabChangeListener(Fragment listFragment, Fragment detailFragment) {
+        public TabChangeListener(Fragment listFragment, Fragment detailFragment, TabState state) {
             mBrowseListFragment = listFragment;
             mDetailFragment = detailFragment;
+            mTabState = state;
         }
 
         @Override
@@ -332,6 +326,8 @@
             if (mDetailFragment != null) {
                 ft.show(mDetailFragment);
             }
+            setSelectedTab(mTabState);
+            invalidateOptionsMenu();
         }
 
         @Override
@@ -339,6 +335,10 @@
         }
     }
 
+    private void setSelectedTab(TabState tab) {
+        mSelectedTab = tab;
+    }
+
     @Override
     protected void onPause() {
         if (mActionBarAdapter != null) {
@@ -346,7 +346,6 @@
         }
 
         mOptionsMenuContactsAvailable = false;
-        mOptionsMenuGroupActionsEnabled = false;
 
         mProviderStatus = -1;
         mProviderStatusLoader.setProviderStatusListener(null);
@@ -417,7 +416,7 @@
         configureContactListFragment();
         configureGroupListFragment();
 
-        invalidateOptionsMenu();
+        invalidateOptionsMenuIfNeeded();
     }
 
     @Override
@@ -428,7 +427,7 @@
 
         mListFragment.setFilter(mContactListFilterController.getFilter());
 
-        invalidateOptionsMenu();
+        invalidateOptionsMenuIfNeeded();
     }
 
     @Override
@@ -439,7 +438,7 @@
 
         mListFragment.setFilter(mContactListFilterController.getFilter());
 
-        invalidateOptionsMenu();
+        invalidateOptionsMenuIfNeeded();
     }
 
     @Override
@@ -450,10 +449,12 @@
 
     private void setupContactDetailFragment(final Uri contactLookupUri) {
         mContactDetailFragment.loadUri(contactLookupUri);
+        invalidateOptionsMenuIfNeeded();
     }
 
     private void setupGroupDetailFragment(Uri groupUri) {
         mGroupDetailFragment.loadGroup(groupUri);
+        invalidateOptionsMenuIfNeeded();
     }
 
     /**
@@ -463,22 +464,44 @@
     public void onAction(Action action) {
         switch (action) {
             case START_SEARCH_MODE:
-                // Bring the contact list fragment to the front.
+                // Bring the contact list fragment (and detail fragment if applicable) to the front
                 FragmentTransaction ft = getFragmentManager().beginTransaction();
                 ft.show(mContactsFragment);
+                if (mContactDetailFragment != null) ft.show(mContactDetailFragment);
                 ft.commit();
+                clearSearch();
                 break;
             case STOP_SEARCH_MODE:
+                // Refresh the fragments because search mode was using them to display search
+                // results.
+                clearSearch();
+
+                // If the last selected tab was not the "All contacts" tab, then hide these
+                // fragments because we need to show favorites or groups.
+                if (mSelectedTab != null && !mSelectedTab.equals(TabState.CONTACTS)) {
+                    FragmentTransaction transaction = getFragmentManager().beginTransaction();
+                    transaction.hide(mContactsFragment);
+                    if (mContactDetailFragment != null) transaction.hide(mContactDetailFragment);
+                    transaction.commit();
+                }
+                break;
             case CHANGE_SEARCH_QUERY:
-                // Refresh the contact list fragment.
-                configureFragments(false /* from request */);
-                mListFragment.setQueryString(mActionBarAdapter.getQueryString(), true);
+                loadSearch(mActionBarAdapter.getQueryString());
                 break;
             default:
                 throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action);
         }
     }
 
+    private void clearSearch() {
+        loadSearch("");
+    }
+
+    private void loadSearch(String query) {
+        configureFragments(false /* from request */);
+        mListFragment.setQueryString(query, true);
+    }
+
     private void configureContactListFragmentForRequest() {
         Uri contactUri = mRequest.getContactUri();
         if (contactUri != null) {
@@ -564,7 +587,7 @@
             }
         }
 
-        invalidateOptionsMenu();
+        invalidateOptionsMenuIfNeeded();
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
@@ -789,18 +812,12 @@
                 mActionBarAdapter.setSearchView(searchView);
             }
         }
-
-        // TODO: Can remove this as a custom view because the account selector is in the editor now.
-        // Change add contact button to button with a custom view
-        final MenuItem addContact = menu.findItem(R.id.menu_add);
-        addContact.setActionView(mAddContactImageView);
         return true;
     }
 
-    @Override
-    public void invalidateOptionsMenu() {
+    private void invalidateOptionsMenuIfNeeded() {
         if (isOptionsMenuChanged()) {
-            super.invalidateOptionsMenu();
+            invalidateOptionsMenu();
         }
     }
 
@@ -809,10 +826,6 @@
             return true;
         }
 
-        if (mOptionsMenuGroupActionsEnabled != areGroupActionsEnabled()) {
-            return true;
-        }
-
         if (mListFragment != null && mListFragment.isOptionsMenuChanged()) {
             return true;
         }
@@ -821,6 +834,10 @@
             return true;
         }
 
+        if (mGroupDetailFragment != null && mGroupDetailFragment.isOptionsMenuChanged()) {
+            return true;
+        }
+
         return false;
     }
 
@@ -831,39 +848,36 @@
             return false;
         }
 
+        final MenuItem addContactMenu = menu.findItem(R.id.menu_add_contact);
+        final MenuItem addGroupMenu = menu.findItem(R.id.menu_add_group);
+
+        if (mActionBarAdapter.isSearchMode()) {
+            addContactMenu.setVisible(false);
+            addGroupMenu.setVisible(false);
+        } else {
+            switch (mSelectedTab) {
+                case FAVORITES:
+                    // TODO: Fall through until we determine what the menu items should be for
+                    // this tab
+                case CONTACTS:
+                    addContactMenu.setVisible(true);
+                    addGroupMenu.setVisible(false);
+                    break;
+                case GROUPS:
+                    addContactMenu.setVisible(false);
+                    addGroupMenu.setVisible(true);
+                    break;
+            }
+        }
+
         MenuItem settings = menu.findItem(R.id.menu_settings);
         if (settings != null) {
             settings.setVisible(!ContactsPreferenceActivity.isEmpty(this));
         }
 
-        mOptionsMenuGroupActionsEnabled = areGroupActionsEnabled();
-
-        MenuItem renameGroup = menu.findItem(R.id.menu_rename_group);
-        if (renameGroup != null) {
-            renameGroup.setVisible(mOptionsMenuGroupActionsEnabled);
-        }
-
-        MenuItem deleteGroup = menu.findItem(R.id.menu_delete_group);
-        if (deleteGroup != null) {
-            deleteGroup.setVisible(mOptionsMenuGroupActionsEnabled);
-        }
-
         return true;
     }
 
-    private boolean areGroupActionsEnabled() {
-        boolean groupActionsEnabled = false;
-        if (mListFragment != null) {
-            ContactListFilter filter = mListFragment.getFilter();
-            if (filter != null
-                    && filter.filterType == ContactListFilter.FILTER_TYPE_GROUP
-                    && !filter.groupReadOnly) {
-                groupActionsEnabled = true;
-            }
-        }
-        return groupActionsEnabled;
-    }
-
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
@@ -881,11 +895,16 @@
                 onSearchRequested();
                 return true;
             }
-            case R.id.menu_add: {
+            case R.id.menu_add_contact: {
                 final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
                 startActivityForResult(intent, SUBACTIVITY_NEW_CONTACT);
                 return true;
             }
+            case R.id.menu_add_group: {
+                // TODO: Hook up "new group" functionality
+                Toast.makeText(this, "NEW GROUP", Toast.LENGTH_SHORT).show();
+                return true;
+            }
             case R.id.menu_import_export: {
                 ImportExportDialogFragment.show(getFragmentManager());
                 return true;
@@ -899,18 +918,6 @@
                 startActivity(intent);
                 return true;
             }
-            case R.id.menu_rename_group: {
-                ContactListFilter filter = mListFragment.getFilter();
-                GroupRenamingDialogFragment.show(getFragmentManager(), filter.groupId,
-                        filter.title);
-                return true;
-            }
-            case R.id.menu_delete_group: {
-                ContactListFilter filter = mListFragment.getFilter();
-                GroupDeletionDialogFragment.show(getFragmentManager(), filter.groupId,
-                        filter.title);
-                return true;
-            }
         }
         return false;
     }
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index f3a4805..41ac0ad 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -1159,7 +1159,7 @@
 
     @Override
     public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) {
-        inflater.inflate(R.menu.view, menu);
+        inflater.inflate(R.menu.view_contact, menu);
     }
 
     public boolean isOptionsMenuChanged() {
diff --git a/src/com/android/contacts/group/GroupBrowseListAdapter.java b/src/com/android/contacts/group/GroupBrowseListAdapter.java
index b836ab9..f530186 100644
--- a/src/com/android/contacts/group/GroupBrowseListAdapter.java
+++ b/src/com/android/contacts/group/GroupBrowseListAdapter.java
@@ -185,7 +185,7 @@
 
         public static GroupListEntry createEntryForGroup(GroupMetaData groupMetaData) {
             if (groupMetaData == null) {
-                throw new IllegalStateException("Cannot create list entry for a hull group");
+                throw new IllegalStateException("Cannot create list entry for a null group");
             }
             return new GroupListEntry(ViewType.ITEM, null, 0, groupMetaData,
                     groupMetaData.getGroupId());
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index 8cffd05..8d049d5 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -17,23 +17,21 @@
 package com.android.contacts.group;
 
 import com.android.contacts.ContactPhotoManager;
-import com.android.contacts.GroupMetaData;
 import com.android.contacts.GroupMetaDataLoader;
 import com.android.contacts.R;
-import com.android.contacts.activities.GroupDetailActivity;
+import com.android.contacts.interactions.GroupDeletionDialogFragment;
+import com.android.contacts.interactions.GroupRenamingDialogFragment;
 import com.android.contacts.list.ContactListAdapter;
 import com.android.contacts.list.ContactListFilter;
 import com.android.contacts.list.DefaultContactListAdapter;
+import com.android.contacts.util.PhoneCapabilityTester;
 
-import android.accounts.Account;
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.LoaderManager;
 import android.app.LoaderManager.LoaderCallbacks;
-import android.content.ContentValues;
 import android.content.Context;
 import android.content.CursorLoader;
-import android.content.Intent;
 import android.content.Loader;
 import android.database.Cursor;
 import android.net.Uri;
@@ -41,6 +39,9 @@
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Directory;
 import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.AbsListView;
@@ -49,8 +50,7 @@
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.ListView;
 import android.widget.TextView;
-
-import java.util.ArrayList;
+import android.widget.Toast;
 
 /**
  * Displays the details of a group and shows a list of actions possible for the group.
@@ -88,6 +88,9 @@
 
     private Uri mGroupUri;
     private long mGroupId;
+    private String mGroupName;
+
+    private boolean mOptionsMenuEditable;
 
     public GroupDetailFragment() {
     }
@@ -107,6 +110,7 @@
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
+        setHasOptionsMenu(true);
         mRootView = inflater.inflate(R.layout.group_detail_fragment, container, false);
         mGroupTitle = (TextView) mRootView.findViewById(R.id.group_title);
         mGroupSize = (TextView) mRootView.findViewById(R.id.group_size);
@@ -224,7 +228,8 @@
         cursor.moveToPosition(-1);
         if (cursor.moveToNext()) {
             mGroupId = cursor.getLong(GroupMetaDataLoader.GROUP_ID);
-            updateTitle(cursor.getString(GroupMetaDataLoader.TITLE));
+            mGroupName = cursor.getString(GroupMetaDataLoader.TITLE);
+            updateTitle(mGroupName);
         }
     }
 
@@ -257,4 +262,53 @@
             mPhotoManager.resume();
         }
     }
+
+    @Override
+    public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) {
+        inflater.inflate(R.menu.view_group, menu);
+    }
+
+    public boolean isOptionsMenuChanged() {
+        return mOptionsMenuEditable != isGroupEditable();
+    }
+
+    public boolean isGroupEditable() {
+        // TODO: This should check the group_is_read_only flag. Modify GroupMetaDataLoader.
+        // Bug: 4601729.
+        return mGroupUri != null;
+    }
+
+    @Override
+    public void onPrepareOptionsMenu(Menu menu) {
+        mOptionsMenuEditable = isGroupEditable();
+
+        final MenuItem editMenu = menu.findItem(R.id.menu_edit_group);
+        editMenu.setVisible(mOptionsMenuEditable);
+
+        final MenuItem renameMenu = menu.findItem(R.id.menu_rename_group);
+        renameMenu.setVisible(mOptionsMenuEditable);
+
+        final MenuItem deleteMenu = menu.findItem(R.id.menu_delete_group);
+        deleteMenu.setVisible(mOptionsMenuEditable);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.menu_edit_group: {
+                // TODO: Open group editor
+                Toast.makeText(mContext, "EDIT GROUP", Toast.LENGTH_SHORT).show();
+                break;
+            }
+            case R.id.menu_rename_group: {
+                GroupRenamingDialogFragment.show(getFragmentManager(), mGroupId, mGroupName);
+                return true;
+            }
+            case R.id.menu_delete_group: {
+                GroupDeletionDialogFragment.show(getFragmentManager(), mGroupId, mGroupName);
+                return true;
+            }
+        }
+        return false;
+    }
 }