api-impl: implement accelerometer support, no backend yet

currently x,y,z values are hardcoded and can only be changed with gdb
This commit is contained in:
Mis012 2024-03-16 15:04:02 +01:00
parent 6443e3977c
commit 20b179387b
7 changed files with 80 additions and 4 deletions

View file

@ -102,6 +102,7 @@ libtranslationlayer_so = shared_library('translation_layer_main', [
'src/api-impl-jni/graphics/android_graphics_drawable_DrawableContainer.c',
'src/api-impl-jni/location/android_location_LocationManager.c',
'src/api-impl-jni/media/android_media_MediaCodec.c',
'src/api-impl-jni/sensors/android_hardware_SensorManager.c',
'src/api-impl-jni/util.c',
'src/api-impl-jni/views/AndroidLayout.c',
'src/api-impl-jni/views/android_view_View.c',

View file

@ -0,0 +1,21 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class android_hardware_SensorManager */
#ifndef _Included_android_hardware_SensorManager
#define _Included_android_hardware_SensorManager
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: android_hardware_SensorManager
* Method: register_accelerometer_listener_native
* Signature: (Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;)V
*/
JNIEXPORT void JNICALL Java_android_hardware_SensorManager_register_1accelerometer_1listener_1native
(JNIEnv *, jobject, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -0,0 +1,40 @@
#include <libportal/portal.h>
#include "../defines.h"
#include "../util.h"
#include "../generated_headers/android_hardware_SensorManager.h"
/* FIXME */
float x = 0;
float y = 2;
float z = 0;
struct accel_callback_data { JavaVM *jvm; jobject listener; jclass listener_class; jobject sensor; };
gboolean on_accel_data(struct accel_callback_data *d)
{
JNIEnv *env;
(*d->jvm)->GetEnv(d->jvm, (void**)&env, JNI_VERSION_1_6);
jfloatArray values = (*env)->NewFloatArray(env, 3);
(*env)->SetFloatArrayRegion(env, values, 0, 3, (jfloat[]){x, y, z});
jobject sensor_event = (*env)->NewObject(env, handle_cache.sensor_event.class, handle_cache.sensor_event.constructor, values, d->sensor);
(*env)->CallVoidMethod(env, d->listener, _METHOD(d->listener_class, "onSensorChanged", "(Landroid/hardware/SensorEvent;)V"), sensor_event);
return G_SOURCE_CONTINUE;
}
JNIEXPORT void JNICALL Java_android_hardware_SensorManager_register_1accelerometer_1listener_1native(JNIEnv *env , jobject this, jobject listener, jobject sensor)
{
JavaVM *jvm;
(*env)->GetJavaVM(env, &jvm);
struct accel_callback_data *callback_data = malloc(sizeof(struct accel_callback_data));
callback_data->jvm = jvm;
callback_data->listener = _REF(listener);
callback_data->listener_class = _REF(_CLASS(callback_data->listener));
callback_data->sensor = _REF(sensor);
g_timeout_add(10, G_SOURCE_FUNC(on_accel_data), callback_data);
}

View file

@ -85,6 +85,9 @@ void set_up_handle_cache(JNIEnv *env)
handle_cache.motion_event.class = _REF((*env)->FindClass(env, "android/view/MotionEvent"));
handle_cache.motion_event.constructor = _METHOD(handle_cache.motion_event.class, "<init>", "(IIFFJFF)V");
handle_cache.sensor_event.class = _REF((*env)->FindClass(env, "android/hardware/SensorEvent"));
handle_cache.sensor_event.constructor = _METHOD(handle_cache.sensor_event.class, "<init>", "([FLandroid/hardware/Sensor;)V");
handle_cache.canvas.class = _REF((*env)->FindClass(env, "android/graphics/Canvas"));
handle_cache.canvas.constructor = _METHOD(handle_cache.canvas.class, "<init>", "(JJ)V");

View file

@ -37,6 +37,10 @@ struct handle_cache {
jclass class;
jmethodID constructor;
} motion_event;
struct {
jclass class;
jmethodID constructor;
} sensor_event;
struct {
jclass class;
jmethodID constructor;

View file

@ -4,8 +4,10 @@ public class SensorEvent {
public final float[] values;
public SensorEvent(float[] values) {
public Sensor sensor;
public SensorEvent(float[] values, Sensor sensor) {
this.values = values;
this.sensor = sensor;
}
}

View file

@ -17,16 +17,19 @@ public class SensorManager {
return true; // we could try saying that the sensor doesn't exist and hope the app just doesn't use it then, but as long as we never call the handler the app should leave this alone
}
public boolean registerListener(final SensorEventListener listener, Sensor sensor, int samplingPeriodUs) {
public boolean registerListener(final SensorEventListener listener, final Sensor sensor, int samplingPeriodUs) {
switch(sensor.getType()) {
case Sensor.TYPE_ORIENTATION:
new LocationManager().requestLocationUpdates(null, 0, 0, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
listener.onSensorChanged(new SensorEvent(new float[]{(float)location.getBearing()}));
listener.onSensorChanged(new SensorEvent(new float[]{(float)location.getBearing()}, sensor));
}
});
return true;
case Sensor.TYPE_ACCELEROMETER:
register_accelerometer_listener_native(listener, sensor);
return true;
default:
return false;
}
@ -35,4 +38,6 @@ public class SensorManager {
public void unregisterListener(final SensorEventListener listener, Sensor sensor) {
System.out.println("STUB: andoroid.hw.SensorManager.unregisterListener");
}
native void register_accelerometer_listener_native(SensorEventListener listener, Sensor sensor);
}