Preserve legacy permission check behavior.
As part of the new "Nearby devices" permission work, the registerStateChangeCallback() API has been relaxed to no longer require permissions. However, we've discovered that some apps were depending on that SecurityException being thrown, so this change restores throwing behavior for those legacy apps. Bug: 186176507 Test: atest BluetoothInstrumentationTests Change-Id: Ife536dee246b300ffb3dd78aef0b059a230f3835
This commit is contained in:
@@ -31,6 +31,7 @@ import android.compat.annotation.UnsupportedAppUsage;
|
||||
import android.content.AttributionSource;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
@@ -365,6 +366,15 @@ public final class BluetoothHeadset implements BluetoothProfile {
|
||||
mAdapter = adapter;
|
||||
mAttributionSource = adapter.getAttributionSource();
|
||||
|
||||
// Preserve legacy compatibility where apps were depending on
|
||||
// registerStateChangeCallback() performing a permissions check which
|
||||
// has been relaxed in modern platform versions
|
||||
if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.R
|
||||
&& context.checkSelfPermission(android.Manifest.permission.BLUETOOTH)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
throw new SecurityException("Need BLUETOOTH permission");
|
||||
}
|
||||
|
||||
IBluetoothManager mgr = mAdapter.getBluetoothManager();
|
||||
if (mgr != null) {
|
||||
try {
|
||||
|
||||
@@ -30,6 +30,7 @@ import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
@@ -136,6 +137,16 @@ public class BluetoothPbap implements BluetoothProfile {
|
||||
mServiceListener = l;
|
||||
mAdapter = adapter;
|
||||
mAttributionSource = adapter.getAttributionSource();
|
||||
|
||||
// Preserve legacy compatibility where apps were depending on
|
||||
// registerStateChangeCallback() performing a permissions check which
|
||||
// has been relaxed in modern platform versions
|
||||
if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.R
|
||||
&& context.checkSelfPermission(android.Manifest.permission.BLUETOOTH)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
throw new SecurityException("Need BLUETOOTH permission");
|
||||
}
|
||||
|
||||
IBluetoothManager mgr = mAdapter.getBluetoothManager();
|
||||
if (mgr != null) {
|
||||
try {
|
||||
|
||||
@@ -21,6 +21,8 @@ import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserHandle;
|
||||
@@ -123,6 +125,16 @@ public abstract class BluetoothProfileConnector<T> {
|
||||
mContext = context;
|
||||
mServiceListener = listener;
|
||||
IBluetoothManager mgr = BluetoothAdapter.getDefaultAdapter().getBluetoothManager();
|
||||
|
||||
// Preserve legacy compatibility where apps were depending on
|
||||
// registerStateChangeCallback() performing a permissions check which
|
||||
// has been relaxed in modern platform versions
|
||||
if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.R
|
||||
&& context.checkSelfPermission(android.Manifest.permission.BLUETOOTH)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
throw new SecurityException("Need BLUETOOTH permission");
|
||||
}
|
||||
|
||||
if (mgr != null) {
|
||||
try {
|
||||
mgr.registerStateChangeCallback(mBluetoothStateChangeCallback);
|
||||
|
||||
Reference in New Issue
Block a user