From 253f1aff1ab00e9794f3cfcf50e86e335f411242 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 5 Oct 2023 11:57:26 +0800 Subject: [PATCH] Port Emacs to Android 34 * configure.ac: Detect and require Android 34 headers. * doc/emacs/android.texi (Android Environment): Mention new permissions mandated by Android 34. * java/AndroidManifest.xml.in: Introduce new permissions and foreground service types prerequisite for background execution under Android 34. * java/INSTALL: Update installation documentation. * java/org/gnu/emacs/EmacsSdk7FontDriver.java (Sdk7FontEntity) (Sdk7FontObject): * java/org/gnu/emacs/EmacsService.java (onCreate): Silence deprecation warnings. * src/android.c: Update documentation. --- configure.ac | 14 ++++++++------ doc/emacs/android.texi | 4 ++++ java/AndroidManifest.xml.in | 7 ++++++- java/INSTALL | 10 +++++----- java/org/gnu/emacs/EmacsSdk7FontDriver.java | 2 ++ java/org/gnu/emacs/EmacsService.java | 17 ++++++++++++++++- src/android.c | 2 +- 7 files changed, 42 insertions(+), 14 deletions(-) diff --git a/configure.ac b/configure.ac index 9ae0dec3867..4456cd89b7a 100644 --- a/configure.ac +++ b/configure.ac @@ -941,7 +941,7 @@ a valid path to android.jar. See config.log for more details.]) fi AC_CACHE_CHECK([whether android.jar is new enough], - [emacs_cv_android_s_or_later], + [emacs_cv_android_u_or_later], AS_IF([rm -f conftest.class cat << EOF > conftest.java @@ -949,18 +949,18 @@ import android.os.Build; class conftest { - private static int test = Build.VERSION_CODES.TIRAMISU; + private static int test = Build.VERSION_CODES.UPSIDE_DOWN_CAKE; } EOF ("$JAVAC" -classpath "$with_android" -target 1.7 -source 1.7 conftest.java \ -d . >&AS_MESSAGE_LOG_FD 2>&1) && test -s conftest.class && rm -f conftest.class], - [emacs_cv_android_s_or_later=yes], - [emacs_cv_android_s_or_later=no])) + [emacs_cv_android_u_or_later=yes], + [emacs_cv_android_u_or_later=no])) - if test "$emacs_cv_android_s_or_later" = "no"; then + if test "$emacs_cv_android_u_or_later" = "no"; then AC_MSG_ERROR([Emacs must be built with an android.jar file produced for \ -Android 13 (Tiramisu) or later.]) +Android 14 (Upside Down Cake) or later.]) fi dnl See if the Java compiler supports the `--release' option which @@ -1152,6 +1152,8 @@ main (void) foo = "emacs_api_32"; #elif __ANDROID_API__ < 34 foo = "emacs_api_33"; +#elif __ANDROID_API__ < 35 + foo = "emacs_api_34"; #else foo = "emacs_api_future"; #endif diff --git a/doc/emacs/android.texi b/doc/emacs/android.texi index 9f3cca2b137..5e018c3e4c5 100644 --- a/doc/emacs/android.texi +++ b/doc/emacs/android.texi @@ -469,6 +469,10 @@ installation: @code{android.permission.TRANSMIT_IR} @item @code{android.permission.WAKE_LOCK} +@item +@code{android.permission.FOREGROUND_SERVICE} +@item +@code{android.permission.FOREGROUND_SERVICE_SPECIAL_USE} @end itemize Other permissions must be granted by the user through the system diff --git a/java/AndroidManifest.xml.in b/java/AndroidManifest.xml.in index 9ba9dabde81..2749f43c245 100644 --- a/java/AndroidManifest.xml.in +++ b/java/AndroidManifest.xml.in @@ -73,8 +73,12 @@ along with GNU Emacs. If not, see . --> + + + + + android:targetSdkVersion="34"/> . --> android:directBootAware="false" android:enabled="true" android:exported="false" + android:foregroundServiceType="specialUse" android:label="GNU Emacs service"/> diff --git a/java/INSTALL b/java/INSTALL index fb235af1346..b6c31483dd3 100644 --- a/java/INSTALL +++ b/java/INSTALL @@ -39,7 +39,7 @@ script like so: Replacing the paths in the command line above with: - the path to the `android.jar' headers which come with the Android - SDK. They must correspond to Android version 13 (API level 33). + SDK. They must correspond to Android version 14 (API level 34). - the path to the C compiler in the Android NDK, for the kind of CPU you are building Emacs to run on. @@ -87,13 +87,13 @@ necessary for compiling Emacs. It is imperative that Emacs is compiled using the headers for the exact API level that it is written for. This is currently API level -33, so the correct android.jar archive is located within a directory -whose name begins with `android-33'. Minor revisions to the headers +34, so the correct android.jar archive is located within a directory +whose name begins with `android-34'. Minor revisions to the headers are inconsequential towards the Emacs compilation process; if there is -a directory named `android-33-extN' (where N represents a revision to +a directory named `android-34-extN' (where N represents a revision to the Android SDK), whether you provide `configure' with that directory's android.jar or the android.jar contained within the -directory named `android-33' is of no special importance. +directory named `android-34' is of no special importance. The ndk directory contains one subdirectory for each version of the Android NDK installed. This directory in turn contains the C and C++ diff --git a/java/org/gnu/emacs/EmacsSdk7FontDriver.java b/java/org/gnu/emacs/EmacsSdk7FontDriver.java index 21ae159d5bd..33d6ee34fa4 100644 --- a/java/org/gnu/emacs/EmacsSdk7FontDriver.java +++ b/java/org/gnu/emacs/EmacsSdk7FontDriver.java @@ -99,6 +99,7 @@ public class EmacsSdk7FontDriver extends EmacsFontDriver /* The typeface. */ public Sdk7Typeface typeface; + @SuppressWarnings ("deprecation") public Sdk7FontEntity (Sdk7Typeface typeface) { @@ -120,6 +121,7 @@ public class EmacsSdk7FontDriver extends EmacsFontDriver /* The typeface. */ public Sdk7Typeface typeface; + @SuppressWarnings ("deprecation") public Sdk7FontObject (Sdk7Typeface typeface, int pixelSize) { diff --git a/java/org/gnu/emacs/EmacsService.java b/java/org/gnu/emacs/EmacsService.java index 997c6923fcc..28b725d0cd0 100644 --- a/java/org/gnu/emacs/EmacsService.java +++ b/java/org/gnu/emacs/EmacsService.java @@ -223,6 +223,21 @@ public final class EmacsService extends Service } } + /* Return the display density, adjusted in accord with the user's + text scaling preferences. */ + + @SuppressWarnings ("deprecation") + private static float + getScaledDensity (DisplayMetrics metrics) + { + /* The scaled density has been made obsolete by the introduction + of non-linear text scaling in Android 34, where there is no + longer a fixed relation between point and pixel sizes, but + remains useful, considering that Emacs does not support + non-linear text scaling. */ + return metrics.scaledDensity; + } + @Override public void onCreate () @@ -242,7 +257,7 @@ public final class EmacsService extends Service metrics = getResources ().getDisplayMetrics (); pixelDensityX = metrics.xdpi; pixelDensityY = metrics.ydpi; - tempScaledDensity = ((metrics.scaledDensity + tempScaledDensity = ((getScaledDensity (metrics) / metrics.density) * pixelDensityX); resolver = getContentResolver (); diff --git a/src/android.c b/src/android.c index 1424270e785..b9236075a1e 100644 --- a/src/android.c +++ b/src/android.c @@ -6238,7 +6238,7 @@ android_restart_emacs (void) exit (0); } -/* Return a number from 1 to 33 describing the version of Android +/* Return a number from 1 to 34 describing the version of Android Emacs is running on. This is different from __ANDROID_API__, as that describes the -- 2.39.2