Videoplayer fails with Welcome and Registration screens

Hi Guys,

I am building an application based on the Videoplayer example. As a part of this application, I need to have a Welcome screen and a Registration Screen. So I added two function calls in the Main function of appMain.brs like this:

Sub Main()

    'initialize theme attributes like titles, logos and overhang color
    initTheme()

    'prepare the screen for display and get ready to begin
    screen=preShowHomeScreen("", "")
    if screen=invalid then
        print "unexpected error in preShowHomeScreen"
        return
    end if

    showWelcomeScreen()

    showRegScreen()

    'set to go, time to get started
    showHomeScreen(screen)

End Sub

Please find the function definitions below.

Function showWelcomeScreen() As Void

    port = CreateObject("roMessagePort")
    screen = CreateObject("roParagraphScreen")
    screen.SetMessagePort(port)

    screen.AddHeaderText("XYZ Channel")
    screen.AddParagraph("blah")
    screen.AddParagraph("blah blah")
    screen.AddButton(1, "next")
    screen.Show()

    while true
        msg = wait(0, screen.GetMessagePort())
        if type(msg) = "roParagraphScreenEvent" then
            if msg.isButtonPressed() then
                exit while
            end if
        end if
    end while

    screen.Close()

End Function

Function showRegScreen() As Void

    port = CreateObject("roMessagePort")
    screen = CreateObject("roCodeRegistrationScreen")
    screen.SetMessagePort(port)

    screen.AddParagraph("blah")
    screen.AddFocalText(" ", "spacing-dense")
    screen.AddFocalText("From your computer,", "spacing-dense")
    screen.AddFocalText("go to www.xyz.com/roku", "spacing-dense")
    screen.AddFocalText("and enter this code:", "spacing-dense")
    screen.AddFocalText(" ", "spacing-dense")
    screen.SetRegistrationCode("retrieving code..")
    screen.AddParagraph("This screen will automatically update once your Roku player has been linked.")
    screen.AddButton(0, "get a new code")
    screen.AddButton(1, "back")
    screen.Show()

    sleep(10000)
    screen.SetRegistrationCode("ABC7TG")
    screen.Show()

    while true
        msg = wait(0, screen.GetMessagePort())
        if type(msg) = "roCodeRegistrationScreenEvent" then
            exit while
        end if
    end while

    screen.Close()

End Function

The registration screen should show as if the code is being fetched from the web server. Thats why, the 10s delay! Now, the problem here is when I run the application the Welcome screen appears and when I press the next button, the registration screen flashes and the application terminates and returns to the Main roku screen. I was wondering if anyone else is facing this problem or is it something in my code? I would really appreciate any comments on this and sorry for the long post!

I don’t see anything wrong with the code you posted… Maybe there’s something wrong in some of the unposted functions…

Anyway I used your showWelcomeScreen() and showRegScreen() in a quick sample app that displays a poster screen when hitting the showRegScreen() back button…

Maybe that will get you going?


