blob: de856a472c7e9a3db5b3952b50f299353a197108 [file] [log] [blame]
Walter Jangf9779ef2016-05-25 12:23:05 -07001/*
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 */
16package com.android.contacts.list;
17
18import android.content.Loader;
19import android.database.Cursor;
20import android.database.CursorWrapper;
Walter Jangf9779ef2016-05-25 12:23:05 -070021import android.os.Bundle;
Walter Jangefb1cbe2016-05-28 13:54:12 -070022import android.util.Log;
Walter Jangf9779ef2016-05-25 12:23:05 -070023import android.view.LayoutInflater;
24import android.view.View;
25import android.view.ViewGroup;
26
27import com.android.contacts.common.R;
28import com.android.contacts.common.list.ContactEntryListFragment;
Walter Jang16c29592016-06-14 15:34:39 -070029import com.android.contacts.common.list.ContactListAdapter.ContactQuery;
30import com.android.contacts.common.list.ContactListFilter;
31import com.android.contacts.common.list.DefaultContactListAdapter;
Walter Jangf9779ef2016-05-25 12:23:05 -070032
33import java.util.ArrayList;
Walter Jangf9779ef2016-05-25 12:23:05 -070034
35/**
36 * Fragment containing raw contacts for a specified account that are not already in a group.
37 */
38public class GroupMemberPickerFragment extends
Walter Jang16c29592016-06-14 15:34:39 -070039 ContactEntryListFragment<DefaultContactListAdapter> {
Walter Jangf9779ef2016-05-25 12:23:05 -070040
Walter Jangefb1cbe2016-05-28 13:54:12 -070041 public static final String TAG = "GroupMemberPicker";
42
Walter Jang6c5a5582016-06-16 11:26:53 -070043 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 Jangf9779ef2016-05-25 12:23:05 -070046 private static final String KEY_RAW_CONTACT_IDS = "rawContactIds";
47
Walter Jang6c5a5582016-06-16 11:26:53 -070048 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 Jangf9779ef2016-05-25 12:23:05 -070051 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 Jang16c29592016-06-14 15:34:39 -070057 void onGroupMemberClicked(long contactId);
Walter Jangf9779ef2016-05-25 12:23:05 -070058 }
59
Walter Jang2552c112016-06-17 14:29:09 -070060 /** Filters out raw contacts that are already in the group. */
Walter Jangf9779ef2016-05-25 12:23:05 -070061 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 Jangefb1cbe2016-05-28 13:54:12 -070072
73 if (Log.isLoggable(TAG, Log.VERBOSE)) {
Walter Jang2552c112016-06-17 14:29:09 -070074 Log.v(TAG, "RawContacts CursorWrapper start: " + mCount);
Walter Jangefb1cbe2016-05-28 13:54:12 -070075 }
76
Walter Jangf9779ef2016-05-25 12:23:05 -070077 for (int i = 0; i < mCount; i++) {
78 super.moveToPosition(i);
Walter Jang16c29592016-06-14 15:34:39 -070079 final String contactId = getString(ContactQuery.CONTACT_ID);
80 if (!mRawContactIds.contains(contactId)) {
Walter Jangf9779ef2016-05-25 12:23:05 -070081 mIndex[mPos++] = i;
82 }
83 }
84 mCount = mPos;
85 mPos = 0;
86 super.moveToFirst();
Walter Jangefb1cbe2016-05-28 13:54:12 -070087
88 if (Log.isLoggable(TAG, Log.VERBOSE)) {
Walter Jang2552c112016-06-17 14:29:09 -070089 Log.v(TAG, "RawContacts CursorWrapper end: " + mCount);
Walter Jangefb1cbe2016-05-28 13:54:12 -070090 }
Walter Jangf9779ef2016-05-25 12:23:05 -070091 }
92
93 @Override
Walter Jangf9779ef2016-05-25 12:23:05 -070094 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 Jang6c5a5582016-06-16 11:26:53 -0700135 private String mAccountName;
136 private String mAccountType;
137 private String mAccountDataSet;
Walter Jangf9779ef2016-05-25 12:23:05 -0700138 private ArrayList<String> mRawContactIds;
Walter Jangf9779ef2016-05-25 12:23:05 -0700139 private Listener mListener;
140
Walter Jang6c5a5582016-06-16 11:26:53 -0700141 public static GroupMemberPickerFragment newInstance(String accountName, String accountType,
142 String accountDataSet, ArrayList<String> rawContactIds) {
Walter Jangf9779ef2016-05-25 12:23:05 -0700143 final Bundle args = new Bundle();
Walter Jang6c5a5582016-06-16 11:26:53 -0700144 args.putString(ARG_ACCOUNT_NAME, accountName);
145 args.putString(ARG_ACCOUNT_TYPE, accountType);
146 args.putString(ARG_ACCOUNT_DATA_SET, accountDataSet);
Walter Jang16c29592016-06-14 15:34:39 -0700147 args.putStringArrayList(ARG_RAW_CONTACT_IDS, rawContactIds);
Walter Jangf9779ef2016-05-25 12:23:05 -0700148
149 final GroupMemberPickerFragment fragment = new GroupMemberPickerFragment();
150 fragment.setArguments(args);
151 return fragment;
152 }
153
154 public GroupMemberPickerFragment() {
Walter Jangf9779ef2016-05-25 12:23:05 -0700155 setPhotoLoaderEnabled(true);
Walter Jang16c29592016-06-14 15:34:39 -0700156 setSectionHeaderDisplayEnabled(false);
Walter Jangefb1cbe2016-05-28 13:54:12 -0700157 setVisibleScrollbarEnabled(true);
Walter Jang16c29592016-06-14 15:34:39 -0700158
Walter Jangf9779ef2016-05-25 12:23:05 -0700159 setHasOptionsMenu(true);
160 }
161
162 @Override
163 public void onCreate(Bundle savedState) {
Walter Jangf9779ef2016-05-25 12:23:05 -0700164 if (savedState == null) {
Walter Jang6c5a5582016-06-16 11:26:53 -0700165 mAccountName = getArguments().getString(ARG_ACCOUNT_NAME);
166 mAccountType = getArguments().getString(ARG_ACCOUNT_TYPE);
167 mAccountDataSet = getArguments().getString(ARG_ACCOUNT_DATA_SET);
Walter Jangf9779ef2016-05-25 12:23:05 -0700168 mRawContactIds = getArguments().getStringArrayList(ARG_RAW_CONTACT_IDS);
169 } else {
Walter Jang6c5a5582016-06-16 11:26:53 -0700170 mAccountName = savedState.getString(KEY_ACCOUNT_NAME);
171 mAccountType = savedState.getString(KEY_ACCOUNT_TYPE);
172 mAccountDataSet = savedState.getString(KEY_ACCOUNT_DATA_SET);
Walter Jangf9779ef2016-05-25 12:23:05 -0700173 mRawContactIds = savedState.getStringArrayList(KEY_RAW_CONTACT_IDS);
174 }
Walter Jang16c29592016-06-14 15:34:39 -0700175 super.onCreate(savedState);
Walter Jangf9779ef2016-05-25 12:23:05 -0700176 }
177
178 @Override
179 public void onSaveInstanceState(Bundle outState) {
180 super.onSaveInstanceState(outState);
Walter Jang6c5a5582016-06-16 11:26:53 -0700181 outState.putString(KEY_ACCOUNT_NAME, mAccountName);
182 outState.putString(KEY_ACCOUNT_TYPE, mAccountType);
183 outState.putString(KEY_ACCOUNT_DATA_SET, mAccountDataSet);
Walter Jangf9779ef2016-05-25 12:23:05 -0700184 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 Wangecc222b2016-06-06 14:35:51 -0700198 if (data != null) {
199 super.onLoadFinished(loader, new FilterCursorWrapper(data));
200 }
Walter Jangf9779ef2016-05-25 12:23:05 -0700201 }
202
203 @Override
Walter Jang16c29592016-06-14 15:34:39 -0700204 protected DefaultContactListAdapter createListAdapter() {
205 final DefaultContactListAdapter adapter = new DefaultContactListAdapter(getActivity());
206 adapter.setFilter(ContactListFilter.createGroupMembersFilter(
Walter Jang6c5a5582016-06-16 11:26:53 -0700207 mAccountType, mAccountName, mAccountDataSet));
Walter Jang16c29592016-06-14 15:34:39 -0700208 adapter.setSectionHeaderDisplayEnabled(true);
Walter Jangf9779ef2016-05-25 12:23:05 -0700209 adapter.setDisplayPhotos(true);
210 return adapter;
211 }
212
213 @Override
Walter Jangf9779ef2016-05-25 12:23:05 -0700214 protected void onItemClick(int position, long id) {
215 if (mListener != null) {
Walter Jang16c29592016-06-14 15:34:39 -0700216 final long contactId = getAdapter().getContactId(position);
217 if (contactId > 0) {
218 mListener.onGroupMemberClicked(contactId);
219 }
Walter Jangf9779ef2016-05-25 12:23:05 -0700220 }
221 }
Walter Jangf9779ef2016-05-25 12:23:05 -0700222}