Stack Not Working, Exits App

My attempt here is to create a player with a live video stream and confirm the viewer is still watching after a predetermined time. Currently I have the video playing and a confirmation dialog pop up. If a viewer confirms they are still watching then the timer loop resets and repeats as necessary.

The issue I’m running into is that if the viewer does not confirm they are still watching or clicks no, then the app completely exits back to the main Roku screen. From my understanding, since I am creating the paragraph screen before the video screen, then the screens are stacked and if the video screen is closed, then in theory it should return to the previous screen in the stack. But it’s not doing this.

Am I misunderstanding the use of stacked screens or is there something wrong with my code?

Thanks.

Function Main()
	Console_Log("Creating the global variables")
	m.popup_time = 10000
	m.close_time = 30000

	m.port = CreateObject("roMessagePort")

	Show_Main_Screen()

    video = CreateObject("roVideoScreen")
    video.SetContent({
        Title: "Test Video For Timer Functionality"
        StreamFormat: "mp4"
        Stream: { URL: "http://video.mp4"}
    })
    video.Show()
    Console_Log("Video Screen Shown")

    Main_Timer()
End Function

Function Show_Main_Screen()
	screen = CreateObject("roParagraphScreen")
    screen.SetMessagePort(m.port) ' instruct screen to send events to port

    screen.AddParagraph("Just a test screen for a timer function")

    screen.Show()
    Console_Log("Main Screen Shown")
End Function

Function Show_Popup() as Boolean
	Console_Log("Starting Popup Function")
	newport = CreateObject("roMessagePort")
    popup = CreateObject("roMessageDialog")
    popup.SetMessagePort(newport) ' instruct screen to send events to port

	popup.SetTitle("Viewer")
    popup.SetText("Are you still watching?")

    popup.AddButton(0, "Yes")
    popup.AddButton(1, "No")

    popup.Show()
    Console_Log("Popup Shown")

    timer=createObject("rotimespan")
    timer.Mark()

    while true
		msg = wait(5000, popup.GetMessagePort())
	    if type(msg) = "roMessageDialogEvent"
	    	if msg.isButtonPressed()
	    		if msg.GetIndex() = 0
	    			popup.Close()
					return true
	    			exit while
	    		else if msg.GetIndex() = 1
	    			popup.Close()
	    			exit while
	    		end if
	    	end if
	    end if
	    return false
	end while

End Function

Function Main_Timer()
	Console_Log("Main Timer Started")
    timer=createObject("rotimespan")
    port = CreateObject("roMessagePort")

    timer.Mark()

    while true
		event = port.GetMessage()

		if(event = invalid)
			ticks = timer.TotalMilliseconds()

			if(ticks > m.popup_time AND ticks < (m.popup_time+2000))
				print Stri(m.popup_time+2000)
				response = Show_Popup()
				if (response = true)
					Console_Log("Yes Button Was Pressed")
					timer.Mark()
				else if (response = false)
					Console_Log("No Button Was Pressed")
					exit while
				end if
			end if
		end if
	end while
End Function

Function Console_Log(Message)
	print Message
End Function

Your screen in Show_Main_Screen() is locally scoped, so it’s going to close automatically when that function exits. The easiest fix would probably be to return the screen from that function and keep it alive in Main().

I made some modifications based off your suggestion, but it’s still not working. Here are the modifications I made

Function Main()
    ....
	temp = Show_Main_Screen()
	temp.Show()
    ....
End Function

Function Show_Main_Screen() as Object
    ....
    return screen
End Function
Function Main()
	Console_Log("Creating the global variables")
	m.popup_time = 10000
	m.close_time = 30000

	m.port = CreateObject("roMessagePort")

	temp = Show_Main_Screen()
	temp.Show()

    video = CreateObject("roVideoScreen")
    video.SetContent({
        Title: "Test Video For Timer Functionality"
        StreamFormat: "mp4"
        Stream: { URL: "http://video.mp4"}
    })
    video.Show()
    Console_Log("Video Screen Shown")

    Main_Timer()
End Function

Function Show_Main_Screen() as Object
	screen = CreateObject("roParagraphScreen")
    screen.SetMessagePort(m.port) ' instruct screen to send events to port

    screen.AddParagraph("Just a test screen for a timer function")

    Console_Log("Main Screen Shown")
    return screen
End Function

Hi DukeOfMarshall, You must show video screen first and then paragraph screen as bellow

Show_Main_Screen()

    video = CreateObject("roVideoScreen")
    video.SetContent({
        Title: "Test Video For Timer Functionality"
        StreamFormat: "mp4"
        Stream: { URL: "http://video.mp4"}
    })
    video.Show()
    Console_Log("Video Screen Shown")

or you can use event loop as following

