12102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weipackage com.android.mail.ui;
22102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
32102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport android.animation.ObjectAnimator;
42102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport android.app.LoaderManager;
52102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport android.content.Context;
62102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport android.content.res.Resources;
732ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedyimport android.os.Bundle;
868c09ac46f4fb759dea92458540054ae63433f58Mark Weiimport android.util.AttributeSet;
968c09ac46f4fb759dea92458540054ae63433f58Mark Weiimport android.view.View;
102102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport android.view.animation.DecelerateInterpolator;
112102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport android.widget.FrameLayout;
122102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport android.widget.ImageView;
132102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport android.widget.LinearLayout;
142102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport android.widget.TextView;
152102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
162102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport com.android.mail.R;
17042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huangimport com.android.mail.analytics.Analytics;
182102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport com.android.mail.browse.ConversationCursor;
192102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport com.android.mail.preferences.MailPrefs;
202102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weiimport com.android.mail.providers.Folder;
211591414ed6dc829852edd219c39ae430314ff538Scott Kennedyimport com.android.mail.utils.Utils;
222102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
232102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei/**
242102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei * A teaser to introduce people to the contact photo check boxes
252102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei */
262102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Weipublic class ConversationPhotoTeaserView extends FrameLayout
272102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        implements ConversationSpecialItemView, SwipeableItemView {
282102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    private static int sScrollSlop = 0;
292102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    private static int sShrinkAnimationDuration;
302102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
312102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    private final MailPrefs mMailPrefs;
322102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    private AnimatedAdapter mAdapter;
332102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
3468c09ac46f4fb759dea92458540054ae63433f58Mark Wei    private View mSwipeableContent;
3568c09ac46f4fb759dea92458540054ae63433f58Mark Wei
362102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    private boolean mShown;
372102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    private int mAnimatedHeight = -1;
382102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    private boolean mNeedLayout;
392102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    private int mTextTop;
402102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
411591414ed6dc829852edd219c39ae430314ff538Scott Kennedy    private View mTeaserRightEdge;
421591414ed6dc829852edd219c39ae430314ff538Scott Kennedy    /** Whether we are on a tablet device or not */
431591414ed6dc829852edd219c39ae430314ff538Scott Kennedy    private final boolean mTabletDevice;
441591414ed6dc829852edd219c39ae430314ff538Scott Kennedy    /** When in conversation mode, true if the list is hidden */
451591414ed6dc829852edd219c39ae430314ff538Scott Kennedy    private final boolean mListCollapsible;
461591414ed6dc829852edd219c39ae430314ff538Scott Kennedy
472102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public ConversationPhotoTeaserView(final Context context) {
4868c09ac46f4fb759dea92458540054ae63433f58Mark Wei        this(context, null);
4968c09ac46f4fb759dea92458540054ae63433f58Mark Wei    }
5068c09ac46f4fb759dea92458540054ae63433f58Mark Wei
5168c09ac46f4fb759dea92458540054ae63433f58Mark Wei    public ConversationPhotoTeaserView(final Context context, final AttributeSet attrs) {
5268c09ac46f4fb759dea92458540054ae63433f58Mark Wei        this(context, attrs, -1);
5368c09ac46f4fb759dea92458540054ae63433f58Mark Wei    }
5468c09ac46f4fb759dea92458540054ae63433f58Mark Wei
5568c09ac46f4fb759dea92458540054ae63433f58Mark Wei    public ConversationPhotoTeaserView(
5668c09ac46f4fb759dea92458540054ae63433f58Mark Wei            final Context context, final AttributeSet attrs, final int defStyle) {
5768c09ac46f4fb759dea92458540054ae63433f58Mark Wei        super(context, attrs, defStyle);
582102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
592102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        final Resources resources = context.getResources();
602102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
612102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        synchronized (ConversationPhotoTeaserView.class) {
622102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei            if (sScrollSlop == 0) {
632102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                sScrollSlop = resources.getInteger(R.integer.swipeScrollSlop);
642102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                sShrinkAnimationDuration = resources.getInteger(
652102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                        R.integer.shrink_animation_duration);
662102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei            }
672102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        }
682102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
692102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        mMailPrefs = MailPrefs.get(context);
702102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
712102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        mNeedLayout = true;
721591414ed6dc829852edd219c39ae430314ff538Scott Kennedy
731591414ed6dc829852edd219c39ae430314ff538Scott Kennedy        mTabletDevice = Utils.useTabletUI(resources);
741591414ed6dc829852edd219c39ae430314ff538Scott Kennedy        mListCollapsible = resources.getBoolean(R.bool.list_collapsible);
752102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
762102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
772102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
7868c09ac46f4fb759dea92458540054ae63433f58Mark Wei    protected void onFinishInflate() {
7968c09ac46f4fb759dea92458540054ae63433f58Mark Wei        mSwipeableContent = findViewById(R.id.swipeable_content);
80150ebe6d02f2a9a6a02c215c8b2f93c9d72f4824Andrew Sapperstein
81150ebe6d02f2a9a6a02c215c8b2f93c9d72f4824Andrew Sapperstein        findViewById(R.id.dismiss_button).setOnClickListener(new OnClickListener() {
82150ebe6d02f2a9a6a02c215c8b2f93c9d72f4824Andrew Sapperstein            @Override
83150ebe6d02f2a9a6a02c215c8b2f93c9d72f4824Andrew Sapperstein            public void onClick(View v) {
84150ebe6d02f2a9a6a02c215c8b2f93c9d72f4824Andrew Sapperstein                dismiss();
85150ebe6d02f2a9a6a02c215c8b2f93c9d72f4824Andrew Sapperstein            }
86150ebe6d02f2a9a6a02c215c8b2f93c9d72f4824Andrew Sapperstein        });
871591414ed6dc829852edd219c39ae430314ff538Scott Kennedy
881591414ed6dc829852edd219c39ae430314ff538Scott Kennedy        mTeaserRightEdge = findViewById(R.id.teaser_right_edge);
8968c09ac46f4fb759dea92458540054ae63433f58Mark Wei    }
9068c09ac46f4fb759dea92458540054ae63433f58Mark Wei
9168c09ac46f4fb759dea92458540054ae63433f58Mark Wei    @Override
922102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
932102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        super.onLayout(changed, left, top, right, bottom);
942102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
952102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        final TextView text = (TextView) findViewById(R.id.text);
962102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        final ImageView arrow = (ImageView) findViewById(R.id.arrow);
972102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
9868c09ac46f4fb759dea92458540054ae63433f58Mark Wei        // We post to avoid calling layout within layout
9968c09ac46f4fb759dea92458540054ae63433f58Mark Wei        arrow.post(new Runnable() {
10068c09ac46f4fb759dea92458540054ae63433f58Mark Wei            @Override
10168c09ac46f4fb759dea92458540054ae63433f58Mark Wei            public void run() {
10268c09ac46f4fb759dea92458540054ae63433f58Mark Wei
10368c09ac46f4fb759dea92458540054ae63433f58Mark Wei                // The text top is changed when we move the arrow, so we need to
10468c09ac46f4fb759dea92458540054ae63433f58Mark Wei                // do multiple passes
10568c09ac46f4fb759dea92458540054ae63433f58Mark Wei                int textTop = text.getTop();
10668c09ac46f4fb759dea92458540054ae63433f58Mark Wei                if (mNeedLayout || textTop != mTextTop) {
10768c09ac46f4fb759dea92458540054ae63433f58Mark Wei                    mNeedLayout = false;
10868c09ac46f4fb759dea92458540054ae63433f58Mark Wei                    mTextTop = textTop;
10968c09ac46f4fb759dea92458540054ae63433f58Mark Wei
1102102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                    final int lineHeight = text.getLineHeight();
1112102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                    final LinearLayout.LayoutParams arrowParams = (LinearLayout.LayoutParams) arrow
1122102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                            .getLayoutParams();
1132102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                    arrowParams.topMargin = mTextTop + lineHeight / 2;
1142102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                    arrow.setLayoutParams(arrowParams);
1152102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                }
11668c09ac46f4fb759dea92458540054ae63433f58Mark Wei                arrow.setVisibility(View.VISIBLE);
11768c09ac46f4fb759dea92458540054ae63433f58Mark Wei            }
11868c09ac46f4fb759dea92458540054ae63433f58Mark Wei        });
1192102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
1202102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
1212102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
1220e8dc84326ad3e6d146a203538665f98dd98f688Scott Kennedy    public void onUpdate(Folder folder, ConversationCursor cursor) {
123b45d1418887d8595c230788e20516bbe10c2f3eaScott Kennedy        // Do nothing
124b45d1418887d8595c230788e20516bbe10c2f3eaScott Kennedy    }
125b45d1418887d8595c230788e20516bbe10c2f3eaScott Kennedy
126b45d1418887d8595c230788e20516bbe10c2f3eaScott Kennedy    @Override
127f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy    public void onGetView() {
128f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy        // Do nothing
1292102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
1302102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
1312102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
1322102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public boolean getShouldDisplayInList() {
1332102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        // show if 1) sender images are enabled 2) there are items
1342102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        mShown = shouldShowSenderImage() && !mAdapter.isEmpty()
1352102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                && !mMailPrefs.isConversationPhotoTeaserAlreadyShown();
1362102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        return mShown;
1372102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
1382102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
1392102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
1402102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public int getPosition() {
14128e0027f0b2e64093caaf87131c8e8508ffe7bceScott Kennedy        return 0;
1422102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
1432102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
1442102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
1452102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public void setAdapter(AnimatedAdapter adapter) {
1462102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        mAdapter = adapter;
1472102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
1482102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
1492102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
15032ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    public void bindFragment(final LoaderManager loaderManager, final Bundle savedInstanceState) {
1512102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
1522102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
1532102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
1542102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public void cleanup() {
1552102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
1562102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
1572102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
1582102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public void onConversationSelected() {
1592f542873183b37fa38a0d468f46bbfebc1f537e2Andrew Sapperstein        // DO NOTHING
1602f542873183b37fa38a0d468f46bbfebc1f537e2Andrew Sapperstein    }
1612f542873183b37fa38a0d468f46bbfebc1f537e2Andrew Sapperstein
1622f542873183b37fa38a0d468f46bbfebc1f537e2Andrew Sapperstein    @Override
1632f542873183b37fa38a0d468f46bbfebc1f537e2Andrew Sapperstein    public void onCabModeEntered() {
164d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy        if (mShown) {
165d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy            dismiss();
166d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy        }
1672102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
1682102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
169cc139833bc5829ba70244519e9870de783c41848Scott Kennedy    @Override
170cc139833bc5829ba70244519e9870de783c41848Scott Kennedy    public void onCabModeExited() {
171cc139833bc5829ba70244519e9870de783c41848Scott Kennedy        // Do nothing
172cc139833bc5829ba70244519e9870de783c41848Scott Kennedy    }
1732f542873183b37fa38a0d468f46bbfebc1f537e2Andrew Sapperstein
1742102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
17532ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    public void onConversationListVisibilityChanged(final boolean visible) {
17632ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy        // Do nothing
17732ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    }
17832ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy
17932ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    @Override
18032ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    public void saveInstanceState(final Bundle outState) {
18132ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy        // Do nothing
18232ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    }
18332ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy
18432ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    @Override
18537a20ca39be842b4b4cb54d5b5ed418d49d950cfVikram Aggarwal    public boolean acceptsUserTaps() {
18637a20ca39be842b4b4cb54d5b5ed418d49d950cfVikram Aggarwal        // No, we don't allow user taps.
18737a20ca39be842b4b4cb54d5b5ed418d49d950cfVikram Aggarwal        return false;
18837a20ca39be842b4b4cb54d5b5ed418d49d950cfVikram Aggarwal    }
18937a20ca39be842b4b4cb54d5b5ed418d49d950cfVikram Aggarwal
19037a20ca39be842b4b4cb54d5b5ed418d49d950cfVikram Aggarwal    @Override
1912102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public void dismiss() {
1922102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        setDismissed();
1932102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        startDestroyAnimation();
1942102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
1952102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
1962102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    private void setDismissed() {
1972102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        if (mShown) {
1982102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei            mMailPrefs.setConversationPhotoTeaserAlreadyShown();
1992102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei            mShown = false;
200042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang            Analytics.getInstance().sendEvent("list_swipe", "photo_teaser", null, 0);
2012102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        }
2022102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
2032102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
2042102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    protected boolean shouldShowSenderImage() {
2052afc01e8b222eb68049c79988c65e80819a1fd50Paul Westbrook        return mMailPrefs.getShowSenderImages();
2062102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
2072102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
2082102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
2092102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public SwipeableView getSwipeableView() {
21068c09ac46f4fb759dea92458540054ae63433f58Mark Wei        return SwipeableView.from(mSwipeableContent);
2112102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
2122102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
2132102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
2142102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public boolean canChildBeDismissed() {
2152102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        return true;
2162102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
2172102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
2182102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
2192102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public float getMinAllowScrollDistance() {
2202102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        return sScrollSlop;
2212102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
2222102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
2232102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    private void startDestroyAnimation() {
2242102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        final int start = getHeight();
2252102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        final int end = 0;
2262102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        mAnimatedHeight = start;
2272102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        final ObjectAnimator heightAnimator =
2282102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei                ObjectAnimator.ofInt(this, "animatedHeight", start, end);
2292102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        heightAnimator.setInterpolator(new DecelerateInterpolator(2.0f));
2302102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        heightAnimator.setDuration(sShrinkAnimationDuration);
2312102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        heightAnimator.start();
232d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy
233d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy        /*
234d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy         * Ideally, we would like to call mAdapter.notifyDataSetChanged() in a listener's
235d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy         * onAnimationEnd(), but we are in the middle of a touch event, and this will cause all the
236d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy         * views to get recycled, which will cause problems.
237d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy         *
238d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy         * Instead, we'll just leave the item in the list with a height of 0, and the next
239d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy         * notifyDatasetChanged() will remove it from the adapter.
240d6522ea881e80ab849f2a88565db5a6a73e7623eScott Kennedy         */
2412102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
2422102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
2432102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    /**
2442102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei     * This method is used by the animator.  It is explicitly kept in proguard.flags to prevent it
2452102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei     * from being removed, inlined, or obfuscated.
2462102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei     * Edit ./packages/apps/UnifiedEmail/proguard.flags
2472102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei     * In the future, we want to use @Keep
2482102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei     */
2492102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    public void setAnimatedHeight(final int height) {
2502102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        mAnimatedHeight = height;
2512102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        requestLayout();
2522102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
2532102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei
2542102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    @Override
2552102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
256f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy        if (Utils.getDisplayListRightEdgeEffect(mTabletDevice, mListCollapsible,
257f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy                mAdapter.getViewMode())) {
258f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy            mTeaserRightEdge.setVisibility(VISIBLE);
259f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy        } else {
260f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy            mTeaserRightEdge.setVisibility(GONE);
261f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy        }
262f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy
2632102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        if (mAnimatedHeight == -1) {
2642102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
2652102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        } else {
2662102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei            setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mAnimatedHeight);
2672102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei        }
2682102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei    }
2692102b2c87a6cb39bc63fb7eff13dda64da56b72eMark Wei}
270