Detailed changes
@@ -12,34 +12,36 @@ import eu.siacs.conversations.utils.Compatibility;
public class EventReceiver extends BroadcastReceiver {
- public static final String SETTING_ENABLED_ACCOUNTS = "enabled_accounts";
+ public static final String SETTING_ENABLED_ACCOUNTS = "enabled_accounts";
+ public static final String EXTRA_NEEDS_FOREGROUND_SERVICE = "needs_foreground_service";
- @Override
- public void onReceive(final Context context, final Intent originalIntent) {
- final Intent intentForService = new Intent(context, XmppConnectionService.class);
- if (originalIntent.getAction() != null) {
- intentForService.setAction(originalIntent.getAction());
- } else {
- intentForService.setAction("other");
- }
- final String action = originalIntent.getAction();
- if (action.equals("ui") || hasEnabledAccounts(context)) {
- try {
- if (Compatibility.runsAndTargetsTwentySix(context)) {
- ContextCompat.startForegroundService(context, intentForService);
- } else {
- context.startService(intentForService);
- }
- } catch (RuntimeException e) {
- Log.d(Config.LOGTAG,"EventReceiver was unable to start service");
- }
- } else {
- Log.d(Config.LOGTAG,"EventReceiver ignored action "+intentForService.getAction());
- }
- }
+ @Override
+ public void onReceive(final Context context, final Intent originalIntent) {
+ final Intent intentForService = new Intent(context, XmppConnectionService.class);
+ if (originalIntent.getAction() != null) {
+ intentForService.setAction(originalIntent.getAction());
+ } else {
+ intentForService.setAction("other");
+ }
+ final String action = originalIntent.getAction();
+ if (action.equals("ui") || hasEnabledAccounts(context)) {
+ try {
+ if (Compatibility.runsAndTargetsTwentySix(context)) {
+ intentForService.putExtra(EXTRA_NEEDS_FOREGROUND_SERVICE, true);
+ ContextCompat.startForegroundService(context, intentForService);
+ } else {
+ context.startService(intentForService);
+ }
+ } catch (RuntimeException e) {
+ Log.d(Config.LOGTAG, "EventReceiver was unable to start service");
+ }
+ } else {
+ Log.d(Config.LOGTAG, "EventReceiver ignored action " + intentForService.getAction());
+ }
+ }
- public static boolean hasEnabledAccounts(final Context context) {
- return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SETTING_ENABLED_ACCOUNTS,true);
- }
+ public static boolean hasEnabledAccounts(final Context context) {
+ return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SETTING_ENABLED_ACCOUNTS, true);
+ }
}
@@ -560,6 +560,11 @@ public class XmppConnectionService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
final String action = intent == null ? null : intent.getAction();
+ final boolean needsForegroundService = intent != null && intent.getBooleanExtra(EventReceiver.EXTRA_NEEDS_FOREGROUND_SERVICE, false);
+ if (needsForegroundService) {
+ Log.d(Config.LOGTAG,"toggle forced foreground service after receiving event");
+ toggleForegroundService(true);
+ }
String pushedAccountHash = null;
boolean interactive = false;
if (action != null) {
@@ -1093,8 +1098,12 @@ public class XmppConnectionService extends Service {
}
public void toggleForegroundService() {
+ toggleForegroundService(false);
+ }
+
+ private void toggleForegroundService(boolean force) {
final boolean status;
- if (mForceForegroundService.get() || (Compatibility.keepForegroundService(this) && hasEnabledAccounts())) {
+ if (force || mForceForegroundService.get() || (Compatibility.keepForegroundService(this) && hasEnabledAccounts())) {
startForeground(NotificationService.FOREGROUND_NOTIFICATION_ID, this.mNotificationService.createForegroundNotification());
status = true;
} else {
@@ -1,15 +1,23 @@
package eu.siacs.conversations.services;
import android.content.Intent;
+import android.support.v4.content.ContextCompat;
import com.google.firebase.iid.FirebaseInstanceIdService;
+import eu.siacs.conversations.utils.Compatibility;
+
public class InstanceIdService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
- Intent intent = new Intent(this, XmppConnectionService.class);
+ final Intent intent = new Intent(this, XmppConnectionService.class);
intent.setAction(XmppConnectionService.ACTION_FCM_TOKEN_REFRESH);
- startService(intent);
+ if (Compatibility.runsAndTargetsTwentySix(this)) {
+ intent.putExtra(EventReceiver.EXTRA_NEEDS_FOREGROUND_SERVICE, true);
+ ContextCompat.startForegroundService(this, intent);
+ } else {
+ startService(intent);
+ }
}
}
@@ -3,6 +3,7 @@ package eu.siacs.conversations.services;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.support.v4.content.ContextCompat;
import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;
@@ -10,6 +11,7 @@ import com.google.firebase.iid.FirebaseInstanceId;
import java.io.IOException;
import eu.siacs.conversations.Config;
+import eu.siacs.conversations.utils.Compatibility;
public class MaintenanceReceiver extends BroadcastReceiver {
@Override
@@ -25,9 +27,14 @@ public class MaintenanceReceiver extends BroadcastReceiver {
new Thread(() -> {
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
- Intent intent = new Intent(context, XmppConnectionService.class);
+ final Intent intent = new Intent(context, XmppConnectionService.class);
intent.setAction(XmppConnectionService.ACTION_FCM_TOKEN_REFRESH);
- context.startService(intent);
+ if (Compatibility.runsAndTargetsTwentySix(context)) {
+ intent.putExtra(EventReceiver.EXTRA_NEEDS_FOREGROUND_SERVICE, true);
+ ContextCompat.startForegroundService(context, intent);
+ } else {
+ context.startService(intent);
+ }
} catch (IOException e) {
Log.d(Config.LOGTAG, "unable to renew instance token", e);
}
@@ -1,6 +1,7 @@
package eu.siacs.conversations.services;
import android.content.Intent;
+import android.support.v4.content.ContextCompat;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
@@ -9,6 +10,7 @@ import com.google.firebase.messaging.RemoteMessage;
import java.util.Map;
import eu.siacs.conversations.Config;
+import eu.siacs.conversations.utils.Compatibility;
public class PushMessageReceiver extends FirebaseMessagingService {
@@ -18,11 +20,16 @@ public class PushMessageReceiver extends FirebaseMessagingService {
Log.d(Config.LOGTAG,"PushMessageReceiver ignored message because no accounts are enabled");
return;
}
- Map<String, String> data = message.getData();
- Intent intent = new Intent(this, XmppConnectionService.class);
+ final Map<String, String> data = message.getData();
+ final Intent intent = new Intent(this, XmppConnectionService.class);
intent.setAction(XmppConnectionService.ACTION_FCM_MESSAGE_RECEIVED);
intent.putExtra("account", data.get("account"));
- startService(intent);
+ if (Compatibility.runsAndTargetsTwentySix(this)) {
+ intent.putExtra(EventReceiver.EXTRA_NEEDS_FOREGROUND_SERVICE, true);
+ ContextCompat.startForegroundService(this, intent);
+ } else {
+ startService(intent);
+ }
}
}