From c831cf77ccf9ecfa792d0ffdc84f272053fa945a Mon Sep 17 00:00:00 2001 From: n8fr8 Date: Thu, 10 Sep 2015 04:23:58 -0400 Subject: [PATCH] Many changes to swap workflow to get Bluetooth to work - don't try to start BT in the background. you can only start/stop a BT server once, else new connections don't work - be more mindful of reading/writing bytes from the input/output streams... make sure bytes are available, because you will block forever if you do not do that - use the device class tag to filter devices in discovery instead of the fdroid name tag - this now successfully connects but there is an error in the certificate fingerprint verification still --- F-Droid/src/org/fdroid/fdroid/data/App.java | 2 +- .../fdroid/localrepo/LocalRepoManager.java | 7 +- .../fdroid/fdroid/localrepo/SwapService.java | 9 ++- .../localrepo/peers/BluetoothFinder.java | 11 ++- .../fdroid/localrepo/type/BluetoothSwap.java | 54 +++++++++----- .../fdroid/localrepo/type/SwapType.java | 4 +- .../fdroid/net/BluetoothDownloader.java | 10 ++- .../src/org/fdroid/fdroid/net/Downloader.java | 26 +++++-- .../org/fdroid/fdroid/net/HttpDownloader.java | 14 +++- .../fdroid/net/bluetooth/BluetoothClient.java | 2 + .../net/bluetooth/BluetoothConnection.java | 6 +- .../net/bluetooth/BluetoothConstants.java | 2 + .../fdroid/net/bluetooth/BluetoothServer.java | 4 +- .../fdroid/net/bluetooth/httpish/Request.java | 71 ++++++++++++++----- .../views/swap/SwapWorkflowActivity.java | 2 +- 15 files changed, 171 insertions(+), 53 deletions(-) diff --git a/F-Droid/src/org/fdroid/fdroid/data/App.java b/F-Droid/src/org/fdroid/fdroid/data/App.java index d759ece7d..f7d9261e4 100644 --- a/F-Droid/src/org/fdroid/fdroid/data/App.java +++ b/F-Droid/src/org/fdroid/fdroid/data/App.java @@ -241,7 +241,7 @@ public class App extends ValueObject implements Comparable { PackageManager.GET_META_DATA); installerPackageLabel = installerAppInfo.loadLabel(pm); } catch (PackageManager.NameNotFoundException e) { - Log.w(TAG, "Could not get app info", e); + Log.w(TAG, "Could not get app info: " + installerPackageName); } } if (TextUtils.isEmpty(installerPackageLabel)) diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/LocalRepoManager.java b/F-Droid/src/org/fdroid/fdroid/localrepo/LocalRepoManager.java index c23278e83..7af43940d 100644 --- a/F-Droid/src/org/fdroid/fdroid/localrepo/LocalRepoManager.java +++ b/F-Droid/src/org/fdroid/fdroid/localrepo/LocalRepoManager.java @@ -486,8 +486,12 @@ public class LocalRepoManager { } public void writeIndexJar() throws IOException { + + FileWriter writer; + try { - new IndexXmlBuilder(context, apps).build(xmlIndex); + writer = new FileWriter(xmlIndex); + new IndexXmlBuilder(context, apps).build(writer); } catch (Exception e) { Log.e(TAG, "Could not write index jar", e); Toast.makeText(context, R.string.failed_to_create_index, Toast.LENGTH_LONG).show(); @@ -512,6 +516,7 @@ public class LocalRepoManager { bi.close(); jo.close(); bo.close(); + writer.close(); try { LocalRepoKeyStore.get(context).signZip(xmlIndexJarUnsigned, xmlIndexJar); diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/SwapService.java b/F-Droid/src/org/fdroid/fdroid/localrepo/SwapService.java index b5aa52b27..0be6ac6ea 100644 --- a/F-Droid/src/org/fdroid/fdroid/localrepo/SwapService.java +++ b/F-Droid/src/org/fdroid/fdroid/localrepo/SwapService.java @@ -108,13 +108,17 @@ public class SwapService extends Service { public void scanForPeers() { Log.d(TAG, "Scanning for nearby devices to swap with..."); + bonjourFinder.scan(); bluetoothFinder.scan(); + } public void stopScanningForPeers() { + bonjourFinder.cancel(); bluetoothFinder.cancel(); + } @@ -530,10 +534,11 @@ public class SwapService extends Service { filter.addAction(WIFI_STATE_CHANGE); LocalBroadcastManager.getInstance(this).registerReceiver(receiveSwapStatusChanged, filter); + /** if (wasBluetoothEnabled()) { Log.d(TAG, "Previously the user enabled Bluetooth swap, so enabling again automatically."); bluetoothSwap.startInBackground(); - } + }*/ if (wasWifiEnabled()) { Log.d(TAG, "Previously the user enabled Wifi swap, so enabling again automatically."); @@ -574,7 +579,7 @@ public class SwapService extends Service { public void disableAllSwapping() { Log.i(TAG, "Asked to stop swapping, will stop bluetooth, wifi, and move service to BG for GC."); - getBluetoothSwap().stopInBackground(); + // getBluetoothSwap().stopInBackground(); getWifiSwap().stopInBackground(); // Ensure the user is sent back go the first screen when returning if we have just forceably diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothFinder.java b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothFinder.java index fc74cd245..2bc86a8bd 100644 --- a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothFinder.java +++ b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothFinder.java @@ -1,6 +1,7 @@ package org.fdroid.fdroid.localrepo.peers; import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; @@ -92,9 +93,17 @@ public class BluetoothFinder extends PeerFinder { } private void onDeviceFound(BluetoothDevice device) { - if (device != null && device.getName() != null && device.getName().startsWith(BluetoothSwap.BLUETOOTH_NAME_TAG)) { + + if(device != null && device.getName() != null && + (device.getBluetoothClass().getDeviceClass() == BluetoothClass.Device.COMPUTER_HANDHELD_PC_PDA|| + device.getBluetoothClass().getDeviceClass() == BluetoothClass.Device.COMPUTER_PALM_SIZE_PC_PDA|| + device.getBluetoothClass().getDeviceClass() == BluetoothClass.Device.PHONE_SMART)) + { foundPeer(new BluetoothPeer(device)); } + // if (device != null && device.getName() != null && device.getName().startsWith(BluetoothSwap.BLUETOOTH_NAME_TAG)) { + // foundPeer(new BluetoothPeer(device)); + // } } } diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/type/BluetoothSwap.java b/F-Droid/src/org/fdroid/fdroid/localrepo/type/BluetoothSwap.java index 10dab0ea8..333fca470 100644 --- a/F-Droid/src/org/fdroid/fdroid/localrepo/type/BluetoothSwap.java +++ b/F-Droid/src/org/fdroid/fdroid/localrepo/type/BluetoothSwap.java @@ -5,6 +5,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.os.AsyncTask; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; @@ -17,8 +18,11 @@ public class BluetoothSwap extends SwapType { private static final String TAG = "BluetoothBroadcastType"; public final static String BLUETOOTH_NAME_TAG = "FDroid:"; + private static BluetoothSwap mInstance = null; + @NonNull private final BluetoothAdapter adapter; + private BroadcastReceiver receiver; @Nullable private BluetoothServer server; @@ -30,7 +34,10 @@ public class BluetoothSwap extends SwapType { if (adapter == null) { return new NoBluetoothType(context); } else { - return new BluetoothSwap(context, adapter); + if (mInstance == null) + mInstance = new BluetoothSwap(context, adapter); + + return mInstance; } } @@ -38,7 +45,21 @@ public class BluetoothSwap extends SwapType { super(context); this.adapter = adapter; - context.registerReceiver(new BroadcastReceiver() { + + } + + @Override + public boolean isConnected() { + return server != null && server.isRunning() && super.isConnected(); + } + + @Override + public synchronized void start() { + + if (isConnected()) + return; + + receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { switch (intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, -1)) { @@ -55,29 +76,25 @@ public class BluetoothSwap extends SwapType { // Only other is BluetoothAdapter.SCAN_MODE_CONNECTABLE. For now don't handle that. } } - }, new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED)); - } + }; + context.registerReceiver(receiver, new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED)); - @Override - public boolean isConnected() { - return server != null && server.isRunning() && super.isConnected(); - } - - @Override - public void start() { + /* if (server != null) { Log.d(TAG, "Attempting to start Bluetooth swap, but it appears to be running already. Will cancel it so it can be restarted."); server.close(); server = null; - } + }*/ - server = new BluetoothServer(this, context.getFilesDir()); + if (server == null) + server = new BluetoothServer(this, context.getFilesDir()); sendBroadcast(SwapService.EXTRA_STARTING); //store the original bluetoothname, and update this one to be unique deviceBluetoothName = adapter.getName(); + /* Log.d(TAG, "Prefixing Bluetooth adapter name with " + BLUETOOTH_NAME_TAG + " to make it identifiable as a swap device."); if (!deviceBluetoothName.startsWith(BLUETOOTH_NAME_TAG)) adapter.setName(BLUETOOTH_NAME_TAG + deviceBluetoothName); @@ -85,7 +102,7 @@ public class BluetoothSwap extends SwapType { if (!adapter.getName().startsWith(BLUETOOTH_NAME_TAG)) { Log.e(TAG, "Couldn't change the name of the Bluetooth adapter, it will not get recognized by other swap clients."); // TODO: Should we bail here? - } + }*/ if (!adapter.isEnabled()) { Log.d(TAG, "Bluetooth adapter is disabled, attempting to enable."); @@ -96,8 +113,8 @@ public class BluetoothSwap extends SwapType { } } - if (adapter.isEnabled()) { - server.start(); + if (adapter.isEnabled()) + { setConnected(true); } else { Log.i(TAG, "Didn't start Bluetooth swapping server, because Bluetooth is disabled and couldn't be enabled."); @@ -110,6 +127,11 @@ public class BluetoothSwap extends SwapType { if (server != null && server.isAlive()) { server.close(); setConnected(false); + + // if (receiver != null) { +// context.unregisterReceiver(receiver); + // receiver = null; + // } } else { Log.i(TAG, "Attempting to stop Bluetooth swap, but it is not currently running."); } diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/type/SwapType.java b/F-Droid/src/org/fdroid/fdroid/localrepo/type/SwapType.java index 1e6f781a1..afb82b1a3 100644 --- a/F-Droid/src/org/fdroid/fdroid/localrepo/type/SwapType.java +++ b/F-Droid/src/org/fdroid/fdroid/localrepo/type/SwapType.java @@ -64,13 +64,15 @@ public abstract class SwapType { } public void startInBackground() { + start(); + /** new AsyncTask() { @Override protected Void doInBackground(Void... params) { start(); return null; } - }.execute(); + }.execute();*/ } public void ensureRunning() { diff --git a/F-Droid/src/org/fdroid/fdroid/net/BluetoothDownloader.java b/F-Droid/src/org/fdroid/fdroid/net/BluetoothDownloader.java index b9d6e2e40..610a30ee4 100644 --- a/F-Droid/src/org/fdroid/fdroid/net/BluetoothDownloader.java +++ b/F-Droid/src/org/fdroid/fdroid/net/BluetoothDownloader.java @@ -3,6 +3,7 @@ package org.fdroid.fdroid.net; import android.content.Context; import android.util.Log; import org.apache.commons.io.input.BoundedInputStream; +import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.net.bluetooth.BluetoothClient; import org.fdroid.fdroid.net.bluetooth.BluetoothConnection; import org.fdroid.fdroid.net.bluetooth.FileDetails; @@ -13,6 +14,8 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.nio.Buffer; +import java.io.BufferedReader; public class BluetoothDownloader extends Downloader { @@ -30,9 +33,11 @@ public class BluetoothDownloader extends Downloader { @Override public InputStream getInputStream() throws IOException { - Response response = Request.createGET(sourcePath, connection).send(); + Request request = Request.createGET(sourcePath, connection); + Response response = request.send(); fileDetails = response.toFileDetails(); + // TODO: Manage the dependency which includes this class better? // Right now, I only needed the one class from apache commons. // There are countless classes online which provide this functionality, @@ -76,7 +81,8 @@ public class BluetoothDownloader extends Downloader { @Override public void download() throws IOException, InterruptedException { - downloadFromStream(); + downloadFromStream(1024); + connection.closeQuietly(); } @Override diff --git a/F-Droid/src/org/fdroid/fdroid/net/Downloader.java b/F-Droid/src/org/fdroid/fdroid/net/Downloader.java index 90a4e4f05..ffe250669 100644 --- a/F-Droid/src/org/fdroid/fdroid/net/Downloader.java +++ b/F-Droid/src/org/fdroid/fdroid/net/Downloader.java @@ -7,12 +7,15 @@ import android.util.Log; import org.fdroid.fdroid.Utils; +import java.io.BufferedInputStream; +import java.io.BufferedReader; 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.io.Reader; import java.net.MalformedURLException; import java.net.URL; @@ -98,7 +101,7 @@ public abstract class Downloader { public abstract boolean isCached(); - protected void downloadFromStream() throws IOException, InterruptedException { + protected void downloadFromStream(int bufferSize) throws IOException, InterruptedException { Utils.DebugLog(TAG, "Downloading from stream"); InputStream input = null; try { @@ -108,7 +111,7 @@ public abstract class Downloader { // we were interrupted before proceeding to the download. throwExceptionIfInterrupted(); - copyInputToOutputStream(input); + copyInputToOutputStream(input, bufferSize); } finally { Utils.closeQuietly(outputStream); Utils.closeQuietly(input); @@ -143,20 +146,30 @@ public abstract class Downloader { * keeping track of the number of bytes that have flowed through for the * progress counter. */ - protected void copyInputToOutputStream(InputStream input) throws IOException, InterruptedException { + protected void copyInputToOutputStream(InputStream input, int bufferSize) throws IOException, InterruptedException { - byte[] buffer = new byte[Utils.BUFFER_SIZE]; int bytesRead = 0; this.totalBytes = totalDownloadSize(); + byte[] buffer = new byte[bufferSize]; // Getting the total download size could potentially take time, depending on how // it is implemented, so we may as well check this before we proceed. throwExceptionIfInterrupted(); sendProgress(bytesRead, totalBytes); - while (true) { + while (bytesRead < totalBytes) { + + int count = -1; + + if (input.available()>0) { + + int readLength = Math.min(input.available(), buffer.length); + count = input.read(buffer, 0, readLength); + } + else { + count = input.read(buffer); + } - int count = input.read(buffer); throwExceptionIfInterrupted(); if (count == -1) { @@ -167,6 +180,7 @@ public abstract class Downloader { bytesRead += count; sendProgress(bytesRead, totalBytes); outputStream.write(buffer, 0, count); + } outputStream.flush(); } diff --git a/F-Droid/src/org/fdroid/fdroid/net/HttpDownloader.java b/F-Droid/src/org/fdroid/fdroid/net/HttpDownloader.java index 241a73cee..495827e6e 100644 --- a/F-Droid/src/org/fdroid/fdroid/net/HttpDownloader.java +++ b/F-Droid/src/org/fdroid/fdroid/net/HttpDownloader.java @@ -9,10 +9,13 @@ import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Utils; +import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.MalformedURLException; @@ -58,10 +61,15 @@ public class HttpDownloader extends Downloader { * same one twice, bail with an exception). * @throws IOException */ - @Override + public InputStream getInputStream() throws IOException { setupConnection(); - return connection.getInputStream(); + return new BufferedInputStream(connection.getInputStream()); + } + + public BufferedReader getBufferedReader () throws IOException + { + return new BufferedReader(new InputStreamReader(getInputStream())); } // Get a remote file. Returns the HTTP response code. @@ -117,7 +125,7 @@ public class HttpDownloader extends Downloader { Utils.DebugLog(TAG, sourceUrl + " is cached, so not downloading (HTTP " + statusCode + ")"); } else { Utils.DebugLog(TAG, "Downloading from " + sourceUrl); - downloadFromStream(); + downloadFromStream(4096); updateCacheCheck(); } } diff --git a/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothClient.java b/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothClient.java index b488f552e..831ed64f0 100644 --- a/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothClient.java +++ b/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothClient.java @@ -25,6 +25,8 @@ public class BluetoothClient { } public BluetoothConnection openConnection() throws IOException { + + BluetoothSocket socket = null; try { socket = device.createInsecureRfcommSocketToServiceRecord(BluetoothConstants.fdroidUuid()); diff --git a/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothConnection.java b/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothConnection.java index bc1d5bcf5..fec164087 100644 --- a/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothConnection.java +++ b/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothConnection.java @@ -7,6 +7,8 @@ import android.os.Build; import android.util.Log; import org.fdroid.fdroid.Utils; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -39,8 +41,8 @@ public class BluetoothConnection { socket.connect(); } - input = socket.getInputStream(); - output = socket.getOutputStream(); + input = new BufferedInputStream(socket.getInputStream()); + output = new BufferedOutputStream(socket.getOutputStream()); Log.d(TAG, "Opened connection to Bluetooth device"); } diff --git a/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothConstants.java b/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothConstants.java index 35d7024cf..5d38d71a0 100644 --- a/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothConstants.java +++ b/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothConstants.java @@ -13,6 +13,8 @@ public class BluetoothConstants { // want to do so. // This UUID is just from mashing random hex characters on the keyboard. return UUID.fromString("cd59ba31-5729-b3bb-cb29-732b59eb61aa"); + + } } diff --git a/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothServer.java b/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothServer.java index 2379ceba6..a895dfd98 100644 --- a/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothServer.java +++ b/F-Droid/src/org/fdroid/fdroid/net/bluetooth/BluetoothServer.java @@ -40,6 +40,8 @@ public class BluetoothServer extends Thread { public BluetoothServer(BluetoothSwap swap, File webRoot) { this.webRoot = webRoot; this.swap = swap; + + start(); } public boolean isRunning() { return isRunning; } @@ -81,7 +83,7 @@ public class BluetoothServer extends Thread { try { BluetoothSocket clientSocket = serverSocket.accept(); if (clientSocket != null) { - if (!isInterrupted()) { + if (isInterrupted()) { Log.d(TAG, "Server stopped after socket accepted from client, but before initiating connection."); break; } diff --git a/F-Droid/src/org/fdroid/fdroid/net/bluetooth/httpish/Request.java b/F-Droid/src/org/fdroid/fdroid/net/bluetooth/httpish/Request.java index afed47312..ec55f7591 100644 --- a/F-Droid/src/org/fdroid/fdroid/net/bluetooth/httpish/Request.java +++ b/F-Droid/src/org/fdroid/fdroid/net/bluetooth/httpish/Request.java @@ -5,9 +5,14 @@ import org.fdroid.fdroid.net.bluetooth.BluetoothConnection; import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.OutputStreamWriter; +import java.io.Reader; +import java.io.Writer; import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -27,16 +32,16 @@ public class Request { private Map headers; private BluetoothConnection connection; - private BufferedWriter output; - private BufferedReader input; + private Writer output; + private InputStream input; private Request(String method, String path, BluetoothConnection connection) { this.method = method; this.path = path; this.connection = connection; - output = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream())); - input = new BufferedReader(new InputStreamReader(connection.getInputStream())); + output = new OutputStreamWriter(connection.getOutputStream()); + input = connection.getInputStream(); } public static Request createHEAD(String path, BluetoothConnection connection) @@ -93,7 +98,7 @@ public class Request { */ private boolean listen() throws IOException { - String requestLine = input.readLine(); + String requestLine = readLine(); if (requestLine == null || requestLine.trim().length() == 0) return false; @@ -125,11 +130,8 @@ public class Request { * a space, and then the status label (which may contain spaces). */ private int readResponseCode() throws IOException { - String line = input.readLine(); - if (line == null) { - // TODO: What to do? - return -1; - } + + String line = readLine(); // TODO: Error handling int firstSpace = line.indexOf(' '); @@ -139,6 +141,36 @@ public class Request { return Integer.parseInt(status); } + private String readLine () throws IOException + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + String line = null; + + while (line == null) { + + while (input.available()>0) { + + int b = input.read(); + + + if (((char)b) == '\n') { + if (baos.size() > 0) + line = new String(baos.toByteArray()); + + return line; + } + + baos.write(b); + + } + + try { Thread.sleep(100); } + catch (Exception e){}; + } + + return line; + } + /** * Subsequent lines (after the status line) represent the headers, which are case * insensitive and may be multi-line. We don't deal with multi-line headers in @@ -146,15 +178,22 @@ public class Request { */ private Map readHeaders() throws IOException { Map headers = new HashMap<>(); - String responseLine = input.readLine(); - while (responseLine != null && responseLine.length() > 0) { + String responseLine = readLine(); + while (responseLine != null) { // TODO: Error handling String[] parts = responseLine.split(":"); - String header = parts[0].trim(); - String value = parts[1].trim(); - headers.put(header, value); - responseLine = input.readLine(); + if (parts.length > 1) { + String header = parts[0].trim(); + String value = parts[1].trim(); + headers.put(header, value); + } + + if (input.available()>0) + responseLine = readLine(); + else + break; + } return headers; } diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java b/F-Droid/src/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java index df2f96cdd..6b0cbca16 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java +++ b/F-Droid/src/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java @@ -625,7 +625,7 @@ public class SwapWorkflowActivity extends AppCompatActivity { Log.d(TAG, "Not currently in discoverable mode, so prompting user to enable."); Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); - intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); // TODO: What about when this expires? What if user manually disables discovery? + intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600); // 3600 is new maximum! TODO: What about when this expires? What if user manually disables discovery? startActivityForResult(intent, REQUEST_BLUETOOTH_DISCOVERABLE); }