diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/dialer/DialtactsActivity.java | 26 | ||||
-rw-r--r-- | src/com/android/dialer/SearchFragment.java (renamed from src/com/android/dialer/NewSearchFragment.java) | 4 | ||||
-rw-r--r-- | src/com/android/dialer/calllog/CallLogActivity.java | 2 | ||||
-rw-r--r-- | src/com/android/dialer/dialpad/DialpadFragment.java | 4 | ||||
-rw-r--r-- | src/com/android/dialer/dialpad/SmartDialEntry.java | 44 | ||||
-rw-r--r-- | src/com/android/dialer/dialpad/SmartDialLoaderTask.java | 107 | ||||
-rw-r--r-- | src/com/android/dialer/dialpad/SmartDialTextView.java | 76 | ||||
-rw-r--r-- | src/com/android/dialer/list/NewPhoneFavoriteMergedAdapter.java | 204 | ||||
-rw-r--r-- | src/com/android/dialer/list/PhoneFavoriteFragment.java (renamed from src/com/android/dialer/list/NewPhoneFavoriteFragment.java) | 11 | ||||
-rw-r--r-- | src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java | 301 |
10 files changed, 122 insertions, 657 deletions
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java index 89e5b5a6b..726c17687 100644 --- a/src/com/android/dialer/DialtactsActivity.java +++ b/src/com/android/dialer/DialtactsActivity.java @@ -71,7 +71,7 @@ import com.android.dialer.calllog.CallLogActivity; import com.android.dialer.dialpad.DialpadFragment; import com.android.dialer.dialpad.SmartDialNameMatcher; import com.android.dialer.interactions.PhoneNumberInteraction; -import com.android.dialer.list.NewPhoneFavoriteFragment; +import com.android.dialer.list.PhoneFavoriteFragment; import com.android.dialer.list.OnListFragmentScrolledListener; import com.android.dialer.list.ShowAllContactsFragment; import com.android.dialer.list.SmartDialSearchFragment; @@ -88,7 +88,7 @@ import java.util.ArrayList; public class DialtactsActivity extends TransactionSafeActivity implements View.OnClickListener, DialpadFragment.OnDialpadQueryChangedListener, PopupMenu.OnMenuItemClickListener, OnListFragmentScrolledListener, - NewPhoneFavoriteFragment.OnPhoneFavoriteFragmentStartedListener, + PhoneFavoriteFragment.OnPhoneFavoriteFragmentStartedListener, DialpadFragment.OnDialpadFragmentStartedListener { private static final String TAG = "DialtactsActivity"; @@ -124,7 +124,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O /** * The main fragment displaying the user's favorites and frequent contacts */ - private NewPhoneFavoriteFragment mPhoneFavoriteFragment; + private PhoneFavoriteFragment mPhoneFavoriteFragment; /** * Fragment containing the dialpad that slides into view @@ -134,7 +134,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O /** * Fragment for searching phone numbers using the alphanumeric keyboard. */ - private NewSearchFragment mRegularSearchFragment; + private SearchFragment mRegularSearchFragment; /** * Fragment for searching phone numbers using the dialpad. @@ -246,15 +246,15 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O final Intent intent = getIntent(); fixIntent(intent); - setContentView(R.layout.new_dialtacts_activity); + setContentView(R.layout.dialtacts_activity); getActionBar().hide(); if (savedInstanceState == null) { - mPhoneFavoriteFragment = new NewPhoneFavoriteFragment(); + mPhoneFavoriteFragment = new PhoneFavoriteFragment(); mPhoneFavoriteFragment.setListener(mPhoneFavoriteListener); - mRegularSearchFragment = new NewSearchFragment(); + mRegularSearchFragment = new SearchFragment(); mSmartDialSearchFragment = new SmartDialSearchFragment(); mDialpadFragment = new DialpadFragment(); mShowAllContactsFragment = new ShowAllContactsFragment(); @@ -284,11 +284,11 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O protected void onResume() { super.onResume(); final FragmentManager fm = getFragmentManager(); - mPhoneFavoriteFragment = (NewPhoneFavoriteFragment) fm.findFragmentByTag( + mPhoneFavoriteFragment = (PhoneFavoriteFragment) fm.findFragmentByTag( TAG_FAVORITES_FRAGMENT); mDialpadFragment = (DialpadFragment) fm.findFragmentByTag(TAG_DIALPAD_FRAGMENT); - mRegularSearchFragment = (NewSearchFragment) fm.findFragmentByTag( + mRegularSearchFragment = (SearchFragment) fm.findFragmentByTag( TAG_REGULAR_SEARCH_FRAGMENT); mRegularSearchFragment.setOnPhoneNumberPickerActionListener( mPhoneNumberPickerActionListener); @@ -311,7 +311,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O @Override public void onAttachFragment(Fragment fragment) { - if (fragment instanceof DialpadFragment || fragment instanceof NewSearchFragment + if (fragment instanceof DialpadFragment || fragment instanceof SearchFragment || fragment instanceof SmartDialSearchFragment || fragment instanceof ShowAllContactsFragment) { final FragmentTransaction transaction = getFragmentManager().beginTransaction(); @@ -369,7 +369,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O case R.id.overflow_menu: { final PopupMenu popupMenu = new PopupMenu(DialtactsActivity.this, view); final Menu menu = popupMenu.getMenu(); - popupMenu.inflate(R.menu.dialtacts_options_new); + popupMenu.inflate(R.menu.dialtacts_options); popupMenu.setOnMenuItemClickListener(this); popupMenu.show(); break; @@ -704,8 +704,8 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O } } - private final NewPhoneFavoriteFragment.Listener mPhoneFavoriteListener = - new NewPhoneFavoriteFragment.Listener() { + private final PhoneFavoriteFragment.Listener mPhoneFavoriteListener = + new PhoneFavoriteFragment.Listener() { @Override public void onContactSelected(Uri contactUri) { PhoneNumberInteraction.startInteractionForPhoneCall( diff --git a/src/com/android/dialer/NewSearchFragment.java b/src/com/android/dialer/SearchFragment.java index e8e40d6aa..54d29d43f 100644 --- a/src/com/android/dialer/NewSearchFragment.java +++ b/src/com/android/dialer/SearchFragment.java @@ -25,11 +25,11 @@ import com.android.contacts.common.list.ContactListItemView; import com.android.contacts.common.list.PhoneNumberPickerFragment; import com.android.dialer.list.OnListFragmentScrolledListener; -public class NewSearchFragment extends PhoneNumberPickerFragment { +public class SearchFragment extends PhoneNumberPickerFragment { private OnListFragmentScrolledListener mActivityScrollListener; - public NewSearchFragment() { + public SearchFragment() { setDirectorySearchEnabled(true); } diff --git a/src/com/android/dialer/calllog/CallLogActivity.java b/src/com/android/dialer/calllog/CallLogActivity.java index 39909a1f8..662614f95 100644 --- a/src/com/android/dialer/calllog/CallLogActivity.java +++ b/src/com/android/dialer/calllog/CallLogActivity.java @@ -151,7 +151,7 @@ public class CallLogActivity extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { final MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.call_log_options_new, menu); + inflater.inflate(R.menu.call_log_options, menu); return true; } diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java index 76cca3362..3052c67f0 100644 --- a/src/com/android/dialer/dialpad/DialpadFragment.java +++ b/src/com/android/dialer/dialpad/DialpadFragment.java @@ -346,7 +346,7 @@ public class DialpadFragment extends Fragment @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { - final View fragmentView = inflater.inflate(R.layout.new_dialpad_fragment, container, + final View fragmentView = inflater.inflate(R.layout.dialpad_fragment, container, false); fragmentView.buildLayer(); @@ -938,7 +938,7 @@ public class DialpadFragment extends Fragment case R.id.overflow_menu_on_dialpad: { final PopupMenu popupMenu = new PopupMenu(getActivity(), view); final Menu menu = popupMenu.getMenu(); - popupMenu.inflate(R.menu.dialpad_options_new); + popupMenu.inflate(R.menu.dialpad_options); popupMenu.setOnMenuItemClickListener(this); setupMenuItems(menu); popupMenu.show(); diff --git a/src/com/android/dialer/dialpad/SmartDialEntry.java b/src/com/android/dialer/dialpad/SmartDialEntry.java deleted file mode 100644 index 9ff491293..000000000 --- a/src/com/android/dialer/dialpad/SmartDialEntry.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2012 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.dialpad; - -import android.net.Uri; - -import java.util.ArrayList; - -public class SmartDialEntry { - /** Display name for the contact. */ - public final CharSequence displayName; - public final Uri contactUri; - public final CharSequence phoneNumber; - - public final ArrayList<SmartDialMatchPosition> matchPositions; - public final SmartDialMatchPosition phoneNumberMatchPosition; - - public static final SmartDialEntry NULL = new SmartDialEntry("", Uri.EMPTY, "", - new ArrayList<SmartDialMatchPosition>(), null); - - public SmartDialEntry(CharSequence displayName, Uri contactUri, CharSequence phoneNumber, - ArrayList<SmartDialMatchPosition> matchPositions, - SmartDialMatchPosition phoneNumberMatchPosition) { - this.displayName = displayName; - this.contactUri = contactUri; - this.matchPositions = matchPositions; - this.phoneNumber = phoneNumber; - this.phoneNumberMatchPosition = phoneNumberMatchPosition; - } -} diff --git a/src/com/android/dialer/dialpad/SmartDialLoaderTask.java b/src/com/android/dialer/dialpad/SmartDialLoaderTask.java deleted file mode 100644 index 38a04ad8f..000000000 --- a/src/com/android/dialer/dialpad/SmartDialLoaderTask.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2012 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.dialpad; - -import android.content.Context; -import android.os.AsyncTask; -import android.provider.ContactsContract; -import android.provider.ContactsContract.Contacts; -import android.telephony.PhoneNumberUtils; - -import com.android.contacts.common.preference.ContactsPreferences; -import com.android.contacts.common.util.StopWatch; -import com.android.dialer.database.DialerDatabaseHelper; -import com.android.dialer.database.DialerDatabaseHelper.ContactNumber; - -import com.google.common.collect.Lists; - -import java.util.ArrayList; -import java.util.List; - -/** - * This task searches through the provided cache to return the top 3 contacts(ranked by confidence) - * that match the query, then passes it back to the {@link SmartDialLoaderCallback} through a - * callback function. - */ -public class SmartDialLoaderTask extends AsyncTask<String, Integer, List<SmartDialEntry>> { - private final String TAG = SmartDialLoaderTask.class.getSimpleName(); - - public interface SmartDialLoaderCallback { - void setSmartDialAdapterEntries(List<SmartDialEntry> list, String query); - } - - static private final boolean DEBUG = false; - - private final SmartDialLoaderCallback mCallback; - - private final DialerDatabaseHelper mDialerDatabaseHelper; - - private final String mQuery; - - private final SmartDialNameMatcher mNameMatcher; - - public SmartDialLoaderTask(SmartDialLoaderCallback callback, String query, Context context) { - this.mCallback = callback; - mDialerDatabaseHelper = DialerDatabaseHelper.getInstance(context); - this.mQuery = query; - this.mNameMatcher = new SmartDialNameMatcher(PhoneNumberUtils.normalizeNumber(query), - SmartDialPrefix.getMap()); - } - - @Override - protected List<SmartDialEntry> doInBackground(String... params) { - return getContactMatches(); - } - - @Override - protected void onPostExecute(List<SmartDialEntry> result) { - if (mCallback != null) { - mCallback.setSmartDialAdapterEntries(result, mQuery); - } - } - - /** - * Loads top visible contacts with phone numbers and check if their display names match the - * query. - */ - private ArrayList<SmartDialEntry> getContactMatches() { - - final StopWatch stopWatch = DEBUG ? StopWatch.start("Start Match") : null; - - final ArrayList<ContactNumber> allMatches = mDialerDatabaseHelper.getLooseMatches(mQuery, - mNameMatcher); - if (DEBUG) { - stopWatch.lap("Find matches"); - } - - final ArrayList<SmartDialEntry> candidates = Lists.newArrayList(); - for (ContactNumber contact : allMatches) { - final boolean matches = mNameMatcher.matches(contact.displayName); - candidates.add(new SmartDialEntry( - contact.displayName, - Contacts.getLookupUri(contact.id, contact.lookupKey), - contact.phoneNumber, - mNameMatcher.getMatchPositions(), - mNameMatcher.matchesNumber(contact.phoneNumber, mNameMatcher.getQuery()) - )); - } - if (DEBUG) { - stopWatch.stopAndLog(TAG + " Match Complete", 0); - } - return candidates; - } -} diff --git a/src/com/android/dialer/dialpad/SmartDialTextView.java b/src/com/android/dialer/dialpad/SmartDialTextView.java deleted file mode 100644 index 398f99ba5..000000000 --- a/src/com/android/dialer/dialpad/SmartDialTextView.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2012 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.dialpad; - -import android.content.Context; -import android.graphics.Paint; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.widget.TextView; - -import com.android.dialer.R; - -public class SmartDialTextView extends TextView { - - private final float mPadding; - private final float mExtraPadding; - - public SmartDialTextView(Context context) { - this(context, null); - } - - public SmartDialTextView(Context context, AttributeSet attrs) { - super(context, attrs); - mPadding = getResources().getDimension(R.dimen.smartdial_suggestions_padding); - mExtraPadding = getResources().getDimension(R.dimen.smartdial_suggestions_extra_padding); - } - - @Override - protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { - super.onTextChanged(text, start, lengthBefore, lengthAfter); - rescaleText(getWidth()); - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - rescaleText(w); - } - - private void rescaleText(int w) { - if (w == 0) { - return; - } - setTextScaleX(1); - final Paint paint = getPaint(); - float width = w - 2 * mPadding - 2 * mExtraPadding; - - float ratio = width / paint.measureText(getText().toString()); - TextUtils.TruncateAt ellipsizeAt = null; - if (ratio < 1.0f) { - if (ratio < 0.8f) { - // If the text is too big to fit even after scaling to 80%, just ellipsize it - // instead. - ellipsizeAt = TextUtils.TruncateAt.END; - setTextScaleX(0.8f); - } else { - setTextScaleX(ratio); - } - } - setEllipsize(ellipsizeAt); - } -} diff --git a/src/com/android/dialer/list/NewPhoneFavoriteMergedAdapter.java b/src/com/android/dialer/list/NewPhoneFavoriteMergedAdapter.java deleted file mode 100644 index 3c3200407..000000000 --- a/src/com/android/dialer/list/NewPhoneFavoriteMergedAdapter.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * Licensed to 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.content.Context; -import android.content.res.Resources; -import android.database.DataSetObserver; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.FrameLayout; - -import com.android.dialer.R; -import com.android.dialer.calllog.CallLogAdapter; - -/** - * An adapter that combines items from {@link com.android.contacts.common.list.ContactTileAdapter} - * and {@link com.android.dialer.calllog.CallLogAdapter} into a single list. - */ -public class NewPhoneFavoriteMergedAdapter extends BaseAdapter { - - private class CustomDataSetObserver extends DataSetObserver { - @Override - public void onChanged() { - notifyDataSetChanged(); - } - } - - private static final String TAG = NewPhoneFavoriteMergedAdapter.class.getSimpleName(); - - private final PhoneFavoritesTileAdapter mContactTileAdapter; - private final CallLogAdapter mCallLogAdapter; - private final View mLoadingView; - private final View mShowAllContactsButton; - - private final int mCallLogPadding; - - private final Context mContext; - - private final DataSetObserver mObserver; - - public NewPhoneFavoriteMergedAdapter(Context context, - PhoneFavoritesTileAdapter contactTileAdapter, - View accountFilterHeaderContainer, - CallLogAdapter callLogAdapter, - View loadingView, - View showAllContactsButton) { - final Resources resources = context.getResources(); - mContext = context; - mCallLogPadding = resources.getDimensionPixelSize(R.dimen.recent_call_log_item_padding); - mContactTileAdapter = contactTileAdapter; - mCallLogAdapter = callLogAdapter; - - mObserver = new CustomDataSetObserver(); - mContactTileAdapter.registerDataSetObserver(mObserver); - mLoadingView = loadingView; - mShowAllContactsButton = showAllContactsButton; - } - - @Override - public boolean isEmpty() { - // This adapter will always contain at least the all contacts button - return false; - } - - @Override - public int getCount() { - return mContactTileAdapter.getCount() + mCallLogAdapter.getCount() + 1; - } - - @Override - public Object getItem(int position) { - final int callLogAdapterCount = mCallLogAdapter.getCount(); - - if (callLogAdapterCount > 0) { - if (position < callLogAdapterCount) { - return mCallLogAdapter.getItem(position); - } - // Set position to the position of the actual favorite contact in the favorites adapter - position = getAdjustedFavoritePosition(position, callLogAdapterCount); - } - return mContactTileAdapter.getItem(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public int getViewTypeCount() { - return (mContactTileAdapter.getViewTypeCount() + mCallLogAdapter.getViewTypeCount() + 1); - } - - @Override - public int getItemViewType(int position) { - final int callLogAdapterCount = mCallLogAdapter.getCount(); - - if (position < callLogAdapterCount) { - // View type of the call log adapter is the last view type of the contact tile adapter - // + 1 - return mContactTileAdapter.getViewTypeCount(); - } 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 callLogAdapterCount = mCallLogAdapter.getCount(); - - if (position == getCount() - 1) { - return mShowAllContactsButton; - } - - if (callLogAdapterCount > 0) { - if (position == 0) { - final FrameLayout wrapper; - if (convertView == null) { - wrapper = new FrameLayout(mContext); - } else { - wrapper = (FrameLayout) convertView; - } - - // Special case wrapper view for the most recent call log item. This allows - // us to create a card-like effect for the more recent call log item in - // the PhoneFavoriteMergedAdapter, but keep the original look of the item in - // the CallLogAdapter. - final View view = mCallLogAdapter.getView(position, convertView == null ? - null : wrapper.getChildAt(0), parent); - wrapper.removeAllViews(); - view.setBackgroundResource(R.drawable.dialer_recent_card_bg); - - final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( - FrameLayout.LayoutParams.WRAP_CONTENT, - FrameLayout.LayoutParams.WRAP_CONTENT); - - params.setMarginsRelative(mCallLogPadding, mCallLogPadding, mCallLogPadding, - mCallLogPadding); - view.setLayoutParams(params); - wrapper.addView(view); - - return wrapper; - } - // Set position to the position of the actual favorite contact in the - // favorites adapter - position = getAdjustedFavoritePosition(position, callLogAdapterCount); - } - - // Favorites section - final View view = mContactTileAdapter.getView(position, convertView, parent); - if (position >= mContactTileAdapter.getMaxTiledRows()) { - final FrameLayout frameLayout = (FrameLayout) view; - final View child = frameLayout.getChildAt(0); - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( - FrameLayout.LayoutParams.WRAP_CONTENT, - FrameLayout.LayoutParams.WRAP_CONTENT); - child.setLayoutParams(params); - } - return view; - } - - @Override - public boolean areAllItemsEnabled() { - // If "all" section is being loaded we'll show mLoadingView, which is not enabled. - // Otherwise check the all the other components in the ListView and return appropriate - // result. - return mCallLogAdapter.areAllItemsEnabled() && mContactTileAdapter.areAllItemsEnabled(); - } - - @Override - public boolean isEnabled(int position) { - final int callLogAdapterCount = mCallLogAdapter.getCount(); - if (position < callLogAdapterCount) { - return mCallLogAdapter.isEnabled(position); - } else { // For favorites section - return mContactTileAdapter.isEnabled( - getAdjustedFavoritePosition(position, callLogAdapterCount)); - } - } - - private int getAdjustedFavoritePosition(int position, int callLogAdapterCount) { - return position - callLogAdapterCount; - } -} diff --git a/src/com/android/dialer/list/NewPhoneFavoriteFragment.java b/src/com/android/dialer/list/PhoneFavoriteFragment.java index 58dac2fb6..64a9b84d2 100644 --- a/src/com/android/dialer/list/NewPhoneFavoriteFragment.java +++ b/src/com/android/dialer/list/PhoneFavoriteFragment.java @@ -56,16 +56,15 @@ import com.android.dialer.calllog.CallLogQueryHandler; * {@link com.android.contacts.common.list.PhoneNumberListAdapter} into one unified list using {@link PhoneFavoriteMergedAdapter}. * A contact filter header is also inserted between those adapters' results. */ -public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickListener, +public class PhoneFavoriteFragment extends Fragment implements OnItemClickListener, CallLogQueryHandler.Listener, CallLogAdapter.CallFetcher { - private static final String TAG = NewPhoneFavoriteFragment.class.getSimpleName(); + private static final String TAG = PhoneFavoriteFragment.class.getSimpleName(); private static final boolean DEBUG = false; /** * Used with LoaderManager. */ private static int LOADER_ID_CONTACT_TILE = 1; - private static int LOADER_ID_ALL_CONTACTS = 2; public interface OnPhoneFavoriteFragmentStartedListener { public void onPhoneFavoriteFragmentStarted(); @@ -134,7 +133,7 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis private Listener mListener; private OnListFragmentScrolledListener mActivityScrollListener; - private NewPhoneFavoriteMergedAdapter mAdapter; + private PhoneFavoriteMergedAdapter mAdapter; private PhoneFavoritesTileAdapter mContactTileAdapter; private PhoneNumberListAdapter mAllContactsAdapter; @@ -203,7 +202,7 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View listLayout = inflater.inflate( - R.layout.new_phone_favorites_fragment, container, false); + R.layout.phone_favorites_fragment, container, false); mListView = (ListView) listLayout.findViewById(R.id.contact_tile_list); mListView.setItemsCanFocus(true); @@ -229,7 +228,7 @@ public class NewPhoneFavoriteFragment extends Fragment implements OnItemClickLis } }); - mAdapter = new NewPhoneFavoriteMergedAdapter(getActivity(), mContactTileAdapter, + mAdapter = new PhoneFavoriteMergedAdapter(getActivity(), mContactTileAdapter, mAccountFilterHeaderContainer, mCallLogAdapter, mLoadingView, mShowAllContactsButton); diff --git a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java index ba291a00f..0e5594ee5 100644 --- a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java +++ b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java @@ -23,19 +23,15 @@ import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.FrameLayout; -import android.widget.SectionIndexer; -import com.android.contacts.common.list.ContactEntryListAdapter; -import com.android.contacts.common.list.ContactListItemView; -import com.android.contacts.common.list.ContactTileAdapter; import com.android.dialer.R; +import com.android.dialer.calllog.CallLogAdapter; /** - * An adapter that combines items from {@link com.android.contacts.common.list.ContactTileAdapter} and - * {@link com.android.contacts.common.list.ContactEntryListAdapter} into a single list. In between those two results, - * an account filter header will be inserted. + * An adapter that combines items from {@link com.android.contacts.common.list.ContactTileAdapter} + * and {@link com.android.dialer.calllog.CallLogAdapter} into a single list. */ -public class PhoneFavoriteMergedAdapter extends BaseAdapter implements SectionIndexer { +public class PhoneFavoriteMergedAdapter extends BaseAdapter { private class CustomDataSetObserver extends DataSetObserver { @Override @@ -44,80 +40,60 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter implements SectionIn } } - private final ContactTileAdapter mContactTileAdapter; - private final ContactEntryListAdapter mContactEntryListAdapter; - private final View mAccountFilterHeaderContainer; + private static final String TAG = PhoneFavoriteMergedAdapter.class.getSimpleName(); + + private final PhoneFavoritesTileAdapter mContactTileAdapter; + private final CallLogAdapter mCallLogAdapter; private final View mLoadingView; + private final View mShowAllContactsButton; - private final int mItemPaddingLeft; - private final int mItemPaddingRight; + private final int mCallLogPadding; - // Make frequent header consistent with account filter header. - private final int mFrequentHeaderPaddingTop; + private final Context mContext; private final DataSetObserver mObserver; public PhoneFavoriteMergedAdapter(Context context, - ContactTileAdapter contactTileAdapter, + PhoneFavoritesTileAdapter contactTileAdapter, View accountFilterHeaderContainer, - ContactEntryListAdapter contactEntryListAdapter, - View loadingView) { - Resources resources = context.getResources(); - mItemPaddingLeft = resources.getDimensionPixelSize(R.dimen.detail_item_side_margin); - mItemPaddingRight = resources.getDimensionPixelSize(R.dimen.list_visible_scrollbar_padding); - mFrequentHeaderPaddingTop = resources.getDimensionPixelSize( - R.dimen.contact_browser_list_top_margin); + CallLogAdapter callLogAdapter, + View loadingView, + View showAllContactsButton) { + final Resources resources = context.getResources(); + mContext = context; + mCallLogPadding = resources.getDimensionPixelSize(R.dimen.recent_call_log_item_padding); mContactTileAdapter = contactTileAdapter; - mContactEntryListAdapter = contactEntryListAdapter; - - mAccountFilterHeaderContainer = accountFilterHeaderContainer; + mCallLogAdapter = callLogAdapter; mObserver = new CustomDataSetObserver(); mContactTileAdapter.registerDataSetObserver(mObserver); - mContactEntryListAdapter.registerDataSetObserver(mObserver); - mLoadingView = loadingView; + mShowAllContactsButton = showAllContactsButton; } @Override public boolean isEmpty() { - // Cannot use the super's method here because we add extra rows in getCount() to account - // for headers - return mContactTileAdapter.getCount() + mContactEntryListAdapter.getCount() == 0; + // This adapter will always contain at least the all contacts button + return false; } @Override public int getCount() { - final int contactTileAdapterCount = mContactTileAdapter.getCount(); - final int contactEntryListAdapterCount = mContactEntryListAdapter.getCount(); - if (mContactEntryListAdapter.isLoading()) { - // Hide "all" contacts during its being loaded. Instead show "loading" view. - // - // "+2" for mAccountFilterHeaderContainer and mLoadingView - return contactTileAdapterCount + 2; - } else { - // "+1" for mAccountFilterHeaderContainer - return contactTileAdapterCount + contactEntryListAdapterCount + 1; - } + return mContactTileAdapter.getCount() + mCallLogAdapter.getCount() + 1; } @Override public Object getItem(int position) { - final int contactTileAdapterCount = mContactTileAdapter.getCount(); - final int contactEntryListAdapterCount = mContactEntryListAdapter.getCount(); - if (position < contactTileAdapterCount) { // For "tile" and "frequent" sections - return mContactTileAdapter.getItem(position); - } else if (position == contactTileAdapterCount) { // For "all" section's account header - return mAccountFilterHeaderContainer; - } else { // For "all" section - if (mContactEntryListAdapter.isLoading()) { // "All" section is being loaded. - return mLoadingView; - } else { - // "-1" for mAccountFilterHeaderContainer - final int localPosition = position - contactTileAdapterCount - 1; - return mContactTileAdapter.getItem(localPosition); + final int callLogAdapterCount = mCallLogAdapter.getCount(); + + if (callLogAdapterCount > 0) { + if (position < callLogAdapterCount) { + return mCallLogAdapter.getItem(position); } + // Set position to the position of the actual favorite contact in the favorites adapter + position = getAdjustedFavoritePosition(position, callLogAdapterCount); } + return mContactTileAdapter.getItem(position); } @Override @@ -127,122 +103,80 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter implements SectionIn @Override public int getViewTypeCount() { - // "+2" for mAccountFilterHeaderContainer and mLoadingView - return (mContactTileAdapter.getViewTypeCount() - + mContactEntryListAdapter.getViewTypeCount() - + 2); + return (mContactTileAdapter.getViewTypeCount() + mCallLogAdapter.getViewTypeCount() + 1); } @Override public int getItemViewType(int position) { - final int contactTileAdapterCount = mContactTileAdapter.getCount(); - final int contactEntryListAdapterCount = mContactEntryListAdapter.getCount(); - // There should be four kinds of types that are usually used, and one more exceptional - // type (IGNORE_ITEM_VIEW_TYPE), which sometimes comes from mContactTileAdapter. - // - // The four ordinary view types have the index equal to or more than 0, and less than - // mContactTileAdapter.getViewTypeCount()+ mContactEntryListAdapter.getViewTypeCount() + 2. - // (See also this class's getViewTypeCount()) - // - // We have those values for: - // - The view types mContactTileAdapter originally has - // - The view types mContactEntryListAdapter originally has - // - mAccountFilterHeaderContainer ("all" section's account header), and - // - mLoadingView - // - // Those types should not be mixed, so we have a different range for each kinds of types: - // - Types for mContactTileAdapter ("tile" and "frequent" sections) - // They should have the index, >=0 and <mContactTileAdapter.getViewTypeCount() - // - // - Types for mContactEntryListAdapter ("all" sections) - // They should have the index, >=mContactTileAdapter.getViewTypeCount() and - // <(mContactTileAdapter.getViewTypeCount() + mContactEntryListAdapter.getViewTypeCount()) - // - // - Type for "all" section's account header - // It should have the exact index - // mContactTileAdapter.getViewTypeCount()+ mContactEntryListAdapter.getViewTypeCount() - // - // - Type for "loading" view used during "all" section is being loaded. - // It should have the exact index - // mContactTileAdapter.getViewTypeCount()+ mContactEntryListAdapter.getViewTypeCount() + 1 - // - // As an exception, IGNORE_ITEM_VIEW_TYPE (-1) will be remained as is, which will be used - // by framework's Adapter implementation and thus should be left as is. - if (position < contactTileAdapterCount) { // For "tile" and "frequent" sections - return mContactTileAdapter.getItemViewType(position); - } else if (position == contactTileAdapterCount) { // For "all" section's account header - return mContactTileAdapter.getViewTypeCount() - + mContactEntryListAdapter.getViewTypeCount(); - } else { // For "all" section - if (mContactEntryListAdapter.isLoading()) { // "All" section is being loaded. - return mContactTileAdapter.getViewTypeCount() - + mContactEntryListAdapter.getViewTypeCount() + 1; - } else { - // "-1" for mAccountFilterHeaderContainer - final int localPosition = position - contactTileAdapterCount - 1; - final int type = mContactEntryListAdapter.getItemViewType(localPosition); - // IGNORE_ITEM_VIEW_TYPE must be handled differently. - return (type < 0) ? type : type + mContactTileAdapter.getViewTypeCount(); - } + final int callLogAdapterCount = mCallLogAdapter.getCount(); + + if (position < callLogAdapterCount) { + // View type of the call log adapter is the last view type of the contact tile adapter + // + 1 + return mContactTileAdapter.getViewTypeCount(); + } 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 contactEntryListAdapterCount = mContactEntryListAdapter.getCount(); + final int callLogAdapterCount = mCallLogAdapter.getCount(); + + if (position == getCount() - 1) { + return mShowAllContactsButton; + } - // Obtain a View relevant for that position, and adjust its horizontal padding. Each - // View has different implementation, so we use different way to control those padding. - if (position < contactTileAdapterCount) { // For "tile" and "frequent" sections - final View view = mContactTileAdapter.getView(position, convertView, parent); - final int frequentHeaderPosition = mContactTileAdapter.getFrequentHeaderPosition(); - if (position < frequentHeaderPosition) { // "starred" contacts - // No padding adjustment. - } else if (position == frequentHeaderPosition) { - view.setPadding(mItemPaddingLeft, mFrequentHeaderPaddingTop, - mItemPaddingRight, view.getPaddingBottom()); - } else { - // Views for "frequent" contacts use FrameLayout's margins instead of padding. - final FrameLayout frameLayout = (FrameLayout) view; - final View child = frameLayout.getChildAt(0); - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( + if (callLogAdapterCount > 0) { + if (position == 0) { + final FrameLayout wrapper; + if (convertView == null) { + wrapper = new FrameLayout(mContext); + } else { + wrapper = (FrameLayout) convertView; + } + + // Special case wrapper view for the most recent call log item. This allows + // us to create a card-like effect for the more recent call log item in + // the PhoneFavoriteMergedAdapter, but keep the original look of the item in + // the CallLogAdapter. + final View view = mCallLogAdapter.getView(position, convertView == null ? + null : wrapper.getChildAt(0), parent); + wrapper.removeAllViews(); + view.setBackgroundResource(R.drawable.dialer_recent_card_bg); + + final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); - params.setMargins(mItemPaddingLeft, 0, mItemPaddingRight, 0); - child.setLayoutParams(params); - } - return view; - } else if (position == contactTileAdapterCount) { // For "all" section's account header - mAccountFilterHeaderContainer.setPadding(mItemPaddingLeft, - mAccountFilterHeaderContainer.getPaddingTop(), - mItemPaddingRight, - mAccountFilterHeaderContainer.getPaddingBottom()); - // Show a single "No Contacts" label under the "all" section account header - // if no contacts are displayed. - mAccountFilterHeaderContainer.findViewById( - R.id.contact_list_all_empty).setVisibility( - contactEntryListAdapterCount == 0 ? View.VISIBLE : View.GONE); - return mAccountFilterHeaderContainer; - } else { // For "all" section - if (mContactEntryListAdapter.isLoading()) { // "All" section is being loaded. - mLoadingView.setPadding(mItemPaddingLeft, - mLoadingView.getPaddingTop(), - mItemPaddingRight, - mLoadingView.getPaddingBottom()); - return mLoadingView; - } else { - // "-1" for mAccountFilterHeaderContainer - final int localPosition = position - contactTileAdapterCount - 1; - final ContactListItemView itemView = (ContactListItemView) - mContactEntryListAdapter.getView(localPosition, convertView, null); - itemView.setPadding(mItemPaddingLeft, itemView.getPaddingTop(), - mItemPaddingRight, itemView.getPaddingBottom()); - itemView.setSelectionBoundsHorizontalMargin(mItemPaddingLeft, mItemPaddingRight); - return itemView; + params.setMarginsRelative(mCallLogPadding, mCallLogPadding, mCallLogPadding, + mCallLogPadding); + view.setLayoutParams(params); + wrapper.addView(view); + + return wrapper; } + // Set position to the position of the actual favorite contact in the + // favorites adapter + position = getAdjustedFavoritePosition(position, callLogAdapterCount); + } + + // Favorites section + final View view = mContactTileAdapter.getView(position, convertView, parent); + if (position >= mContactTileAdapter.getMaxTiledRows()) { + final FrameLayout frameLayout = (FrameLayout) view; + final View child = frameLayout.getChildAt(0); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT); + child.setLayoutParams(params); } + return view; } @Override @@ -250,58 +184,21 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter implements SectionIn // If "all" section is being loaded we'll show mLoadingView, which is not enabled. // Otherwise check the all the other components in the ListView and return appropriate // result. - return !mContactEntryListAdapter.isLoading() - && (mContactTileAdapter.areAllItemsEnabled() - && mAccountFilterHeaderContainer.isEnabled() - && mContactEntryListAdapter.areAllItemsEnabled()); + return mCallLogAdapter.areAllItemsEnabled() && mContactTileAdapter.areAllItemsEnabled(); } @Override public boolean isEnabled(int position) { - final int contactTileAdapterCount = mContactTileAdapter.getCount(); - final int contactEntryListAdapterCount = mContactEntryListAdapter.getCount(); - if (position < contactTileAdapterCount) { // For "tile" and "frequent" sections - return mContactTileAdapter.isEnabled(position); - } else if (position == contactTileAdapterCount) { // For "all" section's account header - // This will be handled by View's onClick event instead of ListView's onItemClick event. - return false; - } else { // For "all" section - if (mContactEntryListAdapter.isLoading()) { // "All" section is being loaded. - return false; - } else { - // "-1" for mAccountFilterHeaderContainer - final int localPosition = position - contactTileAdapterCount - 1; - return mContactEntryListAdapter.isEnabled(localPosition); - } + final int callLogAdapterCount = mCallLogAdapter.getCount(); + if (position < callLogAdapterCount) { + return mCallLogAdapter.isEnabled(position); + } else { // For favorites section + return mContactTileAdapter.isEnabled( + getAdjustedFavoritePosition(position, callLogAdapterCount)); } } - @Override - public int getPositionForSection(int sectionIndex) { - final int contactTileAdapterCount = mContactTileAdapter.getCount(); - final int localPosition = mContactEntryListAdapter.getPositionForSection(sectionIndex); - return contactTileAdapterCount + 1 + localPosition; - } - - @Override - public int getSectionForPosition(int position) { - final int contactTileAdapterCount = mContactTileAdapter.getCount(); - if (position <= contactTileAdapterCount) { - return 0; - } else { - // "-1" for mAccountFilterHeaderContainer - final int localPosition = position - contactTileAdapterCount - 1; - return mContactEntryListAdapter.getSectionForPosition(localPosition); - } - } - - @Override - public Object[] getSections() { - return mContactEntryListAdapter.getSections(); - } - - public boolean shouldShowFirstScroller(int firstVisibleItem) { - final int contactTileAdapterCount = mContactTileAdapter.getCount(); - return firstVisibleItem > contactTileAdapterCount; + private int getAdjustedFavoritePosition(int position, int callLogAdapterCount) { + return position - callLogAdapterCount; } } |