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