aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
authorPo Lu2023-01-28 16:29:22 +0800
committerPo Lu2023-01-28 16:29:22 +0800
commit198b8160cfeeb178d3b2073c8d03afdafe338908 (patch)
tree590c73006536ddfcc8acd8eff8fb80e31c2a009b /java
parent5bd38905ac67221503f027737912fa0df3602a02 (diff)
downloademacs-198b8160cfeeb178d3b2073c8d03afdafe338908.tar.gz
emacs-198b8160cfeeb178d3b2073c8d03afdafe338908.zip
Update Android port
* doc/emacs/android.texi (Android File System): Describe an easier way to disable scoped storage. * java/AndroidManifest.xml.in: Add new permission to allow that. * java/README: Add more text describing Java. * java/org/gnu/emacs/EmacsContextMenu.java (Item): New fields `isCheckable' and `isChecked'. (EmacsContextMenu, addItem): New arguments. (inflateMenuItems): Set checked status as appropriate. * java/org/gnu/emacs/EmacsCopyArea.java (perform): Disallow operations where width and height are less than or equal to zero. * lisp/menu-bar.el (menu-bar-edit-menu): Make execute-extended-command available as a menu item. * src/androidmenu.c (android_init_emacs_context_menu) (android_menu_show): * src/menu.c (have_boxes): Implement menu check boxes.
Diffstat (limited to 'java')
-rw-r--r--java/AndroidManifest.xml.in4
-rw-r--r--java/README63
-rw-r--r--java/org/gnu/emacs/EmacsContextMenu.java22
-rw-r--r--java/org/gnu/emacs/EmacsCopyArea.java6
4 files changed, 88 insertions, 7 deletions
diff --git a/java/AndroidManifest.xml.in b/java/AndroidManifest.xml.in
index 527ce74c474..09e4e788e0b 100644
--- a/java/AndroidManifest.xml.in
+++ b/java/AndroidManifest.xml.in
@@ -52,6 +52,10 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. -->
52 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 52 <uses-permission android:name="android.permission.RECORD_AUDIO" />
53 <uses-permission android:name="android.permission.CAMERA" /> 53 <uses-permission android:name="android.permission.CAMERA" />
54 54
55 <!-- This is required on Android 11 or later to access /sdcard. -->
56
57 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
58
55 <uses-sdk android:minSdkVersion="@ANDROID_MIN_SDK@" 59 <uses-sdk android:minSdkVersion="@ANDROID_MIN_SDK@"
56 android:targetSdkVersion="33"/> 60 android:targetSdkVersion="33"/>
57 61
diff --git a/java/README b/java/README
index 44f5a415162..3bce2556403 100644
--- a/java/README
+++ b/java/README
@@ -292,15 +292,15 @@ public class EmacsFrobinicator
292 } 292 }
293} 293}
294 294
295Java arrays are similar to C arrays in that they can not grow. But 295Java arrays are similar to C arrays in that they can not grow. But
296they are very much unlike C arrays in that they are always references 296they are very much unlike C arrays in that they are always references
297(as opposed to decaying into pointers in various situations), and 297(as opposed to decaying into pointers in only some situations), and
298contain information about their length. 298contain information about their length.
299 299
300If another function named ``frobinicate1'' takes an array as an 300If another function named ``frobinicate1'' takes an array as an
301argument, then it need not take the length of the array. 301argument, then it need not take the length of the array.
302 302
303Instead, it simply iterates over the array like so: 303Instead, it may simply iterate over the array like so:
304 304
305int i, k; 305int i, k;
306 306
@@ -339,10 +339,65 @@ struct emacs_array_container
339 339
340or, possibly even better, 340or, possibly even better,
341 341
342typedef int my_array[10]; 342typedef int emacs_array_container[10];
343 343
344Alas, Java has no equivalent of `typedef'. 344Alas, Java has no equivalent of `typedef'.
345 345
346Like in C, Java string literals are delimited by double quotes.
347Unlike C, however, strings are not NULL-terminated arrays of
348characters, but a distinct type named ``String''. They store their
349own length, characters in Java's 16-bit ``char'' type, and are capable
350of holding NULL bytes.
351
352Instead of writing:
353
354wchar_t character;
355extern char *s;
356size_t s;
357
358 for (/* determine n, s in a loop. */)
359 s += mbstowc (&character, s, n);
360
361or:
362
363const char *byte;
364
365for (byte = my_string; *byte; ++byte)
366 /* do something with *byte. */;
367
368or perhaps even:
369
370size_t length, i;
371char foo;
372
373length = strlen (my_string);
374
375for (i = 0; i < length; ++i)
376 foo = my_string[i];
377
378you write:
379
380char foo;
381int i;
382
383for (i = 0; i < myString.length (); ++i)
384 foo = myString.charAt (0);
385
386Java also has stricter rules on what can be used as a truth value in a
387conditional. While in C, any non-zero value is true, Java requires
388that every truth value be of the boolean type ``boolean''.
389
390What this means is that instead of simply writing:
391
392 if (foo || bar)
393
394where foo can either be 1 or 0, and bar can either be NULL or a
395pointer to something, you must explicitly write:
396
397 if (foo != 0 || bar != null)
398
399in Java.
400
346JAVA NATIVE INTERFACE 401JAVA NATIVE INTERFACE
347 402
348Java also provides an interface for C code to interface with Java. 403Java also provides an interface for C code to interface with Java.
diff --git a/java/org/gnu/emacs/EmacsContextMenu.java b/java/org/gnu/emacs/EmacsContextMenu.java
index 056d8fb692c..92429410d03 100644
--- a/java/org/gnu/emacs/EmacsContextMenu.java
+++ b/java/org/gnu/emacs/EmacsContextMenu.java
@@ -56,7 +56,7 @@ public class EmacsContextMenu
56 public int itemID; 56 public int itemID;
57 public String itemName; 57 public String itemName;
58 public EmacsContextMenu subMenu; 58 public EmacsContextMenu subMenu;
59 public boolean isEnabled; 59 public boolean isEnabled, isCheckable, isChecked;
60 60
61 @Override 61 @Override
62 public boolean 62 public boolean
@@ -108,10 +108,15 @@ public class EmacsContextMenu
108 108
109 /* Add a normal menu item to the context menu with the id ITEMID and 109 /* Add a normal menu item to the context menu with the id ITEMID and
110 the name ITEMNAME. Enable it if ISENABLED, else keep it 110 the name ITEMNAME. Enable it if ISENABLED, else keep it
111 disabled. */ 111 disabled.
112
113 If this is not a submenu and ISCHECKABLE is set, make the item
114 checkable. Likewise, if ISCHECKED is set, make the item
115 checked. */
112 116
113 public void 117 public void
114 addItem (int itemID, String itemName, boolean isEnabled) 118 addItem (int itemID, String itemName, boolean isEnabled,
119 boolean isCheckable, boolean isChecked)
115 { 120 {
116 Item item; 121 Item item;
117 122
@@ -119,6 +124,8 @@ public class EmacsContextMenu
119 item.itemID = itemID; 124 item.itemID = itemID;
120 item.itemName = itemName; 125 item.itemName = itemName;
121 item.isEnabled = isEnabled; 126 item.isEnabled = isEnabled;
127 item.isCheckable = isCheckable;
128 item.isChecked = isChecked;
122 129
123 menuItems.add (item); 130 menuItems.add (item);
124 } 131 }
@@ -198,6 +205,15 @@ public class EmacsContextMenu
198 /* If the item ID is zero, then disable the item. */ 205 /* If the item ID is zero, then disable the item. */
199 if (item.itemID == 0 || !item.isEnabled) 206 if (item.itemID == 0 || !item.isEnabled)
200 menuItem.setEnabled (false); 207 menuItem.setEnabled (false);
208
209 /* Now make the menu item display a checkmark as
210 appropriate. */
211
212 if (item.isCheckable)
213 menuItem.setCheckable (true);
214
215 if (item.isChecked)
216 menuItem.setChecked (true);
201 } 217 }
202 } 218 }
203 } 219 }
diff --git a/java/org/gnu/emacs/EmacsCopyArea.java b/java/org/gnu/emacs/EmacsCopyArea.java
index 7a97d706794..f8974e17c2e 100644
--- a/java/org/gnu/emacs/EmacsCopyArea.java
+++ b/java/org/gnu/emacs/EmacsCopyArea.java
@@ -99,6 +99,12 @@ public class EmacsCopyArea
99 if (src_y + height > srcBitmap.getHeight ()) 99 if (src_y + height > srcBitmap.getHeight ())
100 height = srcBitmap.getHeight () - src_y; 100 height = srcBitmap.getHeight () - src_y;
101 101
102 /* If width and height are empty or negative, then skip the entire
103 CopyArea operation lest createBitmap throw an exception. */
104
105 if (width <= 0 || height <= 0)
106 return;
107
102 rect = new Rect (dest_x, dest_y, dest_x + width, 108 rect = new Rect (dest_x, dest_y, dest_x + width,
103 dest_y + height); 109 dest_y + height);
104 110