diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e7718ee64..db9f030fc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,6 +39,7 @@ android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/app_name" + android:name=".TermuxAPI" android:supportsRtl="true" android:theme="@android:style/Theme.Material.Light" > diff --git a/app/src/main/java/com/termux/api/SensorAPI.java b/app/src/main/java/com/termux/api/SensorAPI.java new file mode 100644 index 000000000..a2ba1abf4 --- /dev/null +++ b/app/src/main/java/com/termux/api/SensorAPI.java @@ -0,0 +1,79 @@ +package com.termux.api; + +import android.content.Context; +import android.content.Intent; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.util.JsonWriter; +import android.util.SparseArray; +import com.termux.api.util.ResultReturner; + +public class SensorAPI implements SensorEventListener{ + private static SensorManager mSensorManager; + + private static SparseArray mSensorValues = new SparseArray<>(); + + SensorAPI(Context context){ + mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); + + tryRegisterSensor(mSensorManager, Sensor.TYPE_ACCELEROMETER); + tryRegisterSensor(mSensorManager, Sensor.TYPE_AMBIENT_TEMPERATURE); + tryRegisterSensor(mSensorManager, Sensor.TYPE_LIGHT); + tryRegisterSensor(mSensorManager, Sensor.TYPE_RELATIVE_HUMIDITY); + tryRegisterSensor(mSensorManager, Sensor.TYPE_PRESSURE); + tryRegisterSensor(mSensorManager, Sensor.TYPE_PROXIMITY); + } + + private void tryRegisterSensor(SensorManager manager, int type){ + Sensor sensor = manager.getDefaultSensor(type); + if (sensor != null){ + manager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); + } + } + + public static void onReceive(TermuxApiReceiver apiReceiver, Intent intent, final int type) { + ResultReturner.returnData(apiReceiver, intent, new ResultReturner.ResultJsonWriter() { + @Override + public void writeJson(JsonWriter out) throws Exception { + Sensor sensor; + if ((sensor = mSensorManager.getDefaultSensor(type)) != null) { + out.beginObject(); + out.name("info").value(sensor.toString()); + float[] data; + if ((data = mSensorValues.get(type)) != null) { + switch (type) { + case Sensor.TYPE_ACCELEROMETER: + out.name("data").beginObject(); + out.name("x").value(data[0]); + out.name("y").value(data[1]); + out.name("z").value(data[2]); + out.endObject(); + default: + out.name("data").value(data[0]); + } + } else { + out.name("data").value(""); + } + out.endObject(); + } else { + out.beginObject(); + out.name("info").value(""); + out.name("data").value(""); + out.endObject(); + } + } + }); + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + + } + + @Override + public void onSensorChanged(SensorEvent event) { + mSensorValues.put(event.sensor.getType(), event.values); + } +} diff --git a/app/src/main/java/com/termux/api/TermuxAPI.java b/app/src/main/java/com/termux/api/TermuxAPI.java new file mode 100644 index 000000000..2add28dcb --- /dev/null +++ b/app/src/main/java/com/termux/api/TermuxAPI.java @@ -0,0 +1,21 @@ +package com.termux.api; + +import android.app.Application; +import android.hardware.SensorManager; + +public class TermuxAPI extends Application { + private SensorAPI sensorAPI; + + @Override + public void onCreate() { + super.onCreate(); + sensorAPI = new SensorAPI(this); + } + + @Override + public void onTerminate() { + ((SensorManager) getSystemService(SENSOR_SERVICE)).unregisterListener(sensorAPI); + + super.onTerminate(); + } +} diff --git a/app/src/main/java/com/termux/api/TermuxApiReceiver.java b/app/src/main/java/com/termux/api/TermuxApiReceiver.java index c415f6c4e..d29dbb729 100644 --- a/app/src/main/java/com/termux/api/TermuxApiReceiver.java +++ b/app/src/main/java/com/termux/api/TermuxApiReceiver.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; +import android.hardware.Sensor; import com.termux.api.util.TermuxApiLogger; import com.termux.api.util.TermuxApiPermissionActivity; @@ -68,6 +69,24 @@ public void onReceive(Context context, Intent intent) { case "Share": ShareAPI.onReceive(this, context, intent); break; + case "SensorAccelerometer": + SensorAPI.onReceive(this, intent, Sensor.TYPE_ACCELEROMETER); + break; + case "SensorProximity": + SensorAPI.onReceive(this, intent, Sensor.TYPE_PROXIMITY); + break; + case "SensorTemp": + SensorAPI.onReceive(this, intent, Sensor.TYPE_AMBIENT_TEMPERATURE); + break; + case "SensorLight": + SensorAPI.onReceive(this, intent, Sensor.TYPE_LIGHT); + break; + case "SensorPressure": + SensorAPI.onReceive(this, intent, Sensor.TYPE_PRESSURE); + break; + case "SensorHumidity": + SensorAPI.onReceive(this, intent, Sensor.TYPE_RELATIVE_HUMIDITY); + break; case "SmsInbox": if (TermuxApiPermissionActivity.checkAndRequestPermissions(context, intent, Manifest.permission.READ_SMS, Manifest.permission.READ_CONTACTS)) { SmsInboxAPI.onReceive(this, context, intent);