From 96a992353b29d77f54af51f4e3b6c0c581d25fd3 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 1 Dec 2016 11:34:04 +0100 Subject: [PATCH] avoid binding multiple times from BarcodeService --- .../services/BarcodeProvider.java | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/BarcodeProvider.java b/src/main/java/eu/siacs/conversations/services/BarcodeProvider.java index 08ceb169a..8d00b33e1 100644 --- a/src/main/java/eu/siacs/conversations/services/BarcodeProvider.java +++ b/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"); } }