• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.dialer.list;
2 
3 import android.animation.Animator;
4 
5 import android.animation.ValueAnimator;
6 import android.content.Context;
7 import android.content.SharedPreferences;
8 import android.content.res.Resources;
9 import android.util.AttributeSet;
10 import android.util.Log;
11 import android.view.View;
12 import android.view.animation.DecelerateInterpolator;
13 import android.widget.FrameLayout;
14 import android.widget.ImageView;
15 import android.widget.LinearLayout;
16 import android.widget.TextView;
17 
18 import com.android.dialer.DialtactsActivity;
19 import com.android.dialer.R;
20 
21 /**
22  * A teaser to introduce people to the contact photo check boxes
23  */
24 public class TileInteractionTeaserView extends FrameLayout {
25     private static int sShrinkAnimationDuration;
26 
27     private static final String KEY_TILE_INTERACTION_TEASER_SHOWN =
28             "key_tile_interaction_teaser_shown";
29 
30     private boolean mNeedLayout;
31     private int mTextTop;
32     private int mAnimatedHeight = -1;
33 
34     private PhoneFavoriteMergedAdapter mAdapter;
35 
TileInteractionTeaserView(final Context context)36     public TileInteractionTeaserView(final Context context) {
37         this(context, null);
38     }
39 
TileInteractionTeaserView(final Context context, final AttributeSet attrs)40     public TileInteractionTeaserView(final Context context, final AttributeSet attrs) {
41         super(context, attrs);
42         final Resources resources = context.getResources();
43 
44         mNeedLayout = true;
45         sShrinkAnimationDuration = resources.getInteger(R.integer.escape_animation_duration);
46     }
47 
48     @Override
onFinishInflate()49     protected void onFinishInflate() {
50         findViewById(R.id.dismiss_button).setOnClickListener(new OnClickListener() {
51             @Override
52             public void onClick(View v) {
53                 startDestroyAnimation();
54             }
55         });
56     }
57 
58     @Override
onLayout(boolean changed, int left, int top, int right, int bottom)59     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
60         super.onLayout(changed, left, top, right, bottom);
61 
62         final TextView text = (TextView) findViewById(R.id.text);
63         final ImageView arrow = (ImageView) findViewById(R.id.arrow);
64 
65         // We post to avoid calling layout within layout
66         arrow.post(new Runnable() {
67             @Override
68             public void run() {
69 
70                 // The text top is changed when we move the arrow, so we need to
71                 // do multiple passes
72                 int textTop = text.getTop();
73                 if (mNeedLayout || textTop != mTextTop) {
74                     mNeedLayout = false;
75                     mTextTop = textTop;
76 
77                     final int lineHeight = text.getLineHeight();
78                     final LinearLayout.LayoutParams arrowParams = (LinearLayout.LayoutParams) arrow
79                             .getLayoutParams();
80                     arrowParams.topMargin = mTextTop + lineHeight / 2;
81                     arrow.setLayoutParams(arrowParams);
82                 }
83                 arrow.setVisibility(View.VISIBLE);
84             }
85         });
86     }
87 
getShouldDisplayInList()88     public boolean getShouldDisplayInList() {
89         final SharedPreferences prefs = getContext().getSharedPreferences(
90                 DialtactsActivity.SHARED_PREFS_NAME, Context.MODE_PRIVATE);
91         return prefs.getBoolean(KEY_TILE_INTERACTION_TEASER_SHOWN, true);
92     }
93 
setAdapter(PhoneFavoriteMergedAdapter adapter)94     public void setAdapter(PhoneFavoriteMergedAdapter adapter) {
95         mAdapter = adapter;
96     }
97 
startDestroyAnimation()98     private void startDestroyAnimation() {
99         final int start = getHeight();
100         final int end = 0;
101         mAnimatedHeight = start;
102         Log.v("Interaction", "Start from" + start);
103 
104         ValueAnimator heightAnimator = ValueAnimator.ofInt(start, end);
105         heightAnimator.setDuration(sShrinkAnimationDuration);
106         heightAnimator.setInterpolator(new DecelerateInterpolator(2.0f));
107         heightAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
108             public void onAnimationUpdate(ValueAnimator animation) {
109                 mAnimatedHeight = (Integer) animation.getAnimatedValue();
110                 requestLayout();
111             }
112         });
113         heightAnimator.addListener(new Animator.AnimatorListener() {
114             @Override
115             public void onAnimationStart(Animator animator) {
116             }
117 
118             @Override
119             public void onAnimationEnd(Animator animator) {
120                 setVisibility(GONE);
121                 setDismissed();
122                 if (mAdapter != null) {
123                     mAdapter.notifyDataSetChanged();
124                 }
125             }
126 
127             @Override
128             public void onAnimationCancel(Animator animator) {
129             }
130 
131             @Override
132             public void onAnimationRepeat(Animator animator) {
133             }
134         });
135 
136         heightAnimator.start();
137     }
138 
setDismissed()139     private void setDismissed() {
140         final SharedPreferences prefs = getContext().getSharedPreferences(
141                 DialtactsActivity.SHARED_PREFS_NAME, Context.MODE_PRIVATE);
142         prefs.edit().putBoolean(KEY_TILE_INTERACTION_TEASER_SHOWN, false).apply();
143     }
144 
145     @Override
onMeasure(final int widthMeasureSpec, final int heightMeasureSpec)146     protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
147         if (mAnimatedHeight == -1) {
148             super.onMeasure(widthMeasureSpec, heightMeasureSpec);
149         } else {
150             setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mAnimatedHeight);
151         }
152     }
153 }
154