diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index 4cb28145..11b88538 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -38,6 +38,7 @@ public class NotificationService { private LinkedHashMap> notifications = new LinkedHashMap>(); public static int NOTIFICATION_ID = 0x2342; + public static int FOREGROUND_NOTIFICATION_ID = 0x8899; private Conversation mOpenConversation; private boolean mIsInForeground; private long mLastNotification; @@ -290,9 +291,11 @@ public class NotificationService { Intent viewConversationIntent = new Intent(mXmppConnectionService, ConversationActivity.class); viewConversationIntent.setAction(Intent.ACTION_VIEW); - viewConversationIntent.putExtra(ConversationActivity.CONVERSATION, - conversationUuid); - viewConversationIntent.setType(ConversationActivity.VIEW_CONVERSATION); + if (conversationUuid!=null) { + viewConversationIntent.putExtra(ConversationActivity.CONVERSATION, + conversationUuid); + viewConversationIntent.setType(ConversationActivity.VIEW_CONVERSATION); + } stackBuilder.addNextIntent(viewConversationIntent); @@ -304,7 +307,14 @@ public class NotificationService { private PendingIntent createDeleteIntent() { Intent intent = new Intent(mXmppConnectionService, XmppConnectionService.class); - intent.setAction("clear_notification"); + intent.setAction(XmppConnectionService.ACTION_CLEAR_NOTIFICATION); + return PendingIntent.getService(mXmppConnectionService, 0, intent, 0); + } + + private PendingIntent createDisableForeground() { + Intent intent = new Intent(mXmppConnectionService, + XmppConnectionService.class); + intent.setAction(XmppConnectionService.ACTION_DISABLE_FOREGROUND); return PendingIntent.getService(mXmppConnectionService, 0, intent, 0); } @@ -351,4 +361,15 @@ public class NotificationService { : Config.MINI_GRACE_PERIOD * 2; return SystemClock.elapsedRealtime() < (this.mLastNotification + miniGrace); } + + public Notification createForegroundNotification() { + NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mXmppConnectionService); + mBuilder.setSmallIcon(R.drawable.ic_stat_communication_import_export); + mBuilder.setContentTitle(mXmppConnectionService.getString(R.string.conversations_foreground_service)); + mBuilder.setContentText(mXmppConnectionService.getString(R.string.touch_to_disable)); + mBuilder.setContentIntent(createDisableForeground()); + mBuilder.setWhen(0); + mBuilder.setPriority(NotificationCompat.PRIORITY_MIN); + return mBuilder.build(); + } } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 831a54e1..97aba64f 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -97,6 +97,7 @@ public class XmppConnectionService extends Service { public static String ACTION_CLEAR_NOTIFICATION = "clear_notification"; private static String ACTION_MERGE_PHONE_CONTACTS = "merge_phone_contacts"; + public static String ACTION_DISABLE_FOREGROUND = "disable_foreground"; private ContentObserver contactObserver = new ContentObserver(null) { @Override public void onChange(boolean selfChange) { @@ -345,6 +346,9 @@ public class XmppConnectionService extends Service { return START_NOT_STICKY; } else if (intent.getAction().equals(ACTION_CLEAR_NOTIFICATION)) { mNotificationService.clear(); + } else if (intent.getAction().equals(ACTION_DISABLE_FOREGROUND)) { + getPreferences().edit().putBoolean("keep_foreground_service",false).commit(); + toggleForegroundService(); } } this.wakeLock.acquire(); @@ -459,18 +463,23 @@ public class XmppConnectionService extends Service { this.pm = (PowerManager) getSystemService(Context.POWER_SERVICE); this.wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "XmppConnectionService"); + toggleForegroundService(); } - @Override - public void onDestroy() { - super.onDestroy(); - this.logoutAndSave(); + public void toggleForegroundService() { + if (getPreferences().getBoolean("keep_foreground_service",false)) { + startForeground(NotificationService.FOREGROUND_NOTIFICATION_ID, this.mNotificationService.createForegroundNotification()); + } else { + stopForeground(true); + } } @Override public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); - this.logoutAndSave(); + if (!getPreferences().getBoolean("keep_foreground_service",false)) { + this.logoutAndSave(); + } } private void logoutAndSave() { diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java index aba60175..b6f3a077 100644 --- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java @@ -70,6 +70,8 @@ public class SettingsActivity extends XmppActivity implements } } } + } else if (name.equals("keep_foreground_service")) { + xmppConnectionService.toggleForegroundService(); } } diff --git a/src/main/res/drawable-hdpi/ic_stat_communication_import_export.png b/src/main/res/drawable-hdpi/ic_stat_communication_import_export.png new file mode 100644 index 00000000..f929996e Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_stat_communication_import_export.png differ diff --git a/src/main/res/drawable-mdpi/ic_stat_communication_import_export.png b/src/main/res/drawable-mdpi/ic_stat_communication_import_export.png new file mode 100644 index 00000000..b581e174 Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_stat_communication_import_export.png differ diff --git a/src/main/res/drawable-xhdpi/ic_stat_communication_import_export.png b/src/main/res/drawable-xhdpi/ic_stat_communication_import_export.png new file mode 100644 index 00000000..a1d62d41 Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_stat_communication_import_export.png differ diff --git a/src/main/res/drawable-xxhdpi/ic_stat_communication_import_export.png b/src/main/res/drawable-xxhdpi/ic_stat_communication_import_export.png new file mode 100644 index 00000000..3539cd91 Binary files /dev/null and b/src/main/res/drawable-xxhdpi/ic_stat_communication_import_export.png differ diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 645dc8e5..0fd706f3 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -328,4 +328,8 @@ Verified! Contact requested SMP verification No valid OTR session has been found! + Conversations + Touch to disable foreground service + Keep service in foreground + Prevents the operating system from killing your connection diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml index 15a61e87..3be65b7a 100644 --- a/src/main/res/xml/preferences.xml +++ b/src/main/res/xml/preferences.xml @@ -101,6 +101,11 @@ android:key="indicate_received" android:summary="@string/pref_use_indicate_received_summary" android:title="@string/pref_use_indicate_received" /> +