From a8fa6339fb2359b75d28f6638cf570163e81eea2 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Wed, 30 Mar 2016 10:38:38 +0100
Subject: [PATCH] Don't disable Bluetooth, always reuse the connection.

---
 .../keyagreement/KeyAgreementActivity.java    |  2 +-
 .../keyagreement/ShowQrCodeFragment.java      | 37 ++++++-------------
 .../api/contact/ContactExchangeTask.java      |  2 +-
 .../contact/ContactExchangeTaskImpl.java      | 20 +++-------
 .../briarproject/contact/ContactModule.java   | 11 ++----
 5 files changed, 24 insertions(+), 48 deletions(-)

diff --git a/briar-android/src/org/briarproject/android/keyagreement/KeyAgreementActivity.java b/briar-android/src/org/briarproject/android/keyagreement/KeyAgreementActivity.java
index 516e4c6e5a..185d3c0b1e 100644
--- a/briar-android/src/org/briarproject/android/keyagreement/KeyAgreementActivity.java
+++ b/briar-android/src/org/briarproject/android/keyagreement/KeyAgreementActivity.java
@@ -184,7 +184,7 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
 				contactExchangeTask.startExchange(KeyAgreementActivity.this,
 						localAuthor, result.getMasterKey(),
 						result.getConnection(), result.getTransportId(),
-						result.wasAlice(), true);
+						result.wasAlice());
 			}
 		});
 	}
diff --git a/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java b/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java
index 7845033dfa..df18a12fce 100644
--- a/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java
+++ b/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java
@@ -27,12 +27,11 @@ import org.briarproject.android.AndroidComponent;
 import org.briarproject.android.fragment.BaseEventFragment;
 import org.briarproject.android.util.AndroidUtils;
 import org.briarproject.android.util.CameraView;
-import org.briarproject.android.util.QrCodeUtils;
 import org.briarproject.android.util.QrCodeDecoder;
+import org.briarproject.android.util.QrCodeUtils;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.KeyAgreementAbortedEvent;
 import org.briarproject.api.event.KeyAgreementFailedEvent;
-import org.briarproject.api.event.KeyAgreementFinishedEvent;
 import org.briarproject.api.event.KeyAgreementListeningEvent;
 import org.briarproject.api.event.KeyAgreementStartedEvent;
 import org.briarproject.api.event.KeyAgreementWaitingEvent;
@@ -43,7 +42,6 @@ import org.briarproject.api.keyagreement.PayloadEncoder;
 import org.briarproject.api.keyagreement.PayloadParser;
 
 import java.io.IOException;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.Logger;
 
 import javax.inject.Inject;
@@ -57,6 +55,7 @@ import static android.widget.LinearLayout.VERTICAL;
 import static android.widget.Toast.LENGTH_LONG;
 import static java.util.logging.Level.WARNING;
 
+@SuppressWarnings("deprecation")
 public class ShowQrCodeFragment extends BaseEventFragment
 		implements QrCodeDecoder.ResultCallback {
 
@@ -77,14 +76,14 @@ public class ShowQrCodeFragment extends BaseEventFragment
 	private TextView status;
 	private ImageView qrCode;
 
-	private volatile KeyAgreementTask task;
-	private volatile boolean toggleBluetooth;
-	private volatile BluetoothAdapter adapter;
 	private BluetoothStateReceiver receiver;
-	private AtomicBoolean waitingForBluetooth = new AtomicBoolean();
 	private QrCodeDecoder decoder;
 	private boolean gotRemotePayload;
 
+	private volatile KeyAgreementTask task;
+	private volatile BluetoothAdapter adapter;
+	private volatile boolean waitingForBluetooth;
+
 	public static ShowQrCodeFragment newInstance() {
 		Bundle args = new Bundle();
 		ShowQrCodeFragment fragment = new ShowQrCodeFragment();
@@ -132,10 +131,7 @@ public class ShowQrCodeFragment extends BaseEventFragment
 		boolean portrait = display.getWidth() < display.getHeight();
 		qrLayout.setOrientation(portrait ? VERTICAL : HORIZONTAL);
 
-		// Only enable BT adapter if it is not already on.
 		adapter = BluetoothAdapter.getDefaultAdapter();
-		if (adapter != null)
-			toggleBluetooth = !adapter.isEnabled();
 	}
 
 	@Override
@@ -148,9 +144,10 @@ public class ShowQrCodeFragment extends BaseEventFragment
 		receiver = new BluetoothStateReceiver();
 		getActivity().registerReceiver(receiver, filter);
 
-		if (adapter != null && toggleBluetooth) {
-			waitingForBluetooth.set(true);
-			toggleBluetooth(true);
+		// Enable BT adapter if it is not already on.
+		if (adapter != null && !adapter.isEnabled()) {
+			waitingForBluetooth = true;
+			AndroidUtils.enableBluetooth(adapter, true);
 		} else
 			startListening();
 	}
@@ -190,17 +187,10 @@ public class ShowQrCodeFragment extends BaseEventFragment
 			@Override
 			public void run() {
 				task.stopListening();
-				if (toggleBluetooth) toggleBluetooth(false);
 			}
 		}).start();
 	}
 
