aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main/java/eu/siacs/conversations/services/BarcodeProvider.java37
1 files 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 08ceb169..8d00b33e 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");
}
}