diff --git a/ScreenNotifications/build.gradle b/ScreenNotifications/build.gradle
index 025a959..5488791 100644
--- a/ScreenNotifications/build.gradle
+++ b/ScreenNotifications/build.gradle
@@ -1,22 +1,31 @@
+import groovy.swing.SwingBuilder
apply plugin: 'com.android.application'
+
android {
compileSdkVersion 23
- buildToolsVersion '23.0.1'
+ buildToolsVersion '23.0.2'
defaultConfig {
minSdkVersion 16
targetSdkVersion 23
- versionCode 18
- versionName "0.12.0"
+ versionCode 19
+ versionName "0.13.0"
}
signingConfigs {
release {
- storeFile file(System.properties['KEYSTORE_PATH'])
- storePassword "PLACEHOLDER"
- keyAlias System.properties['KEYSTORE_EMAIL']
- keyPassword "PLACEHOLDER"
+ try {
+ storeFile file(System.properties['KEYSTORE_PATH'])
+ storePassword "PLACEHOLDER"
+ keyAlias System.properties['KEYSTORE_EMAIL']
+ keyPassword "PLACEHOLDER"
+ }
+ catch (ex) {
+ println "You should define KEYSTORE_PATH and KEYSTORE_EMAIL in a gradle.properties file."
+ //throw new InvalidUserDataException("You should define KEYSTORE_PATH and KEYSTORE_EMAIL in a gradle.properties file.")
+ }
+
}
}
@@ -37,22 +46,42 @@ dependencies {
compile 'fr.nicolaspomepuy:discreetapprate:2.0.3@aar'
}
-// borrowed from https://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-files/
-// and https://www.timroes.de/2013/09/22/handling-signing-configs-with-gradle/
+// see Tim Roes https://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-files/
gradle.taskGraph.whenReady { taskGraph ->
- // Only execute when we are trying to assemble a release build
- if(taskGraph.hasTask(':ScreenNotifications:assembleRelease') || taskGraph.hasTask(':ScreenNotifications:installRelease')) {
- def password = System.console().readPassword("\nPlease enter key passphrase: ")
+ if (taskGraph.hasTask(':ScreenNotifications:assembleRelease')) {
+ if(android.signingConfigs.release.storePassword.size() <= 0) {
+ def pass = ''
+ if (System.console() == null) {
+ new SwingBuilder().edt {
+ dialog(modal: true, // Otherwise the build will continue running before you closed the dialog
+ title: 'Enter password', // Dialog title
+ alwaysOnTop: true, // pretty much what the name says
+ resizable: false, // Don't allow the user to resize the dialog
+ locationRelativeTo: null, // Place dialog in center of the screen
+ pack: true, // We need to pack the dialog (so it will take the size of it's children)
+ show: true // Let's show it
+ ) {
+ vbox { // Put everything below each other
+ label(text: "Please enter key passphrase:")
+ input = passwordField()
+ button(defaultButton: true, text: 'OK', actionPerformed: {
+ pass = input.password; // Set pass variable to value of input field
+ dispose(); // Close dialog
+ })
+ } // vbox end
+ } // dialog end
+ } // edt end
+ } else {
+ pass = System.console().readPassword("\nPlease enter key passphrase: ")
+ }
- if(password.size() <= 0) {
- throw new InvalidUserDataException("You must enter a password to proceed.")
- }
+ if (pass.size() <= 0) {
+ throw new InvalidUserDataException("You must enter a password to proceed.")
+ }
- // Must create String because System.readPassword() returns char[]
- // (and assigning that below fails silently)
- password = new String(password)
-
- android.signingConfigs.release.storePassword = password
- android.signingConfigs.release.keyPassword = password
+ pass = new String(pass)
+ android.signingConfigs.release.storePassword = pass
+ android.signingConfigs.release.keyPassword = pass
+ }
}
}
diff --git a/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/SettingsFragment.java b/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/SettingsFragment.java
index efea770..84cba98 100644
--- a/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/SettingsFragment.java
+++ b/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/SettingsFragment.java
@@ -3,18 +3,27 @@
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
+import android.app.Notification;
+import android.app.NotificationManager;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.ServiceConnection;
import android.content.SharedPreferences;
+import android.media.RingtoneManager;
+import android.net.Uri;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
+import android.support.v4.app.NotificationCompat;
import android.text.format.DateFormat;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.NumberPicker;
@@ -29,6 +38,8 @@
public class SettingsFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener {
+ private static final String TAG = "SettingsFragment";
+
private static final int REQUEST_CODE_ENABLE_ADMIN = 1;
private SharedPreferences mPrefs;
@@ -41,6 +52,8 @@ public class SettingsFragment extends PreferenceFragment implements Preference.O
private ComponentName mDeviceAdmin;
private CheckBoxPreference mDeviceAdminPreference;
+ private Context mContext;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -53,6 +66,7 @@ public void onCreate(Bundle savedInstanceState) {
}
findPreference("contact").setOnPreferenceClickListener(this);
+ findPreference("test_notification").setOnPreferenceClickListener(this);
findPreference("version").setSummary(BuildConfig.VERSION_NAME);
initializeService();
@@ -66,9 +80,34 @@ public void onCreate(Bundle savedInstanceState) {
.checkAndShow();
}
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ mContext = context;
+ }
+ boolean mServiceBound = false;
+ private ServiceConnection mServiceConnection = new ServiceConnection() {
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ mServiceBound = false;
+ }
+
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ mServiceBound = true;
+ }
+ };
public void onResume() {
super.onResume();
+ //TODO:Refactor me, just a fix for non-starting service
+ if (!mServiceBound) {
+ Intent intent = new Intent(getActivity(), com.lukekorth.screennotifications.services.NotificationListener.class);
+ getActivity().startService(intent);
+ getActivity().bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
+ }
+
checkForRunningService();
checkForActiveDeviceAdmin();
}
@@ -268,6 +307,7 @@ public void onClick(DialogInterface alertDialog, int id) {
private boolean isServiceRunning() {
ActivityManager manager = (ActivityManager) getActivity().getSystemService(Activity.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
+// Log.d(TAG, "isServiceRunning: "+ service.service.getClassName());
if (mSupportsNotificationListenerService &&
NotificationListener.class.getName().equals(service.service.getClassName())) {
return true;
@@ -284,6 +324,26 @@ public boolean onPreferenceClick(Preference preference) {
if (preference.getKey().equals("contact")) {
new LogReporting(getActivity()).collectAndSendLogs();
return true;
+ }else if(preference.getKey().equals("test_notification")) {
+ Log.d(TAG, "onPreferenceClick: create Notification");
+ final NotificationManager mNotifyMgr = (NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
+ final NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
+ .setContentTitle("Test Notification")
+ .setContentText("This is just a test")
+ .setTicker( "Test Notification" )
+ .setSound(alarmSound)
+ .setSmallIcon(R.drawable.ic_launcher);
+ final Notification notification = builder.build();
+ notification.defaults = Notification.DEFAULT_ALL;
+ Handler handler = new Handler();
+ handler.postDelayed(new Runnable() {
+ public void run() {
+ Log.d(TAG, "run: Now showing the notification");
+ mNotifyMgr.notify(1447, notification);
+ }
+ }, 5000);
+ return true;
}
return false;
}
diff --git a/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/helpers/ScreenController.java b/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/helpers/ScreenController.java
index 097419f..84ac957 100644
--- a/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/helpers/ScreenController.java
+++ b/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/helpers/ScreenController.java
@@ -29,14 +29,14 @@ public class ScreenController {
private Logger mLogger;
private SharedPreferences mPrefs;
private PowerManager mPowerManager;
- private boolean mCloseToProximitySensor;
+ private boolean mSensorsAllowWakeUp;
- public ScreenController(Context context, boolean closeToProximitySensor) {
+ public ScreenController(Context context, boolean SensorsAllowWakeUp) {
mContext = context;
mLogger = LoggerFactory.getLogger("ScreenController");
mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- mCloseToProximitySensor = closeToProximitySensor;
+ mSensorsAllowWakeUp = SensorsAllowWakeUp;
}
public void handleNotification() {
@@ -54,10 +54,10 @@ public void run() {
private void turnOnScreen() {
mLogger.debug("Turning on screen");
- if(mPrefs.getBoolean("status-bar", false)) {
- mLogger.debug("Sleeping for 3 seconds before turning on screen");
- SystemClock.sleep(3000);
- }
+// if(mPrefs.getBoolean("status-bar", false)) {
+// mLogger.debug("Sleeping for 3 seconds before turning on screen");
+// SystemClock.sleep(3000);
+// }
int flag;
if(mPrefs.getBoolean("bright", false)) {
@@ -124,7 +124,7 @@ private boolean shouldTurnOnScreen() {
boolean turnOnScreen = !isInQuietTime() && !isInCall() && !mPowerManager.isScreenOn();
if(!mPrefs.getBoolean("proxSensor", true)) {
- turnOnScreen = turnOnScreen && !mCloseToProximitySensor;
+ turnOnScreen = turnOnScreen && mSensorsAllowWakeUp;
}
mLogger.debug("Should turn on screen: " + turnOnScreen);
diff --git a/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/services/NotificationListener.java b/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/services/NotificationListener.java
index dcd01a4..45bed54 100644
--- a/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/services/NotificationListener.java
+++ b/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/services/NotificationListener.java
@@ -2,14 +2,20 @@
import android.annotation.TargetApi;
import android.content.Context;
+import android.content.SharedPreferences;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
+import android.hardware.display.DisplayManager;
import android.os.Build;
+import android.os.PowerManager;
+import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
+import android.util.Log;
+import android.view.Display;
import com.lukekorth.screennotifications.helpers.ScreenController;
@@ -18,57 +24,145 @@
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class NotificationListener extends NotificationListenerService implements SensorEventListener {
+ private static final String TAG = "NotificationListener";
+
+ private double mAccel = SensorManager.GRAVITY_EARTH;
+
+ private float accelerometerThreshold = 2.0f;
+ private int maximumPoolingTime = 5;
+
+ private SharedPreferences mPrefs;
+ private PowerManager mPowerManager;
+ private DisplayManager dm;
+
+ private long startTime;
+ private long endTime;
+
+ private boolean inPocket=false;
+ private boolean deviceHasMoved=false;
+
+ private boolean isAlreadyPooling=false;
+
+ private boolean notificationTriggersVibration = false;
+
+ @Override
+ public void onCreate() {
+ Log.d(TAG, "onCreate: notificationListener");
+ super.onCreate();
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+ mPowerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
+ dm = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
+ }
+
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
- if (!sbn.isOngoing() && isAppEnabled(sbn)) {
- LoggerFactory.getLogger("NotificationListener").debug("Got a non-ongoing notification for an enabled app. " + sbn.getPackageName());
- if (isProximitySensorEnabled()) {
- if (!registerProximitySensorListener()) {
- new ScreenController(this, false).handleNotification();
+ if(!isScreenOn()) {
+ //Used here, so that changes in the shared preferences are immediately reflected into the service
+ accelerometerThreshold = Float.parseFloat(mPrefs.getString("accelerometerThreshold", "2.0f"));
+ maximumPoolingTime = Integer.parseInt(mPrefs.getString("maximumPoolingTime", "5"));
+
+ Log.d(TAG, "onNotificationPosted: Got a notification for an app. " + sbn.getPackageName());
+ if (!sbn.isOngoing() && isAppEnabled(sbn)) {
+ //used to check if phone vibrates because of the notification and then change the sensor listening later
+ notificationTriggersVibration = (sbn.getNotification().defaults != 0 || sbn.getNotification().vibrate != null);
+
+ if (isAlreadyPooling) {
+ startTime = SystemClock.elapsedRealtime();
+ endTime = SystemClock.elapsedRealtime();
+ } else {
+ LoggerFactory.getLogger("NotificationListener").debug("Got a non-ongoing notification for an enabled app. " + sbn.getPackageName());
+
+ if (isProximitySensorEnabled()) {
+ if (!registerSensorListeners()) {
+ Log.d(TAG, "registerSensorListeners was false");
+ new ScreenController(this, true).handleNotification();
+ }
+ } else {
+ Log.d(TAG, "ProximitySensor NOT Enabled");
+ new ScreenController(this, true).handleNotification();
+ }
}
- } else {
- new ScreenController(this, false).handleNotification();
}
}
}
@Override
public void onSensorChanged(SensorEvent event) {
+ endTime = SystemClock.elapsedRealtime();
if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
- unregisterProximitySensorListener();
+ inPocket = event.values[0] < event.sensor.getMaximumRange();
+ }
- boolean close = event.values[0] < event.sensor.getMaximumRange();
- new ScreenController(this, close).handleNotification();
+ //Currently the sensor is only used after some time if the phone vibrates, because otherwise the vibration of a notification might give us false data. Maybe use low-pass filter or other sensors to distinguish between vibration caused movement or real movement of the device
+ if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION && (!notificationTriggersVibration || (endTime - startTime)/1000f > 1.5)) {
+ float x = event.values[0];
+ float y = event.values[1];
+ float z = event.values[2];
+ mAccel = Math.sqrt(x*x + y*y + z*z);
+ Log.d(TAG, "mAccel:"+mAccel);
+
+ deviceHasMoved = (mAccel > accelerometerThreshold);
+ }
+
+ Log.d(TAG, "onSensorChanged: shouldSensorsWakeUpDevice:" + (!inPocket&&deviceHasMoved)+ " time:"+(endTime - startTime)/1000);
+ if ((!inPocket&&deviceHasMoved) || (endTime - startTime)/1000 > maximumPoolingTime) {
+ unregisterSensorListeners();
+ new ScreenController(this, (!inPocket&&deviceHasMoved)).handleNotification();
+ inPocket=false;
+ deviceHasMoved=false;
+ isAlreadyPooling=false;
+ notificationTriggersVibration=false;
}
}
private boolean isAppEnabled(StatusBarNotification sbn) {
- return PreferenceManager.getDefaultSharedPreferences(this).getBoolean(sbn.getPackageName(), false);
+ return mPrefs.getBoolean(sbn.getPackageName(), false);
}
private boolean isProximitySensorEnabled() {
- return !PreferenceManager.getDefaultSharedPreferences(this).getBoolean("proxSensor", true);
+ return !mPrefs.getBoolean("proxSensor", true);
}
- private boolean registerProximitySensorListener() {
+ private boolean registerSensorListeners() {
+ startTime = SystemClock.elapsedRealtime();
+ isAlreadyPooling=true;
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
if (proximitySensor == null) {
return false;
} else {
sensorManager.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
- return true;
}
+ sensorManager.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
+ return true;
}
- private void unregisterProximitySensorListener() {
+ private void unregisterSensorListeners() {
((SensorManager) getSystemService(Context.SENSOR_SERVICE)).unregisterListener(this);
}
@Override
- public void onNotificationRemoved(StatusBarNotification sbn) {}
+ public void onNotificationRemoved(StatusBarNotification sbn) {
+ //TODO: Allow option to have sensors active until notification was read. This consumes more battery, but then whenever he moves the device it will wake up, makes only sense for accelerometer mode
+ }
@Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {}
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ }
+
+ public boolean isScreenOn() {
+ if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
+ boolean screenOn = false;
+ for (Display display : dm.getDisplays()) {
+ if (display.getState() != Display.STATE_OFF) {
+ screenOn = true;
+ }
+ }
+ return screenOn;
+ } else {
+ return mPowerManager.isScreenOn();
+ }
+ }
}
diff --git a/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/services/ScreenNotificationsService.java b/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/services/ScreenNotificationsService.java
index 807ad2f..9c30080 100644
--- a/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/services/ScreenNotificationsService.java
+++ b/ScreenNotifications/src/main/java/com/lukekorth/screennotifications/services/ScreenNotificationsService.java
@@ -2,11 +2,17 @@
import android.accessibilityservice.AccessibilityService;
import android.content.Context;
+import android.content.SharedPreferences;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
+import android.hardware.display.DisplayManager;
+import android.os.Build;
+import android.os.PowerManager;
+import android.os.SystemClock;
import android.preference.PreferenceManager;
+import android.view.Display;
import android.view.accessibility.AccessibilityEvent;
import com.lukekorth.screennotifications.helpers.ScreenController;
@@ -14,55 +20,107 @@
import org.slf4j.LoggerFactory;
public class ScreenNotificationsService extends AccessibilityService implements SensorEventListener {
+ private double mAccel = SensorManager.GRAVITY_EARTH;
+
+ private float accelerometerThreshold = 2.0f;
+ private int maximumPoolingTime = 5;
+
+ private SharedPreferences mPrefs;
+ private PowerManager mPowerManager;
+ private DisplayManager dm;
+
+ private long startTime;
+ private long endTime;
+
+ private boolean inPocket=false;
+ private boolean deviceHasMoved=false;
+ private boolean isAlreadyPooling=false;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+ mPowerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
+ dm = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
+ }
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
- if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED &&
- isAppEnabled(event)) {
- LoggerFactory.getLogger("BaseAccessibilityService")
- .debug("Received a notification accessibility event for an enabled app. " + event.getPackageName());
- if (isProximitySensorEnabled()) {
- if (!registerProximitySensorListener()) {
- new ScreenController(this, false).handleNotification();
+ if(!isScreenOn()) {
+ //Used here, so that changes in the shared preferences are immediately reflected into the service
+ accelerometerThreshold = Float.parseFloat(mPrefs.getString("accelerometerThreshold", "2.0f"));
+ maximumPoolingTime = Integer.parseInt(mPrefs.getString("maximumPoolingTime", "5"));
+ if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED &&
+ isAppEnabled(event)) {
+ if (isAlreadyPooling) {
+ startTime = SystemClock.elapsedRealtime();
+ endTime = SystemClock.elapsedRealtime();
+ } else {
+ LoggerFactory.getLogger("BaseAccessibilityService")
+ .debug("Received a notification accessibility event for an enabled app. " + event.getPackageName());
+ if (isProximitySensorEnabled()) {
+ if (!registerSensorListeners()) {
+ new ScreenController(this, true).handleNotification();
+ }
+ } else {
+ new ScreenController(this, true).handleNotification();
+ }
}
- } else {
- new ScreenController(this, false).handleNotification();
}
}
}
@Override
public void onSensorChanged(SensorEvent event) {
+ endTime = SystemClock.elapsedRealtime();
if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
- unregisterProximitySensorListener();
+ inPocket = event.values[0] < event.sensor.getMaximumRange();
+ }
- boolean close = event.values[0] < event.sensor.getMaximumRange();
- new ScreenController(this, close).handleNotification();
+ //Currently the sensor is only used after some time, because otherwise the vibration of a notification might give us false data. Maybe use low-pass filter or other sensors to distinguish between vibration caused movement or real movement of the device
+ if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION && (endTime - startTime)/1000f > 1.5) {
+ float x = event.values[0];
+ float y = event.values[1];
+ float z = event.values[2];
+ mAccel = Math.sqrt(x*x + y*y + z*z);
+
+ deviceHasMoved = (mAccel > accelerometerThreshold);
+ }
+
+ if ((!inPocket&&deviceHasMoved) || (endTime - startTime)/1000 > maximumPoolingTime) {
+ unregisterSensorListeners();
+ new ScreenController(this, (!inPocket&&deviceHasMoved)).handleNotification();
+ inPocket=false;
+ deviceHasMoved=false;
+ isAlreadyPooling=false;
}
}
private boolean isAppEnabled(AccessibilityEvent event) {
- return PreferenceManager.getDefaultSharedPreferences(this)
- .getBoolean(event.getPackageName().toString(), false);
+ return mPrefs.getBoolean(event.getPackageName().toString(), false);
}
private boolean isProximitySensorEnabled() {
- return !PreferenceManager.getDefaultSharedPreferences(this).getBoolean("proxSensor", true);
+ return !mPrefs.getBoolean("proxSensor", true);
}
- private boolean registerProximitySensorListener() {
+ private boolean registerSensorListeners() {
+ startTime = SystemClock.elapsedRealtime();
+ isAlreadyPooling=true;
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
if (proximitySensor == null) {
return false;
} else {
sensorManager.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
- return true;
}
+ sensorManager.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
+ return true;
}
- private void unregisterProximitySensorListener() {
+ private void unregisterSensorListeners() {
((SensorManager) getSystemService(Context.SENSOR_SERVICE)).unregisterListener(this);
}
@@ -72,4 +130,17 @@ public void onInterrupt() {}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
+ public boolean isScreenOn() {
+ if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
+ boolean screenOn = false;
+ for (Display display : dm.getDisplays()) {
+ if (display.getState() != Display.STATE_OFF) {
+ screenOn = true;
+ }
+ }
+ return screenOn;
+ } else {
+ return mPowerManager.isScreenOn();
+ }
+ }
}
diff --git a/ScreenNotifications/src/main/res/values-cs/strings.xml b/ScreenNotifications/src/main/res/values-cs/strings.xml
index e61d1b9..a08e91b 100644
--- a/ScreenNotifications/src/main/res/values-cs/strings.xml
+++ b/ScreenNotifications/src/main/res/values-cs/strings.xml
@@ -12,7 +12,7 @@
Doba probuzení displeje
Maximální jas
Při zaškrtnutí bude displej zapnutý s maximálním jasem
- Vypnutí Proximity senzoru
+ Vypnutí senzoru
Pokud je zaškrtnuto zapne se displej při oznámení, i když máte telefon v kapse
Noční režim
Experimentální funkce
@@ -28,4 +28,5 @@
Otevření notifikační lišty
Otevře notifikační lištu když oznámení zapne displej.\nToto je experimentální funkce, která bude fungovat jen na některých telefonech.
\n Jednoduchá aplikace která zapne displej při oznámení z vybraných aplikací. \n Když je telefon v kapse nebo pouzdře tak se díky proximity senzoru displej nezapne.\n\n\t\tNápady a přání jsou vítány.\n\t\t\n\t\tProsím pište mi na email. Jestli chcete pomocí s překladem, navštivte následující web: \n\t\thttps://www.transifex.com/projects/p/screen-notifications/\n\n\t\tJestli narazíte na chybu nebo problém, zastihnete mě na github: \n\t\thttps://github.com/lkorth/screen-notifications\n
+
diff --git a/ScreenNotifications/src/main/res/values-de/strings.xml b/ScreenNotifications/src/main/res/values-de/strings.xml
index e4a5f1a..6d4f443 100644
--- a/ScreenNotifications/src/main/res/values-de/strings.xml
+++ b/ScreenNotifications/src/main/res/values-de/strings.xml
@@ -16,4 +16,10 @@
Ruhezeit einschalten
Das Display wird während der Ruhezeiten nicht durch Benachrichtigungen eingeschaltet
Öffnet die Benachrichtigungsleiste wenn das Display durch eine Benachrichtigung aktiviert wird.\nDies ist experimentell und wird nur bei wenigen Telefonen funktionieren. Andererseits wird es keine Probleme bereiten, falls es auf diesem Telefon nicht funktioniert.
+ Sensoren deaktivieren
+ Wenn aktiviert, schaltet sich das Display bei einer Benachrichtigung sofort ein. Auch wenn es in der Tasche steckt.
+ Legt fest wie lange die Sensoren (in Sekunden) aktiv sein sollen um das Gerät aufzuwecken. Höhere Werte verbrauchen etwas mehr Strom.
+ Beschleunigungssensor Sensibilität
+ Kleinere Werte werden das Gerät eher aufwecken, während höhere Werte erst bei starken Bewegungen das Gerät aufwecken werden. (Standard ist 2)
+ Zeitspanne für Sensoren
diff --git a/ScreenNotifications/src/main/res/values-it/strings.xml b/ScreenNotifications/src/main/res/values-it/strings.xml
index 56721d5..eb681d8 100644
--- a/ScreenNotifications/src/main/res/values-it/strings.xml
+++ b/ScreenNotifications/src/main/res/values-it/strings.xml
@@ -12,7 +12,7 @@
Durata accensione schermo
Luminosità Massima
Se selezionato, lo schermo si accenderà sempre a luminosità massima alla ricezione di notifiche
- Disattiva Sensore di Prossimità
+ Disattiva Sensore
Se selezionato, lo schermo si accenderà sempre alla ricezione di notifiche, anche se è in tasca
Periodo di Quiete
Sperimentale
diff --git a/ScreenNotifications/src/main/res/values-nl-rNL/strings.xml b/ScreenNotifications/src/main/res/values-nl-rNL/strings.xml
index ba744cc..80f885e 100644
--- a/ScreenNotifications/src/main/res/values-nl-rNL/strings.xml
+++ b/ScreenNotifications/src/main/res/values-nl-rNL/strings.xml
@@ -12,7 +12,7 @@
Lengte van actief scherm
Volledige helderheid
Wanneer geactiveerd, zal het scherm altijd op volle helderheid gaan voor de nofiticaties
- Deactiveer omgeving sensor
+ Deactiveer sensors
Wanneer geactiveerd, zal het scherm aan gaan voor notificaties. Ook als deze in u zak zit
Rust tijd
Experiment
diff --git a/ScreenNotifications/src/main/res/values/strings.xml b/ScreenNotifications/src/main/res/values/strings.xml
index 54cd3b8..afe5da6 100644
--- a/ScreenNotifications/src/main/res/values/strings.xml
+++ b/ScreenNotifications/src/main/res/values/strings.xml
@@ -30,8 +30,8 @@
Device Admin option must be enabled first
Full Brightness
When checked, the screen will always turn on at full brightness for notifications
- Disable Proximity Sensor
- When checked, the screen will always turn on for notifications, even in your pocket
+ Disable Sensors
+ When checked, the screen will always turn on for notifications, even in your pocket.
Quiet Time
Experimental
Help
@@ -48,7 +48,9 @@
Stop quiet hours
Set
Open notification tray
- Open the notification tray when the screen is turned on due to a notification.
+ Test Notification
+ This will create a test notification after 5 seconds
+ Open the notification tray when the screen is turned on due to a notification.
This is experimental and will only work on a small number of phones. It will not cause any issues if it
does not work on your phone.
@@ -64,4 +66,8 @@
If you have issues or enhancements, fork me on github:
https://github.com/lkorth/screen-notifications
+ Maximum Pooling Time
+ Defines in seconds how long the sensors should listen for movement or proximity to wake up device. Higher values will use a little bit more battery
+ Accelerometer Sensibility
+ A lower value will wake up the device more easily when it moves, higher values will make it wake up only when it is moved more (default=2)
\ No newline at end of file
diff --git a/ScreenNotifications/src/main/res/xml/settings.xml b/ScreenNotifications/src/main/res/xml/settings.xml
index 0196d75..49a66ed 100644
--- a/ScreenNotifications/src/main/res/xml/settings.xml
+++ b/ScreenNotifications/src/main/res/xml/settings.xml
@@ -12,6 +12,10 @@
android:key="device_admin"
android:title="@string/admin_title"
android:summary="@string/admin_summary" />
+
+
+
+