-	private void toggleBluetooth(boolean enable) {
-		if (adapter != null) {
-			AndroidUtils.enableBluetooth(adapter, enable);
-		}
-	}
-
 	private void openCamera() {
 		AsyncTask<Void, Void, Camera> openTask =
 				new AsyncTask<Void, Void, Camera>() {
@@ -286,9 +276,6 @@ public class ShowQrCodeFragment extends BaseEventFragment
 		} else if (e instanceof KeyAgreementAbortedEvent) {
 			KeyAgreementAbortedEvent event = (KeyAgreementAbortedEvent) e;
 			keyAgreementAborted(event.didRemoteAbort());
-		} else if (e instanceof KeyAgreementFinishedEvent) {
-			// We want to reuse the connection, so don't disable Bluetooth
-			toggleBluetooth = false;
 		}
 	}
 
@@ -374,9 +361,9 @@ public class ShowQrCodeFragment extends BaseEventFragment
 		@Override
 		public void onReceive(Context ctx, Intent intent) {
 			int state = intent.getIntExtra(EXTRA_STATE, 0);
-			if (state == STATE_ON && waitingForBluetooth.get()) {
+			if (state == STATE_ON && waitingForBluetooth) {
 				LOG.info("Bluetooth enabled");
-				waitingForBluetooth.set(false);
+				waitingForBluetooth = false;
 				startListening();
 			}
 		}
diff --git a/briar-api/src/org/briarproject/api/contact/ContactExchangeTask.java b/briar-api/src/org/briarproject/api/contact/ContactExchangeTask.java
index fe00530903..0d85850f6f 100644
--- a/briar-api/src/org/briarproject/api/contact/ContactExchangeTask.java
+++ b/briar-api/src/org/briarproject/api/contact/ContactExchangeTask.java
@@ -16,5 +16,5 @@ public interface ContactExchangeTask {
 	void startExchange(ContactExchangeListener listener,
 			LocalAuthor localAuthor, SecretKey masterSecret,
 			DuplexTransportConnection conn, TransportId transportId,
-			boolean alice, boolean reuseConnection);
+			boolean alice);
 }
diff --git a/briar-core/src/org/briarproject/contact/ContactExchangeTaskImpl.java b/briar-core/src/org/briarproject/contact/ContactExchangeTaskImpl.java
index 53f0fab7b0..7219460e6b 100644
--- a/briar-core/src/org/briarproject/contact/ContactExchangeTaskImpl.java
+++ b/briar-core/src/org/briarproject/contact/ContactExchangeTaskImpl.java
@@ -22,7 +22,6 @@ import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.plugins.duplex.DuplexTransportConnection;
 import org.briarproject.api.system.Clock;
-import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
 import org.briarproject.api.transport.StreamWriterFactory;
 
@@ -51,7 +50,6 @@ public class ContactExchangeTaskImpl extends Thread
 	private final ConnectionManager connectionManager;
 	private final ContactManager contactManager;
 	private final CryptoComponent crypto;
-	private final KeyManager keyManager;
 	private final StreamReaderFactory streamReaderFactory;
 	private final StreamWriterFactory streamWriterFactory;
 
@@ -61,14 +59,12 @@ public class ContactExchangeTaskImpl extends Thread
 	private TransportId transportId;
 	private SecretKey masterSecret;
 	private boolean alice;
