/* * Copyright (c) 2016 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com> * All Rights Reserved. */ package me.zhanghai.android.douya.util; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.drawable.Drawable; import android.support.design.widget.NavigationView; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.ContextThemeWrapper; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.Window; import android.widget.ImageView; import me.zhanghai.android.douya.R; public class TintHelper { private static final int[] CHECKED_STATE_SET = new int[] { android.R.attr.state_checked }; private static final int[] DISABLED_STATE_SET = new int[] { -android.R.attr.state_enabled }; private static final int[] EMPTY_STATE_SET = new int[] {}; private TintHelper() {} public static void onPanelMenuCreated(int featureId, Menu menu, AppCompatActivity activity) { if (featureId == Window.FEATURE_OPTIONS_PANEL) { Context context = activity.getSupportActionBar().getThemedContext(); ColorStateList menuTintList = ViewUtils.getColorStateListFromAttrRes( R.attr.colorControlNormal, context); int popupThemeResId = ViewUtils.getResIdFromAttrRes(R.attr.popupTheme, 0, context); ColorStateList subMenuTintList; if (popupThemeResId != 0) { Context popupContext = new ContextThemeWrapper(context, popupThemeResId); subMenuTintList = ViewUtils.getColorStateListFromAttrRes(R.attr.colorControlNormal, popupContext); } else { subMenuTintList = menuTintList; } tintMenuItemIcon(menu, menuTintList, subMenuTintList); } } private static void tintMenuItemIcon(Menu menu, ColorStateList menuTintList, ColorStateList subMenuTintList) { for (int i = 0, size = menu.size(); i < size; ++i) { MenuItem menuItem = menu.getItem(i); Drawable icon = menuItem.getIcon(); if (icon != null) { icon = tintDrawable(icon, menuTintList); menuItem.setIcon(icon); } SubMenu subMenu = menuItem.getSubMenu(); if (subMenu != null) { tintMenuItemIcon(subMenu, subMenuTintList, subMenuTintList); } } } public static void onSetSupportActionBar(Toolbar toolbar) { Drawable icon = toolbar.getNavigationIcon(); ColorStateList tintList = ViewUtils.getColorStateListFromAttrRes(R.attr.colorControlNormal, toolbar.getContext()); icon = tintDrawable(icon, tintList); toolbar.setNavigationIcon(icon); } public static Drawable tintDrawable(Drawable drawable, ColorStateList tintList) { drawable = DrawableCompat.wrap(drawable); drawable.mutate(); DrawableCompat.setTintList(drawable, tintList); return drawable; } public static Drawable tintIcon(Drawable icon, Context context) { ColorStateList iconTintList = ViewUtils.getColorStateListFromAttrRes( R.attr.colorControlNormal, context); return tintDrawable(icon, iconTintList); } public static void tintImageViewIcon(ImageView imageView) { imageView.setImageDrawable(tintIcon(imageView.getDrawable(), imageView.getContext())); } public static void updateNavigationItemTint(NavigationView navigationView, int primaryColorRes) { Context context = navigationView.getContext(); int primaryColor = ContextCompat.getColor(context, primaryColorRes); navigationView.setItemIconTintList(createNavigationItemTintList( android.R.attr.textColorSecondary, primaryColor, context)); navigationView.setItemTextColor(createNavigationItemTintList( android.R.attr.textColorPrimary, primaryColor, context)); } private static ColorStateList createNavigationItemTintList(int baseColorAttrRes, int primaryColor, Context context) { ColorStateList baseColor = ViewUtils.getColorStateListFromAttrRes(baseColorAttrRes, context); int defaultColor = baseColor.getDefaultColor(); return new ColorStateList(new int[][] { DISABLED_STATE_SET, CHECKED_STATE_SET, EMPTY_STATE_SET }, new int[] { baseColor.getColorForState(DISABLED_STATE_SET, defaultColor), primaryColor, defaultColor }); } }