/*
* The MIT License (MIT)
*
* Copyright (c) 2015 DVDAndroid
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.dvd.android.xposed.enableambientdisplay.services;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.IBinder;
import android.os.PowerManager;
import android.preference.PreferenceManager;
import static com.dvd.android.xposed.enableambientdisplay.utils.Utils.ACTION_DOZE;
import static com.dvd.android.xposed.enableambientdisplay.utils.Utils.DOZE_PROXIMITY;
public class SensorService extends Service
implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final int DELAY_BETWEEN_DOZES_IN_MS = 2500;
private static final String TAG = "SensorService";
private static boolean isRunning;
private ProximitySensor mSensor;
private PowerManager mPowerManager;
private long mLastDoze;
private SharedPreferences mPrefs;
private boolean mDozeProximity;
private boolean displayTurnedOff = false;
private BroadcastReceiver mScreenStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
onDisplayOff();
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
onDisplayOn();
}
}
};
private Context mContext;
public static boolean isRunning() {
return isRunning;
}
@Override
public void onCreate() {
mContext = this;
mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
mSensor = new ProximitySensor(mContext);
mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mPrefs.registerOnSharedPreferenceChangeListener(this);
mDozeProximity = mPrefs.getBoolean(DOZE_PROXIMITY, true);
if (!isInteractive() && mDozeProximity) {
mSensor.enable();
}
isRunning = true;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
IntentFilter screenStateFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
mContext.registerReceiver(mScreenStateReceiver, screenStateFilter);
return START_STICKY;
}
@Override
public void onDestroy() {
isRunning = false;
mContext.unregisterReceiver(mScreenStateReceiver);
mPrefs.unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void launchDozePulse() {
mContext.sendBroadcast(new Intent(ACTION_DOZE));
mLastDoze = System.currentTimeMillis();
}
private boolean isInteractive() {
return mPowerManager.isInteractive();
}
private void onDisplayOn() {
mSensor.disable();
}
private void onDisplayOff() {
if (mDozeProximity) {
mSensor.enable();
}
displayTurnedOff = true;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(DOZE_PROXIMITY))
mDozeProximity = sharedPreferences.getBoolean(DOZE_PROXIMITY, true);
}
class ProximitySensor implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mSensor;
private boolean mIsNear = false;
public ProximitySensor(Context context) {
mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}
@Override
public void onSensorChanged(SensorEvent event) {
long now = System.currentTimeMillis();
mIsNear = event.values[0] < mSensor.getMaximumRange();
if (!mIsNear && (now - mLastDoze > DELAY_BETWEEN_DOZES_IN_MS) && !displayTurnedOff) {
launchDozePulse();
}
displayTurnedOff = false;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
/* Empty */
}
public void enable() {
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
public void disable() {
mSensorManager.unregisterListener(this, mSensor);
}
}
}