-	private boolean reuseConnection;
 
 	public ContactExchangeTaskImpl(AuthorFactory authorFactory,
 			BdfReaderFactory bdfReaderFactory,
 			BdfWriterFactory bdfWriterFactory, Clock clock,
 			ConnectionManager connectionManager, ContactManager contactManager,
-			CryptoComponent crypto, KeyManager keyManager,
-			StreamReaderFactory streamReaderFactory,
+			CryptoComponent crypto, StreamReaderFactory streamReaderFactory,
 			StreamWriterFactory streamWriterFactory) {
 		this.authorFactory = authorFactory;
 		this.bdfReaderFactory = bdfReaderFactory;
@@ -77,7 +73,6 @@ public class ContactExchangeTaskImpl extends Thread
 		this.connectionManager = connectionManager;
 		this.contactManager = contactManager;
 		this.crypto = crypto;
-		this.keyManager = keyManager;
 		this.streamReaderFactory = streamReaderFactory;
 		this.streamWriterFactory = streamWriterFactory;
 	}
@@ -86,14 +81,13 @@ public class ContactExchangeTaskImpl extends Thread
 	public void startExchange(ContactExchangeListener listener,
 			LocalAuthor localAuthor, SecretKey masterSecret,
 			DuplexTransportConnection conn, TransportId transportId,
-			boolean alice, boolean reuseConnection) {
+			boolean alice) {
 		this.listener = listener;
 		this.localAuthor = localAuthor;
 		this.conn = conn;
 		this.transportId = transportId;
 		this.masterSecret = masterSecret;
 		this.alice = alice;
-		this.reuseConnection = reuseConnection;
 		start();
 	}
 
@@ -164,9 +158,8 @@ public class ContactExchangeTaskImpl extends Thread
 			ContactId contactId =
 					addContact(remoteAuthor, masterSecret, timestamp, true);
 			// Reuse the connection as a transport connection
-			if (reuseConnection)
-				connectionManager
-						.manageOutgoingConnection(contactId, transportId, conn);
+			connectionManager.manageOutgoingConnection(contactId, transportId,
+					conn);
 			// Pseudonym exchange succeeded
 			LOG.info("Pseudonym exchange succeeded");
 			listener.contactExchangeSucceeded(remoteAuthor);
@@ -235,9 +228,8 @@ public class ContactExchangeTaskImpl extends Thread
 	private ContactId addContact(Author remoteAuthor, SecretKey master,
 			long timestamp, boolean alice) throws DbException {
 		// Add the contact to the database
-		ContactId contactId = contactManager.addContact(remoteAuthor,
-				localAuthor.getId(), master, timestamp, alice, true);
-		return contactId;
+		return contactManager.addContact(remoteAuthor, localAuthor.getId(),
+				master, timestamp, alice, true);
 	}
 
 	private void tryToClose(DuplexTransportConnection conn,
diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java
index 77da9366fc..fb5c290ce2 100644
--- a/briar-core/src/org/briarproject/contact/ContactModule.java
+++ b/briar-core/src/org/briarproject/contact/ContactModule.java
@@ -10,7 +10,6 @@ import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.plugins.ConnectionManager;
 import org.briarproject.api.system.Clock;
-import org.briarproject.api.transport.KeyManager;
 import org.briarproject.api.transport.StreamReaderFactory;
 import org.briarproject.api.transport.StreamWriterFactory;
 
@@ -41,12 +40,10 @@ public class ContactModule {
 			AuthorFactory authorFactory, BdfReaderFactory bdfReaderFactory,
 			BdfWriterFactory bdfWriterFactory, Clock clock,
 			ConnectionManager connectionManager, ContactManager contactManager,
-			CryptoComponent crypto, KeyManager keyManager,
-			StreamReaderFactory streamReaderFactory,
+			CryptoComponent crypto, StreamReaderFactory streamReaderFactory,
 			StreamWriterFactory streamWriterFactory) {
-		return new ContactExchangeTaskImpl(authorFactory,
-				bdfReaderFactory, bdfWriterFactory, clock, connectionManager,
-				contactManager, crypto, keyManager, streamReaderFactory,
-				streamWriterFactory);
+		return new ContactExchangeTaskImpl(authorFactory, bdfReaderFactory,
+				bdfWriterFactory, clock, connectionManager, contactManager,
+				crypto, streamReaderFactory, streamWriterFactory);
 	}
 }
-- 
GitLab