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