From 14c0508e8863a94e8a86ec4b3da3bb98a2c34de2 Mon Sep 17 00:00:00 2001 From: "David G. Young" Date: Wed, 10 May 2017 12:12:42 -0400 Subject: [PATCH 1/3] Fix failure to stop scans when unbind() is called or between scan period is not zero --- .../org/altbeacon/beacon/service/scanner/CycledLeScanner.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScanner.java b/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScanner.java index 33691685b..2a68e7bb4 100644 --- a/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScanner.java +++ b/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScanner.java @@ -157,6 +157,8 @@ public void stop() { mScanningEnabled = false; if (mScanCyclerStarted) { scanLeDevice(false); + LogManager.d(TAG, "forcing scanning to stop even for devices capable of multiple detections per cycle"); + stopScan(); } else { LogManager.d(TAG, "scanning already stopped"); } @@ -285,7 +287,7 @@ private void finishScanCycle() { // so it is best avoided. If we know the device has detected to distinct // packets in the same cycle, we will not restart scanning and just keep it // going. - if (!getDistinctPacketsDetectedPerScan()) { + if (!getDistinctPacketsDetectedPerScan() || mBetweenScanPeriod != 0) { long now = SystemClock.elapsedRealtime(); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && mBetweenScanPeriod+mScanPeriod < ANDROID_N_MIN_SCAN_CYCLE_MILLIS && From 243f790de255b00b3719fcd35c33be6efeed02d4 Mon Sep 17 00:00:00 2001 From: "David G. Young" Date: Wed, 10 May 2017 12:15:26 -0400 Subject: [PATCH 2/3] Update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e60f54f81..49b4e00e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ Enhancements: Bug Fixes: -- TODO +- Fix failure to stop scanning when unbinding from service or when the between scan period + is nonzero. (#507, David G. Young) ### 2.10 / 2017-04-21 From 61a7133c47a600ec303a1b2fba772cc970981dfb Mon Sep 17 00:00:00 2001 From: "David G. Young" Date: Wed, 10 May 2017 15:57:56 -0400 Subject: [PATCH 3/3] Wait to shut down Handler Thread used start/stop scans to avoid leaving scanning on --- .../beacon/service/scanner/CycledLeScanner.java | 17 ++++++++++++++--- .../scanner/CycledLeScannerForLollipop.java | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScanner.java b/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScanner.java index 2a68e7bb4..4b6782339 100644 --- a/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScanner.java +++ b/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScanner.java @@ -157,8 +157,6 @@ public void stop() { mScanningEnabled = false; if (mScanCyclerStarted) { scanLeDevice(false); - LogManager.d(TAG, "forcing scanning to stop even for devices capable of multiple detections per cycle"); - stopScan(); } else { LogManager.d(TAG, "scanning already stopped"); } @@ -173,7 +171,20 @@ public void setDistinctPacketsDetectedPerScan(boolean detected) { } public void destroy() { - mScanThread.quit(); + LogManager.d(TAG, "Destroying"); + // We cannot quit the thread used by the handler until queued Runnables have been processed, + // because the handler is what stops scanning, and we do not want scanning left on. + // So we stop the thread using the handler, so we make sure it happens after all other + // waiting Runnables are finished. + mHandler.post(new Runnable() { + @Override + public void run() { + LogManager.d(TAG, "Quitting scan thread"); + // Remove any postDelayed Runnables queued for the next scan cycle + mHandler.removeCallbacksAndMessages(null); + mScanThread.quit(); + } + }); } protected abstract void stopScan(); diff --git a/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScannerForLollipop.java b/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScannerForLollipop.java index 82251314d..44a2fa9e0 100644 --- a/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScannerForLollipop.java +++ b/src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScannerForLollipop.java @@ -223,6 +223,7 @@ private void postStopLeScan() { @Override public void run() { try { + LogManager.d(TAG, "Stopping LE scan on scan handler"); scanner.stopScan(scanCallback); } catch (IllegalStateException e) { LogManager.w(TAG, "Cannot stop scan. Bluetooth may be turned off.");