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