CardViewApi21Impl.java revision e7c701f05b4f6afa2913c3743638d7b25b96df83
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 Boyarpackage android.support.v7.widget;
1783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
1883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.content.Context;
19d2c60296856244030e9a92ef3065d3884ac67527Aurimas Liutikasimport android.content.res.ColorStateList;
20d2c60296856244030e9a92ef3065d3884ac67527Aurimas Liutikasimport android.support.annotation.Nullable;
2183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.view.View;
2283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
2383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarclass CardViewApi21 implements CardViewImpl {
2483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
2583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    @Override
26d2c60296856244030e9a92ef3065d3884ac67527Aurimas Liutikas    public void initialize(CardViewDelegate cardView, Context context,
2786223c8f397daa57fff72d6bd5cf10ceeb74d40eChris Banes                ColorStateList backgroundColor, float radius, float elevation, float maxElevation) {
28ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        final RoundRectDrawable background = new RoundRectDrawable(backgroundColor, radius);
29ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        cardView.setCardBackground(background);
30ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes
31ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        View view = cardView.getCardView();
3283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        view.setClipToOutline(true);
3318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        view.setElevation(elevation);
34bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        setMaxElevation(cardView, maxElevation);
3583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
3683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
3783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    @Override
3883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public void setRadius(CardViewDelegate cardView, float radius) {
39ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        getCardBackground(cardView).setRadius(radius);
4083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
4183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
4283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    @Override
4383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public void initStatic() {
4483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
4583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
4683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    @Override
4718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public void setMaxElevation(CardViewDelegate cardView, float maxElevation) {
48ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        getCardBackground(cardView).setPadding(maxElevation,
49c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar                cardView.getUseCompatPadding(), cardView.getPreventCornerOverlap());
50bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        updatePadding(cardView);
5118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
5218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
5318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
5418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public float getMaxElevation(CardViewDelegate cardView) {
55ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        return getCardBackground(cardView).getPadding();
5618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
5718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
5818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
5918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public float getMinWidth(CardViewDelegate cardView) {
6018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        return getRadius(cardView) * 2;
6118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
6218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
6318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
6418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public float getMinHeight(CardViewDelegate cardView) {
6518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        return getRadius(cardView) * 2;
6618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
6718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
6818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
6983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public float getRadius(CardViewDelegate cardView) {
70ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        return getCardBackground(cardView).getRadius();
7183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
7283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
7318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
7418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public void setElevation(CardViewDelegate cardView, float elevation) {
75ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        cardView.getCardView().setElevation(elevation);
7618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
7718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
7818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
7918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public float getElevation(CardViewDelegate cardView) {
80ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        return cardView.getCardView().getElevation();
8118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
8218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
83bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    @Override
84bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public void updatePadding(CardViewDelegate cardView) {
85c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar        if (!cardView.getUseCompatPadding()) {
86bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar            cardView.setShadowPadding(0, 0, 0, 0);
87bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar            return;
88bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        }
89bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        float elevation = getMaxElevation(cardView);
90bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        final float radius = getRadius(cardView);
91bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        int hPadding = (int) Math.ceil(RoundRectDrawableWithShadow
92c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar                .calculateHorizontalPadding(elevation, radius, cardView.getPreventCornerOverlap()));
93bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        int vPadding = (int) Math.ceil(RoundRectDrawableWithShadow
94c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar                .calculateVerticalPadding(elevation, radius, cardView.getPreventCornerOverlap()));
95bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        cardView.setShadowPadding(hPadding, vPadding, hPadding, vPadding);
96bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
97bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
98bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    @Override
99bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public void onCompatPaddingChanged(CardViewDelegate cardView) {
100bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        setMaxElevation(cardView, getMaxElevation(cardView));
101bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
102bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
103c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar    @Override
104c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar    public void onPreventCornerOverlapChanged(CardViewDelegate cardView) {
105c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar        setMaxElevation(cardView, getMaxElevation(cardView));
106c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar    }
1074eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar
1084eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar    @Override
109d2c60296856244030e9a92ef3065d3884ac67527Aurimas Liutikas    public void setBackgroundColor(CardViewDelegate cardView, @Nullable ColorStateList color) {
110ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        getCardBackground(cardView).setColor(color);
111ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes    }
112ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes
113e7c701f05b4f6afa2913c3743638d7b25b96df83Aurimas Liutikas    @Override
114e7c701f05b4f6afa2913c3743638d7b25b96df83Aurimas Liutikas    public ColorStateList getBackgroundColor(CardViewDelegate cardView) {
115e7c701f05b4f6afa2913c3743638d7b25b96df83Aurimas Liutikas        return getCardBackground(cardView).getColor();
116e7c701f05b4f6afa2913c3743638d7b25b96df83Aurimas Liutikas    }
117e7c701f05b4f6afa2913c3743638d7b25b96df83Aurimas Liutikas
118ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes    private RoundRectDrawable getCardBackground(CardViewDelegate cardView) {
119ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        return ((RoundRectDrawable) cardView.getCardBackground());
1204eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar    }
12183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar}