Move add group dialogs to base drawer activity

Bug 29537664

Change-Id: I678a5a7dbcb28eb5860fdb90f43d0b440af684e8
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 7dcd356..4254a64 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -16,12 +16,15 @@
 
 package com.android.contacts;
 
+import android.accounts.Account;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
 import android.content.Intent;
 import android.graphics.Color;
 import android.graphics.PorterDuff;
+import android.net.Uri;
 import android.os.Bundle;
+import android.provider.ContactsContract.Intents;
 import android.support.annotation.LayoutRes;
 import android.support.design.widget.NavigationView;
 import android.support.v4.content.ContextCompat;
@@ -37,18 +40,25 @@
 import android.view.SubMenu;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Toast;
 
+import com.android.contacts.activities.GroupMembersActivity;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.editor.SelectAccountDialogFragment;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactListFilterController;
+import com.android.contacts.common.model.AccountTypeManager;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.preference.ContactsPreferenceActivity;
 import com.android.contacts.common.util.AccountFilterUtil;
+import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.common.util.ViewUtil;
 import com.android.contacts.editor.ContactEditorFragment;
 import com.android.contacts.group.GroupListItem;
 import com.android.contacts.group.GroupMetadata;
+import com.android.contacts.group.GroupNameEditDialogFragment;
 import com.android.contacts.group.GroupUtil;
 import com.android.contacts.group.GroupsFragment;
 import com.android.contacts.group.GroupsFragment.GroupsListener;
@@ -70,12 +80,20 @@
 public abstract class ContactsDrawerActivity extends AppCompatContactsActivity implements
         AccountFiltersListener,
         GroupsListener,
-        NavigationView.OnNavigationItemSelectedListener {
+        NavigationView.OnNavigationItemSelectedListener,
+        SelectAccountDialogFragment.Listener,
+        GroupNameEditDialogFragment.Listener {
 
     protected static String TAG = "ContactsDrawerActivity";
 
-    protected static final String GROUPS_TAG = "groups";
-    protected static final String FILTERS_TAG = "filters";
+    private static final String TAG_GROUPS = "groups";
+    private static final String TAG_FILTERS = "filters";
+    private static final String TAG_SELECT_ACCOUNT_DIALOG = "selectAccountDialog";
+    private static final String TAG_GROUP_NAME_EDIT_DIALOG = "groupNameEditDialog";
+
+    private static final String KEY_NEW_GROUP_ACCOUNT = "newGroupAccount";
+
+    protected static final String ACTION_CREATE_GROUP = "createGroup";
 
     private class ContactsActionBarDrawerToggle extends ActionBarDrawerToggle {
 
@@ -132,6 +150,9 @@
     protected Map<ContactListFilter, MenuItem> mFilterMenuMap = new HashMap<>();
     protected Map<Integer, MenuItem> mIdMenuMap = new HashMap<>();
 
+    // The account the new group will be created under.
+    private AccountWithDataSet mNewGroupAccount;
+
     @Override
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
@@ -182,6 +203,19 @@
             mIdMenuMap.get(R.id.nav_find_duplicates).setCheckable(true);
             mIdMenuMap.get(R.id.nav_find_duplicates).setChecked(true);
         }
+
+        if (savedState != null && savedState.containsKey(KEY_NEW_GROUP_ACCOUNT)) {
+            mNewGroupAccount = AccountWithDataSet.unstringify(
+                    savedState.getString(KEY_NEW_GROUP_ACCOUNT));
+        }
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        if (mNewGroupAccount != null) {
+            outState.putString(KEY_NEW_GROUP_ACCOUNT, mNewGroupAccount.stringify());
+        }
     }
 
     @Override
@@ -200,6 +234,22 @@
         }
     }
 
+    @Override
+    protected void onNewIntent(Intent newIntent) {
+        if (ACTION_CREATE_GROUP.equals(newIntent.getAction())) {
+            final Uri groupUri = newIntent.getData();
+            if (groupUri == null) {
+                Toast.makeText(this, R.string.groupSavedErrorToast, Toast.LENGTH_SHORT).show();
+                return;
+            }
+            if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "Received group URI " + groupUri);
+            Toast.makeText(this, R.string.groupCreatedToast, Toast.LENGTH_SHORT).show();
+            startActivity(GroupUtil.createViewGroupIntent(this, groupUri, /* title */ null));
+        } else {
+            super.onNewIntent(newIntent);
+        }
+    }
+
     /**
      * Returns true if child class is DuplicatesActivity
      */
