19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.menu.MenuItemImpl; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Activity; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Xml; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is used to instantiate menu XML files into Menu objects. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For performance reasons, menu inflation relies heavily on pre-processing of 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * XML files that is done at build time. Therefore, it is not currently possible 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to use MenuInflater with an XmlPullParser over a plain XML file at runtime; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it only works with an XmlPullParser returned from a compiled resource (R. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <em>something</em> file.) 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MenuInflater { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Menu tag name in XML. */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String XML_MENU = "menu"; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Group tag name in XML. */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String XML_GROUP = "group"; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Item tag name in XML. */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String XML_ITEM = "item"; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int NO_ID = 0; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mContext; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructs a menu inflater. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Activity#getMenuInflater() 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuInflater(Context context) { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflate a menu hierarchy from the specified XML resource. Throws 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InflateException} if there is an error. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param menuRes Resource ID for an XML layout resource to load (e.g., 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>R.menu.main_activity</code>) 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param menu The Menu to inflate into. The items and submenus will be 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * added to this Menu. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void inflate(int menuRes, Menu menu) { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = mContext.getResources().getLayout(menuRes); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = Xml.asAttributeSet(parser); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parseMenu(parser, attrs, menu); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException e) { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new InflateException("Error inflating menu XML", e); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new InflateException("Error inflating menu XML", e); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called internally to fill the given menu. If a sub menu is seen, it will 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call this recursively. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void parseMenu(XmlPullParser parser, AttributeSet attrs, Menu menu) 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MenuState menuState = new MenuState(menu); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int eventType = parser.getEventType(); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean lookingForEndOfUnknownTag = false; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String unknownTagName = null; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This loop will skip to the menu start tag 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (eventType == XmlPullParser.START_TAG) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tagName = parser.getName(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals(XML_MENU)) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Go to next tag 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eventType = parser.next(); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Expecting menu, got " + tagName); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eventType = parser.next(); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (eventType != XmlPullParser.END_DOCUMENT); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean reachedEndOfMenu = false; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!reachedEndOfMenu) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (eventType) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case XmlPullParser.START_TAG: 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lookingForEndOfUnknownTag) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tagName = parser.getName(); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals(XML_GROUP)) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menuState.readGroup(attrs); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals(XML_ITEM)) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menuState.readItem(attrs); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals(XML_MENU)) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A menu start tag denotes a submenu for an item 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SubMenu subMenu = menuState.addSubMenuItem(); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Parse the submenu into returned SubMenu 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parseMenu(parser, attrs, subMenu); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lookingForEndOfUnknownTag = true; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unknownTagName = tagName; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case XmlPullParser.END_TAG: 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tagName = parser.getName(); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lookingForEndOfUnknownTag && tagName.equals(unknownTagName)) { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lookingForEndOfUnknownTag = false; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unknownTagName = null; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals(XML_GROUP)) { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menuState.resetGroup(); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals(XML_ITEM)) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add the item if it hasn't been added (if the item was 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a submenu, it would have been added already) 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!menuState.hasAddedItem()) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project menuState.addItem(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals(XML_MENU)) { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reachedEndOfMenu = true; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case XmlPullParser.END_DOCUMENT: 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Unexpected end of document"); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eventType = parser.next(); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State for the current menu. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Groups can not be nested unless there is another menu (which will have 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its state class). 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class MenuState { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Menu menu; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Group state is set on items as they are added, allowing an item to 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * override its group state. (As opposed to set on items at the group end tag.) 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int groupId; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int groupCategory; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int groupOrder; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int groupCheckable; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean groupVisible; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean groupEnabled; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean itemAdded; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int itemId; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int itemCategoryOrder; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String itemTitle; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String itemTitleCondensed; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int itemIconResId; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private char itemAlphabeticShortcut; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private char itemNumericShortcut; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sync to attrs.xml enum: 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - 0: none 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - 1: all 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - 2: exclusive 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int itemCheckable; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean itemChecked; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean itemVisible; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean itemEnabled; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int defaultGroupId = NO_ID; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int defaultItemId = NO_ID; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int defaultItemCategory = 0; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int defaultItemOrder = 0; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int defaultItemCheckable = 0; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean defaultItemChecked = false; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean defaultItemVisible = true; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean defaultItemEnabled = true; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MenuState(final Menu menu) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.menu = menu; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resetGroup(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resetGroup() { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupId = defaultGroupId; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupCategory = defaultItemCategory; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupOrder = defaultItemOrder; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupCheckable = defaultItemCheckable; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupVisible = defaultItemVisible; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupEnabled = defaultItemEnabled; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the parser is pointing to a group tag. 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readGroup(AttributeSet attrs) { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = mContext.obtainStyledAttributes(attrs, 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.MenuGroup); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupId = a.getResourceId(com.android.internal.R.styleable.MenuGroup_id, defaultGroupId); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupCategory = a.getInt(com.android.internal.R.styleable.MenuGroup_menuCategory, defaultItemCategory); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupOrder = a.getInt(com.android.internal.R.styleable.MenuGroup_orderInCategory, defaultItemOrder); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupCheckable = a.getInt(com.android.internal.R.styleable.MenuGroup_checkableBehavior, defaultItemCheckable); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupVisible = a.getBoolean(com.android.internal.R.styleable.MenuGroup_visible, defaultItemVisible); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupEnabled = a.getBoolean(com.android.internal.R.styleable.MenuGroup_enabled, defaultItemEnabled); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the parser is pointing to an item tag. 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readItem(AttributeSet attrs) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = mContext.obtainStyledAttributes(attrs, 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.MenuItem); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Inherit attributes from the group as default value 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemId = a.getResourceId(com.android.internal.R.styleable.MenuItem_id, defaultItemId); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int category = a.getInt(com.android.internal.R.styleable.MenuItem_menuCategory, groupCategory); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int order = a.getInt(com.android.internal.R.styleable.MenuItem_orderInCategory, groupOrder); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemCategoryOrder = (category & Menu.CATEGORY_MASK) | (order & Menu.USER_MASK); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemTitle = a.getString(com.android.internal.R.styleable.MenuItem_title); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemTitleCondensed = a.getString(com.android.internal.R.styleable.MenuItem_titleCondensed); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemIconResId = a.getResourceId(com.android.internal.R.styleable.MenuItem_icon, 0); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemAlphabeticShortcut = 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getShortcut(a.getString(com.android.internal.R.styleable.MenuItem_alphabeticShortcut)); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemNumericShortcut = 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getShortcut(a.getString(com.android.internal.R.styleable.MenuItem_numericShortcut)); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.hasValue(com.android.internal.R.styleable.MenuItem_checkable)) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Item has attribute checkable, use it 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemCheckable = a.getBoolean(com.android.internal.R.styleable.MenuItem_checkable, false) ? 1 : 0; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Item does not have attribute, use the group's (group can have one more state 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for checkable that represents the exclusive checkable) 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemCheckable = groupCheckable; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemChecked = a.getBoolean(com.android.internal.R.styleable.MenuItem_checked, defaultItemChecked); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemVisible = a.getBoolean(com.android.internal.R.styleable.MenuItem_visible, groupVisible); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemEnabled = a.getBoolean(com.android.internal.R.styleable.MenuItem_enabled, groupEnabled); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemAdded = false; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private char getShortcut(String shortcutString) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (shortcutString == null) { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return shortcutString.charAt(0); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setItem(MenuItem item) { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.setChecked(itemChecked) 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setVisible(itemVisible) 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setEnabled(itemEnabled) 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setCheckable(itemCheckable >= 1) 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setTitleCondensed(itemTitleCondensed) 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setIcon(itemIconResId) 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setAlphabeticShortcut(itemAlphabeticShortcut) 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setNumericShortcut(itemNumericShortcut); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (itemCheckable >= 2) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((MenuItemImpl) item).setExclusiveCheckable(true); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addItem() { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemAdded = true; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setItem(menu.add(groupId, itemId, itemCategoryOrder, itemTitle)); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SubMenu addSubMenuItem() { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project itemAdded = true; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SubMenu subMenu = menu.addSubMenu(groupId, itemId, itemCategoryOrder, itemTitle); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setItem(subMenu.getItem()); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return subMenu; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasAddedItem() { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return itemAdded; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 326