6565import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows;
6666import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType;
6767import com.smartdevicelink.proxy.rpc.enums.TouchType;
68+ import com.smartdevicelink.proxy.rpc.enums.VideoStreamingState;
6869import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener;
6970import com.smartdevicelink.streaming.video.SdlRemoteDisplay;
7071import com.smartdevicelink.streaming.video.VideoStreamingParameters;
7475
7576import java.lang.ref.WeakReference;
7677import java.util.ArrayList;
77- import java.util.Arrays;
7878import java.util.List;
7979import java.util.concurrent.CopyOnWriteArrayList;
8080import java.util.concurrent.FutureTask;
@@ -90,13 +90,12 @@ public class VideoStreamManager extends BaseVideoStreamManager {
9090 private float[] touchScalar = {1.0f,1.0f}; //x, y
9191 private HapticInterfaceManager hapticManager;
9292 private SdlMotionEvent sdlMotionEvent = null;
93- private HMILevel hmiLevel ;
93+ private OnHMIStatus currentOnHMIStatus ;
9494 private StreamingStateMachine stateMachine;
9595 private VideoStreamingParameters parameters;
9696 private IVideoStreamListener streamListener;
9797 private boolean isTransportAvailable = false;
9898 private boolean hasStarted;
99- private List<HMILevel> streamableLevels = Arrays.asList(HMILevel.HMI_FULL, HMILevel.HMI_LIMITED);
10099
101100 // INTERNAL INTERFACES
102101
@@ -151,12 +150,10 @@ public void onNotified(RPCNotification notification) {
151150 if (onHMIStatus.getWindowID() != null && onHMIStatus.getWindowID() != PredefinedWindows.DEFAULT_WINDOW.getValue()) {
152151 return;
153152 }
154- HMILevel prevHMILevel = hmiLevel;
155- hmiLevel = onHMIStatus.getHmiLevel();
156- if (streamableLevels.contains(hmiLevel)) {
157- checkState();
158- }
159- if (hasStarted && (streamableLevels.contains(prevHMILevel)) && (!streamableLevels.contains(hmiLevel))) {
153+ OnHMIStatus prevOnHMIStatus = currentOnHMIStatus;
154+ currentOnHMIStatus = onHMIStatus;
155+ checkState();
156+ if (hasStarted && (isHMIStateVideoStreamCapable(prevOnHMIStatus)) && (!isHMIStateVideoStreamCapable(currentOnHMIStatus))) {
160157 internalInterface.stopVideoService();
161158 }
162159 }
@@ -183,7 +180,6 @@ public VideoStreamManager(ISdl internalInterface){
183180 super(internalInterface);
184181
185182 virtualDisplayEncoder = new VirtualDisplayEncoder();
186- hmiLevel = HMILevel.HMI_NONE;
187183
188184 // Listen for video service events
189185 internalInterface.addServiceListener(SessionType.NAV, serviceListener);
@@ -206,14 +202,19 @@ public void start(CompletionListener listener) {
206202 private synchronized void checkState(){
207203 if(this.getState() == SETTING_UP
208204 && isTransportAvailable
209- && hmiLevel != null
210- && streamableLevels.contains(hmiLevel)
205+ && isHMIStateVideoStreamCapable(currentOnHMIStatus)
211206 && parameters != null){
212207 stateMachine.transitionToState(StreamingStateMachine.READY);
213208 transitionToState(READY);
214209 }
215210 }
216211
212+ boolean isHMIStateVideoStreamCapable(OnHMIStatus onHMIStatus) {
213+ HMILevel hmiLevel = (onHMIStatus != null && onHMIStatus.getHmiLevel() != null) ? onHMIStatus.getHmiLevel() : HMILevel.HMI_NONE;
214+ VideoStreamingState videoStreamingState = (onHMIStatus != null && onHMIStatus.getVideoStreamingState() != null) ? onHMIStatus.getVideoStreamingState() : VideoStreamingState.STREAMABLE;
215+ return (hmiLevel.equals(HMILevel.HMI_FULL) || hmiLevel.equals(HMILevel.HMI_LIMITED)) && videoStreamingState.equals(VideoStreamingState.STREAMABLE);
216+ }
217+
217218 private void getVideoStreamingParams(){
218219 if(internalInterface.getProtocolVersion().getMajor() >= 5) {
219220 internalInterface.getCapability(SystemCapabilityType.VIDEO_STREAMING, new OnSystemCapabilityListener() {
@@ -305,13 +306,12 @@ public void onError(String info) {
305306 */
306307 protected void startStreaming(VideoStreamingParameters parameters, boolean encrypted){
307308 this.parameters = parameters;
308- if (!streamableLevels.contains(hmiLevel )) {
309- Log.e(TAG, "Cannot start video service if HMILevel is not FULL or LIMITED. ");
309+ if (!isHMIStateVideoStreamCapable(currentOnHMIStatus )) {
310+ Log.e(TAG, "Cannot start video service in the current HMI status ");
310311 return;
311312 }
312313 //Start the video service
313314 this.internalInterface.startVideoService(parameters, encrypted);
314-
315315 }
316316
317317 /**
@@ -401,15 +401,15 @@ public boolean isServiceActive(){
401401 * @return boolean (true = yes, false = no)
402402 */
403403 public boolean isStreaming(){
404- return (stateMachine.getState() == StreamingStateMachine.STARTED) && (streamableLevels.contains(hmiLevel ));
404+ return (stateMachine.getState() == StreamingStateMachine.STARTED) && (isHMIStateVideoStreamCapable(currentOnHMIStatus ));
405405 }
406406
407407 /**
408408 * Check if video streaming has been paused due to app moving to background or manually stopped
409409 * @return boolean (true = not paused, false = paused)
410410 */
411411 public boolean isPaused(){
412- return (hasStarted && stateMachine.getState() == StreamingStateMachine.STOPPED) || (!streamableLevels.contains(hmiLevel ));
412+ return (hasStarted && stateMachine.getState() == StreamingStateMachine.STOPPED) || (!isHMIStateVideoStreamCapable(currentOnHMIStatus ));
413413 }
414414
415415 /**
0 commit comments