@@ -227,18 +277,18 @@
 
     protected void addGroupsAndFiltersFragments(FragmentTransaction transaction) {
         final FragmentManager fragmentManager = getFragmentManager();
-        mGroupsFragment = (GroupsFragment) fragmentManager.findFragmentByTag(GROUPS_TAG);
+        mGroupsFragment = (GroupsFragment) fragmentManager.findFragmentByTag(TAG_GROUPS);
         mAccountFiltersFragment = (AccountFiltersFragment)
-                fragmentManager.findFragmentByTag(FILTERS_TAG);
+                fragmentManager.findFragmentByTag(TAG_FILTERS);
 
         if (mGroupsFragment == null && ContactsUtils.areGroupWritableAccountsAvailable(this)) {
             mGroupsFragment = new GroupsFragment();
-            transaction.add(mGroupsFragment, GROUPS_TAG);
+            transaction.add(mGroupsFragment, TAG_GROUPS);
         }
 
         if (mAccountFiltersFragment == null) {
             mAccountFiltersFragment = new AccountFiltersFragment();
-            transaction.add(mAccountFiltersFragment, FILTERS_TAG);
+            transaction.add(mAccountFiltersFragment, TAG_FILTERS);
         }
 
         if (ContactsUtils.areGroupWritableAccountsAvailable(this) && mGroupsFragment != null) {
@@ -335,8 +385,20 @@
         }
     }
 
-    protected void onCreateGroupMenuItemClicked() {
-        startActivity(GroupUtil.createAddGroupIntent(this));
+    private void onCreateGroupMenuItemClicked() {
+        // Select the account to create the group
+        final Bundle extras = getIntent().getExtras();
+        final Account account = extras == null ? null :
+                (Account) extras.getParcelable(Intents.Insert.EXTRA_ACCOUNT);
+        if (account == null) {
+            selectAccount();
+        } else {
+            final String dataSet = extras == null
+                    ? null : extras.getString(Intents.Insert.EXTRA_DATA_SET);
+            final AccountWithDataSet accountWithDataSet = new AccountWithDataSet(
+                    account.name, account.type, dataSet);
+            onAccountChosen(accountWithDataSet, /* extraArgs */ null);
+        }
     }
 
     @Override
@@ -489,4 +551,49 @@
             map.get(pair.getKey()).setChecked(false);
         }
     }
+
+    private void selectAccount() {
+        final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(this)
+                .getAccounts(/* writable */ true);
+        if (accounts.isEmpty()) {
+            // We shouldn't present the add group button if there are no writable accounts
+            // but check it since it's possible we are started with an Intent.
+            Toast.makeText(this, R.string.groupCreateFailedToast, Toast.LENGTH_SHORT).show();
+            return;
+        }
+        // If there is a single writable account, use it w/o showing a dialog.
+        if (accounts.size() == 1) {
+            onAccountChosen(accounts.get(0), /* extraArgs */ null);
+            return;
+        }
+        SelectAccountDialogFragment.show(getFragmentManager(), null,
+                R.string.dialog_new_group_account, AccountListFilter.ACCOUNTS_GROUP_WRITABLE,
+                /* extraArgs */ null, TAG_SELECT_ACCOUNT_DIALOG);
+    }
+
+    @Override
+    public void onAccountChosen(AccountWithDataSet account, Bundle extraArgs) {
+        mNewGroupAccount = account;
+        GroupNameEditDialogFragment.showInsertDialog(
+                getFragmentManager(), TAG_GROUP_NAME_EDIT_DIALOG);
+    }
+
+    @Override
+    public void onAccountSelectorCancelled() {
+    }
+
+    @Override
+    public void onGroupNameEdit(String groupName, boolean isInsert) {
+        if (mNewGroupAccount == null) {
+            Toast.makeText(this, R.string.groupCreateFailedToast, Toast.LENGTH_SHORT).show();
+            return;
+        }
+        startService(ContactSaveService.createNewGroupIntent(this,
+                mNewGroupAccount, groupName, /* rawContactsToAdd */ null, getClass(),
+                ACTION_CREATE_GROUP));
+    }
+
+    @Override
+    public void onGroupNameEditCancelled() {
+    }
 }
