diff options
-rw-r--r-- | res/drawable-hdpi/ic_menu_all_contacts_dk.png | bin | 0 -> 1778 bytes | |||
-rw-r--r-- | res/drawable-mdpi/ic_menu_all_contacts_dk.png | bin | 0 -> 1225 bytes | |||
-rw-r--r-- | res/drawable-xhdpi/ic_menu_all_contacts_dk.png | bin | 0 -> 2396 bytes | |||
-rw-r--r-- | res/layout/show_all_contact_button.xml | 45 | ||||
-rw-r--r-- | res/layout/show_all_contacts_fragment.xml | 50 | ||||
-rw-r--r-- | res/values/strings.xml | 9 | ||||
-rw-r--r-- | res/values/styles.xml | 10 | ||||
-rw-r--r-- | src/com/android/dialer/NewDialtactsActivity.java | 95 | ||||
-rw-r--r-- | src/com/android/dialer/list/NewPhoneFavoriteFragment.java | 197 | ||||
-rw-r--r-- | src/com/android/dialer/list/NewPhoneFavoriteMergedAdapter.java | 29 | ||||
-rw-r--r-- | src/com/android/dialer/list/PhoneFavoritesTileAdapter.java | 6 | ||||
-rw-r--r-- | src/com/android/dialer/list/ShowAllContactsFragment.java | 89 |
12 files changed, 305 insertions, 225 deletions
diff --git a/res/drawable-hdpi/ic_menu_all_contacts_dk.png b/res/drawable-hdpi/ic_menu_all_contacts_dk.png Binary files differnew file mode 100644 index 000000000..88ba4f16a --- /dev/null +++ b/res/drawable-hdpi/ic_menu_all_contacts_dk.png diff --git a/res/drawable-mdpi/ic_menu_all_contacts_dk.png b/res/drawable-mdpi/ic_menu_all_contacts_dk.png Binary files differnew file mode 100644 index 000000000..03af9c4bd --- /dev/null +++ b/res/drawable-mdpi/ic_menu_all_contacts_dk.png diff --git a/res/drawable-xhdpi/ic_menu_all_contacts_dk.png b/res/drawable-xhdpi/ic_menu_all_contacts_dk.png Binary files differnew file mode 100644 index 000000000..11bd615e0 --- /dev/null +++ b/res/drawable-xhdpi/ic_menu_all_contacts_dk.png diff --git a/res/layout/show_all_contact_button.xml b/res/layout/show_all_contact_button.xml new file mode 100644 index 000000000..824d10cdb --- /dev/null +++ b/res/layout/show_all_contact_button.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/show_all_contact_button" + android:orientation="horizontal" + android:clickable="true" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:minHeight="?android:attr/listPreferredItemHeight" + android:gravity="center" + android:background="?android:attr/selectableItemBackground" + android:focusable="true"> + + <ImageView + android:layout_height="match_parent" + android:layout_width="wrap_content" + android:layout_gravity="center" + android:src="@drawable/ic_menu_all_contacts_dk" + android:layout_marginEnd="10dp"/> + + <TextView + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:textSize="14sp" + android:ellipsize="marquee" + android:singleLine="true" + android:text="@string/show_all_contacts_button_text" + android:textAlignment="center" + android:gravity="center"/> +</LinearLayout>
\ No newline at end of file diff --git a/res/layout/show_all_contacts_fragment.xml b/res/layout/show_all_contacts_fragment.xml new file mode 100644 index 000000000..0a95f2754 --- /dev/null +++ b/res/layout/show_all_contacts_fragment.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/pinned_header_list_layout" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginTop="?android:attr/actionBarSize"> + + <!-- Shown only when an Account filter is set. + - paddingTop should be here to show "shade" effect correctly. --> + <!-- TODO {klp} Remove the filter header. --> + <include + android:id="@+id/account_filter_header_container" + layout="@layout/account_filter_header" /> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="0dip" + android:layout_weight="1" > + <view + class="com.android.contacts.common.list.PinnedHeaderListView" + style="@style/NewDialtactsTheme" + android:id="@android:id/list" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginLeft="?attr/contact_browser_list_padding_left" + android:layout_marginRight="?attr/contact_browser_list_padding_right" + android:layout_marginStart="?attr/contact_browser_list_padding_left" + android:layout_marginEnd="?attr/contact_browser_list_padding_right" + android:fastScrollEnabled="true" + android:fadingEdge="none"/> + </FrameLayout> + +</LinearLayout> diff --git a/res/values/strings.xml b/res/values/strings.xml index 3845e2dd4..06d0a1e82 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -534,6 +534,10 @@ Do not translate. --> <string name="call_log_activity_title_font_family">sans-serif-light</string> + <!-- String resource for the font-family to use for show all contacts' title + Do not translate. --> + <string name="show_all_contacts_title_font_family">sans-serif-light</string> + <!-- Text displayed when the list of missed calls is empty --> <string name="recentMissed_empty">No recent missed calls.</string> @@ -597,4 +601,9 @@ <string name="dialpad_pound_number">#</string> <!-- Do not translate. --> <string name="dialpad_pound_letters"></string> + + <!-- Title of fragment that displays all contacts --> + <string name="show_all_contacts_title">All contacts</string> + <!-- Title of show all contacts button --> + <string name="show_all_contacts_button_text">All contacts</string> </resources> diff --git a/res/values/styles.xml b/res/values/styles.xml index 86df4ae7f..e2d7ab4ea 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -92,11 +92,11 @@ <item name="list_item_profile_photo_size">70dip</item> <item name="list_item_prefix_highlight_color">@color/people_app_theme_color</item> <item name="list_item_header_text_indent">8dip</item> - <item name="list_item_header_text_color">@color/people_app_theme_color</item> - <item name="list_item_header_text_size">14sp</item> - <item name="list_item_header_height">24dip</item> - <item name="list_item_header_underline_height">1dip</item> - <item name="list_item_header_underline_color">@color/people_app_theme_color</item> + <item name="list_item_header_text_color">@color/dialtacts_secondary_text_color</item> + <item name="list_item_header_text_size">20sp</item> + <item name="list_item_header_height">48dip</item> + <item name="list_item_header_underline_height">2dip</item> + <item name="list_item_header_underline_color">@color/favorite_contacts_separator_color</item> <item name="list_item_data_width_weight">5</item> <item name="list_item_label_width_weight">3</item> <item name="contact_browser_list_padding_left">8dip</item> diff --git a/src/com/android/dialer/NewDialtactsActivity.java b/src/com/android/dialer/NewDialtactsActivity.java index 95d9ea7df..7ac1b6e86 100644 --- a/src/com/android/dialer/NewDialtactsActivity.java +++ b/src/com/android/dialer/NewDialtactsActivity.java @@ -39,6 +39,7 @@ import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Intents.UI; import android.provider.Settings; import android.speech.RecognizerIntent; +import android.support.v4.app.NavUtils; import android.telephony.TelephonyManager; import android.text.Editable; import android.text.TextUtils; @@ -72,6 +73,7 @@ import com.android.dialer.dialpad.SmartDialNameMatcher; import com.android.dialer.interactions.PhoneNumberInteraction; import com.android.dialer.list.NewPhoneFavoriteFragment; import com.android.dialer.list.OnListFragmentScrolledListener; +import com.android.dialer.list.ShowAllContactsFragment; import com.android.dialer.list.SmartDialSearchFragment; import com.android.internal.telephony.ITelephony; @@ -96,7 +98,6 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie private static final String PHONE_PACKAGE = "com.android.phone"; private static final String CALL_SETTINGS_CLASS_NAME = "com.android.phone.CallFeaturesSetting"; - /** @see #getCallOrigin() */ private static final String CALL_ORIGIN_DIALTACTS = "com.android.dialer.DialtactsActivity"; @@ -105,6 +106,7 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie private static final String TAG_REGULAR_SEARCH_FRAGMENT = "search"; private static final String TAG_SMARTDIAL_SEARCH_FRAGMENT = "smartdial"; private static final String TAG_FAVORITES_FRAGMENT = "favorites"; + private static final String TAG_SHOW_ALL_CONTACTS_FRAGMENT = "show_all_contacts"; /** * Just for backward compatibility. Should behave as same as {@link Intent#ACTION_DIAL}. @@ -137,6 +139,8 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie */ private SmartDialSearchFragment mSmartDialSearchFragment; + private ShowAllContactsFragment mShowAllContactsFragment; + private View mMenuButton; private View mCallHistoryButton; private View mDialpadButton; @@ -237,20 +241,22 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie if (savedInstanceState == null) { mPhoneFavoriteFragment = new NewPhoneFavoriteFragment(); - mPhoneFavoriteFragment.setRetainInstance(true); mPhoneFavoriteFragment.setListener(mPhoneFavoriteListener); mRegularSearchFragment = new NewSearchFragment(); mSmartDialSearchFragment = new SmartDialSearchFragment(); mDialpadFragment = new NewDialpadFragment(); + mShowAllContactsFragment = new ShowAllContactsFragment(); + mShowAllContactsFragment.setOnPhoneNumberPickerActionListener( + mPhoneNumberPickerActionListener); // TODO krelease: load fragments on demand instead of creating all of them at run time final FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(R.id.dialtacts_frame, mPhoneFavoriteFragment, TAG_FAVORITES_FRAGMENT); ft.add(R.id.dialtacts_frame, mRegularSearchFragment, TAG_REGULAR_SEARCH_FRAGMENT); ft.add(R.id.dialtacts_frame, mSmartDialSearchFragment, TAG_SMARTDIAL_SEARCH_FRAGMENT); + ft.add(R.id.dialtacts_frame, mShowAllContactsFragment, TAG_SHOW_ALL_CONTACTS_FRAGMENT); ft.add(R.id.dialtacts_container, mDialpadFragment, TAG_DIALPAD_FRAGMENT); - // Fragments will be hidden as necessary in onAttachFragment ft.commit(); } @@ -282,12 +288,18 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie TAG_SMARTDIAL_SEARCH_FRAGMENT); mSmartDialSearchFragment.setOnPhoneNumberPickerActionListener( mPhoneNumberPickerActionListener); + + mShowAllContactsFragment = (ShowAllContactsFragment) fm.findFragmentByTag( + TAG_SHOW_ALL_CONTACTS_FRAGMENT); + mShowAllContactsFragment.setOnPhoneNumberPickerActionListener( + mPhoneNumberPickerActionListener); } @Override public void onAttachFragment(Fragment fragment) { if (fragment instanceof NewDialpadFragment || fragment instanceof NewSearchFragment - || fragment instanceof SmartDialSearchFragment) { + || fragment instanceof SmartDialSearchFragment + || fragment instanceof ShowAllContactsFragment) { final FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.hide(fragment); transaction.commit(); @@ -297,6 +309,16 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie } @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + // Respond to the action bar's Up/Home button + case android.R.id.home: + hideAllContactsFragment(); + } + return super.onOptionsItemSelected(item); + } + + @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.menu_import_export: @@ -314,7 +336,8 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie try { startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI)); } catch (ActivityNotFoundException e) { - Toast toast = Toast.makeText(this, R.string.add_contact_not_available, + Toast toast = Toast.makeText(this, + R.string.add_contact_not_available, Toast.LENGTH_SHORT); toast.show(); } @@ -402,6 +425,23 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie ft.commit(); } + public void showAllContactsFragment() { + final FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.hide(mPhoneFavoriteFragment); + ft.show(mShowAllContactsFragment); + // TODO{klp} Add animation + ft.commit(); + hideSearchBar(false); + } + + private void hideAllContactsFragment() { + final FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.hide(mShowAllContactsFragment); + ft.show(mPhoneFavoriteFragment); + ft.commit(); + showSearchBar(); + } + private void prepareSearchView() { mSearchViewContainer = findViewById(R.id.search_view_container); mSearchViewCloseButton = findViewById(R.id.search_close_button); @@ -435,26 +475,29 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie }; public void hideSearchBar() { - // If the favorites fragment hasn't been fully created before the dialpad fragment - // is hidden (i.e. onResume), don't bother animating - if (mPhoneFavoriteFragment == null || mPhoneFavoriteFragment.getView() == null) { - return; - } - mSearchViewContainer.animate().cancel(); - mSearchViewContainer.setAlpha(1); - mSearchViewContainer.setTranslationY(0); - mSearchViewContainer.animate().withLayer().alpha(0).translationY(-mSearchView.getHeight()) - .setDuration(200).setListener(mHideListener); + hideSearchBar(true); + } - mPhoneFavoriteFragment.getView().animate().withLayer() - .translationY(-mSearchViewContainer.getHeight()).setDuration(200).setListener( + public void hideSearchBar(boolean shiftView) { + if (shiftView) { + mSearchViewContainer.animate().cancel(); + mSearchViewContainer.setAlpha(1); + mSearchViewContainer.setTranslationY(0); + mSearchViewContainer.animate().withLayer().alpha(0).translationY(-mSearchView.getHeight()) + .setDuration(200).setListener(mHideListener); + + mPhoneFavoriteFragment.getView().animate().withLayer() + .translationY(-mSearchViewContainer.getHeight()).setDuration(200).setListener( new AnimatorListenerAdapter() { - @Override + @Override public void onAnimationEnd(Animator animation) { mBottomPaddingView.setVisibility(View.VISIBLE); mPhoneFavoriteFragment.getView().setTranslationY(0); } }); + } else { + mSearchViewContainer.setTranslationY(-mSearchView.getHeight()); + } } public void showSearchBar() { @@ -468,20 +511,20 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie mSearchViewContainer.setTranslationY(-mSearchViewContainer.getHeight()); mSearchViewContainer.animate().withLayer().alpha(1).translationY(0).setDuration(200) .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { + @Override + public void onAnimationStart(Animator animation) { mSearchViewContainer.setVisibility(View.VISIBLE); - } + } }); mPhoneFavoriteFragment.getView().setTranslationY(-mSearchViewContainer.getHeight()); mPhoneFavoriteFragment.getView().animate().withLayer().translationY(0).setDuration(200) .setListener( new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - mBottomPaddingView.setVisibility(View.GONE); - } + @Override + public void onAnimationStart(Animator animation) { + mBottomPaddingView.setVisibility(View.GONE); + } }); } @@ -745,6 +788,8 @@ public class NewDialtactsActivity extends TransactionSafeActivity implements Vie hideDialpadFragment(true); } else if (mInSearchUi) { mSearchView.setText(null); + } else if (mShowAllContactsFragment.isVisible()) { + hideAllContactsFragment(); } else if (isTaskRoot()) { // Instead of stopping, simply push this to the back of the stack. // This is only done when running at the top of the stack; diff --git a/src/com/android/dialer/list/NewPhoneFavoriteFragment.java b/src/com/android/dialer/list/NewPhoneFavoriteFragment.java index a181fb0fe..ba438cff3 100644 --- a/src/com/android/dialer/list/NewPhoneFavoriteFragment.java +++ b/src/com/android/dialer/list/NewPhoneFavoriteFragment.java @@ -19,16 +19,11 @@ import android.app.Activity; import android.app.Fragment; import android.app.LoaderManager; import android.content.CursorLoader; -import android.content.Intent; import android.content.Loader; import android.database.Cursor; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.provider.ContactsContract.Directory; -import android.provider.Settings; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -44,10 +39,8 @@ import android.widget.TextView; import com.android.contacts.common.ContactPhotoManager; import com.android.contacts.common.ContactTileLoaderFactory; import com.android.contacts.common.GeoUtil; -import com.android.contacts.common.list.ContactListItemView; import com.android.contacts.common.list.ContactTileView; import com.android.contacts.common.list.PhoneNumberListAdapter; -import com.android.contacts.common.preference.ContactsPreferences; import com.android.dialer.NewDialtactsActivity; import com.android.dialer.R; import com.android.dialer.calllog.ContactInfoHelper; @@ -94,19 +87,6 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis if (DEBUG) Log.d(TAG, "ContactTileLoaderListener#onLoadFinished"); mContactTileAdapter.setContactCursor(data); - if (mAllContactsForceReload) { - mAllContactsAdapter.onDataReload(); - // Use restartLoader() to make LoaderManager to load the section again. - getLoaderManager().restartLoader( - LOADER_ID_ALL_CONTACTS, null, mAllContactsLoaderListener); - } else if (!mAllContactsLoaderStarted) { - // Load "all" contacts if not loaded yet. - getLoaderManager().initLoader( - LOADER_ID_ALL_CONTACTS, null, mAllContactsLoaderListener); - } - mAllContactsForceReload = false; - mAllContactsLoaderStarted = true; - // Show the filter header with "loading" state. mAccountFilterHeader.setVisibility(View.VISIBLE); } @@ -117,29 +97,6 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis } } - private class AllContactsLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> { - @Override - public Loader<Cursor> onCreateLoader(int id, Bundle args) { - if (DEBUG) Log.d(TAG, "AllContactsLoaderListener#onCreateLoader"); - CursorLoader loader = new CursorLoader(getActivity(), null, null, null, null, null); - mAllContactsAdapter.configureLoader(loader, Directory.DEFAULT); - return loader; - } - - @Override - public void onLoadFinished(Loader<Cursor> loader, Cursor data) { - if (DEBUG) Log.d(TAG, "AllContactsLoaderListener#onLoadFinished"); - mAllContactsAdapter.changeCursor(0, data); - mHandler.removeMessages(MESSAGE_SHOW_LOADING_EFFECT); - mLoadingView.setVisibility(View.VISIBLE); - } - - @Override - public void onLoaderReset(Loader<Cursor> loader) { - if (DEBUG) Log.d(TAG, "AllContactsLoaderListener#onLoaderReset. "); - } - } - private class ContactTileAdapterListener implements ContactTileView.Listener { @Override public void onContactSelected(Uri contactUri, Rect targetRect) { @@ -161,16 +118,6 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis } } - private class ContactsPreferenceChangeListener - implements ContactsPreferences.ChangeListener { - @Override - public void onChange() { - if (loadContactsPreferences()) { - requestReloadAllContacts(); - } - } - } - private class ScrollListener implements ListView.OnScrollListener { @Override public void onScroll(AbsListView view, @@ -183,19 +130,6 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis } } - private static final int MESSAGE_SHOW_LOADING_EFFECT = 1; - private static final int LOADING_EFFECT_DELAY = 500; // ms - private final Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MESSAGE_SHOW_LOADING_EFFECT: - mLoadingView.setVisibility(View.VISIBLE); - break; - } - } - }; - private Listener mListener; private OnListFragmentScrolledListener mActivityScrollListener; @@ -206,21 +140,9 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis private NewCallLogAdapter mCallLogAdapter; private CallLogQueryHandler mCallLogQueryHandler; - /** - * true when the loader for {@link PhoneNumberListAdapter} has started already. - */ - private boolean mAllContactsLoaderStarted; - /** - * true when the loader for {@link PhoneNumberListAdapter} must reload "all" contacts again. - * It typically happens when {@link ContactsPreferences} has changed its settings - * (display order and sort order) - */ - private boolean mAllContactsForceReload; - - private ContactsPreferences mContactsPrefs; - private TextView mEmptyView; private ListView mListView; + private View mShowAllContactsButton; /** * Layout containing {@link #mAccountFilterHeader}. Used to limit area being "pressed". */ @@ -237,10 +159,6 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis new ContactTileAdapterListener(); private final LoaderManager.LoaderCallbacks<Cursor> mContactTileLoaderListener = new ContactTileLoaderListener(); - private final LoaderManager.LoaderCallbacks<Cursor> mAllContactsLoaderListener = - new AllContactsLoaderListener(); - private final ContactsPreferenceChangeListener mContactsPreferenceChangeListener = - new ContactsPreferenceChangeListener(); private final ScrollListener mScrollListener = new ScrollListener(); private boolean mOptionsMenuHasFrequents; @@ -250,8 +168,6 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis if (DEBUG) Log.d(TAG, "onAttach()"); super.onAttach(activity); - mContactsPrefs = new ContactsPreferences(activity); - // Construct two base adapters which will become part of PhoneFavoriteMergedAdapter. // We don't construct the resultant adapter at this moment since it requires LayoutInflater // that will be available on onCreateView(). @@ -260,33 +176,6 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis getResources().getInteger(R.integer.contact_tile_column_count_in_favorites_new), 1); mContactTileAdapter.setPhotoLoader(ContactPhotoManager.getInstance(activity)); - - // Setup the "all" adapter manually. See also the setup logic in ContactEntryListFragment. - mAllContactsAdapter = new PhoneNumberListAdapter(activity); - mAllContactsAdapter.setDisplayPhotos(true); - mAllContactsAdapter.setQuickContactEnabled(true); - mAllContactsAdapter.setSearchMode(false); - mAllContactsAdapter.setIncludeProfile(false); - mAllContactsAdapter.setSelectionVisible(false); - mAllContactsAdapter.setDarkTheme(false); - mAllContactsAdapter.setPhotoLoader(ContactPhotoManager.getInstance(activity)); - // Disable directory header. - mAllContactsAdapter.setHasHeader(0, false); - // Show A-Z section index. - mAllContactsAdapter.setSectionHeaderDisplayEnabled(true); - // Disable pinned header. It doesn't work with this fragment. - mAllContactsAdapter.setPinnedPartitionHeadersEnabled(false); - // Put photos on START (LEFT in LTR layout direction and RIGHT in RTL layout direction) - // for consistency with "frequent" contacts section. - mAllContactsAdapter.setPhotoPosition(ContactListItemView.getDefaultPhotoPosition( - true /* opposite */ )); - - // Use Callable.CONTENT_URI which will include not only phone numbers but also SIP - // addresses. - mAllContactsAdapter.setUseCallableUri(true); - - mAllContactsAdapter.setContactNameDisplayOrder(mContactsPrefs.getDisplayOrder()); - mAllContactsAdapter.setSortOrder(mContactsPrefs.getSortOrder()); } @Override @@ -330,9 +219,18 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis mAccountFilterHeaderContainer.addView(mAccountFilterHeader); mLoadingView = inflater.inflate(R.layout.phone_loading_contacts, mListView, false); + mShowAllContactsButton = inflater.inflate(R.layout.show_all_contact_button, mListView, + false); + mShowAllContactsButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + showAllContacts(); + } + }); - mAdapter = new NewPhoneFavoriteMergedAdapter(getActivity(), - mContactTileAdapter, mAccountFilterHeaderContainer, mCallLogAdapter, mLoadingView); + mAdapter = new NewPhoneFavoriteMergedAdapter(getActivity(), mContactTileAdapter, + mAccountFilterHeaderContainer, mCallLogAdapter, mLoadingView, + mShowAllContactsButton); mListView.setAdapter(mAdapter); @@ -347,6 +245,7 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis return listLayout; } + // TODO krelease: update the options menu when displaying the popup menu instead. We could // possibly get rid of this method entirely. private boolean isOptionsMenuChanged() { @@ -386,30 +285,11 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis throw new ClassCastException(activity.toString() + " must implement OnListFragmentScrolledListener"); } - mContactsPrefs.registerChangeListener(mContactsPreferenceChangeListener); - - // If ContactsPreferences has changed, we need to reload "all" contacts with the new - // settings. If mAllContactsFoarceReload is already true, it should be kept. - if (loadContactsPreferences()) { - mAllContactsForceReload = true; - } // Use initLoader() instead of restartLoader() to refraining unnecessary reload. // This method call implicitly assures ContactTileLoaderListener's onLoadFinished() will // be called, on which we'll check if "all" contacts should be reloaded again or not. getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null, mContactTileLoaderListener); - - // Delay showing "loading" view until certain amount of time so that users won't see - // instant flash of the view when the contacts load is fast enough. - // This will be kept shown until both tile and all sections are loaded. - mLoadingView.setVisibility(View.INVISIBLE); - mHandler.sendEmptyMessageDelayed(MESSAGE_SHOW_LOADING_EFFECT, LOADING_EFFECT_DELAY); - } - - @Override - public void onStop() { - super.onStop(); - mContactsPrefs.unregisterChangeListener(); } /** @@ -424,58 +304,17 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis if (position <= contactTileAdapterCount) { Log.e(TAG, "onItemClick() event for unexpected position. " + "The position " + position + " is before \"all\" section. Ignored."); - } else { - final int localPosition = position - mContactTileAdapter.getCount() - 1; - if (mListener != null) { - mListener.onContactSelected(mAllContactsAdapter.getDataUri(localPosition)); - } } } - private boolean loadContactsPreferences() { - if (mContactsPrefs == null || mAllContactsAdapter == null) { - return false; - } - - boolean changed = false; - final int currentDisplayOrder = mContactsPrefs.getDisplayOrder(); - if (mAllContactsAdapter.getContactNameDisplayOrder() != currentDisplayOrder) { - mAllContactsAdapter.setContactNameDisplayOrder(currentDisplayOrder); - changed = true; - } - - final int currentSortOrder = mContactsPrefs.getSortOrder(); - if (mAllContactsAdapter.getSortOrder() != currentSortOrder) { - mAllContactsAdapter.setSortOrder(currentSortOrder); - changed = true; - } - - return changed; - } - /** - * Requests to reload "all" contacts. If the section is already loaded, this method will - * force reloading it now. If the section isn't loaded yet, the actual load may be done later - * (on {@link #onStart()}. + * Gets called when user click on the show all contacts button. */ - private void requestReloadAllContacts() { - if (DEBUG) { - Log.d(TAG, "requestReloadAllContacts()" - + " mAllContactsAdapter: " + mAllContactsAdapter - + ", mAllContactsLoaderStarted: " + mAllContactsLoaderStarted); - } - - if (mAllContactsAdapter == null || !mAllContactsLoaderStarted) { - // Remember this request until next load on onStart(). - mAllContactsForceReload = true; - return; + private void showAllContacts() { + // TODO {klp} Use interface for the fragment to communicate with the activity + if (getActivity() instanceof NewDialtactsActivity) { + ((NewDialtactsActivity) getActivity()).showAllContactsFragment(); } - - if (DEBUG) Log.d(TAG, "Reload \"all\" contacts now."); - - mAllContactsAdapter.onDataReload(); - // Use restartLoader() to make LoaderManager to load the section again. - getLoaderManager().restartLoader(LOADER_ID_ALL_CONTACTS, null, mAllContactsLoaderListener); } public void setListener(Listener listener) { diff --git a/src/com/android/dialer/list/NewPhoneFavoriteMergedAdapter.java b/src/com/android/dialer/list/NewPhoneFavoriteMergedAdapter.java index d42189ef9..b350f026b 100644 --- a/src/com/android/dialer/list/NewPhoneFavoriteMergedAdapter.java +++ b/src/com/android/dialer/list/NewPhoneFavoriteMergedAdapter.java @@ -23,11 +23,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.FrameLayout; -import android.widget.LinearLayout; -import android.widget.SectionIndexer; -import com.android.contacts.common.list.ContactEntryListAdapter; -import com.android.contacts.common.list.ContactListItemView; import com.android.dialer.R; import com.android.dialer.calllog.NewCallLogAdapter; @@ -49,6 +45,7 @@ public class NewPhoneFavoriteMergedAdapter extends BaseAdapter { private final PhoneFavoritesTileAdapter mContactTileAdapter; private final NewCallLogAdapter mCallLogAdapter; private final View mLoadingView; + private final View mShowAllContactsButton; private final int mCallLogPadding; @@ -60,7 +57,8 @@ public class NewPhoneFavoriteMergedAdapter extends BaseAdapter { PhoneFavoritesTileAdapter contactTileAdapter, View accountFilterHeaderContainer, NewCallLogAdapter callLogAdapter, - View loadingView) { + View loadingView, + View showAllContactsButton) { final Resources resources = context.getResources(); mContext = context; mCallLogPadding = resources.getDimensionPixelSize(R.dimen.recent_call_log_item_padding); @@ -70,6 +68,7 @@ public class NewPhoneFavoriteMergedAdapter extends BaseAdapter { mObserver = new CustomDataSetObserver(); mContactTileAdapter.registerDataSetObserver(mObserver); mLoadingView = loadingView; + mShowAllContactsButton = showAllContactsButton; } @Override @@ -81,13 +80,11 @@ public class NewPhoneFavoriteMergedAdapter extends BaseAdapter { @Override public int getCount() { - return mContactTileAdapter.getCount() + mCallLogAdapter.getCount(); + return mContactTileAdapter.getCount() + mCallLogAdapter.getCount() + 1; } @Override public Object getItem(int position) { - final int contactTileAdapterCount = mContactTileAdapter.getCount(); - final int callLogAdapterCount = mCallLogAdapter.getCount(); if (callLogAdapterCount > 0) { @@ -108,7 +105,7 @@ public class NewPhoneFavoriteMergedAdapter extends BaseAdapter { @Override public int getViewTypeCount() { - return (mContactTileAdapter.getViewTypeCount() + mCallLogAdapter.getViewTypeCount()); + return (mContactTileAdapter.getViewTypeCount() + mCallLogAdapter.getViewTypeCount() + 1); } @Override @@ -119,18 +116,24 @@ public class NewPhoneFavoriteMergedAdapter extends BaseAdapter { // View type of the call log adapter is the last view type of the contact tile adapter // + 1 return mContactTileAdapter.getViewTypeCount(); - } else { + } else if (position < getCount() - 1) { return mContactTileAdapter.getItemViewType( getAdjustedFavoritePosition(position, callLogAdapterCount)); + } else { + // View type of the show all contact button is the last view type of the contact tile + // adapter + 2 + return mContactTileAdapter.getViewTypeCount() + 1; } } @Override public View getView(int position, View convertView, ViewGroup parent) { - final int contactTileAdapterCount = mContactTileAdapter.getCount(); - final int callLogAdapterCount = mCallLogAdapter.getCount(); + if (position == getCount() - 1) { + return mShowAllContactsButton; + } + if (callLogAdapterCount > 0) { if (position == 0) { final FrameLayout wrapper; @@ -189,7 +192,6 @@ public class NewPhoneFavoriteMergedAdapter extends BaseAdapter { @Override public boolean isEnabled(int position) { final int callLogAdapterCount = mCallLogAdapter.getCount(); - final int contactTileAdapterCount = mContactTileAdapter.getCount(); if (position < callLogAdapterCount) { return mCallLogAdapter.isEnabled(position); } else { // For favorites section @@ -201,5 +203,4 @@ public class NewPhoneFavoriteMergedAdapter extends BaseAdapter { private int getAdjustedFavoritePosition(int position, int callLogAdapterCount) { return position - callLogAdapterCount; } - } diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java index 2f3facfc9..6a4476df5 100644 --- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java +++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java @@ -221,7 +221,8 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter { return 0; } - final int total = mNumFrequents + mNumStarred; + int total = mNumFrequents + mNumStarred; + return total - (mMaxTiledRows * (mColumnCount - 1)); } @@ -297,7 +298,8 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter { public View getView(int position, View convertView, ViewGroup parent) { int itemViewType = getItemViewType(position); - ContactTileRow contactTileRowView = (ContactTileRow) convertView; + ContactTileRow contactTileRowView = (ContactTileRow) convertView; + ArrayList<ContactEntry> contactList = getItem(position); if (contactTileRowView == null) { diff --git a/src/com/android/dialer/list/ShowAllContactsFragment.java b/src/com/android/dialer/list/ShowAllContactsFragment.java new file mode 100644 index 000000000..85806b6b5 --- /dev/null +++ b/src/com/android/dialer/list/ShowAllContactsFragment.java @@ -0,0 +1,89 @@ +/* + + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.list; + +import android.app.ActionBar; +import android.app.Activity; +import android.os.Bundle; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.style.TypefaceSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.android.contacts.common.list.ContactListItemView; +import com.android.contacts.common.list.PhoneNumberPickerFragment; +import com.android.dialer.R; + +// TODO{klp}: Wrap this fragment with an activity. +/** + * Fragments to show all contacts with phone numbers. + */ +public class ShowAllContactsFragment extends PhoneNumberPickerFragment{ + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + + // Customizes the listview according to the dialer specifics. + setQuickContactEnabled(true); + setDarkTheme(false); + setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(true /* opposite */)); + setUseCallableUri(true); + } + + @Override + public void onStart() { + // Displays action bar for quick navigation. + final ActionBar actionBar = getActivity().getActionBar(); + actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); + actionBar.setDisplayShowHomeEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowTitleEnabled(true); + + final SpannableString s = new SpannableString(getString(R.string.show_all_contacts_title)); + s.setSpan(new TypefaceSpan(getString(R.string.show_all_contacts_title)), 0, + s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + actionBar.setTitle(s); + + super.onStart(); + } + + @Override + public void onHiddenChanged(boolean hidden) { + // Hides the action bar as it is hidden in the main activity + if (getActivity() != null) { + if (hidden) { + getActivity().getActionBar().hide(); + } else { + getActivity().getActionBar().show(); + } + } + } + + @Override + protected View inflateView(LayoutInflater inflater, ViewGroup container) { + return inflater.inflate(R.layout.show_all_contacts_fragment, null); + } +} |