summaryrefslogtreecommitdiff
path: root/android/sdl_android
diff options
context:
space:
mode:
authorRHeniz <heniganr1@gmail.com>2021-11-02 15:08:00 -0400
committerRHeniz <heniganr1@gmail.com>2021-11-02 15:08:00 -0400
commit316c673a5d9b4e8e144ed759d901f6ac5f8043c5 (patch)
tree453dc3b75615e1415e21c43b6369f0081369d2c8 /android/sdl_android
parent17d39c219119a41b6eb1b87c4f68774ef3da32a6 (diff)
downloadsdl_android-316c673a5d9b4e8e144ed759d901f6ac5f8043c5.tar.gz
BroadcastReceiver changes
Diffstat (limited to 'android/sdl_android')
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/transport/SdlBroadcastReceiver.java32
-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.java58
5 files changed, 69 insertions, 29 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 4607ca74e..28c787f3a 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
@@ -77,7 +77,6 @@ import static com.smartdevicelink.transport.TransportConstants.FOREGROUND_EXTRA;
public abstract class SdlBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "Sdl Broadcast Receiver";
- private static final String SDL_ROUTER_SERVICE_PROCESS_NAME = "com.smartdevicelink.router";
protected static final String SDL_ROUTER_SERVICE_CLASS_NAME = "sdlrouterservice";
@@ -131,32 +130,13 @@ 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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
- //Check BT Permissions
- int btConnectPermission = ContextCompat.checkSelfPermission(context, BLUETOOTH_CONNECT);
- int btScanPermission = ContextCompat.checkSelfPermission(context, BLUETOOTH_SCAN);
-
- 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)) {
- //Set the service enabled flag to True or False based on if the user has granted BT permissions
- service.enabled = btConnectPermission == PackageManager.PERMISSION_GRANTED && btScanPermission == PackageManager.PERMISSION_GRANTED;
- }
- }
- }
-
- } catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- }
- }
+ } 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
@@ -455,7 +435,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)) {
+ if ((service.service.getClassName()).toLowerCase(Locale.US).contains(SDL_ROUTER_SERVICE_CLASS_NAME) && AndroidTools.isServiceExported(context, service.service) && AndroidTools.isServiceEnabled(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 953950365..0aa28bb4a 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,6 +1100,10 @@ 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 b90a55684..43c5ce84b 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) || !bindToService()) {
+ if (!AndroidTools.isServiceExported(context, routerService) || !AndroidTools.isServiceEnabled(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 b588f1512..7461908a7 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) || !bindToService()) {
+ if (!AndroidTools.isServiceExported(context, routerService) || !AndroidTools.isServiceEnabled(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 1f4ba2de0..61577cbb1 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,6 +32,7 @@
package com.smartdevicelink.util;
+import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -48,8 +49,10 @@ import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
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;
@@ -69,11 +72,15 @@ import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
+import static android.Manifest.permission.BLUETOOTH_CONNECT;
+import static android.Manifest.permission.BLUETOOTH_SCAN;
+
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();
/**
@@ -94,6 +101,25 @@ 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.
*
@@ -172,7 +198,9 @@ public class AndroidTools {
try {
packageInfo = packageManager.getPackageInfo(info.serviceInfo.packageName, 0);
SdlAppInfo appInformation = new SdlAppInfo(info, packageInfo, context);
- sdlAppInfoList.add(appInformation);
+ if (info.serviceInfo.enabled) {
+ sdlAppInfoList.add(appInformation);
+ }
} catch (NameNotFoundException e) {
//Package was not found, likely a sign the resolve info can't be trusted.
@@ -199,6 +227,34 @@ 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();
+ }
+ }
+ }
+
/**
* Sends the provided intent to the specified destinations making it an explicit intent, rather