diff --git a/src/com/android/contacts/activities/GroupMembersActivity.java b/src/com/android/contacts/activities/GroupMembersActivity.java
index a525460..b75295d 100644
--- a/src/com/android/contacts/activities/GroupMembersActivity.java
+++ b/src/com/android/contacts/activities/GroupMembersActivity.java
@@ -15,7 +15,6 @@
  */
 package com.android.contacts.activities;
 
-import android.accounts.Account;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
 import android.content.Context;
@@ -25,7 +24,6 @@
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.ContactsContract;
-import android.provider.ContactsContract.Intents;
 import android.provider.ContactsContract.RawContacts;
 import android.support.v4.view.GravityCompat;
 import android.support.v7.app.ActionBar;
@@ -37,13 +35,9 @@
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.ContactsDrawerActivity;
 import com.android.contacts.R;
-import com.android.contacts.common.editor.SelectAccountDialogFragment;
 import com.android.contacts.common.logging.ListEvent;
 import com.android.contacts.common.logging.Logger;
 import com.android.contacts.common.logging.ScreenEvent.ScreenType;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.group.GroupMembersFragment;
 import com.android.contacts.group.GroupMetadata;
@@ -55,31 +49,25 @@
 import com.android.contacts.list.UiIntentActions;
 import com.android.contacts.quickcontact.QuickContactActivity;
 
-import java.util.List;
-
 /**
  * Displays the members of a group and allows the user to edit it.
  */
 public class GroupMembersActivity extends ContactsDrawerActivity implements
         ActionBarAdapter.Listener,
         MultiSelectContactsListFragment.OnCheckBoxListActionListener,
