xref: /aosp_15_r20/external/robolectric/shadows/framework/src/main/java/org/robolectric/fakes/RoboMenu.java (revision e6ba16074e6af37d123cb567d575f496bf0a58ee)
1 package org.robolectric.fakes;
2 
3 import android.content.ComponentName;
4 import android.content.Context;
5 import android.content.Intent;
6 import android.view.KeyEvent;
7 import android.view.Menu;
8 import android.view.MenuItem;
9 import android.view.SubMenu;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.Comparator;
13 import java.util.List;
14 import org.robolectric.RuntimeEnvironment;
15 
16 /** Robolectric implementation of {@link android.view.Menu}. */
17 public class RoboMenu implements Menu {
18   private List<MenuItem> menuItems = new ArrayList<>();
19   private Context context;
20 
RoboMenu()21   public RoboMenu() {
22     this(RuntimeEnvironment.getApplication());
23   }
24 
RoboMenu(Context context)25   public RoboMenu(Context context) {
26     this.context = context;
27   }
28 
29   @Override
add(CharSequence title)30   public MenuItem add(CharSequence title) {
31     return add(0, 0, 0, title);
32   }
33 
34   @Override
add(int titleRes)35   public MenuItem add(int titleRes) {
36     return add(0, 0, 0, titleRes);
37   }
38 
39   @Override
add(int groupId, int itemId, int order, CharSequence title)40   public MenuItem add(int groupId, int itemId, int order, CharSequence title) {
41     RoboMenuItem menuItem = new RoboMenuItem(context);
42     menuItem.setOrder(order);
43     menuItems.add(menuItem);
44     menuItem.setGroupId(groupId);
45     Collections.sort(menuItems, new CustomMenuItemComparator());
46     menuItem.setItemId(itemId);
47     menuItem.setTitle(title);
48     return menuItem;
49   }
50 
51   @Override
add(int groupId, int itemId, int order, int titleRes)52   public MenuItem add(int groupId, int itemId, int order, int titleRes) {
53     return add(groupId, itemId, order, context.getResources().getString(titleRes));
54   }
55 
56   @Override
addSubMenu(CharSequence title)57   public SubMenu addSubMenu(CharSequence title) {
58     RoboSubMenu tsm = new RoboSubMenu(context);
59     RoboMenuItem menuItem = new RoboMenuItem(context);
60     menuItems.add(menuItem);
61     menuItem.setTitle(title);
62     menuItem.setSubMenu(tsm);
63     return tsm;
64   }
65 
66   @Override
addSubMenu(int titleRes)67   public SubMenu addSubMenu(int titleRes) {
68     RoboSubMenu tsm = new RoboSubMenu(context);
69     RoboMenuItem menuItem = new RoboMenuItem(context);
70     menuItems.add(menuItem);
71     menuItem.setTitle(titleRes);
72     menuItem.setSubMenu(tsm);
73     return tsm;
74   }
75 
76   @Override
addSubMenu(int groupId, int itemId, int order, CharSequence title)77   public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) {
78     RoboSubMenu tsm = new RoboSubMenu(context);
79     RoboMenuItem menuItem = new RoboMenuItem(context);
80     menuItems.add(menuItem);
81     menuItem.setGroupId(groupId);
82     menuItem.setItemId(itemId);
83     menuItem.setTitle(title);
84     menuItem.setSubMenu(tsm);
85     return tsm;
86   }
87 
88   @Override
addSubMenu(int groupId, int itemId, int order, int titleRes)89   public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) {
90     RoboSubMenu tsm = new RoboSubMenu(context);
91     RoboMenuItem menuItem = new RoboMenuItem(context);
92     menuItems.add(menuItem);
93     menuItem.setGroupId(groupId);
94     menuItem.setItemId(itemId);
95     menuItem.setTitle(titleRes);
96     menuItem.setSubMenu(tsm);
97     return tsm;
98   }
99 
100   @Override
addIntentOptions( int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems)101   public int addIntentOptions(
102       int groupId,
103       int itemId,
104       int order,
105       ComponentName caller,
106       Intent[] specifics,
107       Intent intent,
108       int flags,
109       MenuItem[] outSpecificItems) {
110     return 0;
111   }
112 
113   @Override
removeItem(int id)114   public void removeItem(int id) {
115     MenuItem menuItem = findItem(id);
116     menuItems.remove(menuItem);
117   }
118 
119   @Override
removeGroup(int groupId)120   public void removeGroup(int groupId) {}
121 
122   @Override
clear()123   public void clear() {
124     menuItems.clear();
125   }
126 
127   @Override
setGroupCheckable(int group, boolean checkable, boolean exclusive)128   public void setGroupCheckable(int group, boolean checkable, boolean exclusive) {}
129 
130   @Override
setGroupVisible(int group, boolean visible)131   public void setGroupVisible(int group, boolean visible) {}
132 
133   @Override
setGroupEnabled(int group, boolean enabled)134   public void setGroupEnabled(int group, boolean enabled) {}
135 
136   @Override
hasVisibleItems()137   public boolean hasVisibleItems() {
138     return false;
139   }
140 
141   @Override
findItem(int id)142   public MenuItem findItem(int id) {
143     for (MenuItem item : menuItems) {
144       if (item.getItemId() == id) {
145         return item;
146       }
147     }
148     return null;
149   }
150 
151   @Override
size()152   public int size() {
153     return menuItems.size();
154   }
155 
156   @Override
getItem(int index)157   public MenuItem getItem(int index) {
158     return menuItems.get(index);
159   }
160 
161   @Override
close()162   public void close() {}
163 
164   @Override
performShortcut(int keyCode, KeyEvent event, int flags)165   public boolean performShortcut(int keyCode, KeyEvent event, int flags) {
166     return false;
167   }
168 
169   @Override
isShortcutKey(int keyCode, KeyEvent event)170   public boolean isShortcutKey(int keyCode, KeyEvent event) {
171     return false;
172   }
173 
174   @Override
performIdentifierAction(int id, int flags)175   public boolean performIdentifierAction(int id, int flags) {
176     return false;
177   }
178 
179   @Override
setQwertyMode(boolean isQwerty)180   public void setQwertyMode(boolean isQwerty) {}
181 
findMenuItem(CharSequence title)182   public RoboMenuItem findMenuItem(CharSequence title) {
183     for (int i = 0; i < size(); i++) {
184       RoboMenuItem menuItem = (RoboMenuItem) getItem(i);
185       if (menuItem.getTitle().equals(title)) {
186         return menuItem;
187       }
188     }
189     return null;
190   }
191 
findMenuItemContaining(CharSequence desiredText)192   public RoboMenuItem findMenuItemContaining(CharSequence desiredText) {
193     for (int i = 0; i < size(); i++) {
194       RoboMenuItem menuItem = (RoboMenuItem) getItem(i);
195       if (menuItem.getTitle().toString().contains(desiredText)) {
196         return menuItem;
197       }
198     }
199     return null;
200   }
201 
202   private static class CustomMenuItemComparator implements Comparator<MenuItem> {
203 
204     @Override
compare(MenuItem a, MenuItem b)205     public int compare(MenuItem a, MenuItem b) {
206       if (a.getOrder() == b.getOrder()) {
207         return 0;
208       } else if (a.getOrder() > b.getOrder()) {
209         return 1;
210       } else {
211         return -1;
212       }
213     }
214   }
215 }
216