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