From 72ecb4caa630b63f66505ccb202a807b1af4e294 Mon Sep 17 00:00:00 2001 From: Sharvil Nanavati Date: Wed, 19 Aug 2015 11:17:31 -0700 Subject: [PATCH] Make location enabled check configurable when returning scan results. Some device classes (e.g. Wear) don't allow location to be enabled but would still like to allow LE scanning to take place. This patch allows the location enabled check to be bypassed if the platform is so configured. Even if the location check is disabled, the calling app must still have one of the location permissions. Bug: 21852542 Change-Id: I206366ce262776d4668c0c42e066f0e20f5fdfeb --- res/values/config.xml | 5 +++++ src/com/android/bluetooth/gatt/GattService.java | 20 ++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index 1f69654f..1684183b 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -28,4 +28,9 @@ true false false + + + true diff --git a/src/com/android/bluetooth/gatt/GattService.java b/src/com/android/bluetooth/gatt/GattService.java index fadcb214..a04d5a31 100644 --- a/src/com/android/bluetooth/gatt/GattService.java +++ b/src/com/android/bluetooth/gatt/GattService.java @@ -43,6 +43,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.util.Log; +import com.android.bluetooth.R; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.ProfileService; @@ -582,9 +583,6 @@ public class GattService extends ProfileService { void onScanResult(String address, int rssi, byte[] adv_data) { if (VDBG) Log.d(TAG, "onScanResult() - address=" + address + ", rssi=" + rssi); - boolean locationEnabled = Settings.Secure.getInt(getContentResolver(), - Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF) - != Settings.Secure.LOCATION_MODE_OFF; List remoteUuids = parseUuids(adv_data); for (ScanClient client : mScanManager.getRegularScanQueue()) { if (client.uuids.length > 0) { @@ -610,9 +608,7 @@ public class GattService extends ProfileService { rssi, SystemClock.elapsedRealtimeNanos()); // Do no report if location mode is OFF or the client has no location permission // PEERS_MAC_ADDRESS permission holders always get results - if ((client.hasPeersMacAddressPermission - || (locationEnabled && client.hasLocationPermission)) - && matchesFilters(client, result)) { + if (hasScanResultPermission(client) && matchesFilters(client, result)) { try { ScanSettings settings = client.settings; if ((settings.getCallbackType() & @@ -641,6 +637,18 @@ public class GattService extends ProfileService { } } + /** Determines if the given scan client has the appropriate permissions to receive callbacks. */ + private boolean hasScanResultPermission(final ScanClient client) { + final boolean requiresLocationEnabled = + getResources().getBoolean(R.bool.strict_location_check); + final boolean locationEnabled = Settings.Secure.getInt(getContentResolver(), + Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF) + != Settings.Secure.LOCATION_MODE_OFF; + + return (client.hasPeersMacAddressPermission || + (client.hasLocationPermission && (!requiresLocationEnabled || locationEnabled))); + } + // Check if a scan record matches a specific filters. private boolean matchesFilters(ScanClient client, ScanResult scanResult) { if (client.filters == null || client.filters.isEmpty()) { -- 2.11.0