1415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes/*
2415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * Copyright (C) 2014 The Android Open Source Project
3415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes *
4415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * you may not use this file except in compliance with the License.
6415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * You may obtain a copy of the License at
7415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes *
8415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes *
10415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * Unless required by applicable law or agreed to in writing, software
11415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * See the License for the specific language governing permissions and
14415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * limitations under the License.
15415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes */
16415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
17415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banespackage android.support.v7.internal.widget;
18415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
190332c97857f4aa1071e2e01875129ca3bea6c052Chris Banesimport android.annotation.TargetApi;
20415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banesimport android.content.Context;
210332c97857f4aa1071e2e01875129ca3bea6c052Chris Banesimport android.graphics.drawable.Drawable;
22415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banesimport android.os.Build;
23415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banesimport android.util.AttributeSet;
240332c97857f4aa1071e2e01875129ca3bea6c052Chris Banesimport android.widget.ListPopupWindow;
25415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banesimport android.widget.Spinner;
26415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
270332c97857f4aa1071e2e01875129ca3bea6c052Chris Banesimport java.lang.reflect.Field;
280332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes
29415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes/**
30415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * An tint aware {@link android.widget.Spinner}.
31415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes *
32415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * @hide
33415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes */
34415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banespublic class TintSpinner extends Spinner {
35415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
36415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes    private static final int[] TINT_ATTRS = {
37415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes            android.R.attr.background,
38415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes            android.R.attr.popupBackground
39415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes    };
40415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
41415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes    public TintSpinner(Context context) {
42415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes        this(context, null);
43415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes    }
44415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
45415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes    public TintSpinner(Context context, AttributeSet attrs) {
46415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes        this(context, attrs, android.R.attr.spinnerStyle);
47415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes    }
48415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
49415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes    public TintSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
50415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes        super(context, attrs, defStyleAttr);
51415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
52415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes        TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, TINT_ATTRS,
53415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes                defStyleAttr, 0);
54415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes        setBackgroundDrawable(a.getDrawable(0));
55415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
560332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes        if (a.hasValue(1)) {
570332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            final Drawable background = a.getDrawable(1);
580332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            if (Build.VERSION.SDK_INT >= 16) {
590332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes                setPopupBackgroundDrawable(background);
600332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            } else if (Build.VERSION.SDK_INT >= 11) {
610332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes                setPopupBackgroundDrawableV11(this, background);
620332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            }
63415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes        }
64415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
65415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes        a.recycle();
66415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes    }
67415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes
680332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
690332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes    private static void setPopupBackgroundDrawableV11(Spinner view, Drawable background) {
700332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes        try {
710332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            Field popupField = Spinner.class.getDeclaredField("mPopup");
720332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            popupField.setAccessible(true);
730332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes
740332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            Object popup = popupField.get(view);
750332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes
760332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            if (popup instanceof ListPopupWindow) {
770332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes                ((ListPopupWindow) popup).setBackgroundDrawable(background);
780332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            }
790332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes        } catch (NoSuchFieldException e) {
800332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            e.printStackTrace();
810332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes        } catch (IllegalAccessException e) {
820332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes            e.printStackTrace();
830332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes        }
840332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes    }
850332c97857f4aa1071e2e01875129ca3bea6c052Chris Banes
86415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes}
87