diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java index 2ba857dab..056cdd6c4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java @@ -198,6 +198,8 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView } } }; + int CallbackType = android.bluetooth.le.ScanSettings.CALLBACK_TYPE_ALL_MATCHES; + int MatchMode = android.bluetooth.le.ScanSettings.MATCH_MODE_STICKY; public void logMessageContent(byte[] value) { if (value != null) { @@ -654,17 +656,17 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView private ScanSettings getScanSettings() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { return new ScanSettings.Builder() - .setCallbackType(android.bluetooth.le.ScanSettings.CALLBACK_TYPE_ALL_MATCHES) + .setCallbackType(CallbackType) .setScanMode(android.bluetooth.le.ScanSettings.SCAN_MODE_LOW_LATENCY) - .setMatchMode(android.bluetooth.le.ScanSettings.MATCH_MODE_AGGRESSIVE) + .setMatchMode(MatchMode) .setPhy(android.bluetooth.le.ScanSettings.PHY_LE_ALL_SUPPORTED) .setNumOfMatches(android.bluetooth.le.ScanSettings.MATCH_NUM_ONE_ADVERTISEMENT) .build(); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return new ScanSettings.Builder() - .setCallbackType(android.bluetooth.le.ScanSettings.CALLBACK_TYPE_ALL_MATCHES) + .setCallbackType(CallbackType) .setScanMode(android.bluetooth.le.ScanSettings.SCAN_MODE_LOW_LATENCY) - .setMatchMode(android.bluetooth.le.ScanSettings.MATCH_MODE_AGGRESSIVE) + .setMatchMode(MatchMode) .setNumOfMatches(android.bluetooth.le.ScanSettings.MATCH_NUM_ONE_ADVERTISEMENT) .build(); } else { @@ -910,6 +912,26 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView if (oldBleScanning) { LOG.info("New BLE scanning disabled via settings, using old method"); } + int level = prefs.getInt("scanning_intensity", 1); + switch (level) { + case 0: + CallbackType = android.bluetooth.le.ScanSettings.CALLBACK_TYPE_FIRST_MATCH; + MatchMode = android.bluetooth.le.ScanSettings.MATCH_MODE_STICKY; + break; + case 1: + CallbackType = android.bluetooth.le.ScanSettings.CALLBACK_TYPE_FIRST_MATCH; + MatchMode = android.bluetooth.le.ScanSettings.MATCH_MODE_AGGRESSIVE; + break; + case 2: + CallbackType = android.bluetooth.le.ScanSettings.CALLBACK_TYPE_ALL_MATCHES; + MatchMode = android.bluetooth.le.ScanSettings.MATCH_MODE_STICKY; + break; + case 3: + CallbackType = android.bluetooth.le.ScanSettings.CALLBACK_TYPE_ALL_MATCHES; + MatchMode = android.bluetooth.le.ScanSettings.MATCH_MODE_AGGRESSIVE; + break; + } + LOG.debug("Device discovery - scanning level: " + level + " " + CallbackType + " " + MatchMode); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryPairingPreferenceActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryPairingPreferenceActivity.java index af76e320c..27c862058 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryPairingPreferenceActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryPairingPreferenceActivity.java @@ -18,14 +18,33 @@ package nodomain.freeyourgadget.gadgetbridge.activities; import android.os.Bundle; +import android.preference.Preference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.util.Prefs; public class DiscoveryPairingPreferenceActivity extends AbstractSettingsActivity { + private static final Logger LOG = LoggerFactory.getLogger(AbstractSettingsActivity.class); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.discovery_pairing_preferences); + + final Prefs prefs = GBApplication.getPrefs(); + final Preference pref = findPreference("scanning_intensity"); + pref.setSummary(String.valueOf(prefs.getInt("scanning_intensity", 2))); + + pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + preference.setSummary(newVal.toString()); + return true; + } + }); } @Override protected void onPostCreate(Bundle savedInstanceState) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c6a361c0..ebbebec6a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -387,6 +387,8 @@ Minimum time between fetches Fetches every %d minutes + Scanning intensity + If you experience freezing or unresponsiveness, try to set Scanning intensity to lower level. If your device is not being discovered, try to set Scanning intensity to higher level. Disable new BLE scanning Check this option if your device cannot be found during discovery Not connected diff --git a/app/src/main/res/xml/discovery_pairing_preferences.xml b/app/src/main/res/xml/discovery_pairing_preferences.xml index d7eba907a..21f8362cc 100644 --- a/app/src/main/res/xml/discovery_pairing_preferences.xml +++ b/app/src/main/res/xml/discovery_pairing_preferences.xml @@ -1,5 +1,6 @@ - + @@ -27,5 +28,17 @@ android:layout="@layout/preference_checkbox" android:summary="@string/discover_unsupported_devices_description" android:title="@string/discover_unsupported_devices" /> + + +