diff options
-rw-r--r-- | res/layout/phone_favorites_fragment.xml | 2 | ||||
-rw-r--r-- | src/com/android/dialer/list/PhoneFavoriteFragment.java | 38 | ||||
-rw-r--r-- | src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java | 7 |
3 files changed, 35 insertions, 12 deletions
diff --git a/res/layout/phone_favorites_fragment.xml b/res/layout/phone_favorites_fragment.xml index f518f0b92..363565a5d 100644 --- a/res/layout/phone_favorites_fragment.xml +++ b/res/layout/phone_favorites_fragment.xml @@ -27,7 +27,7 @@ <FrameLayout android:id="@+id/contact_tile_frame" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"> diff --git a/src/com/android/dialer/list/PhoneFavoriteFragment.java b/src/com/android/dialer/list/PhoneFavoriteFragment.java index d4fa7d492..8ff9766e9 100644 --- a/src/com/android/dialer/list/PhoneFavoriteFragment.java +++ b/src/com/android/dialer/list/PhoneFavoriteFragment.java @@ -73,6 +73,15 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen CallLogQueryHandler.Listener, CallLogAdapter.CallFetcher, PhoneFavoritesTileAdapter.OnDataSetChangedForAnimationListener { + /** + * By default, the animation code assumes that all items in a list view are of the same height + * when animating new list items into view (e.g. from the bottom of the screen into view). + * This can cause incorrect translation offsets when a item that is larger or smaller than + * other list item is removed from the list. This key is used to provide the actual height + * of the removed object so that the actual translation appears correct to the user. + */ + private static final long KEY_REMOVED_ITEM_HEIGHT = Long.MAX_VALUE; + private static final String TAG = PhoneFavoriteFragment.class.getSimpleName(); private static final boolean DEBUG = false; @@ -378,6 +387,7 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen @Override public void onCallsFetched(Cursor cursor) { + animateListView(); mCallLogAdapter.setLoading(false); // Save the date of the most recent call log item @@ -386,7 +396,6 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen } mCallLogAdapter.changeCursor(cursor); - mAdapter.notifyDataSetChanged(); } @@ -409,7 +418,7 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen * Saves the current view offsets into memory */ @SuppressWarnings("unchecked") - private void saveOffsets(long... idsInPlace) { + private void saveOffsets(int removedItemHeight) { final int firstVisiblePosition = mListView.getFirstVisiblePosition(); if (DEBUG) { Log.d(TAG, "Child count : " + mListView.getChildCount()); @@ -422,7 +431,7 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen if (itemViewType == PhoneFavoritesTileAdapter.ViewTypes.TOP) { // This is a tiled row, so save horizontal offsets instead saveHorizontalOffsets((ContactTileRow) child, (ArrayList<ContactEntry>) - mAdapter.getItem(position), idsInPlace); + mAdapter.getItem(position)); } if (DEBUG) { Log.d(TAG, "Saving itemId: " + itemId + " for listview child " + i + " Top: " @@ -430,10 +439,11 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen } mItemIdTopMap.put(itemId, child.getTop()); } + + mItemIdTopMap.put(KEY_REMOVED_ITEM_HEIGHT, removedItemHeight); } - private void saveHorizontalOffsets(ContactTileRow row, ArrayList<ContactEntry> list, - long... idsInPlace) { + private void saveHorizontalOffsets(ContactTileRow row, ArrayList<ContactEntry> list) { for (int i = 0; i < list.size(); i++) { final View child = row.getChildAt(i); final ContactEntry entry = list.get(i); @@ -503,6 +513,9 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen // (dragging, swiping etc) that requires an animation. return; } + + final int removedItemHeight = mItemIdTopMap.get(KEY_REMOVED_ITEM_HEIGHT); + final ViewTreeObserver observer = mListView.getViewTreeObserver(); observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @SuppressWarnings("unchecked") @@ -540,8 +553,14 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen // Animate new views along with the others. The catch is that they did // not exist in the start state, so we must calculate their starting // position based on neighboring views. - int childHeight = child.getHeight() + mListView.getDividerHeight(); - startTop = top + (i > 0 ? childHeight : -childHeight); + + final int itemHeight; + if (removedItemHeight == 0) { + itemHeight = child.getHeight() + mListView.getDividerHeight(); + } else { + itemHeight = removedItemHeight; + } + startTop = top + (i > 0 ? itemHeight : -itemHeight); delta = startTop - top; } else { // In case the first non-square row is pushed down @@ -591,10 +610,11 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen @Override public void cacheOffsetsForDatasetChange() { - saveOffsets(); + saveOffsets(0); } - public void dismissShortcut() { + public void dismissShortcut(int height) { + saveOffsets(height); mLastCallShortcutDate = mCurrentCallShortcutDate; final SharedPreferences prefs = getActivity().getSharedPreferences( DialtactsActivity.SHARED_PREFS_NAME, Context.MODE_PRIVATE); diff --git a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java index 334743774..1f577c194 100644 --- a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java +++ b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java @@ -71,7 +71,7 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { mCallLogQueryHandler.markNewVoicemailsAsOld(); CallLogNotificationsHelper.removeMissedCallNotifications(); CallLogNotificationsHelper.updateVoicemailNotifications(mContext); - mFragment.dismissShortcut(); + mFragment.dismissShortcut(((View) view.getParent()).getHeight()); } @Override @@ -217,6 +217,10 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { final View view = mCallLogAdapter.getView(position, convertView == null ? null : wrapper.getChildAt(0), parent); wrapper.removeAllViews(); + final View callLogItem = view.findViewById(R.id.call_log_list_item); + // Reset the internal call log item view if it is being recycled + callLogItem.setTranslationX(0); + callLogItem.setAlpha(1); wrapper.addView(view); return wrapper; } @@ -319,7 +323,6 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { if (v != null && mOnItemSwipeListener != null) { mOnItemSwipeListener.onSwipe(v); } - removeAllViews(); } @Override |