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

Commit 0b842b46 authored by Tarun Lohani's avatar Tarun Lohani
Browse files

Adding group divider support in Android Menus

Added a divider view in popup_menu_item_layout.
Hiding divider where they are not required in MenuAdapter.

Bug: 32172964
Test: Added test method testGroupDividerEnabledAPI to PopupMenuTest.java
Change-Id: I9cf0e9a72f085336e9f136a7ed17aead0e30760c
parent 3a580256
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -44945,6 +44945,7 @@ package android.view {
    method public abstract void removeGroup(int);
    method public abstract void removeItem(int);
    method public abstract void setGroupCheckable(int, boolean, boolean);
    method public default void setGroupDividerEnabled(boolean);
    method public abstract void setGroupEnabled(int, boolean);
    method public abstract void setGroupVisible(int, boolean);
    method public abstract void setQwertyMode(boolean);
+1 −0
Original line number Diff line number Diff line
@@ -48549,6 +48549,7 @@ package android.view {
    method public abstract void removeGroup(int);
    method public abstract void removeItem(int);
    method public abstract void setGroupCheckable(int, boolean, boolean);
    method public default void setGroupDividerEnabled(boolean);
    method public abstract void setGroupEnabled(int, boolean);
    method public abstract void setGroupVisible(int, boolean);
    method public abstract void setQwertyMode(boolean);
+1 −0
Original line number Diff line number Diff line
@@ -45391,6 +45391,7 @@ package android.view {
    method public abstract void removeGroup(int);
    method public abstract void removeItem(int);
    method public abstract void setGroupCheckable(int, boolean, boolean);
    method public default void setGroupDividerEnabled(boolean);
    method public abstract void setGroupEnabled(int, boolean);
    method public abstract void setGroupVisible(int, boolean);
    method public abstract void setQwertyMode(boolean);
+6 −1
Original line number Diff line number Diff line
@@ -451,5 +451,10 @@ public interface Menu {
     *                 will use numeric shortcuts.
     */
    public void setQwertyMode(boolean isQwerty);
}

    /**
     * Enable or disable the group dividers.
     */
    default void setGroupDividerEnabled(boolean groupDividerEnabled) {
    }
}
 No newline at end of file
+64 −28
Original line number Diff line number Diff line
@@ -16,14 +16,18 @@

package com.android.internal.view.menu;

import com.android.internal.R;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.AbsListView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
@@ -34,7 +38,8 @@ import android.widget.TextView;
/**
 * The item view for each item in the ListView-based MenuViews.
 */
public class ListMenuItemView extends LinearLayout implements MenuView.ItemView {
public class ListMenuItemView extends LinearLayout
        implements MenuView.ItemView, AbsListView.SelectionBoundsAdjuster {
    private static final String TAG = "ListMenuItemView";
    private MenuItemImpl mItemData;

@@ -44,12 +49,14 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView
    private CheckBox mCheckBox;
    private TextView mShortcutView;
    private ImageView mSubMenuArrowView;
    private ImageView mGroupDivider;

    private Drawable mBackground;
    private int mTextAppearance;
    private Context mTextAppearanceContext;
    private boolean mPreserveIconSpacing;
    private Drawable mSubMenuArrow;
    private boolean mHasListDivider;

    private int mMenuType;

@@ -72,7 +79,13 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView
        mTextAppearanceContext = context;
        mSubMenuArrow = a.getDrawable(com.android.internal.R.styleable.MenuView_subMenuArrow);

        final TypedArray b = context.getTheme()
                .obtainStyledAttributes(null, new int[] { com.android.internal.R.attr.divider },
                        com.android.internal.R.attr.dropDownListViewStyle, 0);
        mHasListDivider = b.hasValue(0);

        a.recycle();
        b.recycle();
    }

    public ListMenuItemView(Context context, AttributeSet attrs, int defStyleAttr) {
@@ -100,6 +113,7 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView
        if (mSubMenuArrowView != null) {
            mSubMenuArrowView.setImageDrawable(mSubMenuArrow);
        }
        mGroupDivider = findViewById(com.android.internal.R.id.group_divider);
    }

    public void initialize(MenuItemImpl itemData, int menuType) {
@@ -298,4 +312,26 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView
            info.setCanOpenPopup(true);
        }
    }

    /**
     * Enable or disable group dividers for this view.
     */
    public void setGroupDividerEnabled(boolean groupDividerEnabled) {
        // If mHasListDivider is true, disabling the groupDivider.
        // Otherwise, checking enbling it according to groupDividerEnabled flag.
        mGroupDivider.setVisibility(!mHasListDivider
                && groupDividerEnabled ? View.VISIBLE : View.GONE);
    }

    @Override
    public void adjustListItemSelectionBounds(Rect rect) {
        if (mGroupDivider.getVisibility() == View.VISIBLE) {
            // groupDivider is a part of MenuItemListView.
            // If ListMenuItem with divider enabled is hovered/clicked, divider also gets selected.
            // Clipping the selector bounds from the top divider portion when divider is enabled,
            // so that divider does not get selected on hover or click.
            final LayoutParams lp = (LayoutParams) mGroupDivider.getLayoutParams();
            rect.top += mGroupDivider.getHeight() + lp.topMargin + lp.bottomMargin;
        }
    }
}
Loading