Sub Main()

    'initialize theme attributes like titles, logos and overhang color
    initTheme()

    'display a fake screen while the real one initializes. this screen
    'has to live for the duration of the whole app to prevent flashing
    'back to the roku home screen.
    screenFacade = CreateObject("roPosterScreen")
    screenFacade.show()

    showWelcomeScreen()
    showRegScreen()

    Items = [ {ContentType:"episode"
               SDPosterUrl:"file://pkg:/images/DanGilbert.jpg"
               HDPosterUrl:"file://pkg:/images/DanGilbert.jpg"
               IsHD:true
               HDBranded:true
               ShortDescriptionLine1:"Dan Gilbert asks, Why are we happy?"
               ShortDescriptionLine2:""
               Description:"Harvard psychologist Dan Gilbert says our beliefs about what will make us happy are often wrong -- a premise he supports with intriguing research, and explains in his accessible and unexpectedly funny book, Stumbling on Happiness."
               Rating:"NR"
               StarRating:"80"
               Length:1280
               Categories:["Technology","Talk"]
               Title:"Dan Gilbert asks, Why are we happy?"
               },
               {ContentType:"episode"
               SDPosterUrl:"file://pkg:/images/DanGilbert.jpg"
               HDPosterUrl:"file://pkg:/images/DanGilbert.jpg"
               IsHD:true
               HDBranded:true
               ShortDescriptionLine1:"Dan Gilbert asks, Why are we happy?"
               ShortDescriptionLine2:""
               Description:"Harvard psychologist Dan Gilbert says our beliefs about what will make us happy are often wrong -- a premise he supports with intriguing research, and explains in his accessible and unexpectedly funny book, Stumbling on Happiness."
               Rating:"NR"
               StarRating:"80"
               Length:1280
               Categories:["Technology","Talk"]
               Title:"Dan Gilbert asks, Why are we happy?"
               }
            ]

    port = CreateObject("roMessagePort")
    screen = CreateObject("roPosterScreen")
    screen.SetMessagePort(port)

    screen.SetBreadcrumbText("Roku", "FeatureTests")

    Categories = [ "Category 1", "Category 2", "Category 3" ]
    Categories2 = [ "Category A", "Category B", "Category C" ]
    screen.SetListNames(Categories)
    screen.SetContentList(Items)
    screen.Show()

    while true
        msg = wait(0, screen.GetMessagePort())
        print "Event: type: "; msg.GetType(); " Index: " ;msg.GetIndex(); " Data: " msg.GetData(); " msg: " msg.GetMessage()
        if type(msg) = "roPosterScreenEvent"
            if msg.isScreenClosed()
                print "Screen closed"
                exit while                
            endif
        endif
    end while
    

End Sub

'*************************************************************
'** Set the configurable theme attributes for the application
'** 
'** Configure the custom overhang and Logo attributes
'*************************************************************

Sub initTheme()

    app = CreateObject("roAppManager")
    theme = CreateObject("roAssociativeArray")

    theme.OverhangPrimaryLogoOffsetSD_X = "72"
    theme.OverhangPrimaryLogoOffsetSD_Y = "15"
    theme.OverhangSliceSD = "pkg:/images/Overhang_BackgroundSlice_SD43.png"
    theme.OverhangPrimaryLogoSD  = "pkg:/images/Logo_Overhang_SD43.png"

    theme.OverhangPrimaryLogoOffsetHD_X = "123"
    theme.OverhangPrimaryLogoOffsetHD_Y = "20"
    theme.OverhangSliceHD = "pkg:/images/Overhang_BackgroundSlice_HD.png"
    theme.OverhangPrimaryLogoHD  = "pkg:/images/Logo_Overhang_HD.png"

    app.SetTheme(theme)

End Sub

Function showWelcomeScreen() As Void

    port = CreateObject("roMessagePort")
    screen = CreateObject("roParagraphScreen")
    screen.SetMessagePort(port)

    screen.AddHeaderText("XYZ Channel")
    screen.AddParagraph("blah")
    screen.AddParagraph("blah blah")
    screen.AddButton(1, "next")
    screen.Show()

    while true
        msg = wait(0, screen.GetMessagePort())
        if type(msg) = "roParagraphScreenEvent" then
            if msg.isButtonPressed() then
                exit while
            end if
        end if
    end while

    screen.Close()

End Function

Function showRegScreen() As Void

    port = CreateObject("roMessagePort")
    screen = CreateObject("roCodeRegistrationScreen")
    screen.SetMessagePort(port)

    screen.AddParagraph("blah")
    screen.AddFocalText(" ", "spacing-dense")
    screen.AddFocalText("From your computer,", "spacing-dense")
    screen.AddFocalText("go to www.xyz.com/roku", "spacing-dense")
    screen.AddFocalText("and enter this code:", "spacing-dense")
    screen.AddFocalText(" ", "spacing-dense")
    screen.SetRegistrationCode("retrieving code..")
    screen.AddParagraph("This screen will automatically update once your Roku player has been linked.")
    screen.AddButton(0, "get a new code")
    screen.AddButton(1, "back")
    screen.Show()

    sleep(10000)
    screen.SetRegistrationCode("ABC7TG")
    screen.Show()

    while true
        msg = wait(0, screen.GetMessagePort())
        if type(msg) = "roCodeRegistrationScreenEvent" then
            exit while
        end if
    end while

    screen.Close()

