diff options
author | RHeniz <heniganr1@gmail.com> | 2021-11-02 15:08:00 -0400 |
---|---|---|
committer | RHeniz <heniganr1@gmail.com> | 2021-11-02 15:08:00 -0400 |
commit | 316c673a5d9b4e8e144ed759d901f6ac5f8043c5 (patch) | |
tree | 453dc3b75615e1415e21c43b6369f0081369d2c8 /android/sdl_android | |
parent | 17d39c219119a41b6eb1b87c4f68774ef3da32a6 (diff) | |
download | sdl_android-316c673a5d9b4e8e144ed759d901f6ac5f8043c5.tar.gz |
BroadcastReceiver changes
Diffstat (limited to 'android/sdl_android')
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 |