Function Main()
   Console_Log("Creating the global variables")
   m.popup_time = 10000
   m.close_time = 30000

   m.port = CreateObject("roMessagePort")

   temp = Show_Main_Screen()
   temp.Show()
   Show_Video_Screen()
   Main_Timer()
	while true
		msg = wait(0, temp.GetMessagePort())
		if type(msg) = "roParagraphScreenEvent"
			if msg.isScreenClosed()
				exit while  
			'if you want to play again
			'else if msg.isButtonPressed()
				'Show_Video_Screen()
			end if
		end if
	end while 
End Function

Function Show_Main_Screen() as Object
   screen = CreateObject("roParagraphScreen")
    screen.SetMessagePort(m.port) ' instruct screen to send events to port

    screen.AddParagraph("Just a test screen for a timer function")

    Console_Log("Main Screen Shown")
    return screen
End Function

Function Show_Video_Screen()
 video = CreateObject("roVideoScreen")
    video.SetContent({
        Title: "Test Video For Timer Functionality"
        StreamFormat: "mp4"
        Stream: { URL: "http://video.mp4"}
    })
    video.Show()
    Console_Log("Video Screen Shown")
End Function

Thanks for the help and the suggestion, but that still didn’t work for me. Your suggestion caused the app to exit from the video screen not long after the loading animation appeared and then the pop up would show up over the main screen instead of the playing video.

However, I was able to keep playing around with it and below is the code that I now have working. I think I may be completely misunderstanding the stack concept, but I completely left that behind and took a more object oriented approach to the situation. Now I have a working model that I can build on.

Thanks to everyone for their help and suggestions through this.

Sub Main()
	Console_Log("Creating the global variables")
	m.popup_time = 10000
	m.close_time = 30000

	m.port = CreateObject("roMessagePort")

	temp = Show_Main_Screen()
	temp.Show()

    video = Show_Video_Screen()

    Main_Timer(video)

    while true
		msg = wait(0, temp.GetMessagePort())
      	if type(msg) = "roParagraphScreenEvent"
         	if msg.isScreenClosed()
				exit while
			'if you want to play again
			else if msg.isButtonPressed()
				if msg.GetIndex() = 0
					video = Show_Video_Screen()
					Main_Timer(video)
	    		else if msg.GetIndex() = 1
	    			temp.Close()
	    			exit while
	    		end if
			end if
		end if
	end while
End Sub

Function Show_Main_Screen() As Object
	screen = CreateObject("roParagraphScreen")
    screen.SetMessagePort(m.port) ' instruct screen to send events to port

    screen.AddParagraph("Just a test screen for a timer function")

    screen.AddButton(0, "Play Again")
    screen.AddButton(1, "Exit")

    Console_Log("Main Screen Shown")
    return screen
End Function

Function Show_Video_Screen() As Object
	video = CreateObject("roVideoScreen")
    video.SetContent({
        Title: "Test Video For Timer Functionality"
        StreamFormat: "mp4"
        Stream: {
        	URL: "http://video.mp4"
        }
    })
    Console_Log("Video Screen Shown")
    return video
End Function

Function Show_Popup() as Boolean
	Console_Log("Starting Popup Function")
	newport = CreateObject("roMessagePort")
    popup = CreateObject("roMessageDialog")
    popup.SetMessagePort(newport) ' instruct screen to send events to port

	popup.SetTitle("Viewer")
    popup.SetText("Are you still watching?")

    popup.AddButton(0, "Yes")
    popup.AddButton(1, "No")

    popup.Show()
    Console_Log("Popup Shown")

    timer=createObject("rotimespan")
    timer.Mark()

    while true
		msg = wait(5000, popup.GetMessagePort())
	    if type(msg) = "roMessageDialogEvent"
	    	if msg.isButtonPressed()
	    		if msg.GetIndex() = 0
	    			popup.Close()
					return true
	    			exit while
	    		else if msg.GetIndex() = 1
	    			popup.Close()
	    			exit while
	    		end if
	    	end if
	    end if
	    return false
	end while

End Function

Sub Main_Timer(video as object)
	Console_Log("Main Timer Started")
    timer=createObject("rotimespan")
    port = CreateObject("roMessagePort")

    timer.Mark()

    video.Show()

    while true
		event = port.GetMessage()

		if(event = invalid)
			ticks = timer.TotalMilliseconds()

			if(ticks > m.popup_time AND ticks < (m.popup_time+2000))
				print Stri(m.popup_time+2000)
				response = Show_Popup()
				if (response = true)
					Console_Log("The 'Yes' Button Was Pressed")
					timer.Mark()
				else if (response = false)
					Console_Log("The 'No' Button Was Pressed")
					video.Close()
					exit while
				end if
			end if
		end if
	end while
End Sub

Function Console_Log(Message)
	print Message
End Function