/* Android IMSI-Catcher Detector | (c) AIMSICD Privacy Project * ----------------------------------------------------------- * LICENSE: http://git.io/vki47 | TERMS: http://git.io/vki4o * ----------------------------------------------------------- */ package com.secupwn.aimsicd.service; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; /** * Class to handle monitoring the Accelerometer to enable/disable GPS for battery saving */ public class AccelerometerMonitor { // How long with no movement detected, before we assume we are not moving static final long MOVEMENT_THRESHOLD_MS = 20 * 1000; static final float ACCELEROMETER_NOISE = 2.0f; // amount of sensor noise to ignore private long lastMovementTime = 0; private float mLastX, mLastY, mLastZ; private boolean mInitialized; private SensorManager mSensorManager; private Sensor mAccelerometer; private SensorEventListener mSensorListener; private Runnable onMovement; public AccelerometerMonitor(Context context, Runnable onMovement) { setupAccelerometer(context); this.onMovement = onMovement; } /** * Set up the accelerometer so that when movement is detected, the GPS is enabled. * GPS is normally disabled to save battery power. */ // TODO: // E:V:A We might need to loop this once and wait a few seconds, to prevent // GPS from starting by accidental vibrations. private void setupAccelerometer(Context context) { // set up accelerometer sensor mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensorListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; if (!mInitialized) { mInitialized = true; mLastX = x; mLastY = y; mLastZ = z; } else { float deltaX = Math.abs(mLastX - x); float deltaY = Math.abs(mLastY - y); float deltaZ = Math.abs(mLastZ - z); if (deltaX < ACCELEROMETER_NOISE) { deltaX = 0.0f; } if (deltaY < ACCELEROMETER_NOISE) { deltaY = 0.0f; } if (deltaZ < ACCELEROMETER_NOISE) { deltaZ = 0.0f; } mLastX = x; mLastY = y; mLastZ = z; if (deltaX > 0 || deltaY > 0 || deltaZ > 0) { // movement detected // disable the movement sensor to save power stop(); lastMovementTime = System.currentTimeMillis(); if (onMovement != null) { Thread runThread = new Thread(onMovement); runThread.start(); } } } } @Override public void onAccuracyChanged(Sensor sensor, int i) { } }; start(); } public void start() { mSensorManager.registerListener(mSensorListener, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } public void stop() { mSensorManager.unregisterListener(mSensorListener); } public boolean notMovedInAWhile() { return System.currentTimeMillis() - lastMovementTime >= MOVEMENT_THRESHOLD_MS; } }