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