From 8c58dc42567029ffe326520b908397ca4d09f3e9 Mon Sep 17 00:00:00 2001 From: Henigan Date: Wed, 3 Nov 2021 15:15:55 -0400 Subject: Fix broadcastReceiverBehavior --- .../transport/SdlBroadcastReceiver.java | 7 +-- .../transport/SdlRouterService.java | 4 -- .../transport/SdlRouterStatusProvider.java | 2 +- .../transport/UsbTransferProvider.java | 2 +- .../com/smartdevicelink/util/AndroidTools.java | 72 ++++++---------------- .../smartdevicelink/util/IntegrationValidator.java | 22 ++++++- 6 files changed, 44 insertions(+), 65 deletions(-) diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlBroadcastReceiver.java b/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlBroadcastReceiver.java index 28c787f3a..5c0153cb8 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlBroadcastReceiver.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlBroadcastReceiver.java @@ -130,13 +130,8 @@ public abstract class SdlBroadcastReceiver extends BroadcastReceiver { if (action.equalsIgnoreCase(TransportConstants.ACTION_USB_ACCESSORY_ATTACHED)) { DebugTool.logInfo(TAG, "Usb connected"); intent.setAction(null); - AndroidTools.updateRouterServiceEnabled(context, TransportConstants.ACTION_USB_ACCESSORY_ATTACHED); onSdlEnabled(context, intent); return; - } else if (action.equalsIgnoreCase(TransportConstants.START_ROUTER_SERVICE_ACTION)) { - AndroidTools.updateRouterServiceEnabled(context, TransportConstants.START_ROUTER_SERVICE_ACTION); - } else if (action.equalsIgnoreCase(BluetoothDevice.ACTION_ACL_CONNECTED)){ - AndroidTools.updateRouterServiceEnabled(context, BluetoothDevice.ACTION_ACL_CONNECTED); } if (intent.hasExtra(BluetoothDevice.EXTRA_DEVICE)) { //Grab the bluetooth device if available @@ -435,7 +430,7 @@ public abstract class SdlBroadcastReceiver extends BroadcastReceiver { for (RunningServiceInfo service : runningServices) { //We will check to see if it contains this name, should be pretty specific //Log.d(TAG, "Found Service: "+ service.service.getClassName()); - if ((service.service.getClassName()).toLowerCase(Locale.US).contains(SDL_ROUTER_SERVICE_CLASS_NAME) && AndroidTools.isServiceExported(context, service.service) && AndroidTools.isServiceEnabled(context, service.service)) { + if ((service.service.getClassName()).toLowerCase(Locale.US).contains(SDL_ROUTER_SERVICE_CLASS_NAME) && AndroidTools.isServiceExported(context, service.service)) { runningBluetoothServicePackage.add(service.service); //Store which instance is running } } diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java b/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java index 0347e09ac..80669aa8d 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java @@ -1100,10 +1100,6 @@ public class SdlRouterService extends Service { DebugTool.logError(TAG, "Service isn't exported. Shutting down"); return false; } - if (!AndroidTools.isServiceEnabled(this, new ComponentName(this, this.getClass()))) { //We want to check to see if our service is actually enabled - DebugTool.logError(TAG, "Service isn't enabled. Shutting down"); - return false; - } ComponentName name = new ComponentName(this, this.getClass()); SdlAppInfo currentAppInfo = null; diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterStatusProvider.java b/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterStatusProvider.java index 43c5ce84b..b90a55684 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterStatusProvider.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterStatusProvider.java @@ -108,7 +108,7 @@ public class SdlRouterStatusProvider { } public void checkIsConnected() { - if (!AndroidTools.isServiceExported(context, routerService) || !AndroidTools.isServiceEnabled(context, routerService) || !bindToService()) { + if (!AndroidTools.isServiceExported(context, routerService) || !bindToService()) { //We are unable to bind to service cb.onConnectionStatusUpdate(false, routerService, context); unBindFromService(); diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java b/android/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java index 7461908a7..b588f1512 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java @@ -150,7 +150,7 @@ public class UsbTransferProvider { } public void checkIsConnected() { - if (!AndroidTools.isServiceExported(context, routerService) || !AndroidTools.isServiceEnabled(context, routerService) || !bindToService()) { + if (!AndroidTools.isServiceExported(context, routerService) || !bindToService()) { //We are unable to bind to service DebugTool.logError(TAG, "Unable to bind to service"); unBindFromService(); diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/util/AndroidTools.java b/android/sdl_android/src/main/java/com/smartdevicelink/util/AndroidTools.java index 61577cbb1..c20fe71ac 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/util/AndroidTools.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/util/AndroidTools.java @@ -32,7 +32,6 @@ package com.smartdevicelink.util; -import android.bluetooth.BluetoothDevice; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -52,7 +51,6 @@ import android.os.BatteryManager; import android.os.Build; import android.os.Bundle; import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; import com.smartdevicelink.marshal.JsonRPCMarshaller; import com.smartdevicelink.proxy.rpc.VehicleType; @@ -80,7 +78,6 @@ public class AndroidTools { private static final String TAG = "AndroidTools"; private static final String SDL_DEVICE_VEHICLES_PREFS = "sdl.device.vehicles"; - private static final String SDL_ROUTER_SERVICE_PROCESS_NAME = "com.smartdevicelink.router"; private static final Object VEHICLE_PREF_LOCK = new Object(); /** @@ -100,25 +97,6 @@ public class AndroidTools { return false; } - /** - * Check to see if a component is enabled - * - * @param context object used to retrieve the package manager - * @param name of the component in question - * @return true if this component is tagged as enabled - */ - public static boolean isServiceEnabled(Context context, ComponentName name) { - try { - ServiceInfo serviceInfo = context.getPackageManager().getServiceInfo(name, PackageManager.GET_META_DATA); - return serviceInfo.isEnabled(); - } catch (NameNotFoundException e) { - e.printStackTrace(); - } - return false; - } - - - /** * Get all SDL enabled apps. If the package name is null, it will return all apps. However, if the package name is included, the * resulting hash map will not include the app with that package name. @@ -196,12 +174,12 @@ public class AndroidTools { for (ResolveInfo info : resolveInfoList) { PackageInfo packageInfo; try { - packageInfo = packageManager.getPackageInfo(info.serviceInfo.packageName, 0); - SdlAppInfo appInformation = new SdlAppInfo(info, packageInfo, context); - if (info.serviceInfo.enabled) { + packageInfo = packageManager.getPackageInfo(info.serviceInfo.packageName, PackageManager.GET_PERMISSIONS); + boolean btPermissionsAllowed = areBtPermissionsGranted(context, info.serviceInfo.packageName); + if (btPermissionsAllowed) { + SdlAppInfo appInformation = new SdlAppInfo(info, packageInfo, context); sdlAppInfoList.add(appInformation); } - } catch (NameNotFoundException e) { //Package was not found, likely a sign the resolve info can't be trusted. } @@ -227,35 +205,25 @@ public class AndroidTools { return sdlAppInfoList; } - public static void updateRouterServiceEnabled(Context context, String transport) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - PackageManager pm = context.getPackageManager(); - try { - PackageInfo info = pm.getPackageInfo(context.getPackageName(),PackageManager.GET_SERVICES); - ServiceInfo[] services = info.services; - if (services != null) { - for (ServiceInfo service : services) { - //If this service is this apps router service - if (service.processName != null && service.processName.equalsIgnoreCase(SDL_ROUTER_SERVICE_PROCESS_NAME)) { - if (transport.equalsIgnoreCase(BluetoothDevice.ACTION_ACL_CONNECTED)) { - //Set service enabled based on if BT permissions were enabled - int btConnectPermission = ContextCompat.checkSelfPermission(context, BLUETOOTH_CONNECT); - int btScanPermission = ContextCompat.checkSelfPermission(context, BLUETOOTH_SCAN); - service.enabled = btConnectPermission == PackageManager.PERMISSION_GRANTED && btScanPermission == PackageManager.PERMISSION_GRANTED; - } else { - //Set service to enabled so USB Router Service can connect even if BT permissions were denied; - service.enabled = true; - } - } - } - } - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } + public static boolean areBtPermissionsGranted(Context context, String servicePackageName) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + //Permissions are only for SDK 31 and above + return true; + } + PackageManager packageManager = context.getPackageManager(); + PackageInfo packageInfo; + try { + packageInfo = packageManager.getPackageInfo(servicePackageName, PackageManager.GET_PERMISSIONS); + int btConnectPermission = packageManager.checkPermission(BLUETOOTH_CONNECT, packageInfo.packageName); + int btScanPermission = packageManager.checkPermission(BLUETOOTH_SCAN, packageInfo.packageName); + return btConnectPermission == PackageManager.PERMISSION_GRANTED && btScanPermission == PackageManager.PERMISSION_GRANTED; + } catch (NameNotFoundException e) { + e.printStackTrace(); + DebugTool.logError(TAG, "servicePackageName not found while checking BT permissions"); + return false; } } - /** * Sends the provided intent to the specified destinations making it an explicit intent, rather * than an implicit intent. A direct replacement of sendBroadcast(Intent). As of Android 8.0 diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/util/IntegrationValidator.java b/android/sdl_android/src/main/java/com/smartdevicelink/util/IntegrationValidator.java index 8e904a45f..371bc4e09 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/util/IntegrationValidator.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/util/IntegrationValidator.java @@ -33,12 +33,14 @@ package com.smartdevicelink.util; import android.Manifest; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; import android.os.Build; import com.smartdevicelink.R; @@ -198,6 +200,20 @@ public class IntegrationValidator { boolean serviceFilterHasAction = false; String className = localRouterClass.getName(); + + boolean areBtPermissionsEnabled = true; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + areBtPermissionsEnabled = false; + try { + ComponentName cn = new ComponentName(context.getPackageName(), className); + PackageManager pm = context.getPackageManager(); + ServiceInfo serviceInfo = pm.getServiceInfo(cn, 0); + areBtPermissionsEnabled = AndroidTools.areBtPermissionsGranted(context, serviceInfo.packageName); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + } + List services = AndroidTools.querySdlAppInfo(context, null, null); for (SdlAppInfo sdlAppInfo : services) { if (sdlAppInfo != null && sdlAppInfo.getRouterServiceComponentName() != null @@ -206,7 +222,11 @@ public class IntegrationValidator { break; } } - if (!serviceFilterHasAction) { + + if (!serviceFilterHasAction && !areBtPermissionsEnabled) { + retVal.successful = true; + retVal.resultText = "intent-filter not found for SdlRouterService because BT Permissions are disabled"; + } else if (!serviceFilterHasAction && areBtPermissionsEnabled) { retVal.successful = false; retVal.resultText = "This application has not specified its intent-filter for the SdlRouterService."; } -- cgit v1.2.1