Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2016 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | package com.android.contacts.list; |
| 17 | |
| 18 | import android.content.Loader; |
| 19 | import android.database.Cursor; |
| 20 | import android.database.CursorWrapper; |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 21 | import android.os.Bundle; |
Walter Jang | efb1cbe | 2016-05-28 13:54:12 -0700 | [diff] [blame] | 22 | import android.util.Log; |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 23 | import android.view.LayoutInflater; |
| 24 | import android.view.View; |
| 25 | import android.view.ViewGroup; |
| 26 | |
| 27 | import com.android.contacts.common.R; |
| 28 | import com.android.contacts.common.list.ContactEntryListFragment; |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 29 | import com.android.contacts.common.list.ContactListAdapter.ContactQuery; |
| 30 | import com.android.contacts.common.list.ContactListFilter; |
| 31 | import com.android.contacts.common.list.DefaultContactListAdapter; |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 32 | |
| 33 | import java.util.ArrayList; |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 34 | |
| 35 | /** |
| 36 | * Fragment containing raw contacts for a specified account that are not already in a group. |
| 37 | */ |
| 38 | public class GroupMemberPickerFragment extends |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 39 | ContactEntryListFragment<DefaultContactListAdapter> { |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 40 | |
Walter Jang | efb1cbe | 2016-05-28 13:54:12 -0700 | [diff] [blame] | 41 | public static final String TAG = "GroupMemberPicker"; |
| 42 | |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 43 | private static final String KEY_ACCOUNT_NAME = "accountName"; |
| 44 | private static final String KEY_ACCOUNT_TYPE = "accountType"; |
| 45 | private static final String KEY_ACCOUNT_DATA_SET = "accountDataSet"; |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 46 | private static final String KEY_RAW_CONTACT_IDS = "rawContactIds"; |
| 47 | |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 48 | private static final String ARG_ACCOUNT_NAME = "accountName"; |
| 49 | private static final String ARG_ACCOUNT_TYPE = "accountType"; |
| 50 | private static final String ARG_ACCOUNT_DATA_SET = "accountDataSet"; |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 51 | private static final String ARG_RAW_CONTACT_IDS = "rawContactIds"; |
| 52 | |
| 53 | /** Callbacks for host of {@link GroupMemberPickerFragment}. */ |
| 54 | public interface Listener { |
| 55 | |
| 56 | /** Invoked when a potential group member is selected. */ |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 57 | void onGroupMemberClicked(long contactId); |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 58 | } |
| 59 | |
Walter Jang | 2552c11 | 2016-06-17 14:29:09 -0700 | [diff] [blame^] | 60 | /** Filters out raw contacts that are already in the group. */ |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 61 | private class FilterCursorWrapper extends CursorWrapper { |
| 62 | |
| 63 | private int[] mIndex; |
| 64 | private int mCount = 0; |
| 65 | private int mPos = 0; |
| 66 | |
| 67 | public FilterCursorWrapper(Cursor cursor) { |
| 68 | super(cursor); |
| 69 | |
| 70 | mCount = super.getCount(); |
| 71 | mIndex = new int[mCount]; |
Walter Jang | efb1cbe | 2016-05-28 13:54:12 -0700 | [diff] [blame] | 72 | |
| 73 | if (Log.isLoggable(TAG, Log.VERBOSE)) { |
Walter Jang | 2552c11 | 2016-06-17 14:29:09 -0700 | [diff] [blame^] | 74 | Log.v(TAG, "RawContacts CursorWrapper start: " + mCount); |
Walter Jang | efb1cbe | 2016-05-28 13:54:12 -0700 | [diff] [blame] | 75 | } |
| 76 | |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 77 | for (int i = 0; i < mCount; i++) { |
| 78 | super.moveToPosition(i); |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 79 | final String contactId = getString(ContactQuery.CONTACT_ID); |
| 80 | if (!mRawContactIds.contains(contactId)) { |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 81 | mIndex[mPos++] = i; |
| 82 | } |
| 83 | } |
| 84 | mCount = mPos; |
| 85 | mPos = 0; |
| 86 | super.moveToFirst(); |
Walter Jang | efb1cbe | 2016-05-28 13:54:12 -0700 | [diff] [blame] | 87 | |
| 88 | if (Log.isLoggable(TAG, Log.VERBOSE)) { |
Walter Jang | 2552c11 | 2016-06-17 14:29:09 -0700 | [diff] [blame^] | 89 | Log.v(TAG, "RawContacts CursorWrapper end: " + mCount); |
Walter Jang | efb1cbe | 2016-05-28 13:54:12 -0700 | [diff] [blame] | 90 | } |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 91 | } |
| 92 | |
| 93 | @Override |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 94 | public boolean move(int offset) { |
| 95 | return moveToPosition(mPos + offset); |
| 96 | } |
| 97 | |
| 98 | @Override |
| 99 | public boolean moveToNext() { |
| 100 | return moveToPosition(mPos + 1); |
| 101 | } |
| 102 | |
| 103 | @Override |
| 104 | public boolean moveToPrevious() { |
| 105 | return moveToPosition(mPos - 1); |
| 106 | } |
| 107 | |
| 108 | @Override |
| 109 | public boolean moveToFirst() { |
| 110 | return moveToPosition(0); |
| 111 | } |
| 112 | |
| 113 | @Override |
| 114 | public boolean moveToLast() { |
| 115 | return moveToPosition(mCount - 1); |
| 116 | } |
| 117 | |
| 118 | @Override |
| 119 | public boolean moveToPosition(int position) { |
| 120 | if (position >= mCount || position < 0) return false; |
| 121 | return super.moveToPosition(mIndex[position]); |
| 122 | } |
| 123 | |
| 124 | @Override |
| 125 | public int getCount() { |
| 126 | return mCount; |
| 127 | } |
| 128 | |
| 129 | @Override |
| 130 | public int getPosition() { |
| 131 | return mPos; |
| 132 | } |
| 133 | } |
| 134 | |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 135 | private String mAccountName; |
| 136 | private String mAccountType; |
| 137 | private String mAccountDataSet; |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 138 | private ArrayList<String> mRawContactIds; |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 139 | private Listener mListener; |
| 140 | |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 141 | public static GroupMemberPickerFragment newInstance(String accountName, String accountType, |
| 142 | String accountDataSet, ArrayList<String> rawContactIds) { |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 143 | final Bundle args = new Bundle(); |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 144 | args.putString(ARG_ACCOUNT_NAME, accountName); |
| 145 | args.putString(ARG_ACCOUNT_TYPE, accountType); |
| 146 | args.putString(ARG_ACCOUNT_DATA_SET, accountDataSet); |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 147 | args.putStringArrayList(ARG_RAW_CONTACT_IDS, rawContactIds); |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 148 | |
| 149 | final GroupMemberPickerFragment fragment = new GroupMemberPickerFragment(); |
| 150 | fragment.setArguments(args); |
| 151 | return fragment; |
| 152 | } |
| 153 | |
| 154 | public GroupMemberPickerFragment() { |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 155 | setPhotoLoaderEnabled(true); |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 156 | setSectionHeaderDisplayEnabled(false); |
Walter Jang | efb1cbe | 2016-05-28 13:54:12 -0700 | [diff] [blame] | 157 | setVisibleScrollbarEnabled(true); |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 158 | |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 159 | setHasOptionsMenu(true); |
| 160 | } |
| 161 | |
| 162 | @Override |
| 163 | public void onCreate(Bundle savedState) { |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 164 | if (savedState == null) { |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 165 | mAccountName = getArguments().getString(ARG_ACCOUNT_NAME); |
| 166 | mAccountType = getArguments().getString(ARG_ACCOUNT_TYPE); |
| 167 | mAccountDataSet = getArguments().getString(ARG_ACCOUNT_DATA_SET); |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 168 | mRawContactIds = getArguments().getStringArrayList(ARG_RAW_CONTACT_IDS); |
| 169 | } else { |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 170 | mAccountName = savedState.getString(KEY_ACCOUNT_NAME); |
| 171 | mAccountType = savedState.getString(KEY_ACCOUNT_TYPE); |
| 172 | mAccountDataSet = savedState.getString(KEY_ACCOUNT_DATA_SET); |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 173 | mRawContactIds = savedState.getStringArrayList(KEY_RAW_CONTACT_IDS); |
| 174 | } |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 175 | super.onCreate(savedState); |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 176 | } |
| 177 | |
| 178 | @Override |
| 179 | public void onSaveInstanceState(Bundle outState) { |
| 180 | super.onSaveInstanceState(outState); |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 181 | outState.putString(KEY_ACCOUNT_NAME, mAccountName); |
| 182 | outState.putString(KEY_ACCOUNT_TYPE, mAccountType); |
| 183 | outState.putString(KEY_ACCOUNT_DATA_SET, mAccountDataSet); |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 184 | outState.putStringArrayList(KEY_RAW_CONTACT_IDS, mRawContactIds); |
| 185 | } |
| 186 | |
| 187 | public void setListener(Listener listener) { |
| 188 | mListener = listener; |
| 189 | } |
| 190 | |
| 191 | @Override |
| 192 | protected View inflateView(LayoutInflater inflater, ViewGroup container) { |
| 193 | return inflater.inflate(R.layout.contact_list_content, null); |
| 194 | } |
| 195 | |
| 196 | @Override |
| 197 | public void onLoadFinished(Loader<Cursor> loader, Cursor data) { |
Wenyi Wang | ecc222b | 2016-06-06 14:35:51 -0700 | [diff] [blame] | 198 | if (data != null) { |
| 199 | super.onLoadFinished(loader, new FilterCursorWrapper(data)); |
| 200 | } |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 201 | } |
| 202 | |
| 203 | @Override |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 204 | protected DefaultContactListAdapter createListAdapter() { |
| 205 | final DefaultContactListAdapter adapter = new DefaultContactListAdapter(getActivity()); |
| 206 | adapter.setFilter(ContactListFilter.createGroupMembersFilter( |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 207 | mAccountType, mAccountName, mAccountDataSet)); |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 208 | adapter.setSectionHeaderDisplayEnabled(true); |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 209 | adapter.setDisplayPhotos(true); |
| 210 | return adapter; |
| 211 | } |
| 212 | |
| 213 | @Override |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 214 | protected void onItemClick(int position, long id) { |
| 215 | if (mListener != null) { |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 216 | final long contactId = getAdapter().getContactId(position); |
| 217 | if (contactId > 0) { |
| 218 | mListener.onGroupMemberClicked(contactId); |
| 219 | } |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 220 | } |
| 221 | } |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 222 | } |