From 98c90135fe5f3729a3fa6e9a724d04a78b2cd514 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sun, 5 Feb 2023 23:02:14 +0800 Subject: [PATCH] Update Android port * INSTALL.android: Explain how to build selinux. * configure.ac: Enable selinux on Android. * cross/ndk-build/ndk-build-shared-library.mk: ($(call objname,$(LOCAL_MODULE),$(basename $(1))))::($$(error Unsupported suffix)::(NDK_CFLAGS_$(LOCAL_MODULE)): * cross/ndk-build/ndk-build-static-library.mk: ($(call objname,$(LOCAL_MODULE),$(basename $(1))))::($$(error Unsupported suffix)::(NDK_CFLAGS_$(LOCAL_MODULE)): Correctly handle files with a .cc suffix, and clang-specific asflags. * cross/ndk-build/ndk-clear-vars.mk: Handle AOSP extensions LOCAL_ADDITIONAL_DEPENDENCIES, LOCAL_CLANG_ASFLAGS_$(NDK_BUILD_ARCH) and LOCAL_IS_HOST_MODULE. * doc/emacs/android.texi (Android Startup): Explain emacsclient wrapper. * java/org/gnu/emacs/EmacsView.java (EmacsView): New flag `isCurrentlyTextEditor'. (showOnScreenKeyboard, hideOnScreenKeyboard): Set as appropriate. (onCheckIsTextEditor): Return its value. * lisp/touch-screen.el (touch-screen-handle-scroll): Don't ding at buffer limits. * m4/ndk-build.m4: Improve doc. * src/Makefile.in (LIBSELINUX_CFLAGS): New variable. (EMACS_CFLAGS): Add it. --- INSTALL.android | 70 ++++++++++++++++ configure.ac | 23 ++++-- cross/ndk-build/ndk-build-shared-library.mk | 9 ++- cross/ndk-build/ndk-build-static-library.mk | 9 ++- cross/ndk-build/ndk-clear-vars.mk | 4 + doc/emacs/android.texi | 16 ++++ java/org/gnu/emacs/EmacsView.java | 15 ++++ lisp/touch-screen.el | 89 +++++++++++---------- m4/ndk-build.m4 | 8 +- src/Makefile.in | 3 +- 10 files changed, 194 insertions(+), 52 deletions(-) diff --git a/INSTALL.android b/INSTALL.android index eeeb14d78b3..6366b8d664d 100644 --- a/INSTALL.android +++ b/INSTALL.android @@ -171,6 +171,13 @@ work, along with what has to be patched to make them work: sqlite3 - https://android.googlesource.com/platform/external/sqlite/ (You must apply the patch at the end of this file, and add the `dist' directory to ``--with-ndk-path''.) + libselinux - https://android.googlesource.com/platform/external/libselinux + (You must apply the patches at the end of the file, and obtain + the following three dependencies.) + libpackagelistparser + https://android.googlesource.com/platform/system/core/+/refs/heads/nougat-mr1-dev/libpackagelistparser/ + libpcre - https://android.googlesource.com/platform/external/pcre + libcrypto - https://android.googlesource.com/platform/external/boringssl Many of these dependencies have been migrated over to the ``Android.bp'' build system now used to build Android itself. @@ -663,3 +670,66 @@ index c7bcb0f5..d4da1704 100644 else NEON := c endif + +PATCHES FOR SELINUX + +diff --git a/Android.mk b/Android.mk +index 659232e..1e64fd6 100644 +--- a/Android.mk ++++ b/Android.mk +@@ -116,3 +116,7 @@ LOCAL_STATIC_LIBRARIES := libselinux + LOCAL_WHOLE_STATIC_LIBRARIES := libpcre + LOCAL_C_INCLUDES := external/pcre + include $(BUILD_HOST_EXECUTABLE) ++ ++$(call import-module,libpcre) ++$(call import-module,libpackagelistparser) ++$(call import-module,libcrypto) + +diff --git a/src/android.c b/src/android.c +index 5206a9f..b351ffc 100644 +--- a/src/android.c ++++ b/src/android.c +@@ -21,8 +21,7 @@ + #include + #include + #include +-#include +-#include ++#include + #include "policy.h" + #include "callbacks.h" + #include "selinux_internal.h" +@@ -686,6 +685,7 @@ static int seapp_context_lookup(enum seapp_kind kind, + seinfo = parsedseinfo; + } + ++#if 0 + userid = uid / AID_USER; + isOwner = (userid == 0); + appid = uid % AID_USER; +@@ -702,9 +702,13 @@ static int seapp_context_lookup(enum seapp_kind kind, + username = "_app"; + appid -= AID_APP; + } else { ++#endif + username = "_isolated"; ++ appid = 0; ++#if 0 + appid -= AID_ISOLATED_START; + } ++#endif + + if (appid >= CAT_MAPPING_MAX_ID || userid >= CAT_MAPPING_MAX_ID) + goto err; +@@ -1662,8 +1666,10 @@ int selinux_log_callback(int type, const char *fmt, ...) + + va_start(ap, fmt); + if (vasprintf(&strp, fmt, ap) != -1) { ++#if 0 + LOG_PRI(priority, "SELinux", "%s", strp); + LOG_EVENT_STRING(AUDITD_LOG_TAG, strp); ++#endif + free(strp); + } + va_end(ap); diff --git a/configure.ac b/configure.ac index 0739c73703d..b8ce7840797 100644 --- a/configure.ac +++ b/configure.ac @@ -1063,6 +1063,7 @@ package will likely install on older systems but crash on startup.]) passthrough="$passthrough --with-sqlite3=$with_sqlite3" passthrough="$passthrough --with-gnutls=$with_gnutls" passthrough="$passthrough --with-tiff=$with_tiff" + passthrough="$passthrough --with-selinux=$with_selinux" AS_IF([XCONFIGURE=android ANDROID_CC="$ANDROID_CC" \ ANDROID_SDK="$android_sdk" android_abi=$android_abi \ @@ -1134,6 +1135,7 @@ if test "$ANDROID" = "yes"; then with_sqlite3=no with_gnutls=no with_tiff=no + with_selinux=no fi with_rsvg=no @@ -1148,7 +1150,6 @@ if test "$ANDROID" = "yes"; then with_gpm=no with_dbus=no with_gsettings=no - with_selinux=no with_modules=no with_threads=no @@ -3709,19 +3710,29 @@ if test "${HAVE_GTK}" = "yes"; then fi AC_SUBST([USE_STARTUP_NOTIFICATION]) -dnl SELinux is available for GNU/Linux only. +dnl SELinux is available for Linux kernel based systems only. +dnl These include GNU/Linux and Android. HAVE_LIBSELINUX=no LIBSELINUX_LIBS= +LIBSELINUX_CFLAGS= if test "${with_selinux}" = "yes"; then - AC_CHECK_LIB([selinux], [lgetfilecon], - [HAVE_LIBSELINUX=yes], - [HAVE_LIBSELINUX=no]) + if test "$REALLY_ANDROID" = "yes"; then + ndk_SEARCH_MODULE([libselinux], [LIBSELINUX], + [HAVE_LIBSELINUX=yes]) + else + AC_CHECK_LIB([selinux], [lgetfilecon], + [HAVE_LIBSELINUX=yes], + [HAVE_LIBSELINUX=no]) + fi if test "$HAVE_LIBSELINUX" = yes; then AC_DEFINE([HAVE_LIBSELINUX], [1], [Define to 1 if using SELinux.]) - LIBSELINUX_LIBS=-lselinux + if test "$REALLY_ANDROID" != "yes"; then + LIBSELINUX_LIBS=-lselinux + fi fi fi AC_SUBST([LIBSELINUX_LIBS]) +AC_SUBST([LIBSELINUX_CFLAGS]) HAVE_GNUTLS=no if test "${with_gnutls}" != "no" ; then diff --git a/cross/ndk-build/ndk-build-shared-library.mk b/cross/ndk-build/ndk-build-shared-library.mk index 5842486a1af..be4d16cb4ed 100644 --- a/cross/ndk-build/ndk-build-shared-library.mk +++ b/cross/ndk-build/ndk-build-shared-library.mk @@ -51,7 +51,14 @@ $(call objname,$(LOCAL_MODULE),$(basename $(1))): $(LOCAL_PATH)/$(1) else ifneq (x$(suffix $(1)),x.asm) +ifeq (x$(suffix $(1)),x.cc) + +$(call objname,$(LOCAL_MODULE),$(basename $(1))): $(LOCAL_PATH)/$(1) + $(NDK_BUILD_CC) -c $$< -o $$@ $(NDK_CFLAGS_$(LOCAL_MODULE)) $(NDK_CXXFLAGS_$(LOCAL_MODULE)) + +else $$(error Unsupported suffix: $(suffix $(1))) +endif else ifneq (x$(LOCAL_ASM_RULE_DEFINED),x) # Call this function to define a rule that will generate $(1) from @@ -82,7 +89,7 @@ endef # $(LOCAL_PATH). NDK_CFLAGS_$(LOCAL_MODULE) := $(addprefix -I,$(LOCAL_C_INCLUDES)) NDK_CFLAGS_$(LOCAL_MODULE) += -fPIC -iquote $(LOCAL_PATH) $(LOCAL_EXPORT_CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_CFLAGS_$(NDK_BUILD_ARCH)) -NDK_ASFLAGS_$(LOCAL_MODULE) := $(LOCAL_ASFLAGS) $(LOCAL_ASFLAGS_$(NDK_BUILD_ARCH)) +NDK_ASFLAGS_$(LOCAL_MODULE) := $(LOCAL_ASFLAGS) $(LOCAL_ASFLAGS_$(NDK_BUILD_ARCH)) $(and $(findstring clang,$(NDK_BUILD_CC)),$(LOCAL_CLANG_ASFLAGS_$(NDK_BUILD_ARCH))) NDK_LDFLAGS_$(LOCAL_MODULE) := $(LOCAL_LDLIBS) $(LOCAL_LDFLAGS) NDK_CXXFLAGS_$(LOCAL_MODULE) := $(LOCAL_CPPFLAGS) $(LOCAL_RTTI_FLAG) diff --git a/cross/ndk-build/ndk-build-static-library.mk b/cross/ndk-build/ndk-build-static-library.mk index f6df38e4c0b..ebcc3cd531d 100644 --- a/cross/ndk-build/ndk-build-static-library.mk +++ b/cross/ndk-build/ndk-build-static-library.mk @@ -43,7 +43,14 @@ $(call objname,$(LOCAL_MODULE),$(basename $(1))): $(LOCAL_PATH)/$(1) else ifneq (x$(suffix $(1)),x.asm) +ifeq (x$(suffix $(1)),x.cc) + +$(call objname,$(LOCAL_MODULE),$(basename $(1))): $(LOCAL_PATH)/$(1) + $(NDK_BUILD_CC) -c $$< -o $$@ $(NDK_CFLAGS_$(LOCAL_MODULE)) $(NDK_CXXFLAGS_$(LOCAL_MODULE)) + +else $$(error Unsupported suffix: $(suffix $(1))) +endif else ifneq (x$(LOCAL_ASM_RULE_DEFINED),x) # Call this function to define a rule that will generate $(1) from @@ -71,7 +78,7 @@ endef NDK_CFLAGS_$(LOCAL_MODULE) := $(addprefix -I,$(LOCAL_C_INCLUDES)) NDK_CFLAGS_$(LOCAL_MODULE) += -fPIC -iquote $(LOCAL_PATH) $(LOCAL_EXPORT_CFLAGS) $(LOCAL_CFLAGS) $(LOCAL_CFLAGS_$(NDK_BUILD_ARCH)) -NDK_ASFLAGS_$(LOCAL_MODULE) := $(LOCAL_ASFLAGS) $(LOCAL_ASFLAGS_$(NDK_BUILD_ARCH)) +NDK_ASFLAGS_$(LOCAL_MODULE) := $(LOCAL_ASFLAGS) $(LOCAL_ASFLAGS_$(NDK_BUILD_ARCH)) $(and $(findstring clang,$(NDK_BUILD_CC)),$(LOCAL_CLANG_ASFLAGS_$(NDK_BUILD_ARCH))) NDK_LDFLAGS_$(LOCAL_MODULE) := $(LOCAL_LDLIBS) $(LOCAL_LDFLAGS) NDK_CXXFLAGS_$(LOCAL_MODULE) := $(LOCAL_CPPFLAGS) $(LOCAL_RTTI_FLAG) ALL_OBJECT_FILES$(LOCAL_MODULE) := diff --git a/cross/ndk-build/ndk-clear-vars.mk b/cross/ndk-build/ndk-clear-vars.mk index bce5bc895be..5e8eff9f0ab 100644 --- a/cross/ndk-build/ndk-clear-vars.mk +++ b/cross/ndk-build/ndk-clear-vars.mk @@ -43,9 +43,13 @@ undefine LOCAL_EXPORT_C_INCLUDE_DIRS undefine LOCAL_EXPORT_LDFLAGS undefine LOCAL_EXPORT_LDLIBS +# AOSP extensions. undefine LOCAL_SRC_FILES_$(NDK_BUILD_ARCH) undefine LOCAL_ASFLAGS_$(NDK_BUILD_ARCH) undefine LOCAL_CFLAGS_$(NDK_BUILD_ARCH) +undefine LOCAL_ADDITIONAL_DEPENDENCIES +undefine LOCAL_CLANG_ASFLAGS_$(NDK_BUILD_ARCH) +undefine LOCAL_IS_HOST_MODULE # Emacs extensions! undefine LOCAL_ASM_RULE_DEFINED diff --git a/doc/emacs/android.texi b/doc/emacs/android.texi index 9dc6fddbb72..b1f01057a98 100644 --- a/doc/emacs/android.texi +++ b/doc/emacs/android.texi @@ -109,6 +109,22 @@ corrupted, Emacs can crash. If that happens, the dump file stored in the Emacs files directory can be erased through the same preferences screen. +@cindex emacsclient wrapper, android + Since there is no other way to start the @cmd{emacsclient} program +(@pxref{Emacs Server}) from another Android program, Emacs provides a +wrapper around the @cmd{emacsclient} program, which is registered with +the system as an application that can open all text files. + + When that wrapper is selected as the program with which to open a +file, it invokes @cmd{emacsclient} with the options +@cmd{--reuse-frame}, @cmd{--timeout=10}, @cmd{--no-wait}, and the name +of the file being opened. Then, upon success, the focus is +transferred to any open Emacs frame. + +It is sadly impossible to open certain kinds of files which are +provided by a ``content provider''. When that is the case, a dialog +is displayed with an explanation of the error. + @node Android File System @section What files Emacs can access under Android @cindex /assets directory, android diff --git a/java/org/gnu/emacs/EmacsView.java b/java/org/gnu/emacs/EmacsView.java index 730ed02d4f1..873124c86d1 100644 --- a/java/org/gnu/emacs/EmacsView.java +++ b/java/org/gnu/emacs/EmacsView.java @@ -106,6 +106,10 @@ public class EmacsView extends ViewGroup /* Whether or not this view is attached to a window. */ public boolean isAttachedToWindow; + /* Whether or not this view should have the on screen keyboard + displayed whenever possible. */ + public boolean isCurrentlyTextEditor; + public EmacsView (EmacsWindow window) { @@ -597,6 +601,7 @@ public class EmacsView extends ViewGroup /* Specifying no flags at all tells the system the user asked for the input method to be displayed. */ imManager.showSoftInput (this, 0); + isCurrentlyTextEditor = true; } public void @@ -604,6 +609,7 @@ public class EmacsView extends ViewGroup { imManager.hideSoftInputFromWindow (this.getWindowToken (), 0); + isCurrentlyTextEditor = false; } public void @@ -636,4 +642,13 @@ public class EmacsView extends ViewGroup screen keyboard to work correctly. */ return null; } + + @Override + public boolean + onCheckIsTextEditor () + { + /* If value is true, then the system will display the on screen + keyboard. */ + return isCurrentlyTextEditor; + } }; diff --git a/lisp/touch-screen.el b/lisp/touch-screen.el index fa98cbe5db9..8c4a73f326d 100644 --- a/lisp/touch-screen.el +++ b/lisp/touch-screen.el @@ -96,47 +96,54 @@ to the frame that they belong in." Perform vertical scrolling by DY, using `pixel-scroll-precision' if `touch-screen-precision-scroll' is enabled. Next, perform horizontal scrolling according to the movement in DX." - ;; Perform vertical scrolling first. - (if touch-screen-precision-scroll - (if (> dy 0) - (pixel-scroll-precision-scroll-down-page dy) - (pixel-scroll-precision-scroll-up-page (- dy))) - ;; Start conventional scrolling. First, determine the direction - ;; in which the scrolling is taking place. Load the accumulator - ;; value. - (let ((accumulator (or (nth 5 touch-screen-current-tool) 0)) - (window (cadr touch-screen-current-tool)) - (lines-vscrolled (or (nth 7 touch-screen-current-tool) 0))) - (setq accumulator (+ accumulator dy)) ; Add dy. - ;; Figure out how much it has scrolled and how much remains on - ;; the top or bottom of the window. - (while (catch 'again - (let* ((line-height (window-default-line-height window))) - (if (and (< accumulator 0) - (>= (- accumulator) line-height)) - (progn - (setq accumulator (+ accumulator line-height)) - (scroll-down 1) - (setq lines-vscrolled (1+ lines-vscrolled)) - (when (not (zerop accumulator)) - ;; If there is still an outstanding amount to - ;; scroll, do this again. - (throw 'again t))) - (when (and (> accumulator 0) - (>= accumulator line-height)) - (setq accumulator (- accumulator line-height)) - (scroll-up 1) - (setq lines-vscrolled (1+ lines-vscrolled)) - (when (not (zerop accumulator)) - ;; If there is still an outstanding amount to - ;; scroll, do this again. - (throw 'again t))))) - ;; Scrolling is done. Move the accumulator back to - ;; touch-screen-current-tool and break out of the loop. - (setcar (nthcdr 5 touch-screen-current-tool) accumulator) - (setcar (nthcdr 7 touch-screen-current-tool) - lines-vscrolled) - nil)))) + ;; Perform vertical scrolling first. Do not ding at buffer limits. + ;; Show a message instead. + (condition-case nil + (if touch-screen-precision-scroll + (if (> dy 0) + (pixel-scroll-precision-scroll-down-page dy) + (pixel-scroll-precision-scroll-up-page (- dy))) + ;; Start conventional scrolling. First, determine the + ;; direction in which the scrolling is taking place. Load the + ;; accumulator value. + (let ((accumulator (or (nth 5 touch-screen-current-tool) 0)) + (window (cadr touch-screen-current-tool)) + (lines-vscrolled (or (nth 7 touch-screen-current-tool) 0))) + (setq accumulator (+ accumulator dy)) ; Add dy. + ;; Figure out how much it has scrolled and how much remains + ;; on the top or bottom of the window. + (while (catch 'again + (let* ((line-height (window-default-line-height window))) + (if (and (< accumulator 0) + (>= (- accumulator) line-height)) + (progn + (setq accumulator (+ accumulator line-height)) + (scroll-down 1) + (setq lines-vscrolled (1+ lines-vscrolled)) + (when (not (zerop accumulator)) + ;; If there is still an outstanding + ;; amount to scroll, do this again. + (throw 'again t))) + (when (and (> accumulator 0) + (>= accumulator line-height)) + (setq accumulator (- accumulator line-height)) + (scroll-up 1) + (setq lines-vscrolled (1+ lines-vscrolled)) + (when (not (zerop accumulator)) + ;; If there is still an outstanding amount + ;; to scroll, do this again. + (throw 'again t))))) + ;; Scrolling is done. Move the accumulator back to + ;; touch-screen-current-tool and break out of the + ;; loop. + (setcar (nthcdr 5 touch-screen-current-tool) accumulator) + (setcar (nthcdr 7 touch-screen-current-tool) + lines-vscrolled) + nil)))) + (beginning-of-buffer + (message (error-message-string '(beginning-of-buffer)))) + (end-of-buffer + (message (error-message-string '(end-of-buffer))))) ;; Perform horizontal scrolling by DX, as this does not signal at ;; the beginning of the buffer. diff --git a/m4/ndk-build.m4 b/m4/ndk-build.m4 index 0ab6197d735..888b587af02 100644 --- a/m4/ndk-build.m4 +++ b/m4/ndk-build.m4 @@ -90,6 +90,8 @@ ndk_replace_pkg_config_package () { done } +# ndk_parse_pkg_config_string PKG_CONFIG_STRING +# --------------------------------------------- # Parse a pkg-config style list of modules. Place the resulting list # in ndk_modules. @@ -109,8 +111,10 @@ ndk_parse_pkg_config_string () { done } -# Resolve $1, a single import. Prepend its makefile to ndk_MAKEFILES -# if found. Also, prepend all includes to the variable +# ndk_resolve_import_module MODULE +# -------------------------------- +# Resolve MODULE, a single import. Prepend its makefile to +# ndk_MAKEFILES if found. Also, prepend all includes to the variable # ndk_import_includes. ndk_resolve_import_module () { diff --git a/src/Makefile.in b/src/Makefile.in index f17e34be616..d5d979a9bd3 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -349,6 +349,7 @@ CM_OBJ=@CM_OBJ@ LIBGPM = @LIBGPM@ LIBSELINUX_LIBS = @LIBSELINUX_LIBS@ +LIBSELINUX_CFLAGS = @LIBSELINUX_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ @@ -437,7 +438,7 @@ EMACS_CFLAGS=-Demacs $(MYCPPFLAGS) -I. -I$(srcdir) \ $(LIBGNUTLS_CFLAGS) $(NOTIFY_CFLAGS) $(CAIRO_CFLAGS) \ $(WERROR_CFLAGS) $(HAIKU_CFLAGS) $(XCOMPOSITE_CFLAGS) $(XSHAPE_CFLAGS) \ $(ANDROID_CFLAGS) $(GIF_CFLAGS) $(JPEG_CFLAGS) $(SQLITE3_CFLAGS) \ - $(LIBGMP_CFLAGS) $(TIFF_CFLAGS) + $(LIBGMP_CFLAGS) $(TIFF_CFLAGS) $(LIBSELINUX_CFLAGS) ALL_CFLAGS = $(EMACS_CFLAGS) $(WARN_CFLAGS) $(CFLAGS) ALL_OBJC_CFLAGS = $(EMACS_CFLAGS) \ $(filter-out $(NON_OBJC_CFLAGS),$(WARN_CFLAGS)) $(CFLAGS) \ -- 2.39.5