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