Home | History | Annotate | Download | only in list
      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