From b34312892521be37a87fad8c410d47d66d33da1b Mon Sep 17 00:00:00 2001 From: Eike Thies Date: Fri, 1 Jan 2016 17:19:15 +0100 Subject: [PATCH 1/2] Feature:Also incorporate Accelerometer to wake up device if moved;Feature: Create Test Notification; Fix: Do not wake up device if screen is already on; Fix: Make sure service is startet on Android M --- ScreenNotifications/build.gradle | 62 ++++----- .../screennotifications/SettingsFragment.java | 60 ++++++++ .../helpers/ScreenController.java | 16 +-- .../services/NotificationListener.java | 128 +++++++++++++++--- .../services/ScreenNotificationsService.java | 107 ++++++++++++--- .../src/main/res/values-cs/strings.xml | 3 +- .../src/main/res/values-de/strings.xml | 6 + .../src/main/res/values-it/strings.xml | 2 +- .../src/main/res/values-nl-rNL/strings.xml | 2 +- .../src/main/res/values/strings.xml | 12 +- .../src/main/res/xml/settings.xml | 24 +++- build.gradle | 6 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 13 files changed, 347 insertions(+), 83 deletions(-) diff --git a/ScreenNotifications/build.gradle b/ScreenNotifications/build.gradle index 025a959..72b9a69 100644 --- a/ScreenNotifications/build.gradle +++ b/ScreenNotifications/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion '23.0.1' + buildToolsVersion '23.0.2' defaultConfig { minSdkVersion 16 @@ -11,20 +11,20 @@ android { versionName "0.12.0" } - signingConfigs { - release { - storeFile file(System.properties['KEYSTORE_PATH']) - storePassword "PLACEHOLDER" - keyAlias System.properties['KEYSTORE_EMAIL'] - keyPassword "PLACEHOLDER" - } - } - - buildTypes { - release { - signingConfig signingConfigs.release - } - } +// signingConfigs { +// release { +// storeFile file(System.properties['KEYSTORE_PATH']) +// storePassword "PLACEHOLDER" +// keyAlias System.properties['KEYSTORE_EMAIL'] +// keyPassword "PLACEHOLDER" +// } +// } + +// buildTypes { +// release { +// signingConfig signingConfigs.release +// } +// } lintOptions { abortOnError false @@ -39,20 +39,20 @@ dependencies { // 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/ -gradle.taskGraph.whenReady { taskGraph -> +//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(password.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 - } -} +// if(taskGraph.hasTask(':ScreenNotifications:assembleRelease') || taskGraph.hasTask(':ScreenNotifications:installRelease')) { +// def password = System.console().readPassword("\nPlease enter key passphrase: ") +// +// if(password.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 +// } +//} 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" /> + + + + Date: Fri, 1 Jan 2016 17:45:00 +0100 Subject: [PATCH 2/2] updated gradle file, new password dialog and better handling if developer forgot to adapt local gradle file --- ScreenNotifications/build.gradle | 99 +++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 35 deletions(-) diff --git a/ScreenNotifications/build.gradle b/ScreenNotifications/build.gradle index 72b9a69..5488791 100644 --- a/ScreenNotifications/build.gradle +++ b/ScreenNotifications/build.gradle @@ -1,5 +1,7 @@ +import groovy.swing.SwingBuilder apply plugin: 'com.android.application' + android { compileSdkVersion 23 buildToolsVersion '23.0.2' @@ -7,24 +9,31 @@ android { 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" -// } -// } - -// buildTypes { -// release { -// signingConfig signingConfigs.release -// } -// } + signingConfigs { + release { + 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.") + } + + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + } + } lintOptions { abortOnError false @@ -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/ -//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(password.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 -// } -//} +// see Tim Roes https://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-files/ +gradle.taskGraph.whenReady { taskGraph -> + 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 (pass.size() <= 0) { + throw new InvalidUserDataException("You must enter a password to proceed.") + } + + pass = new String(pass) + android.signingConfigs.release.storePassword = pass + android.signingConfigs.release.keyPassword = pass + } + } +}