16c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang/*
26c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * Copyright (C) 2013 The Android Open Source Project
36c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang *
46c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * Licensed under the Apache License, Version 2.0 (the "License");
56c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * you may not use this file except in compliance with the License.
66c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * You may obtain a copy of the License at
76c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang *
86c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang *      http://www.apache.org/licenses/LICENSE-2.0
96c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang *
106c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * Unless required by applicable law or agreed to in writing, software
116c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * distributed under the License is distributed on an "AS IS" BASIS,
126c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * See the License for the specific language governing permissions and
146c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * limitations under the License.
156c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang */
166c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
176c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangpackage com.android.mail.ui;
186c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
19272900135906067c383b0960881293f769114494Scott Kennedyimport android.animation.Animator;
206c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.animation.ObjectAnimator;
21272900135906067c383b0960881293f769114494Scott Kennedyimport android.animation.Animator.AnimatorListener;
226c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.app.LoaderManager;
236c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.app.LoaderManager.LoaderCallbacks;
246c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.content.Context;
256c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.content.Loader;
266c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.content.res.Resources;
276c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.os.Bundle;
286c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.text.SpannableString;
296c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.text.style.TextAppearanceSpan;
306c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.util.AttributeSet;
316c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.view.View;
326c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.view.animation.DecelerateInterpolator;
336c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.widget.FrameLayout;
346c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport android.widget.TextView;
356c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
366c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport com.android.mail.R;
376c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport com.android.mail.browse.ConversationCursor;
386c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport com.android.mail.content.ObjectCursor;
396c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport com.android.mail.content.ObjectCursorLoader;
406c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport com.android.mail.preferences.AccountPreferences;
416c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport com.android.mail.providers.Account;
426c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport com.android.mail.providers.Folder;
436c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangimport com.android.mail.providers.UIProvider;
441591414ed6dc829852edd219c39ae430314ff538Scott Kennedyimport com.android.mail.utils.Utils;
456c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
466c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang/**
476c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * Tip that is displayed in conversation list of 'Sent' folder whenever there are
486c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang * one or more messages in the Outbox.
496c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang */
506c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yangpublic class ConversationsInOutboxTipView extends FrameLayout
516c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        implements ConversationSpecialItemView, SwipeableItemView {
526c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
536c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private static int sScrollSlop = 0;
546c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private static int sShrinkAnimationDuration;
556c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
566c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private Account mAccount = null;
576c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private AccountPreferences mAccountPreferences;
586c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private AnimatedAdapter mAdapter;
596c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private LoaderManager mLoaderManager;
606c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private FolderSelector mFolderSelector;
616c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private Folder mOutbox;
626c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private int mOutboxCount = -1;
636c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
646c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private View mSwipeableContent;
656c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private TextView mText;
666c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
676c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private int mAnimatedHeight = -1;
686c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
691591414ed6dc829852edd219c39ae430314ff538Scott Kennedy    private View mTeaserRightEdge;
701591414ed6dc829852edd219c39ae430314ff538Scott Kennedy    /** Whether we are on a tablet device or not */
711591414ed6dc829852edd219c39ae430314ff538Scott Kennedy    private final boolean mTabletDevice;
721591414ed6dc829852edd219c39ae430314ff538Scott Kennedy    /** When in conversation mode, true if the list is hidden */
731591414ed6dc829852edd219c39ae430314ff538Scott Kennedy    private final boolean mListCollapsible;
741591414ed6dc829852edd219c39ae430314ff538Scott Kennedy
756c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private static final int LOADER_FOLDER_LIST =
766c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            AbstractActivityController.LAST_FRAGMENT_LOADER_ID + 100;
776c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
786c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public ConversationsInOutboxTipView(final Context context) {
796c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        this(context, null);
806c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
816c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
826c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public ConversationsInOutboxTipView(final Context context, final AttributeSet attrs) {
836c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        this(context, attrs, -1);
846c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
856c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
866c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public ConversationsInOutboxTipView(
876c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            final Context context, final AttributeSet attrs, final int defStyle) {
886c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        super(context, attrs, defStyle);
896c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
906c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        final Resources resources = context.getResources();
916c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
926c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        if (sScrollSlop == 0) {
936c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            sScrollSlop = resources.getInteger(R.integer.swipeScrollSlop);
946c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            sShrinkAnimationDuration = resources.getInteger(
956c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                    R.integer.shrink_animation_duration);
966c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        }
971591414ed6dc829852edd219c39ae430314ff538Scott Kennedy
981591414ed6dc829852edd219c39ae430314ff538Scott Kennedy        mTabletDevice = Utils.useTabletUI(resources);
991591414ed6dc829852edd219c39ae430314ff538Scott Kennedy        mListCollapsible = resources.getBoolean(R.bool.list_collapsible);
1006c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
1016c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1026c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public void bind(final Account account, final FolderSelector folderSelector) {
1036c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        mAccount = account;
104afb10d038c70c0a8646f0315836c49c704765ff9Tony Mantler        mAccountPreferences = AccountPreferences.get(getContext(), account.getEmailAddress());
1056c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        mFolderSelector = folderSelector;
1066c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
1076c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1086c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
109f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy    public void onGetView() {
110f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy        // Do nothing
1116c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
1126c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1136c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
1146c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    protected void onFinishInflate() {
1156c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        mSwipeableContent = findViewById(R.id.swipeable_content);
1166c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1176c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        mText = (TextView) findViewById(R.id.outbox);
1186c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1196c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        findViewById(R.id.outbox).setOnClickListener(new View.OnClickListener() {
1206c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            @Override
1216c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            public void onClick(View v) {
1226c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                goToOutbox();
1236c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            }
1246c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        });
1256c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1266c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        findViewById(R.id.dismiss_button).setOnClickListener(new View.OnClickListener() {
1276c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            @Override
1286c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            public void onClick(View v) {
1296c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                dismiss();
1306c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            }
1316c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        });
1321591414ed6dc829852edd219c39ae430314ff538Scott Kennedy
1331591414ed6dc829852edd219c39ae430314ff538Scott Kennedy        mTeaserRightEdge = findViewById(R.id.teaser_right_edge);
1346c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
1356c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1366c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private void goToOutbox() {
1376c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        if (mOutbox != null) {
1386c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            mFolderSelector.onFolderSelected(mOutbox);
1396c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        }
1406c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
1416c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1426c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
1430e8dc84326ad3e6d146a203538665f98dd98f688Scott Kennedy    public void onUpdate(Folder folder, ConversationCursor cursor) {
1446c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        if (mLoaderManager != null && folder != null) {
1456c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            if ((folder.type & UIProvider.FolderType.SENT) > 0) {
1466c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                // Only display this tip if user is viewing the Sent folder
1476c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                mLoaderManager.initLoader(LOADER_FOLDER_LIST, null, mFolderListLoaderCallbacks);
1486c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            }
1496c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        }
1506c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
1516c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1526c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private final LoaderCallbacks<ObjectCursor<Folder>> mFolderListLoaderCallbacks =
1536c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            new LoaderManager.LoaderCallbacks<ObjectCursor<Folder>>() {
1546c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        @Override
1556c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        public void onLoaderReset(final Loader<ObjectCursor<Folder>> loader) {
1566c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            // Do nothing
1576c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        }
1586c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1596c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        @Override
1606c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        public void onLoadFinished(final Loader<ObjectCursor<Folder>> loader,
1616c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                final ObjectCursor<Folder> data) {
1626c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            if (data != null && data.moveToFirst()) {
1636c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                do {
1646c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                    final Folder folder = data.getModel();
1656c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                    if ((folder.type & UIProvider.FolderType.OUTBOX) > 0) {
1666c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                        mOutbox = folder;
1676c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                        onOutboxTotalCount(folder.totalCount);
1686c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                    }
1696c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                } while (data.moveToNext());
1706c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            }
1716c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        }
1726c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1736c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        @Override
1746c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        public Loader<ObjectCursor<Folder>> onCreateLoader(final int id, final Bundle args) {
1756c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            // This loads all folders in order to find 'Outbox'.  We could consider adding a new
1766c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            // query to load folders of a given type to make this more efficient, but should be
1776c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            // okay for now since this is triggered infrequently (only when user visits the
1786c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            // 'Sent' folder).
1796c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            final ObjectCursorLoader<Folder> loader = new ObjectCursorLoader<Folder>(getContext(),
1806c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                    mAccount.folderListUri, UIProvider.FOLDERS_PROJECTION, Folder.FACTORY);
1816c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            return loader;
1826c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        }
1836c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    };
1846c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
1856c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private void onOutboxTotalCount(int outboxCount) {
1866c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        if (mOutboxCount != outboxCount) {
1876c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            mOutboxCount = outboxCount;
1886c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            if (outboxCount > 0) {
1896c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                if (mText != null) {
1906c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                    updateText();
1916c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                }
1926c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            }
1936c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        }
1946c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        if (outboxCount == 0) {
1956c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            // Clear the last seen count, so that new messages in Outbox will always cause this
1966c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            // tip to appear again.
1976c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            mAccountPreferences.setLastSeenOutboxCount(0);
1986c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        }
1996c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2006c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2016c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private void updateText() {
2026c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        // Update the display text to reflect current mOutboxCount
2036c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        final Resources resources = getContext().getResources();
2046c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        final String subString = mOutbox.name;
2056c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        final String entireString = resources.getString(
2066c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                R.string.unsent_messages_in_outbox,
2076c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                String.valueOf(mOutboxCount), subString);
2086c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        final SpannableString text = new SpannableString(entireString);
2096c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        final int index = entireString.indexOf(subString);
2106c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        text.setSpan(
2116c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                new TextAppearanceSpan(getContext(), R.style.LinksInTipTextAppearance),
2126c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                index,
2136c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                index + subString.length(),
2146c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                0);
2156c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        mText.setText(text);
2166c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2176c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2186c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2196c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public boolean getShouldDisplayInList() {
2206c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        return (mOutboxCount > 0 && mOutboxCount != mAccountPreferences.getLastSeenOutboxCount());
2216c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2226c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2236c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2246c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public int getPosition() {
2256c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        // We want this teaser to go before the first real conversation
2266c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        return 0;
2276c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2286c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2296c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2306c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public void setAdapter(AnimatedAdapter adapter) {
2316c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        mAdapter = adapter;
2326c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2336c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2346c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
23532ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    public void bindFragment(final LoaderManager loaderManager, final Bundle savedInstanceState) {
2366c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        mLoaderManager = loaderManager;
2376c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2386c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2396c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2406c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public void cleanup() {
2416c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2426c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2436c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2446c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public void onConversationSelected() {
2456c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        // DO NOTHING
2466c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2476c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2486c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2496c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public void onCabModeEntered() {
2506c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2516c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2526c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2536c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public void onCabModeExited() {
2546c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2556c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2566c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
25732ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    public void onConversationListVisibilityChanged(final boolean visible) {
25832ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy        // Do nothing
25932ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    }
26032ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy
26132ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    @Override
26232ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    public void saveInstanceState(final Bundle outState) {
26332ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy        // Do nothing
26432ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    }
26532ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy
26632ddb84f2d4f53bfc4b53656461068c0c69d6325Scott Kennedy    @Override
2676c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public boolean acceptsUserTaps() {
2686c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        return true;
2696c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2706c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2716c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2726c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public void dismiss() {
2736c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        // Do not show this tip again until we have a new count.  Note this is not quite
2746c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        // ideal behavior since after a user dismisses an "1 unsent in outbox" tip,
2756c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        // the message stuck in Outbox could get sent, and a new one gets stuck.
2766c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        // If the user checks back on on Sent folder then, we don't reshow the message since count
2776c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        // itself hasn't changed, but ideally we should since it's a different message than before.
2786c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        // However if user checks the Sent folder in between (when there were 0 messages
2796c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        // in Outbox), the preference is cleared (see {@link onOutboxTotalCount}).
2806c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        mAccountPreferences.setLastSeenOutboxCount(mOutboxCount);
2816c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2826c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        startDestroyAnimation();
2836c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2846c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2856c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2866c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public SwipeableView getSwipeableView() {
2876c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        return SwipeableView.from(mSwipeableContent);
2886c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2896c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2906c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2916c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public boolean canChildBeDismissed() {
2926c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        return true;
2936c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2946c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
2956c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
2966c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public float getMinAllowScrollDistance() {
2976c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        return sScrollSlop;
2986c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
2996c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
3006c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    private void startDestroyAnimation() {
3016c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        final int start = getHeight();
3026c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        final int end = 0;
3036c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        mAnimatedHeight = start;
3046c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        final ObjectAnimator heightAnimator =
3056c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang                ObjectAnimator.ofInt(this, "animatedHeight", start, end);
3066c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        heightAnimator.setInterpolator(new DecelerateInterpolator(2.0f));
3076c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        heightAnimator.setDuration(sShrinkAnimationDuration);
308272900135906067c383b0960881293f769114494Scott Kennedy        heightAnimator.addListener(new AnimatorListener() {
309272900135906067c383b0960881293f769114494Scott Kennedy            @Override
310272900135906067c383b0960881293f769114494Scott Kennedy            public void onAnimationStart(final Animator animation) {
311272900135906067c383b0960881293f769114494Scott Kennedy                // Do nothing
312272900135906067c383b0960881293f769114494Scott Kennedy            }
313272900135906067c383b0960881293f769114494Scott Kennedy
314272900135906067c383b0960881293f769114494Scott Kennedy            @Override
315272900135906067c383b0960881293f769114494Scott Kennedy            public void onAnimationRepeat(final Animator animation) {
316272900135906067c383b0960881293f769114494Scott Kennedy                // Do nothing
317272900135906067c383b0960881293f769114494Scott Kennedy            }
318272900135906067c383b0960881293f769114494Scott Kennedy
319272900135906067c383b0960881293f769114494Scott Kennedy            @Override
320272900135906067c383b0960881293f769114494Scott Kennedy            public void onAnimationEnd(final Animator animation) {
321272900135906067c383b0960881293f769114494Scott Kennedy                // We should no longer exist, so notify the adapter
322272900135906067c383b0960881293f769114494Scott Kennedy                mAdapter.notifyDataSetChanged();
323272900135906067c383b0960881293f769114494Scott Kennedy            }
324272900135906067c383b0960881293f769114494Scott Kennedy
325272900135906067c383b0960881293f769114494Scott Kennedy            @Override
326272900135906067c383b0960881293f769114494Scott Kennedy            public void onAnimationCancel(final Animator animation) {
327272900135906067c383b0960881293f769114494Scott Kennedy                // Do nothing
328272900135906067c383b0960881293f769114494Scott Kennedy            }
329272900135906067c383b0960881293f769114494Scott Kennedy        });
3306c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        heightAnimator.start();
3316c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
3326c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
3336c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    /**
3346c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang     * This method is used by the animator.  It is explicitly kept in proguard.flags to prevent it
3356c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang     * from being removed, inlined, or obfuscated.
3366c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang     * Edit ./vendor/unbundled/packages/apps/UnifiedGmail/proguard.flags
3376c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang     * In the future, we want to use @Keep
3386c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang     */
3396c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    public void setAnimatedHeight(final int height) {
3406c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        mAnimatedHeight = height;
3416c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        requestLayout();
3426c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
3436c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang
3446c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    @Override
3456c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
346f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy        if (Utils.getDisplayListRightEdgeEffect(mTabletDevice, mListCollapsible,
347f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy                mAdapter.getViewMode())) {
348f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy            mTeaserRightEdge.setVisibility(VISIBLE);
349f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy        } else {
350f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy            mTeaserRightEdge.setVisibility(GONE);
351f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy        }
352f45e0e7f65eb421fc5c2acf7bb76a714e12dc68bScott Kennedy
3536c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        if (mAnimatedHeight == -1) {
3546c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
3556c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        } else {
3566c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang            setMeasuredDimension(View.MeasureSpec.getSize(widthMeasureSpec), mAnimatedHeight);
3576c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang        }
3586c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang    }
3596c9845ed223ceaefd2b6e7511d04b038d63de8b3Alice Yang}
360