Loading res/values/strings.xml +5 −2 Original line number Diff line number Diff line Loading @@ -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> Loading src/com/android/contacts/ContactsDrawerActivity.java +116 −9 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 { Loading Loading @@ -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); Loading Loading @@ -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 Loading @@ -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 */ Loading Loading @@ -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) { Loading Loading @@ -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 Loading Loading @@ -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() { } } src/com/android/contacts/activities/GroupMembersActivity.java +26 −124 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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"; Loading Loading @@ -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; Loading @@ -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; } Loading @@ -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) { Loading @@ -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(); Loading @@ -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); Loading @@ -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())); Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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); Loading @@ -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 Loading Loading @@ -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 Loading @@ -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(); } Loading src/com/android/contacts/activities/PeopleActivity.java +5 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading src/com/android/contacts/group/GroupMetadata.java +0 −10 Original line number Diff line number Diff line Loading @@ -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 Loading
res/values/strings.xml +5 −2 Original line number Diff line number Diff line Loading @@ -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> Loading
src/com/android/contacts/ContactsDrawerActivity.java +116 −9 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 { Loading Loading @@ -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); Loading Loading @@ -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 Loading @@ -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 */ Loading Loading @@ -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) { Loading Loading @@ -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 Loading Loading @@ -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() { } }
src/com/android/contacts/activities/GroupMembersActivity.java +26 −124 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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"; Loading Loading @@ -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; Loading @@ -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; } Loading @@ -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) { Loading @@ -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(); Loading @@ -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); Loading @@ -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())); Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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); Loading @@ -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 Loading Loading @@ -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 Loading @@ -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(); } Loading
src/com/android/contacts/activities/PeopleActivity.java +5 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading
src/com/android/contacts/group/GroupMetadata.java +0 −10 Original line number Diff line number Diff line Loading @@ -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