1a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown/*
2a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown * Copyright (C) 2014 The Android Open Source Project
3a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown *
4a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown * you may not use this file except in compliance with the License.
6a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown * You may obtain a copy of the License at
7a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown *
8a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown *
10a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown * Unless required by applicable law or agreed to in writing, software
11a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown * See the License for the specific language governing permissions and
14a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown * limitations under the License.
15a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown */
16a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
17a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brownpackage com.android.internal.policy.impl;
18a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
19a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brownimport android.os.Handler;
20a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brownimport android.content.Context;
21a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brownimport android.hardware.Sensor;
22a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brownimport android.hardware.SensorManager;
23a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brownimport android.hardware.TriggerEvent;
24a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brownimport android.hardware.TriggerEventListener;
25a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
26a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brownimport java.io.PrintWriter;
27a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
28a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown/**
29a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown * Watches for wake gesture sensor events then invokes the listener.
30a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown */
31a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brownpublic abstract class WakeGestureListener {
32a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    private static final String TAG = "WakeGestureListener";
33a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
34a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    private final SensorManager mSensorManager;
35a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    private final Handler mHandler;
36a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
37a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    private final Object mLock = new Object();
38a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
39a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    private boolean mTriggerRequested;
40a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    private Sensor mSensor;
41a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
42a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    public WakeGestureListener(Context context, Handler handler) {
43a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
44a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        mHandler = handler;
45a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
46a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_WAKE_GESTURE);
47a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    }
48a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
49a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    public abstract void onWakeUp();
50a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
51a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    public boolean isSupported() {
52a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        synchronized (mLock) {
53a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            return mSensor != null;
54a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        }
55a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    }
56a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
57a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    public void requestWakeUpTrigger() {
58a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        synchronized (mLock) {
59a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            if (mSensor != null && !mTriggerRequested) {
60a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown                mTriggerRequested = true;
61a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown                mSensorManager.requestTriggerSensor(mListener, mSensor);
62a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            }
63a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        }
64a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    }
65a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
66a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    public void cancelWakeUpTrigger() {
67a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        synchronized (mLock) {
68a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            if (mSensor != null && mTriggerRequested) {
69a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown                mTriggerRequested = false;
70a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown                mSensorManager.cancelTriggerSensor(mListener, mSensor);
71a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            }
72a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        }
73a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    }
74a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
75a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    public void dump(PrintWriter pw, String prefix) {
76a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        synchronized (mLock) {
77a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            pw.println(prefix + TAG);
78a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            prefix += "  ";
79a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            pw.println(prefix + "mTriggerRequested=" + mTriggerRequested);
80a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            pw.println(prefix + "mSensor=" + mSensor);
81a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        }
82a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    }
83a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
84a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    private final TriggerEventListener mListener = new TriggerEventListener() {
85a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        @Override
86a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        public void onTrigger(TriggerEvent event) {
87a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            synchronized (mLock) {
88a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown                mTriggerRequested = false;
89a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown                mHandler.post(mWakeUpRunnable);
90a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            }
91a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        }
92a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    };
93a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown
94a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    private final Runnable mWakeUpRunnable = new Runnable() {
95a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        @Override
96a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        public void run() {
97a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown            onWakeUp();
98a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown        }
99a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown    };
100a20dda4a6eedeee1dcaf105d76c8d7d126ce0f1bJeff Brown}
101