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;
218f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viveretteimport android.support.annotation.RequiresApi;
2283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyarimport android.view.View;
2383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
248f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viverette@RequiresApi(21)
25b7adf5d2ae19bc616c2d040a667ac1de3769f423Aurimas Liutikasclass CardViewApi21Impl implements CardViewImpl {
2683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
2783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    @Override
28d2c60296856244030e9a92ef3065d3884ac67527Aurimas Liutikas    public void initialize(CardViewDelegate cardView, Context context,
2986223c8f397daa57fff72d6bd5cf10ceeb74d40eChris Banes                ColorStateList backgroundColor, float radius, float elevation, float maxElevation) {
30ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        final RoundRectDrawable background = new RoundRectDrawable(backgroundColor, radius);
31ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        cardView.setCardBackground(background);
32ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes
33ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        View view = cardView.getCardView();
3483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar        view.setClipToOutline(true);
3518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        view.setElevation(elevation);
36bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        setMaxElevation(cardView, maxElevation);
3783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
3883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
3983b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    @Override
4083b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public void setRadius(CardViewDelegate cardView, float radius) {
41ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        getCardBackground(cardView).setRadius(radius);
4283b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
4383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
4483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    @Override
4583b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public void initStatic() {
4683b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
4783b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
4883b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    @Override
4918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public void setMaxElevation(CardViewDelegate cardView, float maxElevation) {
50ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        getCardBackground(cardView).setPadding(maxElevation,
51c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar                cardView.getUseCompatPadding(), cardView.getPreventCornerOverlap());
52bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        updatePadding(cardView);
5318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
5418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
5518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
5618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public float getMaxElevation(CardViewDelegate cardView) {
57ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        return getCardBackground(cardView).getPadding();
5818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
5918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
6018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
6118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public float getMinWidth(CardViewDelegate cardView) {
6218ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        return getRadius(cardView) * 2;
6318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
6418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
6518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
6618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public float getMinHeight(CardViewDelegate cardView) {
6718ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar        return getRadius(cardView) * 2;
6818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
6918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
7018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
7183b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    public float getRadius(CardViewDelegate cardView) {
72ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        return getCardBackground(cardView).getRadius();
7383b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar    }
7483b8526436ba2e564dff99ec4c6cf46fabfdf22eYigit Boyar
7518ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
7618ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public void setElevation(CardViewDelegate cardView, float elevation) {
77ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        cardView.getCardView().setElevation(elevation);
7818ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
7918ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
8018ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    @Override
8118ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    public float getElevation(CardViewDelegate cardView) {
82ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        return cardView.getCardView().getElevation();
8318ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar    }
8418ef68d444a1c059041bf5b683eb612ffed22ea9Yigit Boyar
85bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    @Override
86bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public void updatePadding(CardViewDelegate cardView) {
87c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar        if (!cardView.getUseCompatPadding()) {
88bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar            cardView.setShadowPadding(0, 0, 0, 0);
89bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar            return;
90bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        }
91bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        float elevation = getMaxElevation(cardView);
92bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        final float radius = getRadius(cardView);
93bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        int hPadding = (int) Math.ceil(RoundRectDrawableWithShadow
94c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar                .calculateHorizontalPadding(elevation, radius, cardView.getPreventCornerOverlap()));
95bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        int vPadding = (int) Math.ceil(RoundRectDrawableWithShadow
96c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar                .calculateVerticalPadding(elevation, radius, cardView.getPreventCornerOverlap()));
97bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        cardView.setShadowPadding(hPadding, vPadding, hPadding, vPadding);
98bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
99bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
100bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    @Override
101bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    public void onCompatPaddingChanged(CardViewDelegate cardView) {
102bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar        setMaxElevation(cardView, getMaxElevation(cardView));
103bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar    }
104bdb07a1802c017efa64a5cfd8ab5a7ff4c4926b0Yigit Boyar
105c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar    @Override
106c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar    public void onPreventCornerOverlapChanged(CardViewDelegate cardView) {
107c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar        setMaxElevation(cardView, getMaxElevation(cardView));
108c42ba8c000d1e6ce85e152dfc17089a0a69e739fYigit Boyar    }
1094eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar
1104eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar    @Override
111d2c60296856244030e9a92ef3065d3884ac67527Aurimas Liutikas    public void setBackgroundColor(CardViewDelegate cardView, @Nullable ColorStateList color) {
112ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        getCardBackground(cardView).setColor(color);
113ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes    }
114ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes
115e7c701f05b4f6afa2913c3743638d7b25b96df83Aurimas Liutikas    @Override
116e7c701f05b4f6afa2913c3743638d7b25b96df83Aurimas Liutikas    public ColorStateList getBackgroundColor(CardViewDelegate cardView) {
117e7c701f05b4f6afa2913c3743638d7b25b96df83Aurimas Liutikas        return getCardBackground(cardView).getColor();
118e7c701f05b4f6afa2913c3743638d7b25b96df83Aurimas Liutikas    }
119e7c701f05b4f6afa2913c3743638d7b25b96df83Aurimas Liutikas
120ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes    private RoundRectDrawable getCardBackground(CardViewDelegate cardView) {
121ffbf42aa3acb41b82cc6c1226c63c3649bedfe49Chris Banes        return ((RoundRectDrawable) cardView.getCardBackground());
1224eb77f0ed24a9d300f7d12959de8cf7efd837e2fYigit Boyar    }
123b7adf5d2ae19bc616c2d040a667ac1de3769f423Aurimas Liutikas}
124