Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/DEVELOPER/authentication/on-device-authentication.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ To check for a valid access token in the device registry, follow these steps:
...
end if

'check if access token stored in Roku cloud has specifed value
'check if access token stored in Roku cloud has specified value
response = myChannelStore.storeChannelCredDataStatus.response
if response.json.channel_data = myChannelStore.channelCredData
...
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ If both the device registry and Roku cloud do not contain a valid access token,
' ...
end if

'check if access token stored in Roku cloud has specifed value
'check if access token stored in Roku cloud has specified value
response = myChannelStore.storeChannelCredDataStatus.response
if response.json.channel_data = myChannelStore.channelCredData
' ...
Expand All @@ -168,4 +168,4 @@ Roku does not recommend any one approach to addressing sign out situations, and

## Testing Automatic Account Link

You can test Automatic Account Link by sideloading your app and using the [billing test feature in the Developer Dashboard](doc:billing-testing).
You can test Automatic Account Link by sideloading your app and using the [billing test feature in the Developer Dashboard](doc:billing-testing).
2 changes: 1 addition & 1 deletion docs/DEVELOPER/dev-tools/app-tracing.md
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ The following examples demonstrate some of the use cases for querying your trace

Roku's Perfetto-based app tracing solution exposes a number of terms that Roku developers may be unfamiliar with:

| Term | Defintion |
| Term | Definition |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| SdkLauncher | A Roku OS plugin that provides an environment for running SDK apps in a sandboxed process. |
| PR_ui | The main BrightScript thread. |
Expand Down
2 changes: 1 addition & 1 deletion docs/DEVELOPER/dev-tools/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Describes each SceneGraph component, defines the relationship between nodes, and

## Development Application Installer

Every Roku device can be configured to support developer tasks such as installing apps, packaging apps, and creating your app's screenshots. The Developmemnt Application Installer enables installing or "sideloading" an app to a Roku device to test and QA before submitting for publication.
Every Roku device can be configured to support developer tasks such as installing apps, packaging apps, and creating your app's screenshots. The Development Application Installer enables installing or "sideloading" an app to a Roku device to test and QA before submitting for publication.

