1e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov/* 2e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project 3e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * 4e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * you may not use this file except in compliance with the License. 6e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * You may obtain a copy of the License at 7e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * 8e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * 10e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * See the License for the specific language governing permissions and 14e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * limitations under the License. 15e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov */ 16e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 1718ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovpackage com.android.contacts.editor; 18e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 191ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikovimport android.app.Activity; 20e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.content.Context; 21fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuanimport android.content.res.Resources; 22e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.database.Cursor; 23e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 2493a0025b87079e0d36431a2c096f96e145053a28Makoto Onukiimport android.text.TextUtils; 25e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.util.AttributeSet; 26e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.view.View; 27e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.view.View.OnClickListener; 28b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chuimport android.view.ViewGroup; 29e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.widget.AdapterView; 30e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.widget.AdapterView.OnItemClickListener; 31e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.widget.ArrayAdapter; 32b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chuimport android.widget.CheckedTextView; 33043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwellimport android.widget.ImageView; 34e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.widget.LinearLayout; 35e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.widget.ListPopupWindow; 36e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.widget.ListView; 37e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.widget.TextView; 38e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 39e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.GroupMetaDataLoader; 40e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R; 41ba09d4cc21d55181c1760e7994f0225939f4999dChiao Chengimport com.android.contacts.common.model.dataitem.DataKind; 42e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.interactions.GroupCreationDialogFragment; 43e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.interactions.GroupCreationDialogFragment.OnGroupCreatedListener; 44cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.model.RawContactDelta; 45738ff8623dc77dd91a1b9023861e924ba5e4c27eChiao Chengimport com.android.contacts.common.model.ValuesDelta; 46cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.model.RawContactModifier; 47619ac169e45bf547a2cbcd8a9775bb234f45c00fChiao Chengimport com.android.contacts.util.UiClosables; 48ba09d4cc21d55181c1760e7994f0225939f4999dChiao Chengimport com.google.common.base.Objects; 49e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 50e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport java.util.ArrayList; 51e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 52e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov/** 53e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * An editor for group membership. Displays the current group membership list and 54e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov * brings up a dialog to change it. 55e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov */ 56e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovpublic class GroupMembershipView extends LinearLayout 57e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov implements OnClickListener, OnItemClickListener { 58e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 591ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov private static final int CREATE_NEW_GROUP_GROUP_ID = 133; 601ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov 61e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public static final class GroupSelectionItem { 62e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private final long mGroupId; 63e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private final String mTitle; 64e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private boolean mChecked; 65e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 66e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public GroupSelectionItem(long groupId, String title, boolean checked) { 67e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov this.mGroupId = groupId; 68e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov this.mTitle = title; 69e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mChecked = checked; 70e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 71e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 72e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public long getGroupId() { 73e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov return mGroupId; 74e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 75e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 76e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public boolean isChecked() { 77e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov return mChecked; 78e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 79e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 80e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public void setChecked(boolean checked) { 81e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mChecked = checked; 82e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 83e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 84e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov @Override 85e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public String toString() { 86e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov return mTitle; 87e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 88e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 89e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 90b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu /** 91b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu * Extends the array adapter to show checkmarks on all but the last list item for 92b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu * the group membership popup. Note that this is highly specific to the fact that the 93b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu * group_membership_list_item.xml is a CheckedTextView object. 94b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu */ 95b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu private class GroupMembershipAdapter<T> extends ArrayAdapter<T> { 96b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu 97b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu public GroupMembershipAdapter(Context context, int textViewResourceId) { 98b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu super(context, textViewResourceId); 99b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 100b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu 101b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu public boolean getItemIsCheckable(int position) { 102b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu // Item is checkable if it is NOT the last one in the list 103b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu return position != getCount()-1; 104b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 105b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu 106b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu @Override 107b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu public int getItemViewType(int position) { 108b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu return getItemIsCheckable(position) ? 0 : 1; 109b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 110b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu 111b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu @Override 112b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu public int getViewTypeCount() { 113b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu return 2; 114b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 115b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu 116b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu @Override 117b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu public View getView(int position, View convertView, ViewGroup parent) { 118b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu final View itemView = super.getView(position, convertView, parent); 119d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell if (itemView == null) { 120d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell return null; 121d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell } 122b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu 123b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu // Hide the checkable drawable. This assumes that the item views 124b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu // are CheckedTextView objects 125b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu final CheckedTextView checkedTextView = (CheckedTextView)itemView; 126b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu if (!getItemIsCheckable(position)) { 127b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu checkedTextView.setCheckMarkDrawable(null); 128b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 129d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell checkedTextView.setTextColor(mPrimaryTextColor); 130b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu 131b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu return checkedTextView; 132b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 133b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 134b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu 135851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu private RawContactDelta mState; 136e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private Cursor mGroupMetaData; 137e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private String mAccountName; 138e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private String mAccountType; 1392b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro private String mDataSet; 140e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private TextView mGroupList; 141b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu private GroupMembershipAdapter<GroupSelectionItem> mAdapter; 142025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov private long mDefaultGroupId; 143e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private long mFavoritesGroupId; 144e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private ListPopupWindow mPopup; 145e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private DataKind mKind; 146ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov private boolean mDefaultGroupVisibilityKnown; 147ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov private boolean mDefaultGroupVisible; 148b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu private boolean mCreatedNewGroup; 149e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 150fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan private String mNoGroupString; 151fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan private int mPrimaryTextColor; 152d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell private int mHintTextColor; 153fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan 154e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public GroupMembershipView(Context context) { 155e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov super(context); 156e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 157e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 158e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public GroupMembershipView(Context context, AttributeSet attrs) { 159e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov super(context, attrs); 160e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 161e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 16202bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov @Override 163fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan protected void onFinishInflate() { 164fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan super.onFinishInflate(); 165f140227beb6d9e78955a7676dc0dd3f793f72017Brian Attwell Resources resources = getContext().getResources(); 166fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mPrimaryTextColor = resources.getColor(R.color.primary_text_color); 167d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell mHintTextColor = resources.getColor(R.color.editor_disabled_text_color); 168f140227beb6d9e78955a7676dc0dd3f793f72017Brian Attwell mNoGroupString = getContext().getString(R.string.group_edit_field_hint_text); 169fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan } 170fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan 171fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan @Override 17202bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov public void setEnabled(boolean enabled) { 17302bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov super.setEnabled(enabled); 17402bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov if (mGroupList != null) { 17502bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov mGroupList.setEnabled(enabled); 17602bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov } 17702bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov } 17802bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov 179e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public void setKind(DataKind kind) { 180e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mKind = kind; 181043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell final ImageView imageView = (ImageView) findViewById(R.id.kind_icon); 182043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell imageView.setContentDescription(getResources().getString(kind.titleRes)); 183e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 184e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 185e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public void setGroupMetaData(Cursor groupMetaData) { 186e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov this.mGroupMetaData = groupMetaData; 187e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov updateView(); 188b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu // Open up the list of groups if a new group was just created. 189b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu if (mCreatedNewGroup) { 190b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu mCreatedNewGroup = false; 191b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu onClick(this); // This causes the popup to open. 192b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu if (mPopup != null) { 193b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu // Ensure that the newly created group is checked. 194b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu int position = mAdapter.getCount() - 2; 195b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu ListView listView = mPopup.getListView(); 1969813b71d3a6a2e0baba96cda72ee55415e523166Jay Shrauner if (listView != null && !listView.isItemChecked(position)) { 197b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu // Newly created group is not checked, so check it. 198b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu listView.setItemChecked(position, true); 199b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu onItemClick(listView, null, position, listView.getItemIdAtPosition(position)); 200b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 201b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 202b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 203e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 204e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 205851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu public void setState(RawContactDelta state) { 206e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mState = state; 207851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu mAccountType = mState.getAccountType(); 208851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu mAccountName = mState.getAccountName(); 209851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu mDataSet = mState.getDataSet(); 210ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov mDefaultGroupVisibilityKnown = false; 211b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu mCreatedNewGroup = false; 212e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov updateView(); 213e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 214e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 215e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private void updateView() { 21608d233405a0418073254356a772c9954998e1707Dmitri Plotnikov if (mGroupMetaData == null || mGroupMetaData.isClosed() || mAccountType == null 21708d233405a0418073254356a772c9954998e1707Dmitri Plotnikov || mAccountName == null) { 218e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov setVisibility(GONE); 219e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov return; 220e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 221e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 222e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov boolean accountHasGroups = false; 223025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov mFavoritesGroupId = 0; 224025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov mDefaultGroupId = 0; 225025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov 226e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov StringBuilder sb = new StringBuilder(); 227e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mGroupMetaData.moveToPosition(-1); 228e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov while (mGroupMetaData.moveToNext()) { 229e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov String accountName = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_NAME); 230e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov String accountType = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_TYPE); 2312b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro String dataSet = mGroupMetaData.getString(GroupMetaDataLoader.DATA_SET); 2322b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro if (accountName.equals(mAccountName) && accountType.equals(mAccountType) 2332b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro && Objects.equal(dataSet, mDataSet)) { 234e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov long groupId = mGroupMetaData.getLong(GroupMetaDataLoader.GROUP_ID); 235e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov if (!mGroupMetaData.isNull(GroupMetaDataLoader.FAVORITES) 236e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov && mGroupMetaData.getInt(GroupMetaDataLoader.FAVORITES) != 0) { 237e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mFavoritesGroupId = groupId; 238025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov } else if (!mGroupMetaData.isNull(GroupMetaDataLoader.AUTO_ADD) 239025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov && mGroupMetaData.getInt(GroupMetaDataLoader.AUTO_ADD) != 0) { 240025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov mDefaultGroupId = groupId; 241e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } else { 242e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov accountHasGroups = true; 243e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 244e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 245e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov // Exclude favorites from the list - they are handled with special UI (star) 2465d11ccd7894b8c53a6867f7aba0dbbad3fc00c90Dmitri Plotnikov // Also exclude the default group. 2475d11ccd7894b8c53a6867f7aba0dbbad3fc00c90Dmitri Plotnikov if (groupId != mFavoritesGroupId && groupId != mDefaultGroupId 2485d11ccd7894b8c53a6867f7aba0dbbad3fc00c90Dmitri Plotnikov && hasMembership(groupId)) { 249e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov String title = mGroupMetaData.getString(GroupMetaDataLoader.TITLE); 25093a0025b87079e0d36431a2c096f96e145053a28Makoto Onuki if (!TextUtils.isEmpty(title)) { 25193a0025b87079e0d36431a2c096f96e145053a28Makoto Onuki if (sb.length() != 0) { 25293a0025b87079e0d36431a2c096f96e145053a28Makoto Onuki sb.append(", "); 25393a0025b87079e0d36431a2c096f96e145053a28Makoto Onuki } 25493a0025b87079e0d36431a2c096f96e145053a28Makoto Onuki sb.append(title); 255e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 256e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 257e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 258e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 259e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 260e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov if (!accountHasGroups) { 261e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov setVisibility(GONE); 262e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov return; 263e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 264e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 265e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov if (mGroupList == null) { 266e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mGroupList = (TextView) findViewById(R.id.group_list); 26782b49b8eb8a806393fc59833fab96f924e74e9d4Daniel Lehmann mGroupList.setOnClickListener(this); 268e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 269e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 27002bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov mGroupList.setEnabled(isEnabled()); 271135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov if (sb.length() == 0) { 272fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mGroupList.setText(mNoGroupString); 273d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell mGroupList.setTextColor(mHintTextColor); 274135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov } else { 275135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov mGroupList.setText(sb); 276fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mGroupList.setTextColor(mPrimaryTextColor); 277135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov } 278e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov setVisibility(VISIBLE); 279ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov 280ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov if (!mDefaultGroupVisibilityKnown) { 281ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov // Only show the default group (My Contacts) if the contact is NOT in it 282ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov mDefaultGroupVisible = mDefaultGroupId != 0 && !hasMembership(mDefaultGroupId); 283ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov mDefaultGroupVisibilityKnown = true; 284ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov } 285e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 286e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 287e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov @Override 288e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public void onClick(View v) { 289619ac169e45bf547a2cbcd8a9775bb234f45c00fChiao Cheng if (UiClosables.closeQuietly(mPopup)) { 2909813b71d3a6a2e0baba96cda72ee55415e523166Jay Shrauner mPopup = null; 291e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov return; 292e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 293e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 294b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu mAdapter = new GroupMembershipAdapter<GroupSelectionItem>( 2952b95e624bc35851987fb621091f20263d635d31aDmitri Plotnikov getContext(), R.layout.group_membership_list_item); 296e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 297e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mGroupMetaData.moveToPosition(-1); 298e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov while (mGroupMetaData.moveToNext()) { 299e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov String accountName = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_NAME); 300e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov String accountType = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_TYPE); 3012b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro String dataSet = mGroupMetaData.getString(GroupMetaDataLoader.DATA_SET); 3022b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro if (accountName.equals(mAccountName) && accountType.equals(mAccountType) 3032b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro && Objects.equal(dataSet, mDataSet)) { 304e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov long groupId = mGroupMetaData.getLong(GroupMetaDataLoader.GROUP_ID); 305ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov if (groupId != mFavoritesGroupId 306ad9659e62604309b0d95b0a1f9b19fd6a33990e9Dmitri Plotnikov && (groupId != mDefaultGroupId || mDefaultGroupVisible)) { 307e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov String title = mGroupMetaData.getString(GroupMetaDataLoader.TITLE); 308e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov boolean checked = hasMembership(groupId); 309e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mAdapter.add(new GroupSelectionItem(groupId, title, checked)); 310e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 311e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 312e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 313e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 3141ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov mAdapter.add(new GroupSelectionItem(CREATE_NEW_GROUP_GROUP_ID, 3151ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov getContext().getString(R.string.create_group_item_label), false)); 3161ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov 317b93d626ebf95f3381184bf8a560630bcdedce9b9Dmitri Plotnikov mPopup = new ListPopupWindow(getContext(), null); 318e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mPopup.setAnchorView(mGroupList); 319e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mPopup.setAdapter(mAdapter); 3205d11ccd7894b8c53a6867f7aba0dbbad3fc00c90Dmitri Plotnikov mPopup.setModal(true); 3216d172800844a3f23a918a099c90c10701159bf77Daniel Lehmann mPopup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED); 322e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mPopup.show(); 323e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 324e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov ListView listView = mPopup.getListView(); 325e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 326d85b98628ad7434d51b4bbf7c92b41917fd234e7Katherine Kuan listView.setOverScrollMode(OVER_SCROLL_ALWAYS); 327e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov int count = mAdapter.getCount(); 328e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov for (int i = 0; i < count; i++) { 329e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov listView.setItemChecked(i, mAdapter.getItem(i).isChecked()); 330e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 331e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 332e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov listView.setOnItemClickListener(this); 333e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 334e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 335e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov @Override 336e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov protected void onDetachedFromWindow() { 337e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov super.onDetachedFromWindow(); 338619ac169e45bf547a2cbcd8a9775bb234f45c00fChiao Cheng UiClosables.closeQuietly(mPopup); 339619ac169e45bf547a2cbcd8a9775bb234f45c00fChiao Cheng mPopup = null; 340e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 341e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 342e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov @Override 343e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 344e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov ListView list = (ListView) parent; 345e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov int count = mAdapter.getCount(); 3461ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov 3471ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov if (list.isItemChecked(count - 1)) { 3481ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov list.setItemChecked(count - 1, false); 3491ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov createNewGroup(); 3501ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov return; 3511ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov } 3521ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov 353e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov for (int i = 0; i < count; i++) { 354e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mAdapter.getItem(i).setChecked(list.isItemChecked(i)); 355e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 356e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 357e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov // First remove the memberships that have been unchecked 358e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov ArrayList<ValuesDelta> entries = mState.getMimeEntries(GroupMembership.CONTENT_ITEM_TYPE); 359e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov if (entries != null) { 360e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov for (ValuesDelta entry : entries) { 361025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov if (!entry.isDelete()) { 362851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu Long groupId = entry.getGroupRowId(); 363025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov if (groupId != null && groupId != mFavoritesGroupId 364a61e0fbb6e057f9c3b8bcf4b68ae1df41d90f3baDmitri Plotnikov && (groupId != mDefaultGroupId || mDefaultGroupVisible) 365025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov && !isGroupChecked(groupId)) { 366025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov entry.markDeleted(); 367025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov } 368e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 369e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 370e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 371e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 372e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov // Now add the newly selected items 373e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov for (int i = 0; i < count; i++) { 374e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov GroupSelectionItem item = mAdapter.getItem(i); 375e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov long groupId = item.getGroupId(); 376e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov if (item.isChecked() && !hasMembership(groupId)) { 377851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu ValuesDelta entry = RawContactModifier.insertChild(mState, mKind); 378f54c9f2c84a88e046e29123fa65b19040e5a457bJay Shrauner if (entry != null) { 379f54c9f2c84a88e046e29123fa65b19040e5a457bJay Shrauner entry.setGroupRowId(groupId); 380f54c9f2c84a88e046e29123fa65b19040e5a457bJay Shrauner } 381e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 382e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 383e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 384e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov updateView(); 385e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 386e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 387e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private boolean isGroupChecked(long groupId) { 388e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov int count = mAdapter.getCount(); 389e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov for (int i = 0; i < count; i++) { 390e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov GroupSelectionItem item = mAdapter.getItem(i); 391e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov if (groupId == item.getGroupId()) { 392e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov return item.isChecked(); 393e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 394e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 395e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov return false; 396e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 397e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 398e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private boolean hasMembership(long groupId) { 399025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov if (groupId == mDefaultGroupId && mState.isContactInsert()) { 400025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov return true; 401025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov } 402025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov 403e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov ArrayList<ValuesDelta> entries = mState.getMimeEntries(GroupMembership.CONTENT_ITEM_TYPE); 404e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov if (entries != null) { 405e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov for (ValuesDelta values : entries) { 406025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov if (!values.isDelete()) { 407851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu Long id = values.getGroupRowId(); 408025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov if (id != null && id == groupId) { 409025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov return true; 410025838f0a4b7c19640035a89d42512b892c503baDmitri Plotnikov } 411e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 412e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 413e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 414e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov return false; 415e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 4161ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov 4171ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov private void createNewGroup() { 418619ac169e45bf547a2cbcd8a9775bb234f45c00fChiao Cheng UiClosables.closeQuietly(mPopup); 419619ac169e45bf547a2cbcd8a9775bb234f45c00fChiao Cheng mPopup = null; 4201ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov 4211ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov GroupCreationDialogFragment.show( 422b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu ((Activity) getContext()).getFragmentManager(), 423b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu mAccountType, 424b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu mAccountName, 425b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu mDataSet, 426b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu new OnGroupCreatedListener() { 427b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu @Override 428b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu public void onGroupCreated() { 429b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu mCreatedNewGroup = true; 430b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu } 431b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu }); 4321ac58b6f2a925c5a4f759346e5244dfd174acd08Dmitri Plotnikov } 433b03e6a266e3a4181d22e6be4f3fa0c5dd158d7e1Maurice Chu 434e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov} 435