avoid binding multiple times from BarcodeService

This commit is contained in:
Daniel Gultsch 2016-12-01 11:34:04 +01:00
parent c62f3f99be
commit 96a992353b

View file

@ -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");
}
}