11f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenpackage com.android.dialer.list; 21f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 31f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.animation.Animator; 41f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 51f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.animation.ValueAnimator; 61f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.content.Context; 71f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.content.SharedPreferences; 81f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.content.res.Resources; 91f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.util.AttributeSet; 101f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.util.Log; 111f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.view.View; 121f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.view.animation.DecelerateInterpolator; 131f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.widget.FrameLayout; 141f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.widget.ImageView; 151f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.widget.LinearLayout; 161f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport android.widget.TextView; 171f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 181f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport com.android.dialer.DialtactsActivity; 191f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenimport com.android.dialer.R; 201f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 211f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen/** 221f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen * A teaser to introduce people to the contact photo check boxes 231f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen */ 241f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chenpublic class TileInteractionTeaserView extends FrameLayout { 251f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen private static int sShrinkAnimationDuration; 261f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 271f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen private static final String KEY_TILE_INTERACTION_TEASER_SHOWN = 281f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen "key_tile_interaction_teaser_shown"; 291f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 301f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen private boolean mNeedLayout; 311f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen private int mTextTop; 321f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen private int mAnimatedHeight = -1; 331f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 34d999b71452baebec789f6f58f1955d30e834826dYorke Lee private ShortcutCardsAdapter mAdapter; 351f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 361f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen public TileInteractionTeaserView(final Context context) { 371f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen this(context, null); 381f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 391f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 401f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen public TileInteractionTeaserView(final Context context, final AttributeSet attrs) { 411f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen super(context, attrs); 421f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen final Resources resources = context.getResources(); 431f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 441f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen mNeedLayout = true; 451f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen sShrinkAnimationDuration = resources.getInteger(R.integer.escape_animation_duration); 461f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 471f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 481f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen @Override 491f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen protected void onFinishInflate() { 501f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen findViewById(R.id.dismiss_button).setOnClickListener(new OnClickListener() { 511f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen @Override 521f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen public void onClick(View v) { 531f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen startDestroyAnimation(); 541f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 551f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen }); 561f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 571f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 581f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen @Override 591f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 601f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen super.onLayout(changed, left, top, right, bottom); 611f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 621f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen final TextView text = (TextView) findViewById(R.id.text); 631f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen final ImageView arrow = (ImageView) findViewById(R.id.arrow); 641f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 651f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen // We post to avoid calling layout within layout 661f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen arrow.post(new Runnable() { 671f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen @Override 681f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen public void run() { 691f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 701f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen // The text top is changed when we move the arrow, so we need to 711f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen // do multiple passes 721f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen int textTop = text.getTop(); 731f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen if (mNeedLayout || textTop != mTextTop) { 741f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen mNeedLayout = false; 751f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen mTextTop = textTop; 761f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 771f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen final int lineHeight = text.getLineHeight(); 781f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen final LinearLayout.LayoutParams arrowParams = (LinearLayout.LayoutParams) arrow 791f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen .getLayoutParams(); 801f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen arrowParams.topMargin = mTextTop + lineHeight / 2; 811f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen arrow.setLayoutParams(arrowParams); 821f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 831f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen arrow.setVisibility(View.VISIBLE); 841f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 851f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen }); 861f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 871f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 881f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen public boolean getShouldDisplayInList() { 891f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen final SharedPreferences prefs = getContext().getSharedPreferences( 901f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen DialtactsActivity.SHARED_PREFS_NAME, Context.MODE_PRIVATE); 911f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen return prefs.getBoolean(KEY_TILE_INTERACTION_TEASER_SHOWN, true); 921f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 931f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 94d999b71452baebec789f6f58f1955d30e834826dYorke Lee public void setAdapter(ShortcutCardsAdapter adapter) { 951f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen mAdapter = adapter; 961f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 971f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 981f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen private void startDestroyAnimation() { 991f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen final int start = getHeight(); 1001f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen final int end = 0; 1011f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen mAnimatedHeight = start; 1021f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen Log.v("Interaction", "Start from" + start); 1031f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 1041f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen ValueAnimator heightAnimator = ValueAnimator.ofInt(start, end); 1051f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen heightAnimator.setDuration(sShrinkAnimationDuration); 1061f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen heightAnimator.setInterpolator(new DecelerateInterpolator(2.0f)); 1071f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen heightAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 1081f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen public void onAnimationUpdate(ValueAnimator animation) { 1091f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen mAnimatedHeight = (Integer) animation.getAnimatedValue(); 1101f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen requestLayout(); 1111f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 1121f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen }); 1131f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen heightAnimator.addListener(new Animator.AnimatorListener() { 1141f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen @Override 1151f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen public void onAnimationStart(Animator animator) { 1161f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 1171f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 1181f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen @Override 1191f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen public void onAnimationEnd(Animator animator) { 1201f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen setVisibility(GONE); 1211f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen setDismissed(); 1221f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen if (mAdapter != null) { 1231f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen mAdapter.notifyDataSetChanged(); 1241f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 1251f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 1261f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 1271f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen @Override 1281f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen public void onAnimationCancel(Animator animator) { 1291f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 1301f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 1311f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen @Override 1321f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen public void onAnimationRepeat(Animator animator) { 1331f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 1341f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen }); 1351f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 1361f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen heightAnimator.start(); 1371f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 1381f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 1391f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen private void setDismissed() { 1401f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen final SharedPreferences prefs = getContext().getSharedPreferences( 1411f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen DialtactsActivity.SHARED_PREFS_NAME, Context.MODE_PRIVATE); 1421f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen prefs.edit().putBoolean(KEY_TILE_INTERACTION_TEASER_SHOWN, false).apply(); 1431f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 1441f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen 1451f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen @Override 1461f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 1471f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen if (mAnimatedHeight == -1) { 1481f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen super.onMeasure(widthMeasureSpec, heightMeasureSpec); 1491f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } else { 1501f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mAnimatedHeight); 1511f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 1521f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen } 1531f06f0ad1229f3b4e00553c294e664ffa5234c90Christine Chen} 154