-        SelectAccountDialogFragment.Listener,
         GroupMembersFragment.GroupMembersListener,
         GroupNameEditDialogFragment.Listener {
 
     private static final String TAG = "GroupMembers";
 
-    private static final String KEY_IS_INSERT_ACTION = "isInsertAction";
     private static final String KEY_GROUP_URI = "groupUri";
     private static final String KEY_GROUP_METADATA = "groupMetadata";
     private static final String KEY_IS_EDIT_MODE = "editMode";
 
     private static final String TAG_GROUP_MEMBERS = "groupMembers";
-    private static final String TAG_SELECT_ACCOUNT_DIALOG = "selectAccountDialog";
     private static final String TAG_GROUP_NAME_EDIT_DIALOG = "groupNameEditDialog";
 
     private static final String ACTION_DELETE_GROUP = "deleteGroup";
-    private static final String ACTION_CREATE_GROUP = "createGroup";
     private static final String ACTION_UPDATE_GROUP = "updateGroup";
     private static final String ACTION_ADD_TO_GROUP = "addToGroup";
     private static final String ACTION_REMOVE_FROM_GROUP = "removeFromGroup";
@@ -184,7 +172,6 @@
     private GroupMembersFragment mMembersFragment;
 
     private Uri mGroupUri;
-    private boolean mIsInsertAction;
     private boolean mIsEditMode;
 
     private GroupMetadata mGroupMetadata;
@@ -196,14 +183,12 @@
         // Parse the Intent
         if (savedState != null) {
             mGroupUri = savedState.getParcelable(KEY_GROUP_URI);
-            mIsInsertAction = savedState.getBoolean(KEY_IS_INSERT_ACTION);
             mIsEditMode = savedState.getBoolean(KEY_IS_EDIT_MODE);
             mGroupMetadata = savedState.getParcelable(KEY_GROUP_METADATA);
         } else {
             mGroupUri = getIntent().getData();
-            mIsInsertAction = Intent.ACTION_INSERT.equals(getIntent().getAction());
         }
-        if (!mIsInsertAction && mGroupUri == null) {
+        if (mGroupUri == null) {
             setResultCanceledAndFinish(R.string.groupLoadErrorToast);
             return;
         }
@@ -221,42 +206,18 @@
         // be changed to group name when onGroupMetadataLoaded() is called.
         setActionBarTitle(getIntent().getStringExtra(GroupUtil.EXTRA_GROUP_NAME));
 
-        // Decide whether to prompt for the account and group name or start loading existing members
-        if (mIsInsertAction) {
-            // Check if we are in the middle of the insert flow.
-            if (!isSelectAccountDialogFound() && !isGroupNameEditDialogFound()) {
-
-                // Create metadata to hold the account info
-                mGroupMetadata = new GroupMetadata();
-
-                // Select the account to create the group
-                final Bundle extras = getIntent().getExtras();
-                final Account account = extras == null ? null :
-                        (Account) extras.getParcelable(Intents.Insert.EXTRA_ACCOUNT);
-                if (account == null) {
-                    selectAccount();
-                } else {
-                    final String dataSet = extras == null
-                            ? null : extras.getString(Intents.Insert.EXTRA_DATA_SET);
-                    final AccountWithDataSet accountWithDataSet = new AccountWithDataSet(
-                            account.name, account.type, dataSet);
-                    onAccountChosen(accountWithDataSet, /* extraArgs */ null);
-                }
-            }
-        } else {
-            final FragmentManager fragmentManager = getFragmentManager();
-            // Add the members list fragment
-            mMembersFragment = (GroupMembersFragment)
-                    fragmentManager.findFragmentByTag(TAG_GROUP_MEMBERS);
-            if (mMembersFragment == null) {
-                mMembersFragment = GroupMembersFragment.newInstance(getIntent().getData());
-                fragmentManager.beginTransaction().replace(R.id.fragment_container_inner,
-                        mMembersFragment, TAG_GROUP_MEMBERS).commitAllowingStateLoss();
-            }
-            mMembersFragment.setListener(this);
-            if (mGroupMetadata != null && mGroupMetadata.editable) {
-                mMembersFragment.setCheckBoxListListener(this);
-            }
+        // Add the members list fragment
+        final FragmentManager fragmentManager = getFragmentManager();
+        mMembersFragment = (GroupMembersFragment)
+                fragmentManager.findFragmentByTag(TAG_GROUP_MEMBERS);
+        if (mMembersFragment == null) {
+            mMembersFragment = GroupMembersFragment.newInstance(getIntent().getData());
+            fragmentManager.beginTransaction().replace(R.id.fragment_container_inner,
+                    mMembersFragment, TAG_GROUP_MEMBERS).commitAllowingStateLoss();
+        }
+        mMembersFragment.setListener(this);
+        if (mGroupMetadata != null && mGroupMetadata.editable) {
+            mMembersFragment.setCheckBoxListListener(this);
         }
 
         // Delay action bar initialization until after the fragment is added
@@ -272,33 +233,17 @@
             mActionBarAdapter.onSaveInstanceState(outState);
         }
         outState.putParcelable(KEY_GROUP_URI, mGroupUri);
-        outState.putBoolean(KEY_IS_INSERT_ACTION, mIsInsertAction);
         outState.putBoolean(KEY_IS_EDIT_MODE, mIsEditMode);
         outState.putParcelable(KEY_GROUP_METADATA, mGroupMetadata);
     }
 
-    private void selectAccount() {
-        final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(this)
-                .getAccounts(/* writable */ true);
-        if (accounts.isEmpty()) {
-            setResultCanceledAndFinish();
-            return;
-        }
-        // If there is a single writable account, use it w/o showing a dialog.
-        if (accounts.size() == 1) {
-            onAccountChosen(accounts.get(0), /* extraArgs */ null);
-            return;
-        }
-        SelectAccountDialogFragment.show(getFragmentManager(), null,
-                R.string.dialog_new_group_account, AccountListFilter.ACCOUNTS_GROUP_WRITABLE,
-                /* extraArgs */ null, TAG_SELECT_ACCOUNT_DIALOG);
-    }
-
     // Invoked with results from the ContactSaveService
     @Override
     protected void onNewIntent(Intent newIntent) {
-        super.onNewIntent(newIntent);
-
+        if (ContactsDrawerActivity.ACTION_CREATE_GROUP.equals(newIntent.getAction())) {
+            super.onNewIntent(newIntent);
+            return;
+        }
         if (isDeleteAction(newIntent.getAction())) {
             toast(R.string.groupDeletedToast);
             setResult(RESULT_OK);
@@ -312,7 +257,6 @@
             if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "Received group URI " + groupUri);
 
             mGroupUri = groupUri;
-            mIsInsertAction = false;
 
             toast(getToastMessageForSaveAction(newIntent.getAction()));
 
@@ -330,14 +274,12 @@
     }
 
     private static boolean isSaveAction(String action) {
-        return ACTION_CREATE_GROUP.equals(action)
-                || ACTION_UPDATE_GROUP.equals(action)
+        return ACTION_UPDATE_GROUP.equals(action)
                 || ACTION_ADD_TO_GROUP.equals(action)
                 || ACTION_REMOVE_FROM_GROUP.equals(action);
     }
 
     private static int getToastMessageForSaveAction(String action) {
-        if (ACTION_CREATE_GROUP.equals(action)) return R.string.groupCreatedToast;
         if (ACTION_UPDATE_GROUP.equals(action)) return R.string.groupUpdatedToast;
         if (ACTION_ADD_TO_GROUP.equals(action)) return R.string.groupMembersAddedToast;
         if (ACTION_REMOVE_FROM_GROUP.equals(action)) return R.string.groupMembersRemovedToast;
@@ -497,8 +439,6 @@
         }
         if (mDrawer.isDrawerOpen(GravityCompat.START)) {
             mDrawer.closeDrawer(GravityCompat.START);
-        } else if (mIsInsertAction) {
-            finish();
         } else if (mIsEditMode) {
             mIsEditMode = false;
             mActionBarAdapter.setSelectionMode(false);
@@ -537,18 +477,6 @@
         }
     }
 
