summaryrefslogtreecommitdiff
path: root/android/sdl_android/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'android/sdl_android/src/main/java/com')
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/managers/file/filetypes/SdlArtwork.java2
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java13
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/session/SdlSession.java20
-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/SdlRouterStatusProvider.java14
-rw-r--r--android/sdl_android/src/main/java/com/smartdevicelink/transport/USBAccessoryAttachmentActivity.java4
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) {