TedJohnson
Visitor
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-14-2015
01:21 PM
Back Button and Deep Linking
I am just getting started with deep linking and having a hard time with it. I have figured out how to set up a deep link to go to the poster page for a specific show.
The problem is that when I get to the poster page via the deep link, when the user presses the back button on their remote, no message is sent and the channel closes entirely.
If I go to the same page via normal navigation, starting on my channel home page, I can detect a message using this test:
msg.isScreenClosed()
Works totally fine other than when I skip the normal UI and deep link directly to the poster screen for a show.
Can't figure out what is going on. Prior to the poster screen loading, no other screens or dialogs are being loading.
I initialize the screen like this:
Then I call the screen like this:
So it the waiting part, I expect the msg.isScreenClosed() event, but it doens't happen via deep link. Using the same exact code and the normal navigation, it works.
One thing I tried is putting a screen in the stack below this (just a blank loading screen) with the thought that having nothing below my screen in the stack might be causing an issue, but that doesn't work at all.
All the navigation works totally fine, and I get the expected messages from all button clicks other than the back button. Help would be much appreciated as I'm stumped.
The problem is that when I get to the poster page via the deep link, when the user presses the back button on their remote, no message is sent and the channel closes entirely.
If I go to the same page via normal navigation, starting on my channel home page, I can detect a message using this test:
msg.isScreenClosed()
Works totally fine other than when I skip the normal UI and deep link directly to the poster screen for a show.
Can't figure out what is going on. Prior to the poster screen loading, no other screens or dialogs are being loading.
I initialize the screen like this:
Function preShowSeasonScreen(breadA as String, breadB as String) As Object
if validateParam(breadA, "roString", "preShowSeasonScreen", true) = false and validateParam(breadA, "String", "preShowSeasonScreen", true) = false return -1
if validateParam(breadA, "roString", "preShowSeasonScreen", true) = false and validateParam(breadA, "String", "preShowSeasonScreen", true) = false return -1
port=CreateObject("roMessagePort")
screen = CreateObject("roPosterScreen")
screen.SetMessagePort(port)
if breadA<>invalid and breadB<>invalid then
screen.SetBreadcrumbText(breadA, breadB)
end if
screen.SetListStyle("arced-16x9")
screen.setAdDisplayMode("scale-to-fit")
return screen
End Function
Then I call the screen like this:
Function showSeasonScreen(screen As Object, SeasonDetails as Object) As Integer
print "================function showSeasonScreen======================"
if validateParam(screen, "roPosterScreen", "showSeasonScreen") = false return -1
m.curCategory = 0
m.curShow = 0
print "set category names for seasons"
screen.SetListNames(getSeasonList(SeasonDetails))
'get classes for season at the current category index
classes = getContentForSeason(SeasonDetails, 0)
screen.SetContentList(classes)
print "display the show screen"
screen.Show()
print "screen is displayed"
while true
print "wait for message"
msg = wait(0, screen.GetMessagePort())
print "message received of type: " + AnyToString(type(msg))
if type(msg) = "roPosterScreenEvent" then
print "showPosterScreen | msg = "; msg.GetMessage() " | index = "; msg.GetIndex()
if msg.isListFocused() then
m.curCategory = msg.GetIndex()
m.curShow = 0
screen.SetFocusedListItem(m.curShow)
classes = getContentForSeason(SeasonDetails, m.curCategory)
screen.SetContentList(classes)
print "list focused | current category = "; m.curCategory
else if msg.isListItemSelected() then
m.curShow = msg.GetIndex()
print "list item selected | current show index = "; m.curShow
contentId = classes[m.curShow].ContentId
contentType = classes[m.curShow].contentType
print "content id: " ; contentId
showName = seasonDetails[0].showName
seasonName = seasonDetails[0].seasonNames[m.curCategory]
m.curShow = displayContentDetailScreenFromSeason("", "", m.curShow, classes)
screen.SetFocusedListItem(m.curShow)
print "list item updated | new show index = "; m.curShow
else if msg.isScreenClosed() then
print "screen is closed!"
return -1
end if
end If
end while
End Function
So it the waiting part, I expect the msg.isScreenClosed() event, but it doens't happen via deep link. Using the same exact code and the normal navigation, it works.
One thing I tried is putting a screen in the stack below this (just a blank loading screen) with the thought that having nothing below my screen in the stack might be causing an issue, but that doesn't work at all.
All the navigation works totally fine, and I get the expected messages from all button clicks other than the back button. Help would be much appreciated as I'm stumped.
2 REPLIES 2
TedJohnson
Visitor
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-14-2015
02:17 PM
Re: Back Button and Deep Linking
As crazy as it sounds, I seem to have found a work-around to this. If I load a blank screen prior to loading my show screen, like this:
It seems to fix the problem. Found that advise elsewhere in the forums.
The issue seems to be that the Roku quits the channel instantly when it sees nothing below the current screen in the stack, so instantly that it doesn't even send the message that you could intercept with msg.isScreenClosed() so you basically can't run any code at all.
I had actually tried loading a "blank" screen like this before:
This does not work. It causes the channel to instantly crash back to the Roku channel store (or wherever you were on Roku).
If I take the code out of the sub-routine and run it instead of calling ShowWait() it DOES work. Don't get it.
screenFacade = CreateObject("roPosterScreen")
screenFacade.show()
It seems to fix the problem. Found that advise elsewhere in the forums.
The issue seems to be that the Roku quits the channel instantly when it sees nothing below the current screen in the stack, so instantly that it doesn't even send the message that you could intercept with msg.isScreenClosed() so you basically can't run any code at all.
I had actually tried loading a "blank" screen like this before:
Sub ShowWait() As Object
port = CreateObject("roMessagePort")
screen = CreateObject("roParagraphScreen")
screen.SetMessagePort(port)
screen.AddHeaderText(" ")
screen.AddHeaderText(" ")
screen.AddHeaderText("Processing...Please Wait...")
screen.AddHeaderText(" ")
screen.AddHeaderText(" ")
screen.AddHeaderText(" ")
'screen.AddParagraph(sMsg)
screen.Show()
Return screen
End Sub
This does not work. It causes the channel to instantly crash back to the Roku channel store (or wherever you were on Roku).
If I take the code out of the sub-routine and run it instead of calling ShowWait() it DOES work. Don't get it.

RokuMarkn
Visitor
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-14-2015
02:22 PM
Re: Back Button and Deep Linking
Yes, it is documented in Working with Screens that the app exits when the last screen is closed. Your non-working facade example would work only if you save the returned screen in a variable in the calling function. Otherwise the screen variable becomes unreferenced when the function returns and the screen is closed.
--Mark
--Mark