-    private boolean isSelectAccountDialogFound() {
-        return getFragmentManager().findFragmentByTag(TAG_SELECT_ACCOUNT_DIALOG) != null;
-    }
-
-    private boolean isGroupNameEditDialogFound() {
-        return getFragmentManager().findFragmentByTag(TAG_GROUP_NAME_EDIT_DIALOG) != null;
-    }
-
-    private void setResultCanceledAndFinish() {
-        setResultCanceledAndFinish(-1);
-    }
-
     private void setResultCanceledAndFinish(int resId) {
         toast(resId);
         setResult(RESULT_CANCELED);
@@ -561,20 +489,6 @@
         }
     }
 
-    // SelectAccountDialogFragment.Listener callbacks
-
-    @Override
-    public void onAccountChosen(AccountWithDataSet account, Bundle extraArgs) {
-        mGroupMetadata.setGroupAccountMetadata(account);
-        GroupNameEditDialogFragment.showInsertDialog(
-                getFragmentManager(), TAG_GROUP_NAME_EDIT_DIALOG);
-    }
-
-    @Override
-    public void onAccountSelectorCancelled() {
-        setResultCanceledAndFinish();
-    }
-
     // ActionBarAdapter callbacks
 
     @Override
@@ -642,26 +556,18 @@
     // GroupNameEditDialogFragment.Listener callbacks
 
     @Override
