]> git.eshelyaron.com Git - emacs.git/commitdiff
Port Android battery status to Android 4.4 and earlier
authorPo Lu <luangruo@yahoo.com>
Fri, 10 Mar 2023 01:40:41 +0000 (09:40 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 10 Mar 2023 01:40:41 +0000 (09:40 +0800)
* java/org/gnu/emacs/EmacsService.java (EmacsService)
(queryBattery19): New function.
(queryBattery): Call it on old systems.  Also, return AC line
status and temperature.
* lisp/battery.el (battery-android): Implement more format
directives.
* src/android.c (android_query_battery): Handle new status
fields.
* src/android.h (struct android_battery_state): Add `plugged'
and `temperature'.
* src/androidfns.c (Fandroid_query_battery): Return new fields.

java/org/gnu/emacs/EmacsService.java
lisp/battery.el
src/android.c
src/android.h
src/androidfns.c

index 848ad4de789e37db0106c86f0995261032454739..9c48c56ca26a129118f454c2e52a23d7011dcc0e 100644 (file)
@@ -40,6 +40,7 @@ import android.content.ClipboardManager;
 import android.content.Context;
 import android.content.ContentResolver;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager.ApplicationInfoFlags;
 import android.content.pm.PackageManager;
@@ -738,6 +739,36 @@ public final class EmacsService extends Service
       }
   }
 
+  private long[]
+  queryBattery19 ()
+  {
+    IntentFilter filter;
+    Intent battery;
+    long capacity, chargeCounter, currentAvg, currentNow;
+    long status, remaining, plugged, temp;
+
+    filter = new IntentFilter (Intent.ACTION_BATTERY_CHANGED);
+    battery = registerReceiver (null, filter);
+
+    if (battery == null)
+      return null;
+
+    capacity = battery.getIntExtra (BatteryManager.EXTRA_LEVEL, 0);
+    chargeCounter
+      = (battery.getIntExtra (BatteryManager.EXTRA_SCALE, 0)
+        / battery.getIntExtra (BatteryManager.EXTRA_LEVEL, 100) * 100);
+    currentAvg = 0;
+    currentNow = 0;
+    status = battery.getIntExtra (BatteryManager.EXTRA_STATUS, 0);
+    remaining = -1;
+    plugged = battery.getIntExtra (BatteryManager.EXTRA_PLUGGED, 0);
+    temp = battery.getIntExtra (BatteryManager.EXTRA_TEMPERATURE, 0);
+
+    return new long[] { capacity, chargeCounter, currentAvg,
+                       currentNow, remaining, status, plugged,
+                       temp, };
+  }
+
   /* Return the status of the battery.  See struct
      android_battery_status for the order of the elements
      returned.
@@ -750,14 +781,16 @@ public final class EmacsService extends Service
     Object tem;
     BatteryManager manager;
     long capacity, chargeCounter, currentAvg, currentNow;
-    long status, remaining;
+    long status, remaining, plugged, temp;
     int prop;
+    IntentFilter filter;
+    Intent battery;
 
-    /* Android 4.4 or earlier require applications to listen to
-       changes to the battery instead of querying for its status.  */
+    /* Android 4.4 or earlier require applications to use a different
+       API to query the battery status.  */
 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
-      return null;
+      return queryBattery19 ();
 
     tem = getSystemService (Context.BATTERY_SERVICE);
     manager = (BatteryManager) tem;
@@ -776,7 +809,8 @@ public final class EmacsService extends Service
        only return ``charging'' or ``discharging''.  */
 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
