1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package androidx.appcompat.view.menu;
18 
19 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
20 
21 import android.content.Context;
22 import android.graphics.drawable.Drawable;
23 import android.view.Menu;
24 import android.view.MenuItem;
25 import android.view.SubMenu;
26 import android.view.View;
27 
28 import androidx.annotation.RestrictTo;
29 
30 import org.jspecify.annotations.NonNull;
31 
32 /**
33  * The model for a sub menu, which is an extension of the menu.  Most methods are proxied to the
34  * parent menu.
35  *
36  */
37 @RestrictTo(LIBRARY_GROUP_PREFIX)
38 public class SubMenuBuilder extends MenuBuilder implements SubMenu {
39     private MenuBuilder mParentMenu;
40     private MenuItemImpl mItem;
41 
SubMenuBuilder(Context context, MenuBuilder parentMenu, MenuItemImpl item)42     public SubMenuBuilder(Context context, MenuBuilder parentMenu, MenuItemImpl item) {
43         super(context);
44 
45         mParentMenu = parentMenu;
46         mItem = item;
47     }
48 
49     @Override
setQwertyMode(boolean isQwerty)50     public void setQwertyMode(boolean isQwerty) {
51         mParentMenu.setQwertyMode(isQwerty);
52     }
53 
54     @Override
isQwertyMode()55     public boolean isQwertyMode() {
56         return mParentMenu.isQwertyMode();
57     }
58 
59     @Override
setShortcutsVisible(boolean shortcutsVisible)60     public void setShortcutsVisible(boolean shortcutsVisible) {
61         mParentMenu.setShortcutsVisible(shortcutsVisible);
62     }
63 
64     @Override
isShortcutsVisible()65     public boolean isShortcutsVisible() {
66         return mParentMenu.isShortcutsVisible();
67     }
68 
getParentMenu()69     public Menu getParentMenu() {
70         return mParentMenu;
71     }
72 
73     @Override
getItem()74     public MenuItem getItem() {
75         return mItem;
76     }
77 
78     @Override
setCallback(Callback callback)79     public void setCallback(Callback callback) {
80         mParentMenu.setCallback(callback);
81     }
82 
83     @Override
getRootMenu()84     public MenuBuilder getRootMenu() {
85         return mParentMenu.getRootMenu();
86     }
87 
88     @Override
dispatchMenuItemSelected(@onNull MenuBuilder menu, @NonNull MenuItem item)89     boolean dispatchMenuItemSelected(@NonNull MenuBuilder menu, @NonNull MenuItem item) {
90         return super.dispatchMenuItemSelected(menu, item) ||
91                 mParentMenu.dispatchMenuItemSelected(menu, item);
92     }
93 
94     @Override
setIcon(Drawable icon)95     public SubMenu setIcon(Drawable icon) {
96         mItem.setIcon(icon);
97         return this;
98     }
99 
100     @Override
setIcon(int iconRes)101     public SubMenu setIcon(int iconRes) {
102         mItem.setIcon(iconRes);
103         return this;
104     }
105 
106     @Override
setHeaderIcon(Drawable icon)107     public SubMenu setHeaderIcon(Drawable icon) {
108         return (SubMenu) super.setHeaderIconInt(icon);
109     }
110 
111     @Override
setHeaderIcon(int iconRes)112     public SubMenu setHeaderIcon(int iconRes) {
113         return (SubMenu) super.setHeaderIconInt(iconRes);
114     }
115 
116     @Override
setHeaderTitle(CharSequence title)117     public SubMenu setHeaderTitle(CharSequence title) {
118         return (SubMenu) super.setHeaderTitleInt(title);
119     }
120 
121     @Override
setHeaderTitle(int titleRes)122     public SubMenu setHeaderTitle(int titleRes) {
123         return (SubMenu) super.setHeaderTitleInt(titleRes);
124     }
125 
126     @Override
setHeaderView(View view)127     public SubMenu setHeaderView(View view) {
128         return (SubMenu) super.setHeaderViewInt(view);
129     }
130 
131     @Override
expandItemActionView(MenuItemImpl item)132     public boolean expandItemActionView(MenuItemImpl item) {
133         return mParentMenu.expandItemActionView(item);
134     }
135 
136     @Override
collapseItemActionView(MenuItemImpl item)137     public boolean collapseItemActionView(MenuItemImpl item) {
138         return mParentMenu.collapseItemActionView(item);
139     }
140 
141     @Override
getActionViewStatesKey()142     public String getActionViewStatesKey() {
143         final int itemId = mItem != null ? mItem.getItemId() : 0;
144         if (itemId == 0) {
145             return null;
146         }
147         return super.getActionViewStatesKey() + ":" + itemId;
148     }
149 
150     @Override
setGroupDividerEnabled(boolean groupDividerEnabled)151     public void setGroupDividerEnabled(boolean groupDividerEnabled) {
152         mParentMenu.setGroupDividerEnabled(groupDividerEnabled);
153     }
154 
155     @Override
isGroupDividerEnabled()156     public boolean isGroupDividerEnabled() {
157         return mParentMenu.isGroupDividerEnabled();
158     }
159 }
160