Loading AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ <uses-permission android:name="android.permission.DEVICE_POWER" /> <uses-permission android:name="android.permission.REAL_GET_TASKS" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" /> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" /> <!-- For PBAP Owner Vcard Info --> <uses-permission android:name="android.permission.READ_PROFILE"/> Loading src/com/android/bluetooth/btservice/AdapterService.java +12 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.BatteryStats; import android.os.Binder; import android.os.Bundle; import android.os.Handler; Loading @@ -47,6 +48,7 @@ import android.os.PowerManager; import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.text.TextUtils; import android.util.Base64; Loading @@ -58,6 +60,7 @@ import com.android.bluetooth.a2dp.A2dpSinkService; import com.android.bluetooth.hid.HidService; import com.android.bluetooth.hfp.HeadsetService; import com.android.bluetooth.sdp.SdpManager; import com.android.internal.app.IBatteryStats; import com.android.internal.R; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.RemoteDevices.DeviceProperties; Loading Loading @@ -184,6 +187,7 @@ public class AdapterService extends Service { private AlarmManager mAlarmManager; private PendingIntent mPendingAlarm; private IBatteryStats mBatteryStats; private PowerManager mPowerManager; private PowerManager.WakeLock mWakeLock; private String mWakeLockName; Loading Loading @@ -407,6 +411,8 @@ public class AdapterService extends Service { getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDNAME); mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService( BatteryStats.SERVICE_NAME)); mSdpManager = SdpManager.init(this); registerReceiver(mAlarmBroadcastReceiver, new IntentFilter(ACTION_ALARM_WAKEUP)); Loading Loading @@ -451,6 +457,12 @@ public class AdapterService extends Service { mJniCallbacks.init(mBondStateMachine,mRemoteDevices); try { mBatteryStats.noteResetBleScan(); } catch (RemoteException e) { // Ignore. } //FIXME: Set static instance here??? setAdapterService(this); Loading src/com/android/bluetooth/gatt/GattService.java +16 −5 Original line number Diff line number Diff line Loading @@ -37,10 +37,12 @@ import android.bluetooth.le.ScanRecord; import android.bluetooth.le.ScanResult; import android.bluetooth.le.ScanSettings; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.os.ParcelUuid; import android.os.RemoteException; import android.os.SystemClock; import android.os.WorkSource; import android.provider.Settings; import android.util.Log; Loading Loading @@ -316,10 +318,12 @@ public class GattService extends ProfileService { @Override public void startScan(int appIf, boolean isServer, ScanSettings settings, List<ScanFilter> filters, List storages, String callingPackage) { List<ScanFilter> filters, WorkSource workSource, List storages, String callingPackage) { GattService service = getService(); if (service == null) return; service.startScan(appIf, isServer, settings, filters, storages, callingPackage); service.startScan(appIf, isServer, settings, filters, workSource, storages, callingPackage); } public void stopScan(int appIf, boolean isServer) { Loading Loading @@ -1215,14 +1219,21 @@ public class GattService extends ProfileService { } void startScan(int appIf, boolean isServer, ScanSettings settings, List<ScanFilter> filters, List<List<ResultStorageDescriptor>> storages, String callingPackage) { List<ScanFilter> filters, WorkSource workSource, List<List<ResultStorageDescriptor>> storages, String callingPackage) { if (DBG) Log.d(TAG, "start scan with filters"); enforceAdminPermission(); if (needsPrivilegedPermissionForScan(settings)) { enforcePrivilegedPermission(); } final ScanClient scanClient = new ScanClient(appIf, isServer, settings, filters, storages); if (workSource != null) { enforceImpersonatationPermission(); } else { // Blame the caller if the work source is unspecified. workSource = new WorkSource(Binder.getCallingUid(), callingPackage); } final ScanClient scanClient = new ScanClient(appIf, isServer, settings, filters, workSource, storages); scanClient.hasLocationPermission = Utils.checkCallerHasLocationPermission(this, mAppOps, callingPackage); scanClient.hasPeersMacAddressPermission = Utils.checkCallerHasPeersMacAddressPermission( Loading src/com/android/bluetooth/gatt/ScanClient.java +17 −5 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.bluetooth.gatt; import android.bluetooth.le.ResultStorageDescriptor; import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanSettings; import android.os.WorkSource; import java.util.List; import java.util.Objects; Loading @@ -43,36 +44,47 @@ import java.util.UUID; // Pre-M apps are allowed to get scan results even if location is disabled boolean legacyForegroundApp; // Who is responsible for this scan. WorkSource workSource; AppScanStats stats = null; private static final ScanSettings DEFAULT_SCAN_SETTINGS = new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build(); ScanClient(int appIf, boolean isServer) { this(appIf, isServer, new UUID[0], DEFAULT_SCAN_SETTINGS, null, null); this(appIf, isServer, new UUID[0], DEFAULT_SCAN_SETTINGS, null, null, null); } ScanClient(int appIf, boolean isServer, UUID[] uuids) { this(appIf, isServer, uuids, DEFAULT_SCAN_SETTINGS, null, null); this(appIf, isServer, uuids, DEFAULT_SCAN_SETTINGS, null, null, null); } ScanClient(int appIf, boolean isServer, ScanSettings settings, List<ScanFilter> filters) { this(appIf, isServer, new UUID[0], settings, filters, null); this(appIf, isServer, new UUID[0], settings, filters, null, null); } ScanClient(int appIf, boolean isServer, ScanSettings settings, List<ScanFilter> filters, List<List<ResultStorageDescriptor>> storages) { this(appIf, isServer, new UUID[0], settings, filters, storages); this(appIf, isServer, new UUID[0], settings, filters, null, storages); } ScanClient(int appIf, boolean isServer, ScanSettings settings, List<ScanFilter> filters, WorkSource workSource, List<List<ResultStorageDescriptor>> storages) { this(appIf, isServer, new UUID[0], settings, filters, workSource, storages); } private ScanClient(int appIf, boolean isServer, UUID[] uuids, ScanSettings settings, List<ScanFilter> filters, List<List<ResultStorageDescriptor>> storages) { List<ScanFilter> filters, WorkSource workSource, List<List<ResultStorageDescriptor>> storages) { this.clientIf = appIf; this.isServer = isServer; this.uuids = uuids; this.settings = settings; this.filters = filters; this.workSource = workSource; this.storages = storages; } Loading src/com/android/bluetooth/gatt/ScanManager.java +24 −1 Original line number Diff line number Diff line Loading @@ -31,11 +31,13 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.util.Log; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.AdapterService; import com.android.internal.app.IBatteryStats; import java.util.ArrayDeque; import java.util.Deque; Loading Loading @@ -81,6 +83,7 @@ public class ScanManager { private Integer curUsedTrackableAdvertisements; private GattService mService; private IBatteryStats mBatteryStats; private BroadcastReceiver mBatchAlarmReceiver; private boolean mBatchAlarmReceiverRegistered; private ScanNative mScanNative; Loading @@ -100,6 +103,7 @@ public class ScanManager { } void start() { mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batterystats")); HandlerThread thread = new HandlerThread("BluetoothScanManager"); thread.start(); mHandler = new ClientHandler(thread.getLooper()); Loading Loading @@ -242,12 +246,25 @@ public class ScanManager { mHandler.sendMessageDelayed(msg, SCAN_TIMEOUT_MS); } } // Update BatteryStats with this workload. try { mBatteryStats.noteBleScanStarted(client.workSource); } catch (RemoteException e) { /* ignore */ } } } void handleStopScan(ScanClient client) { Utils.enforceAdminPermission(mService); if (client == null) return; // The ScanClient passed in just holds the clientIf. We retrieve the real client, // which may have workSource set. client = mScanNative.getClient(client.clientIf); if (client == null) return; if (mRegularScanClients.contains(client)) { mScanNative.stopRegularScan(client); Loading @@ -258,6 +275,13 @@ public class ScanManager { if (!mScanNative.isOpportunisticScanClient(client)) { mScanNative.configureRegularScanParams(); } // Update BatteryStats with this workload. try { mBatteryStats.noteBleScanStopped(client.workSource); } catch (RemoteException e) { /* ignore */ } } else { mScanNative.stopBatchScan(client); } Loading Loading @@ -632,7 +656,6 @@ public class ScanManager { void stopRegularScan(ScanClient client) { // Remove scan filters and recycle filter indices. client = getClient(client.clientIf); if (client == null) return; int deliveryMode = getDeliveryMode(client); if (deliveryMode == DELIVERY_MODE_ON_FOUND_LOST) { Loading Loading
AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ <uses-permission android:name="android.permission.DEVICE_POWER" /> <uses-permission android:name="android.permission.REAL_GET_TASKS" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" /> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" /> <!-- For PBAP Owner Vcard Info --> <uses-permission android:name="android.permission.READ_PROFILE"/> Loading
src/com/android/bluetooth/btservice/AdapterService.java +12 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.BatteryStats; import android.os.Binder; import android.os.Bundle; import android.os.Handler; Loading @@ -47,6 +48,7 @@ import android.os.PowerManager; import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.text.TextUtils; import android.util.Base64; Loading @@ -58,6 +60,7 @@ import com.android.bluetooth.a2dp.A2dpSinkService; import com.android.bluetooth.hid.HidService; import com.android.bluetooth.hfp.HeadsetService; import com.android.bluetooth.sdp.SdpManager; import com.android.internal.app.IBatteryStats; import com.android.internal.R; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.RemoteDevices.DeviceProperties; Loading Loading @@ -184,6 +187,7 @@ public class AdapterService extends Service { private AlarmManager mAlarmManager; private PendingIntent mPendingAlarm; private IBatteryStats mBatteryStats; private PowerManager mPowerManager; private PowerManager.WakeLock mWakeLock; private String mWakeLockName; Loading Loading @@ -407,6 +411,8 @@ public class AdapterService extends Service { getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDNAME); mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService( BatteryStats.SERVICE_NAME)); mSdpManager = SdpManager.init(this); registerReceiver(mAlarmBroadcastReceiver, new IntentFilter(ACTION_ALARM_WAKEUP)); Loading Loading @@ -451,6 +457,12 @@ public class AdapterService extends Service { mJniCallbacks.init(mBondStateMachine,mRemoteDevices); try { mBatteryStats.noteResetBleScan(); } catch (RemoteException e) { // Ignore. } //FIXME: Set static instance here??? setAdapterService(this); Loading
src/com/android/bluetooth/gatt/GattService.java +16 −5 Original line number Diff line number Diff line Loading @@ -37,10 +37,12 @@ import android.bluetooth.le.ScanRecord; import android.bluetooth.le.ScanResult; import android.bluetooth.le.ScanSettings; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.os.ParcelUuid; import android.os.RemoteException; import android.os.SystemClock; import android.os.WorkSource; import android.provider.Settings; import android.util.Log; Loading Loading @@ -316,10 +318,12 @@ public class GattService extends ProfileService { @Override public void startScan(int appIf, boolean isServer, ScanSettings settings, List<ScanFilter> filters, List storages, String callingPackage) { List<ScanFilter> filters, WorkSource workSource, List storages, String callingPackage) { GattService service = getService(); if (service == null) return; service.startScan(appIf, isServer, settings, filters, storages, callingPackage); service.startScan(appIf, isServer, settings, filters, workSource, storages, callingPackage); } public void stopScan(int appIf, boolean isServer) { Loading Loading @@ -1215,14 +1219,21 @@ public class GattService extends ProfileService { } void startScan(int appIf, boolean isServer, ScanSettings settings, List<ScanFilter> filters, List<List<ResultStorageDescriptor>> storages, String callingPackage) { List<ScanFilter> filters, WorkSource workSource, List<List<ResultStorageDescriptor>> storages, String callingPackage) { if (DBG) Log.d(TAG, "start scan with filters"); enforceAdminPermission(); if (needsPrivilegedPermissionForScan(settings)) { enforcePrivilegedPermission(); } final ScanClient scanClient = new ScanClient(appIf, isServer, settings, filters, storages); if (workSource != null) { enforceImpersonatationPermission(); } else { // Blame the caller if the work source is unspecified. workSource = new WorkSource(Binder.getCallingUid(), callingPackage); } final ScanClient scanClient = new ScanClient(appIf, isServer, settings, filters, workSource, storages); scanClient.hasLocationPermission = Utils.checkCallerHasLocationPermission(this, mAppOps, callingPackage); scanClient.hasPeersMacAddressPermission = Utils.checkCallerHasPeersMacAddressPermission( Loading
src/com/android/bluetooth/gatt/ScanClient.java +17 −5 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.bluetooth.gatt; import android.bluetooth.le.ResultStorageDescriptor; import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanSettings; import android.os.WorkSource; import java.util.List; import java.util.Objects; Loading @@ -43,36 +44,47 @@ import java.util.UUID; // Pre-M apps are allowed to get scan results even if location is disabled boolean legacyForegroundApp; // Who is responsible for this scan. WorkSource workSource; AppScanStats stats = null; private static final ScanSettings DEFAULT_SCAN_SETTINGS = new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build(); ScanClient(int appIf, boolean isServer) { this(appIf, isServer, new UUID[0], DEFAULT_SCAN_SETTINGS, null, null); this(appIf, isServer, new UUID[0], DEFAULT_SCAN_SETTINGS, null, null, null); } ScanClient(int appIf, boolean isServer, UUID[] uuids) { this(appIf, isServer, uuids, DEFAULT_SCAN_SETTINGS, null, null); this(appIf, isServer, uuids, DEFAULT_SCAN_SETTINGS, null, null, null); } ScanClient(int appIf, boolean isServer, ScanSettings settings, List<ScanFilter> filters) { this(appIf, isServer, new UUID[0], settings, filters, null); this(appIf, isServer, new UUID[0], settings, filters, null, null); } ScanClient(int appIf, boolean isServer, ScanSettings settings, List<ScanFilter> filters, List<List<ResultStorageDescriptor>> storages) { this(appIf, isServer, new UUID[0], settings, filters, storages); this(appIf, isServer, new UUID[0], settings, filters, null, storages); } ScanClient(int appIf, boolean isServer, ScanSettings settings, List<ScanFilter> filters, WorkSource workSource, List<List<ResultStorageDescriptor>> storages) { this(appIf, isServer, new UUID[0], settings, filters, workSource, storages); } private ScanClient(int appIf, boolean isServer, UUID[] uuids, ScanSettings settings, List<ScanFilter> filters, List<List<ResultStorageDescriptor>> storages) { List<ScanFilter> filters, WorkSource workSource, List<List<ResultStorageDescriptor>> storages) { this.clientIf = appIf; this.isServer = isServer; this.uuids = uuids; this.settings = settings; this.filters = filters; this.workSource = workSource; this.storages = storages; } Loading
src/com/android/bluetooth/gatt/ScanManager.java +24 −1 Original line number Diff line number Diff line Loading @@ -31,11 +31,13 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.util.Log; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.AdapterService; import com.android.internal.app.IBatteryStats; import java.util.ArrayDeque; import java.util.Deque; Loading Loading @@ -81,6 +83,7 @@ public class ScanManager { private Integer curUsedTrackableAdvertisements; private GattService mService; private IBatteryStats mBatteryStats; private BroadcastReceiver mBatchAlarmReceiver; private boolean mBatchAlarmReceiverRegistered; private ScanNative mScanNative; Loading @@ -100,6 +103,7 @@ public class ScanManager { } void start() { mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batterystats")); HandlerThread thread = new HandlerThread("BluetoothScanManager"); thread.start(); mHandler = new ClientHandler(thread.getLooper()); Loading Loading @@ -242,12 +246,25 @@ public class ScanManager { mHandler.sendMessageDelayed(msg, SCAN_TIMEOUT_MS); } } // Update BatteryStats with this workload. try { mBatteryStats.noteBleScanStarted(client.workSource); } catch (RemoteException e) { /* ignore */ } } } void handleStopScan(ScanClient client) { Utils.enforceAdminPermission(mService); if (client == null) return; // The ScanClient passed in just holds the clientIf. We retrieve the real client, // which may have workSource set. client = mScanNative.getClient(client.clientIf); if (client == null) return; if (mRegularScanClients.contains(client)) { mScanNative.stopRegularScan(client); Loading @@ -258,6 +275,13 @@ public class ScanManager { if (!mScanNative.isOpportunisticScanClient(client)) { mScanNative.configureRegularScanParams(); } // Update BatteryStats with this workload. try { mBatteryStats.noteBleScanStopped(client.workSource); } catch (RemoteException e) { /* ignore */ } } else { mScanNative.stopBatchScan(client); } Loading Loading @@ -632,7 +656,6 @@ public class ScanManager { void stopRegularScan(ScanClient client) { // Remove scan filters and recycle filter indices. client = getClient(client.clientIf); if (client == null) return; int deliveryMode = getDeliveryMode(client); if (deliveryMode == DELIVERY_MODE_ON_FOUND_LOST) { Loading