package com.example.stimulusStrategy; import android.app.AlarmManager; import android.app.Notification; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.hardware.TriggerEvent; import android.hardware.TriggerEventListener; import android.os.IBinder; import android.os.SystemClock; import android.support.annotation.Nullable; import android.util.Log; import android.widget.Toast; import com.example.pharmacy.frontEnd.R; import com.example.stimulus.SedentaryStimulus; import java.util.Calendar; /** * Created by pharmacy on 09/01/2018. */ public class Accelerometer extends Service implements StimulusStrategy, SensorEventListener { private SensorManager mSensorManager; private AlarmManager am; //private Context context; private int startId; @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("ACCEL", "CREATED ACCEL"); this.startId = startId; mSensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE); mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 60000000); //Sampling period is still far too often here. //Parameters to be set here such as delay etc. //Slightly better when app is not in foreground am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); setUpClock(); return START_STICKY; } private void setUpClock() { SharedPreferences shared = this.getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE); Intent i = new Intent(getBaseContext(), com.example.stimulus.SedentaryStimulus.class); i.putExtras(new Intent(this, this.getClass())); // i.putExtra(getString(R.string.serviceID), startId); PendingIntent pi = PendingIntent.getBroadcast(getBaseContext(), R.integer.alarm_rc, i, PendingIntent.FLAG_UPDATE_CURRENT); //test am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+3000, pi); // int interval = shared.getInt(getString(R.string.notify_me), R.integer.notify_period_minutes); //am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+(1000*60*interval), pi); Log.d("myTag", "ALARM SET" + am.toString()); } public void monitor() { Log.d("ACCEL", "MONITORING"); Toast saved = Toast.makeText(this, R.string.motion,Toast.LENGTH_LONG); saved.show(); Intent i = new Intent(getBaseContext(), com.example.stimulus.SedentaryStimulus.class); PendingIntent pi = PendingIntent.getBroadcast(getBaseContext(), R.integer.alarm_rc, i, PendingIntent.FLAG_UPDATE_CURRENT); am.cancel(pi); stepCounter(); setUpClock(); } private void stepCounter(){ Intent intent = new Intent(this, StepCounter.class); startService(intent); } @Override public void onSensorChanged(SensorEvent event) { //Needs major tuning currently vibration triggers motion //Need to work out the maths on this //Google API Activity Detection client?? //Maybe work maths out and use this as 3rd option //2 Manual options and an existing option float[] gravity = new float[3]; float[] linearAcc = new float[3]; int moved = 0; final float alpha = (float) 0.8; gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; linearAcc[0] = event.values[0] - gravity[0]; linearAcc[1] = event.values[1] - gravity[1]; linearAcc[2] = event.values[2] - gravity[2]; Log.d("ACCEL", "SENSOR EVENT"); for(int i = 0; i < 3; i++){ if(linearAcc[i] > 5){ moved++; } } if(moved >= 2) { monitor(); } } @Override public void onAccuracyChanged(Sensor sensor, int i) { } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }