diff options
42 files changed, 408 insertions, 166 deletions
diff --git a/core/java/android/view/MenuInflater.java b/core/java/android/view/MenuInflater.java index a7ee12b..71296fa 100644 --- a/core/java/android/view/MenuInflater.java +++ b/core/java/android/view/MenuInflater.java @@ -161,6 +161,7 @@ public class MenuInflater { } else if (tagName.equals(XML_MENU)) { // A menu start tag denotes a submenu for an item SubMenu subMenu = menuState.addSubMenuItem(); + registerMenu(subMenu, attrs); // Parse the submenu into returned SubMenu parseMenu(parser, attrs, subMenu); @@ -183,9 +184,9 @@ public class MenuInflater { if (!menuState.hasAddedItem()) { if (menuState.itemActionProvider != null && menuState.itemActionProvider.hasSubMenu()) { - menuState.addSubMenuItem(); + registerMenu(menuState.addSubMenuItem(), attrs); } else { - menuState.addItem(); + registerMenu(menuState.addItem(), attrs); } } } else if (tagName.equals(XML_MENU)) { @@ -200,7 +201,30 @@ public class MenuInflater { eventType = parser.next(); } } - + + /** + * The method is a hook for layoutlib to do its magic. + * Nothing is needed outside of LayoutLib. However, it should not be deleted because it + * appears to do nothing. + */ + private void registerMenu(@SuppressWarnings("unused") MenuItem item, + @SuppressWarnings("unused") AttributeSet set) { + } + + /** + * The method is a hook for layoutlib to do its magic. + * Nothing is needed outside of LayoutLib. However, it should not be deleted because it + * appears to do nothing. + */ + private void registerMenu(@SuppressWarnings("unused") SubMenu subMenu, + @SuppressWarnings("unused") AttributeSet set) { + } + + // Needed by layoutlib. + /*package*/ Context getContext() { + return mContext; + } + private static class InflatedOnMenuItemClickListener implements MenuItem.OnMenuItemClickListener { private static final Class<?>[] PARAM_TYPES = new Class[] { MenuItem.class }; @@ -446,9 +470,11 @@ public class MenuInflater { } } - public void addItem() { + public MenuItem addItem() { itemAdded = true; - setItem(menu.add(groupId, itemId, itemCategoryOrder, itemTitle)); + MenuItem item = menu.add(groupId, itemId, itemCategoryOrder, itemTitle); + setItem(item); + return item; } public SubMenu addSubMenuItem() { diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java index 195a00d..5464284 100644 --- a/core/java/com/android/internal/view/menu/MenuBuilder.java +++ b/core/java/com/android/internal/view/menu/MenuBuilder.java @@ -392,8 +392,8 @@ public class MenuBuilder implements Menu { private MenuItem addInternal(int group, int id, int categoryOrder, CharSequence title) { final int ordering = getOrdering(categoryOrder); - final MenuItemImpl item = new MenuItemImpl(this, group, id, categoryOrder, - ordering, title, mDefaultShowAsAction); + final MenuItemImpl item = createNewMenuItem(group, id, categoryOrder, ordering, title, + mDefaultShowAsAction); if (mCurrentMenuInfo != null) { // Pass along the current menu info @@ -405,7 +405,14 @@ public class MenuBuilder implements Menu { return item; } - + + // Layoutlib overrides this method to return its custom implementation of MenuItemImpl + private MenuItemImpl createNewMenuItem(int group, int id, int categoryOrder, int ordering, + CharSequence title, int defaultShowAsAction) { + return new MenuItemImpl(this, group, id, categoryOrder, ordering, title, + defaultShowAsAction); + } + public MenuItem add(CharSequence title) { return addInternal(0, 0, 0, title); } diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 566f227..887bd62 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Vliegtuigmodus"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Vliegtuigmodus is AAN"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Vliegtuigmodus is AF"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Instellings"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Veiligmodus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-stelsel"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 1b8ca20..efc5885 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"وضع الطائرة"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"وضع الطائرة قيد التشغيل"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"وضع الطائرة متوقف"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"الإعدادات"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"الوضع الآمن"</string> <string name="android_system_label" msgid="6577375335728551336">"نظام Android"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 77d5f34..e009806 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode d\'avió"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mode d\'avió activat"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mode d\'avió desactivat"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Configuració"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"+999"</string> <string name="safeMode" msgid="2788228061547930246">"Mode segur"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index e0b2a8c..ca0dd05 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flytilstand"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flytilstand er TIL"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flytilstand er slået FRA"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Indstillinger"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Sikker tilstand"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 0e5cde3..b8adb04 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flugmodus"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flugmodus ist AN."</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flugmodus ist AUS."</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Einstellungen"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Abgesicherter Modus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-System"</string> @@ -318,11 +317,11 @@ <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"Bildschirminhalt abrufen"</string> <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Ermöglicht der App, den Inhalt des aktiven Fensters abzurufen. Schädliche Apps können so den gesamten Fensterinhalt abrufen und mit Ausnahme von Passwörtern den gesamten Text auswerten."</string> <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"Bedienungshilfen vorübergehend aktivieren"</string> - <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Ermöglicht einer App, die Bedienungshilfen auf dem Gerät vorübergehend zu aktivieren. Schädliche Apps können Bedienungshilfen ohne die Zustimmung des Nutzers aktivieren."</string> + <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Ermöglicht der App, die Bedienungshilfen auf dem Gerät vorübergehend zu aktivieren. Schädliche Apps können Bedienungshilfen ohne die Zustimmung des Nutzers aktivieren."</string> <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"Fensterinformationen abrufen"</string> - <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Ermöglicht einer App, Informationen über die Fenster vom Fenster-Manager abzurufen. Schädliche Apps können Informationen abrufen, die für die systeminterne Nutzung gedacht sind."</string> + <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Ermöglicht der App, Informationen über die Fenster vom Fenster-Manager abzurufen. Schädliche Apps können Informationen abrufen, die für die systeminterne Nutzung gedacht sind."</string> <string name="permlab_filter_events" msgid="8675535648807427389">"Ereignisse filtern"</string> - <string name="permdesc_filter_events" msgid="8006236315888347680">"Ermöglicht einer App, einen Eingabefilter zu registrieren, der den Stream aller Nutzerereignisse vor ihrem Versand filtert. Eine schädliche App kann die System-UI ohne Eingriff des Nutzers kontrollieren."</string> + <string name="permdesc_filter_events" msgid="8006236315888347680">"Ermöglicht der App, einen Eingabefilter zu registrieren, der den Stream aller Nutzerereignisse vor ihrem Versand filtert. Eine schädliche App kann die System-UI ohne Eingriff des Nutzers kontrollieren."</string> <string name="permlab_magnify_display" msgid="5973626738170618775">"Anzeige vergrößern"</string> <string name="permdesc_magnify_display" msgid="7121235684515003792">"Erlaubt der App, den Inhalt einer Anzeige zu vergrößern. Schädliche Apps verändern eventuell die Ansicht, sodass Inhalte nicht richtig angezeigt werden."</string> <string name="permlab_shutdown" msgid="7185747824038909016">"Partielles Herunterfahren"</string> @@ -1316,7 +1315,7 @@ <string name="permlab_copyProtectedData" msgid="4341036311211406692">"Inhalte kopieren"</string> <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Ermöglicht der App das Aufrufen des Standard-Containerdienstes zum Kopieren von Inhalten. Nicht für normale Apps vorgesehen."</string> <string name="permlab_route_media_output" msgid="1642024455750414694">"Medienausgabe umleiten"</string> - <string name="permdesc_route_media_output" msgid="4932818749547244346">"Ermöglicht einer App, die Medienausgabe auf andere externe Geräte umzuleiten."</string> + <string name="permdesc_route_media_output" msgid="4932818749547244346">"Ermöglicht der App, die Medienausgabe auf andere externe Geräte umzuleiten."</string> <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Zugriff auf mit Keyguard geschützten Speicher"</string> <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Ermöglicht einer App den Zugriff auf mit Keyguard geschützten Speicher"</string> <string name="permlab_control_keyguard" msgid="172195184207828387">"Anzeige und Ausblenden des Keyguard steuern"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 92622b2..3801c74 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Λειτουργία πτήσης"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Η λειτουργία πτήσης είναι ενεργοποιημένη."</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Λειτ. πτήσης είναι ανενεργή"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Ρυθμίσεις"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Ασφαλής λειτουργία"</string> <string name="android_system_label" msgid="6577375335728551336">"Σύστημα Android"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index a265f4e..e194735 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"El modo avión está Activado"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"El modo avión está Desactivado"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index cd4c004..ec6609c 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avión activado. Desactivar"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avión desactivado. Activar"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Ajustes"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"> 999"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index fbb2aec..7f6b8ae 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode Avion"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Le mode Avion est activé."</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Le mode Avion est désactivé."</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string> <string name="android_system_label" msgid="6577375335728551336">"Système Android"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index ae8239f..90744cd 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"हवाई जहाज मोड"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"हवाई जहाज मोड चालू है"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाई जहाज मोड बंद है"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"सेटिंग"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> <string name="android_system_label" msgid="6577375335728551336">"Android सिस्टम"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index d7f0f82..925d6a0 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Repülőgép üzemmód"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Repülőgép üzemmód bekapcsolva"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Repülőgép üzemmód kikapcsolva"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Beállítások"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Biztonsági üzemmód"</string> <string name="android_system_label" msgid="6577375335728551336">"Android rendszer"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index aef2dc2..649cd34 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode pesawat"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mode pesawat AKTIF"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mode pesawat MATI"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Setelan"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Mode aman"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 96d1f95..b8b2959 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modalità aereo"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modalità aereo attiva"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modalità aereo non attiva"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Impostazioni"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modalità provvisoria"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 41d1d65..71872e1 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"מצב טיסה"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"מצב טיסה מופעל"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"מצב טיסה כבוי"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"הגדרות"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"מצב בטוח"</string> <string name="android_system_label" msgid="6577375335728551336">"מערכת Android"</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index d6e7a6c..623094d 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ពេលជិះយន្តហោះ"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"បានបើករបៀបពេលជិះយន្តហោះ"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បានបិទរបៀបពេលជិះយន្តហោះ"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"ការកំណត់"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"របៀបសុវត្ថិភាព"</string> <string name="android_system_label" msgid="6577375335728551336">"ប្រព័ន្ធ Android"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index c863fe6..d8a27d3 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lėktuvo režimas"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ĮJUNGTAS lėktuvo režimas"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"lėktuvo režimas IŠJUNGTAS"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Nustatymai"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Saugos režimas"</string> <string name="android_system_label" msgid="6577375335728551336">"„Android“ sistema"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 620f179..4b3be46 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lidojuma režīms"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lidojuma režīms ir IESLĒGTS."</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lidojuma režīms ir IZSLĒGTS."</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Iestatījumi"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"Pārsniedz"</string> <string name="safeMode" msgid="2788228061547930246">"Drošais režīms"</string> <string name="android_system_label" msgid="6577375335728551336">"Android sistēma"</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 84e901e..b27abab 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Нислэгийн горим"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Нислэгийн горим асав"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Нислэгийн горим унтарсан"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Тохиргоо"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Аюулгүй горим"</string> <string name="android_system_label" msgid="6577375335728551336">"Андройд систем"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index d8192d4..8ab2aa4 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Vliegmodus"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Vliegmodus is AAN"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Vliegmodus is UIT"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Instellingen"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string> <string name="safeMode" msgid="2788228061547930246">"Veilige modus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-systeem"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index ded5450..06a3737 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Tryb samolotowy"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Tryb samolotowy jest włączony"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Tryb samolotowy jest wyłączony"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Ustawienia"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Tryb awaryjny"</string> <string name="android_system_label" msgid="6577375335728551336">"System Android"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 5fe8898..b1b4020 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo de avião"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"O modo de voo está ativado"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"O modo de voo está desativado"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Definições"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 1fcc33f..fb16cc2 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Način za letalo"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Način za letalo je VKLOPLJEN"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Način za letalo je IZKLOPLJEN"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Nastavitve"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string> <string name="safeMode" msgid="2788228061547930246">"Varni način"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index c30dbf9..564d237 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flygplansläge"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flygplansläge är AKTIVERAT"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flygplansläge är INAKTIVERAT"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Inställningar"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Säkert läge"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 2734296..2a178e9 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"โหมดใช้งานบนเครื่องบิน"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"เปิดโหมดใช้งานบนเครื่องบิน"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"โหมดใช้งานบนเครื่องบินปิดทำงานอยู่"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"การตั้งค่า"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"โหมดปลอดภัย"</string> <string name="android_system_label" msgid="6577375335728551336">"ระบบ Android"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index e00ea5b..35c75dc 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим польоту"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режим польоту ВВІМК."</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режим польоту ВИМК."</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Налаштування"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Безп. режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Система Android"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 54602e8..d884ad3 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"飛行模式"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"飛航模式為 [開啟]"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"飛行模式為 [關閉]"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"設定"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index b121e54..d04ec5f 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -173,8 +173,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Imodi yendiza"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Imodi yendiza IVULIWE"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Imodi yendiza IVALIWE"</string> - <!-- no translation found for global_action_settings (1756531602592545966) --> - <skip /> + <string name="global_action_settings" msgid="1756531602592545966">"Izilungiselelo"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Imodi ephephile"</string> <string name="android_system_label" msgid="6577375335728551336">"Uhlelo lwe-Android"</string> diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 311ccb3..0b6f7d1 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -2937,6 +2937,8 @@ public final class ActivityStackSupervisor implements DisplayListener { } class ActivityContainer extends android.app.IActivityContainer.Stub { + final static int FORCE_NEW_TASK_FLAGS = Intent.FLAG_ACTIVITY_NEW_TASK | + Intent.FLAG_ACTIVITY_MULTIPLE_TASK; final int mStackId; IActivityContainerCallback mCallback = null; final ActivityStack mStack; @@ -3033,6 +3035,7 @@ public final class ActivityStackSupervisor implements DisplayListener { int userId = mService.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), mCurrentUser, false, true, "ActivityContainer", null); // TODO: Switch to user app stacks here. + intent.addFlags(FORCE_NEW_TASK_FLAGS); String mimeType = intent.getType(); if (mimeType == null && intent.getData() != null && "content".equals(intent.getData().getScheme())) { @@ -3051,7 +3054,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } return ((PendingIntentRecord)intentSender).sendInner(0, null, null, null, null, null, - null, 0, 0, 0, null, this); + null, 0, FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this); } @Override diff --git a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java index 941f1ce6..a2e93a7 100644 --- a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java +++ b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java @@ -32,10 +32,6 @@ import org.xmlpull.v1.XmlPullParser; import android.content.Context; import android.util.AttributeSet; -import android.view.InflateException; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; import java.io.File; @@ -154,6 +150,9 @@ public final class BridgeInflater extends LayoutInflater { @Override public View inflate(int resource, ViewGroup root) { Context context = getContext(); + if (context instanceof ContextThemeWrapper) { + context = ((ContextThemeWrapper) context).getBaseContext(); + } if (context instanceof BridgeContext) { BridgeContext bridgeContext = (BridgeContext)context; @@ -216,43 +215,16 @@ public final class BridgeInflater extends LayoutInflater { } private void setupViewInContext(View view, AttributeSet attrs) { - if (getContext() instanceof BridgeContext) { - BridgeContext bc = (BridgeContext) getContext(); - if (attrs instanceof BridgeXmlBlockParser) { - BridgeXmlBlockParser parser = (BridgeXmlBlockParser) attrs; - - // get the view key - Object viewKey = parser.getViewCookie(); - - if (viewKey == null) { - int currentDepth = parser.getDepth(); - - // test whether we are in an included file or in a adapter binding view. - BridgeXmlBlockParser previousParser = bc.getPreviousParser(); - if (previousParser != null) { - // looks like we inside an embedded layout. - // only apply the cookie of the calling node (<include>) if we are at the - // top level of the embedded layout. If there is a merge tag, then - // skip it and look for the 2nd level - int testDepth = mIsInMerge ? 2 : 1; - if (currentDepth == testDepth) { - viewKey = previousParser.getViewCookie(); - // if we are in a merge, wrap the cookie in a MergeCookie. - if (viewKey != null && mIsInMerge) { - viewKey = new MergeCookie(viewKey); - } - } - } else if (mResourceReference != null && currentDepth == 1) { - // else if there's a resource reference, this means we are in an adapter - // binding case. Set the resource ref as the view cookie only for the top - // level view. - viewKey = mResourceReference; - } - } - - if (viewKey != null) { - bc.addViewKey(view, viewKey); - } + Context context = getContext(); + if (context instanceof ContextThemeWrapper) { + context = ((ContextThemeWrapper) context).getBaseContext(); + } + if (context instanceof BridgeContext) { + BridgeContext bc = (BridgeContext) context; + // get the view key + Object viewKey = getViewKeyFromParser(attrs, bc, mResourceReference, mIsInMerge); + if (viewKey != null) { + bc.addViewKey(view, viewKey); } } } @@ -269,4 +241,44 @@ public final class BridgeInflater extends LayoutInflater { public LayoutInflater cloneInContext(Context newContext) { return new BridgeInflater(this, newContext); } + + /*package*/ static Object getViewKeyFromParser(AttributeSet attrs, BridgeContext bc, + ResourceReference resourceReference, boolean isInMerge) { + + if (!(attrs instanceof BridgeXmlBlockParser)) { + return null; + } + BridgeXmlBlockParser parser = ((BridgeXmlBlockParser) attrs); + + // get the view key + Object viewKey = parser.getViewCookie(); + + if (viewKey == null) { + int currentDepth = parser.getDepth(); + + // test whether we are in an included file or in a adapter binding view. + BridgeXmlBlockParser previousParser = bc.getPreviousParser(); + if (previousParser != null) { + // looks like we are inside an embedded layout. + // only apply the cookie of the calling node (<include>) if we are at the + // top level of the embedded layout. If there is a merge tag, then + // skip it and look for the 2nd level + int testDepth = isInMerge ? 2 : 1; + if (currentDepth == testDepth) { + viewKey = previousParser.getViewCookie(); + // if we are in a merge, wrap the cookie in a MergeCookie. + if (viewKey != null && isInMerge) { + viewKey = new MergeCookie(viewKey); + } + } + } else if (resourceReference != null && currentDepth == 1) { + // else if there's a resource reference, this means we are in an adapter + // binding case. Set the resource ref as the view cookie only for the top + // level view. + viewKey = resourceReference; + } + } + + return viewKey; + } } diff --git a/tools/layoutlib/bridge/src/android/view/MenuInflater_Delegate.java b/tools/layoutlib/bridge/src/android/view/MenuInflater_Delegate.java new file mode 100644 index 0000000..e34ad38 --- /dev/null +++ b/tools/layoutlib/bridge/src/android/view/MenuInflater_Delegate.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import android.content.Context; +import com.android.ide.common.rendering.api.LayoutLog; +import com.android.ide.common.rendering.api.ViewInfo; +import com.android.internal.view.menu.BridgeMenuItemImpl; +import com.android.internal.view.menu.MenuView; +import com.android.layoutlib.bridge.Bridge; +import com.android.layoutlib.bridge.android.BridgeContext; +import com.android.layoutlib.bridge.android.BridgeXmlBlockParser; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; + +import android.util.AttributeSet; + +/** + * Delegate used to provide new implementation of a select few methods of {@link MenuInflater} + * <p/> + * Through the layoutlib_create tool, the original methods of MenuInflater have been + * replaced by calls to methods of the same name in this delegate class. + * <p/> + * The main purpose of the class is to get the view key from the menu xml parser and add it to + * the menu item. The view key is used by the IDE to match the individual view elements to the + * corresponding xml tag in the menu/layout file. + * <p/> + * For Menus, the views may be reused and the {@link MenuItem} is a better object to hold the + * view key than the {@link MenuView.ItemView}. At the time of computation of the rest of {@link + * ViewInfo}, we check the corresponding view key in the menu item for the view and add it + */ +public class MenuInflater_Delegate { + + @LayoutlibDelegate + /*package*/ static void registerMenu(MenuInflater thisInflater, MenuItem menuItem, + AttributeSet attrs) { + if (menuItem instanceof BridgeMenuItemImpl) { + Context context = thisInflater.getContext(); + if (context instanceof ContextThemeWrapper) { + context = ((ContextThemeWrapper) context).getBaseContext(); + } + if (context instanceof BridgeContext) { + Object viewKey = BridgeInflater.getViewKeyFromParser( + attrs, ((BridgeContext) context), null, false); + ((BridgeMenuItemImpl) menuItem).setViewCookie(viewKey); + return; + } + } + // This means that Bridge did not take over the instantiation of some object properly. + // This is most likely a bug in the LayoutLib code. + Bridge.getLog().warning(LayoutLog.TAG_BROKEN, + "Action Bar Menu rendering may be incorrect.", null); + + } + + @LayoutlibDelegate + /*package*/ static void registerMenu(MenuInflater thisInflater, SubMenu subMenu, + AttributeSet parser) { + registerMenu(thisInflater, subMenu.getItem(), parser); + } + +} diff --git a/tools/layoutlib/bridge/src/com/android/internal/view/menu/BridgeMenuItemImpl.java b/tools/layoutlib/bridge/src/com/android/internal/view/menu/BridgeMenuItemImpl.java new file mode 100644 index 0000000..4bef424 --- /dev/null +++ b/tools/layoutlib/bridge/src/com/android/internal/view/menu/BridgeMenuItemImpl.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.view.menu; + +/** + * An extension of the {@link MenuItemImpl} to store the view cookie also. + */ +public class BridgeMenuItemImpl extends MenuItemImpl { + + /** + * An object returned by the IDE that helps mapping each View to the corresponding XML tag in + * the layout. For Menus, we store this cookie here and attach it to the corresponding view + * at the time of rendering. + */ + private Object viewCookie; + + /** + * Instantiates this menu item. + */ + BridgeMenuItemImpl(MenuBuilder menu, int group, int id, int categoryOrder, int ordering, + CharSequence title, int showAsAction) { + super(menu, group, id, categoryOrder, ordering, title, showAsAction); + } + + + public Object getViewCookie() { + return viewCookie; + } + + public void setViewCookie(Object viewCookie) { + this.viewCookie = viewCookie; + } +} diff --git a/tools/layoutlib/bridge/src/com/android/internal/view/menu/MenuBuilder_Delegate.java b/tools/layoutlib/bridge/src/com/android/internal/view/menu/MenuBuilder_Delegate.java new file mode 100644 index 0000000..505fb81 --- /dev/null +++ b/tools/layoutlib/bridge/src/com/android/internal/view/menu/MenuBuilder_Delegate.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.view.menu; + +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; + +/** + * Delegate used to provide new implementation of a select few methods of {@link MenuBuilder} + * <p/> + * Through the layoutlib_create tool, the original methods of {@code MenuBuilder} have been + * replaced by calls to methods of the same name in this delegate class. + */ +public class MenuBuilder_Delegate { + /** + * The method overrides the instantiation of the {@link MenuItemImpl} with an instance of + * {@link BridgeMenuItemImpl} so that view cookies may be stored. + */ + @LayoutlibDelegate + /*package*/ static MenuItemImpl createNewMenuItem(MenuBuilder thisMenu, int group, int id, + int categoryOrder, int ordering, CharSequence title, int defaultShowAsAction) { + return new BridgeMenuItemImpl(thisMenu, group, id, categoryOrder, ordering, title, + defaultShowAsAction); + } +} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java index afcadef..9787432 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java @@ -28,7 +28,6 @@ import com.android.ide.common.rendering.api.HardwareConfig; import com.android.ide.common.rendering.api.IAnimationListener; import com.android.ide.common.rendering.api.ILayoutPullParser; import com.android.ide.common.rendering.api.IProjectCallback; -import com.android.ide.common.rendering.api.RenderParams; import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.RenderSession; import com.android.ide.common.rendering.api.ResourceReference; @@ -39,6 +38,12 @@ import com.android.ide.common.rendering.api.SessionParams; import com.android.ide.common.rendering.api.SessionParams.RenderingMode; import com.android.ide.common.rendering.api.ViewInfo; import com.android.internal.util.XmlUtils; +import com.android.internal.view.menu.ActionMenuItemView; +import com.android.internal.view.menu.BridgeMenuItemImpl; +import com.android.internal.view.menu.IconMenuItemView; +import com.android.internal.view.menu.ListMenuItemView; +import com.android.internal.view.menu.MenuItemImpl; +import com.android.internal.view.menu.MenuView; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.android.BridgeContext; import com.android.layoutlib.bridge.android.BridgeLayoutParamsMapAttributes; @@ -101,11 +106,10 @@ import java.util.Map; /** * Class implementing the render session. - * + * <p/> * A session is a stateful representation of a layout file. It is initialized with data coming * through the {@link Bridge} API to inflate the layout. Further actions and rendering can then * be done on the layout. - * */ public class RenderSessionImpl extends RenderAction<SessionParams> { @@ -172,7 +176,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { @Override public Result init(long timeout) { Result result = super.init(timeout); - if (result.isSuccess() == false) { + if (!result.isSuccess()) { return result; } @@ -196,6 +200,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { // FIXME: find those out, and possibly add them to the render params boolean hasNavigationBar = true; + //noinspection ConstantConditions IWindowManager iwm = new IWindowManagerImpl(getContext().getConfiguration(), metrics, Surface.ROTATION_0, hasNavigationBar); @@ -229,10 +234,9 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { BridgeContext context = getContext(); boolean isRtl = Bridge.isLocaleRtl(params.getLocale()); int layoutDirection = isRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR; - ActionBarLayout actionBar = null; // the view group that receives the window background. - ViewGroup backgroundView = null; + ViewGroup backgroundView; if (mWindowIsFloating || params.isForceNoDecor()) { backgroundView = mViewRoot = mContentRoot = new FrameLayout(context); @@ -266,7 +270,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { NavigationBar navigationBar = createNavigationBar(context, hardwareConfig.getDensity(), isRtl, params.isRtlSupported()); topLayout.addView(navigationBar); - } catch (XmlPullParserException e) { + } catch (XmlPullParserException ignored) { } } @@ -322,7 +326,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { StatusBar statusBar = createStatusBar(context, hardwareConfig.getDensity(), layoutDirection, params.isRtlSupported()); topLayout.addView(statusBar); - } catch (XmlPullParserException e) { + } catch (XmlPullParserException ignored) { } } @@ -339,20 +343,16 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { // if the theme says no title/action bar, then the size will be 0 if (mActionBarSize > 0) { - try { - actionBar = createActionBar(context, params); - backgroundLayout.addView(actionBar); - actionBar.createMenuPopup(); - mContentRoot = actionBar.getContentRoot(); - } catch (XmlPullParserException e) { - - } + ActionBarLayout actionBar = createActionBar(context, params); + backgroundLayout.addView(actionBar); + actionBar.createMenuPopup(); + mContentRoot = actionBar.getContentRoot(); } else if (mTitleBarSize > 0) { try { TitleBar titleBar = createTitleBar(context, hardwareConfig.getDensity(), params.getAppLabel()); backgroundLayout.addView(titleBar); - } catch (XmlPullParserException e) { + } catch (XmlPullParserException ignored) { } } @@ -374,7 +374,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { NavigationBar navigationBar = createNavigationBar(context, hardwareConfig.getDensity(), isRtl, params.isRtlSupported()); topLayout.addView(navigationBar); - } catch (XmlPullParserException e) { + } catch (XmlPullParserException ignored) { } } @@ -399,7 +399,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { postInflateProcess(view, params.getProjectCallback()); // get the background drawable - if (mWindowBackground != null && backgroundView != null) { + if (mWindowBackground != null) { Drawable d = ResourceHelper.getDrawable(mWindowBackground, context); backgroundView.setBackground(d); } @@ -476,6 +476,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { // first measure the full layout, with EXACTLY to get the size of the // content as it is inside the decor/dialog + @SuppressWarnings("deprecation") Pair<Integer, Integer> exactMeasure = measureView( mViewRoot, mContentRoot.getChildAt(0), mMeasuredScreenWidth, MeasureSpec.EXACTLY, @@ -483,6 +484,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { // now measure the content only using UNSPECIFIED (where applicable, based on // the rendering mode). This will give us the size the content needs. + @SuppressWarnings("deprecation") Pair<Integer, Integer> result = measureView( mContentRoot, mContentRoot.getChildAt(0), mMeasuredScreenWidth, widthMeasureSpecMode, @@ -558,7 +560,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { mCanvas.setDensity(hardwareConfig.getDensity().getDpiValue()); } - if (freshRender && newImage == false) { + if (freshRender && !newImage) { Graphics2D gc = mImage.createGraphics(); gc.setComposite(AlphaComposite.Src); @@ -573,7 +575,8 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { mViewRoot.draw(mCanvas); } - mSystemViewInfoList = visitAllChildren(mViewRoot, 0, params.getExtendedViewInfoMode(), false); + mSystemViewInfoList = visitAllChildren(mViewRoot, 0, params.getExtendedViewInfoMode(), + false); // success! return SUCCESS.createResult(); @@ -603,6 +606,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { * @param heightMode the MeasureSpec mode to use for the height. * @return the measured width/height if measuredView is non-null, null otherwise. */ + @SuppressWarnings("deprecation") // For the use of Pair private Pair<Integer, Integer> measureView(ViewGroup viewToMeasure, View measuredView, int width, int widthMode, int height, int heightMode) { int w_spec = MeasureSpec.makeMeasureSpec(width, widthMode); @@ -633,7 +637,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { BridgeContext context = getContext(); // find the animation file. - ResourceValue animationResource = null; + ResourceValue animationResource; int animationId = 0; if (isFrameworkAnimation) { animationResource = context.getRenderResources().getFrameworkResource( @@ -723,7 +727,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { // add it to the parentView in the correct location Result result = addView(parentView, child, index); - if (result.isSuccess() == false) { + if (!result.isSuccess()) { return result; } @@ -793,13 +797,13 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { public void run() { Result result = moveView(previousParent, newParentView, childView, index, params); - if (result.isSuccess() == false) { + if (!result.isSuccess()) { listener.done(result); } // ready to do the work, acquire the scene. result = acquire(250); - if (result.isSuccess() == false) { + if (!result.isSuccess()) { listener.done(result); return; } @@ -857,7 +861,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { } Result result = moveView(previousParent, newParentView, childView, index, layoutParams); - if (result.isSuccess() == false) { + if (!result.isSuccess()) { return result; } @@ -991,7 +995,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { } Result result = removeView(parent, childView); - if (result.isSuccess() == false) { + if (!result.isSuccess()) { return result; } @@ -1019,7 +1023,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { private void findBackground(RenderResources resources) { - if (getParams().isBgColorOverridden() == false) { + if (!getParams().isBgColorOverridden()) { mWindowBackground = resources.findItemInTheme("windowBackground", true /*isFrameworkAttr*/); if (mWindowBackground != null) { @@ -1036,7 +1040,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { boolean windowFullscreen = getBooleanThemeValue(resources, "windowFullscreen", false /*defaultValue*/); - if (windowFullscreen == false && mWindowIsFloating == false) { + if (!windowFullscreen && !mWindowIsFloating) { // default value mStatusBarSize = DEFAULT_STATUS_BAR_HEIGHT; @@ -1090,7 +1094,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { boolean windowNoTitle = getBooleanThemeValue(resources, "windowNoTitle", false /*defaultValue*/); - if (windowNoTitle == false) { + if (!windowNoTitle) { // default size of the window title bar mTitleBarSize = DEFAULT_TITLE_BAR_HEIGHT; @@ -1117,7 +1121,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { } private void findNavigationBar(RenderResources resources, DisplayMetrics metrics) { - if (hasSoftwareButtons() && mWindowIsFloating == false) { + if (hasSoftwareButtons() && !mWindowIsFloating) { // default value mNavigationBarSize = 48; // ?? @@ -1131,15 +1135,12 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { int shortSize = hardwareConfig.getScreenHeight(); // compute in dp - int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / hardwareConfig.getDensity().getDpiValue(); + int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / + hardwareConfig.getDensity().getDpiValue(); - if (shortSizeDp < 600) { - // 0-599dp: "phone" UI with bar on the side - barOnBottom = false; - } else { - // 600+dp: "tablet" UI with bar on the bottom - barOnBottom = true; - } + // 0-599dp: "phone" UI with bar on the side + // 600+dp: "tablet" UI with bar on the bottom + barOnBottom = shortSizeDp >= 600; } if (barOnBottom) { @@ -1190,13 +1191,15 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { } /** - * Post process on a view hierachy that was just inflated. - * <p/>At the moment this only support TabHost: If {@link TabHost} is detected, look for the + * Post process on a view hierarchy that was just inflated. + * <p/> + * At the moment this only supports TabHost: If {@link TabHost} is detected, look for the * {@link TabWidget}, and the corresponding {@link FrameLayout} and make new tabs automatically * based on the content of the {@link FrameLayout}. * @param view the root view to process. * @param projectCallback callback to the project. */ + @SuppressWarnings("deprecation") // For the use of Pair private void postInflateProcess(View view, IProjectCallback projectCallback) throws PostInflateException { if (view instanceof TabHost) { @@ -1299,7 +1302,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { "TabHost requires a TabWidget with id \"android:id/tabs\".\n"); } - if ((v instanceof TabWidget) == false) { + if (!(v instanceof TabWidget)) { throw new PostInflateException(String.format( "TabHost requires a TabWidget with id \"android:id/tabs\".\n" + "View found with id 'tabs' is '%s'", v.getClass().getCanonicalName())); @@ -1308,12 +1311,14 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { v = tabHost.findViewById(android.R.id.tabcontent); if (v == null) { - // TODO: see if we can fake tabs even without the FrameLayout (same below when the framelayout is empty) + // TODO: see if we can fake tabs even without the FrameLayout (same below when the frameLayout is empty) + //noinspection SpellCheckingInspection throw new PostInflateException( "TabHost requires a FrameLayout with id \"android:id/tabcontent\"."); } - if ((v instanceof FrameLayout) == false) { + if (!(v instanceof FrameLayout)) { + //noinspection SpellCheckingInspection throw new PostInflateException(String.format( "TabHost requires a FrameLayout with id \"android:id/tabcontent\".\n" + "View found with id 'tabcontent' is '%s'", v.getClass().getCanonicalName())); @@ -1321,7 +1326,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { FrameLayout content = (FrameLayout)v; - // now process the content of the framelayout and dynamically create tabs for it. + // now process the content of the frameLayout and dynamically create tabs for it. final int count = content.getChildCount(); // this must be called before addTab() so that the TabHost searches its TabWidget @@ -1339,13 +1344,13 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { } }); tabHost.addTab(spec); - return; } else { - // for each child of the framelayout, add a new TabSpec + // for each child of the frameLayout, add a new TabSpec for (int i = 0 ; i < count ; i++) { View child = content.getChildAt(i); String tabSpec = String.format("tab_spec%d", i+1); int id = child.getId(); + @SuppressWarnings("deprecation") Pair<ResourceType, String> resource = projectCallback.resolveResourceId(id); String name; if (resource != null) { @@ -1468,13 +1473,13 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { ViewInfo result; if (isContentFrame) { result = new ViewInfo(view.getClass().getName(), - getContext().getViewKey(view), + getViewKey(view), view.getLeft(), view.getTop() + offset, view.getRight(), view.getBottom() + offset, view, view.getLayoutParams()); } else { result = new SystemViewInfo(view.getClass().getName(), - getContext().getViewKey(view), + getViewKey(view), view.getLeft(), view.getTop(), view.getRight(), view.getBottom(), view, view.getLayoutParams()); } @@ -1495,6 +1500,32 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { return result; } + /** + * The cookie for menu items are stored in menu item and not in the map from View stored in + * BridgeContext. + */ + private Object getViewKey(View view) { + BridgeContext context = getContext(); + if (!(view instanceof MenuView.ItemView)) { + return context.getViewKey(view); + } + MenuItemImpl menuItem; + if (view instanceof ActionMenuItemView) { + menuItem = ((ActionMenuItemView) view).getItemData(); + } else if (view instanceof ListMenuItemView) { + menuItem = ((ListMenuItemView) view).getItemData(); + } else if (view instanceof IconMenuItemView) { + menuItem = ((IconMenuItemView) view).getItemData(); + } else { + menuItem = null; + } + if (menuItem instanceof BridgeMenuItemImpl) { + return ((BridgeMenuItemImpl) menuItem).getViewCookie(); + } + + return null; + } + private void invalidateRenderingSize() { mMeasuredScreenWidth = mMeasuredScreenHeight = -1; } @@ -1545,8 +1576,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { /** * Creates the action bar. Also queries the project callback for missing information. */ - private ActionBarLayout createActionBar(BridgeContext context, SessionParams params) - throws XmlPullParserException { + private ActionBarLayout createActionBar(BridgeContext context, SessionParams params) { ActionBarLayout actionBar = new ActionBarLayout(context, params); actionBar.setLayoutParams(new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java index 9a31705..3e75c9e 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java @@ -632,8 +632,8 @@ public class AsmAnalyzer { // field instruction @Override public void visitFieldInsn(int opcode, String owner, String name, String desc) { - // name is the field's name. - considerName(name); + // owner is the class that declares the field. + considerName(owner); // desc is the field's descriptor (see Type). considerDesc(desc); } diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java index c03ccb7..7b0f8f5 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java @@ -142,6 +142,8 @@ public final class CreateInfo implements ICreateInfo { "android.view.ViewRootImpl#isInTouchMode", "android.view.WindowManagerGlobal#getWindowManagerService", "android.view.inputmethod.InputMethodManager#getInstance", + "android.view.MenuInflater#registerMenu", + "com.android.internal.view.menu.MenuBuilder#createNewMenuItem", "com.android.internal.util.XmlUtils#convertValueToInt", "com.android.internal.textservice.ITextServicesManager$Stub#asInterface", }; diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DependencyFinder.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DependencyFinder.java index c988c70..2016c0e 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DependencyFinder.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DependencyFinder.java @@ -527,7 +527,8 @@ public class DependencyFinder { // field instruction @Override public void visitFieldInsn(int opcode, String owner, String name, String desc) { - // name is the field's name. + // owner is the class that declares the field. + considerName(owner); // desc is the field's descriptor (see Type). considerDesc(desc); } diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java index 7ec0d38..78e2c48 100644 --- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java @@ -83,6 +83,7 @@ public class AsmAnalyzerTest { "mock_android.dummy.InnerTest$MyStaticInnerClass", "mock_android.dummy.InnerTest$NotStaticInner1", "mock_android.dummy.InnerTest$NotStaticInner2", + "mock_android.util.EmptyArray", "mock_android.view.View", "mock_android.view.ViewGroup", "mock_android.view.ViewGroup$LayoutParams", @@ -217,15 +218,16 @@ public class AsmAnalyzerTest { TreeMap<String, ClassReader> in_deps = new TreeMap<String, ClassReader>(); TreeMap<String, ClassReader> out_deps = new TreeMap<String, ClassReader>(); - ClassReader cr = mAa.findClass("mock_android.widget.TableLayout", zipClasses, keep); + ClassReader cr = mAa.findClass("mock_android.widget.LinearLayout", zipClasses, keep); DependencyVisitor visitor = mAa.getVisitor(zipClasses, keep, new_keep, in_deps, out_deps); // get first level dependencies cr.accept(visitor, 0 /* flags */); assertArrayEquals(new String[] { + "mock_android.util.EmptyArray", "mock_android.view.ViewGroup", - "mock_android.widget.TableLayout$LayoutParams", + "mock_android.widget.LinearLayout$LayoutParams", }, out_deps.keySet().toArray()); @@ -255,7 +257,7 @@ public class AsmAnalyzerTest { assertArrayEquals(new String[] { }, out_deps.keySet().toArray()); assertArrayEquals(new String[] { - "mock_android.widget.TableLayout", + "mock_android.widget.LinearLayout", }, keep.keySet().toArray()); } } diff --git a/tools/layoutlib/create/tests/data/mock_android.jar b/tools/layoutlib/create/tests/data/mock_android.jar Binary files differindex 8dd0481..c6ca3c4 100644 --- a/tools/layoutlib/create/tests/data/mock_android.jar +++ b/tools/layoutlib/create/tests/data/mock_android.jar diff --git a/tools/layoutlib/create/tests/mock_data/mock_android/util/EmptyArray.java b/tools/layoutlib/create/tests/mock_data/mock_android/util/EmptyArray.java new file mode 100644 index 0000000..aaeebf6 --- /dev/null +++ b/tools/layoutlib/create/tests/mock_data/mock_android/util/EmptyArray.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package mock_android.util; + +import java.lang.JavaClass; + +public class EmptyArray { + + public static final Object[] OBJECT = new Object[0]; +} diff --git a/tools/layoutlib/create/tests/mock_data/mock_android/widget/LinearLayout.java b/tools/layoutlib/create/tests/mock_data/mock_android/widget/LinearLayout.java index 3870a63..af56c4b 100644 --- a/tools/layoutlib/create/tests/mock_data/mock_android/widget/LinearLayout.java +++ b/tools/layoutlib/create/tests/mock_data/mock_android/widget/LinearLayout.java @@ -16,11 +16,13 @@ package mock_android.widget; +import mock_android.util.EmptyArray; import mock_android.view.ViewGroup; public class LinearLayout extends ViewGroup { - public class LayoutParams extends mock_android.view.ViewGroup.LayoutParams { + Object[] mObjects = EmptyArray.OBJECT; + public class LayoutParams extends MarginLayoutParams { } |
