1 /* 2 * Copyright (C) 2010 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 com.android.contacts.R; 19 import com.android.contacts.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener; 20 import com.android.contacts.util.AccountFilterUtil; 21 22 import android.content.Intent; 23 import android.net.Uri; 24 import android.os.Bundle; 25 import android.util.Log; 26 import android.view.LayoutInflater; 27 import android.view.MenuItem; 28 import android.view.View; 29 import android.view.View.OnClickListener; 30 import android.view.ViewGroup; 31 32 /** 33 * Fragment containing a phone number list for picking. 34 */ 35 public class PhoneNumberPickerFragment extends ContactEntryListFragment<ContactEntryListAdapter> 36 implements OnShortcutIntentCreatedListener { 37 private static final String TAG = PhoneNumberPickerFragment.class.getSimpleName(); 38 39 private static final int REQUEST_CODE_ACCOUNT_FILTER = 1; 40 41 private OnPhoneNumberPickerActionListener mListener; 42 private String mShortcutAction; 43 44 private ContactListFilter mFilter; 45 46 private View mAccountFilterHeader; 47 /** 48 * Lives as ListView's header and is shown when {@link #mAccountFilterHeader} is set 49 * to View.GONE. 50 */ 51 private View mPaddingView; 52 53 private static final String KEY_FILTER = "filter"; 54 55 /** true if the loader has started at least once. */ 56 private boolean mLoaderStarted; 57 58 private ContactListItemView.PhotoPosition mPhotoPosition = 59 ContactListItemView.DEFAULT_PHOTO_POSITION; 60 61 private class FilterHeaderClickListener implements OnClickListener { 62 @Override 63 public void onClick(View view) { 64 AccountFilterUtil.startAccountFilterActivityForResult( 65 PhoneNumberPickerFragment.this, REQUEST_CODE_ACCOUNT_FILTER); 66 } 67 } 68 private OnClickListener mFilterHeaderClickListener = new FilterHeaderClickListener(); 69 70 public PhoneNumberPickerFragment() { 71 setQuickContactEnabled(false); 72 setPhotoLoaderEnabled(true); 73 setSectionHeaderDisplayEnabled(true); 74 setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DATA_SHORTCUT); 75 76 // Show nothing instead of letting caller Activity show something. 77 setHasOptionsMenu(true); 78 } 79 80 public void setOnPhoneNumberPickerActionListener(OnPhoneNumberPickerActionListener listener) { 81 this.mListener = listener; 82 } 83 84 @Override 85 protected void onCreateView(LayoutInflater inflater, ViewGroup container) { 86 super.onCreateView(inflater, container); 87 88 View paddingView = inflater.inflate(R.layout.contact_detail_list_padding, null, false); 89 mPaddingView = paddingView.findViewById(R.id.contact_detail_list_padding); 90 getListView().addHeaderView(paddingView); 91 92 mAccountFilterHeader = getView().findViewById(R.id.account_filter_header_container); 93 mAccountFilterHeader.setOnClickListener(mFilterHeaderClickListener); 94 updateFilterHeaderView(); 95 96 setVisibleScrollbarEnabled(!isLegacyCompatibilityMode()); 97 } 98 99 @Override 100 protected void setSearchMode(boolean flag) { 101 super.setSearchMode(flag); 102 updateFilterHeaderView(); 103 } 104 105 private void updateFilterHeaderView() { 106 final ContactListFilter filter = getFilter(); 107 if (mAccountFilterHeader == null || filter == null) { 108 return; 109 } 110 final boolean shouldShowHeader = AccountFilterUtil.updateAccountFilterTitleForPhone( 111 mAccountFilterHeader, filter, false, false); 112 if (shouldShowHeader) { 113 mPaddingView.setVisibility(View.GONE); 114 mAccountFilterHeader.setVisibility(View.VISIBLE); 115 } else { 116 mPaddingView.setVisibility(View.VISIBLE); 117 mAccountFilterHeader.setVisibility(View.GONE); 118 } 119 } 120 121 @Override 122 public void restoreSavedState(Bundle savedState) { 123 super.restoreSavedState(savedState); 124 125 if (savedState == null) { 126 return; 127 } 128 129 mFilter = savedState.getParcelable(KEY_FILTER); 130 } 131 132 @Override 133 public void onSaveInstanceState(Bundle outState) { 134 super.onSaveInstanceState(outState); 135 outState.putParcelable(KEY_FILTER, mFilter); 136 } 137 138 @Override 139 public boolean onOptionsItemSelected(MenuItem item) { 140 final int itemId = item.getItemId(); 141 if (itemId == android.R.id.home) { // See ActionBar#setDisplayHomeAsUpEnabled() 142 if (mListener != null) { 143 mListener.onHomeInActionBarSelected(); 144 } 145 return true; 146 } 147 return super.onOptionsItemSelected(item); 148 } 149 150 /** 151 * @param shortcutAction either {@link Intent#ACTION_CALL} or 152 * {@link Intent#ACTION_SENDTO} or null. 153 */ 154 public void setShortcutAction(String shortcutAction) { 155 this.mShortcutAction = shortcutAction; 156 } 157 158 @Override 159 protected void onItemClick(int position, long id) { 160 final Uri phoneUri; 161 if (!isLegacyCompatibilityMode()) { 162 PhoneNumberListAdapter adapter = (PhoneNumberListAdapter) getAdapter(); 163 phoneUri = adapter.getDataUri(position); 164 165 } else { 166 LegacyPhoneNumberListAdapter adapter = (LegacyPhoneNumberListAdapter) getAdapter(); 167 phoneUri = adapter.getPhoneUri(position); 168 } 169 170 if (phoneUri != null) { 171 pickPhoneNumber(phoneUri); 172 } else { 173 Log.w(TAG, "Item at " + position + " was clicked before adapter is ready. Ignoring"); 174 } 175 } 176 177 @Override 178 protected void startLoading() { 179 mLoaderStarted = true; 180 super.startLoading(); 181 } 182 183 @Override 184 protected ContactEntryListAdapter createListAdapter() { 185 if (!isLegacyCompatibilityMode()) { 186 PhoneNumberListAdapter adapter = new PhoneNumberListAdapter(getActivity()); 187 adapter.setDisplayPhotos(true); 188 return adapter; 189 } else { 190 LegacyPhoneNumberListAdapter adapter = new LegacyPhoneNumberListAdapter(getActivity()); 191 adapter.setDisplayPhotos(true); 192 return adapter; 193 } 194 } 195 196 @Override 197 protected void configureAdapter() { 198 super.configureAdapter(); 199 200 final ContactEntryListAdapter adapter = getAdapter(); 201 if (adapter == null) { 202 return; 203 } 204 205 if (!isSearchMode() && mFilter != null) { 206 adapter.setFilter(mFilter); 207 } 208 209 if (!isLegacyCompatibilityMode()) { 210 ((PhoneNumberListAdapter) adapter).setPhotoPosition(mPhotoPosition); 211 } 212 } 213 214 @Override 215 protected View inflateView(LayoutInflater inflater, ViewGroup container) { 216 return inflater.inflate(R.layout.contact_list_content, null); 217 } 218 219 public void pickPhoneNumber(Uri uri) { 220 if (mShortcutAction == null) { 221 mListener.onPickPhoneNumberAction(uri); 222 } else { 223 if (isLegacyCompatibilityMode()) { 224 throw new UnsupportedOperationException(); 225 } 226 ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this); 227 builder.createPhoneNumberShortcutIntent(uri, mShortcutAction); 228 } 229 } 230 231 public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) { 232 mListener.onShortcutIntentCreated(shortcutIntent); 233 } 234 235 @Override 236 public void onPickerResult(Intent data) { 237 mListener.onPickPhoneNumberAction(data.getData()); 238 } 239 240 @Override 241 public void onActivityResult(int requestCode, int resultCode, Intent data) { 242 if (requestCode == REQUEST_CODE_ACCOUNT_FILTER) { 243 if (getActivity() != null) { 244 AccountFilterUtil.handleAccountFilterResult( 245 ContactListFilterController.getInstance(getActivity()), resultCode, data); 246 } else { 247 Log.e(TAG, "getActivity() returns null during Fragment#onActivityResult()"); 248 } 249 } 250 } 251 252 public ContactListFilter getFilter() { 253 return mFilter; 254 } 255 256 public void setFilter(ContactListFilter filter) { 257 if ((mFilter == null && filter == null) || 258 (mFilter != null && mFilter.equals(filter))) { 259 return; 260 } 261 262 mFilter = filter; 263 if (mLoaderStarted) { 264 reloadData(); 265 } 266 updateFilterHeaderView(); 267 } 268 269 public void setPhotoPosition(ContactListItemView.PhotoPosition photoPosition) { 270 mPhotoPosition = photoPosition; 271 if (!isLegacyCompatibilityMode()) { 272 final PhoneNumberListAdapter adapter = (PhoneNumberListAdapter) getAdapter(); 273 if (adapter != null) { 274 adapter.setPhotoPosition(photoPosition); 275 } 276 } else { 277 Log.w(TAG, "setPhotoPosition() is ignored in legacy compatibility mode."); 278 } 279 } 280 } 281