1 /* 2 * Copyright (C) 2008 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 android.view.cts; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertFalse; 21 import static org.junit.Assert.assertNotNull; 22 import static org.junit.Assert.assertNull; 23 import static org.junit.Assert.assertTrue; 24 25 import android.app.Activity; 26 import android.content.res.Resources; 27 import android.graphics.Bitmap; 28 import android.graphics.ImageDecoder; 29 import android.graphics.drawable.BitmapDrawable; 30 import android.support.test.annotation.UiThreadTest; 31 import android.support.test.filters.MediumTest; 32 import android.support.test.rule.ActivityTestRule; 33 import android.support.test.runner.AndroidJUnit4; 34 import android.view.KeyEvent; 35 import android.view.Menu; 36 import android.view.MenuInflater; 37 import android.view.MenuItem; 38 import android.view.SubMenu; 39 import android.widget.PopupMenu; 40 41 import com.android.compatibility.common.util.WidgetTestUtils; 42 43 import junit.framework.Assert; 44 45 import org.junit.Before; 46 import org.junit.Rule; 47 import org.junit.Test; 48 import org.junit.runner.RunWith; 49 50 /** 51 * Test {@link MenuInflater}. 52 */ 53 @MediumTest 54 @RunWith(AndroidJUnit4.class) 55 public class MenuInflaterTest { 56 private Activity mActivity; 57 private MenuInflater mMenuInflater; 58 private Menu mMenu; 59 60 @Rule 61 public ActivityTestRule<MockActivity> mActivityRule = 62 new ActivityTestRule<>(MockActivity.class); 63 64 @UiThreadTest 65 @Before 66 public void setup() { 67 mActivity = mActivityRule.getActivity(); 68 mMenuInflater = mActivity.getMenuInflater(); 69 mMenu = new PopupMenu(mActivity, null).getMenu(); 70 } 71 72 @UiThreadTest 73 @Test 74 public void testConstructor() { 75 new MenuInflater(mActivity); 76 } 77 78 @UiThreadTest 79 @Test 80 public void testInflate() { 81 assertEquals(0, mMenu.size()); 82 83 mMenuInflater.inflate(R.menu.browser, mMenu); 84 assertEquals(1, mMenu.size()); 85 } 86 87 @UiThreadTest 88 @Test(expected=Resources.NotFoundException.class) 89 public void testInflateInvalidId() { 90 mMenuInflater.inflate(0, mMenu); 91 } 92 93 @UiThreadTest 94 @Test(expected=NullPointerException.class) 95 public void testInflateNullMenu() { 96 mMenuInflater.inflate(R.menu.browser, null); 97 } 98 99 // Check whether the objects are created correctly from xml files 100 @UiThreadTest 101 @Test 102 public void testInflateAlphabeticShortcutFromXml() { 103 // the visibility and shortcut 104 mMenuInflater.inflate(R.menu.visible_shortcut, mMenu); 105 106 assertTrue(mMenu.findItem(R.id.visible_item).isVisible()); 107 assertEquals('a', mMenu.findItem(R.id.visible_item).getAlphabeticShortcut()); 108 109 assertFalse(mMenu.findItem(R.id.hidden_item).isVisible()); 110 assertEquals('b', mMenu.findItem(R.id.hidden_item).getAlphabeticShortcut()); 111 112 assertEquals(R.id.hidden_group, mMenu.findItem(R.id.hidden_by_group).getGroupId()); 113 assertFalse(mMenu.findItem(R.id.hidden_by_group).isVisible()); 114 assertEquals('c', mMenu.findItem(R.id.hidden_by_group).getAlphabeticShortcut()); 115 } 116 117 @UiThreadTest 118 @Test 119 public void testInflateShortcutModifiersFromXml() { 120 mMenuInflater.inflate(R.menu.visible_shortcut, mMenu); 121 MenuItem mMenuItem; 122 123 mMenuItem = mMenu.findItem(R.id.no_modifiers); 124 assertEquals('d', mMenuItem.getAlphabeticShortcut()); 125 assertEquals(KeyEvent.META_CTRL_ON, mMenuItem.getAlphabeticModifiers()); 126 127 mMenuItem = mMenu.findItem(R.id.default_modifiers); 128 assertEquals('e', mMenuItem.getAlphabeticShortcut()); 129 assertEquals(KeyEvent.META_CTRL_ON, mMenuItem.getAlphabeticModifiers()); 130 131 mMenuItem = mMenu.findItem(R.id.single_modifier); 132 assertEquals('f', mMenuItem.getAlphabeticShortcut()); 133 assertEquals(KeyEvent.META_SHIFT_ON, mMenuItem.getAlphabeticModifiers()); 134 135 mMenuItem = mMenu.findItem(R.id.multiple_modifiers); 136 assertEquals('g', mMenuItem.getAlphabeticShortcut()); 137 assertEquals(KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON, 138 mMenuItem.getAlphabeticModifiers()); 139 } 140 141 @UiThreadTest 142 @Test 143 public void testInflateDrawableFromXml() { 144 // the titles and icons 145 mMenuInflater.inflate(R.menu.title_icon, mMenu); 146 147 assertEquals("Start", mMenu.findItem(R.id.start).getTitle()); 148 verifyDrawableContent((BitmapDrawable) mMenu.findItem(R.id.start).getIcon(), 149 R.drawable.start); 150 151 assertEquals("Pass", mMenu.findItem(R.id.pass).getTitle()); 152 verifyDrawableContent((BitmapDrawable) mMenu.findItem(R.id.pass).getIcon(), 153 R.drawable.pass); 154 155 assertEquals("Failed", mMenu.findItem(R.id.failed).getTitle()); 156 verifyDrawableContent((BitmapDrawable) mMenu.findItem(R.id.failed).getIcon(), 157 R.drawable.failed); 158 } 159 160 @UiThreadTest 161 @Test 162 public void testInflateOrderFromXml() { 163 // the orders and categories 164 mMenuInflater.inflate(R.menu.category_order, mMenu); 165 // default category 166 assertEquals(R.id.most_used_items, mMenu.findItem(R.id.first_most_item).getGroupId()); 167 assertEquals(1, mMenu.findItem(R.id.first_most_item).getOrder()); 168 169 assertEquals(R.id.most_used_items, mMenu.findItem(R.id.middle_most_item).getGroupId()); 170 assertEquals(3, mMenu.findItem(R.id.middle_most_item).getOrder()); 171 172 assertEquals(R.id.most_used_items, mMenu.findItem(R.id.last_most_item).getGroupId()); 173 assertEquals(5, mMenu.findItem(R.id.last_most_item).getOrder()); 174 175 // specific category (CATEGORY_SECONDARY) 176 assertEquals(R.id.least_used_items, mMenu.findItem(R.id.first_least_item).getGroupId()); 177 assertEquals(Menu.CATEGORY_SECONDARY + 0, mMenu.findItem(R.id.first_least_item).getOrder()); 178 179 assertEquals(R.id.least_used_items, mMenu.findItem(R.id.middle_least_item).getGroupId()); 180 assertEquals(Menu.CATEGORY_SECONDARY + 2, 181 mMenu.findItem(R.id.middle_least_item).getOrder()); 182 183 assertEquals(R.id.least_used_items, mMenu.findItem(R.id.last_least_item).getGroupId()); 184 assertEquals(Menu.CATEGORY_SECONDARY + 4, mMenu.findItem(R.id.last_least_item).getOrder()); 185 } 186 187 @UiThreadTest 188 @Test 189 public void testInflateCheckableFromXmlNone() { 190 mMenuInflater.inflate(R.menu.checkable, mMenu); 191 192 // noncheckables 193 assertEquals(R.id.noncheckable_group, 194 mMenu.findItem(R.id.noncheckable_item_1).getGroupId()); 195 assertFalse(mMenu.findItem(R.id.noncheckable_item_1).isCheckable()); 196 197 assertEquals(R.id.noncheckable_group, 198 mMenu.findItem(R.id.noncheckable_item_2).getGroupId()); 199 assertFalse(mMenu.findItem(R.id.noncheckable_item_2).isCheckable()); 200 201 assertEquals(R.id.noncheckable_group, 202 mMenu.findItem(R.id.noncheckable_item_3).getGroupId()); 203 assertFalse(mMenu.findItem(R.id.noncheckable_item_3).isCheckable()); 204 } 205 206 @UiThreadTest 207 @Test 208 public void testInflateCheckableFromXmlMultiples() { 209 mMenuInflater.inflate(R.menu.checkable, mMenu); 210 211 // multiple checkables (item 2 and item 3 are both checked) 212 assertEquals(R.id.checkable_group, mMenu.findItem(R.id.checkable_item_1).getGroupId()); 213 assertTrue(mMenu.findItem(R.id.checkable_item_1).isCheckable()); 214 assertFalse(mMenu.findItem(R.id.checkable_item_1).isChecked()); 215 216 assertEquals(R.id.checkable_group, mMenu.findItem(R.id.checkable_item_3).getGroupId()); 217 assertTrue(mMenu.findItem(R.id.checkable_item_2).isCheckable()); 218 assertTrue(mMenu.findItem(R.id.checkable_item_2).isChecked()); 219 220 assertEquals(R.id.checkable_group, mMenu.findItem(R.id.checkable_item_2).getGroupId()); 221 assertTrue(mMenu.findItem(R.id.checkable_item_3).isCheckable()); 222 assertTrue(mMenu.findItem(R.id.checkable_item_3).isChecked()); 223 224 // make item 1 checked and item 2 and item 3 will remain checked 225 mMenu.findItem(R.id.checkable_item_1).setChecked(true); 226 assertTrue(mMenu.findItem(R.id.checkable_item_1).isChecked()); 227 assertTrue(mMenu.findItem(R.id.checkable_item_2).isChecked()); 228 assertTrue(mMenu.findItem(R.id.checkable_item_3).isChecked()); 229 } 230 231 @UiThreadTest 232 @Test 233 public void testInflateCheckableFromXmlExclusive() { 234 mMenuInflater.inflate(R.menu.checkable, mMenu); 235 236 // exclusive checkables (only item 3 is checked) 237 assertEquals(R.id.exclusive_checkable_group, 238 mMenu.findItem(R.id.exclusive_checkable_item_1).getGroupId()); 239 assertTrue(mMenu.findItem(R.id.exclusive_checkable_item_1).isCheckable()); 240 assertFalse(mMenu.findItem(R.id.exclusive_checkable_item_1).isChecked()); 241 242 assertEquals(R.id.exclusive_checkable_group, 243 mMenu.findItem(R.id.exclusive_checkable_item_3).getGroupId()); 244 assertTrue(mMenu.findItem(R.id.exclusive_checkable_item_2).isCheckable()); 245 assertFalse(mMenu.findItem(R.id.exclusive_checkable_item_2).isChecked()); 246 247 assertEquals(R.id.exclusive_checkable_group, 248 mMenu.findItem(R.id.exclusive_checkable_item_2).getGroupId()); 249 assertTrue(mMenu.findItem(R.id.exclusive_checkable_item_3).isCheckable()); 250 assertTrue(mMenu.findItem(R.id.exclusive_checkable_item_3).isChecked()); 251 252 // make item 1 checked and item 3 will be unchecked 253 mMenu.findItem(R.id.exclusive_checkable_item_1).setChecked(true); 254 assertTrue(mMenu.findItem(R.id.exclusive_checkable_item_1).isChecked()); 255 assertFalse(mMenu.findItem(R.id.exclusive_checkable_item_2).isChecked()); 256 assertFalse(mMenu.findItem(R.id.exclusive_checkable_item_3).isChecked()); 257 } 258 259 @UiThreadTest 260 @Test 261 public void testInflateCheckableFromXmlSubmenu() { 262 mMenuInflater.inflate(R.menu.checkable, mMenu); 263 264 // checkables without group (all in a sub menu) 265 SubMenu subMenu = mMenu.findItem(R.id.submenu).getSubMenu(); 266 assertNotNull(subMenu); 267 268 assertTrue(subMenu.findItem(R.id.nongroup_checkable_item_1).isCheckable()); 269 assertFalse(subMenu.findItem(R.id.nongroup_checkable_item_1).isChecked()); 270 271 assertTrue(subMenu.findItem(R.id.nongroup_checkable_item_2).isCheckable()); 272 assertTrue(subMenu.findItem(R.id.nongroup_checkable_item_2).isChecked()); 273 274 assertTrue(subMenu.findItem(R.id.nongroup_checkable_item_3).isCheckable()); 275 assertTrue(subMenu.findItem(R.id.nongroup_checkable_item_3).isChecked()); 276 277 // make item 1 checked and item 2 and item 3 will remain checked 278 subMenu.findItem(R.id.nongroup_checkable_item_1).setChecked(true); 279 assertTrue(mMenu.findItem(R.id.nongroup_checkable_item_1).isChecked()); 280 assertTrue(mMenu.findItem(R.id.nongroup_checkable_item_2).isChecked()); 281 assertTrue(mMenu.findItem(R.id.nongroup_checkable_item_3).isChecked()); 282 } 283 284 @UiThreadTest 285 @Test 286 public void testInflateTooltipFromXml() { 287 mMenuInflater.inflate(R.menu.tooltip, mMenu); 288 289 MenuItem item1 = mMenu.findItem(R.id.item1); 290 MenuItem item2 = mMenu.findItem(R.id.item2); 291 MenuItem item3 = mMenu.findItem(R.id.item3); 292 293 assertEquals("tooltip1", item1.getTooltipText()); 294 295 assertEquals("tooltip2", item2.getTooltipText()); 296 item2.setTooltipText(null); 297 assertNull(item2.getTooltipText()); 298 item2.setTooltipText("tooltip2_new"); 299 assertEquals("tooltip2_new", item2.getTooltipText()); 300 301 assertNull(item3.getTooltipText()); 302 item3.setTooltipText("tooltip3"); 303 assertEquals("tooltip3", item3.getTooltipText()); 304 } 305 306 @UiThreadTest 307 @Test 308 public void testInflateContentDescriptionFromXml() { 309 mMenuInflater.inflate(R.menu.content_description, mMenu); 310 311 MenuItem item1 = mMenu.findItem(R.id.item1); 312 MenuItem item2 = mMenu.findItem(R.id.item2); 313 MenuItem item3 = mMenu.findItem(R.id.item3); 314 315 assertEquals("description1", item1.getContentDescription()); 316 317 assertEquals("description2", item2.getContentDescription()); 318 item2.setContentDescription(null); 319 assertNull(item2.getContentDescription()); 320 item2.setContentDescription("description2_new"); 321 assertEquals("description2_new", item2.getContentDescription()); 322 323 assertNull(item3.getContentDescription()); 324 item3.setContentDescription("description3"); 325 assertEquals("description3", item3.getContentDescription()); 326 } 327 328 private void verifyDrawableContent(BitmapDrawable b, int resId) { 329 try { 330 ImageDecoder.Source src = ImageDecoder.createSource(mActivity.getResources(), resId); 331 Bitmap expected = ImageDecoder.decodeBitmap(src, (decoder, info, s) -> { 332 decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE); 333 }); 334 WidgetTestUtils.assertEquals(expected, b.getBitmap()); 335 } catch (java.io.IOException e) { 336 Assert.fail("the resource could not be decoded"); 337 } 338 } 339 } 340