diff options
author | Christine Chen <christinech@google.com> | 2013-10-03 14:59:11 -0700 |
---|---|---|
committer | Christine Chen <christinech@google.com> | 2013-10-03 15:00:09 -0700 |
commit | 1f06f0ad1229f3b4e00553c294e664ffa5234c90 (patch) | |
tree | 01c3e849d29b7f51c8ddebfb4697ac6c9b8c3494 /src | |
parent | 6da93994e24403f67276195bd94f03c9380b0a13 (diff) |
Adds tooltip for Dialer
Bug: 10916819
Change-Id: Ic18f982a6d478b165f576361cfec6edb8c6eb1c3
Diffstat (limited to 'src')
4 files changed, 216 insertions, 15 deletions
diff --git a/src/com/android/dialer/list/PhoneFavoriteFragment.java b/src/com/android/dialer/list/PhoneFavoriteFragment.java index 7e8ff0f59..73703a02c 100644 --- a/src/com/android/dialer/list/PhoneFavoriteFragment.java +++ b/src/com/android/dialer/list/PhoneFavoriteFragment.java @@ -199,6 +199,8 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen private View mShowAllContactsInEmptyViewButton; private View mContactTileFrame; + private TileInteractionTeaserView mTileInteractionTeaserView; + private final HashMap<Long, Integer> mItemIdTopMap = new HashMap<Long, Integer>(); private final HashMap<Long, Integer> mItemIdLeftMap = new HashMap<Long, Integer>(); @@ -306,8 +308,13 @@ public class PhoneFavoriteFragment extends Fragment implements OnItemClickListen mContactTileFrame = mParentView.findViewById(R.id.contact_tile_frame); + mTileInteractionTeaserView = (TileInteractionTeaserView) inflater.inflate( + R.layout.tile_interactions_teaser_view, mListView, false); + mAdapter = new PhoneFavoriteMergedAdapter(getActivity(), this, mContactTileAdapter, - mCallLogAdapter, mShowAllContactsButton); + mCallLogAdapter, mShowAllContactsButton, mTileInteractionTeaserView); + + mTileInteractionTeaserView.setAdapter(mAdapter); mListView.setAdapter(mAdapter); diff --git a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java index 1f577c194..daba39e6d 100644 --- a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java +++ b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java @@ -49,11 +49,14 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { private static final String TAG = PhoneFavoriteMergedAdapter.class.getSimpleName(); + private static final int TILE_INTERACTION_TEASER_VIEW_POSITION = 2; + private static final int TILE_INTERACTION_TEASER_VIEW_ID = -2; private static final int ALL_CONTACTS_BUTTON_ITEM_ID = -1; private final PhoneFavoritesTileAdapter mContactTileAdapter; private final CallLogAdapter mCallLogAdapter; private final View mShowAllContactsButton; private final PhoneFavoriteFragment mFragment; + private final TileInteractionTeaserView mTileInteractionTeaserView; private final int mCallLogPadding; @@ -100,7 +103,8 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { PhoneFavoriteFragment fragment, PhoneFavoritesTileAdapter contactTileAdapter, CallLogAdapter callLogAdapter, - View showAllContactsButton) { + View showAllContactsButton, + TileInteractionTeaserView tileInteractionTeaserView) { final Resources resources = context.getResources(); mContext = context; mFragment = fragment; @@ -111,6 +115,7 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { mCallLogAdapter.registerDataSetObserver(mObserver); mContactTileAdapter.registerDataSetObserver(mObserver); mShowAllContactsButton = showAllContactsButton; + mTileInteractionTeaserView = tileInteractionTeaserView; mCallLogQueryHandler = new CallLogQueryHandler(mContext.getContentResolver(), mCallLogQueryHandlerListener); } @@ -118,7 +123,8 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { @Override public int getCount() { if (mContactTileAdapter.getCount() > 0) { - return mContactTileAdapter.getCount() + mCallLogAdapter.getCount() + 1; + return mContactTileAdapter.getCount() + mCallLogAdapter.getCount() + 1 + + getTeaserViewCount(); } else { return mCallLogAdapter.getCount(); } @@ -132,9 +138,10 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { 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); } + // Set position to the position of the actual favorite contact in the favorites adapter + position = getAdjustedFavoritePosition(position, callLogAdapterCount); + return mContactTileAdapter.getItem(position); } @@ -144,7 +151,8 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { * * These are the ranges of IDs reserved for each item type. * - * -(N + 1) to -2: CallLogAdapterItems, where N is equal to the number of call log items + * -(N + 1) to -3: CallLogAdapterItems, where N is equal to the number of call log items + * -2: Teaser * -1: All contacts button * 0 to (N -1): Rows of tiled contacts, where N is equal to the max rows of tiled contacts * N to infinity: Rows of regular contacts. Their item id is calculated by N + contact_id, @@ -155,9 +163,14 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { final int callLogAdapterCount = mCallLogAdapter.getCount(); if (position < callLogAdapterCount) { // Call log items are not animated, so reusing their position for IDs is fine. - return ALL_CONTACTS_BUTTON_ITEM_ID - 1 - position; - } else if (position < (callLogAdapterCount + mContactTileAdapter.getCount())) { - return mContactTileAdapter.getItemId(position - callLogAdapterCount); + return ALL_CONTACTS_BUTTON_ITEM_ID - 2 - position; + } else if (position == TILE_INTERACTION_TEASER_VIEW_POSITION + callLogAdapterCount && + mTileInteractionTeaserView.getShouldDisplayInList()){ + return TILE_INTERACTION_TEASER_VIEW_ID; + } else if (position < (callLogAdapterCount + mContactTileAdapter.getCount() + + getTeaserViewCount())) { + return mContactTileAdapter.getItemId( + getAdjustedFavoritePosition(position, callLogAdapterCount)); } else { // All contacts button return ALL_CONTACTS_BUTTON_ITEM_ID; @@ -171,7 +184,10 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { @Override public int getViewTypeCount() { - return (mContactTileAdapter.getViewTypeCount() + mCallLogAdapter.getViewTypeCount() + 1); + return (mContactTileAdapter.getViewTypeCount() + /* Favorite and frequent */ + mCallLogAdapter.getViewTypeCount() + /* Recent call log */ + getTeaserViewCount() + /* Teaser */ + 1); /* Show all contacts button. */ } @Override @@ -182,6 +198,10 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { // View type of the call log adapter is the last view type of the contact tile adapter // + 1 return mContactTileAdapter.getViewTypeCount(); + } else if (position == TILE_INTERACTION_TEASER_VIEW_POSITION + callLogAdapterCount && + mTileInteractionTeaserView.getShouldDisplayInList()) { + // View type of the teaser row is the last view type of the contact tile adapter + 3 + return mContactTileAdapter.getViewTypeCount() + 2; } else if (position < getCount() - 1) { return mContactTileAdapter.getItemViewType( getAdjustedFavoritePosition(position, callLogAdapterCount)); @@ -200,6 +220,12 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { return mShowAllContactsButton; } + if (mTileInteractionTeaserView.getShouldDisplayInList()) { + if (position == TILE_INTERACTION_TEASER_VIEW_POSITION + callLogAdapterCount) { + return mTileInteractionTeaserView; + } + } + if (callLogAdapterCount > 0) { if (position == 0) { final SwipeableCallLogRow wrapper; @@ -224,11 +250,12 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { wrapper.addView(view); return wrapper; } - // Set position to the position of the actual favorite contact in the - // favorites adapter - position = getAdjustedFavoritePosition(position, callLogAdapterCount); } + // 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()) { @@ -259,7 +286,17 @@ public class PhoneFavoriteMergedAdapter extends BaseAdapter { } private int getAdjustedFavoritePosition(int position, int callLogAdapterCount) { - return position - callLogAdapterCount; + if (position - callLogAdapterCount > TILE_INTERACTION_TEASER_VIEW_POSITION && + mTileInteractionTeaserView.getShouldDisplayInList()) { + return position - callLogAdapterCount - 1; + } else { + return position - callLogAdapterCount; + } + } + + private int getTeaserViewCount() { + return (mContactTileAdapter.getCount() > TILE_INTERACTION_TEASER_VIEW_POSITION && + mTileInteractionTeaserView.getShouldDisplayInList() ? 1 : 0); } /** diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java index a4a2cb418..e28fd73f3 100644 --- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java +++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java @@ -505,7 +505,11 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements int itemViewType = getItemViewType(position); - ContactTileRow contactTileRowView = (ContactTileRow) convertView; + ContactTileRow contactTileRowView = null; + + if (convertView instanceof ContactTileRow) { + contactTileRowView = (ContactTileRow) convertView; + } ArrayList<ContactEntry> contactList = getItem(position); diff --git a/src/com/android/dialer/list/TileInteractionTeaserView.java b/src/com/android/dialer/list/TileInteractionTeaserView.java new file mode 100644 index 000000000..6e70fd186 --- /dev/null +++ b/src/com/android/dialer/list/TileInteractionTeaserView.java @@ -0,0 +1,153 @@ +package com.android.dialer.list; + +import android.animation.Animator; + +import android.animation.ValueAnimator; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.animation.DecelerateInterpolator; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.android.dialer.DialtactsActivity; +import com.android.dialer.R; + +/** + * A teaser to introduce people to the contact photo check boxes + */ +public class TileInteractionTeaserView extends FrameLayout { + private static int sShrinkAnimationDuration; + + private static final String KEY_TILE_INTERACTION_TEASER_SHOWN = + "key_tile_interaction_teaser_shown"; + + private boolean mNeedLayout; + private int mTextTop; + private int mAnimatedHeight = -1; + + private PhoneFavoriteMergedAdapter mAdapter; + + public TileInteractionTeaserView(final Context context) { + this(context, null); + } + + public TileInteractionTeaserView(final Context context, final AttributeSet attrs) { + super(context, attrs); + final Resources resources = context.getResources(); + + mNeedLayout = true; + sShrinkAnimationDuration = resources.getInteger(R.integer.escape_animation_duration); + } + + @Override + protected void onFinishInflate() { + findViewById(R.id.dismiss_button).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + startDestroyAnimation(); + } + }); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + final TextView text = (TextView) findViewById(R.id.text); + final ImageView arrow = (ImageView) findViewById(R.id.arrow); + + // We post to avoid calling layout within layout + arrow.post(new Runnable() { + @Override + public void run() { + + // The text top is changed when we move the arrow, so we need to + // do multiple passes + int textTop = text.getTop(); + if (mNeedLayout || textTop != mTextTop) { + mNeedLayout = false; + mTextTop = textTop; + + final int lineHeight = text.getLineHeight(); + final LinearLayout.LayoutParams arrowParams = (LinearLayout.LayoutParams) arrow + .getLayoutParams(); + arrowParams.topMargin = mTextTop + lineHeight / 2; + arrow.setLayoutParams(arrowParams); + } + arrow.setVisibility(View.VISIBLE); + } + }); + } + + public boolean getShouldDisplayInList() { + final SharedPreferences prefs = getContext().getSharedPreferences( + DialtactsActivity.SHARED_PREFS_NAME, Context.MODE_PRIVATE); + return prefs.getBoolean(KEY_TILE_INTERACTION_TEASER_SHOWN, true); + } + + public void setAdapter(PhoneFavoriteMergedAdapter adapter) { + mAdapter = adapter; + } + + private void startDestroyAnimation() { + final int start = getHeight(); + final int end = 0; + mAnimatedHeight = start; + Log.v("Interaction", "Start from" + start); + + ValueAnimator heightAnimator = ValueAnimator.ofInt(start, end); + heightAnimator.setDuration(sShrinkAnimationDuration); + heightAnimator.setInterpolator(new DecelerateInterpolator(2.0f)); + heightAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + public void onAnimationUpdate(ValueAnimator animation) { + mAnimatedHeight = (Integer) animation.getAnimatedValue(); + requestLayout(); + } + }); + heightAnimator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) { + } + + @Override + public void onAnimationEnd(Animator animator) { + setVisibility(GONE); + setDismissed(); + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } + } + + @Override + public void onAnimationCancel(Animator animator) { + } + + @Override + public void onAnimationRepeat(Animator animator) { + } + }); + + heightAnimator.start(); + } + + private void setDismissed() { + final SharedPreferences prefs = getContext().getSharedPreferences( + DialtactsActivity.SHARED_PREFS_NAME, Context.MODE_PRIVATE); + prefs.edit().putBoolean(KEY_TILE_INTERACTION_TEASER_SHOWN, false).apply(); + } + + @Override + protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { + if (mAnimatedHeight == -1) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } else { + setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mAnimatedHeight); + } + } +} |