Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 13710d5d authored by Walter Jang's avatar Walter Jang
Browse files

Move add group dialogs to base drawer activity

Bug 29537664

Change-Id: I678a5a7dbcb28eb5860fdb90f43d0b440af684e8
parent 6051dcfd
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -324,12 +324,15 @@
    <!-- Toast displayed when a label is saved [CHAR LIMIT=30] -->
    <string name="groupSavedToast">Label saved</string>

    <!-- Toast displayed when a label name is delted. [CHAR LIMIT=50] -->
    <!-- Toast displayed when a label name is deleted. [CHAR LIMIT=50] -->
    <string name="groupDeletedToast">Label deleted</string>

    <!-- Toast displayed when a label name is updated. [CHAR LIMIT=50] -->
    <!-- Toast displayed when a new label name is created. [CHAR LIMIT=50] -->
    <string name="groupCreatedToast">Label created</string>

    <!-- Toast displayed when a new label name cannot be created. [CHAR LIMIT=50] -->
    <string name="groupCreateFailedToast">Can\'t create label</string>

    <!-- Toast displayed when a new label is created. [CHAR LIMIT=50] -->
    <string name="groupUpdatedToast">Label updated</string>

+116 −9
Original line number Diff line number Diff line
@@ -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.MenuItem;
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 @@ import java.util.Map.Entry;
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 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
    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 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
            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 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
        }
    }

    @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 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i

    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 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
        }
    }

    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 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
            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() {
    }
}
+26 −124
Original line number Diff line number Diff line
@@ -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.net.Uri;
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 android.widget.Toast;
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.MultiSelectContactsListFragment;
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 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
    private GroupMembersFragment mMembersFragment;

    private Uri mGroupUri;
    private boolean mIsInsertAction;
    private boolean mIsEditMode;

    private GroupMetadata mGroupMetadata;
@@ -196,14 +183,12 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
        // 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,31 +206,8 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
        // 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
        final FragmentManager fragmentManager = getFragmentManager();
        mMembersFragment = (GroupMembersFragment)
                fragmentManager.findFragmentByTag(TAG_GROUP_MEMBERS);
        if (mMembersFragment == null) {
@@ -257,7 +219,6 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
        if (mGroupMetadata != null && mGroupMetadata.editable) {
            mMembersFragment.setCheckBoxListListener(this);
        }
        }

        // Delay action bar initialization until after the fragment is added
        final ContactsRequest contactsRequest = new ContactsRequest();
@@ -272,33 +233,17 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
            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) {
        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 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
            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 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
    }

    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 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
        }
        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 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
        }
    }

    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 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
        }
    }

    // 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 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
    // 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 @@ public class GroupMembersActivity extends ContactsDrawerActivity implements
    @Override
    public void onGroupMetadataLoaded(GroupMetadata groupMetadata) {
        mGroupMetadata = groupMetadata;

        updateGroupMenu(mGroupMetadata);

        if (!mIsInsertAction) {
        setActionBarTitle(mGroupMetadata.groupName);
        }
        invalidateOptionsMenu();
    }

+5 −0
Original line number Diff line number Diff line
@@ -237,6 +237,11 @@ public class PeopleActivity extends ContactsDrawerActivity implements

    @Override
    protected void onNewIntent(Intent intent) {
        if (ContactsDrawerActivity.ACTION_CREATE_GROUP.equals(intent.getAction())) {
            super.onNewIntent(intent);
            return;
        }

        setIntent(intent);
        if (!processIntent(true)) {
            finish();
+0 −10
Original line number Diff line number Diff line
@@ -85,16 +85,6 @@ public final class GroupMetadata implements Parcelable {
                && 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;
Loading