diff options
author | Daniel Gultsch <daniel@gultsch.de> | 2021-02-19 17:59:53 +0300 |
---|---|---|
committer | Daniel Gultsch <daniel@gultsch.de> | 2021-02-19 17:59:56 +0300 |
commit | 6bfe16f044d608ecf7dc0bbbe999ec452d541b57 (patch) | |
tree | e04d22a5e44e1b9473854db7c23878e942f9f37a /src/main | |
parent | 53da64b7e2af6349c0796acefae0cbcaf7371e53 (diff) |
replace away when screen off with away when locked
fixes #3978
Diffstat (limited to 'src/main')
3 files changed, 17 insertions, 27 deletions
diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index c7384b5fb..c478e4ccd 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -368,8 +368,8 @@ public class NotificationService { public void pushFailedDelivery(final Message message) { final Conversation conversation = (Conversation) message.getConversation(); - final boolean isScreenOn = mXmppConnectionService.isInteractive(); - if (this.mIsInForeground && isScreenOn && this.mOpenConversation == message.getConversation()) { + final boolean isScreenLocked = !mXmppConnectionService.isScreenLocked(); + if (this.mIsInForeground && isScreenLocked && this.mOpenConversation == message.getConversation()) { Log.d(Config.LOGTAG, message.getConversation().getAccount().getJid().asBareJid() + ": suppressing failed delivery notification because conversation is open"); return; } @@ -537,8 +537,8 @@ public class NotificationService { Log.d(Config.LOGTAG, message.getConversation().getAccount().getJid().asBareJid() + ": suppressing notification because turned off"); return; } - final boolean isScreenOn = mXmppConnectionService.isInteractive(); - if (this.mIsInForeground && isScreenOn && this.mOpenConversation == message.getConversation()) { + final boolean isScreenLocked = mXmppConnectionService.isScreenLocked(); + if (this.mIsInForeground && !isScreenLocked && this.mOpenConversation == message.getConversation()) { Log.d(Config.LOGTAG, message.getConversation().getAccount().getJid().asBareJid() + ": suppressing notification because conversation is open"); return; } @@ -546,7 +546,7 @@ public class NotificationService { pushToStack(message); final Conversational conversation = message.getConversation(); final Account account = conversation.getAccount(); - final boolean doNotify = (!(this.mIsInForeground && this.mOpenConversation == null) || !isScreenOn) + final boolean doNotify = (!(this.mIsInForeground && this.mOpenConversation == null) || isScreenLocked) && !account.inGracePeriod() && !this.inMiniGracePeriod(account); updateNotification(doNotify, Collections.singletonList(conversation.getUuid())); diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 65b082abe..4d100c0a5 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -4,6 +4,7 @@ import android.Manifest; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.AlarmManager; +import android.app.KeyguardManager; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; @@ -774,8 +775,9 @@ public class XmppConnectionService extends Service { break; case Intent.ACTION_SCREEN_ON: deactivateGracePeriod(); + case Intent.ACTION_USER_PRESENT: case Intent.ACTION_SCREEN_OFF: - if (awayWhenScreenOff()) { + if (awayWhenScreenLocked()) { refreshAllPresences(); } break; @@ -975,7 +977,7 @@ public class XmppConnectionService extends Service { return getBooleanPreference(SettingsActivity.TREAT_VIBRATE_AS_SILENT, R.bool.treat_vibrate_as_silent); } - private boolean awayWhenScreenOff() { + private boolean awayWhenScreenLocked() { return getBooleanPreference(SettingsActivity.AWAY_WHEN_SCREEN_IS_OFF, R.bool.away_when_screen_off); } @@ -986,29 +988,16 @@ public class XmppConnectionService extends Service { private Presence.Status getTargetPresence() { if (dndOnSilentMode() && isPhoneSilenced()) { return Presence.Status.DND; - } else if (awayWhenScreenOff() && !isInteractive()) { + } else if (awayWhenScreenLocked() && isScreenLocked()) { return Presence.Status.AWAY; } else { return Presence.Status.ONLINE; } } - @SuppressLint("NewApi") - @SuppressWarnings("deprecation") - public boolean isInteractive() { - try { - final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - - final boolean isScreenOn; - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - isScreenOn = pm.isScreenOn(); - } else { - isScreenOn = pm.isInteractive(); - } - return isScreenOn; - } catch (RuntimeException e) { - return false; - } + public boolean isScreenLocked() { + final KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); + return keyguardManager != null && keyguardManager.inKeyguardRestrictedInputMode(); } private boolean isPhoneSilenced() { @@ -1272,10 +1261,11 @@ public class XmppConnectionService extends Service { } public void toggleScreenEventReceiver() { - if (awayWhenScreenOff() && !manuallyChangePresence()) { + if (awayWhenScreenLocked() && !manuallyChangePresence()) { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(Intent.ACTION_USER_PRESENT); registerReceiver(this.mInternalScreenEventReceiver, filter); } else { try { diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index d1d803688..ace5e4061 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -463,8 +463,8 @@ <string name="account_status_host_unknown">The server is not responsible for this domain</string> <string name="server_info_broken">Broken</string> <string name="pref_presence_settings">Availability</string> - <string name="pref_away_when_screen_off">Away when screen is off</string> - <string name="pref_away_when_screen_off_summary">Show as Away when the screen is turned off</string> + <string name="pref_away_when_screen_off">Away when device is locked</string> + <string name="pref_away_when_screen_off_summary">Show as Away when the device is locked</string> <string name="pref_dnd_on_silent_mode">Busy in silent mode</string> <string name="pref_dnd_on_silent_mode_summary">Show as Busy when device is in silent mode</string> <string name="pref_treat_vibrate_as_silent">Treat vibrate as silent mode</string> |