ImageCardView.java revision 70acb0c19be3831a2080e4f902324de16bfbf62e
1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
12 * the License.
13 */
14package android.support.v17.leanback.widget;
15
16import android.content.Context;
17import android.content.res.TypedArray;
18import android.graphics.drawable.Drawable;
19import android.support.annotation.ColorInt;
20import android.support.v17.leanback.R;
21import android.text.TextUtils;
22import android.util.AttributeSet;
23import android.view.LayoutInflater;
24import android.view.View;
25import android.view.ViewGroup;
26import android.widget.ImageView;
27import android.widget.ImageView.ScaleType;
28import android.widget.TextView;
29
30/**
31 * A card view with an {@link ImageView} as its main region.
32 */
33public class ImageCardView extends BaseCardView {
34
35    private ImageView mImageView;
36    private View mInfoArea;
37    private TextView mTitleView;
38    private TextView mContentView;
39    private ImageView mBadgeImage;
40    private ImageView mBadgeFadeMask;
41    private boolean mAttachedToWindow;
42
43    public ImageCardView(Context context) {
44        this(context, null);
45    }
46
47    public ImageCardView(Context context, AttributeSet attrs) {
48        this(context, attrs, R.attr.imageCardViewStyle);
49    }
50
51    public ImageCardView(Context context, AttributeSet attrs, int defStyle) {
52        super(context, attrs, defStyle);
53
54        LayoutInflater inflater = LayoutInflater.from(context);
55        View v = inflater.inflate(R.layout.lb_image_card_view, this);
56
57        mImageView = (ImageView) v.findViewById(R.id.main_image);
58        mImageView.setVisibility(View.INVISIBLE);
59        mInfoArea = v.findViewById(R.id.info_field);
60        mTitleView = (TextView) v.findViewById(R.id.title_text);
61        mContentView = (TextView) v.findViewById(R.id.content_text);
62        mBadgeImage = (ImageView) v.findViewById(R.id.extra_badge);
63        mBadgeFadeMask = (ImageView) v.findViewById(R.id.fade_mask);
64
65        if (mInfoArea != null) {
66            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.lbImageCardView,
67                    defStyle, 0);
68            try {
69                setInfoAreaBackground(
70                        a.getDrawable(R.styleable.lbImageCardView_infoAreaBackground));
71            } finally {
72                a.recycle();
73            }
74        }
75    }
76
77    public final ImageView getMainImageView() {
78        return mImageView;
79    }
80
81    public void setMainImageAdjustViewBounds(boolean adjustViewBounds) {
82        if (mImageView != null) {
83            mImageView.setAdjustViewBounds(adjustViewBounds);
84        }
85    }
86
87    public void setMainImageScaleType(ScaleType scaleType) {
88        if (mImageView != null) {
89            mImageView.setScaleType(scaleType);
90        }
91    }
92
93    /**
94     * Set drawable with fade-in animation.
95     */
96    public void setMainImage(Drawable drawable) {
97        setMainImage(drawable, true);
98    }
99
100    /**
101     * Set drawable with optional fade-in animation.
102     */
103    public void setMainImage(Drawable drawable, boolean fade) {
104        if (mImageView == null) {
105            return;
106        }
107
108        mImageView.setImageDrawable(drawable);
109        if (drawable == null) {
110            mImageView.animate().cancel();
111            mImageView.setAlpha(1f);
112            mImageView.setVisibility(View.INVISIBLE);
113        } else {
114            mImageView.setVisibility(View.VISIBLE);
115            if (fade) {
116                fadeIn();
117            } else {
118                mImageView.animate().cancel();
119                mImageView.setAlpha(1f);
120            }
121        }
122    }
123
124    public void setMainImageDimensions(int width, int height) {
125        ViewGroup.LayoutParams lp = mImageView.getLayoutParams();
126        lp.width = width;
127        lp.height = height;
128        mImageView.setLayoutParams(lp);
129    }
130
131    public Drawable getMainImage() {
132        if (mImageView == null) {
133            return null;
134        }
135
136        return mImageView.getDrawable();
137    }
138
139    public Drawable getInfoAreaBackground() {
140        if (mInfoArea != null) {
141            return mInfoArea.getBackground();
142        }
143        return null;
144    }
145
146    public void setInfoAreaBackground(Drawable drawable) {
147        if (mInfoArea != null) {
148            mInfoArea.setBackground(drawable);
149            if (mBadgeImage != null) {
150                mBadgeImage.setBackground(drawable);
151            }
152        }
153    }
154
155    public void setInfoAreaBackgroundColor(@ColorInt int color) {
156        if (mInfoArea != null) {
157            mInfoArea.setBackgroundColor(color);
158            if (mBadgeImage != null) {
159                mBadgeImage.setBackgroundColor(color);
160            }
161        }
162    }
163
164    public void setTitleText(CharSequence text) {
165        if (mTitleView == null) {
166            return;
167        }
168
169        mTitleView.setText(text);
170        setTextMaxLines();
171    }
172
173    public CharSequence getTitleText() {
174        if (mTitleView == null) {
175            return null;
176        }
177
178        return mTitleView.getText();
179    }
180
181    public void setContentText(CharSequence text) {
182        if (mContentView == null) {
183            return;
184        }
185
186        mContentView.setText(text);
187        setTextMaxLines();
188    }
189
190    public CharSequence getContentText() {
191        if (mContentView == null) {
192            return null;
193        }
194
195        return mContentView.getText();
196    }
197
198    public void setBadgeImage(Drawable drawable) {
199        if (mBadgeImage == null) {
200            return;
201        }
202
203        if (drawable != null) {
204            mBadgeImage.setImageDrawable(drawable);
205            mBadgeImage.setVisibility(View.VISIBLE);
206            mBadgeFadeMask.setVisibility(View.VISIBLE);
207        } else {
208            mBadgeImage.setVisibility(View.GONE);
209            mBadgeFadeMask.setVisibility(View.GONE);
210        }
211    }
212
213    public Drawable getBadgeImage() {
214        if (mBadgeImage == null) {
215            return null;
216        }
217
218        return mBadgeImage.getDrawable();
219    }
220
221    private void fadeIn() {
222        mImageView.setAlpha(0f);
223        if (mAttachedToWindow) {
224            mImageView.animate().alpha(1f).setDuration(mImageView.getResources().getInteger(
225                    android.R.integer.config_shortAnimTime));
226        }
227    }
228
229    @Override
230    public boolean hasOverlappingRendering() {
231        return false;
232    }
233
234    private void setTextMaxLines() {
235        if (TextUtils.isEmpty(getTitleText())) {
236            mContentView.setMaxLines(2);
237        } else {
238            mContentView.setMaxLines(1);
239        }
240        if (TextUtils.isEmpty(getContentText())) {
241            mTitleView.setMaxLines(2);
242        } else {
243            mTitleView.setMaxLines(1);
244        }
245    }
246
247    @Override
248    protected void onAttachedToWindow() {
249        super.onAttachedToWindow();
250        mAttachedToWindow = true;
251        if (mImageView.getAlpha() == 0) {
252            fadeIn();
253        }
254    }
255
256    @Override
257    protected void onDetachedFromWindow() {
258        mAttachedToWindow = false;
259        mImageView.animate().cancel();
260        mImageView.setAlpha(1f);
261        super.onDetachedFromWindow();
262    }
263}
264