-      status = manager.getIntProperty (BatteryManager.BATTERY_PROPERTY_STATUS);
+      status
+       = manager.getIntProperty (BatteryManager.BATTERY_PROPERTY_STATUS);
     else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
       status = (manager.isCharging ()
                ? BatteryManager.BATTERY_STATUS_CHARGING
@@ -789,8 +823,27 @@ public final class EmacsService extends Service
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
       remaining = manager.computeChargeTimeRemaining ();
 
+    plugged = -1;
+    temp = -1;
+
+    /* Now obtain additional information from the battery manager.  */
+
+    filter = new IntentFilter (Intent.ACTION_BATTERY_CHANGED);
+    battery = registerReceiver (null, filter);
+
+    if (battery != null)
+      {
+       plugged = battery.getIntExtra (BatteryManager.EXTRA_PLUGGED, 0);
+       temp = battery.getIntExtra (BatteryManager.EXTRA_TEMPERATURE, 0);
+
+       /* Make status more reliable.  */
+       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
+         status = battery.getIntExtra (BatteryManager.EXTRA_STATUS, 0);
+      }
+
     return new long[] { capacity, chargeCounter, currentAvg,
-                       currentNow, remaining, status, };
+                       currentNow, remaining, status, plugged,
+                       temp, };
   }
 
   /* Display the specified STRING in a small dialog box on the main
index a2bbd463c12b1dd3daae5b5ae1299b21db679ec5..a51bc5267b3de690a7a55da46631e880743344b7 100644 (file)
@@ -1089,9 +1089,11 @@ The following %-sequences are provided:
 The following %-sequences are provided:
 %c Current capacity (mAh)
 %r Current rate of charge or discharge (mA)
+%L AC line status (verbose).
 %B Battery status (verbose)
 %b Battery status, empty means high, `-' means low,
   `+' means charging and `?' means unknown.
+%d Temperature (in degrees Celsius)
 %p Battery load percentage.
 %m Remaining time (to charge) in minutes.
 %h Remaining time (to charge) in hours.
@@ -1139,7 +1141,14 @@ The following %-sequences are provided:
             (cons ?m (or minutes "N/A"))
             (cons ?h (or hours "N/A"))
             (cons ?t (or remaining "N/A"))
-            (cons ?L "N/A")))))
+            (cons ?L (cl-case (nth 6 status)
+                       (0 "off-line")
+                       (1 "on-line")
+                       (2 "on-line (dock)")
+                       (3 "on-line (USB)")
+                       (4 "on-line (wireless)")
+                       (t "unknown")))
+            (cons ?t (/ (or (nth 7 status) 0) 10.0))))))
 
 \f
 ;;; Private functions.
index 69c87e731bd7304b2553f851d72df65e01400f26..763e17e9430b01be4f36d43278c1ca8fa390b7b7 100644 (file)
@@ -5754,7 +5754,7 @@ android_get_current_api_level (void)
 }
 
 /* Query the status of the battery, and place it in *STATUS.
-   Value is 1 if the system is too old, else 0.  */
+   Value is 1 upon failure, else 0.  */
 
 int
 android_query_battery (struct android_battery_state *status)
@@ -5783,6 +5783,8 @@ android_query_battery (struct android_battery_state *status)
   status->current_now = longs[3];
   status->remaining = longs[4];
   status->status = longs[5];
+  status->plugged = longs[6];
+  status->temperature = longs[7];
 
   (*android_java_env)->ReleaseLongArrayElements (android_java_env,
                                                 array, longs,
index ed0089ad94e500e3ed52774127bae479d231e3f7..450f3859df961a18859a50c2f0a6df18be1b9315 100644 (file)
@@ -160,6 +160,18 @@ struct android_battery_state
           but is not charging either.
        1, if the battery state is unknown.  */
   int status;
+
+  /* The power source of the battery.  Value is:
+
+       0, if on battery power.
+       1, for line power.
+       8, for dock power.
+       2, for USB power.
+       4, for wireless power.  */
+  int plugged;
+
+  /* The temperature of the battery in 10 * degrees centigrade.  */
+  int temperature;
 };
 
 extern Lisp_Object android_browse_url (Lisp_Object);
index 5a23e8bd196393cb1ba747f4e53ad94ed49706ca..2724b9595c144874effa4bc35ef2d5c92f007848 100644 (file)
@@ -2797,11 +2797,13 @@ frame_parm_handler android_frame_parm_handlers[] =
 DEFUN ("android-query-battery", Fandroid_query_battery,
        Sandroid_query_battery, 0, 0, 0,
        doc: /* Perform a query for battery information.
-This function will not work before Android 5.0.
 Value is nil upon failure, or a list of the form:
 
   (CAPACITY CHARGE-COUNTER CURRENT-AVERAGE CURRENT-NOW STATUS
-   REMAINING)
+   REMAINING PLUGGED TEMP)
+
+where REMAINING, CURRENT-AVERAGE, and CURRENT-NOW are undefined prior
+to Android 5.0.
 
 See the documentation at
 
@@ -2822,12 +2824,14 @@ for more details about these values.  */)
   if (android_query_battery (&state))
     return Qnil;
 
-  return listn (6, make_int (state.capacity),
-               make_int (state.charge_counter),
+  return listn (8, make_int (state.capacity),
+               make_fixnum (state.charge_counter),
                make_int (state.current_average),
                make_int (state.current_now),
-               make_int (state.status),
-               make_int (state.remaining));
+               make_fixnum (state.status),
+               make_int (state.remaining),
+               make_fixnum (state.plugged),
+               make_fixnum (state.temperature));
 }
 
 #endif