End Function

Thanks a lot Kevin! The facade screen did the magic. I did not have one in my main function and without it for some reason the app was getting killed after displaying the Welcome screen and before the registration screen could load itself. Now, it works well. Thanks again.

Without the screen facade there are no screens left in the display stack when the reg screen closes so the app exits…

–Kevin

I tried this example above and gave me some help thank you!

But the issues I now have are these:

1.) retrieving code takes a long time like 20 + seconds
2.) if i click on get a new code it just takes me to the categories
3,) with this example it now doesn’t allow for the categories etc shown from the xml in the original videoplayer example

how can we get this to work together with the video player to grab the Xml for categories etc. Just finally got the xml to be created server side so really want to keep that working.

  1. Note that the sleeps in my code are just to provide a simulation. Take them out when pointing to your real site!
  2. This simulation doesn’t wire up the “Get new Code” button… you have to do that.
  3. You would replace the categories parsed from your xml where the current hardcoded Categories = [ “Category 1”, “Category 2”, “Category 3” ] array is.

–Kevin

Thanks Kevin but i have tried and tried but it wont work, i seem to always cut off something that will then not even show my channel .

all i am trying to do is a registration screen and then go to the appHomeScreen.brs page after a good registration.

then on a Back button just go to a alternate poster screen like simplePoster.brs – mainly so i can see how this back button is working and sending to another page.

also is it possible to add a banner in this reg screen?

I suggest you start with the working example code in this post and make your modifications step by step.

There is no way to have an ad banner on the reg screen.

–Kevin

Kevin,

I have been able to use the register example and link my roku…

but when trying to get your example here working i am having a few issues.

1.) in the Register example i was able to put the url of the prelink like this:
m.UrlGetRegCode = m.UrlBase + “/prelink.php””.

so how do we do the prelinking in this example? i tried adding the regScreen.brs from the register example i got working, but it doesnt do anything actually

is this example almost complete like i only need appMain.brs or does it need more supporting files?

could you just show a example of using the registration with the video player example? i have tried adding the whole registration example into the video player example folder. but not sure how to get them to play with each other correctly.

NOTE: I made this question a new topic here viewtopic.php?f=34&t=39292&p=260215#p260215
i hope that’s OK!

I started with the videoplayer example, added my modified ‘regScreen.brs’ file to the folder, then modified ‘appHomeScreen.brs’, adding the line ‘doRegistration()’ between these two lines:

      else if msg.isListItemSelected() then
                  print "list item selected | index = "; msg.GetIndex()

Now the roku asks the user to register before playing the videos (YAY!)

In the example, it looks like the first part of doRegistration() is to load the reg token and if it exists, bypass the registration.

Is the token somehow associated to our channel inside the roku, or do we need to give the token a name more unique than “RegToken” (otherwise any old RegToken would grant access to our channel)?

And what if the user cancels their membership on our site, how can we deactivate their token if we don’t check it? I don’t think that we can, given the way this is working in the example…

I think there needs to be another script on my server that checks the unique code stored in roku’s registry and tells the roku whether it is authorized, and if yes, bypass reg and give them the content, or if not, then doRegistration().

It should work similarly to the other components of registration (Brightscript sends out a call to the server including the stored unique code and handles the response; the server receives the inquiry with stored code, checks the code in the db, and returns the appropriate response)

Is this component in the register example, or something I’ll need to write myself?

Your registry is private to any apps signed by the same private key when packaging. So you only have to worry about registry namespace conflicts between apps that you’ve signed.

If the user cancels service on your site, your site would no longer let the Device Service Token pass the authentication. This is usually implemented in your services by deleting the row with a matching token.

You’ve got the right idea about having the server side authentication and if not authenticated doRegistration(). This authentication piece is not in the registration example and would need to be added to a real app.

–Kevin

Thanks very much Kevin - I believe I have it all figured out and working today, as per my post here
viewtopic.php?f=34&t=39292#p260593