![roku815px - developersettings](https://image.roku.com/ZHZscHItMTc2/developersettings.png "developersettings")

Expand Down
2 changes: 1 addition & 1 deletion docs/DEVELOPER/discovery/instant-signup.md
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,7 @@ Apps can leverage the [ChannelStore](doc:channelstore) APIs and [Roku Pay web se
...
end if

'check if access token stored in Roku cloud has specifed value
'check if access token stored in Roku cloud has specified value
response = myChannelStore.storeChannelCredDataStatus.response
if response.json.channel_data = myChannelStore.channelCredData
...
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ Exit codes do not persist across system reboots and system resumptions. The last
| EXIT_CHANNEL_SIDELOAD | The app was exited due to the user installing a sideloaded app. |
| EXIT_CHANNEL_RESTART | The app was exited due to an app-initiated restart. This is typically a reserved function in the system. |
| EXIT_TILE_HIDDEN | The app was exited due to the user hiding the Soundbar tile on a Roku TV. |
| EXIT_SETTINGS_UPDATE | The app was exited by the system due to a device settings update (for exampe, a theme or resolution change that required restart). |
| EXIT_SETTINGS_UPDATE | The app was exited by the system due to a device settings update (for example, a theme or resolution change that required restart). |
| EXIT_CHANNEL_MEM_LIMIT_FG | The app was exited by the system because it exceeded its memory limit while running in the foreground. |
| EXIT_CHANNEL_MEM_LIMIT_BG | The app was exited by the system because it exceeded its memory limit while running in the background. |
| EXIT_ADDON_DEPENDENCY | The app was exited by the system while applying a system dependency update. This should only apply while running in the background. |
Expand Down
4 changes: 2 additions & 2 deletions docs/DEVELOPER/media-playback/voice-controls/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ With voice controls, your app can respond to the following types of voice comman
For more information on handling basic and enhanced voice controls, see [Implementing voice controls](doc:transport-controls).


> Apps that have streamed more than an average of 5 million hours per month over the last three months must implement all basic, enhanced, and additonal enhanced voice controls to pass [certification](doc:certification). This is also applicable to new apps projected to reach the specified streaming hours threshold shortly after launch.
> Apps that have streamed more than an average of 5 million hours per month over the last three months must implement all basic, enhanced, and additional enhanced voice controls to pass [certification](doc:certification). This is also applicable to new apps projected to reach the specified streaming hours threshold shortly after launch.

## Profile selection

Apps with a profile selection screen can also audibly and visually prompt the viewer to select a user profile and then handle a voice request with the name or position of the selected profile. For more information, see [Selecting user profiles with Roku Voice](doc:voice-profile-selector).
Apps with a profile selection screen can also audibly and visually prompt the viewer to select a user profile and then handle a voice request with the name or position of the selected profile. For more information, see [Selecting user profiles with Roku Voice](doc:voice-profile-selector).
6 changes: 3 additions & 3 deletions docs/DEVELOPER/performance-guide/data-transfer-apis.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ print my_aa ' contents of aa_field

## Accessing fields by reference

You can access fields by reference instead of copying their values. This is significantly faster than copying; however, you can only do this on the render thread for fields with an associative array type. Access by reference cannot be used when queuing fields, and you must explicity set references before getting them.
You can access fields by reference instead of copying their values. This is significantly faster than copying; however, you can only do this on the render thread for fields with an associative array type. Access by reference cannot be used when queuing fields, and you must explicitly set references before getting them.

> **Function references**
>
Expand Down Expand Up @@ -167,7 +167,7 @@ This function returns true if successful; otherwise it return false, indicating

#### Description

Indicates whether the **GetRef()** function will succeed in the current context. The **GetRef()** call will only succeed if is called on the render thread and the **SetRef()** function had previoulsy been called on the **field_name**.
Indicates whether the **GetRef()** function will succeed in the current context. The **GetRef()** call will only succeed if is called on the render thread and the **SetRef()** function had previously been called on the **field_name**.

The specified **field_name** must be an associative array, and it must have previously been given a value via **SetRef()**.

Expand Down Expand Up @@ -235,7 +235,7 @@ The **roUtils** component provides a unique namespace for a library of global fu

#### Description

Performs a deep copy of the source node object (it copies the obejct and all of its nested objects). If the source object contains items that are not copyable, they are skipped.
Performs a deep copy of the source node object (it copies the object and all of its nested objects). If the source object contains items that are not copyable, they are skipped.

#### Parameters

Expand Down
2 changes: 1 addition & 1 deletion docs/DEVELOPER/publishing/channel-publishing-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ Configure how your app is listed in the Streaming Store, including the app's hom
Domestic region
</td>
<td>
Select the country where your app is considered native and/or domestic. Your app will be displayed in the "International" category of all regional Streming Stores that include your app and are outside your domestic region.
Select the country where your app is considered native and/or domestic. Your app will be displayed in the "International" category of all regional Streaming Stores that include your app and are outside your domestic region.
</td>
</tr>
<tr>
Expand Down
6 changes: 3 additions & 3 deletions docs/DEVELOPER/release-notes/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
The roUtils component includes new *isNumber()*, *isString()*, and *isFloatingPoint()* functions that check whether a given value is any kind of number or string (boxed or unboxed).

**Example**
```

Check failure on line 66 in docs/DEVELOPER/release-notes/index.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[brightscript-fence-required] bare ``` fence with BrightScript content; tag it as ```brightscript (CreateObject("ro..."), CreateObject assignment)
utils = CreateObject("roUtils")
? utils.isNumber(42) ' true
? utils.isNumber(box(3.14)) ' true
Expand All @@ -79,7 +79,7 @@

**Example**

```

Check failure on line 82 in docs/DEVELOPER/release-notes/index.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[brightscript-fence-required] bare ``` fence with BrightScript content; tag it as ```brightscript (endfor, for each ... in)
conventions = {"2026": "Los Angeles", "2027": "Chicago", "2028": "New York", "2029": "Miami", "2030", "Seattle"}
CityLabel.Text = conventions.values().join(", ")
for each city in conventions.values()
Expand Down Expand Up @@ -116,7 +116,7 @@

**Example**

```

Check failure on line 119 in docs/DEVELOPER/release-notes/index.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[brightscript-fence-required] bare ``` fence with BrightScript content; tag it as ```brightscript (CreateObject("ro..."), BRS comment ', CreateObject assignment)
' Create and load an animated image
animg = CreateObject("roAnimatedImage")
animg.SetContent({uri: "pkg:/images/spinner.json", mimeType: "video/lottie+json"})
Expand Down Expand Up @@ -1658,7 +1658,7 @@

* Developer controlled HLS stream switching strategies for improved playback ability.
* Multiple Grid layouts: flat-movie, flat-portrait, flat-landscape, flat-square, and flat-16x9
* Developer customized Grid Focused Border image, and Grid Descripton callout box image.
* Developer customized Grid Focused Border image, and Grid Description callout box image.
* Use .png and .gif images as Grid posters.
* Ability to get the Roku's IPAddress within your app. This will enable the External Control API to be utilized directly within your app.

Expand Down Expand Up @@ -1706,7 +1706,7 @@

If any of your BrightScript code is enabling certain features based on model number, we have a new roDeviceInfo.HasFeature() method that will enable you to code this logic in a more forward-looking manner.If you don't account for the new "Back" and "Info" buttons in your code, users may think your app does not behave correctly.

On most screens, the back button will automatically send an event that matches the isScreenClosed() predicate. However, this behavior would break many modal dialogs that do not expect to receive an isScreenClosed()event because they are waiting for a state change or reacting to user input that must be answered. We chose not to break these apps and instead did not enable the back button by default on the roMessageDialog component. We did provide a method to enable the back button on roMessageDialogs that can successfully handle an isScreenClosed() event. You should survey your app for any roMessageDialog components that should enable the back button with EnableBackButton(true). The "Info" button will enable you to pop-up any screen of your choosing. There are two new events added to support this new button. Events matching isButtonInfo()return the button focus of any on screen buttons in when the Info remote key is pressed. Events matching isListItemInfo()return the index of the focused poster when the Info remote key is pressed. The simpleinfo sample application shows basic support for the "Info" button that also demonstrates an overlay dialog on a poster screen. When isRemoteKey()events are propogated to your script, the event.GetIndex() for the Info key is 10.
On most screens, the back button will automatically send an event that matches the isScreenClosed() predicate. However, this behavior would break many modal dialogs that do not expect to receive an isScreenClosed()event because they are waiting for a state change or reacting to user input that must be answered. We chose not to break these apps and instead did not enable the back button by default on the roMessageDialog component. We did provide a method to enable the back button on roMessageDialogs that can successfully handle an isScreenClosed() event. You should survey your app for any roMessageDialog components that should enable the back button with EnableBackButton(true). The "Info" button will enable you to pop-up any screen of your choosing. There are two new events added to support this new button. Events matching isButtonInfo()return the button focus of any on screen buttons in when the Info remote key is pressed. Events matching isListItemInfo()return the index of the focused poster when the Info remote key is pressed. The simpleinfo sample application shows basic support for the "Info" button that also demonstrates an overlay dialog on a poster screen. When isRemoteKey()events are propagated to your script, the event.GetIndex() for the Info key is 10.

## Roku OS 2.6

Expand Down Expand Up @@ -1793,4 +1793,4 @@

There are lots of other changes in this release and these are just some highlights that we wanted to specifically mention. Please check the documentation for additional details.

<br />
<br />
2 changes: 1 addition & 1 deletion docs/DEVELOPER/roku-pay/implementation/channel-store-1.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ When this command is executed, a Request for Information (RFI) screen is display

The [**doOrder** command](doc:channelstore#doorder) completes the transaction for the customer's purchase.

When this command is executed, the Roku Pay order confirmation screen is displayed. This publisher-branded screen summarizes the product being purchased, including the price, product name, and any trial period/discount. It enables the customer to confirm their purchase and update their method of payment if neccessary.
When this command is executed, the Roku Pay order confirmation screen is displayed. This publisher-branded screen summarizes the product being purchased, including the price, product name, and any trial period/discount. It enables the customer to confirm their purchase and update their method of payment if necessary.

![roku815px - img](https://image.roku.com/ZHZscHItMTc2/rsg-channelstore-doorder.jpg)

Expand Down
4 changes: 2 additions & 2 deletions docs/DEVELOPER/roku-pay/implementation/push-notifications.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ Roku Pay sends push notifications for the following transactions:
[Cancellation](#cancellation)
</td>
<td>
A subscription is canceled by the customer, deactivated becuase the customer opted out of automatic renewal, or is passively canceled because payment could not be recovered.<br /><br />Active cancellations: The **expirationDate** field is set to the current or future date<br /><br />Deactivations: The **expirationDate** field is set to the decactivation date<br /><br />Passive cancellations: The **expirationDate** field is set to a past date.
A subscription is canceled by the customer, deactivated becuase the customer opted out of automatic renewal, or is passively canceled because payment could not be recovered.<br /><br />Active cancellations: The **expirationDate** field is set to the current or future date<br /><br />Deactivations: The **expirationDate** field is set to the deactivation date<br /><br />Passive cancellations: The **expirationDate** field is set to a past date.
</td>
<td>
* expirationDate is a future date: no action is required until the expiration date.
Expand Down Expand Up @@ -523,7 +523,7 @@ The publisher action required (if any) depends on the **expirationDate** field:
* **Today's date**: Remove the entitlement (the customer actively canceled the subscription and today is the last day of the billing cycle).
* **Past date**: Remove entitlement (passive cancellation; the subscription could not be recovered).

#### Active cancelation/decativation example
#### Active cancelation/deactivation example

```json
{
Expand Down
4 changes: 2 additions & 2 deletions docs/DEVELOPER/roku-pay/quickstart/product-catalog.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,45 +171,45 @@
<th>
Billing plan setting
</th>

Check warning on line 174 in docs/DEVELOPER/roku-pay/quickstart/product-catalog.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[html-blank-between-tags] blank line between tags inside HTML table (breaks GitHub/IDE preview)
<th>
Description
</th>
</tr>
</thead>

Check warning on line 180 in docs/DEVELOPER/roku-pay/quickstart/product-catalog.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[html-blank-between-tags] blank line between tags inside HTML table (breaks GitHub/IDE preview)
<tbody>
<tr>
<td>
Billing frequency
</td>

Check warning on line 186 in docs/DEVELOPER/roku-pay/quickstart/product-catalog.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[html-blank-between-tags] blank line between tags inside HTML table (breaks GitHub/IDE preview)
<td>
Select the billing period to be used for the subscription product: <strong>monthly</strong>, <strong>quarterly</strong>, or <strong>annual</strong>. Using quartely billing requires [additional API work](doc:add-ons-integration#appendix-a-add-on-api-reference).
</td>
</tr>

Check warning on line 191 in docs/DEVELOPER/roku-pay/quickstart/product-catalog.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[html-blank-between-tags] blank line between tags inside HTML table (breaks GitHub/IDE preview)
<tr>
<td>
Regular price
</td>

Check warning on line 196 in docs/DEVELOPER/roku-pay/quickstart/product-catalog.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[html-blank-between-tags] blank line between tags inside HTML table (breaks GitHub/IDE preview)
<td>
Select one of the predefined price tiers for the product. Tiers are used to enforce 99-cent or 49-cent pricing (in USD) on app products:&#x20;

Check warning on line 199 in docs/DEVELOPER/roku-pay/quickstart/product-catalog.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[html-blank-in-cell] blank line inside HTML table cell content (breaks GitHub/IDE preview) — replace with <br /> or restructure
- One to three-digit tier numbers are used for 99-cent pricing. Subtract 1 cent from a tier to get the corresponding price. For example, Tier 1 is 99 cents, Tier 2 is $1.99, Tier 10 is $9.99, Tier 100 is $99.99 and so on. The highest tier is 400 ($399.99).
- Four-digit tier numbers are used for 49-cent pricing. Append 49 cents to the last digit or last two digits in the tier to get the corresponding price. For example, Tier 1000 is 49 cents, Tier 1001 is $1.49, Tier 1010 is $10.49, Tier 1020 is $20.49, and so on. The highest tier is 1030 ($30.49).

Check warning on line 202 in docs/DEVELOPER/roku-pay/quickstart/product-catalog.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[html-blank-in-cell] blank line inside HTML table cell content (breaks GitHub/IDE preview) — replace with <br /> or restructure
See the [Price tier reference guide](doc:price-tiers) for the complete list of price tiers for each Roku Streaming Store.<br /><br />A chart displays the price, in the appropriate local currency, for each Roku Streaming Store where the product will be available:&#x20;

Check warning on line 204 in docs/DEVELOPER/roku-pay/quickstart/product-catalog.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[html-blank-in-cell] blank line inside HTML table cell content (breaks GitHub/IDE preview) — replace with <br /> or restructure
- The **Currency code** is the three-letter ISO-4217 code of the currency in which the customer will be billed.
- The **Purchase price** reflects the amount to be paid by the customer. The purchase price for EU Streaming Store countries includes VAT. Proceeds are based on pre-tax (net) prices.
- The **Net price** field displays the pre-tax price. The **Proceeds** field displays the amount that you receive from Roku for the sale of the product. Based on exchange rate fluctuations, the proceeds in one Channel Store may not equal the amount to be received in another.

Check warning on line 208 in docs/DEVELOPER/roku-pay/quickstart/product-catalog.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[html-blank-in-cell] blank line inside HTML table cell content (breaks GitHub/IDE preview) — replace with <br /> or restructure
If you are creating a <a href="/dev/docs/tvod-app-catalog">TVOD-exclusive app</a>, select any price tier. The price passed in the <a href="/dev/docs/channelstore">ChannelStore APIs</a> overrides the price corresponding to the selected price tier. <br /><br />**Certification requirement**: SVOD apps must provide a 30-day notice to existing customers before changing the price of their service.<br /><br />If you want certain products to only be available in specific countries, create in-app products for each country and filter out the product by the country in the app business logic. Specifically, you can call the **getUserRegionData** command to determine the country associated with the user's Roku account, and then implement business logic to filter the results of the ChannelStore **getCatalog** command to only display products that should be available for that country. In this case, the publisher is responsible for handling currency coversions.
</td>
</tr>

Check warning on line 212 in docs/DEVELOPER/roku-pay/quickstart/product-catalog.md

View workflow job for this annotation

GitHub Actions / Lint changed docs

docs-lint

[html-blank-between-tags] blank line between tags inside HTML table (breaks GitHub/IDE preview)
<tr>
<td>
Base offer
Expand Down Expand Up @@ -240,7 +240,7 @@

- **Double billing**. If an app has two in-app products for the same monthly subscription but with different free trial durations, these two products must be added to the same product group to prevent the customer from paying for two separate monthly subscriptions.

From the customer's perspective, if they try to purchase a subscription product when they already have one in the same product group, Roky Pay displays a "You're already subscribed to this channel" dialog.
From the customer's perspective, if they try to purchase a subscription product when they already have one in the same product group, Roku Pay displays a "You're already subscribed to this channel" dialog.

![roku815px - already-subscribed](https://image.roku.com/ZHZscHItMTc2/already-subscribed.jpg)

Expand Down Expand Up @@ -358,7 +358,7 @@

You can create limited-time offers to provide customers with a free trial or introductory pricing for a specific period of time (for example, a New Year's promotion for the first two weeks of January). When a new customer subscribes to a product during an active limited-time offer, the customer receives that offer (a limited-time offer takes precedence over the base offer). If no limited-time offer is active, the customer receives the base offer. Customers may only ever receive a single free trial or discount offer for a subscription product, and they may only receive an offer that was made and accepted.

To create a lmited-time offer, follow these steps:
To create a limited-time offer, follow these steps:

1. From the **Purchase options** tab, click the action button for the purchase option, and then click **Add a limited-time offer** on the shortcut menu. Alternatively, click the purchase option row to open the purchase option's details page, and then click **Add limited-time offer** under the **Billing plan** section.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ metadata:
next:
description: ''
---
When payment for a subscription auto-renewal fails, Roku's basic subscription recovery feature gives customers a 3-day grace period where they can continue accessing content, while Roku Pay notifies them daily via email to update their method of payment (MOP). Once the 3-day grace period expires, the subscription is canceled. This solution helps the publisher improve the chance of recovering payments and thereby reduce passive cancelations.
When payment for a subscription auto-renewal fails, Roku's basic subscription recovery feature gives customers a 3-day grace period where they can continue accessing content, while Roku Pay notifies them daily via email to update their method of payment (MOP). Once the 3-day grace period expires, the subscription is canceled. This solution helps the publisher improve the chance of recovering payments and thereby reduce passive cancellations.

> Effective October 1, 2024, all apps using Roku Pay must implement Enhanced Subscription Recovery to pass [certification](doc:roku-pay-requirements#rp-4-authentication-and-entitlement-requirements). As a result, apps using basic subscription recovery solution must migrate to [Enhanced Subscription Recovery](doc:subscription-on-hold).

Expand Down
Loading
Loading