diff options
author | RHeniz <heniganr1@gmail.com> | 2021-11-19 16:08:42 -0500 |
---|---|---|
committer | RHeniz <heniganr1@gmail.com> | 2021-11-19 16:08:42 -0500 |
commit | 71dc5f62629e76544a16b9ee67d083548167991d (patch) | |
tree | 6daa267f05a2b0ef376ef63e49c8e45b82cf4241 | |
parent | e5bb2cf6648ced76dff582a87ac56bcb89d2e2e6 (diff) | |
download | sdl_android-71dc5f62629e76544a16b9ee67d083548167991d.tar.gz |
Add PendingIntents to start services from RS
5 files changed, 33 insertions, 6 deletions
diff --git a/android/hello_sdl_android/src/main/AndroidManifest.xml b/android/hello_sdl_android/src/main/AndroidManifest.xml index 992373fa1..636d236ad 100755 --- a/android/hello_sdl_android/src/main/AndroidManifest.xml +++ b/android/hello_sdl_android/src/main/AndroidManifest.xml @@ -59,6 +59,7 @@ <service android:name="com.sdl.hellosdlandroid.SdlService" + android:exported="true" android:foregroundServiceType="connectedDevice"> </service> <service diff --git a/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlReceiver.java b/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlReceiver.java index ec2ebd31c..770513e94 100755 --- a/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlReceiver.java +++ b/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlReceiver.java @@ -1,11 +1,13 @@ package com.sdl.hellosdlandroid; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Build; import com.smartdevicelink.transport.SdlBroadcastReceiver; import com.smartdevicelink.transport.SdlRouterService; +import com.smartdevicelink.transport.TransportConstants; import com.smartdevicelink.util.DebugTool; public class SdlReceiver extends SdlBroadcastReceiver { @@ -16,17 +18,24 @@ public class SdlReceiver extends SdlBroadcastReceiver { DebugTool.logInfo(TAG, "SDL Enabled"); intent.setClass(context, SdlService.class); - // SdlService needs to be foregrounded in Android O and above - // This will prevent apps in the background from crashing when they try to start SdlService - // Because Android O doesn't allow background apps to start background services - try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if (intent.getParcelableExtra(TransportConstants.PENDING_INTENT_EXTRA) != null) { + PendingIntent pendingIntent = (PendingIntent) intent.getParcelableExtra(TransportConstants.PENDING_INTENT_EXTRA); + try { + pendingIntent.send(context, 0, intent); + } catch (PendingIntent.CanceledException e) { + e.printStackTrace(); + } + } + } else { + // SdlService needs to be foregrounded in Android O and above + // This will prevent apps in the background from crashing when they try to start SdlService + // Because Android O doesn't allow background apps to start background services if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context.startForegroundService(intent); } else { context.startService(intent); } - } catch (Exception e) { - DebugTool.logError("RHENIGAN", "Failed to start SdlService!"); } } 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 fa4ba4054..ca585c445 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 @@ -1826,6 +1826,10 @@ public class SdlRouterService extends Service { startService.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + startService.putExtra(TransportConstants.PENDING_BOOLEAN_EXTRA, true); + } + AndroidTools.sendExplicitBroadcast(getApplicationContext(), startService, null); //HARDWARE_CONNECTED @@ -2902,6 +2906,9 @@ public class SdlRouterService extends Service { if (receivedVehicleType != null) { pingIntent.putExtra(TransportConstants.VEHICLE_INFO_EXTRA, receivedVehicleType.getStore()); } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + pingIntent.putExtra(TransportConstants.PENDING_BOOLEAN_EXTRA, true); + } } private void startClientPings() { 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 02ef5169d..0b9125352 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.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -249,6 +250,13 @@ public class AndroidTools { for (ResolveInfo app : apps) { try { intent.setClassName(app.activityInfo.applicationInfo.packageName, app.activityInfo.name); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && intent.getBooleanExtra(TransportConstants.PENDING_BOOLEAN_EXTRA, false)) { + Intent pending = new Intent(); + PendingIntent pendingIntent = PendingIntent.getForegroundService(context, (int) System.currentTimeMillis(), pending, PendingIntent.FLAG_MUTABLE | Intent.FILL_IN_COMPONENT); + intent.putExtra(TransportConstants.PENDING_INTENT_EXTRA, pendingIntent); + } + context.sendBroadcast(intent); } catch (Exception e) { //In case there is missing info in the app reference we want to keep moving diff --git a/base/src/main/java/com/smartdevicelink/transport/TransportConstants.java b/base/src/main/java/com/smartdevicelink/transport/TransportConstants.java index 64bae4b41..8176b984b 100644 --- a/base/src/main/java/com/smartdevicelink/transport/TransportConstants.java +++ b/base/src/main/java/com/smartdevicelink/transport/TransportConstants.java @@ -46,6 +46,8 @@ public class TransportConstants { public static final String CONFIRMED_SDL_DEVICE = "confirmed_sdl_device"; public static final String VEHICLE_INFO_EXTRA = "vehicle_info"; public static final String CONNECTION_TYPE_EXTRA = "connection_type"; + public static final String PENDING_BOOLEAN_EXTRA = "pending_true"; + public static final String PENDING_INTENT_EXTRA = "pending_intent"; public static final String BIND_LOCATION_PACKAGE_NAME_EXTRA = "BIND_LOCATION_PACKAGE_NAME_EXTRA"; public static final String BIND_LOCATION_CLASS_NAME_EXTRA = "BIND_LOCATION_CLASS_NAME_EXTRA"; |