Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9cc36ca1 authored by Chris Banes's avatar Chris Banes
Browse files

MenuItem, navigation and overflow icon tinting

- iconTint and iconTintMode attrs for MenuItem, with
  associated setters.
- navigationTint and navigationTintMode attrs for Toolbar
  with associated setters.
- overlflowTint and overflowTintMode attrs for Toolbar
  with associated setters.

BUG: 18126050
BUG: 19148351
BUG: 19305408

Change-Id: Ibd1fae7cdbc7a7c42809e52541fae5d8beb18e92
parent 1b4b87c2
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -664,6 +664,8 @@ package android {
    field public static final int host = 16842792; // 0x1010028
    field public static final int icon = 16842754; // 0x1010002
    field public static final int iconPreview = 16843337; // 0x1010249
    field public static final int iconTint = 16844000; // 0x10104e0
    field public static final int iconTintMode = 16844001; // 0x10104e1
    field public static final int iconifiedByDefault = 16843514; // 0x10102fa
    field public static final int id = 16842960; // 0x10100d0
    field public static final int ignoreGravity = 16843263; // 0x10101ff
@@ -873,6 +875,8 @@ package android {
    field public static final int navigationContentDescription = 16843969; // 0x10104c1
    field public static final int navigationIcon = 16843968; // 0x10104c0
    field public static final int navigationMode = 16843471; // 0x10102cf
    field public static final int navigationTint = 16844004; // 0x10104e4
    field public static final int navigationTintMode = 16844005; // 0x10104e5
    field public static final int negativeButtonText = 16843254; // 0x10101f6
    field public static final int nestedScrollingEnabled = 16843830; // 0x1010436
    field public static final int nextFocusDown = 16842980; // 0x10100e4
@@ -904,6 +908,8 @@ package android {
    field public static final int overScrollFooter = 16843459; // 0x10102c3
    field public static final int overScrollHeader = 16843458; // 0x10102c2
    field public static final int overScrollMode = 16843457; // 0x10102c1
    field public static final int overflowTint = 16844002; // 0x10104e2
    field public static final int overflowTintMode = 16844003; // 0x10104e3
    field public static final int overlapAnchor = 16843874; // 0x1010462
    field public static final int overridesImplicitlyEnabledSubtype = 16843682; // 0x10103a2
    field public static final int packageNames = 16843649; // 0x1010381
@@ -33488,6 +33494,8 @@ package android.view {
    method public abstract android.view.MenuItem setEnabled(boolean);
    method public abstract android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
    method public abstract android.view.MenuItem setIcon(int);
    method public abstract android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
    method public abstract android.view.MenuItem setIconTintMode(android.graphics.PorterDuff.Mode);
    method public abstract android.view.MenuItem setIntent(android.content.Intent);
    method public abstract android.view.MenuItem setNumericShortcut(char);
    method public abstract android.view.MenuItem setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener);
@@ -37427,6 +37435,8 @@ package android.widget {
    method public void onConfigurationChanged(android.content.res.Configuration);
    method public void onDetachedFromWindow();
    method public void setOnMenuItemClickListener(android.widget.ActionMenuView.OnMenuItemClickListener);
    method public void setOverflowTintList(android.content.res.ColorStateList);
    method public void setOverflowTintMode(android.graphics.PorterDuff.Mode);
    method public void setPopupTheme(int);
    method public boolean showOverflowMenu();
  }
@@ -39722,7 +39732,11 @@ package android.widget {
    method public void setNavigationIcon(int);
    method public void setNavigationIcon(android.graphics.drawable.Drawable);
    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
    method public void setNavigationTintList(android.content.res.ColorStateList);
    method public void setNavigationTintMode(android.graphics.PorterDuff.Mode);
    method public void setOnMenuItemClickListener(android.widget.Toolbar.OnMenuItemClickListener);
    method public void setOverflowTintList(android.content.res.ColorStateList);
    method public void setOverflowTintMode(android.graphics.PorterDuff.Mode);
    method public void setPopupTheme(int);
    method public void setSubtitle(int);
    method public void setSubtitle(java.lang.CharSequence);
+14 −0
Original line number Diff line number Diff line
@@ -736,6 +736,8 @@ package android {
    field public static final int host = 16842792; // 0x1010028
    field public static final int icon = 16842754; // 0x1010002
    field public static final int iconPreview = 16843337; // 0x1010249
    field public static final int iconTint = 16844000; // 0x10104e0
    field public static final int iconTintMode = 16844001; // 0x10104e1
    field public static final int iconifiedByDefault = 16843514; // 0x10102fa
    field public static final int id = 16842960; // 0x10100d0
    field public static final int ignoreGravity = 16843263; // 0x10101ff
@@ -945,6 +947,8 @@ package android {
    field public static final int navigationContentDescription = 16843969; // 0x10104c1
    field public static final int navigationIcon = 16843968; // 0x10104c0
    field public static final int navigationMode = 16843471; // 0x10102cf
    field public static final int navigationTint = 16844004; // 0x10104e4
    field public static final int navigationTintMode = 16844005; // 0x10104e5
    field public static final int negativeButtonText = 16843254; // 0x10101f6
    field public static final int nestedScrollingEnabled = 16843830; // 0x1010436
    field public static final int nextFocusDown = 16842980; // 0x10100e4
@@ -976,6 +980,8 @@ package android {
    field public static final int overScrollFooter = 16843459; // 0x10102c3
    field public static final int overScrollHeader = 16843458; // 0x10102c2
    field public static final int overScrollMode = 16843457; // 0x10102c1
    field public static final int overflowTint = 16844002; // 0x10104e2
    field public static final int overflowTintMode = 16844003; // 0x10104e3
    field public static final int overlapAnchor = 16843874; // 0x1010462
    field public static final int overridesImplicitlyEnabledSubtype = 16843682; // 0x10103a2
    field public static final int packageNames = 16843649; // 0x1010381
@@ -35649,6 +35655,8 @@ package android.view {
    method public abstract android.view.MenuItem setEnabled(boolean);
    method public abstract android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
    method public abstract android.view.MenuItem setIcon(int);
    method public abstract android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
    method public abstract android.view.MenuItem setIconTintMode(android.graphics.PorterDuff.Mode);
    method public abstract android.view.MenuItem setIntent(android.content.Intent);
    method public abstract android.view.MenuItem setNumericShortcut(char);
    method public abstract android.view.MenuItem setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener);
@@ -39886,6 +39894,8 @@ package android.widget {
    method public void onConfigurationChanged(android.content.res.Configuration);
    method public void onDetachedFromWindow();
    method public void setOnMenuItemClickListener(android.widget.ActionMenuView.OnMenuItemClickListener);
    method public void setOverflowTintList(android.content.res.ColorStateList);
    method public void setOverflowTintMode(android.graphics.PorterDuff.Mode);
    method public void setPopupTheme(int);
    method public boolean showOverflowMenu();
  }
@@ -42181,7 +42191,11 @@ package android.widget {
    method public void setNavigationIcon(int);
    method public void setNavigationIcon(android.graphics.drawable.Drawable);
    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
    method public void setNavigationTintList(android.content.res.ColorStateList);
    method public void setNavigationTintMode(android.graphics.PorterDuff.Mode);
    method public void setOnMenuItemClickListener(android.widget.Toolbar.OnMenuItemClickListener);
    method public void setOverflowTintList(android.content.res.ColorStateList);
    method public void setOverflowTintMode(android.graphics.PorterDuff.Mode);
    method public void setPopupTheme(int);
    method public void setSubtitle(int);
    method public void setSubtitle(java.lang.CharSequence);
+32 −0
Original line number Diff line number Diff line
@@ -25,8 +25,11 @@ import android.annotation.MenuRes;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Xml;
@@ -334,6 +337,11 @@ public class MenuInflater {
        
        private ActionProvider itemActionProvider;

        private ColorStateList itemIconTintList;
        private boolean itemIconTintListSet;
        private PorterDuff.Mode itemIconTintMode;
        private boolean itemIconTintModeSet;

        private static final int defaultGroupId = NO_ID;
        private static final int defaultItemId = NO_ID;
        private static final int defaultItemCategory = 0;
@@ -424,6 +432,23 @@ public class MenuInflater {
                itemActionProvider = null;
            }

            if (a.hasValueOrEmpty(com.android.internal.R.styleable.MenuItem_iconTint)) {
                itemIconTintList = a.getColorStateList(
                        com.android.internal.R.styleable.MenuItem_iconTint);
                itemIconTintListSet = true;
            } else {
                itemIconTintList = null;
                itemIconTintListSet = false;
            }
            if (a.hasValueOrEmpty(com.android.internal.R.styleable.MenuItem_iconTintMode)) {
                itemIconTintMode = Drawable.parseTintMode(
                        a.getInt(com.android.internal.R.styleable.MenuItem_iconTintMode, -1), null);
                itemIconTintModeSet = true;
            } else {
                itemIconTintMode = null;
                itemIconTintModeSet = false;
            }

            a.recycle();

            itemAdded = false;
@@ -486,6 +511,13 @@ public class MenuInflater {
            if (itemActionProvider != null) {
                item.setActionProvider(itemActionProvider);
            }

            if (itemIconTintListSet) {
                item.setIconTintList(itemIconTintList);
            }
            if (itemIconTintModeSet) {
                item.setIconTintMode(itemIconTintMode);
            }
        }

        public MenuItem addItem() {
+24 −0
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import android.annotation.LayoutRes;
import android.annotation.StringRes;
import android.app.Activity;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
@@ -599,4 +601,26 @@ public interface MenuItem {
     * @return This menu item instance for call chaining
     */
    public MenuItem setOnActionExpandListener(OnActionExpandListener listener);

    /**
     * Applies a tint to the icon drawable. Does not modify the current tint
     * mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
     * <p>
     * Subsequent calls to {@link android.view.MenuItem#setIcon(android.graphics.drawable.Drawable)}
     * will automatically mutate the drawable and apply the specified tint and tint mode.
     *
     * @param tint the tint to apply, may be {@code null} to clear tint
     * @return This menu item instance for call chaining
     */
    public MenuItem setIconTintList(ColorStateList tint);

    /**
     * Specifies the blending mode used to apply the tint specified by {@link
     * #setIconTintList(ColorStateList)} to the icon drawable. The default mode is {@link
     * PorterDuff.Mode#SRC_IN}.
     *
     * @param tintMode the blending mode used to apply the tint, may be {@code null} to clear tint
     * @return This menu item instance for call chaining
     */
    public MenuItem setIconTintMode(PorterDuff.Mode tintMode);
}
+48 −3
Original line number Diff line number Diff line
@@ -17,10 +17,10 @@
package android.widget;

import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
@@ -55,7 +55,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter
        implements ActionProvider.SubUiVisibilityListener {
    private static final String TAG = "ActionMenuPresenter";

    private View mOverflowButton;
    private OverflowMenuButton mOverflowButton;
    private boolean mReserveOverflow;
    private boolean mReserveOverflowSet;
    private int mWidthLimit;
@@ -79,6 +79,8 @@ public class ActionMenuPresenter extends BaseMenuPresenter
    private OpenOverflowRunnable mPostedOpenRunnable;
    private ActionMenuPopupCallback mPopupCallback;

    private TintInfo mOverflowTintInfo;

    final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback();
    int mOpenSubMenuId;

@@ -113,6 +115,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter
                mOverflowButton = new OverflowMenuButton(mSystemContext);
                final int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
                mOverflowButton.measure(spec, spec);
                applyOverflowTint();
            }
            width -= mOverflowButton.getMeasuredWidth();
        } else {
@@ -236,6 +239,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter
        if (hasOverflow) {
            if (mOverflowButton == null) {
                mOverflowButton = new OverflowMenuButton(mSystemContext);
                applyOverflowTint();
            }
            ViewGroup parent = (ViewGroup) mOverflowButton.getParent();
            if (parent != mMenuView) {
@@ -550,6 +554,40 @@ public class ActionMenuPresenter extends BaseMenuPresenter
        menuView.initialize(mMenu);
    }

    public void setOverflowTintList(ColorStateList tint) {
        if (mOverflowTintInfo == null) {
            mOverflowTintInfo = new TintInfo();
        }
        mOverflowTintInfo.mTintList = tint;
        mOverflowTintInfo.mHasTintList = true;

        applyOverflowTint();
    }

    public void setOverflowTintMode(PorterDuff.Mode tintMode) {
        if (mOverflowTintInfo == null) {
            mOverflowTintInfo = new TintInfo();
        }
        mOverflowTintInfo.mTintMode = tintMode;
        mOverflowTintInfo.mHasTintMode = true;

        applyOverflowTint();
    }

    private void applyOverflowTint() {
        final TintInfo tintInfo = mOverflowTintInfo;
        if (tintInfo != null && (tintInfo.mHasTintList || tintInfo.mHasTintMode)) {
            if (mOverflowButton != null) {
                if (tintInfo.mHasTintList) {
                    mOverflowButton.setImageTintList(tintInfo.mTintList);
                }
                if (tintInfo.mHasTintMode) {
                    mOverflowButton.setImageTintMode(tintInfo.mTintMode);
                }
            }
        }
    }

    private static class SavedState implements Parcelable {
        public int openSubMenuId;

@@ -774,4 +812,11 @@ public class ActionMenuPresenter extends BaseMenuPresenter
            return mActionButtonPopup != null ? mActionButtonPopup.getPopup() : null;
        }
    }

    private static class TintInfo {
        ColorStateList mTintList;
        PorterDuff.Mode mTintMode;
        boolean mHasTintMode;
        boolean mHasTintList;
    }
}
Loading