summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristine Chen <christinech@google.com>2013-10-03 14:59:11 -0700
committerChristine Chen <christinech@google.com>2013-10-03 15:00:09 -0700
commit1f06f0ad1229f3b4e00553c294e664ffa5234c90 (patch)
tree01c3e849d29b7f51c8ddebfb4697ac6c9b8c3494 /src
parent6da93994e24403f67276195bd94f03c9380b0a13 (diff)
Adds tooltip for Dialer
Bug: 10916819 Change-Id: Ic18f982a6d478b165f576361cfec6edb8c6eb1c3
Diffstat (limited to 'src')
-rw-r--r--src/com/android/dialer/list/PhoneFavoriteFragment.java9
-rw-r--r--src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java63
-rw-r--r--src/com/android/dialer/list/PhoneFavoritesTileAdapter.java6
-rw-r--r--src/com/android/dialer/list/TileInteractionTeaserView.java153
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);
+ }
+ }
+}