explicitly start service (instead of just bind) service from contact chooser

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java |  9 
src/main/java/eu/siacs/conversations/services/EventReceiver.java               | 11 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java       |  1 
src/main/java/eu/siacs/conversations/utils/Compatibility.java                  | 18 
src/main/java/eu/siacs/conversations/xml/Element.java                          |  8 
src/playstore/java/eu/siacs/conversations/services/MaintenanceReceiver.java    |  7 
src/playstore/java/eu/siacs/conversations/services/PushMessageReceiver.java    | 22 
7 files changed, 34 insertions(+), 42 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java 🔗

@@ -18,6 +18,7 @@ import java.util.List;
 
 import eu.siacs.conversations.entities.Conversation;
 import eu.siacs.conversations.ui.ConversationsActivity;
+import eu.siacs.conversations.utils.Compatibility;
 
 @TargetApi(Build.VERSION_CODES.M)
 public class ContactChooserTargetService extends ChooserTargetService implements ServiceConnection {
@@ -37,10 +38,14 @@ public class ContactChooserTargetService extends ChooserTargetService implements
 
     @Override
     public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) {
-        Intent intent = new Intent(this, XmppConnectionService.class);
+        final ArrayList<ChooserTarget> chooserTargets = new ArrayList<>();
+        if (!EventReceiver.hasEnabledAccounts(this)) {
+            return chooserTargets;
+        }
+        final Intent intent = new Intent(this, XmppConnectionService.class);
         intent.setAction("contact_chooser");
+        Compatibility.startService(this, intent);
         bindService(intent, this, Context.BIND_AUTO_CREATE);
-        ArrayList<ChooserTarget> chooserTargets = new ArrayList<>();
         try {
             waitForService();
             final ArrayList<Conversation> conversations = new ArrayList<>();

src/main/java/eu/siacs/conversations/services/EventReceiver.java 🔗

@@ -25,16 +25,7 @@ public class EventReceiver extends BroadcastReceiver {
         }
         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");
-            }
+            Compatibility.startService(context, intentForService);
         } else {
             Log.d(Config.LOGTAG, "EventReceiver ignored action " + intentForService.getAction());
         }

src/main/java/eu/siacs/conversations/utils/Compatibility.java 🔗

@@ -1,6 +1,7 @@
 package eu.siacs.conversations.utils;
 
 import android.content.Context;
+import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -10,15 +11,19 @@ import android.preference.PreferenceCategory;
 import android.preference.PreferenceManager;
 import android.support.annotation.BoolRes;
 import android.support.v4.content.ContextCompat;
+import android.util.Log;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.ui.SettingsActivity;
 import eu.siacs.conversations.ui.SettingsFragment;
 
+import static eu.siacs.conversations.services.EventReceiver.EXTRA_NEEDS_FOREGROUND_SERVICE;
+
 public class Compatibility {
 
     private static final List<String> UNUSED_SETTINGS_POST_TWENTYSIX = Arrays.asList(
@@ -94,4 +99,17 @@ public class Compatibility {
             }
         }
     }
+
+    public static void startService(Context context, Intent intent) {
+        try {
+            if (Compatibility.runsAndTargetsTwentySix(context)) {
+                intent.putExtra(EXTRA_NEEDS_FOREGROUND_SERVICE, true);
+                ContextCompat.startForegroundService(context, intent);
+            } else {
+                context.startService(intent);
+            }
+        } catch (RuntimeException e) {
+            Log.d(Config.LOGTAG, context.getClass().getSimpleName()+" was unable to start service");
+        }
+    }
 }

src/main/java/eu/siacs/conversations/xml/Element.java 🔗

@@ -76,7 +76,7 @@ public class Element {
 	}
 
 	private String findInternationalizedChildContent(String name, @NonNull String language) {
-		HashMap<String,String> contents = new HashMap<>();
+		final HashMap<String,String> contents = new HashMap<>();
 		for(Element child : this.children) {
 			if (name.equals(child.getName())) {
 				String lang = child.getAttribute("xml:lang");
@@ -90,12 +90,12 @@ public class Element {
 				}
 			}
 		}
-
-		String value = contents.get(null);
+		final String value = contents.get(null);
 		if (value != null) {
 			return value;
 		}
-		return contents.size() > 0 ? contents.values().iterator().next() : null;
+		final String[] values = contents.values().toArray(new String[0]);
+		return values.length == 0 ? null : values[0];
 	}
 
 	public Element findChild(String name, String xmlns) {

src/playstore/java/eu/siacs/conversations/services/MaintenanceReceiver.java 🔗

@@ -29,12 +29,7 @@ public class MaintenanceReceiver extends BroadcastReceiver {
 				FirebaseInstanceId.getInstance().deleteInstanceId();
 				final Intent intent = new Intent(context, XmppConnectionService.class);
 				intent.setAction(XmppConnectionService.ACTION_FCM_TOKEN_REFRESH);
-				if (Compatibility.runsAndTargetsTwentySix(context)) {
-					intent.putExtra(EventReceiver.EXTRA_NEEDS_FOREGROUND_SERVICE, true);
-					ContextCompat.startForegroundService(context, intent);
-				} else {
-					context.startService(intent);
-				}
+				Compatibility.startService(context, intent);
 			} catch (IOException e) {
 				Log.d(Config.LOGTAG, "unable to renew instance token", e);
 			}

src/playstore/java/eu/siacs/conversations/services/PushMessageReceiver.java 🔗

@@ -24,16 +24,7 @@ public class PushMessageReceiver extends FirebaseMessagingService {
 		final Intent intent = new Intent(this, XmppConnectionService.class);
 		intent.setAction(XmppConnectionService.ACTION_FCM_MESSAGE_RECEIVED);
 		intent.putExtra("account", data.get("account"));
-		try {
-			if (Compatibility.runsAndTargetsTwentySix(this)) {
-				intent.putExtra(EventReceiver.EXTRA_NEEDS_FOREGROUND_SERVICE, true);
-				ContextCompat.startForegroundService(this, intent);
-			} else {
-				startService(intent);
-			}
-		} catch (IllegalStateException e) {
-			Log.e(Config.LOGTAG,"PushMessageReceiver is not allowed to start service after receiving message");
-		}
+		Compatibility.startService(this, intent);
 	}
 
 	@Override
@@ -44,16 +35,7 @@ public class PushMessageReceiver extends FirebaseMessagingService {
 		}
 		final Intent intent = new Intent(this, XmppConnectionService.class);
 		intent.setAction(XmppConnectionService.ACTION_FCM_TOKEN_REFRESH);
-		try {
-			if (Compatibility.runsAndTargetsTwentySix(this)) {
-				intent.putExtra(EventReceiver.EXTRA_NEEDS_FOREGROUND_SERVICE, true);
-				ContextCompat.startForegroundService(this, intent);
-			} else {
-				startService(intent);
-			}
-		} catch (IllegalStateException e) {
-			Log.e(Config.LOGTAG,"PushMessageReceiver is not allowed to start service after receiving new token");
-		}
+		Compatibility.startService(this, intent);
 	}
 
 }