You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CustoMIUIzer/app/src/main/java/name/mikanoshi/customiuizer/utils/GravitySensor.java

105 lines
3.2 KiB
Java

package name.mikanoshi.customiuizer.utils;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.view.Surface;
import com.github.matteobattilana.weather.WeatherView;
public final class GravitySensor implements SensorEventListener {
private final SensorManager sensorManager;
private float[] magneticValues;
private float[] accelerometerValues;
private int orientation;
private int speed;
private boolean started;
private final Context context;
private final WeatherView weatherView;
public GravitySensor(Context context, WeatherView weatherView) {
super();
this.context = context;
this.weatherView = weatherView;
this.sensorManager = (SensorManager)this.context.getSystemService(Context.SENSOR_SERVICE);
}
public final boolean getStarted() {
return this.started;
}
public void setOrientation(int orient) {
this.orientation = orient;
}
public void setSpeed(int spd) {
this.speed = spd;
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
public void onSensorChanged(SensorEvent event) {
if (event == null || event.sensor == null) return;
switch (event.sensor.getType()) {
case 1: this.accelerometerValues = event.values; break;
case 2: this.magneticValues = event.values; break;
}
if (this.magneticValues == null || this.accelerometerValues == null) return;
float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrix(rotationMatrix, null, this.accelerometerValues, this.magneticValues);
float[] remappedRotationMatrix = new float[9];
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remappedRotationMatrix);
float[] orientationAngles = new float[3];
SensorManager.getOrientation(remappedRotationMatrix, orientationAngles);
//double pitch = Math.toDegrees((double)orientationAngles[1]);
double roll = Math.toDegrees(orientationAngles[2]) + Math.random() * 20 - 10;
if (this.orientation == Surface.ROTATION_90) roll += 90;
else if (this.orientation == Surface.ROTATION_270) roll -= 90;
else if (this.orientation == Surface.ROTATION_180) roll += roll > 0 ? 180 : -180;
if (roll > 90) roll -= 180; else if (roll < -90) roll += 180;
this.weatherView.setAngle((int)roll);
this.weatherView.setSpeed(this.speed + (int)Math.round(Math.random() * 20 - 10));
}
private void registerListener() {
this.sensorManager.registerListener(this, this.sensorManager.getDefaultSensor(1), 2);
this.sensorManager.registerListener(this, this.sensorManager.getDefaultSensor(2), 2);
}
private void unregisterListener() {
this.sensorManager.unregisterListener(this);
}
public final void start() {
this.started = true;
this.registerListener();
}
public final void stop() {
this.started = false;
this.unregisterListener();
}
public final void onResume() {
if (this.started) {
this.registerListener();
}
}
public final void onPause() {
this.unregisterListener();
}
public final Context getContext() {
return this.context;
}
public final WeatherView getWeatherView() {
return this.weatherView;
}
}