summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenigan <rheniga1@MGC12Z921DLVCG.fbpld77.ford.com>2021-11-03 15:15:55 -0400
committerHenigan <rheniga1@MGC12Z921DLVCG.fbpld77.ford.com>2021-11-03 15:15:55 -0400
commit8c58dc42567029ffe326520b908397ca4d09f3e9 (patch)
tree18e79a0f5bfb43e59f0cf5e661d5140825bebfeb
parent90f8a4a42bd7e256c7121124450277826aa7a830 (diff)
downloadsdl_android-8c58dc42567029ffe326520b908397ca4d09f3e9.tar.gz
Fix broadcastReceiverBehavior
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlBroadcastReceiver.java7
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java4
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterStatusProvider.java2
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/transport/UsbTransferProvider.java2
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/util/AndroidTools.java72
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/util/IntegrationValidator.java22
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();
/**
@@ -101,25 +98,6 @@ public class AndroidTools {
}
/**
- * 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<SdlAppInfo> 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.";
}