diff --git a/app/src/main/java/com/espressif/ui/activities/AddDeviceActivity.kt b/app/src/main/java/com/espressif/ui/activities/AddDeviceActivity.kt index ddec250d91..6a6541a286 100644 --- a/app/src/main/java/com/espressif/ui/activities/AddDeviceActivity.kt +++ b/app/src/main/java/com/espressif/ui/activities/AddDeviceActivity.kt @@ -80,7 +80,7 @@ class AddDeviceActivity : AppCompatActivity() { setContentView(binding.root) intent = Intent() sharedPreferences = getSharedPreferences(AppConstants.ESP_PREFERENCES, Context.MODE_PRIVATE) - provisionManager = ESPProvisionManager.getInstance(applicationContext) + provisionManager = ESPProvisionManager.getInstance(applicationContext).scanTimeout(10_000) initViews() EventBus.getDefault().register(this) } @@ -157,7 +157,7 @@ class AddDeviceActivity : AppCompatActivity() { override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, - grantResults: IntArray + grantResults: IntArray, ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) updatePermissionErrorText() diff --git a/app/src/main/java/com/espressif/ui/activities/EspMainActivity.java b/app/src/main/java/com/espressif/ui/activities/EspMainActivity.java index 9438ca9bf4..7e2f9b6e5f 100644 --- a/app/src/main/java/com/espressif/ui/activities/EspMainActivity.java +++ b/app/src/main/java/com/espressif/ui/activities/EspMainActivity.java @@ -70,7 +70,7 @@ protected void onCreate(Bundle savedInstanceState) { initViews(); sharedPreferences = getSharedPreferences(AppConstants.ESP_PREFERENCES, Context.MODE_PRIVATE); - provisionManager = ESPProvisionManager.getInstance(getApplicationContext()); + provisionManager = ESPProvisionManager.getInstance(getApplicationContext()).scanTimeout(10_000); } @Override diff --git a/app/src/main/java/com/espressif/ui/activities/ManualProvBaseActivity.java b/app/src/main/java/com/espressif/ui/activities/ManualProvBaseActivity.java index 68a24a2432..e65c94f9f0 100644 --- a/app/src/main/java/com/espressif/ui/activities/ManualProvBaseActivity.java +++ b/app/src/main/java/com/espressif/ui/activities/ManualProvBaseActivity.java @@ -46,7 +46,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_provision_landing); securityType = getIntent().getIntExtra(AppConstants.KEY_SECURITY_TYPE, AppConstants.SEC_TYPE_DEFAULT); - provisionManager = ESPProvisionManager.getInstance(getApplicationContext()); + provisionManager = ESPProvisionManager.getInstance(getApplicationContext()).scanTimeout(10_000); sharedPreferences = getSharedPreferences(AppConstants.ESP_PREFERENCES, Context.MODE_PRIVATE); EventBus.getDefault().register(this); } diff --git a/app/src/main/java/com/espressif/ui/activities/ProofOfPossessionActivity.java b/app/src/main/java/com/espressif/ui/activities/ProofOfPossessionActivity.java index 5020742a50..5a86cb2927 100644 --- a/app/src/main/java/com/espressif/ui/activities/ProofOfPossessionActivity.java +++ b/app/src/main/java/com/espressif/ui/activities/ProofOfPossessionActivity.java @@ -60,7 +60,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pop); - provisionManager = ESPProvisionManager.getInstance(getApplicationContext()); + provisionManager = ESPProvisionManager.getInstance(getApplicationContext()).scanTimeout(10_000); initViews(); EventBus.getDefault().register(this); diff --git a/app/src/main/java/com/espressif/ui/activities/ProvisionActivity.java b/app/src/main/java/com/espressif/ui/activities/ProvisionActivity.java index 9c1667d15b..cefde6afb6 100644 --- a/app/src/main/java/com/espressif/ui/activities/ProvisionActivity.java +++ b/app/src/main/java/com/espressif/ui/activities/ProvisionActivity.java @@ -30,10 +30,10 @@ import com.espressif.AppConstants; import com.espressif.provisioning.DeviceConnectionEvent; -import com.espressif.wifi_provisioning.R; import com.espressif.provisioning.ESPConstants; import com.espressif.provisioning.ESPProvisionManager; import com.espressif.provisioning.listeners.ProvisionListener; +import com.espressif.wifi_provisioning.R; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -65,7 +65,7 @@ protected void onCreate(Bundle savedInstanceState) { ssidValue = intent.getStringExtra(AppConstants.KEY_WIFI_SSID); passphraseValue = intent.getStringExtra(AppConstants.KEY_WIFI_PASSWORD); dataset = intent.getStringExtra(AppConstants.KEY_THREAD_DATASET); - provisionManager = ESPProvisionManager.getInstance(getApplicationContext()); + provisionManager = ESPProvisionManager.getInstance(getApplicationContext()).scanTimeout(10_000); initViews(); EventBus.getDefault().register(this); diff --git a/app/src/main/java/com/espressif/ui/activities/ThreadConfigActivity.java b/app/src/main/java/com/espressif/ui/activities/ThreadConfigActivity.java index 22c6905626..0da33c18b6 100644 --- a/app/src/main/java/com/espressif/ui/activities/ThreadConfigActivity.java +++ b/app/src/main/java/com/espressif/ui/activities/ThreadConfigActivity.java @@ -71,7 +71,7 @@ protected void onCreate(Bundle savedInstanceState) { handler = new Handler(); threadNetworkList = new ArrayList<>(); - provisionManager = ESPProvisionManager.getInstance(getApplicationContext()); + provisionManager = ESPProvisionManager.getInstance(getApplicationContext()).scanTimeout(10_000); scanCapAvailable = getIntent().getBooleanExtra(AppConstants.KEY_THREAD_SCAN_AVAILABLE, false); initViews(); diff --git a/app/src/main/java/com/espressif/ui/activities/WiFiConfigActivity.java b/app/src/main/java/com/espressif/ui/activities/WiFiConfigActivity.java index fcb5f8ac4f..b1b626903b 100644 --- a/app/src/main/java/com/espressif/ui/activities/WiFiConfigActivity.java +++ b/app/src/main/java/com/espressif/ui/activities/WiFiConfigActivity.java @@ -53,7 +53,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_wifi_config); - provisionManager = ESPProvisionManager.getInstance(getApplicationContext()); + provisionManager = ESPProvisionManager.getInstance(getApplicationContext()).scanTimeout(10_000); initViews(); EventBus.getDefault().register(this); } diff --git a/app/src/main/java/com/espressif/ui/activities/WiFiScanActivity.java b/app/src/main/java/com/espressif/ui/activities/WiFiScanActivity.java index 7d3752d6db..fec083d675 100644 --- a/app/src/main/java/com/espressif/ui/activities/WiFiScanActivity.java +++ b/app/src/main/java/com/espressif/ui/activities/WiFiScanActivity.java @@ -79,7 +79,7 @@ protected void onCreate(Bundle savedInstanceState) { wifiAPList = new ArrayList<>(); handler = new Handler(); - provisionManager = ESPProvisionManager.getInstance(getApplicationContext()); + provisionManager = ESPProvisionManager.getInstance(getApplicationContext()).scanTimeout(10_000); String deviceName = provisionManager.getEspDevice().getDeviceName(); String wifiMsg = String.format(getString(R.string.setup_instructions), deviceName); diff --git a/app/src/main/java/com/espressif/ui/utils/Utils.java b/app/src/main/java/com/espressif/ui/utils/Utils.java index d34e5c5976..8307771cfa 100644 --- a/app/src/main/java/com/espressif/ui/utils/Utils.java +++ b/app/src/main/java/com/espressif/ui/utils/Utils.java @@ -48,7 +48,7 @@ public static void displayDeviceConnectionError(Activity aContext, String msg) { @Override public void onClick(DialogInterface dialog, int which) { - ESPProvisionManager provisionManager = ESPProvisionManager.getInstance(aContext.getApplicationContext()); + ESPProvisionManager provisionManager = ESPProvisionManager.getInstance(aContext.getApplicationContext()).scanTimeout(10_000); if (provisionManager.getEspDevice() != null) { provisionManager.getEspDevice().disconnectDevice(); } diff --git a/provisioning/src/main/java/com/espressif/provisioning/ESPProvisionManager.java b/provisioning/src/main/java/com/espressif/provisioning/ESPProvisionManager.java index d47f9af6b3..f59e91c635 100644 --- a/provisioning/src/main/java/com/espressif/provisioning/ESPProvisionManager.java +++ b/provisioning/src/main/java/com/espressif/provisioning/ESPProvisionManager.java @@ -82,9 +82,10 @@ public class ESPProvisionManager { private ESPDevice espDevice; private BleScanner bleScanner; private WiFiScanner wifiScanner; - private Context context; - private Handler handler; + private final Context context; + private final Handler handler; private boolean isScanned = false; + private long timeout = 6000; /** * This method is used to get singleton instance of @@ -105,6 +106,17 @@ private ESPProvisionManager(Context context) { handler = new Handler(); } + /** + * This method is to set the timeout for Bluetooth scanning + * + * @param timeout timeout + * @return Returns ESPProvisionManager + */ + public ESPProvisionManager scanTimeout(long timeout) { + this.timeout = timeout; + return this; + } + /** * This method is used to get ESPDevice object with given transport and security. * @@ -343,7 +355,7 @@ private void processQrCode(String qrCode, QRCodeScanListener qrCodeScanListener) transportType = ESPConstants.TransportType.TRANSPORT_BLE; } else { - Log.e(TAG, "" + transport + " Transport type is not supported"); + Log.e(TAG, transport + " Transport type is not supported"); qrCodeScanListener.onFailure(new RuntimeException("Transport type is not supported"), qrCode); return; } @@ -424,11 +436,11 @@ public void analyze(ImageProxy imageProxy) { * @param filters The scan filters that will be used * @param bleScannerListener BleScanListener for scanning callbacks. */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH_SCAN}) public void searchBleEspDevices(List filters, BleScanListener bleScannerListener) { Log.d(TAG, "Search for BLE devices"); - bleScanner = new BleScanner(context, bleScannerListener); + bleScanner = new BleScanner(context, timeout, bleScannerListener); bleScanner.startScan(filters); } @@ -438,11 +450,11 @@ public void searchBleEspDevices(List filters, BleScanListener bleSca * @param scanSettings The scan settings that will be used * @param bleScannerListener BleScanListener for scanning callbacks. */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH_SCAN}) public void searchBleEspDevices(ScanSettings scanSettings, BleScanListener bleScannerListener) { Log.d(TAG, "Search for BLE devices"); - bleScanner = new BleScanner(context, bleScannerListener); + bleScanner = new BleScanner(context, timeout, bleScannerListener); bleScanner.startScan(scanSettings); } @@ -453,11 +465,11 @@ public void searchBleEspDevices(ScanSettings scanSettings, BleScanListener bleSc * @param scanSettings The scan settings that will be used * @param bleScannerListener BleScanListener for scanning callbacks. */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH_SCAN}) public void searchBleEspDevices(List filters, ScanSettings scanSettings, BleScanListener bleScannerListener) { Log.d(TAG, "Search for BLE devices"); - bleScanner = new BleScanner(context, bleScannerListener); + bleScanner = new BleScanner(context, timeout, bleScannerListener); bleScanner.startScan(filters, scanSettings); } @@ -466,11 +478,11 @@ public void searchBleEspDevices(List filters, ScanSettings scanSetti * * @param bleScannerListener BleScanListener for scanning callbacks. */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH_SCAN}) public void searchBleEspDevices(BleScanListener bleScannerListener) { Log.d(TAG, "Search for BLE devices"); - bleScanner = new BleScanner(context, bleScannerListener); + bleScanner = new BleScanner(context, timeout, bleScannerListener); bleScanner.startScan(); } @@ -480,18 +492,18 @@ public void searchBleEspDevices(BleScanListener bleScannerListener) { * @param prefix Prefix to filter devices from device name. * @param bleScannerListener BleScanListener for scanning callbacks. */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH_SCAN}) public void searchBleEspDevices(String prefix, BleScanListener bleScannerListener) { Log.d(TAG, "Search for BLE devices"); - bleScanner = new BleScanner(context, prefix, bleScannerListener); + bleScanner = new BleScanner(context, prefix, timeout, bleScannerListener); bleScanner.startScan(); } /** * This method is used to stop BLE scanning. */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH_SCAN}) public void stopBleScan() { if (bleScanner != null) { @@ -558,9 +570,9 @@ private ESPConstants.SecurityType setSecurityType(int security) { class SearchDeviceTask implements Runnable { - private ESPDevice device; - private QRCodeScanListener listener; - private String password; + private final ESPDevice device; + private final QRCodeScanListener listener; + private final String password; SearchDeviceTask(ESPDevice device1, String password1, QRCodeScanListener listener1) { searchCnt++; @@ -573,7 +585,7 @@ class SearchDeviceTask implements Runnable { @Override @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_STATE, - Manifest.permission.ACCESS_WIFI_STATE}) + Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.BLUETOOTH_SCAN}) public void run() { if (device.getTransportType().equals(ESPConstants.TransportType.TRANSPORT_BLE)) { @@ -596,7 +608,7 @@ public void onPeripheralFound(BluetoothDevice btDevice, ScanResult scanResult) { isDeviceFound = true; String serviceUuid = ""; - if (scanResult.getScanRecord().getServiceUuids() != null && scanResult.getScanRecord().getServiceUuids().size() > 0) { + if (scanResult.getScanRecord().getServiceUuids() != null && !scanResult.getScanRecord().getServiceUuids().isEmpty()) { serviceUuid = scanResult.getScanRecord().getServiceUuids().get(0).toString(); } @@ -620,7 +632,7 @@ public void scanCompleted() { SearchDeviceTask searchDeviceTask = new SearchDeviceTask(device, password, listener); handler.postDelayed(searchDeviceTask, 500); } else { - String errMsg = "" + device.getDeviceName() + " device not found"; + String errMsg = device.getDeviceName() + " device not found"; listener.onFailure(new RuntimeException(errMsg)); } } else { @@ -643,7 +655,7 @@ public void onFailure(Exception e) { SearchDeviceTask searchDeviceTask = new SearchDeviceTask(device, password, listener); handler.postDelayed(searchDeviceTask, 500); } else { - String errMsg = "" + device.getDeviceName() + " device not found"; + String errMsg = device.getDeviceName() + " device not found"; listener.onFailure(new RuntimeException(errMsg)); } } @@ -680,7 +692,7 @@ public void onWifiListReceived(ArrayList scanResults) { SearchDeviceTask searchDeviceTask = new SearchDeviceTask(device, password, listener); handler.postDelayed(searchDeviceTask, 500); } else { - String errMsg = "" + device.getDeviceName() + " device not found"; + String errMsg = device.getDeviceName() + " device not found"; listener.onFailure(new RuntimeException(errMsg)); } } @@ -702,7 +714,7 @@ public void onWiFiScanFailed(Exception e) { SearchDeviceTask searchDeviceTask = new SearchDeviceTask(device, password, listener); handler.postDelayed(searchDeviceTask, 500); } else { - String errMsg = "" + device.getDeviceName() + " device not found"; + String errMsg = device.getDeviceName() + " device not found"; listener.onFailure(new RuntimeException(errMsg)); } } diff --git a/provisioning/src/main/java/com/espressif/provisioning/device_scanner/BleScanner.java b/provisioning/src/main/java/com/espressif/provisioning/device_scanner/BleScanner.java index 9b459cc2e5..f1a227f65f 100644 --- a/provisioning/src/main/java/com/espressif/provisioning/device_scanner/BleScanner.java +++ b/provisioning/src/main/java/com/espressif/provisioning/device_scanner/BleScanner.java @@ -41,35 +41,33 @@ public class BleScanner { private static final String TAG = "ESP:" + BleScanner.class.getSimpleName(); - private static final long SCAN_TIME_OUT = 6000; + private final long SCAN_TIME_OUT; - private Handler handler; - private BleScanListener bleScanListener; - private BluetoothAdapter bluetoothAdapter; + private final Handler handler; + private final BleScanListener bleScanListener; + private final BluetoothAdapter bluetoothAdapter; private BluetoothLeScanner bluetoothLeScanner; private boolean isScanning = false; private String prefix = ""; - public BleScanner(Context context, BleScanListener bleScannerListener) { - + public BleScanner(Context context, long timeout, BleScanListener bleScannerListener) { this.bleScanListener = bleScannerListener; + this.SCAN_TIME_OUT = timeout; handler = new Handler(); - BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE); bluetoothAdapter = bluetoothManager.getAdapter(); } - public BleScanner(Context context, String prefix, BleScanListener bleScannerListener) { - - this(context, bleScannerListener); + public BleScanner(Context context, String prefix, long timeout, BleScanListener bleScannerListener) { + this(context, timeout, bleScannerListener); this.prefix = prefix; } /** * This method is used to start BLE scan. */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH_SCAN}) public void startScan() { List filters = new ArrayList<>(); ScanSettings settings = new ScanSettings.Builder() @@ -83,7 +81,7 @@ public void startScan() { * * @param filters The scan filters that will be used */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH_SCAN}) public void startScan(List filters) { ScanSettings settings = new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_BALANCED) @@ -96,7 +94,7 @@ public void startScan(List filters) { * * @param scanSettings The scan settings that will be used */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH_SCAN}) public void startScan(ScanSettings scanSettings) { List filters = new ArrayList<>(); startScan(filters, scanSettings); @@ -108,7 +106,7 @@ public void startScan(ScanSettings scanSettings) { * @param filters The scan filters that will be used * @param scanSettings The scan settings that will be used */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH_SCAN}) public void startScan(List filters, ScanSettings scanSettings) { if (!bluetoothAdapter.isEnabled()) { @@ -126,7 +124,7 @@ public void startScan(List filters, ScanSettings scanSettings) { /** * This method is used to start BLE scan. */ - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_SCAN}) public void stopScan() { Log.d(TAG, "Stop BLE device scan"); @@ -156,7 +154,7 @@ public boolean isScanning() { private Runnable stopScanTask = new Runnable() { @Override - @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH}) + @RequiresPermission(allOf = {Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_SCAN}) public void run() { stopScan(); }