1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  | 
package com.olio.wakedetector;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.hardware.TriggerEvent;
import android.hardware.TriggerEventListener;
import android.os.PowerManager;
import android.os.Vibrator;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import com.olio.util.ALog;
public class MainActivity extends ActionBarActivity {
    private SensorManager mSensorManager = null;
    private Sensor mSigMotionSensor = null;
    private TriggerEventListener mTriggerEventListener = null;
    private PowerManager mPowerManager = null;
    private PowerManager.WakeLock mWakeLock = null;
    private Vibrator mVibrator;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);
        mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
        for(Sensor sensor : mSensorManager.getSensorList(Sensor.TYPE_ALL)) {
            String sensorType;
            switch(sensor.getType()) {
                case Sensor.TYPE_ACCELEROMETER:
                    sensorType = Sensor.STRING_TYPE_ACCELEROMETER;
                    break;
                case Sensor.TYPE_GYROSCOPE:
                    sensorType = Sensor.STRING_TYPE_GYROSCOPE;
                    break;
                case Sensor.TYPE_GYROSCOPE_UNCALIBRATED:
                    sensorType = Sensor.STRING_TYPE_GYROSCOPE_UNCALIBRATED;
                    break;
                case Sensor.TYPE_ROTATION_VECTOR:
                    sensorType = Sensor.STRING_TYPE_ROTATION_VECTOR;
                    break;
                case Sensor.TYPE_GRAVITY:
                    sensorType = Sensor.STRING_TYPE_GRAVITY;
                    break;
                case Sensor.TYPE_SIGNIFICANT_MOTION:
                    sensorType = Sensor.STRING_TYPE_SIGNIFICANT_MOTION;
                    break;
                case Sensor.TYPE_STEP_COUNTER:
                    sensorType = Sensor.STRING_TYPE_STEP_COUNTER;
                    break;
                case Sensor.TYPE_STEP_DETECTOR:
                    sensorType = Sensor.STRING_TYPE_STEP_DETECTOR;
                    break;
                default:
                    sensorType = ""+sensor.getType();
            }
            ALog.d("Found sensor: %s, Type: %s", sensor.getName(), sensorType);
            if(sensor.getType() == Sensor.TYPE_SIGNIFICANT_MOTION) {
                ALog.d("Got significant motion sensor.");
                mSigMotionSensor = sensor;
                if(mTriggerEventListener != null) {
                    ALog.d("Sig motion sensor already registered.");
                    return;
                }
                mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "com.olio.wakedetector");
                mTriggerEventListener = new SigMotionTriggerListener();
                mSensorManager.requestTriggerSensor(mTriggerEventListener, mSigMotionSensor);
            }
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mTriggerEventListener != null && mSensorManager != null) {
            mSensorManager.cancelTriggerSensor(mTriggerEventListener, mSigMotionSensor);
            mTriggerEventListener = null;
        }
    }
    public void onVibrateClick(View v) {
        ALog.d("Vibrating.");
        mVibrator.vibrate(new long[]{250, 500, 100, 500}, -1);
    }
    private class SigMotionTriggerListener extends TriggerEventListener {
        @Override
        public void onTrigger(TriggerEvent event) {
            ALog.d("Got significant motion trigger. Re-registering.");
            mWakeLock.acquire(5000);
            mSensorManager.requestTriggerSensor(mTriggerEventListener, mSigMotionSensor);
        }
    };
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
  |