Loading android/app/src/com/android/bluetooth/AlertActivity.java +2 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.bluetooth; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; Loading @@ -33,6 +34,7 @@ import android.view.accessibility.AccessibilityEvent; * @see #mAlert * @see #setupAlert() */ @SuppressLint("AndroidFrameworkBluetoothPermission") public abstract class AlertActivity extends Activity implements DialogInterface.OnDismissListener, DialogInterface.OnCancelListener { Loading android/app/src/com/android/bluetooth/btservice/AdapterService.java +123 −81 Original line number Diff line number Diff line Loading @@ -939,10 +939,7 @@ public class AdapterService extends Service { * @param device is the remote device we wish to connect to * @return true if the profile is supported by both the local and remote device, false otherwise */ @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, }) @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) private boolean isSupported(ParcelUuid[] localDeviceUuids, ParcelUuid[] remoteDeviceUuids, int profile, BluetoothDevice device) { if (remoteDeviceUuids == null || remoteDeviceUuids.length == 0) { Loading Loading @@ -1011,10 +1008,7 @@ public class AdapterService extends Service { * @param device is the device for which we are checking if any profiles are enabled * @return true if any profile is enabled, false otherwise */ @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, }) @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) private boolean isAnyProfileEnabled(BluetoothDevice device) { if (mA2dpService != null && mA2dpService.getConnectionPolicy(device) Loading Loading @@ -1065,7 +1059,6 @@ public class AdapterService extends Service { * @return true */ @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE, }) Loading Loading @@ -1326,9 +1319,11 @@ public class AdapterService extends Service { } @Override public boolean setBluetoothClass(BluetoothClass bluetoothClass) { public boolean setBluetoothClass(BluetoothClass bluetoothClass, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setBluetoothClass")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading Loading @@ -1357,9 +1352,11 @@ public class AdapterService extends Service { } @Override public boolean setIoCapability(int capability) { public boolean setIoCapability(int capability, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setIoCapability")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1385,9 +1382,11 @@ public class AdapterService extends Service { } @Override public boolean setLeIoCapability(int capability) { public boolean setLeIoCapability(int capability, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setLeIoCapability")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading Loading @@ -1491,9 +1490,11 @@ public class AdapterService extends Service { } @Override public long getDiscoveryEndMillis() { public long getDiscoveryEndMillis(AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "getDiscoveryEndMillis")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return -1; } Loading Loading @@ -1640,10 +1641,12 @@ public class AdapterService extends Service { } @Override public void generateLocalOobData(int transport, IBluetoothOobDataCallback callback) { public void generateLocalOobData(int transport, IBluetoothOobDataCallback callback, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveOrManagedUser(service, TAG, "generateLocalOobData")) { if (service == null || !Utils.checkCallerIsSystemOrActiveOrManagedUser(service, TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return; } enforceBluetoothPrivilegedPermission(service); Loading Loading @@ -1677,9 +1680,10 @@ public class AdapterService extends Service { } @Override public boolean canBondWithoutDialog(BluetoothDevice device) { public boolean canBondWithoutDialog(BluetoothDevice device, AttributionSource source) { AdapterService service = getService(); if (service == null) { if (service == null || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1690,13 +1694,11 @@ public class AdapterService extends Service { @Override public boolean removeActiveDevice(@ActiveDeviceUse int profiles, AttributionSource attributionSource) { if (!Utils.callerIsSystemOrActiveUser(TAG, "removeActiveDevice")) { return false; } AttributionSource source) { AdapterService service = getService(); if (service == null) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } return service.setActiveDevice(null, profiles); Loading @@ -1704,13 +1706,11 @@ public class AdapterService extends Service { @Override public boolean setActiveDevice(BluetoothDevice device, @ActiveDeviceUse int profiles, AttributionSource attributionSource) { if (!Utils.callerIsSystemOrActiveUser(TAG, "setActiveDevice")) { return false; } AttributionSource source) { AdapterService service = getService(); if (service == null) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } return service.setActiveDevice(device, profiles); Loading @@ -1718,9 +1718,11 @@ public class AdapterService extends Service { @Override public boolean connectAllEnabledProfiles(BluetoothDevice device, AttributionSource attributionSource) { AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "connectAllEnabledProfiles")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1731,9 +1733,11 @@ public class AdapterService extends Service { @Override public boolean disconnectAllEnabledProfiles(BluetoothDevice device, AttributionSource attributionSource) { AttributionSource source) { AdapterService service = getService(); if (service == null | !callerIsSystemOrActiveUser(TAG, "disconnectAllEnabledProfiles")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading Loading @@ -1917,9 +1921,12 @@ public class AdapterService extends Service { } @Override public boolean setPairingConfirmation(BluetoothDevice device, boolean accept) { public boolean setPairingConfirmation(BluetoothDevice device, boolean accept, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setPairingConfirmation")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1938,9 +1945,11 @@ public class AdapterService extends Service { } @Override public boolean getSilenceMode(BluetoothDevice device) { public boolean getSilenceMode(BluetoothDevice device, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "getSilenceMode")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1951,9 +1960,12 @@ public class AdapterService extends Service { @Override public boolean setSilenceMode(BluetoothDevice device, boolean silence) { public boolean setSilenceMode(BluetoothDevice device, boolean silence, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setSilenceMode")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1977,9 +1989,12 @@ public class AdapterService extends Service { } @Override public boolean setPhonebookAccessPermission(BluetoothDevice device, int value) { public boolean setPhonebookAccessPermission(BluetoothDevice device, int value, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setPhonebookAccessPermission")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2003,9 +2018,12 @@ public class AdapterService extends Service { } @Override public boolean setMessageAccessPermission(BluetoothDevice device, int value) { public boolean setMessageAccessPermission(BluetoothDevice device, int value, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setMessageAccessPermission")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2029,9 +2047,12 @@ public class AdapterService extends Service { } @Override public boolean setSimAccessPermission(BluetoothDevice device, int value) { public boolean setSimAccessPermission(BluetoothDevice device, int value, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setSimAccessPermission")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading Loading @@ -2110,9 +2131,10 @@ public class AdapterService extends Service { } @Override public boolean factoryReset() { public boolean factoryReset(AttributionSource source) { AdapterService service = getService(); if (service == null) { if (service == null || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2130,10 +2152,12 @@ public class AdapterService extends Service { } @Override public boolean registerBluetoothConnectionCallback(IBluetoothConnectionCallback callback) { public boolean registerBluetoothConnectionCallback(IBluetoothConnectionCallback callback, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "registerBluetoothConnectionCallback")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } enforceBluetoothPrivilegedPermission(service); Loading @@ -2142,11 +2166,12 @@ public class AdapterService extends Service { } @Override public boolean unregisterBluetoothConnectionCallback( IBluetoothConnectionCallback callback) { public boolean unregisterBluetoothConnectionCallback(IBluetoothConnectionCallback callback, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "unregisterBluetoothConnectionCallback")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } enforceBluetoothPrivilegedPermission(service); Loading @@ -2154,9 +2179,11 @@ public class AdapterService extends Service { } @Override public void registerCallback(IBluetoothCallback callback) { public void registerCallback(IBluetoothCallback callback, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "registerCallback")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return; } Loading @@ -2166,10 +2193,11 @@ public class AdapterService extends Service { } @Override public void unregisterCallback(IBluetoothCallback callback) { public void unregisterCallback(IBluetoothCallback callback, AttributionSource source) { AdapterService service = getService(); if (service == null || service.mCallbacks == null || !callerIsSystemOrActiveUser(TAG, "unregisterCallback")) { || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return; } Loading Loading @@ -2276,9 +2304,10 @@ public class AdapterService extends Service { } @Override public BluetoothActivityEnergyInfo reportActivityInfo() { public BluetoothActivityEnergyInfo reportActivityInfo(AttributionSource source) { AdapterService service = getService(); if (service == null) { if (service == null || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return null; } Loading @@ -2289,9 +2318,11 @@ public class AdapterService extends Service { @Override public boolean registerMetadataListener(IBluetoothMetadataListener listener, BluetoothDevice device) { BluetoothDevice device, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "registerMetadataListener")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2313,10 +2344,12 @@ public class AdapterService extends Service { } @Override public boolean unregisterMetadataListener(BluetoothDevice device) { public boolean unregisterMetadataListener(BluetoothDevice device, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "unregisterMetadataListener")) { || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2332,9 +2365,12 @@ public class AdapterService extends Service { } @Override public boolean setMetadata(BluetoothDevice device, int key, byte[] value) { public boolean setMetadata(BluetoothDevice device, int key, byte[] value, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setMetadata")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2347,9 +2383,12 @@ public class AdapterService extends Service { } @Override public byte[] getMetadata(BluetoothDevice device, int key) { public byte[] getMetadata(BluetoothDevice device, int key, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "getMetadata")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return null; } Loading @@ -2359,16 +2398,19 @@ public class AdapterService extends Service { } @Override public void requestActivityInfo(ResultReceiver result) { public void requestActivityInfo(ResultReceiver result, AttributionSource source) { Bundle bundle = new Bundle(); bundle.putParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY, reportActivityInfo()); bundle.putParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY, reportActivityInfo(source)); result.send(0, bundle); } @Override public void onLeServiceUp() { public void onLeServiceUp(AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "onLeServiceUp")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return; } Loading @@ -2378,9 +2420,11 @@ public class AdapterService extends Service { } @Override public void onBrEdrDown() { public void onBrEdrDown(AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "onBrEdrDown")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return; } Loading Loading @@ -2691,7 +2735,6 @@ public class AdapterService extends Service { * @return false if profiles value is not one of the constants we accept, true otherwise */ @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE, }) Loading Loading @@ -2749,7 +2792,6 @@ public class AdapterService extends Service { * @return true if all profiles successfully connected, false if an error occurred */ @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE, }) Loading android/app/src/com/android/bluetooth/gatt/GattService.java +11 −4 Original line number Diff line number Diff line Loading @@ -942,12 +942,12 @@ public class GattService extends ProfileService { } @Override public void getOwnAddress(int advertiserId) { public void getOwnAddress(int advertiserId, AttributionSource attributionSource) { GattService service = getService(); if (service == null) { return; } service.getOwnAddress(advertiserId); service.getOwnAddress(advertiserId, attributionSource); } @Override Loading Loading @@ -2523,8 +2523,15 @@ public class GattService extends ProfileService { mAdvertiseManager.stopAdvertisingSet(callback); } @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) void getOwnAddress(int advertiserId) { @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_PRIVILEGED, }) void getOwnAddress(int advertiserId, AttributionSource attributionSource) { if (!Utils.checkAdvertisePermissionForDataDelivery( this, attributionSource, "GattService getOwnAddress")) { return; } enforcePrivilegedPermission(); mAdvertiseManager.getOwnAddress(advertiserId); } Loading android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterServiceTest.java +9 −9 Original line number Diff line number Diff line Loading @@ -184,7 +184,7 @@ public class AdapterServiceTest { mAdapterService.attach(mMockContext, null, null, null, mApplication, null); mAdapterService.onCreate(); mServiceBinder.registerCallback(mIBluetoothCallback); mServiceBinder.registerCallback(mIBluetoothCallback, mAttributionSource); Config.init(mMockContext); Loading @@ -194,7 +194,7 @@ public class AdapterServiceTest { @After public void tearDown() { mServiceBinder.unregisterCallback(mIBluetoothCallback); mServiceBinder.unregisterCallback(mIBluetoothCallback, mAttributionSource); mAdapterService.cleanup(); Config.init(InstrumentationRegistry.getTargetContext()); } Loading Loading @@ -227,7 +227,7 @@ public class AdapterServiceTest { verifyStateChange(BluetoothAdapter.STATE_BLE_TURNING_ON, BluetoothAdapter.STATE_BLE_ON, invocationNumber + 1, NATIVE_INIT_MS); mServiceBinder.onLeServiceUp(); mServiceBinder.onLeServiceUp(mAttributionSource); verifyStateChange(BluetoothAdapter.STATE_BLE_ON, BluetoothAdapter.STATE_TURNING_ON, invocationNumber + 1, CONTEXT_SWITCH_MS); Loading Loading @@ -275,7 +275,7 @@ public class AdapterServiceTest { verifyStateChange(BluetoothAdapter.STATE_TURNING_OFF, BluetoothAdapter.STATE_BLE_ON, invocationNumber + 1, PROFILE_SERVICE_TOGGLE_TIME_MS); mServiceBinder.onBrEdrDown(); mServiceBinder.onBrEdrDown(mAttributionSource); verifyStateChange(BluetoothAdapter.STATE_BLE_ON, BluetoothAdapter.STATE_BLE_TURNING_OFF, invocationNumber + 1, CONTEXT_SWITCH_MS); Loading Loading @@ -389,7 +389,7 @@ public class AdapterServiceTest { verifyStateChange(BluetoothAdapter.STATE_TURNING_OFF, BluetoothAdapter.STATE_BLE_ON, 1, CONTEXT_SWITCH_MS); mServiceBinder.onBrEdrDown(); mServiceBinder.onBrEdrDown(mAttributionSource); verifyStateChange(BluetoothAdapter.STATE_BLE_ON, BluetoothAdapter.STATE_BLE_TURNING_OFF, 1, CONTEXT_SWITCH_MS); Loading Loading @@ -424,7 +424,7 @@ public class AdapterServiceTest { verifyStateChange(BluetoothAdapter.STATE_BLE_TURNING_ON, BluetoothAdapter.STATE_BLE_ON, 1, NATIVE_INIT_MS); mServiceBinder.onLeServiceUp(); mServiceBinder.onLeServiceUp(mAttributionSource); verifyStateChange(BluetoothAdapter.STATE_BLE_ON, BluetoothAdapter.STATE_TURNING_ON, 1, CONTEXT_SWITCH_MS); Loading Loading @@ -656,7 +656,7 @@ public class AdapterServiceTest { byte[] obfuscatedAddress1 = mAdapterService.obfuscateAddress(device); Assert.assertTrue(obfuscatedAddress1.length > 0); Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress1)); mServiceBinder.factoryReset(); mServiceBinder.factoryReset(mAttributionSource); byte[] obfuscatedAddress2 = mAdapterService.obfuscateAddress(device); Assert.assertTrue(obfuscatedAddress2.length > 0); Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress2)); Loading @@ -668,7 +668,7 @@ public class AdapterServiceTest { Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress3)); Assert.assertArrayEquals(obfuscatedAddress3, obfuscatedAddress2); mServiceBinder.factoryReset(); mServiceBinder.factoryReset(mAttributionSource); byte[] obfuscatedAddress4 = mAdapterService.obfuscateAddress(device); Assert.assertTrue(obfuscatedAddress4.length > 0); Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress4)); Loading @@ -692,7 +692,7 @@ public class AdapterServiceTest { Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress1)); Assert.assertArrayEquals(obfuscateInJava(metricsSalt1, device), obfuscatedAddress1); mServiceBinder.factoryReset(); mServiceBinder.factoryReset(mAttributionSource); tearDown(); setUp(); // Cannot verify metrics salt since it is not written to disk until native cleanup Loading Loading
android/app/src/com/android/bluetooth/AlertActivity.java +2 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.bluetooth; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; Loading @@ -33,6 +34,7 @@ import android.view.accessibility.AccessibilityEvent; * @see #mAlert * @see #setupAlert() */ @SuppressLint("AndroidFrameworkBluetoothPermission") public abstract class AlertActivity extends Activity implements DialogInterface.OnDismissListener, DialogInterface.OnCancelListener { Loading
android/app/src/com/android/bluetooth/btservice/AdapterService.java +123 −81 Original line number Diff line number Diff line Loading @@ -939,10 +939,7 @@ public class AdapterService extends Service { * @param device is the remote device we wish to connect to * @return true if the profile is supported by both the local and remote device, false otherwise */ @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, }) @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) private boolean isSupported(ParcelUuid[] localDeviceUuids, ParcelUuid[] remoteDeviceUuids, int profile, BluetoothDevice device) { if (remoteDeviceUuids == null || remoteDeviceUuids.length == 0) { Loading Loading @@ -1011,10 +1008,7 @@ public class AdapterService extends Service { * @param device is the device for which we are checking if any profiles are enabled * @return true if any profile is enabled, false otherwise */ @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, }) @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) private boolean isAnyProfileEnabled(BluetoothDevice device) { if (mA2dpService != null && mA2dpService.getConnectionPolicy(device) Loading Loading @@ -1065,7 +1059,6 @@ public class AdapterService extends Service { * @return true */ @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE, }) Loading Loading @@ -1326,9 +1319,11 @@ public class AdapterService extends Service { } @Override public boolean setBluetoothClass(BluetoothClass bluetoothClass) { public boolean setBluetoothClass(BluetoothClass bluetoothClass, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setBluetoothClass")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading Loading @@ -1357,9 +1352,11 @@ public class AdapterService extends Service { } @Override public boolean setIoCapability(int capability) { public boolean setIoCapability(int capability, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setIoCapability")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1385,9 +1382,11 @@ public class AdapterService extends Service { } @Override public boolean setLeIoCapability(int capability) { public boolean setLeIoCapability(int capability, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setLeIoCapability")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading Loading @@ -1491,9 +1490,11 @@ public class AdapterService extends Service { } @Override public long getDiscoveryEndMillis() { public long getDiscoveryEndMillis(AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "getDiscoveryEndMillis")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return -1; } Loading Loading @@ -1640,10 +1641,12 @@ public class AdapterService extends Service { } @Override public void generateLocalOobData(int transport, IBluetoothOobDataCallback callback) { public void generateLocalOobData(int transport, IBluetoothOobDataCallback callback, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveOrManagedUser(service, TAG, "generateLocalOobData")) { if (service == null || !Utils.checkCallerIsSystemOrActiveOrManagedUser(service, TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return; } enforceBluetoothPrivilegedPermission(service); Loading Loading @@ -1677,9 +1680,10 @@ public class AdapterService extends Service { } @Override public boolean canBondWithoutDialog(BluetoothDevice device) { public boolean canBondWithoutDialog(BluetoothDevice device, AttributionSource source) { AdapterService service = getService(); if (service == null) { if (service == null || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1690,13 +1694,11 @@ public class AdapterService extends Service { @Override public boolean removeActiveDevice(@ActiveDeviceUse int profiles, AttributionSource attributionSource) { if (!Utils.callerIsSystemOrActiveUser(TAG, "removeActiveDevice")) { return false; } AttributionSource source) { AdapterService service = getService(); if (service == null) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } return service.setActiveDevice(null, profiles); Loading @@ -1704,13 +1706,11 @@ public class AdapterService extends Service { @Override public boolean setActiveDevice(BluetoothDevice device, @ActiveDeviceUse int profiles, AttributionSource attributionSource) { if (!Utils.callerIsSystemOrActiveUser(TAG, "setActiveDevice")) { return false; } AttributionSource source) { AdapterService service = getService(); if (service == null) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } return service.setActiveDevice(device, profiles); Loading @@ -1718,9 +1718,11 @@ public class AdapterService extends Service { @Override public boolean connectAllEnabledProfiles(BluetoothDevice device, AttributionSource attributionSource) { AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "connectAllEnabledProfiles")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1731,9 +1733,11 @@ public class AdapterService extends Service { @Override public boolean disconnectAllEnabledProfiles(BluetoothDevice device, AttributionSource attributionSource) { AttributionSource source) { AdapterService service = getService(); if (service == null | !callerIsSystemOrActiveUser(TAG, "disconnectAllEnabledProfiles")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading Loading @@ -1917,9 +1921,12 @@ public class AdapterService extends Service { } @Override public boolean setPairingConfirmation(BluetoothDevice device, boolean accept) { public boolean setPairingConfirmation(BluetoothDevice device, boolean accept, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setPairingConfirmation")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1938,9 +1945,11 @@ public class AdapterService extends Service { } @Override public boolean getSilenceMode(BluetoothDevice device) { public boolean getSilenceMode(BluetoothDevice device, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "getSilenceMode")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1951,9 +1960,12 @@ public class AdapterService extends Service { @Override public boolean setSilenceMode(BluetoothDevice device, boolean silence) { public boolean setSilenceMode(BluetoothDevice device, boolean silence, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setSilenceMode")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -1977,9 +1989,12 @@ public class AdapterService extends Service { } @Override public boolean setPhonebookAccessPermission(BluetoothDevice device, int value) { public boolean setPhonebookAccessPermission(BluetoothDevice device, int value, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setPhonebookAccessPermission")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2003,9 +2018,12 @@ public class AdapterService extends Service { } @Override public boolean setMessageAccessPermission(BluetoothDevice device, int value) { public boolean setMessageAccessPermission(BluetoothDevice device, int value, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setMessageAccessPermission")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2029,9 +2047,12 @@ public class AdapterService extends Service { } @Override public boolean setSimAccessPermission(BluetoothDevice device, int value) { public boolean setSimAccessPermission(BluetoothDevice device, int value, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setSimAccessPermission")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading Loading @@ -2110,9 +2131,10 @@ public class AdapterService extends Service { } @Override public boolean factoryReset() { public boolean factoryReset(AttributionSource source) { AdapterService service = getService(); if (service == null) { if (service == null || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2130,10 +2152,12 @@ public class AdapterService extends Service { } @Override public boolean registerBluetoothConnectionCallback(IBluetoothConnectionCallback callback) { public boolean registerBluetoothConnectionCallback(IBluetoothConnectionCallback callback, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "registerBluetoothConnectionCallback")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } enforceBluetoothPrivilegedPermission(service); Loading @@ -2142,11 +2166,12 @@ public class AdapterService extends Service { } @Override public boolean unregisterBluetoothConnectionCallback( IBluetoothConnectionCallback callback) { public boolean unregisterBluetoothConnectionCallback(IBluetoothConnectionCallback callback, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "unregisterBluetoothConnectionCallback")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } enforceBluetoothPrivilegedPermission(service); Loading @@ -2154,9 +2179,11 @@ public class AdapterService extends Service { } @Override public void registerCallback(IBluetoothCallback callback) { public void registerCallback(IBluetoothCallback callback, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "registerCallback")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return; } Loading @@ -2166,10 +2193,11 @@ public class AdapterService extends Service { } @Override public void unregisterCallback(IBluetoothCallback callback) { public void unregisterCallback(IBluetoothCallback callback, AttributionSource source) { AdapterService service = getService(); if (service == null || service.mCallbacks == null || !callerIsSystemOrActiveUser(TAG, "unregisterCallback")) { || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return; } Loading Loading @@ -2276,9 +2304,10 @@ public class AdapterService extends Service { } @Override public BluetoothActivityEnergyInfo reportActivityInfo() { public BluetoothActivityEnergyInfo reportActivityInfo(AttributionSource source) { AdapterService service = getService(); if (service == null) { if (service == null || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return null; } Loading @@ -2289,9 +2318,11 @@ public class AdapterService extends Service { @Override public boolean registerMetadataListener(IBluetoothMetadataListener listener, BluetoothDevice device) { BluetoothDevice device, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "registerMetadataListener")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2313,10 +2344,12 @@ public class AdapterService extends Service { } @Override public boolean unregisterMetadataListener(BluetoothDevice device) { public boolean unregisterMetadataListener(BluetoothDevice device, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "unregisterMetadataListener")) { || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2332,9 +2365,12 @@ public class AdapterService extends Service { } @Override public boolean setMetadata(BluetoothDevice device, int key, byte[] value) { public boolean setMetadata(BluetoothDevice device, int key, byte[] value, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "setMetadata")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return false; } Loading @@ -2347,9 +2383,12 @@ public class AdapterService extends Service { } @Override public byte[] getMetadata(BluetoothDevice device, int key) { public byte[] getMetadata(BluetoothDevice device, int key, AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "getMetadata")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return null; } Loading @@ -2359,16 +2398,19 @@ public class AdapterService extends Service { } @Override public void requestActivityInfo(ResultReceiver result) { public void requestActivityInfo(ResultReceiver result, AttributionSource source) { Bundle bundle = new Bundle(); bundle.putParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY, reportActivityInfo()); bundle.putParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY, reportActivityInfo(source)); result.send(0, bundle); } @Override public void onLeServiceUp() { public void onLeServiceUp(AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "onLeServiceUp")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return; } Loading @@ -2378,9 +2420,11 @@ public class AdapterService extends Service { } @Override public void onBrEdrDown() { public void onBrEdrDown(AttributionSource source) { AdapterService service = getService(); if (service == null || !callerIsSystemOrActiveUser(TAG, "onBrEdrDown")) { if (service == null || !Utils.checkCallerIsSystemOrActiveUser(TAG) || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) { return; } Loading Loading @@ -2691,7 +2735,6 @@ public class AdapterService extends Service { * @return false if profiles value is not one of the constants we accept, true otherwise */ @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE, }) Loading Loading @@ -2749,7 +2792,6 @@ public class AdapterService extends Service { * @return true if all profiles successfully connected, false if an error occurred */ @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE, }) Loading
android/app/src/com/android/bluetooth/gatt/GattService.java +11 −4 Original line number Diff line number Diff line Loading @@ -942,12 +942,12 @@ public class GattService extends ProfileService { } @Override public void getOwnAddress(int advertiserId) { public void getOwnAddress(int advertiserId, AttributionSource attributionSource) { GattService service = getService(); if (service == null) { return; } service.getOwnAddress(advertiserId); service.getOwnAddress(advertiserId, attributionSource); } @Override Loading Loading @@ -2523,8 +2523,15 @@ public class GattService extends ProfileService { mAdvertiseManager.stopAdvertisingSet(callback); } @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) void getOwnAddress(int advertiserId) { @RequiresPermission(allOf = { android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_PRIVILEGED, }) void getOwnAddress(int advertiserId, AttributionSource attributionSource) { if (!Utils.checkAdvertisePermissionForDataDelivery( this, attributionSource, "GattService getOwnAddress")) { return; } enforcePrivilegedPermission(); mAdvertiseManager.getOwnAddress(advertiserId); } Loading
android/app/tests/unit/src/com/android/bluetooth/btservice/AdapterServiceTest.java +9 −9 Original line number Diff line number Diff line Loading @@ -184,7 +184,7 @@ public class AdapterServiceTest { mAdapterService.attach(mMockContext, null, null, null, mApplication, null); mAdapterService.onCreate(); mServiceBinder.registerCallback(mIBluetoothCallback); mServiceBinder.registerCallback(mIBluetoothCallback, mAttributionSource); Config.init(mMockContext); Loading @@ -194,7 +194,7 @@ public class AdapterServiceTest { @After public void tearDown() { mServiceBinder.unregisterCallback(mIBluetoothCallback); mServiceBinder.unregisterCallback(mIBluetoothCallback, mAttributionSource); mAdapterService.cleanup(); Config.init(InstrumentationRegistry.getTargetContext()); } Loading Loading @@ -227,7 +227,7 @@ public class AdapterServiceTest { verifyStateChange(BluetoothAdapter.STATE_BLE_TURNING_ON, BluetoothAdapter.STATE_BLE_ON, invocationNumber + 1, NATIVE_INIT_MS); mServiceBinder.onLeServiceUp(); mServiceBinder.onLeServiceUp(mAttributionSource); verifyStateChange(BluetoothAdapter.STATE_BLE_ON, BluetoothAdapter.STATE_TURNING_ON, invocationNumber + 1, CONTEXT_SWITCH_MS); Loading Loading @@ -275,7 +275,7 @@ public class AdapterServiceTest { verifyStateChange(BluetoothAdapter.STATE_TURNING_OFF, BluetoothAdapter.STATE_BLE_ON, invocationNumber + 1, PROFILE_SERVICE_TOGGLE_TIME_MS); mServiceBinder.onBrEdrDown(); mServiceBinder.onBrEdrDown(mAttributionSource); verifyStateChange(BluetoothAdapter.STATE_BLE_ON, BluetoothAdapter.STATE_BLE_TURNING_OFF, invocationNumber + 1, CONTEXT_SWITCH_MS); Loading Loading @@ -389,7 +389,7 @@ public class AdapterServiceTest { verifyStateChange(BluetoothAdapter.STATE_TURNING_OFF, BluetoothAdapter.STATE_BLE_ON, 1, CONTEXT_SWITCH_MS); mServiceBinder.onBrEdrDown(); mServiceBinder.onBrEdrDown(mAttributionSource); verifyStateChange(BluetoothAdapter.STATE_BLE_ON, BluetoothAdapter.STATE_BLE_TURNING_OFF, 1, CONTEXT_SWITCH_MS); Loading Loading @@ -424,7 +424,7 @@ public class AdapterServiceTest { verifyStateChange(BluetoothAdapter.STATE_BLE_TURNING_ON, BluetoothAdapter.STATE_BLE_ON, 1, NATIVE_INIT_MS); mServiceBinder.onLeServiceUp(); mServiceBinder.onLeServiceUp(mAttributionSource); verifyStateChange(BluetoothAdapter.STATE_BLE_ON, BluetoothAdapter.STATE_TURNING_ON, 1, CONTEXT_SWITCH_MS); Loading Loading @@ -656,7 +656,7 @@ public class AdapterServiceTest { byte[] obfuscatedAddress1 = mAdapterService.obfuscateAddress(device); Assert.assertTrue(obfuscatedAddress1.length > 0); Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress1)); mServiceBinder.factoryReset(); mServiceBinder.factoryReset(mAttributionSource); byte[] obfuscatedAddress2 = mAdapterService.obfuscateAddress(device); Assert.assertTrue(obfuscatedAddress2.length > 0); Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress2)); Loading @@ -668,7 +668,7 @@ public class AdapterServiceTest { Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress3)); Assert.assertArrayEquals(obfuscatedAddress3, obfuscatedAddress2); mServiceBinder.factoryReset(); mServiceBinder.factoryReset(mAttributionSource); byte[] obfuscatedAddress4 = mAdapterService.obfuscateAddress(device); Assert.assertTrue(obfuscatedAddress4.length > 0); Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress4)); Loading @@ -692,7 +692,7 @@ public class AdapterServiceTest { Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress1)); Assert.assertArrayEquals(obfuscateInJava(metricsSalt1, device), obfuscatedAddress1); mServiceBinder.factoryReset(); mServiceBinder.factoryReset(mAttributionSource); tearDown(); setUp(); // Cannot verify metrics salt since it is not written to disk until native cleanup Loading