From 77feba74564c4d58b472b82fec0137091bb5c7e1 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Tue, 21 Feb 2023 21:07:57 +0800 Subject: [PATCH] Update Android port * java/org/gnu/emacs/EmacsContextMenu.java (EmacsContextMenu) (addSubmenu, inflateMenuItems): Handle tooltips correctly. * src/android.c (android_scan_directory_tree): Fix limit generation for root directory. * src/androidmenu.c (android_init_emacs_context_menu) (android_menu_show): Implement menu item help text on Android 8.0 and later. --- java/org/gnu/emacs/EmacsContextMenu.java | 13 +++++++++++-- src/android.c | 8 ++++++-- src/androidmenu.c | 22 +++++++++++++++++++--- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/java/org/gnu/emacs/EmacsContextMenu.java b/java/org/gnu/emacs/EmacsContextMenu.java index 184c611bf9d..6b3ae0c6de9 100644 --- a/java/org/gnu/emacs/EmacsContextMenu.java +++ b/java/org/gnu/emacs/EmacsContextMenu.java @@ -26,6 +26,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.os.Build; import android.view.Menu; import android.view.MenuItem; @@ -54,7 +55,7 @@ public class EmacsContextMenu private class Item implements MenuItem.OnMenuItemClickListener { public int itemID; - public String itemName; + public String itemName, tooltip; public EmacsContextMenu subMenu; public boolean isEnabled, isCheckable, isChecked; @@ -147,7 +148,7 @@ public class EmacsContextMenu item name. */ public EmacsContextMenu - addSubmenu (String itemName, String title) + addSubmenu (String itemName, String title, String tooltip) { EmacsContextMenu submenu; Item item; @@ -155,6 +156,7 @@ public class EmacsContextMenu item = new Item (); item.itemID = 0; item.itemName = itemName; + item.tooltip = tooltip; item.subMenu = createContextMenu (title); item.subMenu.parent = this; @@ -214,6 +216,13 @@ public class EmacsContextMenu if (item.isChecked) menuItem.setChecked (true); + + /* If the tooltip text is set and the system is new enough + to support menu item tooltips, set it on the item. */ + + if (item.tooltip != null + && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + menuItem.setTooltipText (item.tooltip); } } } diff --git a/src/android.c b/src/android.c index 0627b44f8fd..4639d84a2a1 100644 --- a/src/android.c +++ b/src/android.c @@ -777,13 +777,17 @@ android_scan_directory_tree (char *file, size_t *limit_return) /* If there are no tokens, just return the start of the directory tree. */ + if (!ntokens) { SAFE_FREE (); - /* Subtract the initial header bytes. */ + /* Return the size of the directory tree as the limit. + Do not subtract the initial header bytes, as the limit + is an offset from the start of the file. */ + if (limit_return) - *limit_return = directory_tree_size - 5; + *limit_return = directory_tree_size; return start; } diff --git a/src/androidmenu.c b/src/androidmenu.c index acad775f26a..e1b64b9a545 100644 --- a/src/androidmenu.c +++ b/src/androidmenu.c @@ -100,7 +100,8 @@ android_init_emacs_context_menu (void) FIND_METHOD (add_item, "addItem", "(ILjava/lang/String;ZZZ)V"); FIND_METHOD (add_submenu, "addSubmenu", "(Ljava/lang/String;" - "Ljava/lang/String;)Lorg/gnu/emacs/EmacsContextMenu;"); + "Ljava/lang/String;Ljava/lang/String;)" + "Lorg/gnu/emacs/EmacsContextMenu;"); FIND_METHOD (add_pane, "addPane", "(Ljava/lang/String;)V"); FIND_METHOD (parent, "parent", "()Lorg/gnu/emacs/EmacsContextMenu;"); FIND_METHOD (display, "display", "(Lorg/gnu/emacs/EmacsWindow;II)Z"); @@ -236,12 +237,13 @@ android_menu_show (struct frame *f, int x, int y, int menuflags, Lisp_Object title, const char **error_name) { jobject context_menu, current_context_menu; - jobject title_string, temp; + jobject title_string, help_string, temp; size_t i; Lisp_Object pane_name, prefix; const char *pane_string; specpdl_ref count, count1; Lisp_Object item_name, enable, def, tem, entry, type, selected; + Lisp_Object help; jmethodID method; jobject store; bool rc; @@ -354,6 +356,7 @@ android_menu_show (struct frame *f, int x, int y, int menuflags, def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION); type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE); selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); + help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); /* This is an actual menu item (or submenu). Add it to the menu. */ @@ -365,12 +368,22 @@ android_menu_show (struct frame *f, int x, int y, int menuflags, title_string = (!NILP (item_name) ? android_build_string (item_name) : NULL); + help_string = NULL; + + /* Menu items can have tool tips on Android 26 and + later. In this case, set it to the help string. */ + + if (android_get_current_api_level () >= 26 + && STRINGP (help)) + help_string = android_build_string (help_string); + store = current_context_menu; current_context_menu = (*android_java_env)->CallObjectMethod (android_java_env, current_context_menu, menu_class.add_submenu, - title_string, NULL); + title_string, NULL, + help_string); android_exception_check (); if (store != context_menu) @@ -378,6 +391,9 @@ android_menu_show (struct frame *f, int x, int y, int menuflags, if (title_string) ANDROID_DELETE_LOCAL_REF (title_string); + + if (help_string) + ANDROID_DELETE_LOCAL_REF (help_string); } else if (NILP (def) && menu_separator_name_p (SSDATA (item_name))) /* Ignore this separator item. */ -- 2.39.5