From 12121d2d48b22dbc0cce8694c22001b7bd5e50a5 Mon Sep 17 00:00:00 2001 From: Mis012 Date: Wed, 26 Mar 2025 21:25:39 +0100 Subject: [PATCH] LocationManager: expose more information from the backend to the apps note: GnssStatus was accidentally bundled into ab5b600bf151fa9320052a6fa8cbdf9c238353ca --- .../android_location_LocationManager.c | 7 ++- .../android/hardware/SensorManager.java | 2 +- src/api-impl/android/location/Location.java | 56 ++++++++++++++++++- .../android/location/LocationManager.java | 30 +++++++++- src/api-impl/meson.build | 1 + 5 files changed, 87 insertions(+), 9 deletions(-) diff --git a/src/api-impl-jni/location/android_location_LocationManager.c b/src/api-impl-jni/location/android_location_LocationManager.c index 27e2f18b..f19e38fa 100644 --- a/src/api-impl-jni/location/android_location_LocationManager.c +++ b/src/api-impl-jni/location/android_location_LocationManager.c @@ -14,12 +14,13 @@ static void location_updated ( gchar* description, gint64 timestamp_s, gint64 timestamp_ms, - JavaVM *jvm -) { + JavaVM *jvm) +{ JNIEnv *env; (*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6); jclass class = (*env)->FindClass(env, "android/location/LocationManager"); - (*env)->CallStaticVoidMethod(env, class, _STATIC_METHOD(class, "locationUpdated", "(DDD)V"), latitude, longitude, heading); + jlong timestamp = timestamp_s * 1000 + timestamp_ms; + (*env)->CallStaticVoidMethod(env, class, _STATIC_METHOD(class, "locationUpdated", "(DDDDDDJ)V"), latitude, longitude, altitude, accuracy, speed, heading, timestamp); } JNIEXPORT void JNICALL Java_android_location_LocationManager_nativeGetLocation(JNIEnv *env, jobject) { diff --git a/src/api-impl/android/hardware/SensorManager.java b/src/api-impl/android/hardware/SensorManager.java index 0bcbce04..2971a633 100644 --- a/src/api-impl/android/hardware/SensorManager.java +++ b/src/api-impl/android/hardware/SensorManager.java @@ -23,7 +23,7 @@ public class SensorManager { new LocationManager().requestLocationUpdates(null, 0, 0, new LocationListener() { @Override public void onLocationChanged(Location location) { - listener.onSensorChanged(new SensorEvent(new float[]{(float)location.getBearing()}, sensor)); + listener.onSensorChanged(new SensorEvent(new float[]{location.getBearing()}, sensor)); } }); return true; diff --git a/src/api-impl/android/location/Location.java b/src/api-impl/android/location/Location.java index 3cba5cbf..92623332 100644 --- a/src/api-impl/android/location/Location.java +++ b/src/api-impl/android/location/Location.java @@ -4,12 +4,27 @@ public class Location { private double latitude; private double longitude; + private double altitude; + private double accuracy; + private double speed; private double bearing; + private long timestamp; - public Location (double latitude, double longitude, double bearing) { + /* for internal use */ + public Location (double latitude, + double longitude, + double altitude, + double accuracy, + double speed, + double bearing, + long timestamp) { this.latitude = latitude; this.longitude = longitude; + this.altitude = altitude; + this.accuracy = accuracy; + this.speed = speed; this.bearing = bearing; + this.timestamp = timestamp; } public double getLatitude() { @@ -20,8 +35,43 @@ public class Location { return longitude; } - public double getBearing() { - return bearing; + public boolean hasAltitude() { + return altitude != -Double.MAX_VALUE; } + public double getAltitude() { + return altitude; + } + + public boolean hasAccuracy() { + return true; + } + + public float getAccuracy() { + return (float)accuracy; + } + + public boolean hasSpeed() { + return speed != -1; + } + + public float getSpeed() { + return (float)speed; + } + + public boolean hasBearing() { + return bearing != -1; + } + + public float getBearing() { + return (float)bearing; + } + + public long getTime() { + return timestamp; + } + + public String getProvider() { + return "fused"; + } } diff --git a/src/api-impl/android/location/LocationManager.java b/src/api-impl/android/location/LocationManager.java index b0999138..052f5f3e 100644 --- a/src/api-impl/android/location/LocationManager.java +++ b/src/api-impl/android/location/LocationManager.java @@ -1,7 +1,10 @@ package android.location; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import java.lang.Runnable; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -26,9 +29,15 @@ public class LocationManager { private native void nativeGetLocation(); - private static void locationUpdated(double latitude, double longitude, double heading) { + private static void locationUpdated(double latitude, + double longitude, + double altitude, + double accuracy, + double speed, + double bearing, + long timestamp) { for (LocationListener locationListener : listeners) { - locationListener.onLocationChanged(new Location(latitude, longitude, heading)); + locationListener.onLocationChanged(new Location(latitude, longitude, altitude, accuracy, speed, bearing, timestamp)); } } @@ -42,4 +51,21 @@ public class LocationManager { public List getAllProviders() { return Collections.emptyList(); } + + public List getProviders(boolean enabledOnly) { + return Collections.emptyList(); + } + + public boolean registerGnssStatusCallback(GnssStatus.Callback callback, Handler handler) { + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + callback.onSatelliteStatusChanged(new GnssStatus()); + } + }); + return true; + } + + public void unregisterGnssStatusCallback(GnssStatus.Callback callback) { + } } diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index 53f36183..eff124b9 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -259,6 +259,7 @@ srcs = [ 'android/hardware/input/InputManager.java', 'android/hardware/usb/UsbManager.java', 'android/location/Criteria.java', + 'android/location/GnssStatus.java', 'android/location/Location.java', 'android/location/LocationListener.java', 'android/location/LocationManager.java',