1a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes/* 2a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * Copyright (C) 2014 The Android Open Source Project 3a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 4a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 5a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * you may not use this file except in compliance with the License. 6a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * You may obtain a copy of the License at 7a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 8a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 9a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 10a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * Unless required by applicable law or agreed to in writing, software 11a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 12a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * See the License for the specific language governing permissions and 14a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * limitations under the License. 15a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 16a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 17a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banespackage android.support.v4.view; 18a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 19a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.content.res.ColorStateList; 20a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.graphics.PorterDuff; 21a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.view.View; 22a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 23a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banesimport java.lang.reflect.Field; 24a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 25a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesclass ViewCompatBase { 26a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 27f6610f183f0afe6e392dea804474f722d82083fdChris Banes private static final String TAG = "ViewCompatBase"; 28f6610f183f0afe6e392dea804474f722d82083fdChris Banes 29a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes private static Field sMinWidthField; 30f6610f183f0afe6e392dea804474f722d82083fdChris Banes private static boolean sMinWidthFieldFetched; 31a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes private static Field sMinHeightField; 32f6610f183f0afe6e392dea804474f722d82083fdChris Banes private static boolean sMinHeightFieldFetched; 33f6610f183f0afe6e392dea804474f722d82083fdChris Banes 34a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes static ColorStateList getBackgroundTintList(View view) { 35a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes return (view instanceof TintableBackgroundView) 36a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes ? ((TintableBackgroundView) view).getSupportBackgroundTintList() 37a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes : null; 38a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 39a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 40a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes static void setBackgroundTintList(View view, ColorStateList tintList) { 41a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (view instanceof TintableBackgroundView) { 42a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes ((TintableBackgroundView) view).setSupportBackgroundTintList(tintList); 43a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 44a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 45a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 46a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes static PorterDuff.Mode getBackgroundTintMode(View view) { 47a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes return (view instanceof TintableBackgroundView) 48a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes ? ((TintableBackgroundView) view).getSupportBackgroundTintMode() 49a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes : null; 50a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 51a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 52a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes static void setBackgroundTintMode(View view, PorterDuff.Mode mode) { 53a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (view instanceof TintableBackgroundView) { 54a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes ((TintableBackgroundView) view).setSupportBackgroundTintMode(mode); 55a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 56a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 57f91071ff037056101389f2cbfc5fadb0229a36a7Chris Banes 58f91071ff037056101389f2cbfc5fadb0229a36a7Chris Banes static boolean isLaidOut(View view) { 59f91071ff037056101389f2cbfc5fadb0229a36a7Chris Banes return view.getWidth() > 0 && view.getHeight() > 0; 60f91071ff037056101389f2cbfc5fadb0229a36a7Chris Banes } 61a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 62a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes static int getMinimumWidth(View view) { 63f6610f183f0afe6e392dea804474f722d82083fdChris Banes if (!sMinWidthFieldFetched) { 64a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes try { 65a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes sMinWidthField = View.class.getDeclaredField("mMinWidth"); 66a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes sMinWidthField.setAccessible(true); 67a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } catch (NoSuchFieldException e) { 68a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes // Couldn't find the field. Abort! 69a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 70f6610f183f0afe6e392dea804474f722d82083fdChris Banes sMinWidthFieldFetched = true; 71a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 72a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 73a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes if (sMinWidthField != null) { 74a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes try { 75a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes return (int) sMinWidthField.get(view); 76a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } catch (Exception e) { 77a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes // Field get failed. Oh well... 78a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 79a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 80a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 81a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes // We failed, return 0 82a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes return 0; 83a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 84a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 85a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes static int getMinimumHeight(View view) { 86f6610f183f0afe6e392dea804474f722d82083fdChris Banes if (!sMinHeightFieldFetched) { 87a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes try { 88a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes sMinHeightField = View.class.getDeclaredField("mMinHeight"); 89a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes sMinHeightField.setAccessible(true); 90a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } catch (NoSuchFieldException e) { 91a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes // Couldn't find the field. Abort! 92a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 93f6610f183f0afe6e392dea804474f722d82083fdChris Banes sMinHeightFieldFetched = true; 94a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 95a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 96a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes if (sMinHeightField != null) { 97a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes try { 98a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes return (int) sMinHeightField.get(view); 99a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } catch (Exception e) { 100a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes // Field get failed. Oh well... 101a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 102a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 103a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes 104a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes // We failed, return 0 105a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes return 0; 106a6a508b2296730ca6954aaebcca52a9962a5cb55Chris Banes } 107f6610f183f0afe6e392dea804474f722d82083fdChris Banes 108f6610f183f0afe6e392dea804474f722d82083fdChris Banes static boolean isAttachedToWindow(View view) { 109f6610f183f0afe6e392dea804474f722d82083fdChris Banes return view.getWindowToken() != null; 110f6610f183f0afe6e392dea804474f722d82083fdChris Banes } 111a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes} 112