]> git.eshelyaron.com Git - emacs.git/commitdiff
Port Emacs to Android 34
authorPo Lu <luangruo@yahoo.com>
Thu, 5 Oct 2023 03:57:26 +0000 (11:57 +0800)
committerPo Lu <luangruo@yahoo.com>
Thu, 5 Oct 2023 03:57:26 +0000 (11:57 +0800)
* 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
doc/emacs/android.texi
java/AndroidManifest.xml.in
java/INSTALL
java/org/gnu/emacs/EmacsSdk7FontDriver.java
java/org/gnu/emacs/EmacsService.java
src/android.c

index 9ae0dec38676d401c6b4fc47b7ec1026d6f96f27..4456cd89b7a7d9cdbc4ffe92c20672c19e32cf1f 100644 (file)
@@ -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
index 9f3cca2b137d04784cafc1c9fd94f6646607d1ea..5e018c3e4c58ad5b155447b83ea0cdc571e28ec8 100644 (file)
@@ -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
index 9ba9dabde81bfe5b096b8ebeed43f2014d7495c2..2749f43c245ed0a738db60bdbb57795c1be4aa3f 100644 (file)
@@ -73,8 +73,12 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>. -->
 
   <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
 
+  <!-- Under Android 14 or later to run within the background.  -->
+
+  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"/>
+
   <uses-sdk android:minSdkVersion="@ANDROID_MIN_SDK@"
-           android:targetSdkVersion="33"/>
+           android:targetSdkVersion="34"/>
 
   <application android:name="org.gnu.emacs.EmacsApplication"
               android:label="Emacs"
@@ -190,6 +194,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>. -->
             android:directBootAware="false"
             android:enabled="true"
             android:exported="false"
+            android:foregroundServiceType="specialUse"
             android:label="GNU Emacs service"/>
   </application>
 </manifest>
index fb235af13462c7b966d5aeecd71875b760060cf1..b6c31483dd312140d646aac6ffa6e9b7ca5d491c 100644 (file)
@@ -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++
index 21ae159d5bd561b722bb1da0911b20da2f697172..33d6ee34fa4e40e2adc1c56d683b6a8245b7844e 100644 (file)
@@ -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)
     {
index 997c6923fcc54868a2db70a8314809f12ee737cd..28b725d0cd06360fe4a3b110c9fe25d318800ec1 100644 (file)
@@ -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 ();
index 1424270e785846acee41824ec18158fed7543a06..b9236075a1e0d272543c64601bd68b4db574f601 100644 (file)
@@ -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