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() {
+    }
 }