diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index 4cb28145c5effa3e3d00fe963f69154752488032..ec1ffc15c97d4ba4c7191758cebf04d02427e500 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,13 @@ 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()); + 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 831a54e126b04b5f35beb4aa2a9c4a0ccbe5c25a..97aba64fa73ff2c5cfb2ef53b01596803bc2c5c4 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 aba601757a7fd640387efff253d1e39d30443e4a..b6f3a077de404509a928f7b050903751d8fcf0fd 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 0000000000000000000000000000000000000000..f929996e7d3880ea069ed8ff1791b9bfd01038b3 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 0000000000000000000000000000000000000000..b581e174f55924b4333fe8f963bc41edf744ffb0 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 0000000000000000000000000000000000000000..a1d62d419dc59f5055c108eb62cdd2a4dcd131dc 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 0000000000000000000000000000000000000000..3539cd91ca9729e47b5fee2f18042af44f74ee0e 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 414de73bd4441fe2ab00d08bb5f1cdf6534d6b89..62de9eccaefcdcc70ecd30b4c03d480dc39a9c25 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -311,4 +311,8 @@ Scan QR code Show QR code Account details + 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 15a61e8793a36d1fd0cabbf3a22f101e41249723..3be65b7ad0955709e6e6791301fcfe09378fa85a 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" /> +