NavigationMenuItemView.java revision a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9f
18965a6a0d2165f32e6413594bba6367f271f51e7vladlosev/*
28965a6a0d2165f32e6413594bba6367f271f51e7vladlosev * Copyright (C) 2015 The Android Open Source Project
38965a6a0d2165f32e6413594bba6367f271f51e7vladlosev *
4532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * Licensed under the Apache License, Version 2.0 (the "License");
5532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * you may not use this file except in compliance with the License.
6532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * You may obtain a copy of the License at
7532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan *
8532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan *      http://www.apache.org/licenses/LICENSE-2.0
9532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan *
10532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * Unless required by applicable law or agreed to in writing, software
11532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * distributed under the License is distributed on an "AS IS" BASIS,
12532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * See the License for the specific language governing permissions and
14532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * limitations under the License.
15532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan */
16532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
17532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanpackage android.support.design.internal;
18532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
19532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.content.Context;
20532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.content.res.ColorStateList;
21532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.graphics.Color;
22532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.graphics.drawable.ColorDrawable;
23532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.graphics.drawable.Drawable;
24532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.graphics.drawable.StateListDrawable;
25532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.support.design.R;
26532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.support.v4.graphics.drawable.DrawableCompat;
27532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.support.v4.widget.TextViewCompat;
28532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.support.v7.internal.view.menu.MenuItemImpl;
29532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.support.v7.internal.view.menu.MenuView;
30532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.util.AttributeSet;
31532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.util.TypedValue;
32532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.view.View;
33532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.widget.TextView;
34532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
35532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan/**
36532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * @hide
37532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan */
384853a503371f39aa22e14adcdecea71c09841e34zhanyong.wanpublic class NavigationMenuItemView extends TextView implements MenuView.ItemView {
394853a503371f39aa22e14adcdecea71c09841e34zhanyong.wan
40532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
41532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
42532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    private static final int[] DISABLED_STATE_SET = {-android.R.attr.state_enabled};
43ed8500b341c473ecf46acd13951ae5b4e3acc780zhanyong.wan
44ed8500b341c473ecf46acd13951ae5b4e3acc780zhanyong.wan    private int mIconSize;
45ed8500b341c473ecf46acd13951ae5b4e3acc780zhanyong.wan
46ed8500b341c473ecf46acd13951ae5b4e3acc780zhanyong.wan    private MenuItemImpl mItemData;
47cfcbc298cd91806e0e3417e03fce42bc4f1fa150vladlosev
48cfcbc298cd91806e0e3417e03fce42bc4f1fa150vladlosev    private ColorStateList mTintList;
49ffeb11d14a890b902dbb26ff2296cda7bf2d31dfzhanyong.wan
50e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan    public NavigationMenuItemView(Context context) {
51ffeb11d14a890b902dbb26ff2296cda7bf2d31dfzhanyong.wan        this(context, null);
52e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan    }
53e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan
54e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan    public NavigationMenuItemView(Context context, AttributeSet attrs) {
55e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        this(context, attrs, 0);
567d1051ce2b3be67d27b200d0050a7ec88c18621bkosak    }
577d1051ce2b3be67d27b200d0050a7ec88c18621bkosak
587d1051ce2b3be67d27b200d0050a7ec88c18621bkosak    public NavigationMenuItemView(Context context, AttributeSet attrs, int defStyleAttr) {
597d1051ce2b3be67d27b200d0050a7ec88c18621bkosak        super(context, attrs, defStyleAttr);
607d1051ce2b3be67d27b200d0050a7ec88c18621bkosak        mIconSize = context.getResources().getDimensionPixelSize(R.dimen.navigation_icon_size);
617d1051ce2b3be67d27b200d0050a7ec88c18621bkosak    }
627d1051ce2b3be67d27b200d0050a7ec88c18621bkosak
637d1051ce2b3be67d27b200d0050a7ec88c18621bkosak    @Override
64532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    public void initialize(MenuItemImpl itemData, int menuType) {
65532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        mItemData = itemData;
66e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan
67e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE);
68e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan
69e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        if (mTintList == null && (itemData.isChecked() || !itemData.isEnabled())) {
70e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan            mTintList = createDefaultTintList();
71e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan            setTextColor(mTintList);
72e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        }
73e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        if (getBackground() == null) {
74e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan            setBackgroundDrawable(createDefaultBackground());
75e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        }
76e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan
77e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        setCheckable(itemData.isCheckable());
78e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        setChecked(itemData.isChecked());
79e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        setTitle(itemData.getTitle());
80e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        setIcon(itemData.getIcon());
81e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan        setEnabled(itemData.isEnabled());
82532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    }
83e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan
84532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    private ColorStateList createDefaultTintList() {
85532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        TypedValue value = new TypedValue();
86532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        if (!getContext().getTheme()
87532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan                .resolveAttribute(android.R.attr.textColorPrimary, value, true)) {
88532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            return null;
89532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        }
90532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        ColorStateList base = getResources().getColorStateList(value.resourceId);
91532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        if (!getContext().getTheme().resolveAttribute(R.attr.colorPrimary, value, true)) {
92532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            return null;
93532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        }
94532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        int colorPrimary = value.data;
95532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        int defaultColor = base.getDefaultColor();
96532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        return new ColorStateList(new int[][]{
97532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan                DISABLED_STATE_SET,
98532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan                CHECKED_STATE_SET,
99532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan                EMPTY_STATE_SET
100532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        }, new int[]{
101532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan                base.getColorForState(DISABLED_STATE_SET, defaultColor),
102532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan                colorPrimary,
103532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan                defaultColor
104532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        });
105532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    }
106532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
107532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    private StateListDrawable createDefaultBackground() {
108532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        TypedValue value = new TypedValue();
109532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        if (getContext().getTheme()
110532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan                .resolveAttribute(R.attr.colorControlHighlight, value, true)) {
111532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            StateListDrawable drawable = new StateListDrawable();
112532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            drawable.addState(CHECKED_STATE_SET, new ColorDrawable(value.data));
113532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            drawable.addState(EMPTY_STATE_SET, new ColorDrawable(Color.TRANSPARENT));
114532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            return drawable;
115532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        }
116532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        return null;
117532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    }
118532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
119532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    @Override
120532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    public MenuItemImpl getItemData() {
121532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        return mItemData;
122532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    }
123532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
124532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    @Override
125532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    public void setTitle(CharSequence title) {
126532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        setText(title);
127532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    }
128532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
129532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    @Override
130532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    public void setCheckable(boolean checkable) {
131532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        if (checkable && mTintList != null) {
132532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            setTextColor(mTintList);
133532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        }
134532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    }
135532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
136532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    @Override
137532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    public void setChecked(boolean checked) {
138532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        refreshDrawableState();
139532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    }
140532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
141532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    @Override
142532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    public void setShortcut(boolean showShortcut, char shortcutKey) {
143532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    }
144532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
145532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    @Override
146532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    public void setIcon(Drawable icon) {
147532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        if (icon != null) {
148532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            icon = DrawableCompat.wrap(icon);
149532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            icon.setBounds(0, 0, mIconSize, mIconSize);
150532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            icon = icon.mutate();
151532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            if (mItemData.isChecked() || !mItemData.isEnabled()) {
152532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan                DrawableCompat.setTintList(icon, mTintList);
153ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev            } else {
1548965a6a0d2165f32e6413594bba6367f271f51e7vladlosev                DrawableCompat.setTintList(icon, null);
1558965a6a0d2165f32e6413594bba6367f271f51e7vladlosev            }
156532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        }
157532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        TextViewCompat.setCompoundDrawablesRelative(this, icon, null, null, null);
158ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev    }
1598965a6a0d2165f32e6413594bba6367f271f51e7vladlosev
1608965a6a0d2165f32e6413594bba6367f271f51e7vladlosev    @Override
161532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    public boolean prefersCondensedTitle() {
162532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        return false;
163ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev    }
1648965a6a0d2165f32e6413594bba6367f271f51e7vladlosev
1658965a6a0d2165f32e6413594bba6367f271f51e7vladlosev    @Override
166532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    public boolean showsIcon() {
167532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        return true;
168ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev    }
1698965a6a0d2165f32e6413594bba6367f271f51e7vladlosev
1708965a6a0d2165f32e6413594bba6367f271f51e7vladlosev    @Override
171532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan    protected int[] onCreateDrawableState(int extraSpace) {
172532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        if (mItemData != null && mItemData.isChecked()) {
173ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev            return mergeDrawableStates(super.onCreateDrawableState(extraSpace + 1),
1748965a6a0d2165f32e6413594bba6367f271f51e7vladlosev                    CHECKED_STATE_SET);
1758965a6a0d2165f32e6413594bba6367f271f51e7vladlosev        } else {
176532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan            return super.onCreateDrawableState(extraSpace);
177532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        }
178ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev    }
1798965a6a0d2165f32e6413594bba6367f271f51e7vladlosev
1808965a6a0d2165f32e6413594bba6367f271f51e7vladlosev    public void setTintList(ColorStateList tintList) {
181532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        mTintList = tintList;
182532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan        if (tintList != null) {
183ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev            setTextColor(tintList);
1848965a6a0d2165f32e6413594bba6367f271f51e7vladlosev        }
1858965a6a0d2165f32e6413594bba6367f271f51e7vladlosev    }
186532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan
187532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan}
188ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev