diff options
author | Joey Grover <joeygrover@gmail.com> | 2022-09-07 14:59:40 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-07 14:59:40 -0400 |
commit | b99a2cabbf5d19c027e2443d68b21e7881d55ef6 (patch) | |
tree | fa5fd0062839e43c8e522db45a1b98064c90535d | |
parent | 77db6569f76535f3546da92e2b2d71a42be20d5f (diff) | |
download | sdl_android-b99a2cabbf5d19c027e2443d68b21e7881d55ef6.tar.gz |
Bugfix/issue 1802 Unregister apps when audio output becomes unavailable (#1827)
* Add audio output status callback set to SdlSession
Add to Andoroid’s SdlSession since it is only an Android feature
* Add callback for audio output status in LCM
Closes LCM if audio outpput is required and no longer available. Properly clears apps off IVI.
* Add helloSDL buildFlavor for audio output required
4 files changed, 44 insertions, 4 deletions
diff --git a/android/hello_sdl_android/build.gradle b/android/hello_sdl_android/build.gradle index e647f52a6..fa8a08a93 100755 --- a/android/hello_sdl_android/build.gradle +++ b/android/hello_sdl_android/build.gradle @@ -8,6 +8,8 @@ android { targetSdkVersion 33 versionCode 1 versionName "1.0" + buildConfigField 'String', 'APP_TYPE', '"DEFAULT"' + buildConfigField 'String', 'REQUIRE_AUDIO_OUTPUT', '"FALSE"' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { @@ -42,6 +44,13 @@ android { buildConfigField 'String', 'TRANSPORT', '"TCP"' buildConfigField 'String', 'SECURITY', '"OFF"' } + requiresAudioOutput { + buildConfigField 'String', 'TRANSPORT', '"MULTI"' + buildConfigField 'String', 'SECURITY', '"OFF"' + buildConfigField 'String', 'APP_TYPE', '"MEDIA"' + buildConfigField 'String', 'REQUIRE_AUDIO_OUTPUT', '"TRUE"' + + } } lintOptions { disable 'GoogleAppIndexingWarning' diff --git a/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlService.java b/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlService.java index 59daf2050..be147af0b 100755 --- a/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlService.java +++ b/android/hello_sdl_android/src/main/java/com/sdl/hellosdlandroid/SdlService.java @@ -162,6 +162,9 @@ public class SdlService extends Service { securityLevel = MultiplexTransportConfig.FLAG_MULTI_SECURITY_OFF; } transport = new MultiplexTransportConfig(this, APP_ID, securityLevel); + if (BuildConfig.REQUIRE_AUDIO_OUTPUT.equals("TRUE") ) { + ((MultiplexTransportConfig)transport).setRequiresAudioSupport(true); + } } else if (BuildConfig.TRANSPORT.equals("TCP")) { transport = new TCPTransportConfig(TCP_PORT, DEV_MACHINE_IP_ADDRESS, true); } else if (BuildConfig.TRANSPORT.equals("MULTI_HB")) { @@ -172,7 +175,8 @@ public class SdlService extends Service { // The app type to be used Vector<AppHMIType> appType = new Vector<>(); - appType.add(AppHMIType.DEFAULT); + appType.add(AppHMIType.valueForString(BuildConfig.APP_TYPE)); + // The manager listener helps you know when certain events that pertain to the SDL Manager happen // Here we will listen for ON_HMI_STATUS and ON_COMMAND notifications 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"); + } } }); } |