1b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn/* 2b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * Copyright (C) 2014 The Android Open Source Project 3b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * 4b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * in compliance with the License. You may obtain a copy of the License at 6b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * 7b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * http://www.apache.org/licenses/LICENSE-2.0 8b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * 9b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * Unless required by applicable law or agreed to in writing, software distributed under the License 10b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * or implied. See the License for the specific language governing permissions and limitations under 12b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn * the License. 13b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn */ 14b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbournpackage android.support.v17.leanback.widget; 15b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 16b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbournimport android.content.Context; 17ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Guimport android.content.res.TypedArray; 18b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbournimport android.graphics.drawable.Drawable; 1970acb0c19be3831a2080e4f902324de16bfbf62eTor Norbyeimport android.support.annotation.ColorInt; 20b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbournimport android.support.v17.leanback.R; 21b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbournimport android.util.AttributeSet; 22df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahnimport android.view.ContextThemeWrapper; 23b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbournimport android.view.LayoutInflater; 24b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbournimport android.view.View; 25b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilsonimport android.view.ViewGroup; 26b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbournimport android.widget.ImageView; 279de363b8db05106b03d115c266859fe200d41db7Dake Guimport android.widget.ImageView.ScaleType; 28df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahnimport android.widget.RelativeLayout; 29b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbournimport android.widget.TextView; 30b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 31961a8f12d1fbeeb86ea066f9f2c693abb2ce50f2Tim Kilbourn/** 3210c27646c1a19989f824a44ecd5dec2663db048dDake Gu * A subclass of {@link BaseCardView} with an {@link ImageView} as its main region. The 3310c27646c1a19989f824a44ecd5dec2663db048dDake Gu * {@link ImageCardView} is highly customizable and can be used for various use-cases by adjusting 3410c27646c1a19989f824a44ecd5dec2663db048dDake Gu * the ImageViewCard's type to any combination of Title, Content, Badge or ImageOnly. 35df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <p> 3610c27646c1a19989f824a44ecd5dec2663db048dDake Gu * <h3>Styling</h3> There are two different ways to style the ImageCardView. <br> 3710c27646c1a19989f824a44ecd5dec2663db048dDake Gu * No matter what way you use, all your styles applied to an ImageCardView have to extend the style 3810c27646c1a19989f824a44ecd5dec2663db048dDake Gu * {@link R.style#Widget_Leanback_ImageCardViewStyle}. 39df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <p> 40df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <u>Example:</u><br> 41df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * 42df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <pre> 4310c27646c1a19989f824a44ecd5dec2663db048dDake Gu * {@code 4410c27646c1a19989f824a44ecd5dec2663db048dDake Gu * <style name="CustomImageCardViewStyle" parent="Widget.Leanback.ImageCardViewStyle"> 4569d050a8f2cb15e48185a413327feb4fb0e7a1acDake Gu <item name="cardBackground">#F0F</item> 46df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn <item name="lbImageCardViewType">Title|Content</item> 4710c27646c1a19989f824a44ecd5dec2663db048dDake Gu </style> 4810c27646c1a19989f824a44ecd5dec2663db048dDake Gu <style name="CustomImageCardTheme" parent="Theme.Leanback"> 4910c27646c1a19989f824a44ecd5dec2663db048dDake Gu <item name="imageCardViewStyle">@style/CustomImageCardViewStyle</item> 5010c27646c1a19989f824a44ecd5dec2663db048dDake Gu <item name="imageCardViewInfoAreaStyle">@style/ImageCardViewColoredInfoArea</item> 5110c27646c1a19989f824a44ecd5dec2663db048dDake Gu <item name="imageCardViewTitleStyle">@style/ImageCardViewColoredTitle</item> 52df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn </style>} 53df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * </pre> 54df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <p> 5510c27646c1a19989f824a44ecd5dec2663db048dDake Gu * The first possibility is to set custom Styles in the Leanback Theme's attributes 5610c27646c1a19989f824a44ecd5dec2663db048dDake Gu * <code>imageCardViewStyle</code>, <code>imageCardViewTitleStyle</code> etc. The styles set here, 5710c27646c1a19989f824a44ecd5dec2663db048dDake Gu * is the default style for all ImageCardViews. 5810c27646c1a19989f824a44ecd5dec2663db048dDake Gu * <p> 5910c27646c1a19989f824a44ecd5dec2663db048dDake Gu * The second possibility allows you to style a particular ImageCardView. This is useful if you 6010c27646c1a19989f824a44ecd5dec2663db048dDake Gu * want to create multiple types of cards. E.g. you might want to display a card with only a title 6110c27646c1a19989f824a44ecd5dec2663db048dDake Gu * and another one with title and content. Thus you need to define two different 6210c27646c1a19989f824a44ecd5dec2663db048dDake Gu * <code>ImageCardViewStyles</code> and two different themes and apply them to the ImageCardViews. 6310c27646c1a19989f824a44ecd5dec2663db048dDake Gu * You can do this by using a the {@link #ImageCardView(Context)} constructor and passing a 6410c27646c1a19989f824a44ecd5dec2663db048dDake Gu * ContextThemeWrapper with the custom ImageCardView theme id. 65df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <p> 66df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <u>Example (using constructor):</u><br> 67df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * 68df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <pre> 69df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * {@code 7010c27646c1a19989f824a44ecd5dec2663db048dDake Gu * new ImageCardView(new ContextThemeWrapper(context, R.style.CustomImageCardTheme)); 71df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * } 72df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * </pre> 73df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * 74df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <p> 7510c27646c1a19989f824a44ecd5dec2663db048dDake Gu * You can style all ImageCardView's components such as the title, content, badge, infoArea and the 7610c27646c1a19989f824a44ecd5dec2663db048dDake Gu * image itself by extending the corresponding style and overriding the specific attribute in your 7710c27646c1a19989f824a44ecd5dec2663db048dDake Gu * custom ImageCardView theme. 78df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * 7910c27646c1a19989f824a44ecd5dec2663db048dDake Gu * <h3>Components</h3> The ImageCardView contains three components which can be combined in any 8010c27646c1a19989f824a44ecd5dec2663db048dDake Gu * combination: 81df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <ul> 82df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <li>Title: The card's title</li> 83df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <li>Content: A short description</li> 8410c27646c1a19989f824a44ecd5dec2663db048dDake Gu * <li>Badge: An icon which can be displayed on the right or left side of the card.</li> 85df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * </ul> 8610c27646c1a19989f824a44ecd5dec2663db048dDake Gu * In order to choose the components you want to use in your ImageCardView, you have to specify them 8710c27646c1a19989f824a44ecd5dec2663db048dDake Gu * in the <code>lbImageCardViewType</code> attribute of your custom <code>ImageCardViewStyle</code>. 8810c27646c1a19989f824a44ecd5dec2663db048dDake Gu * You can combine the following values: 8910c27646c1a19989f824a44ecd5dec2663db048dDake Gu * <code>Title, Content, IconOnRight, IconOnLeft, ImageOnly</code>. 90df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <p> 91df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <u>Examples:</u><br> 92df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * 93df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <pre> 94df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * {@code <style name="CustomImageCardViewStyle" parent="Widget.Leanback.ImageCardViewStyle"> 95df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn ... 96df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn <item name="lbImageCardViewType">Title|Content|IconOnLeft</item> 97df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn ... 98df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn </style>} 99df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * </pre> 100df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * 101df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * <pre> 102df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * {@code <style name="CustomImageCardViewStyle" parent="Widget.Leanback.ImageCardViewStyle"> 103df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn ... 104df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn <item name="lbImageCardViewType">ImageOnly</item> 105df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn ... 106df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn </style>} 107df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * </pre> 108df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * 109df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * @attr ref android.support.v17.leanback.R.styleable#LeanbackTheme_imageCardViewStyle 110df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * @attr ref android.support.v17.leanback.R.styleable#lbImageCardView_lbImageCardViewType 11110c27646c1a19989f824a44ecd5dec2663db048dDake Gu * @attr ref android.support.v17.leanback.R.styleable#LeanbackTheme_imageCardViewTitleStyle 11210c27646c1a19989f824a44ecd5dec2663db048dDake Gu * @attr ref android.support.v17.leanback.R.styleable#LeanbackTheme_imageCardViewContentStyle 11310c27646c1a19989f824a44ecd5dec2663db048dDake Gu * @attr ref android.support.v17.leanback.R.styleable#LeanbackTheme_imageCardViewBadgeStyle 11410c27646c1a19989f824a44ecd5dec2663db048dDake Gu * @attr ref android.support.v17.leanback.R.styleable#LeanbackTheme_imageCardViewImageStyle 11510c27646c1a19989f824a44ecd5dec2663db048dDake Gu * @attr ref android.support.v17.leanback.R.styleable#LeanbackTheme_imageCardViewInfoAreaStyle 116961a8f12d1fbeeb86ea066f9f2c693abb2ce50f2Tim Kilbourn */ 117b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbournpublic class ImageCardView extends BaseCardView { 118b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 119df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn public static final int CARD_TYPE_FLAG_IMAGE_ONLY = 0; 120df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn public static final int CARD_TYPE_FLAG_TITLE = 1; 121df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn public static final int CARD_TYPE_FLAG_CONTENT = 2; 122df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn public static final int CARD_TYPE_FLAG_ICON_RIGHT = 4; 123df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn public static final int CARD_TYPE_FLAG_ICON_LEFT = 8; 124df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn 125b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn private ImageView mImageView; 126df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn private ViewGroup mInfoArea; 127b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn private TextView mTitleView; 128b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn private TextView mContentView; 129b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn private ImageView mBadgeImage; 13089589687d8aafcfdc11d9760205e9d0b16505201Craig Stout private boolean mAttachedToWindow; 131b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 132df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn /** 13310c27646c1a19989f824a44ecd5dec2663db048dDake Gu * Create an ImageCardView using a given theme for customization. 134df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * 135df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * @param context 136df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * The Context the view is running in, through which it can 137df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * access the current theme, resources, etc. 13810c27646c1a19989f824a44ecd5dec2663db048dDake Gu * @param themeResId 13910c27646c1a19989f824a44ecd5dec2663db048dDake Gu * The resourceId of the theme you want to apply to the ImageCardView. The theme 14010c27646c1a19989f824a44ecd5dec2663db048dDake Gu * includes attributes "imageCardViewStyle", "imageCardViewTitleStyle", 14110c27646c1a19989f824a44ecd5dec2663db048dDake Gu * "imageCardViewContentStyle" etc. to customize individual part of ImageCardView. 14210c27646c1a19989f824a44ecd5dec2663db048dDake Gu * @deprecated Calling this constructor inefficiently creates one ContextThemeWrapper per card, 14310c27646c1a19989f824a44ecd5dec2663db048dDake Gu * you should share it in card Presenter: wrapper = new ContextThemeWrapper(context, themResId); 14410c27646c1a19989f824a44ecd5dec2663db048dDake Gu * return new ImageCardView(wrapper); 145df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn */ 14610c27646c1a19989f824a44ecd5dec2663db048dDake Gu @Deprecated 14710c27646c1a19989f824a44ecd5dec2663db048dDake Gu public ImageCardView(Context context, int themeResId) { 14810c27646c1a19989f824a44ecd5dec2663db048dDake Gu this(new ContextThemeWrapper(context, themeResId)); 149b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 150b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 151df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn /** 152df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * @see #View(Context, AttributeSet, int) 153df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn */ 154df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn public ImageCardView(Context context, AttributeSet attrs, int defStyleAttr) { 15510c27646c1a19989f824a44ecd5dec2663db048dDake Gu super(context, attrs, defStyleAttr); 15610c27646c1a19989f824a44ecd5dec2663db048dDake Gu buildImageCardView(attrs, defStyleAttr, R.style.Widget_Leanback_ImageCardView); 157b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 158b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 15910c27646c1a19989f824a44ecd5dec2663db048dDake Gu private void buildImageCardView(AttributeSet attrs, int defStyleAttr, int defStyle) { 160459e0eacc1c547f272bc8b897dd3cfb44243c06aRobert Hahn // Make sure the ImageCardView is focusable. 161459e0eacc1c547f272bc8b897dd3cfb44243c06aRobert Hahn setFocusable(true); 162459e0eacc1c547f272bc8b897dd3cfb44243c06aRobert Hahn setFocusableInTouchMode(true); 163459e0eacc1c547f272bc8b897dd3cfb44243c06aRobert Hahn 164df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn LayoutInflater inflater = LayoutInflater.from(getContext()); 165df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn inflater.inflate(R.layout.lb_image_card_view, this); 16610c27646c1a19989f824a44ecd5dec2663db048dDake Gu TypedArray cardAttrs = getContext().obtainStyledAttributes(attrs, 16710c27646c1a19989f824a44ecd5dec2663db048dDake Gu R.styleable.lbImageCardView, defStyleAttr, defStyle); 16810c27646c1a19989f824a44ecd5dec2663db048dDake Gu int cardType = cardAttrs 16910c27646c1a19989f824a44ecd5dec2663db048dDake Gu .getInt(R.styleable.lbImageCardView_lbImageCardViewType, CARD_TYPE_FLAG_IMAGE_ONLY); 17010c27646c1a19989f824a44ecd5dec2663db048dDake Gu 171df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn boolean hasImageOnly = cardType == CARD_TYPE_FLAG_IMAGE_ONLY; 172df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn boolean hasTitle = (cardType & CARD_TYPE_FLAG_TITLE) == CARD_TYPE_FLAG_TITLE; 173df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn boolean hasContent = (cardType & CARD_TYPE_FLAG_CONTENT) == CARD_TYPE_FLAG_CONTENT; 174df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn boolean hasIconRight = (cardType & CARD_TYPE_FLAG_ICON_RIGHT) == CARD_TYPE_FLAG_ICON_RIGHT; 17510c27646c1a19989f824a44ecd5dec2663db048dDake Gu boolean hasIconLeft = 17610c27646c1a19989f824a44ecd5dec2663db048dDake Gu !hasIconRight && (cardType & CARD_TYPE_FLAG_ICON_LEFT) == CARD_TYPE_FLAG_ICON_LEFT; 177df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn 178df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mImageView = (ImageView) findViewById(R.id.main_image); 179df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (mImageView.getDrawable() == null) { 180df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mImageView.setVisibility(View.INVISIBLE); 181df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 182df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn 183df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mInfoArea = (ViewGroup) findViewById(R.id.info_field); 184df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (hasImageOnly) { 185df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn removeView(mInfoArea); 186df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn cardAttrs.recycle(); 187df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn return; 188df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 189df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // Create children 190df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (hasTitle) { 19110c27646c1a19989f824a44ecd5dec2663db048dDake Gu mTitleView = (TextView) inflater.inflate(R.layout.lb_image_card_view_themed_title, 19210c27646c1a19989f824a44ecd5dec2663db048dDake Gu mInfoArea, false); 193df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mInfoArea.addView(mTitleView); 194df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 195df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn 196df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (hasContent) { 19710c27646c1a19989f824a44ecd5dec2663db048dDake Gu mContentView = (TextView) inflater.inflate(R.layout.lb_image_card_view_themed_content, 19810c27646c1a19989f824a44ecd5dec2663db048dDake Gu mInfoArea, false); 199df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mInfoArea.addView(mContentView); 200df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 201b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 202df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (hasIconRight || hasIconLeft) { 203df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn int layoutId = R.layout.lb_image_card_view_themed_badge_right; 204df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (hasIconLeft) { 205df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn layoutId = R.layout.lb_image_card_view_themed_badge_left; 206df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 207df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mBadgeImage = (ImageView) inflater.inflate(layoutId, mInfoArea, false); 208df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mInfoArea.addView(mBadgeImage); 209df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 210b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 211df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // Set up LayoutParams for children 212df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (hasTitle && !hasContent && mBadgeImage != null) { 21310c27646c1a19989f824a44ecd5dec2663db048dDake Gu RelativeLayout.LayoutParams relativeLayoutParams = 21410c27646c1a19989f824a44ecd5dec2663db048dDake Gu (RelativeLayout.LayoutParams) mTitleView.getLayoutParams(); 215df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // Adjust title TextView if there is an icon but no content 216df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (hasIconLeft) { 217df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn relativeLayoutParams.addRule(RelativeLayout.END_OF, mBadgeImage.getId()); 218df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } else { 219df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn relativeLayoutParams.addRule(RelativeLayout.START_OF, mBadgeImage.getId()); 220df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 221df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mTitleView.setLayoutParams(relativeLayoutParams); 222df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 223ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu 224df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // Set up LayoutParams for children 225df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (hasContent) { 22610c27646c1a19989f824a44ecd5dec2663db048dDake Gu RelativeLayout.LayoutParams relativeLayoutParams = 22710c27646c1a19989f824a44ecd5dec2663db048dDake Gu (RelativeLayout.LayoutParams) mContentView.getLayoutParams(); 228df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (!hasTitle) { 229df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn relativeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); 230df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 231df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // Adjust content TextView if icon is on the left 232df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (hasIconLeft) { 233df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn relativeLayoutParams.removeRule(RelativeLayout.START_OF); 234df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn relativeLayoutParams.removeRule(RelativeLayout.ALIGN_PARENT_START); 235df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn relativeLayoutParams.addRule(RelativeLayout.END_OF, mBadgeImage.getId()); 236df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 237df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mContentView.setLayoutParams(relativeLayoutParams); 238df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 239df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn 240df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (mBadgeImage != null) { 24110c27646c1a19989f824a44ecd5dec2663db048dDake Gu RelativeLayout.LayoutParams relativeLayoutParams = 24210c27646c1a19989f824a44ecd5dec2663db048dDake Gu (RelativeLayout.LayoutParams) mBadgeImage.getLayoutParams(); 243df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (hasContent) { 244df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn relativeLayoutParams.addRule(RelativeLayout.ALIGN_BOTTOM, mContentView.getId()); 245df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } else if (hasTitle) { 246df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn relativeLayoutParams.addRule(RelativeLayout.ALIGN_BOTTOM, mTitleView.getId()); 247ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu } 248df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mBadgeImage.setLayoutParams(relativeLayoutParams); 249df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 250df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn 251df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // Backward compatibility: Newly created ImageCardViews should change 252df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // the InfoArea's background color in XML using the corresponding style. 253df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // However, since older implementations might make use of the 254df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // 'infoAreaBackground' attribute, we have to make sure to support it. 255df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // If the user has set a specific value here, it will differ from null. 256df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // In this case, we do want to override the value set in the style. 257df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn Drawable background = cardAttrs.getDrawable(R.styleable.lbImageCardView_infoAreaBackground); 258df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (null != background) { 259df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn setInfoAreaBackground(background); 260ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu } 261df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // Backward compatibility: There has to be an icon in the default 262df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // version. If there is one, we have to set it's visibility to 'GONE'. 263df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // Disabling 'adjustIconVisibility' allows the user to set the icon's 264df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn // visibility state in XML rather than code. 265df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (mBadgeImage != null && mBadgeImage.getDrawable() == null) { 266df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn mBadgeImage.setVisibility(View.GONE); 267df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 268df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn cardAttrs.recycle(); 269df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 270df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn 271df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn /** 272df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * @see #View(Context) 273df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn */ 274df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn public ImageCardView(Context context) { 275df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn this(context, null); 276df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn } 277df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn 278df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn /** 279df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn * @see #View(Context, AttributeSet) 280df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn */ 281df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn public ImageCardView(Context context, AttributeSet attrs) { 282df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn this(context, attrs, R.attr.imageCardViewStyle); 283b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 284b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 285a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 286a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Returns the main image view. 287a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 2889de363b8db05106b03d115c266859fe200d41db7Dake Gu public final ImageView getMainImageView() { 2899de363b8db05106b03d115c266859fe200d41db7Dake Gu return mImageView; 2909de363b8db05106b03d115c266859fe200d41db7Dake Gu } 2919de363b8db05106b03d115c266859fe200d41db7Dake Gu 292a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 293a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Enables or disables adjustment of view bounds on the main image. 294a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 2959de363b8db05106b03d115c266859fe200d41db7Dake Gu public void setMainImageAdjustViewBounds(boolean adjustViewBounds) { 2969de363b8db05106b03d115c266859fe200d41db7Dake Gu if (mImageView != null) { 2979de363b8db05106b03d115c266859fe200d41db7Dake Gu mImageView.setAdjustViewBounds(adjustViewBounds); 2989de363b8db05106b03d115c266859fe200d41db7Dake Gu } 2999de363b8db05106b03d115c266859fe200d41db7Dake Gu } 3009de363b8db05106b03d115c266859fe200d41db7Dake Gu 301a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 302a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets the ScaleType of the main image. 303a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 3049de363b8db05106b03d115c266859fe200d41db7Dake Gu public void setMainImageScaleType(ScaleType scaleType) { 3059de363b8db05106b03d115c266859fe200d41db7Dake Gu if (mImageView != null) { 3069de363b8db05106b03d115c266859fe200d41db7Dake Gu mImageView.setScaleType(scaleType); 3079de363b8db05106b03d115c266859fe200d41db7Dake Gu } 3089de363b8db05106b03d115c266859fe200d41db7Dake Gu } 3099de363b8db05106b03d115c266859fe200d41db7Dake Gu 310932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu /** 311a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets the image drawable with fade-in animation. 312932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu */ 313b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn public void setMainImage(Drawable drawable) { 314932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu setMainImage(drawable, true); 315932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu } 316932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu 317932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu /** 318a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets the image drawable with optional fade-in animation. 319932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu */ 320932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu public void setMainImage(Drawable drawable, boolean fade) { 321b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn if (mImageView == null) { 322b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return; 323b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 324b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 325b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn mImageView.setImageDrawable(drawable); 326b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson if (drawable == null) { 327932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu mImageView.animate().cancel(); 328932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu mImageView.setAlpha(1f); 329b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson mImageView.setVisibility(View.INVISIBLE); 330b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson } else { 331b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson mImageView.setVisibility(View.VISIBLE); 332932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu if (fade) { 33389589687d8aafcfdc11d9760205e9d0b16505201Craig Stout fadeIn(); 334932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu } else { 335932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu mImageView.animate().cancel(); 336932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu mImageView.setAlpha(1f); 337932feed83c3dbc49c9855a1736afd9d5a3428b8eDake Gu } 338b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson } 339b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson } 340b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson 341a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 342a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets the layout dimensions of the ImageView. 343a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 344b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson public void setMainImageDimensions(int width, int height) { 345b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson ViewGroup.LayoutParams lp = mImageView.getLayoutParams(); 346b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson lp.width = width; 347b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson lp.height = height; 348b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson mImageView.setLayoutParams(lp); 349b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 350b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 351a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 352a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Returns the ImageView drawable. 353a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 354b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn public Drawable getMainImage() { 355b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn if (mImageView == null) { 356b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return null; 357b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 358b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 359b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return mImageView.getDrawable(); 360b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 361b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 362a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 363a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Returns the info area background drawable. 364a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 365ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu public Drawable getInfoAreaBackground() { 366ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu if (mInfoArea != null) { 367ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu return mInfoArea.getBackground(); 368ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu } 369ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu return null; 370ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu } 371ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu 372a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 373a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets the info area background drawable. 374a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 375ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu public void setInfoAreaBackground(Drawable drawable) { 376ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu if (mInfoArea != null) { 377ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu mInfoArea.setBackground(drawable); 378ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu } 379ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu } 380ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu 381a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 382a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets the info area background color. 383df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn */ 38470acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye public void setInfoAreaBackgroundColor(@ColorInt int color) { 385ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu if (mInfoArea != null) { 386ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu mInfoArea.setBackgroundColor(color); 387ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu } 388ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu } 389ae2614fe4c86c79344dc7dcb07777143b2fbd0d6Dake Gu 390a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 391a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets the title text. 392a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 393b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn public void setTitleText(CharSequence text) { 394b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn if (mTitleView == null) { 395b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return; 396b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 397b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn mTitleView.setText(text); 398b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 399b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 400a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 401a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Returns the title text. 402a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 403b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn public CharSequence getTitleText() { 404b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn if (mTitleView == null) { 405b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return null; 406b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 407b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 408b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return mTitleView.getText(); 409b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 410b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 411a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 412a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets the content text. 413a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 414b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn public void setContentText(CharSequence text) { 415b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn if (mContentView == null) { 416b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return; 417b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 418b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn mContentView.setText(text); 419b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 420b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 421a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 422a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Returns the content text. 423a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 424b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn public CharSequence getContentText() { 425b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn if (mContentView == null) { 426b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return null; 427b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 428b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 429b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return mContentView.getText(); 430b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 431b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 432a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 433a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Sets the badge image drawable. 434a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 435b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn public void setBadgeImage(Drawable drawable) { 436b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn if (mBadgeImage == null) { 437b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return; 438b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 439cb933aeb5c89f168f604bf081d6f8f4fdde6534fDake Gu mBadgeImage.setImageDrawable(drawable); 440df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn if (drawable != null) { 441b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn mBadgeImage.setVisibility(View.VISIBLE); 442b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } else { 443b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn mBadgeImage.setVisibility(View.GONE); 444b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 445b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 446b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 447a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout /** 448a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * Returns the badge image drawable. 449a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout */ 450b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn public Drawable getBadgeImage() { 451b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn if (mBadgeImage == null) { 452b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return null; 453b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 454b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn 455b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn return mBadgeImage.getDrawable(); 456b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn } 457b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson 45889589687d8aafcfdc11d9760205e9d0b16505201Craig Stout private void fadeIn() { 45989589687d8aafcfdc11d9760205e9d0b16505201Craig Stout mImageView.setAlpha(0f); 46089589687d8aafcfdc11d9760205e9d0b16505201Craig Stout if (mAttachedToWindow) { 46110c27646c1a19989f824a44ecd5dec2663db048dDake Gu mImageView.animate().alpha(1f).setDuration( 46210c27646c1a19989f824a44ecd5dec2663db048dDake Gu mImageView.getResources().getInteger(android.R.integer.config_shortAnimTime)); 46389589687d8aafcfdc11d9760205e9d0b16505201Craig Stout } 464b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson } 465b6e24f60743bd2022dd496126f0ff683ff6b3713Andrew Wilson 466ceb7ab2ddd6e157cd4ade0f14a382c39428163c4Dake Gu @Override 467ceb7ab2ddd6e157cd4ade0f14a382c39428163c4Dake Gu public boolean hasOverlappingRendering() { 468ceb7ab2ddd6e157cd4ade0f14a382c39428163c4Dake Gu return false; 469ceb7ab2ddd6e157cd4ade0f14a382c39428163c4Dake Gu } 470ceb7ab2ddd6e157cd4ade0f14a382c39428163c4Dake Gu 4715358b0ca6ed795892bd097fdf15d41fb6b1a03d2Craig Stout @Override 47289589687d8aafcfdc11d9760205e9d0b16505201Craig Stout protected void onAttachedToWindow() { 47389589687d8aafcfdc11d9760205e9d0b16505201Craig Stout super.onAttachedToWindow(); 47489589687d8aafcfdc11d9760205e9d0b16505201Craig Stout mAttachedToWindow = true; 47589589687d8aafcfdc11d9760205e9d0b16505201Craig Stout if (mImageView.getAlpha() == 0) { 47689589687d8aafcfdc11d9760205e9d0b16505201Craig Stout fadeIn(); 47789589687d8aafcfdc11d9760205e9d0b16505201Craig Stout } 47889589687d8aafcfdc11d9760205e9d0b16505201Craig Stout } 47989589687d8aafcfdc11d9760205e9d0b16505201Craig Stout 48089589687d8aafcfdc11d9760205e9d0b16505201Craig Stout @Override 4815358b0ca6ed795892bd097fdf15d41fb6b1a03d2Craig Stout protected void onDetachedFromWindow() { 48289589687d8aafcfdc11d9760205e9d0b16505201Craig Stout mAttachedToWindow = false; 4835358b0ca6ed795892bd097fdf15d41fb6b1a03d2Craig Stout mImageView.animate().cancel(); 4845358b0ca6ed795892bd097fdf15d41fb6b1a03d2Craig Stout mImageView.setAlpha(1f); 4855358b0ca6ed795892bd097fdf15d41fb6b1a03d2Craig Stout super.onDetachedFromWindow(); 4865358b0ca6ed795892bd097fdf15d41fb6b1a03d2Craig Stout } 487df805b881bdb8794a068a482038df8176dd4ac4aRobert Hahn 488b55f0880c367c0b7e4132e7d954b60725e01e0b2Tim Kilbourn} 489