diff options
Diffstat (limited to 'android/sdl_android/src/main')
6 files changed, 72 insertions, 13 deletions
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/file/filetypes/SdlArtwork.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/file/filetypes/SdlArtwork.java index b46745917..bc7dfe3bb 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/file/filetypes/SdlArtwork.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/file/filetypes/SdlArtwork.java @@ -160,7 +160,7 @@ public class SdlArtwork extends SdlFile implements Cloneable { public SdlArtwork clone() { SdlArtwork artwork = (SdlArtwork) super.clone(); if (artwork != null) { - artwork.imageRPC = artwork.createImageRPC(); + artwork.imageRPC = null; return artwork; } return null; diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java index bfe73c19f..ae8ba7b23 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java @@ -55,6 +55,7 @@ import com.smartdevicelink.transport.enums.TransportType; import com.smartdevicelink.transport.utl.TransportRecord; import com.smartdevicelink.util.AndroidTools; import com.smartdevicelink.util.DebugTool; +import com.smartdevicelink.util.MediaStreamingStatus; import java.lang.ref.WeakReference; import java.util.List; @@ -80,7 +81,17 @@ public class LifecycleManager extends BaseLifecycleManager { synchronized (SESSION_LOCK) { if (_transportConfig != null && _transportConfig.getTransportType().equals(TransportType.MULTIPLEX)) { - this.session = new SdlSession(sdlSessionListener, (MultiplexTransportConfig) _transportConfig); + MultiplexTransportConfig multiplexTransportConfig = (MultiplexTransportConfig) _transportConfig; + this.session = new SdlSession(sdlSessionListener, multiplexTransportConfig); + if (multiplexTransportConfig.requiresAudioSupport()) { + this.session.setMediaStreamingStatusCallback(new MediaStreamingStatus.Callback() { + @Override + public void onAudioNoLongerAvailable() { + clean(true); + onClose("Audio output no longer available", null, SdlDisconnectedReason.DEFAULT); + } + }); + } } else if (_transportConfig != null && _transportConfig.getTransportType().equals(TransportType.TCP)) { this.session = new SdlSession(sdlSessionListener, (TCPTransportConfig) _transportConfig); } else { diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/session/SdlSession.java b/android/sdl_android/src/main/java/com/smartdevicelink/session/SdlSession.java index 74701c867..633904bb0 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/session/SdlSession.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/session/SdlSession.java @@ -62,6 +62,7 @@ public class SdlSession extends BaseSdlSession { WeakReference<Context> contextWeakReference; MediaStreamingStatus mediaStreamingStatus; boolean requiresAudioSupport = false; + MediaStreamingStatus.Callback mediaStreamingStatusCallback; public SdlSession(ISdlSessionListener listener, MultiplexTransportConfig config) { super(listener, config); @@ -79,6 +80,17 @@ public class SdlSession extends BaseSdlSession { this.sessionListener = listener; } + /** + * Sets a callback that is triggered when there are no audio output methods available. If this + * is set then the caller of this method will be responsible for shutting the session down. + * + * @param mediaStreamingStatusCallback the callback that will be triggered when audio output is + * no longer available. + */ + public void setMediaStreamingStatusCallback(MediaStreamingStatus.Callback mediaStreamingStatusCallback) { + this.mediaStreamingStatusCallback = mediaStreamingStatusCallback; + } + protected SdlProtocolBase getSdlProtocolImplementation() { if (transportConfig instanceof MultiplexTransportConfig) { return new SdlProtocol(this, (MultiplexTransportConfig) transportConfig); @@ -94,8 +106,12 @@ public class SdlSession extends BaseSdlSession { mediaStreamingStatus = new MediaStreamingStatus(contextWeakReference.get(), new MediaStreamingStatus.Callback() { @Override public void onAudioNoLongerAvailable() { - close(); - shutdown("Audio output no longer available"); + if (mediaStreamingStatusCallback != null) { + mediaStreamingStatusCallback.onAudioNoLongerAvailable(); + } else { + close(); + shutdown("Audio output no longer available"); + } } }); } 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 7bed1b482..936989f5c 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 @@ -34,6 +34,8 @@ package com.smartdevicelink.transport; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; +import android.app.ForegroundServiceStartNotAllowedException; +import android.app.ServiceStartNotAllowedException; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; @@ -282,8 +284,8 @@ public abstract class SdlBroadcastReceiver extends BroadcastReceiver { restart.putExtra(LOCAL_ROUTER_SERVICE_DID_START_OWN, true); context.sendBroadcast(restart); - } catch (SecurityException e) { - DebugTool.logError(TAG, "Security exception, process is bad"); + } catch (SecurityException | IllegalStateException e) { + handleStartServiceException(e); } } @@ -478,9 +480,8 @@ public abstract class SdlBroadcastReceiver extends BroadcastReceiver { } else { context.startService(intent); } - } catch (SecurityException e) { - DebugTool.logError(TAG, "Security exception, process is bad"); - // This service could not be started + } catch (SecurityException | IllegalStateException e) { + handleStartServiceException(e); } } @@ -599,6 +600,27 @@ public abstract class SdlBroadcastReceiver extends BroadcastReceiver { return false; } + /** + * Convenience method to log details on the specific exception that occurred while attempting to + * start a foreground service. + * @param e the exception that occurred + */ + protected static void handleStartServiceException(Exception e) { + if (e instanceof SecurityException) { + DebugTool.logError(TAG, "Security exception, process is bad"); + return; + } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { + if (e instanceof ForegroundServiceStartNotAllowedException) { + DebugTool.logError(TAG, "Not allowed to start service in foreground"); + return; + } else if (e instanceof ServiceStartNotAllowedException) { + DebugTool.logError(TAG, "Not allowed to start service in current state"); + return; + } + } + DebugTool.logError(TAG, "Unable to start service for unknown reason"); + } + private static SdlDeviceListener getSdlDeviceListener(Context context, BluetoothDevice bluetoothDevice) { 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..078fe104c 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 @@ -136,11 +136,21 @@ public class SdlRouterStatusProvider { } else { bindingIntent.putExtra(FOREGROUND_EXTRA, true); SdlBroadcastReceiver.setForegroundExceptionHandler(); //Prevent ANR in case the OS takes too long to start the service - context.startForegroundService(bindingIntent); + try { + context.startForegroundService(bindingIntent); + } catch (SecurityException | IllegalStateException e) { + SdlBroadcastReceiver.handleStartServiceException(e); + } } bindingIntent.setAction(TransportConstants.BIND_REQUEST_TYPE_STATUS); - return context.bindService(bindingIntent, routerConnection, Context.BIND_AUTO_CREATE); + boolean didBind = false; + try { + didBind = context.bindService(bindingIntent, routerConnection, Context.BIND_AUTO_CREATE); + } catch (SecurityException | IllegalStateException e) { + SdlBroadcastReceiver.handleStartServiceException(e); + } + return didBind; } private void unBindFromService() { diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/transport/USBAccessoryAttachmentActivity.java b/android/sdl_android/src/main/java/com/smartdevicelink/transport/USBAccessoryAttachmentActivity.java index 22ee5d1db..7bb2f753b 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/transport/USBAccessoryAttachmentActivity.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/transport/USBAccessoryAttachmentActivity.java @@ -202,8 +202,8 @@ public class USBAccessoryAttachmentActivity extends Activity { }
- } catch (SecurityException e) {
- DebugTool.logError(TAG, "Security exception, process is bad");
+ } catch (SecurityException | IllegalStateException e) {
+ SdlBroadcastReceiver.handleStartServiceException(e);
}
} else {
if (usbAccessory != null) {
|