From 89c990a6b5c5cfdbb706511573d3790de3d7020a Mon Sep 17 00:00:00 2001 From: OliE Date: Wed, 31 Jan 2018 17:52:21 +0100 Subject: [PATCH] experimental Bluetooth search with new API. --- android_app/app/src/main/AndroidManifest.xml | 1 + .../gui/preferences/BluetoothPreferences.java | 99 ++++++++++--------- .../app/src/main/res/values/strings.xml | 1 + .../main/res/xml/bluetooth_preferences.xml | 2 +- 4 files changed, 56 insertions(+), 47 deletions(-) diff --git a/android_app/app/src/main/AndroidManifest.xml b/android_app/app/src/main/AndroidManifest.xml index 4747e06f..ed0d27c9 100644 --- a/android_app/app/src/main/AndroidManifest.xml +++ b/android_app/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java index 21ddcb28..1e914f05 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/BluetoothPreferences.java @@ -17,9 +17,12 @@ package com.health.openscale.gui.preferences; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Bundle; -import android.os.Handler; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; @@ -30,6 +33,7 @@ import android.preference.PreferenceGroup; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.widget.BaseAdapter; +import android.widget.Toast; import com.health.openscale.R; import com.health.openscale.core.bluetooth.BluetoothCommunication; @@ -50,66 +54,70 @@ public class BluetoothPreferences extends PreferenceFragment implements SharedPr private PreferenceScreen btScanner; private BluetoothAdapter btAdapter = null; - private Handler searchHandler = null; - private BluetoothAdapter.LeScanCallback scanCallback = null; private Map foundDevices = new HashMap<>(); public void startSearching() { foundDevices.clear(); - if (scanCallback == null) - { - scanCallback = new BluetoothAdapter.LeScanCallback() - { - @Override - public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { - if (device.getName() == null) { - return; - } - foundDevices.put(device.getAddress(), device.getName()); + IntentFilter filter = new IntentFilter(); - btScanner.removeAll(); + filter.addAction(BluetoothDevice.ACTION_FOUND); + filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); + filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); - for (Map.Entry entry : foundDevices.entrySet()) - { - if (getActivity() != null) { - Preference prefBtDevice = new Preference(getActivity().getBaseContext()); - prefBtDevice.setSummary(entry.getKey()); + getActivity().registerReceiver(mReceiver, filter); + btAdapter.startDiscovery(); + } - for (BluetoothCommunication.BT_DEVICE_ID btScaleID : BluetoothCommunication.BT_DEVICE_ID.values()) { - BluetoothCommunication btDevice = BluetoothCommunication.getBtDevice(getActivity().getBaseContext(), btScaleID); + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); - if (btDevice.checkDeviceName(entry.getValue())) { - prefBtDevice.setOnPreferenceClickListener(new onClickListenerDeviceSelect()); - prefBtDevice.setKey(entry.getKey()); - prefBtDevice.setIcon(R.drawable.ic_bluetooth_connection_lost); - prefBtDevice.setTitle(entry.getValue() + " [" + btDevice.deviceName() + "]"); - break; - } else { - prefBtDevice.setIcon(R.drawable.ic_bluetooth_disabled); - prefBtDevice.setTitle(entry.getValue() + " [" + getResources().getString(R.string.label_bt_device_no_support) + "]"); - } + if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { + //discovery starts, we can show progress dialog or perform other tasks + Toast.makeText(getActivity().getApplicationContext(), R.string.label_bluetooth_searching, Toast.LENGTH_SHORT).show(); + } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { + //discovery finishes, dismis progress dialog + Toast.makeText(getActivity().getApplicationContext(), R.string.label_bluetooth_searching_finished, Toast.LENGTH_SHORT).show(); + } else if (BluetoothDevice.ACTION_FOUND.equals(action)) { + //bluetooth device found + BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + + foundDevices.put(device.getAddress(), device.getName()); + + for (Map.Entry entry : foundDevices.entrySet()) { + if (getActivity() != null) { + Preference prefBtDevice = new Preference(getActivity().getBaseContext()); + prefBtDevice.setSummary(entry.getKey()); + + for (BluetoothCommunication.BT_DEVICE_ID btScaleID : BluetoothCommunication.BT_DEVICE_ID.values()) { + BluetoothCommunication btDevice = BluetoothCommunication.getBtDevice(getActivity().getBaseContext(), btScaleID); + + if (btDevice.checkDeviceName(entry.getValue())) { + prefBtDevice.setOnPreferenceClickListener(new onClickListenerDeviceSelect()); + prefBtDevice.setKey(entry.getKey()); + prefBtDevice.setIcon(R.drawable.ic_bluetooth_connection_lost); + prefBtDevice.setTitle(entry.getValue() + " [" + btDevice.deviceName() + "]"); + break; + } else { + prefBtDevice.setIcon(R.drawable.ic_bluetooth_disabled); + prefBtDevice.setTitle(entry.getValue() + " [" + getResources().getString(R.string.label_bt_device_no_support) + "]"); } - - btScanner.addPreference(prefBtDevice); } + + btScanner.addPreference(prefBtDevice); } } - }; - } - - - searchHandler.postDelayed(new Runnable() - { - @Override - public void run() - { - btAdapter.stopLeScan(scanCallback); } - }, 10000); + } + }; - btAdapter.startLeScan(scanCallback); + @Override + public void onDestroy() { + getActivity().unregisterReceiver(mReceiver); + + super.onDestroy(); } @Override @@ -117,7 +125,6 @@ public class BluetoothPreferences extends PreferenceFragment implements SharedPr super.onCreate(savedInstanceState); btAdapter = BluetoothAdapter.getDefaultAdapter(); - searchHandler = new Handler(); addPreferencesFromResource(R.xml.bluetooth_preferences); diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index 3b58369a..f9800ead 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -127,6 +127,7 @@ Bluetooth Search for scale on startup Searching for Bluetooth scales + Finished searching for Bluetooth scales Device Type Label on data point diff --git a/android_app/app/src/main/res/xml/bluetooth_preferences.xml b/android_app/app/src/main/res/xml/bluetooth_preferences.xml index 7a8cc53b..c3ca9691 100644 --- a/android_app/app/src/main/res/xml/bluetooth_preferences.xml +++ b/android_app/app/src/main/res/xml/bluetooth_preferences.xml @@ -4,7 +4,7 @@ android:key="btScanner" android:title="@string/label_device_type" android:persistent="false"> - +