avoid binding multiple times from BarcodeService

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/BarcodeProvider.java | 37 
1 file changed, 22 insertions(+), 15 deletions(-)

Detailed changes

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

@@ -1,6 +1,5 @@
 package eu.siacs.conversations.services;
 
-import android.annotation.TargetApi;
 import android.content.ComponentName;
 import android.content.ContentProvider;
 import android.content.ContentValues;
@@ -11,7 +10,6 @@ import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.net.Uri;
-import android.os.Build;
 import android.os.CancellationSignal;
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
@@ -23,19 +21,15 @@ import com.google.zxing.EncodeHintType;
 import com.google.zxing.aztec.AztecWriter;
 import com.google.zxing.common.BitMatrix;
 
-import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Hashtable;
 
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.entities.Account;
 import eu.siacs.conversations.utils.CryptoHelper;
-import eu.siacs.conversations.xmpp.jid.InvalidJidException;
 import eu.siacs.conversations.xmpp.jid.Jid;
 
 public class BarcodeProvider extends ContentProvider implements ServiceConnection {
@@ -45,6 +39,7 @@ public class BarcodeProvider extends ContentProvider implements ServiceConnectio
     private final Object lock = new Object();
 
     private XmppConnectionService mXmppConnectionService;
+    private boolean mBindingInProcess = false;
 
     @Override
     public boolean onCreate() {
@@ -129,14 +124,19 @@ public class BarcodeProvider extends ContentProvider implements ServiceConnectio
 
     private boolean connectAndWait() {
         Intent intent = new Intent(getContext(), XmppConnectionService.class);
-        intent.setAction("contact_chooser");
+        intent.setAction(this.getClass().getSimpleName());
         Context context = getContext();
         if (context != null) {
-            context.startService(intent);
-            context.bindService(intent, this, Context.BIND_AUTO_CREATE);
+            synchronized (this) {
+                if (mXmppConnectionService == null && !mBindingInProcess) {
+                    Log.d(Config.LOGTAG,"calling to bind service");
+                    context.startService(intent);
+                    context.bindService(intent, this, Context.BIND_AUTO_CREATE);
+                    this.mBindingInProcess = true;
+                }
+            }
             try {
                 waitForService();
-                Log.d(Config.LOGTAG, "service initialized");
                 return true;
             } catch (InterruptedException e) {
                 return false;
@@ -149,16 +149,21 @@ public class BarcodeProvider extends ContentProvider implements ServiceConnectio
 
     @Override
     public void onServiceConnected(ComponentName name, IBinder service) {
-        XmppConnectionService.XmppConnectionBinder binder = (XmppConnectionService.XmppConnectionBinder) service;
-        mXmppConnectionService = binder.getService();
-        synchronized (this.lock) {
-            lock.notifyAll();
+        synchronized (this) {
+            XmppConnectionService.XmppConnectionBinder binder = (XmppConnectionService.XmppConnectionBinder) service;
+            mXmppConnectionService = binder.getService();
+            mBindingInProcess = false;
+            synchronized (this.lock) {
+                lock.notifyAll();
+            }
         }
     }
 
     @Override
     public void onServiceDisconnected(ComponentName name) {
-        mXmppConnectionService = null;
+        synchronized (this) {
+            mXmppConnectionService = null;
+        }
     }
 
     private void waitForService() throws InterruptedException {
@@ -166,6 +171,8 @@ public class BarcodeProvider extends ContentProvider implements ServiceConnectio
             synchronized (this.lock) {
                 lock.wait();
             }
+        } else {
+            Log.d(Config.LOGTAG,"not waiting for service because already initialized");
         }
     }