From 2fcbb96c962326fd938cb2252bebc487f58e4fd0 Mon Sep 17 00:00:00 2001 From: Joey Grover Date: Fri, 28 Sep 2018 14:32:11 -0400 Subject: Add a transport event listener and correct READY state for the manager --- .../smartdevicelink/managers/BaseSubManager.java | 18 ++++++ .../com/smartdevicelink/managers/SdlManager.java | 27 +++++++++ .../managers/video/VideoStreamingManager.java | 70 +++++++++++++++++++++- 3 files changed, 114 insertions(+), 1 deletion(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java index edd9ff640..590a846a5 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java @@ -3,6 +3,9 @@ package com.smartdevicelink.managers; import android.support.annotation.NonNull; import com.smartdevicelink.proxy.interfaces.ISdl; +import com.smartdevicelink.transport.utl.TransportRecord; + +import java.util.List; /** * BaseSubManager
@@ -64,4 +67,19 @@ public abstract class BaseSubManager { return state; } } + + //This allows the method to not be exposed to developers + protected void handleTransportUpdated(List connectedTransports, boolean audioStreamTransportAvail, boolean videoStreamTransportAvail){ + this.onTransportUpdate(connectedTransports,audioStreamTransportAvail,videoStreamTransportAvail); + } + + /** + * Transport status has been updated + * @param connectedTransports currently connected transports + * @param audioStreamTransportAvail if there is a transport that could be used to carry the + * audio service + * @param videoStreamTransportAvail if there is a transport that could be used to carry the + * video service + */ + protected void onTransportUpdate(List connectedTransports, boolean audioStreamTransportAvail, boolean videoStreamTransportAvail){} } diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 1c478b8c4..bbac4c331 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -44,6 +44,9 @@ import com.smartdevicelink.streaming.audio.AudioStreamingCodec; import com.smartdevicelink.streaming.audio.AudioStreamingParams; import com.smartdevicelink.streaming.video.VideoStreamingParameters; import com.smartdevicelink.transport.BaseTransportConfig; +import com.smartdevicelink.transport.MultiplexTransportConfig; +import com.smartdevicelink.transport.enums.TransportType; +import com.smartdevicelink.transport.utl.TransportRecord; import java.util.ArrayList; import java.util.List; @@ -630,6 +633,30 @@ public class SdlManager{ public void start(){ if (proxy == null) { try { + if(transport!= null && transport.getTransportType() == TransportType.MULTIPLEX){ + //Do the thing + MultiplexTransportConfig multiplexTransportConfig = (MultiplexTransportConfig)(transport); + final MultiplexTransportConfig.TransportListener devListener = multiplexTransportConfig.getTransportListener(); + multiplexTransportConfig.setTransportListener(new MultiplexTransportConfig.TransportListener() { + @Override + public void onTransportEvent(List connectedTransports, boolean audioStreamTransportAvail, boolean videoStreamTransportAvail) { + + //Pass to submanagers that need it + if(videoStreamingManager != null){ + videoStreamingManager.handleTransportUpdated(connectedTransports, audioStreamTransportAvail, videoStreamTransportAvail); + } + + if(audioStreamManager != null){ + audioStreamManager.handleTransportUpdated(connectedTransports, audioStreamTransportAvail, videoStreamTransportAvail); + } + //If the developer supplied a listener to start, it is time to call that + if(devListener != null){ + devListener.onTransportEvent(connectedTransports,audioStreamTransportAvail,videoStreamTransportAvail); + } + } + }); + } + proxy = new SdlProxyBase(proxyBridge, context, appName, shortAppName, isMediaApp, hmiLanguage, hmiLanguage, hmiTypes, appId, transport, vrSynonyms, ttsChunks, dayColorScheme, nightColorScheme) {}; diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java index 3ececf0b0..94d99f7d3 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java @@ -36,6 +36,8 @@ import com.smartdevicelink.proxy.rpc.enums.TouchType; import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener; import com.smartdevicelink.streaming.video.SdlRemoteDisplay; import com.smartdevicelink.streaming.video.VideoStreamingParameters; +import com.smartdevicelink.transport.utl.TransportRecord; +import com.smartdevicelink.util.Version; import java.lang.ref.WeakReference; import java.util.List; @@ -56,6 +58,7 @@ public class VideoStreamingManager extends BaseSubManager { private StreamingStateMachine stateMachine; private VideoStreamingParameters parameters; private IVideoStreamListener streamListener; + private boolean isTransportAvailable = false; // INTERNAL INTERFACES @@ -89,6 +92,9 @@ public class VideoStreamingManager extends BaseSubManager { public void onNotified(RPCNotification notification) { if(notification != null){ hmiLevel = ((OnHMIStatus)notification).getHmiLevel(); + if(hmiLevel.equals(HMILevel.HMI_FULL)){ + checkState(); + } } } }; @@ -125,10 +131,52 @@ public class VideoStreamingManager extends BaseSubManager { @Override public void start(CompletionListener listener) { - transitionToState(READY); + getVideoStreamingParams(); super.start(listener); } + private synchronized void checkState(){ + if(isTransportAvailable + && hmiLevel != null + && hmiLevel.equals(HMILevel.HMI_FULL) + && parameters != null){ + transitionToState(READY); + } + } + + private void getVideoStreamingParams(){ + if(internalInterface.getProtocolVersion().getMajor() >= 5) { + internalInterface.getCapability(SystemCapabilityType.VIDEO_STREAMING, new OnSystemCapabilityListener() { + @Override + public void onCapabilityRetrieved(Object capability) { + VideoStreamingParameters params = new VideoStreamingParameters(); + params.update((VideoStreamingCapability)capability); //Streaming parameters are ready time to stream + VideoStreamingManager.this.parameters = params; + + checkState(); + + } + + @Override + public void onError(String info) { + Log.e(TAG, "Error retrieving video streaming capability: " + info); + stateMachine.transitionToState(StreamingStateMachine.ERROR); + transitionToState(ERROR); + } + }); + }else{ + //We just use default video streaming params + VideoStreamingParameters params = new VideoStreamingParameters(); + DisplayCapabilities dispCap = (DisplayCapabilities)internalInterface.getCapability(SystemCapabilityType.DISPLAY); + if(dispCap !=null){ + params.setResolution(dispCap.getScreenParams().getImageResolution()); + } + + this.parameters = params; + checkState(); + } + } + /** * Starts streaming a remote display to the module if there is a connected session. This method of streaming requires the device to be on API level 19 or higher * @param context a context that can be used to create the remote display @@ -540,4 +588,24 @@ public class VideoStreamingManager extends BaseSubManager { } } + @Override + protected void onTransportUpdate(List connectedTransports, boolean audioStreamTransportAvail, boolean videoStreamTransportAvail){ + + isTransportAvailable = videoStreamTransportAvail; + + if(internalInterface.getProtocolVersion().isNewerThan(new Version(5,1,0)) >= 0){ + if(videoStreamTransportAvail){ + checkState(); + } + }else{ + //The protocol version doesn't support simultaneous transports. + if(!videoStreamTransportAvail){ + //If video streaming isn't available on primary transport then it is not possible to + //use the video streaming manager until a complete register on a transport that + //supports video + transitionToState(ERROR); + } + } + } + } \ No newline at end of file -- cgit v1.2.1 From 65e6fdef8b5ccff780aa8cda84d354a1bab9791f Mon Sep 17 00:00:00 2001 From: Joey Grover Date: Fri, 28 Sep 2018 15:07:35 -0400 Subject: Fix videostreamingmanager unit tests --- .../com/smartdevicelink/managers/video/VideoStreamingManagerTests.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/video/VideoStreamingManagerTests.java b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/video/VideoStreamingManagerTests.java index baddc8182..1099a1623 100644 --- a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/video/VideoStreamingManagerTests.java +++ b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/video/VideoStreamingManagerTests.java @@ -90,6 +90,7 @@ public class VideoStreamingManagerTests extends AndroidTestCase { public void testInitialization(){ ISdl internalInterface = mock(ISdl.class); + when(internalInterface.getProtocolVersion()).thenReturn(new Version(5,1,0)); Answer onAddServiceListener = new Answer() { @Override @@ -242,6 +243,7 @@ public class VideoStreamingManagerTests extends AndroidTestCase { public void testConvertTouchEvent(){ ISdl internalInterface = mock(ISdl.class); + when(internalInterface.getProtocolVersion()).thenReturn(new Version(5,1,0)); final VideoStreamingManager videoStreamingManager = new VideoStreamingManager(internalInterface); videoStreamingManager.start(new CompletionListener() { -- cgit v1.2.1 From 68289f25de843f2aeeb90a570f20122003e72714 Mon Sep 17 00:00:00 2001 From: Joey Grover Date: Mon, 1 Oct 2018 10:52:34 -0400 Subject: Add isTransportForServiceAvailable to ISDL Add code in managers to leverage --- .../java/com/smartdevicelink/managers/SdlManager.java | 19 +++++++++++++++++-- .../managers/video/VideoStreamingManager.java | 5 ++++- .../java/com/smartdevicelink/proxy/SdlProxyBase.java | 6 ++++++ .../com/smartdevicelink/proxy/interfaces/ISdl.java | 12 ++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index bbac4c331..884733fb6 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -47,6 +47,7 @@ import com.smartdevicelink.transport.BaseTransportConfig; import com.smartdevicelink.transport.MultiplexTransportConfig; import com.smartdevicelink.transport.enums.TransportType; import com.smartdevicelink.transport.utl.TransportRecord; +import com.smartdevicelink.util.Version; import java.util.ArrayList; import java.util.List; @@ -821,6 +822,16 @@ public class SdlManager{ return proxy.removeOnSystemCapabilityListener(systemCapabilityType, listener); } + @Override + public boolean isTransportForServiceAvailable(SessionType serviceType) { + if(SessionType.NAV.equals(serviceType)){ + return proxy.isVideoStreamTransportAvailable(); + }else if(SessionType.PCM.equals(serviceType)){ + return proxy.isAudioStreamTransportAvailable(); + } + return false; + } + @Override public SdlMsgVersion getSdlMsgVersion(){ try { @@ -832,8 +843,12 @@ public class SdlManager{ } @Override - public com.smartdevicelink.util.Version getProtocolVersion() { - return proxy.getProtocolVersion(); + public @NonNull Version getProtocolVersion() { + if(proxy.getProtocolVersion() != null){ + return proxy.getProtocolVersion(); + }else{ + return new Version(1,0,0); + } } }; diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java index 94d99f7d3..3b42a7186 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java @@ -131,12 +131,15 @@ public class VideoStreamingManager extends BaseSubManager { @Override public void start(CompletionListener listener) { + isTransportAvailable = internalInterface.isTransportForServiceAvailable(SessionType.NAV); getVideoStreamingParams(); + checkState(); super.start(listener); } private synchronized void checkState(){ - if(isTransportAvailable + if(this.getState() == SETTING_UP + && isTransportAvailable && hmiLevel != null && hmiLevel.equals(HMILevel.HMI_FULL) && parameters != null){ diff --git a/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java b/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java index 6b2be9725..b376d7276 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java +++ b/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java @@ -391,6 +391,12 @@ public abstract class SdlProxyBase return SdlProxyBase.this.removeOnSystemCapabilityListener(systemCapabilityType, listener); } + @Override + public boolean isTransportForServiceAvailable(SessionType serviceType) { + return SdlProxyBase.this.sdlSession != null + && SdlProxyBase.this.sdlSession.isTransportForServiceAvailable(serviceType); + } + @Override public void startAudioService(boolean isEncrypted, AudioStreamingCodec codec, AudioStreamingParams params) { diff --git a/sdl_android/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java b/sdl_android/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java index 29d3b9073..5eb8ff36a 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java +++ b/sdl_android/src/main/java/com/smartdevicelink/proxy/interfaces/ISdl.java @@ -202,6 +202,18 @@ public interface ISdl { */ boolean removeOnSystemCapabilityListener(SystemCapabilityType systemCapabilityType, OnSystemCapabilityListener listener); + /** + * Check to see if a transport is available to start/use the supplied service. + * @param serviceType the session that should be checked for transport availability + * @return true if there is either a supported + * transport currently connected or a transport is + * available to connect with for the supplied service type. + *
false if there is no + * transport connected to support the service type in question and + * no possibility in the foreseeable future. + */ + boolean isTransportForServiceAvailable(SessionType serviceType); + /** * Get the RPC specification version currently being used for the SDL messages * @return SdlMsgVersion the current RPC specification version -- cgit v1.2.1 From 03d850f6c7ff22891cdd17a9f08acfc337aef399 Mon Sep 17 00:00:00 2001 From: Joey Grover Date: Mon, 1 Oct 2018 10:54:51 -0400 Subject: Clarify state to AudioStreamingManager --- .../managers/audio/AudioStreamManager.java | 67 +++++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java index a959ee93c..dc2e82904 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java @@ -20,13 +20,17 @@ import com.smartdevicelink.protocol.enums.SessionType; import com.smartdevicelink.proxy.interfaces.IAudioStreamListener; import com.smartdevicelink.proxy.interfaces.ISdl; import com.smartdevicelink.proxy.interfaces.ISdlServiceListener; +import com.smartdevicelink.proxy.interfaces.OnSystemCapabilityListener; import com.smartdevicelink.proxy.rpc.AudioPassThruCapabilities; import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType; +import com.smartdevicelink.transport.utl.TransportRecord; +import com.smartdevicelink.util.Version; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.ref.WeakReference; import java.util.LinkedList; +import java.util.List; import java.util.Queue; /** @@ -45,7 +49,8 @@ public class AudioStreamManager extends BaseSubManager { private final Queue queue; private final WeakReference context; private final StreamingStateMachine streamingStateMachine; - + private AudioPassThruCapabilities audioStreamingCapabilities; + private boolean isTransportAvailable = false; // This completion listener is used as a callback to the app developer when starting/stopping audio service private CompletionListener serviceCompletionListener; // As the internal interface does not provide timeout we need to use a future task @@ -120,6 +125,14 @@ public class AudioStreamManager extends BaseSubManager { */ public AudioStreamManager(@NonNull ISdl internalInterface, @NonNull Context context) { super(internalInterface); + if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN){ + this.queue = null; + this.context = null; + this.serviceCompletionHandler = null; + this.streamingStateMachine = null; + transitionToState(ERROR); + return; + } this.queue = new LinkedList<>(); this.context = new WeakReference<>(context); this.serviceCompletionHandler = new Handler(Looper.getMainLooper()); @@ -127,14 +140,43 @@ public class AudioStreamManager extends BaseSubManager { internalInterface.addServiceListener(SessionType.PCM, serviceListener); streamingStateMachine = new StreamingStateMachine(); + } @Override public void start(CompletionListener listener) { - transitionToState(READY); + isTransportAvailable = internalInterface.isTransportForServiceAvailable(SessionType.PCM); + getAudioStreamingCapabilities(); + checkState(); super.start(listener); } + private void checkState(){ + if(audioStreamingCapabilities != null + && isTransportAvailable){ + transitionToState(READY); + } + } + + private void getAudioStreamingCapabilities(){ + internalInterface.getCapability(SystemCapabilityType.PCM_STREAMING, new OnSystemCapabilityListener() { + @Override + public void onCapabilityRetrieved(Object capability) { + if(capability != null && capability instanceof AudioPassThruCapabilities){ + audioStreamingCapabilities = (AudioPassThruCapabilities) capability; + checkState(); + } + } + + @Override + public void onError(String info) { + Log.e(TAG, "Error retrieving audio streaming capability: " + info); + streamingStateMachine.transitionToState(StreamingStateMachine.ERROR); + transitionToState(ERROR); + } + }); + } + @Override public void dispose() { stopAudioStream(new CompletionListener() { @@ -331,6 +373,27 @@ public class AudioStreamManager extends BaseSubManager { } } + + @Override + protected void onTransportUpdate(List connectedTransports, boolean audioStreamTransportAvail, boolean videoStreamTransportAvail){ + + isTransportAvailable = audioStreamTransportAvail; + + if(internalInterface.getProtocolVersion().isNewerThan(new Version(5,1,0)) >= 0){ + if(audioStreamTransportAvail){ + checkState(); + } + }else{ + //The protocol version doesn't support simultaneous transports. + if(!audioStreamTransportAvail){ + //If video streaming isn't available on primary transport then it is not possible to + //use the video streaming manager until a complete register on a transport that + //supports video + transitionToState(ERROR); + } + } + } + @IntDef({SampleType.UNSIGNED_8_BIT, SampleType.SIGNED_16_BIT, SampleType.FLOAT}) @Retention(RetentionPolicy.SOURCE) public @interface SampleType { -- cgit v1.2.1 From ca233a3d46c08f399ea7327181cd66f707963177 Mon Sep 17 00:00:00 2001 From: Joey Grover Date: Mon, 1 Oct 2018 11:55:32 -0400 Subject: Fix unit tests --- .../com/smartdevicelink/test/proxy/SystemCapabilityManagerTests.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sdl_android/src/androidTest/java/com/smartdevicelink/test/proxy/SystemCapabilityManagerTests.java b/sdl_android/src/androidTest/java/com/smartdevicelink/test/proxy/SystemCapabilityManagerTests.java index 8916fe054..45c0f691a 100644 --- a/sdl_android/src/androidTest/java/com/smartdevicelink/test/proxy/SystemCapabilityManagerTests.java +++ b/sdl_android/src/androidTest/java/com/smartdevicelink/test/proxy/SystemCapabilityManagerTests.java @@ -218,6 +218,11 @@ public class SystemCapabilityManagerTests extends AndroidTestCase { @Override public boolean removeOnSystemCapabilityListener(SystemCapabilityType systemCapabilityType, OnSystemCapabilityListener listener) { return false; } + @Override + public boolean isTransportForServiceAvailable(SessionType serviceType) { + return false; + } + @Override public void startAudioService(boolean isEncrypted, AudioStreamingCodec codec, AudioStreamingParams params) {} -- cgit v1.2.1 From 064999e9207d1166a0c362efa1ad59715c02d928 Mon Sep 17 00:00:00 2001 From: Joey Grover Date: Mon, 1 Oct 2018 12:09:16 -0400 Subject: SdlManager does not sart Video/Audio managers now The SdlManager will also no longer check their state when determing that the SdlManager is ready to be used --- .../src/main/java/com/smartdevicelink/managers/SdlManager.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 884733fb6..8acc12145 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -134,8 +134,6 @@ public class SdlManager{ if( permissionManager != null && permissionManager.getState() != BaseSubManager.SETTING_UP && fileManager != null && fileManager.getState() != BaseSubManager.SETTING_UP && - audioStreamManager != null && audioStreamManager.getState() != BaseSubManager.SETTING_UP && - (videoStreamingManager == null || (videoStreamingManager != null && videoStreamingManager.getState() != BaseSubManager.SETTING_UP)) && lockScreenManager != null && lockScreenManager.getState() != BaseSubManager.SETTING_UP && screenManager != null && screenManager.getState() != BaseSubManager.SETTING_UP @@ -186,13 +184,14 @@ public class SdlManager{ if(getAppTypes().contains(AppHMIType.NAVIGATION) || getAppTypes().contains(AppHMIType.PROJECTION)){ this.videoStreamingManager = new VideoStreamingManager(_internalInterface); - this.videoStreamingManager.start(subManagerListener); + }else{ + this.videoStreamingManager = null; } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN + && (getAppTypes().contains(AppHMIType.NAVIGATION) || getAppTypes().contains(AppHMIType.PROJECTION)) ) { this.audioStreamManager = new AudioStreamManager(_internalInterface, context); - this.audioStreamManager.start(subManagerListener); } else { this.audioStreamManager = null; } -- cgit v1.2.1 From 267e39b8a90338af33023b3d2000e57623da52c8 Mon Sep 17 00:00:00 2001 From: Joey Grover Date: Mon, 1 Oct 2018 12:58:26 -0400 Subject: Fix unit test and update javadoc for SdlManager Make sure developer knows the Audio and Video managers can be null and that start has to be called before use. --- .../java/com/smartdevicelink/managers/SdlManagerTests.java | 4 +--- .../main/java/com/smartdevicelink/managers/SdlManager.java | 14 ++++++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java index b1957cd7f..fd5386abb 100644 --- a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java +++ b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java @@ -167,9 +167,7 @@ public class SdlManagerTests extends AndroidTestCase { // Note : SdlManager.initialize() will not be called automatically by proxy as in real life because we have mock proxy not a real one sdlManager.initialize(); sdlManager.setState(BaseSubManager.READY); - sdlManager.getAudioStreamManager().transitionToState(BaseSubManager.READY); - // manager.getVideoStreamingManager().transitionToState(BaseSubManager.READY); - // manager.getLockScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.READY); sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); sdlManager.getFileManager().transitionToState(BaseSubManager.READY); diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 8acc12145..6bf594169 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -464,11 +464,14 @@ public class SdlManager{ /** * Gets the VideoStreamingManager.
- * Note: VideoStreamingManager should be used only after SdlManager.start() CompletionListener callback is completed successfully. - * @return a VideoStreamingManager object + * The VideoStreamingManager returned will only be not null if the registered app type is + * either NAVIGATION or PROJECTION. Once the VideoStreamingManager is retrieved, its start() + * method will need to be called before use. + *

Note: VideoStreamingManager should be used only after SdlManager.start() CompletionListener callback is completed successfully. + * @return a VideoStreamingManager object attached to shit SdlManager instance */ - public VideoStreamingManager getVideoStreamingManager() { + public @Nullable VideoStreamingManager getVideoStreamingManager() { checkSdlManagerState(); return videoStreamingManager; } @@ -476,7 +479,10 @@ public class SdlManager{ /** * Gets the AudioStreamManager.
- * Note: AudioStreamManager should be used only after SdlManager.start() CompletionListener callback is completed successfully. + * The AudioStreamManager returned will only be not null if the registered app type is + * either NAVIGATION or PROJECTION. Once the AudioStreamManager is retrieved, its start() + * method will need to be called before use. + *
Note: AudioStreamManager should be used only after SdlManager.start() CompletionListener callback is completed successfully. * @return a AudioStreamManager object */ public @Nullable AudioStreamManager getAudioStreamManager() { -- cgit v1.2.1 From 39da8f79068f76ab873ee100f2f01ec876c83f29 Mon Sep 17 00:00:00 2001 From: Joey Grover Date: Mon, 1 Oct 2018 13:13:11 -0400 Subject: Add check for HMI level before AudioMangr = Ready --- .../managers/audio/AudioStreamManager.java | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java index dc2e82904..435666563 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java @@ -17,12 +17,16 @@ import com.smartdevicelink.managers.BaseSubManager; import com.smartdevicelink.managers.CompletionListener; import com.smartdevicelink.managers.StreamingStateMachine; import com.smartdevicelink.protocol.enums.SessionType; +import com.smartdevicelink.proxy.RPCNotification; import com.smartdevicelink.proxy.interfaces.IAudioStreamListener; import com.smartdevicelink.proxy.interfaces.ISdl; import com.smartdevicelink.proxy.interfaces.ISdlServiceListener; import com.smartdevicelink.proxy.interfaces.OnSystemCapabilityListener; import com.smartdevicelink.proxy.rpc.AudioPassThruCapabilities; +import com.smartdevicelink.proxy.rpc.OnHMIStatus; +import com.smartdevicelink.proxy.rpc.enums.HMILevel; import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType; +import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener; import com.smartdevicelink.transport.utl.TransportRecord; import com.smartdevicelink.util.Version; @@ -50,6 +54,7 @@ public class AudioStreamManager extends BaseSubManager { private final WeakReference context; private final StreamingStateMachine streamingStateMachine; private AudioPassThruCapabilities audioStreamingCapabilities; + private HMILevel hmiLevel; private boolean isTransportAvailable = false; // This completion listener is used as a callback to the app developer when starting/stopping audio service private CompletionListener serviceCompletionListener; @@ -119,6 +124,18 @@ public class AudioStreamManager extends BaseSubManager { } }; + private final OnRPCNotificationListener hmiListener = new OnRPCNotificationListener() { + @Override + public void onNotified(RPCNotification notification) { + if(notification != null){ + hmiLevel = ((OnHMIStatus)notification).getHmiLevel(); + if(hmiLevel.equals(HMILevel.HMI_FULL) || hmiLevel.equals(HMILevel.HMI_LIMITED)){ + checkState(); + } + } + } + }; + /** * Creates a new object of AudioStreamManager * @param internalInterface The internal interface to the connected device. @@ -153,7 +170,9 @@ public class AudioStreamManager extends BaseSubManager { private void checkState(){ if(audioStreamingCapabilities != null - && isTransportAvailable){ + && isTransportAvailable + && hmiLevel != null + && (hmiLevel.equals(HMILevel.HMI_LIMITED) || hmiLevel.equals(HMILevel.HMI_FULL))){ transitionToState(READY); } } -- cgit v1.2.1 From d3f9ab60a7e9b4a3d62fdfa5fbeb62ddf56f2366 Mon Sep 17 00:00:00 2001 From: Joey Grover Date: Mon, 1 Oct 2018 13:24:07 -0400 Subject: Actually add the listener for HMI notifications --- .../java/com/smartdevicelink/managers/audio/AudioStreamManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java index 435666563..da58692af 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java @@ -16,6 +16,7 @@ import com.smartdevicelink.SdlConnection.SdlSession; import com.smartdevicelink.managers.BaseSubManager; import com.smartdevicelink.managers.CompletionListener; import com.smartdevicelink.managers.StreamingStateMachine; +import com.smartdevicelink.protocol.enums.FunctionID; import com.smartdevicelink.protocol.enums.SessionType; import com.smartdevicelink.proxy.RPCNotification; import com.smartdevicelink.proxy.interfaces.IAudioStreamListener; @@ -156,6 +157,9 @@ public class AudioStreamManager extends BaseSubManager { internalInterface.addServiceListener(SessionType.PCM, serviceListener); + // Listen for HMILevel changes + internalInterface.addOnRPCNotificationListener(FunctionID.ON_HMI_STATUS, hmiListener); + streamingStateMachine = new StreamingStateMachine(); } -- cgit v1.2.1 From ed2662cbe4ea12f233500e28606e765f2fb084f4 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 14:05:29 -0400 Subject: Clean up states for screen, lockScreen , and permissions managers --- .../managers/lockscreen/LockScreenManager.java | 4 +--- .../managers/permission/PermissionManager.java | 14 ++++++++------ .../managers/screen/ScreenManager.java | 20 +++++++++++++++----- .../managers/screen/SoftButtonManager.java | 3 --- .../managers/video/VideoStreamingManager.java | 2 ++ 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenManager.java index b40c39fde..7419e9e17 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/lockscreen/LockScreenManager.java @@ -84,9 +84,7 @@ public class LockScreenManager extends BaseSubManager { } deviceLogo = null; deviceIconUrl = null; - - // transition state - transitionToState(SHUTDOWN); + super.dispose(); } //// diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/permission/PermissionManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/permission/PermissionManager.java index f71b95203..0c0ea2b6e 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/permission/PermissionManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/permission/PermissionManager.java @@ -59,7 +59,6 @@ import java.util.UUID; */ public PermissionManager(@NonNull ISdl internalInterface){ super(internalInterface); - transitionToState(SETTING_UP); this.currentPermissionItems = new HashMap<>(); this.filters = new ArrayList<>(); @@ -67,11 +66,9 @@ import java.util.UUID; onHMIStatusListener = new OnRPCNotificationListener() { @Override public void onNotified(RPCNotification notification) { - if (currentHMILevel == null && getState() == SETTING_UP){ - transitionToState(READY); - } HMILevel previousHMILevel = currentHMILevel; currentHMILevel = ((OnHMIStatus)notification).getHmiLevel(); + checkState(); notifyListeners(currentPermissionItems, previousHMILevel, currentPermissionItems, currentHMILevel); } }; @@ -96,9 +93,16 @@ import java.util.UUID; @Override public void start(CompletionListener listener) { + checkState(); super.start(listener); } + private synchronized void checkState(){ + if(this.getState() == SETTING_UP && currentHMILevel != null){ + transitionToState(READY); + } + } + /** * Go over all developer's listeners and call them if needed because of HMI level change or permission items change * @param previousPermissionItems @@ -226,8 +230,6 @@ import java.util.UUID; // Remove developer's listeners filters.clear(); - - transitionToState(SHUTDOWN); } /** diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java index 2b68fbd64..980fdd543 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java @@ -35,11 +35,16 @@ public class ScreenManager extends BaseSubManager { if (softButtonManager != null && textAndGraphicManager != null) { if (softButtonManager.getState() == BaseSubManager.READY && textAndGraphicManager.getState() == BaseSubManager.READY) { transitionToState(READY); - }else if (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.ERROR){ + } else if (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.ERROR){ Log.e(TAG, "ERROR starting screen manager, both sub managers in error state"); transitionToState(ERROR); - } else if (softButtonManager.getState() == BaseSubManager.ERROR || textAndGraphicManager.getState() == BaseSubManager.ERROR) { - Log.e(TAG, "ERROR starting screen manager, one sub manager in error state"); + } else if ( (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.SETTING_UP) + || (textAndGraphicManager.getState() == BaseSubManager.ERROR && softButtonManager.getState() == BaseSubManager.SETTING_UP) ) { + Log.e(TAG, "SETTING UP screen manager, one sub manager in error state and the other is setting up"); + transitionToState(SETTING_UP); + } else if ( (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.READY) + || (textAndGraphicManager.getState() == BaseSubManager.ERROR && softButtonManager.getState() == BaseSubManager.READY) ) { + Log.e(TAG, "LIMITED starting screen manager, one sub manager in error state and the other is ready"); transitionToState(LIMITED); } } else if (softButtonManager == null || textAndGraphicManager == null) { @@ -56,11 +61,15 @@ public class ScreenManager extends BaseSubManager { public ScreenManager(@NonNull ISdl internalInterface, @NonNull FileManager fileManager) { super(internalInterface); - transitionToState(SETTING_UP); this.fileManager = new WeakReference<>(fileManager); initialize(); } + @Override + public void start(CompletionListener listener) { + super.start(listener); + } + private void initialize(){ if (fileManager.get() != null) { this.softButtonManager = new SoftButtonManager(internalInterface, fileManager.get()); @@ -73,7 +82,8 @@ public class ScreenManager extends BaseSubManager { /** *

Called when manager is being torn down

*/ - public void dispose(){ + @Override + public void dispose() { softButtonManager.dispose(); textAndGraphicManager.dispose(); super.dispose(); diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SoftButtonManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SoftButtonManager.java index 537e327d5..0f7e22dea 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SoftButtonManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/screen/SoftButtonManager.java @@ -67,7 +67,6 @@ class SoftButtonManager extends BaseSubManager { */ SoftButtonManager(@NonNull ISdl internalInterface, @NonNull FileManager fileManager) { super(internalInterface); - transitionToState(BaseSubManager.SETTING_UP); this.fileManager = new WeakReference<>(fileManager); this.softButtonObjects = new CopyOnWriteArrayList<>(); this.currentHMILevel = HMILevel.HMI_NONE; // Assume NONE until we get something else @@ -498,8 +497,6 @@ class SoftButtonManager extends BaseSubManager { public void dispose() { super.dispose(); - transitionToState(SHUTDOWN); - // Remove listeners internalInterface.removeOnRPCNotificationListener(FunctionID.ON_HMI_STATUS, onHMIStatusListener); internalInterface.removeOnRPCNotificationListener(FunctionID.ON_BUTTON_PRESS, onButtonPressListener); diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java index 3b42a7186..b390fdf81 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamingManager.java @@ -323,6 +323,7 @@ public class VideoStreamingManager extends BaseSubManager { /** * Stops streaming, ends video streaming service and removes service listeners. */ + @Override public void dispose(){ stopStreaming(); @@ -340,6 +341,7 @@ public class VideoStreamingManager extends BaseSubManager { internalInterface.removeOnRPCNotificationListener(FunctionID.ON_HMI_STATUS, hmiListener); stateMachine.transitionToState(StreamingStateMachine.NONE); + super.dispose(); } // PUBLIC METHODS FOR CHECKING STATE -- cgit v1.2.1 From b16a532c684b6920eca640a42d56a3cce5a495f6 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 14:20:32 -0400 Subject: Simplify screenManager states --- .../main/java/com/smartdevicelink/managers/screen/ScreenManager.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java index 980fdd543..37b2af3c3 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java @@ -38,9 +38,8 @@ public class ScreenManager extends BaseSubManager { } else if (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.ERROR){ Log.e(TAG, "ERROR starting screen manager, both sub managers in error state"); transitionToState(ERROR); - } else if ( (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.SETTING_UP) - || (textAndGraphicManager.getState() == BaseSubManager.ERROR && softButtonManager.getState() == BaseSubManager.SETTING_UP) ) { - Log.e(TAG, "SETTING UP screen manager, one sub manager in error state and the other is setting up"); + } else if (textAndGraphicManager.getState() == BaseSubManager.SETTING_UP || softButtonManager.getState() == BaseSubManager.SETTING_UP) { + Log.e(TAG, "SETTING UP screen manager, one sub manager is still setting up"); transitionToState(SETTING_UP); } else if ( (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.READY) || (textAndGraphicManager.getState() == BaseSubManager.ERROR && softButtonManager.getState() == BaseSubManager.READY) ) { -- cgit v1.2.1 From a0a7bf7106eaf215312dc9097ef77aaad974c175 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 15:16:32 -0400 Subject: Clean up state for sdlManager --- .../com/smartdevicelink/managers/SdlManager.java | 117 +++++++++++++-------- .../managers/screen/ScreenManager.java | 14 +-- 2 files changed, 79 insertions(+), 52 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 6bf594169..87dc71495 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -67,7 +67,7 @@ import java.util.Vector; */ public class SdlManager{ - private static String TAG = "Sdl Manager"; + private static String TAG = "SdlManager"; private SdlProxyBase proxy; private String appId, appName, shortAppName; private boolean isMediaApp; @@ -131,64 +131,88 @@ public class SdlManager{ if(!success){ Log.d(TAG, "Sub manager failed to initialize"); } - if( - permissionManager != null && permissionManager.getState() != BaseSubManager.SETTING_UP && - fileManager != null && fileManager.getState() != BaseSubManager.SETTING_UP && - lockScreenManager != null && lockScreenManager.getState() != BaseSubManager.SETTING_UP && - screenManager != null && screenManager.getState() != BaseSubManager.SETTING_UP - - ){ - state = BaseSubManager.READY; - if(managerListener != null){ - managerListener.onStart(); + if (permissionManager != null && fileManager != null && screenManager != null && lockScreenManager != null){ + if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && lockScreenManager.getState() == BaseSubManager.READY){ + Log.i(TAG, "Starting sdl manager, all sub managers are in ready state"); + state = BaseSubManager.READY; + notifyDevListener(null); + } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && lockScreenManager.getState() == BaseSubManager.ERROR){ + String info = "ERROR starting sdl manager, all sub managers are in error state"; + Log.e(TAG, info); + state = BaseSubManager.ERROR; + notifyDevListener(info); + } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || lockScreenManager.getState() == BaseSubManager.SETTING_UP){ + Log.i(TAG, "SETTING UP sdl manager, some sub managers are still setting up"); + state = BaseSubManager.SETTING_UP; + // No need to notify developer here! + } else { + Log.w(TAG, "LIMITED starting sdl manager, some sub managers are in error or limited state and the others finished setting up"); + state = BaseSubManager.LIMITED; + notifyDevListener(null); } + } else { + // We should never be here, but somehow one of the sub-sub managers is null + String info = "ERROR one of the sdl sub managers is null"; + Log.e(TAG, info); + state = BaseSubManager.ERROR; + notifyDevListener(info); + } - // Set the app icon - if (SdlManager.this.appIcon != null && SdlManager.this.appIcon.getName() != null) { - if (!fileManager.hasUploadedFile(SdlManager.this.appIcon)) { - fileManager.uploadArtwork(SdlManager.this.appIcon, new CompletionListener() { - @Override - public void onComplete(boolean success) { - if (success) { - SetAppIcon msg = new SetAppIcon(SdlManager.this.appIcon.getName()); - _internalInterface.sendRPCRequest(msg); - } - } - }); - } else { - SetAppIcon msg = new SetAppIcon(SdlManager.this.appIcon.getName()); - _internalInterface.sendRPCRequest(msg); + + + } + }; + + + private void notifyDevListener(String info) { + if (managerListener != null) { + if (state == BaseSubManager.ERROR){ + managerListener.onError(info, null); + } else { + managerListener.onStart(); + } + } + + // Set the app icon + if (state == BaseSubManager.READY || state == BaseSubManager.LIMITED) { + setAppIcon(); + } + } + + + private void setAppIcon(){ + if (SdlManager.this.appIcon != null && SdlManager.this.appIcon.getName() != null) { + if (!fileManager.hasUploadedFile(SdlManager.this.appIcon)) { + fileManager.uploadArtwork(SdlManager.this.appIcon, new CompletionListener() { + @Override + public void onComplete(boolean success) { + if (success) { + SetAppIcon msg = new SetAppIcon(SdlManager.this.appIcon.getName()); + _internalInterface.sendRPCRequest(msg); + } } - } + }); + } else { + SetAppIcon msg = new SetAppIcon(SdlManager.this.appIcon.getName()); + _internalInterface.sendRPCRequest(msg); } } - }; + } - protected void initialize(){ - // instantiate managers + protected void initialize(){ + // Instantiate sub managers this.permissionManager = new PermissionManager(_internalInterface); - this.permissionManager.start(subManagerListener); - this.fileManager = new FileManager(_internalInterface, context); - this.fileManager.start(subManagerListener); - if (lockScreenConfig.isEnabled()) { this.lockScreenManager = new LockScreenManager(lockScreenConfig, context, _internalInterface); - this.lockScreenManager.start(subManagerListener); } - this.screenManager = new ScreenManager(_internalInterface, this.fileManager); - this.screenManager.start(subManagerListener); - - if(getAppTypes().contains(AppHMIType.NAVIGATION) || getAppTypes().contains(AppHMIType.PROJECTION)){ this.videoStreamingManager = new VideoStreamingManager(_internalInterface); - }else{ + } else { this.videoStreamingManager = null; } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && (getAppTypes().contains(AppHMIType.NAVIGATION) || getAppTypes().contains(AppHMIType.PROJECTION)) ) { this.audioStreamManager = new AudioStreamManager(_internalInterface, context); @@ -196,6 +220,13 @@ public class SdlManager{ this.audioStreamManager = null; } + // Start sub managers + this.permissionManager.start(subManagerListener); + this.fileManager.start(subManagerListener); + if (lockScreenConfig.isEnabled()){ + this.lockScreenManager.start(subManagerListener); + } + this.screenManager.start(subManagerListener); } public void dispose() { @@ -434,7 +465,7 @@ public class SdlManager{ } private void checkSdlManagerState(){ - if (state != BaseSubManager.READY){ + if (state != BaseSubManager.READY && state != BaseSubManager.LIMITED){ throw new IllegalStateException("SdlManager is not ready for use, be sure to initialize with start() method, implement callback, and use SubManagers in the SdlManager's callback"); } } diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java index 37b2af3c3..40dc58a27 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java @@ -34,25 +34,21 @@ public class ScreenManager extends BaseSubManager { public synchronized void onComplete(boolean success) { if (softButtonManager != null && textAndGraphicManager != null) { if (softButtonManager.getState() == BaseSubManager.READY && textAndGraphicManager.getState() == BaseSubManager.READY) { + Log.i(TAG, "Starting screen manager, all sub managers are in ready state"); transitionToState(READY); } else if (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.ERROR){ Log.e(TAG, "ERROR starting screen manager, both sub managers in error state"); transitionToState(ERROR); } else if (textAndGraphicManager.getState() == BaseSubManager.SETTING_UP || softButtonManager.getState() == BaseSubManager.SETTING_UP) { - Log.e(TAG, "SETTING UP screen manager, one sub manager is still setting up"); + Log.i(TAG, "SETTING UP screen manager, one sub manager is still setting up"); transitionToState(SETTING_UP); - } else if ( (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.READY) - || (textAndGraphicManager.getState() == BaseSubManager.ERROR && softButtonManager.getState() == BaseSubManager.READY) ) { - Log.e(TAG, "LIMITED starting screen manager, one sub manager in error state and the other is ready"); + } else { + Log.w(TAG, "LIMITED starting screen manager, one sub manager in error state and the other is ready"); transitionToState(LIMITED); } - } else if (softButtonManager == null || textAndGraphicManager == null) { + } else{ // We should never be here, but somehow one of the sub-sub managers is null Log.e(TAG, "ERROR one of the screen sub managers is null"); - transitionToState(LIMITED); - } else { - Log.e(TAG, "ERROR both of the screen sub managers are null"); - // We should never be here, but somehow both of the sub-sub managers is null transitionToState(ERROR); } } -- cgit v1.2.1 From 31b7bb3c62228129681b9f64d911e5dc332c3680 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 15:32:31 -0400 Subject: Add getState method to sdlManager --- .../src/main/java/com/smartdevicelink/managers/SdlManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 87dc71495..aafe55abd 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -229,6 +229,10 @@ public class SdlManager{ this.screenManager.start(subManagerListener); } + public int getState() { + return state; + } + public void dispose() { this.permissionManager.dispose(); -- cgit v1.2.1 From 0479094439fe255c0592681257b0c6e77381ed11 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 15:55:13 -0400 Subject: Print an error message when submanager cannot be used --- .../main/java/com/smartdevicelink/managers/SdlManager.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index aafe55abd..3baf13ef1 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -482,6 +482,9 @@ public class SdlManager{ * @return a PermissionManager object */ public PermissionManager getPermissionManager() { + if (permissionManager.getState() != BaseSubManager.READY && permissionManager.getState() != BaseSubManager.LIMITED){ + Log.e(TAG, "PermissionManager should not be accessed because it is not in READY/LIMITED state"); + } checkSdlManagerState(); return permissionManager; } @@ -492,6 +495,9 @@ public class SdlManager{ * @return a FileManager object */ public FileManager getFileManager() { + if (fileManager.getState() != BaseSubManager.READY && fileManager.getState() != BaseSubManager.LIMITED){ + Log.e(TAG, "FileManager should not be accessed because it is not in READY/LIMITED state"); + } checkSdlManagerState(); return fileManager; } @@ -531,6 +537,9 @@ public class SdlManager{ * @return a ScreenManager object */ public ScreenManager getScreenManager() { + if (screenManager.getState() != BaseSubManager.READY && screenManager.getState() != BaseSubManager.LIMITED){ + Log.e(TAG, "ScreenManager should not be accessed because it is not in READY/LIMITED state"); + } checkSdlManagerState(); return screenManager; } @@ -541,6 +550,9 @@ public class SdlManager{ * @return a LockScreenManager object */ public LockScreenManager getLockScreenManager() { + if (lockScreenManager.getState() != BaseSubManager.READY && lockScreenManager.getState() != BaseSubManager.LIMITED){ + Log.e(TAG, "LockScreenManager should not be accessed because it is not in READY/LIMITED state"); + } checkSdlManagerState(); return lockScreenManager; } -- cgit v1.2.1 From feb82ba3160100564104f7bf4c6ae9767229674e Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 16:17:26 -0400 Subject: Add STATE_LOCK to SdlManager --- .../com/smartdevicelink/managers/SdlManager.java | 23 +++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 3baf13ef1..b6815bec9 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -83,6 +83,7 @@ public class SdlManager{ private int state = -1; private List> sdlSecList; public LockScreenConfig lockScreenConfig; + private final Object STATE_LOCK = new Object(); // Managers @@ -134,27 +135,27 @@ public class SdlManager{ if (permissionManager != null && fileManager != null && screenManager != null && lockScreenManager != null){ if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && lockScreenManager.getState() == BaseSubManager.READY){ Log.i(TAG, "Starting sdl manager, all sub managers are in ready state"); - state = BaseSubManager.READY; + transitionToState(BaseSubManager.READY); notifyDevListener(null); } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && lockScreenManager.getState() == BaseSubManager.ERROR){ String info = "ERROR starting sdl manager, all sub managers are in error state"; Log.e(TAG, info); - state = BaseSubManager.ERROR; + transitionToState(BaseSubManager.ERROR); notifyDevListener(info); } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || lockScreenManager.getState() == BaseSubManager.SETTING_UP){ Log.i(TAG, "SETTING UP sdl manager, some sub managers are still setting up"); - state = BaseSubManager.SETTING_UP; + transitionToState(BaseSubManager.SETTING_UP); // No need to notify developer here! } else { Log.w(TAG, "LIMITED starting sdl manager, some sub managers are in error or limited state and the others finished setting up"); - state = BaseSubManager.LIMITED; + transitionToState(BaseSubManager.LIMITED); notifyDevListener(null); } } else { // We should never be here, but somehow one of the sub-sub managers is null String info = "ERROR one of the sdl sub managers is null"; Log.e(TAG, info); - state = BaseSubManager.ERROR; + transitionToState(BaseSubManager.ERROR); notifyDevListener(info); } @@ -230,7 +231,15 @@ public class SdlManager{ } public int getState() { - return state; + synchronized (STATE_LOCK) { + return state; + } + } + + private void transitionToState(int state) { + synchronized (STATE_LOCK) { + this.state = state; + } } public void dispose() { @@ -462,7 +471,7 @@ public class SdlManager{ sdlManager.hmiLanguage = Language.EN_US; } - sdlManager.state = BaseSubManager.SETTING_UP; + sdlManager.transitionToState(BaseSubManager.SETTING_UP); return sdlManager; } -- cgit v1.2.1 From ccb0e2631d4b922dcae94470b881f4573b636481 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 16:18:23 -0400 Subject: Change LockScreenConfig to private in SdlManager --- sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index b6815bec9..12a1659bf 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -82,7 +82,7 @@ public class SdlManager{ private SdlManagerListener managerListener; private int state = -1; private List> sdlSecList; - public LockScreenConfig lockScreenConfig; + private LockScreenConfig lockScreenConfig; private final Object STATE_LOCK = new Object(); -- cgit v1.2.1 From 33e0c20182d3edf4b593b28fbc66eba99cb5e83f Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 16:42:08 -0400 Subject: Add lockScreenConfig.isEnabled() check to sdLManager state changing behaviour --- .../src/main/java/com/smartdevicelink/managers/SdlManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 12a1659bf..b627048e9 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -132,17 +132,17 @@ public class SdlManager{ if(!success){ Log.d(TAG, "Sub manager failed to initialize"); } - if (permissionManager != null && fileManager != null && screenManager != null && lockScreenManager != null){ - if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && lockScreenManager.getState() == BaseSubManager.READY){ + if (permissionManager != null && fileManager != null && screenManager != null && (!lockScreenConfig.isEnabled() || lockScreenManager != null)){ + if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.READY)){ Log.i(TAG, "Starting sdl manager, all sub managers are in ready state"); transitionToState(BaseSubManager.READY); notifyDevListener(null); - } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && lockScreenManager.getState() == BaseSubManager.ERROR){ + } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && (lockScreenConfig.isEnabled() && lockScreenManager.getState() == BaseSubManager.ERROR)){ String info = "ERROR starting sdl manager, all sub managers are in error state"; Log.e(TAG, info); transitionToState(BaseSubManager.ERROR); notifyDevListener(info); - } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || lockScreenManager.getState() == BaseSubManager.SETTING_UP){ + } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || (lockScreenConfig.isEnabled() && lockScreenManager.getState() == BaseSubManager.SETTING_UP)){ Log.i(TAG, "SETTING UP sdl manager, some sub managers are still setting up"); transitionToState(BaseSubManager.SETTING_UP); // No need to notify developer here! -- cgit v1.2.1 From 42938714ece5c3f3ac7f445c77a72f1f5438ce1e Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 19:47:00 -0400 Subject: RemoveSdlmanager.setState() --- .../src/main/java/com/smartdevicelink/managers/SdlManager.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index b627048e9..b9e9ac17a 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -236,7 +236,7 @@ public class SdlManager{ } } - private void transitionToState(int state) { + protected void transitionToState(int state) { synchronized (STATE_LOCK) { this.state = state; } @@ -269,14 +269,6 @@ public class SdlManager{ } } - /** - * Sets the state of SdlManager to one of those defined in BaseSubManager - * @param state int representing desired state of SdlManager - */ - protected void setState(int state){ - this.state = state; - } - // BUILDER public static class Builder { -- cgit v1.2.1 From 410e98bfa569f048895920b00bcaee6592a984d9 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 19:51:30 -0400 Subject: Fix sdlManager unit tests --- .../java/com/smartdevicelink/managers/SdlManagerTests.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java index fd5386abb..436414abb 100644 --- a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java +++ b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java @@ -164,12 +164,17 @@ public class SdlManagerTests extends AndroidTestCase { sdlManager.start(); // Create and force all sub managers to be ready manually. Because SdlManager will not start until all sub managers are ready. - // Note : SdlManager.initialize() will not be called automatically by proxy as in real life because we have mock proxy not a real one + // Notes : + // 1- SdlManager.initialize() will not be called automatically by proxy as in real life because we have mock proxy not a real one + // 2- We should set SdlManager's state to READY each time we change state for any submanager because changing submanager's state may change SdlManager state! sdlManager.initialize(); - sdlManager.setState(BaseSubManager.READY); + sdlManager.transitionToState(BaseSubManager.READY); sdlManager.getLockScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.transitionToState(BaseSubManager.READY); sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.transitionToState(BaseSubManager.READY); sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); + sdlManager.transitionToState(BaseSubManager.READY); sdlManager.getFileManager().transitionToState(BaseSubManager.READY); // Make sure the listener is called exactly once -- cgit v1.2.1 From 8376ea2d32a212231ad1ae12b2dd8add390daa5c Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 20:01:23 -0400 Subject: =?UTF-8?q?Clean=20SdlManager=E2=80=99s=20logs=20and=20use=20Debug?= =?UTF-8?q?Tool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/smartdevicelink/managers/SdlManager.java | 31 +++++++++------------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index b9e9ac17a..a38634286 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -4,16 +4,15 @@ import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.util.Log; -import com.smartdevicelink.managers.file.FileManager; -import com.smartdevicelink.managers.permission.PermissionManager; +import com.smartdevicelink.exception.SdlException; import com.smartdevicelink.managers.audio.AudioStreamManager; +import com.smartdevicelink.managers.file.FileManager; import com.smartdevicelink.managers.file.filetypes.SdlArtwork; import com.smartdevicelink.managers.lockscreen.LockScreenConfig; import com.smartdevicelink.managers.lockscreen.LockScreenManager; +import com.smartdevicelink.managers.permission.PermissionManager; import com.smartdevicelink.managers.screen.ScreenManager; -import com.smartdevicelink.exception.SdlException; import com.smartdevicelink.managers.video.VideoStreamingManager; import com.smartdevicelink.protocol.enums.FunctionID; import com.smartdevicelink.protocol.enums.SessionType; @@ -47,6 +46,7 @@ import com.smartdevicelink.transport.BaseTransportConfig; import com.smartdevicelink.transport.MultiplexTransportConfig; import com.smartdevicelink.transport.enums.TransportType; import com.smartdevicelink.transport.utl.TransportRecord; +import com.smartdevicelink.util.DebugTool; import com.smartdevicelink.util.Version; import java.util.ArrayList; @@ -100,7 +100,7 @@ public class SdlManager{ private final ProxyBridge proxyBridge= new ProxyBridge(new ProxyBridge.LifecycleListener() { @Override public void onProxyConnected() { - Log.d(TAG, "Proxy is connected. Now initializing."); + DebugTool.logInfo("Proxy is connected. Now initializing."); initialize(); } @@ -130,37 +130,32 @@ public class SdlManager{ @Override public synchronized void onComplete(boolean success) { if(!success){ - Log.d(TAG, "Sub manager failed to initialize"); + DebugTool.logError("Sub manager failed to initialize"); } if (permissionManager != null && fileManager != null && screenManager != null && (!lockScreenConfig.isEnabled() || lockScreenManager != null)){ if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.READY)){ - Log.i(TAG, "Starting sdl manager, all sub managers are in ready state"); transitionToState(BaseSubManager.READY); notifyDevListener(null); } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && (lockScreenConfig.isEnabled() && lockScreenManager.getState() == BaseSubManager.ERROR)){ String info = "ERROR starting sdl manager, all sub managers are in error state"; - Log.e(TAG, info); + DebugTool.logError(info); transitionToState(BaseSubManager.ERROR); notifyDevListener(info); } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || (lockScreenConfig.isEnabled() && lockScreenManager.getState() == BaseSubManager.SETTING_UP)){ - Log.i(TAG, "SETTING UP sdl manager, some sub managers are still setting up"); transitionToState(BaseSubManager.SETTING_UP); // No need to notify developer here! } else { - Log.w(TAG, "LIMITED starting sdl manager, some sub managers are in error or limited state and the others finished setting up"); + DebugTool.logWarning("LIMITED starting sdl manager, some sub managers are in error or limited state and the others finished setting up"); transitionToState(BaseSubManager.LIMITED); notifyDevListener(null); } } else { // We should never be here, but somehow one of the sub-sub managers is null String info = "ERROR one of the sdl sub managers is null"; - Log.e(TAG, info); + DebugTool.logError(info); transitionToState(BaseSubManager.ERROR); notifyDevListener(info); } - - - } }; @@ -484,7 +479,7 @@ public class SdlManager{ */ public PermissionManager getPermissionManager() { if (permissionManager.getState() != BaseSubManager.READY && permissionManager.getState() != BaseSubManager.LIMITED){ - Log.e(TAG, "PermissionManager should not be accessed because it is not in READY/LIMITED state"); + DebugTool.logError("PermissionManager should not be accessed because it is not in READY/LIMITED state"); } checkSdlManagerState(); return permissionManager; @@ -497,7 +492,7 @@ public class SdlManager{ */ public FileManager getFileManager() { if (fileManager.getState() != BaseSubManager.READY && fileManager.getState() != BaseSubManager.LIMITED){ - Log.e(TAG, "FileManager should not be accessed because it is not in READY/LIMITED state"); + DebugTool.logError("FileManager should not be accessed because it is not in READY/LIMITED state"); } checkSdlManagerState(); return fileManager; @@ -539,7 +534,7 @@ public class SdlManager{ */ public ScreenManager getScreenManager() { if (screenManager.getState() != BaseSubManager.READY && screenManager.getState() != BaseSubManager.LIMITED){ - Log.e(TAG, "ScreenManager should not be accessed because it is not in READY/LIMITED state"); + DebugTool.logError("ScreenManager should not be accessed because it is not in READY/LIMITED state"); } checkSdlManagerState(); return screenManager; @@ -552,7 +547,7 @@ public class SdlManager{ */ public LockScreenManager getLockScreenManager() { if (lockScreenManager.getState() != BaseSubManager.READY && lockScreenManager.getState() != BaseSubManager.LIMITED){ - Log.e(TAG, "LockScreenManager should not be accessed because it is not in READY/LIMITED state"); + DebugTool.logError("LockScreenManager should not be accessed because it is not in READY/LIMITED state"); } checkSdlManagerState(); return lockScreenManager; -- cgit v1.2.1 From 29f70d6985d920244c1ce2a2bffe8dc08f6c024e Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 20:10:27 -0400 Subject: Fix an issue in SdlManager unit tests --- .../java/com/smartdevicelink/managers/SdlManagerTests.java | 8 +------- .../src/main/java/com/smartdevicelink/managers/SdlManager.java | 3 ++- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java index 436414abb..480982512 100644 --- a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java +++ b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java @@ -164,17 +164,11 @@ public class SdlManagerTests extends AndroidTestCase { sdlManager.start(); // Create and force all sub managers to be ready manually. Because SdlManager will not start until all sub managers are ready. - // Notes : - // 1- SdlManager.initialize() will not be called automatically by proxy as in real life because we have mock proxy not a real one - // 2- We should set SdlManager's state to READY each time we change state for any submanager because changing submanager's state may change SdlManager state! + // Note: SdlManager.initialize() will not be called automatically by proxy as in real life because we have mock proxy not a real one sdlManager.initialize(); - sdlManager.transitionToState(BaseSubManager.READY); sdlManager.getLockScreenManager().transitionToState(BaseSubManager.READY); - sdlManager.transitionToState(BaseSubManager.READY); sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); - sdlManager.transitionToState(BaseSubManager.READY); sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); - sdlManager.transitionToState(BaseSubManager.READY); sdlManager.getFileManager().transitionToState(BaseSubManager.READY); // Make sure the listener is called exactly once diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index a38634286..03730060c 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -466,7 +466,8 @@ public class SdlManager{ private void checkSdlManagerState(){ if (state != BaseSubManager.READY && state != BaseSubManager.LIMITED){ - throw new IllegalStateException("SdlManager is not ready for use, be sure to initialize with start() method, implement callback, and use SubManagers in the SdlManager's callback"); + String msg = "SdlManager is not ready for use, be sure to initialize with start() method, implement callback, and use SubManagers in the SdlManager's callback"; + DebugTool.logError(msg, new IllegalStateException(msg)); } } -- cgit v1.2.1 From b089d0801a9ddd23cc5234f3c278fcea7f8581dc Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 20:37:30 -0400 Subject: Check that sub manager are not null before disposing them --- .../com/smartdevicelink/managers/SdlManager.java | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 03730060c..8e641b870 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -66,8 +66,6 @@ import java.util.Vector; * 4. Helper methods */ public class SdlManager{ - - private static String TAG = "SdlManager"; private SdlProxyBase proxy; private String appId, appName, shortAppName; private boolean isMediaApp; @@ -87,7 +85,6 @@ public class SdlManager{ // Managers - private PermissionManager permissionManager; private FileManager fileManager; private LockScreenManager lockScreenManager; @@ -238,24 +235,28 @@ public class SdlManager{ } public void dispose() { - this.permissionManager.dispose(); + if (this.permissionManager != null) { + this.permissionManager.dispose(); + } - this.fileManager.dispose(); + if (this.fileManager != null) { + this.fileManager.dispose(); + } if (this.lockScreenManager != null) { this.lockScreenManager.dispose(); } - this.screenManager.dispose(); + if (this.screenManager != null) { + this.screenManager.dispose(); + } if(this.videoStreamingManager != null) { this.videoStreamingManager.dispose(); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - if (this.audioStreamManager != null) { - this.audioStreamManager.dispose(); - } + if (this.audioStreamManager != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + this.audioStreamManager.dispose(); } if(managerListener != null){ -- cgit v1.2.1 From de5e23d9e0d50c685d4dd67e35884a5b639a1a92 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 21:26:30 -0400 Subject: Add missing limited state check in BaseSubManager --- .../src/main/java/com/smartdevicelink/managers/BaseSubManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java index 590a846a5..85a75960d 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java @@ -53,7 +53,7 @@ public abstract class BaseSubManager { synchronized (STATE_LOCK) { this.state = state; } - if(state == READY && completionListener != null){ + if( (state == READY || state == LIMITED) && completionListener != null ){ completionListener.onComplete(true); completionListener = null; }else if(state == ERROR && completionListener != null){ -- cgit v1.2.1 From c0551b94ac07478c644345e382867c41a564e89e Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 21:51:52 -0400 Subject: Add missing LIMITED state check in BaseSubManager.start() --- .../java/com/smartdevicelink/managers/BaseSubManager.java | 6 +++--- .../main/java/com/smartdevicelink/managers/SdlManager.java | 11 ----------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java index 85a75960d..9c926a42e 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java @@ -32,12 +32,12 @@ public abstract class BaseSubManager { /** * Starts up a BaseSubManager, and calls provided callback once BaseSubManager is done setting up or failed setup. - * @param listener CompletionListener that is called once the BaseSubManager's state is READY or ERROR + * @param listener CompletionListener that is called once the BaseSubManager's state is READY, LIMITED, or ERROR */ public void start(CompletionListener listener){ this.completionListener = listener; - if((state == READY || state == ERROR) && completionListener != null){ - completionListener.onComplete(state == READY); + if((state == READY || state == LIMITED || state == ERROR) && completionListener != null){ + completionListener.onComplete(state == READY || state == LIMITED); completionListener = null; } } diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 8e641b870..a1c91d09f 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -156,7 +156,6 @@ public class SdlManager{ } }; - private void notifyDevListener(String info) { if (managerListener != null) { if (state == BaseSubManager.ERROR){ @@ -172,7 +171,6 @@ public class SdlManager{ } } - private void setAppIcon(){ if (SdlManager.this.appIcon != null && SdlManager.this.appIcon.getName() != null) { if (!fileManager.hasUploadedFile(SdlManager.this.appIcon)) { @@ -192,7 +190,6 @@ public class SdlManager{ } } - protected void initialize(){ // Instantiate sub managers this.permissionManager = new PermissionManager(_internalInterface); @@ -266,7 +263,6 @@ public class SdlManager{ } // BUILDER - public static class Builder { SdlManager sdlManager; @@ -500,7 +496,6 @@ public class SdlManager{ return fileManager; } - /** * Gets the VideoStreamingManager.
* The VideoStreamingManager returned will only be not null if the registered app type is @@ -514,7 +509,6 @@ public class SdlManager{ checkSdlManagerState(); return videoStreamingManager; } - /** * Gets the AudioStreamManager.
@@ -555,7 +549,6 @@ public class SdlManager{ return lockScreenManager; } - /** * Gets the SystemCapabilityManager.
* Note: SystemCapabilityManager should be used only after SdlManager.start() CompletionListener callback is completed successfully. @@ -565,9 +558,7 @@ public class SdlManager{ return proxy.getSystemCapabilityManager(); } - // PROTECTED GETTERS - protected String getAppName() { return appName; } protected String getAppId() { return appId; } @@ -727,7 +718,6 @@ public class SdlManager{ } // INTERNAL INTERFACE - private ISdl _internalInterface = new ISdl() { @Override public void start() { @@ -902,5 +892,4 @@ public class SdlManager{ } }; - } -- cgit v1.2.1 From bcb0a438d6d0fe0fb970e70dce5d19e8c8d738aa Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 23:23:28 -0400 Subject: Add unit tests for SdlManager state --- .../smartdevicelink/managers/SdlManagerTests.java | 124 +++++++++++++++++++-- .../com/smartdevicelink/managers/SdlManager.java | 46 ++++---- 2 files changed, 141 insertions(+), 29 deletions(-) diff --git a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java index 480982512..6ebb80697 100644 --- a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java +++ b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java @@ -4,6 +4,7 @@ import android.content.Context; import android.test.AndroidTestCase; import com.smartdevicelink.exception.SdlException; +import com.smartdevicelink.managers.lockscreen.LockScreenConfig; import com.smartdevicelink.protocol.enums.FunctionID; import com.smartdevicelink.proxy.RPCRequest; import com.smartdevicelink.proxy.RPCResponse; @@ -68,7 +69,7 @@ public class SdlManagerTests extends AndroidTestCase { templateColorScheme.setPrimaryColor(Test.GENERAL_RGBCOLOR); templateColorScheme.setSecondaryColor(Test.GENERAL_RGBCOLOR); - sdlManager = createSampleManager("heyApp", "123456"); + sdlManager = createSampleManager("heyApp", "123456", Test.GENERAL_LOCKSCREENCONFIG); } @Override @@ -82,7 +83,7 @@ public class SdlManagerTests extends AndroidTestCase { return mTestContext; } - private SdlManager createSampleManager(String appName, String appId){ + private SdlManager createSampleManager(String appName, String appId, LockScreenConfig lockScreenConfig){ SdlManager manager; SdlManagerListener listener = new SdlManagerListener() { @@ -112,7 +113,7 @@ public class SdlManagerTests extends AndroidTestCase { builder.setNightColorScheme(templateColorScheme); builder.setVrSynonyms(Test.GENERAL_VECTOR_STRING); builder.setTtsName(Test.GENERAL_VECTOR_TTS_CHUNKS); - builder.setLockScreenConfig(Test.GENERAL_LOCKSCREENCONFIG); + builder.setLockScreenConfig(lockScreenConfig); manager = builder.build(); // mock SdlProxyBase and set it manually @@ -125,12 +126,12 @@ public class SdlManagerTests extends AndroidTestCase { // TESTS public void testNotNull(){ - assertNotNull(createSampleManager("app","123456")); + assertNotNull(createSampleManager("app","123456", Test.GENERAL_LOCKSCREENCONFIG)); } public void testMissingAppName() { try { - createSampleManager(null,"123456"); + createSampleManager(null,"123456", Test.GENERAL_LOCKSCREENCONFIG); } catch (IllegalArgumentException ex) { assertSame(ex.getMessage(), "You must specify an app name by calling setAppName"); } @@ -138,7 +139,7 @@ public class SdlManagerTests extends AndroidTestCase { public void testMissingAppId() { try { - createSampleManager("app",null); + createSampleManager("app",null, Test.GENERAL_LOCKSCREENCONFIG); } catch (IllegalArgumentException ex) { assertSame(ex.getMessage(), "You must specify an app ID by calling setAppId"); } @@ -166,15 +167,122 @@ public class SdlManagerTests extends AndroidTestCase { // Create and force all sub managers to be ready manually. Because SdlManager will not start until all sub managers are ready. // Note: SdlManager.initialize() will not be called automatically by proxy as in real life because we have mock proxy not a real one sdlManager.initialize(); - sdlManager.getLockScreenManager().transitionToState(BaseSubManager.READY); - sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); + + // Set all sub managers' states to ready sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); sdlManager.getFileManager().transitionToState(BaseSubManager.READY); + sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.READY); // Make sure the listener is called exactly once assertEquals("Listener was not called or called more/less frequently than expected", listenerCalledCounter, 1); } + public void testManagerStates() { + SdlManager sdlManager = createSampleManager("test", "00000", new LockScreenConfig()); + sdlManager.initialize(); + + + // Case 1-A: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); + sdlManager.getFileManager().transitionToState(BaseSubManager.READY); + sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.getLockScreenConfig().setEnabled(true); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.checkState(); + assertEquals(BaseSubManager.READY, sdlManager.getState()); + + + // Case 1-B: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); + sdlManager.getFileManager().transitionToState(BaseSubManager.READY); + sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.getLockScreenConfig().setEnabled(false); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.SETTING_UP); + sdlManager.checkState(); + assertEquals(BaseSubManager.READY, sdlManager.getState()); + + + // Case 2-A: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getFileManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getScreenManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getLockScreenConfig().setEnabled(true); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.ERROR); + sdlManager.checkState(); + assertEquals(BaseSubManager.ERROR, sdlManager.getState()); + + + // Case 1-B: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getFileManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getScreenManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getLockScreenConfig().setEnabled(false); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.SETTING_UP); + sdlManager.checkState(); + assertEquals(BaseSubManager.ERROR, sdlManager.getState()); + + + // Case 3-A: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getFileManager().transitionToState(BaseSubManager.READY); + sdlManager.getScreenManager().transitionToState(BaseSubManager.SETTING_UP); + sdlManager.getLockScreenConfig().setEnabled(true); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.LIMITED); + sdlManager.checkState(); + assertEquals(BaseSubManager.SETTING_UP, sdlManager.getState()); + + + // Case 3-B: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getFileManager().transitionToState(BaseSubManager.READY); + sdlManager.getScreenManager().transitionToState(BaseSubManager.SETTING_UP); + sdlManager.getLockScreenConfig().setEnabled(false); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.SETTING_UP); + sdlManager.checkState(); + assertEquals(BaseSubManager.SETTING_UP, sdlManager.getState()); + + + // Case 4-A: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); + sdlManager.getFileManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.getLockScreenConfig().setEnabled(true); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.checkState(); + assertEquals(BaseSubManager.LIMITED, sdlManager.getState()); + + + // Case 4-B: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); + sdlManager.getFileManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.getLockScreenConfig().setEnabled(false); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.SETTING_UP); + sdlManager.checkState(); + assertEquals(BaseSubManager.LIMITED, sdlManager.getState()); + + + // Case 5-A: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); + sdlManager.getFileManager().transitionToState(BaseSubManager.LIMITED); + sdlManager.getScreenManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getLockScreenConfig().setEnabled(true); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.checkState(); + assertEquals(BaseSubManager.LIMITED, sdlManager.getState()); + + + // Case 5-B: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); + sdlManager.getFileManager().transitionToState(BaseSubManager.LIMITED); + sdlManager.getScreenManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getLockScreenConfig().setEnabled(false); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.SETTING_UP); + sdlManager.checkState(); + assertEquals(BaseSubManager.LIMITED, sdlManager.getState()); + } + public void testSendRPC(){ listenerCalledCounter = 0; diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index a1c91d09f..ed48b3616 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -129,32 +129,36 @@ public class SdlManager{ if(!success){ DebugTool.logError("Sub manager failed to initialize"); } - if (permissionManager != null && fileManager != null && screenManager != null && (!lockScreenConfig.isEnabled() || lockScreenManager != null)){ - if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.READY)){ - transitionToState(BaseSubManager.READY); - notifyDevListener(null); - } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && (lockScreenConfig.isEnabled() && lockScreenManager.getState() == BaseSubManager.ERROR)){ - String info = "ERROR starting sdl manager, all sub managers are in error state"; - DebugTool.logError(info); - transitionToState(BaseSubManager.ERROR); - notifyDevListener(info); - } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || (lockScreenConfig.isEnabled() && lockScreenManager.getState() == BaseSubManager.SETTING_UP)){ - transitionToState(BaseSubManager.SETTING_UP); - // No need to notify developer here! - } else { - DebugTool.logWarning("LIMITED starting sdl manager, some sub managers are in error or limited state and the others finished setting up"); - transitionToState(BaseSubManager.LIMITED); - notifyDevListener(null); - } - } else { - // We should never be here, but somehow one of the sub-sub managers is null - String info = "ERROR one of the sdl sub managers is null"; + checkState(); + } + }; + + protected void checkState(){ + if (permissionManager != null && fileManager != null && screenManager != null && (!lockScreenConfig.isEnabled() || lockScreenManager != null)){ + if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && ( !lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.READY)){ + transitionToState(BaseSubManager.READY); + notifyDevListener(null); + } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.ERROR)){ + String info = "ERROR starting sdl manager, all sub managers are in error state"; DebugTool.logError(info); transitionToState(BaseSubManager.ERROR); notifyDevListener(info); + } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || (lockScreenConfig.isEnabled() && lockScreenManager != null && lockScreenManager.getState() == BaseSubManager.SETTING_UP)){ + transitionToState(BaseSubManager.SETTING_UP); + // No need to notify developer here! + } else { + DebugTool.logWarning("LIMITED starting sdl manager, some sub managers are in error or limited state and the others finished setting up"); + transitionToState(BaseSubManager.LIMITED); + notifyDevListener(null); } + } else { + // We should never be here, but somehow one of the sub-sub managers is null + String info = "ERROR one of the sdl sub managers is null"; + DebugTool.logError(info); + transitionToState(BaseSubManager.ERROR); + notifyDevListener(info); } - }; + } private void notifyDevListener(String info) { if (managerListener != null) { -- cgit v1.2.1 From 3ea0942743f61ce3d5721021d31a748025436a66 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Mon, 1 Oct 2018 23:33:57 -0400 Subject: Fix some formatting issues --- .../smartdevicelink/managers/SdlManagerTests.java | 76 +++++++++++----------- .../com/smartdevicelink/managers/SdlManager.java | 10 +-- .../managers/screen/ScreenManager.java | 4 +- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java index 6ebb80697..ff8ab3c1d 100644 --- a/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java +++ b/sdl_android/src/androidTest/java/com/smartdevicelink/managers/SdlManagerTests.java @@ -204,53 +204,53 @@ public class SdlManagerTests extends AndroidTestCase { // Case 2-A: - sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); - sdlManager.getFileManager().transitionToState(BaseSubManager.ERROR); - sdlManager.getScreenManager().transitionToState(BaseSubManager.ERROR); - sdlManager.getLockScreenConfig().setEnabled(true); - sdlManager.getLockScreenManager().transitionToState(BaseSubManager.ERROR); - sdlManager.checkState(); - assertEquals(BaseSubManager.ERROR, sdlManager.getState()); + sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getFileManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getScreenManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getLockScreenConfig().setEnabled(true); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.ERROR); + sdlManager.checkState(); + assertEquals(BaseSubManager.ERROR, sdlManager.getState()); // Case 1-B: - sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); - sdlManager.getFileManager().transitionToState(BaseSubManager.ERROR); - sdlManager.getScreenManager().transitionToState(BaseSubManager.ERROR); - sdlManager.getLockScreenConfig().setEnabled(false); - sdlManager.getLockScreenManager().transitionToState(BaseSubManager.SETTING_UP); - sdlManager.checkState(); - assertEquals(BaseSubManager.ERROR, sdlManager.getState()); + sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getFileManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getScreenManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getLockScreenConfig().setEnabled(false); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.SETTING_UP); + sdlManager.checkState(); + assertEquals(BaseSubManager.ERROR, sdlManager.getState()); // Case 3-A: - sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); - sdlManager.getFileManager().transitionToState(BaseSubManager.READY); + sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getFileManager().transitionToState(BaseSubManager.READY); sdlManager.getScreenManager().transitionToState(BaseSubManager.SETTING_UP); sdlManager.getLockScreenConfig().setEnabled(true); sdlManager.getLockScreenManager().transitionToState(BaseSubManager.LIMITED); - sdlManager.checkState(); - assertEquals(BaseSubManager.SETTING_UP, sdlManager.getState()); - - - // Case 3-B: - sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); - sdlManager.getFileManager().transitionToState(BaseSubManager.READY); - sdlManager.getScreenManager().transitionToState(BaseSubManager.SETTING_UP); - sdlManager.getLockScreenConfig().setEnabled(false); - sdlManager.getLockScreenManager().transitionToState(BaseSubManager.SETTING_UP); - sdlManager.checkState(); - assertEquals(BaseSubManager.SETTING_UP, sdlManager.getState()); - - - // Case 4-A: - sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); - sdlManager.getFileManager().transitionToState(BaseSubManager.ERROR); - sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); - sdlManager.getLockScreenConfig().setEnabled(true); - sdlManager.getLockScreenManager().transitionToState(BaseSubManager.READY); - sdlManager.checkState(); - assertEquals(BaseSubManager.LIMITED, sdlManager.getState()); + sdlManager.checkState(); + assertEquals(BaseSubManager.SETTING_UP, sdlManager.getState()); + + + // Case 3-B: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getFileManager().transitionToState(BaseSubManager.READY); + sdlManager.getScreenManager().transitionToState(BaseSubManager.SETTING_UP); + sdlManager.getLockScreenConfig().setEnabled(false); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.SETTING_UP); + sdlManager.checkState(); + assertEquals(BaseSubManager.SETTING_UP, sdlManager.getState()); + + + // Case 4-A: + sdlManager.getPermissionManager().transitionToState(BaseSubManager.READY); + sdlManager.getFileManager().transitionToState(BaseSubManager.ERROR); + sdlManager.getScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.getLockScreenConfig().setEnabled(true); + sdlManager.getLockScreenManager().transitionToState(BaseSubManager.READY); + sdlManager.checkState(); + assertEquals(BaseSubManager.LIMITED, sdlManager.getState()); // Case 4-B: diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index ed48b3616..829ba719c 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -133,17 +133,17 @@ public class SdlManager{ } }; - protected void checkState(){ - if (permissionManager != null && fileManager != null && screenManager != null && (!lockScreenConfig.isEnabled() || lockScreenManager != null)){ - if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && ( !lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.READY)){ + protected void checkState() { + if (permissionManager != null && fileManager != null && screenManager != null && (!lockScreenConfig.isEnabled() || lockScreenManager != null)) { + if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.READY)) { transitionToState(BaseSubManager.READY); notifyDevListener(null); - } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.ERROR)){ + } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.ERROR)) { String info = "ERROR starting sdl manager, all sub managers are in error state"; DebugTool.logError(info); transitionToState(BaseSubManager.ERROR); notifyDevListener(info); - } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || (lockScreenConfig.isEnabled() && lockScreenManager != null && lockScreenManager.getState() == BaseSubManager.SETTING_UP)){ + } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || (lockScreenConfig.isEnabled() && lockScreenManager != null && lockScreenManager.getState() == BaseSubManager.SETTING_UP)) { transitionToState(BaseSubManager.SETTING_UP); // No need to notify developer here! } else { diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java index 40dc58a27..4351ddc91 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/screen/ScreenManager.java @@ -36,7 +36,7 @@ public class ScreenManager extends BaseSubManager { if (softButtonManager.getState() == BaseSubManager.READY && textAndGraphicManager.getState() == BaseSubManager.READY) { Log.i(TAG, "Starting screen manager, all sub managers are in ready state"); transitionToState(READY); - } else if (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.ERROR){ + } else if (softButtonManager.getState() == BaseSubManager.ERROR && textAndGraphicManager.getState() == BaseSubManager.ERROR) { Log.e(TAG, "ERROR starting screen manager, both sub managers in error state"); transitionToState(ERROR); } else if (textAndGraphicManager.getState() == BaseSubManager.SETTING_UP || softButtonManager.getState() == BaseSubManager.SETTING_UP) { @@ -46,7 +46,7 @@ public class ScreenManager extends BaseSubManager { Log.w(TAG, "LIMITED starting screen manager, one sub manager in error state and the other is ready"); transitionToState(LIMITED); } - } else{ + } else { // We should never be here, but somehow one of the sub-sub managers is null Log.e(TAG, "ERROR one of the screen sub managers is null"); transitionToState(ERROR); -- cgit v1.2.1 From 0fedc4ee9c8a376c4e16b2413581c34b7157d10a Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Tue, 2 Oct 2018 09:35:23 -0400 Subject: Change access modifier for checkState to package private --- sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 829ba719c..71ba76edc 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -133,7 +133,7 @@ public class SdlManager{ } }; - protected void checkState() { + void checkState() { if (permissionManager != null && fileManager != null && screenManager != null && (!lockScreenConfig.isEnabled() || lockScreenManager != null)) { if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.READY)) { transitionToState(BaseSubManager.READY); -- cgit v1.2.1 From 19a77ac9765f706ceac4d596586b9f75c6ccfd15 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Tue, 2 Oct 2018 10:40:33 -0400 Subject: Simplify transitionToState() logic --- .../src/main/java/com/smartdevicelink/managers/BaseSubManager.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java index 9c926a42e..ed7bee9f1 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java @@ -53,11 +53,8 @@ public abstract class BaseSubManager { synchronized (STATE_LOCK) { this.state = state; } - if( (state == READY || state == LIMITED) && completionListener != null ){ - completionListener.onComplete(true); - completionListener = null; - }else if(state == ERROR && completionListener != null){ - completionListener.onComplete(false); + if((state == READY || state == LIMITED || state == ERROR) && completionListener != null ){ + completionListener.onComplete(state == READY || state == LIMITED); completionListener = null; } } -- cgit v1.2.1 From a3b09fed9823808e7c76eaa0b4b03945909c848b Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Tue, 2 Oct 2018 10:41:29 -0400 Subject: Check if fileManager can be accessed before using it --- sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 71ba76edc..a2a23ff16 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -177,7 +177,7 @@ public class SdlManager{ private void setAppIcon(){ if (SdlManager.this.appIcon != null && SdlManager.this.appIcon.getName() != null) { - if (!fileManager.hasUploadedFile(SdlManager.this.appIcon)) { + if (fileManager != null && (fileManager.getState() == BaseSubManager.READY || fileManager.getState() == BaseSubManager.LIMITED) && !fileManager.hasUploadedFile(SdlManager.this.appIcon)) { fileManager.uploadArtwork(SdlManager.this.appIcon, new CompletionListener() { @Override public void onComplete(boolean success) { -- cgit v1.2.1 From b52cb4991604082538f2a8423e333ccbf09347ab Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Tue, 2 Oct 2018 10:48:54 -0400 Subject: Create onReady() method in sdlManager --- .../src/main/java/com/smartdevicelink/managers/SdlManager.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index a2a23ff16..464805590 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -138,6 +138,7 @@ public class SdlManager{ if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.READY)) { transitionToState(BaseSubManager.READY); notifyDevListener(null); + onReady(); } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.ERROR)) { String info = "ERROR starting sdl manager, all sub managers are in error state"; DebugTool.logError(info); @@ -150,6 +151,7 @@ public class SdlManager{ DebugTool.logWarning("LIMITED starting sdl manager, some sub managers are in error or limited state and the others finished setting up"); transitionToState(BaseSubManager.LIMITED); notifyDevListener(null); + onReady(); } } else { // We should never be here, but somehow one of the sub-sub managers is null @@ -168,14 +170,10 @@ public class SdlManager{ managerListener.onStart(); } } - - // Set the app icon - if (state == BaseSubManager.READY || state == BaseSubManager.LIMITED) { - setAppIcon(); - } } - private void setAppIcon(){ + private void onReady(){ + // Set the app icon if (SdlManager.this.appIcon != null && SdlManager.this.appIcon.getName() != null) { if (fileManager != null && (fileManager.getState() == BaseSubManager.READY || fileManager.getState() == BaseSubManager.LIMITED) && !fileManager.hasUploadedFile(SdlManager.this.appIcon)) { fileManager.uploadArtwork(SdlManager.this.appIcon, new CompletionListener() { -- cgit v1.2.1 From d6f12007ca1d5090497fc664eb7eaa41ab725388 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Tue, 2 Oct 2018 11:09:23 -0400 Subject: Use DebugTool only for i/d logs --- .../com/smartdevicelink/managers/SdlManager.java | 23 ++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index 464805590..c65628066 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -4,6 +4,7 @@ import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.Log; import com.smartdevicelink.exception.SdlException; import com.smartdevicelink.managers.audio.AudioStreamManager; @@ -66,6 +67,7 @@ import java.util.Vector; * 4. Helper methods */ public class SdlManager{ + private static final String TAG = "SdlManager"; private SdlProxyBase proxy; private String appId, appName, shortAppName; private boolean isMediaApp; @@ -127,7 +129,7 @@ public class SdlManager{ @Override public synchronized void onComplete(boolean success) { if(!success){ - DebugTool.logError("Sub manager failed to initialize"); + Log.e(TAG, "Sub manager failed to initialize"); } checkState(); } @@ -136,19 +138,21 @@ public class SdlManager{ void checkState() { if (permissionManager != null && fileManager != null && screenManager != null && (!lockScreenConfig.isEnabled() || lockScreenManager != null)) { if (permissionManager.getState() == BaseSubManager.READY && fileManager.getState() == BaseSubManager.READY && screenManager.getState() == BaseSubManager.READY && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.READY)) { + DebugTool.logInfo("Starting sdl manager, all sub managers are in ready state"); transitionToState(BaseSubManager.READY); notifyDevListener(null); onReady(); } else if (permissionManager.getState() == BaseSubManager.ERROR && fileManager.getState() == BaseSubManager.ERROR && screenManager.getState() == BaseSubManager.ERROR && (!lockScreenConfig.isEnabled() || lockScreenManager.getState() == BaseSubManager.ERROR)) { String info = "ERROR starting sdl manager, all sub managers are in error state"; - DebugTool.logError(info); + Log.e(TAG, info); transitionToState(BaseSubManager.ERROR); notifyDevListener(info); } else if (permissionManager.getState() == BaseSubManager.SETTING_UP || fileManager.getState() == BaseSubManager.SETTING_UP || screenManager.getState() == BaseSubManager.SETTING_UP || (lockScreenConfig.isEnabled() && lockScreenManager != null && lockScreenManager.getState() == BaseSubManager.SETTING_UP)) { + DebugTool.logInfo("SETTING UP sdl manager, some sub managers are still setting up"); transitionToState(BaseSubManager.SETTING_UP); // No need to notify developer here! } else { - DebugTool.logWarning("LIMITED starting sdl manager, some sub managers are in error or limited state and the others finished setting up"); + Log.w(TAG, "LIMITED starting sdl manager, some sub managers are in error or limited state and the others finished setting up"); transitionToState(BaseSubManager.LIMITED); notifyDevListener(null); onReady(); @@ -156,7 +160,7 @@ public class SdlManager{ } else { // We should never be here, but somehow one of the sub-sub managers is null String info = "ERROR one of the sdl sub managers is null"; - DebugTool.logError(info); + Log.e(TAG, info); transitionToState(BaseSubManager.ERROR); notifyDevListener(info); } @@ -465,8 +469,7 @@ public class SdlManager{ private void checkSdlManagerState(){ if (state != BaseSubManager.READY && state != BaseSubManager.LIMITED){ - String msg = "SdlManager is not ready for use, be sure to initialize with start() method, implement callback, and use SubManagers in the SdlManager's callback"; - DebugTool.logError(msg, new IllegalStateException(msg)); + Log.e(TAG, "SdlManager is not ready for use, be sure to initialize with start() method, implement callback, and use SubManagers in the SdlManager's callback"); } } @@ -479,7 +482,7 @@ public class SdlManager{ */ public PermissionManager getPermissionManager() { if (permissionManager.getState() != BaseSubManager.READY && permissionManager.getState() != BaseSubManager.LIMITED){ - DebugTool.logError("PermissionManager should not be accessed because it is not in READY/LIMITED state"); + Log.e(TAG,"PermissionManager should not be accessed because it is not in READY/LIMITED state"); } checkSdlManagerState(); return permissionManager; @@ -492,7 +495,7 @@ public class SdlManager{ */ public FileManager getFileManager() { if (fileManager.getState() != BaseSubManager.READY && fileManager.getState() != BaseSubManager.LIMITED){ - DebugTool.logError("FileManager should not be accessed because it is not in READY/LIMITED state"); + Log.e(TAG, "FileManager should not be accessed because it is not in READY/LIMITED state"); } checkSdlManagerState(); return fileManager; @@ -532,7 +535,7 @@ public class SdlManager{ */ public ScreenManager getScreenManager() { if (screenManager.getState() != BaseSubManager.READY && screenManager.getState() != BaseSubManager.LIMITED){ - DebugTool.logError("ScreenManager should not be accessed because it is not in READY/LIMITED state"); + Log.e(TAG, "ScreenManager should not be accessed because it is not in READY/LIMITED state"); } checkSdlManagerState(); return screenManager; @@ -545,7 +548,7 @@ public class SdlManager{ */ public LockScreenManager getLockScreenManager() { if (lockScreenManager.getState() != BaseSubManager.READY && lockScreenManager.getState() != BaseSubManager.LIMITED){ - DebugTool.logError("LockScreenManager should not be accessed because it is not in READY/LIMITED state"); + Log.e(TAG, "LockScreenManager should not be accessed because it is not in READY/LIMITED state"); } checkSdlManagerState(); return lockScreenManager; -- cgit v1.2.1 From dbda671bec8ff63a515018a7b8d2214a21e59d3b Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Tue, 2 Oct 2018 11:16:47 -0400 Subject: Add javadoc and suppress warning --- .../src/main/java/com/smartdevicelink/managers/SdlManager.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index c65628066..d4b2a7133 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -1,5 +1,6 @@ package com.smartdevicelink.managers; +import android.annotation.SuppressLint; import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; @@ -225,6 +226,11 @@ public class SdlManager{ this.screenManager.start(subManagerListener); } + /** + * Get the current state for the SdlManager + * @return int value that represents the current state + * @see BaseSubManager + */ public int getState() { synchronized (STATE_LOCK) { return state; @@ -237,6 +243,7 @@ public class SdlManager{ } } + @SuppressLint("NewApi") public void dispose() { if (this.permissionManager != null) { this.permissionManager.dispose(); @@ -258,7 +265,7 @@ public class SdlManager{ this.videoStreamingManager.dispose(); } - if (this.audioStreamManager != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + if (this.audioStreamManager != null) { this.audioStreamManager.dispose(); } -- cgit v1.2.1 From 14ec60c57a6cb0e0003f8370c9fcd7947e937137 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Tue, 2 Oct 2018 11:22:37 -0400 Subject: Access sdlManager.state using getState() --- .../src/main/java/com/smartdevicelink/managers/SdlManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index d4b2a7133..f0600a2f9 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -169,7 +169,7 @@ public class SdlManager{ private void notifyDevListener(String info) { if (managerListener != null) { - if (state == BaseSubManager.ERROR){ + if (getState() == BaseSubManager.ERROR){ managerListener.onError(info, null); } else { managerListener.onStart(); @@ -265,6 +265,7 @@ public class SdlManager{ this.videoStreamingManager.dispose(); } + // SuppressLint("NewApi") is used because audioStreamManager is only available on android >= jelly bean if (this.audioStreamManager != null) { this.audioStreamManager.dispose(); } @@ -475,7 +476,7 @@ public class SdlManager{ } private void checkSdlManagerState(){ - if (state != BaseSubManager.READY && state != BaseSubManager.LIMITED){ + if (getState() != BaseSubManager.READY && getState() != BaseSubManager.LIMITED){ Log.e(TAG, "SdlManager is not ready for use, be sure to initialize with start() method, implement callback, and use SubManagers in the SdlManager's callback"); } } -- cgit v1.2.1 From f26fab228b3c35b37abb1d606b3b09a0d8a05cc9 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Tue, 2 Oct 2018 11:24:46 -0400 Subject: Access BaseSubManager states only using getState() --- .../main/java/com/smartdevicelink/managers/BaseSubManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java index ed7bee9f1..745ffe083 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java @@ -36,8 +36,8 @@ public abstract class BaseSubManager { */ public void start(CompletionListener listener){ this.completionListener = listener; - if((state == READY || state == LIMITED || state == ERROR) && completionListener != null){ - completionListener.onComplete(state == READY || state == LIMITED); + if((getState() == READY || getState() == LIMITED || getState() == ERROR) && completionListener != null){ + completionListener.onComplete(getState() == READY || getState() == LIMITED); completionListener = null; } } @@ -53,8 +53,8 @@ public abstract class BaseSubManager { synchronized (STATE_LOCK) { this.state = state; } - if((state == READY || state == LIMITED || state == ERROR) && completionListener != null ){ - completionListener.onComplete(state == READY || state == LIMITED); + if((getState() == READY || getState() == LIMITED || getState() == ERROR) && completionListener != null ){ + completionListener.onComplete(getState() == READY || getState() == LIMITED); completionListener = null; } } -- cgit v1.2.1 From 7ab2bc5261e15bbad590eeecfca8d4f8e0ae4ab7 Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Tue, 2 Oct 2018 11:32:39 -0400 Subject: Create state var instead of calling getState() every time --- .../main/java/com/smartdevicelink/managers/BaseSubManager.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java index 745ffe083..6475b481e 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/BaseSubManager.java @@ -36,8 +36,9 @@ public abstract class BaseSubManager { */ public void start(CompletionListener listener){ this.completionListener = listener; - if((getState() == READY || getState() == LIMITED || getState() == ERROR) && completionListener != null){ - completionListener.onComplete(getState() == READY || getState() == LIMITED); + int state = getState(); + if((state == READY || state == LIMITED || state == ERROR) && completionListener != null){ + completionListener.onComplete(state == READY || state == LIMITED); completionListener = null; } } @@ -53,8 +54,8 @@ public abstract class BaseSubManager { synchronized (STATE_LOCK) { this.state = state; } - if((getState() == READY || getState() == LIMITED || getState() == ERROR) && completionListener != null ){ - completionListener.onComplete(getState() == READY || getState() == LIMITED); + if((state == READY || state == LIMITED || state == ERROR) && completionListener != null ){ + completionListener.onComplete(state == READY || state == LIMITED); completionListener = null; } } -- cgit v1.2.1 From 9acc65cfe7ad8840ffe49d827457fb263c2848fb Mon Sep 17 00:00:00 2001 From: Bilal Alsharifi Date: Tue, 2 Oct 2018 11:45:51 -0400 Subject: Remove the limited state check for fileManager --- sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java index f0600a2f9..2f4de7f97 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java +++ b/sdl_android/src/main/java/com/smartdevicelink/managers/SdlManager.java @@ -180,7 +180,7 @@ public class SdlManager{ private void onReady(){ // Set the app icon if (SdlManager.this.appIcon != null && SdlManager.this.appIcon.getName() != null) { - if (fileManager != null && (fileManager.getState() == BaseSubManager.READY || fileManager.getState() == BaseSubManager.LIMITED) && !fileManager.hasUploadedFile(SdlManager.this.appIcon)) { + if (fileManager != null && fileManager.getState() == BaseSubManager.READY && !fileManager.hasUploadedFile(SdlManager.this.appIcon)) { fileManager.uploadArtwork(SdlManager.this.appIcon, new CompletionListener() { @Override public void onComplete(boolean success) { -- cgit v1.2.1