-    public void onGroupNameEdit(String groupName) {
-        final Intent saveIntent;
-        if (mIsInsertAction) {
-            saveIntent = ContactSaveService.createNewGroupIntent(this,
-                    mGroupMetadata.createAccountWithDataSet(), groupName,
-                    /* rawContactsToAdd */ null, GroupMembersActivity.class,
-                    ACTION_CREATE_GROUP);
-        } else {
-            saveIntent = ContactSaveService.createGroupRenameIntent(this,
-                    mGroupMetadata.groupId, groupName, GroupMembersActivity.class,
-                    ACTION_UPDATE_GROUP);
+    public void onGroupNameEdit(String groupName, boolean isInsert) {
+        if (isInsert) {
+            super.onGroupNameEdit(groupName, isInsert);
+            return;
         }
-        startService(saveIntent);
+        startService(ContactSaveService.createGroupRenameIntent(this,
+                mGroupMetadata.groupId, groupName, GroupMembersActivity.class,
+                ACTION_UPDATE_GROUP));
     }
 
     @Override
     public void onGroupNameEditCancelled() {
-        if (mIsInsertAction) {
-            setResultCanceledAndFinish();
-        }
     }
 
     // GroupMembersFragment callbacks
@@ -669,12 +575,8 @@
     @Override
     public void onGroupMetadataLoaded(GroupMetadata groupMetadata) {
         mGroupMetadata = groupMetadata;
-
         updateGroupMenu(mGroupMetadata);
-
-        if (!mIsInsertAction) {
-            setActionBarTitle(mGroupMetadata.groupName);
-        }
+        setActionBarTitle(mGroupMetadata.groupName);
         invalidateOptionsMenu();
     }
 
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 681c8bf..bde88f3 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -237,6 +237,11 @@
 
     @Override
     protected void onNewIntent(Intent intent) {
+        if (ContactsDrawerActivity.ACTION_CREATE_GROUP.equals(intent.getAction())) {
+            super.onNewIntent(intent);
+            return;
+        }
+
         setIntent(intent);
         if (!processIntent(true)) {
             finish();
diff --git a/src/com/android/contacts/group/GroupMetadata.java b/src/com/android/contacts/group/GroupMetadata.java
index 712500a..f3dfec24 100644
--- a/src/com/android/contacts/group/GroupMetadata.java
+++ b/src/com/android/contacts/group/GroupMetadata.java
@@ -85,16 +85,6 @@
                 && groupId > 0;
     }
 
-    public AccountWithDataSet createAccountWithDataSet() {
-        return new AccountWithDataSet(accountName, accountType, dataSet);
-    }
-
-    public void setGroupAccountMetadata(AccountWithDataSet account) {
-        accountName = account.name;
-        accountType = account.type;
-        dataSet = account.dataSet;
-    }
-
     @Override
     public int describeContents() {
         return 0;
diff --git a/src/com/android/contacts/group/GroupNameEditDialogFragment.java b/src/com/android/contacts/group/GroupNameEditDialogFragment.java
index f5cfa14..d3c518e 100644
--- a/src/com/android/contacts/group/GroupNameEditDialogFragment.java
+++ b/src/com/android/contacts/group/GroupNameEditDialogFragment.java
@@ -46,7 +46,7 @@
 
     /** Callbacks for hosts of the {@link GroupNameEditDialogFragment}. */
     public interface Listener {
-        void onGroupNameEdit(String groupName);
+        void onGroupNameEdit(String groupName, boolean isInsert);
         void onGroupNameEditCancelled();
     }
 
@@ -105,7 +105,7 @@
                 .setPositiveButton(android.R.string.ok, new OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
-                        getListener().onGroupNameEdit(getGroupName());
+                        getListener().onGroupNameEdit(getGroupName(), mIsInsert);
                     }
                 });
 
diff --git a/src/com/android/contacts/group/GroupUtil.java b/src/com/android/contacts/group/GroupUtil.java
index ca64411..f0f5c09 100644
--- a/src/com/android/contacts/group/GroupUtil.java
+++ b/src/com/android/contacts/group/GroupUtil.java
@@ -114,20 +114,19 @@
         }
     }
 
-    /** Returns an Intent to create a new group. */
-    public static Intent createAddGroupIntent(Context context) {
+    /** Returns an Intent to view the details of the group identified by the given URI. */
+    public static Intent createViewGroupIntent(Context context, Uri groupUri, String title) {
         final Intent intent = new Intent(context, GroupMembersActivity.class);
-        intent.setAction(Intent.ACTION_INSERT);
+        intent.setAction(Intent.ACTION_VIEW);
+        intent.setData(groupUri);
+        intent.putExtra(EXTRA_GROUP_NAME, title);
         return intent;
     }
 
     /** Returns an Intent to view the details of the group identified by the given ID. */
     public static Intent createViewGroupIntent(Context context, long groupId, String title) {
-        final Intent intent = new Intent(context, GroupMembersActivity.class);
-        intent.setAction(Intent.ACTION_VIEW);
-        intent.setData(ContentUris.withAppendedId(Groups.CONTENT_URI, groupId));
-        intent.putExtra(EXTRA_GROUP_NAME, title);
-        return intent;
+        return createViewGroupIntent(context,
+                ContentUris.withAppendedId(Groups.CONTENT_URI, groupId), title);
     }
 
     /**