From 198b8160cfeeb178d3b2073c8d03afdafe338908 Mon Sep 17 00:00:00 2001
From: Po Lu
Date: Sat, 28 Jan 2023 16:29:22 +0800
Subject: 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.
---
java/AndroidManifest.xml.in | 4 ++
java/README | 63 ++++++++++++++++++++++++++++++--
java/org/gnu/emacs/EmacsContextMenu.java | 22 +++++++++--
java/org/gnu/emacs/EmacsCopyArea.java | 6 +++
4 files changed, 88 insertions(+), 7 deletions(-)
(limited to 'java')
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 . -->
+
+
+
+
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
}
}
-Java arrays are similar to C arrays in that they can not grow. But
+Java arrays are similar to C arrays in that they can not grow. But
they are very much unlike C arrays in that they are always references
-(as opposed to decaying into pointers in various situations), and
+(as opposed to decaying into pointers in only some situations), and
contain information about their length.
If another function named ``frobinicate1'' takes an array as an
argument, then it need not take the length of the array.
-Instead, it simply iterates over the array like so:
+Instead, it may simply iterate over the array like so:
int i, k;
@@ -339,10 +339,65 @@ struct emacs_array_container
or, possibly even better,
-typedef int my_array[10];
+typedef int emacs_array_container[10];
Alas, Java has no equivalent of `typedef'.
+Like in C, Java string literals are delimited by double quotes.
+Unlike C, however, strings are not NULL-terminated arrays of
+characters, but a distinct type named ``String''. They store their
+own length, characters in Java's 16-bit ``char'' type, and are capable
+of holding NULL bytes.
+
+Instead of writing:
+
+wchar_t character;
+extern char *s;
+size_t s;
+
+ for (/* determine n, s in a loop. */)
+ s += mbstowc (&character, s, n);
+
+or:
+
+const char *byte;
+
+for (byte = my_string; *byte; ++byte)
+ /* do something with *byte. */;
+
+or perhaps even:
+
+size_t length, i;
+char foo;
+
+length = strlen (my_string);
+
+for (i = 0; i < length; ++i)
+ foo = my_string[i];
+
+you write:
+
+char foo;
+int i;
+
+for (i = 0; i < myString.length (); ++i)
+ foo = myString.charAt (0);
+
+Java also has stricter rules on what can be used as a truth value in a
+conditional. While in C, any non-zero value is true, Java requires
+that every truth value be of the boolean type ``boolean''.
+
+What this means is that instead of simply writing:
+
+ if (foo || bar)
+
+where foo can either be 1 or 0, and bar can either be NULL or a
+pointer to something, you must explicitly write:
+
+ if (foo != 0 || bar != null)
+
+in Java.
+
JAVA NATIVE INTERFACE
Java 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
public int itemID;
public String itemName;
public EmacsContextMenu subMenu;
- public boolean isEnabled;
+ public boolean isEnabled, isCheckable, isChecked;
@Override
public boolean
@@ -108,10 +108,15 @@ public class EmacsContextMenu
/* Add a normal menu item to the context menu with the id ITEMID and
the name ITEMNAME. Enable it if ISENABLED, else keep it
- disabled. */
+ disabled.
+
+ If this is not a submenu and ISCHECKABLE is set, make the item
+ checkable. Likewise, if ISCHECKED is set, make the item
+ checked. */
public void
- addItem (int itemID, String itemName, boolean isEnabled)
+ addItem (int itemID, String itemName, boolean isEnabled,
+ boolean isCheckable, boolean isChecked)
{
Item item;
@@ -119,6 +124,8 @@ public class EmacsContextMenu
item.itemID = itemID;
item.itemName = itemName;
item.isEnabled = isEnabled;
+ item.isCheckable = isCheckable;
+ item.isChecked = isChecked;
menuItems.add (item);
}
@@ -198,6 +205,15 @@ public class EmacsContextMenu
/* If the item ID is zero, then disable the item. */
if (item.itemID == 0 || !item.isEnabled)
menuItem.setEnabled (false);
+
+ /* Now make the menu item display a checkmark as
+ appropriate. */
+
+ if (item.isCheckable)
+ menuItem.setCheckable (true);
+
+ if (item.isChecked)
+ menuItem.setChecked (true);
}
}
}
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
if (src_y + height > srcBitmap.getHeight ())
height = srcBitmap.getHeight () - src_y;
+ /* If width and height are empty or negative, then skip the entire
+ CopyArea operation lest createBitmap throw an exception. */
+
+ if (width <= 0 || height <= 0)
+ return;
+
rect = new Rect (dest_x, dest_y, dest_x + width,
dest_y + height);
--
cgit v1.2.1