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

Commit 73b84186 authored by Kirill Grouchnikov's avatar Kirill Grouchnikov Committed by Android (Google) Code Review
Browse files

Merge "Add support for tinting icon menus"

parents 541feb1c 6eea0d2a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -696,6 +696,8 @@ package android {
    field public static final int hyphenationFrequency = 16843998; // 0x10104de
    field public static final int icon = 16842754; // 0x1010002
    field public static final int iconPreview = 16843337; // 0x1010249
    field public static final int iconTint = 16844129; // 0x1010561
    field public static final int iconTintMode = 16844130; // 0x1010562
    field public static final int iconifiedByDefault = 16843514; // 0x10102fa
    field public static final int id = 16842960; // 0x10100d0
    field public static final int ignoreGravity = 16843263; // 0x10101ff
@@ -44616,6 +44618,8 @@ package android.view {
    method public default java.lang.CharSequence getContentDescription();
    method public abstract int getGroupId();
    method public abstract android.graphics.drawable.Drawable getIcon();
    method public default android.content.res.ColorStateList getIconTintList();
    method public default android.graphics.PorterDuff.Mode getIconTintMode();
    method public abstract android.content.Intent getIntent();
    method public abstract int getItemId();
    method public abstract android.view.ContextMenu.ContextMenuInfo getMenuInfo();
@@ -44643,6 +44647,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 default android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
    method public default 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 default android.view.MenuItem setNumericShortcut(char, int);
+6 −0
Original line number Diff line number Diff line
@@ -809,6 +809,8 @@ package android {
    field public static final int hyphenationFrequency = 16843998; // 0x10104de
    field public static final int icon = 16842754; // 0x1010002
    field public static final int iconPreview = 16843337; // 0x1010249
    field public static final int iconTint = 16844129; // 0x1010561
    field public static final int iconTintMode = 16844130; // 0x1010562
    field public static final int iconifiedByDefault = 16843514; // 0x10102fa
    field public static final int id = 16842960; // 0x10100d0
    field public static final int ignoreGravity = 16843263; // 0x10101ff
@@ -48070,6 +48072,8 @@ package android.view {
    method public default java.lang.CharSequence getContentDescription();
    method public abstract int getGroupId();
    method public abstract android.graphics.drawable.Drawable getIcon();
    method public default android.content.res.ColorStateList getIconTintList();
    method public default android.graphics.PorterDuff.Mode getIconTintMode();
    method public abstract android.content.Intent getIntent();
    method public abstract int getItemId();
    method public abstract android.view.ContextMenu.ContextMenuInfo getMenuInfo();
@@ -48097,6 +48101,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 default android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
    method public default 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 default android.view.MenuItem setNumericShortcut(char, int);
+6 −0
Original line number Diff line number Diff line
@@ -696,6 +696,8 @@ package android {
    field public static final int hyphenationFrequency = 16843998; // 0x10104de
    field public static final int icon = 16842754; // 0x1010002
    field public static final int iconPreview = 16843337; // 0x1010249
    field public static final int iconTint = 16844129; // 0x1010561
    field public static final int iconTintMode = 16844130; // 0x1010562
    field public static final int iconifiedByDefault = 16843514; // 0x10102fa
    field public static final int id = 16842960; // 0x10100d0
    field public static final int ignoreGravity = 16843263; // 0x10101ff
@@ -44976,6 +44978,8 @@ package android.view {
    method public default java.lang.CharSequence getContentDescription();
    method public abstract int getGroupId();
    method public abstract android.graphics.drawable.Drawable getIcon();
    method public default android.content.res.ColorStateList getIconTintList();
    method public default android.graphics.PorterDuff.Mode getIconTintMode();
    method public abstract android.content.Intent getIntent();
    method public abstract int getItemId();
    method public abstract android.view.ContextMenu.ContextMenuInfo getMenuInfo();
@@ -45003,6 +45007,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 default android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
    method public default 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 default android.view.MenuItem setNumericShortcut(char, int);
+29 −0
Original line number Diff line number Diff line
@@ -20,8 +20,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;
@@ -304,6 +307,8 @@ public class MenuInflater {
        private CharSequence itemTitle;
        private CharSequence itemTitleCondensed;
        private int itemIconResId;
        private ColorStateList itemIconTintList = null;
        private PorterDuff.Mode itemIconTintMode = null;
        private char itemAlphabeticShortcut;
        private int itemAlphabeticModifiers;
        private char itemNumericShortcut;
@@ -395,6 +400,22 @@ public class MenuInflater {
            itemTitle = a.getText(com.android.internal.R.styleable.MenuItem_title);
            itemTitleCondensed = a.getText(com.android.internal.R.styleable.MenuItem_titleCondensed);
            itemIconResId = a.getResourceId(com.android.internal.R.styleable.MenuItem_icon, 0);
            if (a.hasValue(com.android.internal.R.styleable.MenuItem_iconTintMode)) {
                itemIconTintMode = Drawable.parseTintMode(a.getInt(
                        com.android.internal.R.styleable.MenuItem_iconTintMode, -1),
                        itemIconTintMode);
            } else {
                // Reset to null so that it's not carried over to the next item
                itemIconTintMode = null;
            }
            if (a.hasValue(com.android.internal.R.styleable.MenuItem_iconTint)) {
                itemIconTintList = a.getColorStateList(
                        com.android.internal.R.styleable.MenuItem_iconTint);
            } else {
                // Reset to null so that it's not carried over to the next item
                itemIconTintList = null;
            }

            itemAlphabeticShortcut =
                    getShortcut(a.getString(com.android.internal.R.styleable.MenuItem_alphabeticShortcut));
            itemAlphabeticModifiers =
@@ -466,6 +487,14 @@ public class MenuInflater {
                item.setShowAsAction(itemShowAsAction);
            }

            if (itemIconTintMode != null) {
                item.setIconTintMode(itemIconTintMode);
            }

            if (itemIconTintList != null) {
                item.setIconTintList(itemIconTintList);
            }

            if (itemListenerMethodName != null) {
                if (mContext.isRestricted()) {
                    throw new IllegalStateException("The android:onClick attribute cannot "
+55 −1
Original line number Diff line number Diff line
@@ -18,9 +18,12 @@ package android.view;

import android.annotation.DrawableRes;
import android.annotation.LayoutRes;
import android.annotation.Nullable;
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;
@@ -221,12 +224,63 @@ public interface MenuItem {
    
    /**
     * Returns the icon for this item as a Drawable (getting it from resources if it hasn't been
     * loaded before).
     * loaded before). Note that if you call {@link #setIconTintList(ColorStateList)} or
     * {@link #setIconTintMode(PorterDuff.Mode)} on this item, and you use a custom menu presenter
     * in your application, you have to apply the tinting explicitly on the {@link Drawable}
     * returned by this method.
     * 
     * @return The icon as a Drawable.
     */
    public Drawable getIcon();

    /**
     * Applies a tint to this item's icon. Does not modify the
     * current tint mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
     * <p>
     * Subsequent calls to {@link #setIcon(Drawable)} or {@link #setIcon(int)} will
     * automatically mutate the icon and apply the specified tint and
     * tint mode using
     * {@link Drawable#setTintList(ColorStateList)}.
     *
     * @param tint the tint to apply, may be {@code null} to clear tint
     *
     * @attr ref android.R.styleable#MenuItem_iconTint
     * @see #getIconTintList()
     * @see Drawable#setTintList(ColorStateList)
     */
    public default MenuItem setIconTintList(@Nullable ColorStateList tint) { return this; }

    /**
     * @return the tint applied to this item's icon
     * @attr ref android.R.styleable#MenuItem_iconTint
     * @see #setIconTintList(ColorStateList)
     */
    @Nullable
    public default ColorStateList getIconTintList() { return null; }

    /**
     * Specifies the blending mode used to apply the tint specified by
     * {@link #setIconTintList(ColorStateList)} to this item's icon. 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
     * @attr ref android.R.styleable#MenuItem_iconTintMode
     * @see #setIconTintList(ColorStateList)
     * @see Drawable#setTintMode(PorterDuff.Mode)
     */
    public default MenuItem setIconTintMode(@Nullable PorterDuff.Mode tintMode) { return this; }

    /**
     * Returns the blending mode used to apply the tint to this item's icon, if specified.
     *
     * @return the blending mode used to apply the tint to this item's icon
     * @attr ref android.R.styleable#MenuItem_iconTintMode
     * @see #setIconTintMode(PorterDuff.Mode)
     */
    @Nullable
    public default PorterDuff.Mode getIconTintMode() { return null; }
    
    /**
     * Change the Intent associated with this item.  By default there is no
     * Intent associated with a menu item.  If you set one, and nothing
Loading