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