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 17b10e33ff804a831c71be9303146cea892b9aeb5dJorim Jaggipackage com.android.server.policy; 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