CardView.java revision a52784195525cdb1f2bb4d8dde1b8b314f480957
183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar/*
283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * Copyright (C) 2014 The Android Open Source Project
383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar *
483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * you may not use this file except in compliance with the License.
683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * You may obtain a copy of the License at
783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar *
883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar *
1083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * Unless required by applicable law or agreed to in writing, software
1183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
1283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * See the License for the specific language governing permissions and
1483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * limitations under the License.
1583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar */
1683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
1783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarpackage android.support.v7.widget;
1883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
1983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.content.Context;
2083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.content.res.TypedArray;
2118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyarimport android.graphics.Rect;
2283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.os.Build;
2383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.support.v7.cardview.R;
2483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.util.AttributeSet;
2583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.widget.FrameLayout;
2683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
2783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar/**
2818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * A FrameLayout with a rounded corner background and shadow.
2983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * <p>
3083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * CardView uses <code>elevation</code> property on L for shadows and falls back to a custom shadow
3183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * implementation on older platforms.
3283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * <p>
3318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * Due to expensive nature of rounded corner clipping, on platforms before L, CardView does not
3418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * clip its children that intersect with rounded corners. Instead, it adds padding to avoid such
3583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * intersection.
3618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * <p>
3718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * Before L, CardView adds padding to its content and draws shadows to that area. This padding
38bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * amount is equal to <code>maxCardElevation + (1 - cos45) * cornerRadius</code> on the sides and
39bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <code>maxCardElevation * 1.5 + (1 - cos45) * cornerRadius</code> on top and bottom.
40bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <p>
41bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Since padding is used to offset content for shadows, you cannot set padding on CardView. Instead,
42bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * you can use content padding attributes in XML or {@link #setContentPadding(int, int, int, int)}
43bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * in code to set the padding between the edges of the Card and children of CardView.
44bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <p>
45bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * Note that, if you specify exact dimensions for the CardView, because of the shadows, its content
46bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * area will be different between platforms before L and after L. By using api version specific
47bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * resource values, you can avoid these changes. Alternatively, If you want CardView to add inner
48bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * padding on platforms L and after as well, you can set {@link #setUseCompatPadding(boolean)} to
49bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * <code>true</code>.
5018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * <p>
5118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * To change CardView's elevation in a backward compatible way, use
5218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * {@link #setCardElevation(float)}. CardView will use elevation API on L and before L, it will
5318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * change the shadow size. To avoid moving the View while shadow size is changing, shadow size is
5418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * clamped by {@link #getMaxCardElevation()}. If you want to change elevation dynamically, you
5518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * should call {@link #setMaxCardElevation(float)} when CardView is initialized.
5683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar *
5783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardBackgroundColor
58bc943f7fa746c149c5e4c3a4eed7febe494d5df5Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardCornerRadius
5918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardElevation
6018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardMaxElevation
61bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_cardUseCompatPadding
62bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPadding
63bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingLeft
64bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingTop
65bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingRight
66bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingBottom
6783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar */
6883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarpublic class CardView extends FrameLayout implements CardViewDelegate {
6983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
70bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    private static final CardViewImpl IMPL;
7118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
7283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    static {
73a52784195525cdb1f2bb4d8dde1b8b314f480957Chet Haase        if (Build.VERSION.SDK_INT >= 21) {
7483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar            IMPL = new CardViewApi21();
7583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        } else if (Build.VERSION.SDK_INT >= 17) {
7683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar            IMPL = new CardViewJellybeanMr1();
7783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        } else {
7883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar            IMPL = new CardViewEclairMr1();
7983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        }
8083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        IMPL.initStatic();
8183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
8283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
83bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    private boolean mCompatPadding;
84bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
85bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    private final Rect mContentPadding = new Rect();
86bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
87bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    private final Rect mShadowBounds = new Rect();
88bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
89bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
9083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public CardView(Context context) {
9183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        super(context);
9283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        initialize(context, null, 0);
9383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
9483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
9583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public CardView(Context context, AttributeSet attrs) {
9683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        super(context, attrs);
9783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        initialize(context, attrs, 0);
9883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
9983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
10083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public CardView(Context context, AttributeSet attrs, int defStyleAttr) {
10183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        super(context, attrs, defStyleAttr);
10283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        initialize(context, attrs, defStyleAttr);
10383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
10483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
105bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    @Override
106bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public void setPadding(int left, int top, int right, int bottom) {
107bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        // NO OP
108bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
109bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
110bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public void setPaddingRelative(int start, int top, int end, int bottom) {
111bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        // NO OP
112bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
113bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
114bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    /**
115bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * Returns whether CardView will add inner padding on platforms L and after.
116bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     *
117bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @return True CardView adds inner padding on platforms L and after to have same dimensions
118bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * with platforms before L.
119bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     */
120bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public boolean getUseCompatPadding() {
121bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        return mCompatPadding;
122bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
123bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
124bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    /**
125bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * CardView adds additional padding to draw shadows on platforms before L.
126bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * <p>
127bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * This may cause Cards to have different sizes between L and before L. If you need to align
128bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * CardView with other Views, you may need api version specific dimension resources to account
129bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * for the changes.
130bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * As an alternative, you can set this flag to <code>true</code> and CardView will add the same
131bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * padding values on platforms L and after.
132bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * <p>
133bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * Since setting this flag to true adds unnecessary gaps in the UI, default value is
134bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * <code>false</code>.
135bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     *
136bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @attr ref android.support.v7.cardview.R.styleable#CardView_cardUseCompatPadding
137bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @param useCompatPadding True if CardView should add padding for the shadows on platforms L
138bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     *                         and above.
139bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     */
140bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public void setUseCompatPadding(boolean useCompatPadding) {
141bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        if (mCompatPadding == useCompatPadding) {
142bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar            return;
143bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        }
144bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        mCompatPadding = useCompatPadding;
145bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        IMPL.onCompatPaddingChanged(this);
146bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
147bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
148bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    /**
149bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * Sets the padding between the Card's edges and the children of CardView.
150bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * <p>
151bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * Depending on platform version or {@link #getUseCompatPadding()} settings, CardView may
152bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * update these values before calling {@link android.view.View#setPadding(int, int, int, int)}.
153bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     *
154bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPadding
155bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingLeft
156bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingTop
157bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingRight
158bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingBottom
159bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @param left The left padding in pixels
160bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @param top the top padding in pixels
161bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @param right the right padding in pixels
162bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @param bottom the bottom padding in pixels
163bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     */
164bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public void setContentPadding(int left, int top, int right, int bottom) {
165bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        mContentPadding.set(left, top, right, bottom);
166bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        IMPL.updatePadding(this);
167bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
16818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
16918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
17018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
17118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        if (IMPL instanceof CardViewApi21 == false) {
17218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar            final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
17318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar            switch (widthMode) {
17418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                case MeasureSpec.EXACTLY:
17518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                case MeasureSpec.AT_MOST:
17618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                    final int minWidth = (int) Math.ceil(IMPL.getMinWidth(this));
17718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                    widthMeasureSpec = MeasureSpec.makeMeasureSpec(Math.max(minWidth,
17818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                            MeasureSpec.getSize(widthMeasureSpec)), widthMode);
17918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                    break;
18018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar            }
18118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
18218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar            final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
18318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar            switch (heightMode) {
18418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                case MeasureSpec.EXACTLY:
18518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                case MeasureSpec.AT_MOST:
18618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                    final int minHeight = (int) Math.ceil(IMPL.getMinHeight(this));
18718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                    heightMeasureSpec = MeasureSpec.makeMeasureSpec(Math.max(minHeight,
18818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                            MeasureSpec.getSize(heightMeasureSpec)), heightMode);
18918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar                    break;
19018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar            }
19118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
19218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        } else {
19318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
19418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        }
19518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
19618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
19783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    private void initialize(Context context, AttributeSet attrs, int defStyleAttr) {
19883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CardView, defStyleAttr,
199bc943f7fa746c149c5e4c3a4eed7febe494d5df5Yigit Boyar                R.style.CardView_Light);
20083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        int backgroundColor = a.getColor(R.styleable.CardView_cardBackgroundColor, 0);
20183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        float radius = a.getDimension(R.styleable.CardView_cardCornerRadius, 0);
20218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        float elevation = a.getDimension(R.styleable.CardView_cardElevation, 0);
20318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        float maxElevation = a.getDimension(R.styleable.CardView_cardMaxElevation, 0);
204bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        mCompatPadding = a.getBoolean(R.styleable.CardView_cardUseCompatPadding, false);
205bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        int defaultPadding = a.getDimensionPixelSize(R.styleable.CardView_contentPadding, 0);
206bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        mContentPadding.left = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingLeft,
207bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar                defaultPadding);
208bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        mContentPadding.top = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingTop,
209bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar                defaultPadding);
210bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        mContentPadding.right = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingRight,
211bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar                defaultPadding);
212bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        mContentPadding.bottom = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingBottom,
213bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar                defaultPadding);
21418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        if (elevation > maxElevation) {
21518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar            maxElevation = elevation;
21618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        }
21783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        a.recycle();
21818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        IMPL.initialize(this, context, backgroundColor, radius, elevation, maxElevation);
21983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
22083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
22183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    /**
222bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * Returns the inner padding after the Card's left edge
223bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     *
224bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @return the inner padding after the Card's left edge
225bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     */
226bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public int getContentPaddingLeft() {
227bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        return mContentPadding.left;
228bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
229bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
230bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    /**
231bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * Returns the inner padding before the Card's right edge
232bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     *
233bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @return the inner padding before the Card's right edge
234bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     */
235bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public int getContentPaddingRight() {
236bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        return mContentPadding.right;
237bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
238bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
239bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    /**
240bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * Returns the inner padding after the Card's top edge
241bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     *
242bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @return the inner padding after the Card's top edge
243bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     */
244bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public int getContentPaddingTop() {
245bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        return mContentPadding.top;
246bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
247bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
248bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    /**
249bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * Returns the inner padding before the Card's bottom edge
250bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     *
251bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @return the inner padding before the Card's bottom edge
252bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     */
253bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public int getContentPaddingBottom() {
254bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        return mContentPadding.bottom;
255bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
256bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
257bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    /**
25883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar     * Updates the corner radius of the CardView.
25983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar     *
26083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar     * @param radius The radius in pixels of the corners of the rectangle shape
261bc943f7fa746c149c5e4c3a4eed7febe494d5df5Yigit Boyar     * @attr ref android.support.v7.cardview.R.styleable#CardView_cardCornerRadius
26283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar     * @see #setRadius(float)
26383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar     */
26483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public void setRadius(float radius) {
26583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        IMPL.setRadius(this, radius);
26683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
26783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
26883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    /**
26983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar     * Returns the corner radius of the CardView.
27083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar     *
27183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar     * @return Corner radius of the CardView
27283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar     * @see #getRadius()
27383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar     */
27483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public float getRadius() {
27583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        return IMPL.getRadius(this);
27683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
27718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
27818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    /**
279bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * Internal method used by CardView implementations to update the padding.
280bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * @hide
281bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     */
282bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    @Override
283bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public void setShadowPadding(int left, int top, int right, int bottom) {
284bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        mShadowBounds.set(left, top, right, bottom);
285bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        super.setPadding(left + mContentPadding.left, top + mContentPadding.top,
286bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar                right + mContentPadding.right, bottom + mContentPadding.bottom);
287bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
288bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
289bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    /**
29018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * Updates the backward compatible elevation of the CardView.
29118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     *
29218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @param radius The backward compatible elevation in pixels.
29318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @attr ref android.support.v7.cardview.R.styleable#CardView_cardElevation
29418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @see #getCardElevation()
29518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @see #setMaxCardElevation(float)
29618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     */
29718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public void setCardElevation(float radius) {
29818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        IMPL.setElevation(this, radius);
29918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
30018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
30118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    /**
30218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * Returns the backward compatible elevation of the CardView.
30318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     *
30418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @return Elevation of the CardView
30518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @see #setCardElevation(float)
30618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @see #getMaxCardElevation()
30718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     */
30818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public float getCardElevation() {
30918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        return IMPL.getElevation(this);
31018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
31118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
31218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    /**
31318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * Updates the backward compatible elevation of the CardView.
31418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * <p>
315bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * Calling this method has no effect if device OS version is L or newer and
316bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar     * {@link #getUseCompatPadding()} is <code>false</code>.
31718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     *
31818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @param radius The backward compatible elevation in pixels.
31918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @attr ref android.support.v7.cardview.R.styleable#CardView_cardElevation
32018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @see #setCardElevation(float)
32118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @see #getMaxCardElevation()
32218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     */
32318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public void setMaxCardElevation(float radius) {
32418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        IMPL.setMaxElevation(this, radius);
32518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
32618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
32718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    /**
32818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * Returns the backward compatible elevation of the CardView.
32918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     *
33018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @return Elevation of the CardView
33118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @see #setMaxCardElevation(float)
33218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     * @see #getCardElevation()
33318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar     */
33418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public float getMaxCardElevation() {
33518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        return IMPL.getMaxElevation(this);
33618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
337bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
338bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    @Override
339bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public boolean useCompatPadding() {
340bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        return mCompatPadding;
341bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
342bc943f7fa746c149c5e4c3a4eed7febe494d5df5Yigit Boyar}
343