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