Bixby Developer Center

Guides

2020 July–September

Note

Internal platform changes that are not visible to capsule developers will be communicated via internal status updates.

20J Capsule SDK Release Notes

Updated: September 9, 2020

New Developer Console (previously Teams & Capsules)

We've revamped Teams & Capsules, which is now called Bixby Developer Console. The Developer Console has a cleaner look and improved navigation. We've kept all of the existing features, and more updates are coming in the future. Learn more about the new Developer Console.

New Bixby Views Library for Android Display Themes

In continued preparation for Bixby's migration to match Samsung's OneUI, the Bixby Views components have been updated to match the available Android display themes, such as light and dark mode.

As such, we've introduced a new Bixby Views Sketch library, with all the updated components and specifications to match the upcoming new look-and-feel. The previous version of the Bixby Views Sketch library will be deprecated, and eventually removed.

All designs for new and existing capsules will eventually need to be updated to the new Sketch library.

Updates to Optional Template Components

To better refine how optional fragments/strings in dialog templates behave, we are changing the current behavior.

Note

Fragments and template strings that behave optionally are:

If an optional block contains a non-optional fragment or template that returns an empty string, the block will fail. Take, for example, the following template and corresponding dialog:

template ("I'm looking for the best route [to #{value(location)}]")
dialog (Value) {
match: Location (this)
if (exists (this) && not empty (this.name)) {
template ("#{raw (this.name)}")
} else {
template ("")
}
}

In the example above, if Bixby cannot derive location.name, the whole block fails and returns the empty string, resulting in the following dialog:

"I'm looking for the best route"

If location.name can be derived, the result is something like this instead:

"I'm looking for the best route to San Jose"

However, if an optional block contains an optional component that returns an empty string, the block will not fail. Take this template, for example:

template ("Searching for #{value(search.color)} cars for sale")

Notice that there are no optional braces in the template above. If the fragment #{value(search.color)} returned the empty string and the new allow-empty-fragments-in-dialog-templates runtime flag is set to false, the whole template would return the empty string; however, if the flag is true, the final result is:

"Searching for cars for sale"

This behavior also holds for agreement expressions as well.

This runtime flag is enabled by default in runtime version 8 and later versions.

Deprecation Stages

Learn more about the deprecation stages.

  • Stage 1: R20J
  • Stage 2: R20M
  • End of Life: None

Multiple RSS Support for Podcast Template

The Podcast Capsule Template now supports multiple RSS feeds. You can also tag feeds to help users play specific feeds.

Update to Max Line Limit for Slots in 'title-area'

Within Bixby Views, we've updated the maximum number of lines displayed per slot within title-area. This limit varies varies by device, and you can see this new behavior in the title-area interactive demo.

New Permissions and Submissions Troubleshooting Page

If you are having trouble submitting or executing a capsule, you can now check the Troubleshooting Common Issues with Permissions and Submissions topic for help with diagnosing your issue.

20I Capsule SDK Release Notes

Updated: August 12, 2020

Prep Your Capsule for Android Display Themes

In preparation for coming support of Android display themes, you should ensure that your capsule has specific icons and images that account for these themes. Currently, you should account for the light theme and dark theme.

Some images in your capsule, particularly icons, might not be visible or legible when set against a different background in an alternate theme. You can specify alternate images for the light theme by using the light-theme key, which is available in most View's components that let you specify an image by URL. There is also a corresponding dark-theme key that can be used if the image does not have enough contrast for the dark theme.

To maintain backwards compatibility, we're also supporting the current theme for older devices and other non-mobile device types.

Examples

url (icon-default.jpg) {
light-theme (icon-light.jpg)
}
url (icon-default.jpg) {
dark-theme (icon-dark.jpg)
}

New Black Background Image Color

A new Black background image color is now available to create additional contrast to your images in image-background-color for images in cards or background-color for standalone images.

New Requirement for Hints

Before submitting your capsule, if you have hints with constraints, you must also provide at least 3 working uncategorized, visible (unconstrained) hints for each store country and device to the Marketplace. If the hints do not work, your capsule will be rejected.

In summary, you need one of the following:

  • three completely unconstrained hint
  • three hints that are visible to each store/device your capsule supports
  • a combination of the above

For details, see Preparing for Release.

New Option to Opt Out of Capsule Lock

You can now opt out of capsule lock during specific result moments with the capsule-lock key in that particular result view, which overrides the result-view-capsule-lock flag in your runtime version.

Keep in mind that, if you do opt out of capsule lock, conversation drivers will appear on the result view page, but they might not behave as expected. This is true even if the device does not support capsule lock.

New EL Functions for Node Type and Casting

We've introduced two new EL node evaluation functions:

  • typeOf(node): Returns the type of the node. The return value is the fully qualified node name: in a capsule with a capsule ID of example.shoe, the Accessory model has a fully qualified name of example.shoe.Accessory.

  • cast(node, type), node.cast(type): Returns a copy of the node cast to the specified type.

For more information, learn about Node Evaluation Functions.

New Default Value for Primitive Properties

You can now define a default-value for a primitive-type property in structures. However, you cannot define a default value for a structure-type property. If defined and if a value cannot be found for that property, then the default value will be used. Structures inherit any default values defined for properties from a parent structure.

structure (Struct) {
property (int) {
type (viv.core.Integer)
min (Required)
default-value (5)
}
}

New Ability to Declare Required Permissions for Autocomplete

You now should declare which library permissions are needed with the autocomplete component, to ensure that component works correctly. Otherwise, your users get prompted multiple times. Adding library permissions in this situation ensures users are prompted for all permissions only once.

Keep in mind that, if you are declaring library permissions in an autocomplete component, you must declare it both in the capsule.bxb file and in the permissions block in auto-complete.

Examples

...
auto-complete {

source {
collect-with () { }
label ()
where-each () { }
permissions {
library-permission (self:profile)
library-permission (contact:contacts)
}
}
}

20H Capsule SDK Release Notes

Updated: July 14, 2020

New Fridge Target Available for Submissions

Public submissions are now available for bixby-fridge targets in the US and South Korean Marketplaces.

'Enum' Symbols With 'Extends' Deprecated within 'Role-Of'

While you can add new symbols to an enum with extends, you cannot do so with role-of. An enum can extend multiple concepts or have multiple roles only if all the target enum concepts have identical symbol sets.

For information, read about Relationships Between Concepts in the Modeling Concepts topic.

Deprecation Stages

Learn more about the deprecation stages.

  • Stage 1: R20H
  • Stage 2: R20K
  • End of Life: None

Updates to Conversation Drivers with Capsule Lock

With this release, if your capsule opts out of capsule lock, conversation drivers are always shown, even if the device itself doesn't support capsule lock.

Bixby Views Updates

Non-Card Components within 'List-Of' Deprecated

Within Bixby Views, you can now only use card components within a list-of or selection-of list. For example, you can no longer use *-area, paragraph, and single-line components within a list.

Deprecated:

list-of (this) {
where-each(item) {
paragraph: value ("#{value(item)}")
}
}
list-of (this) {
where-each(item) {
title-area {
slot1: text: value ("#{value(item)}")
}
}
}

New:

list-of (this) {
where-each(item) {
compound-card {
content {
paragraph: value ("#{value(item)}")
}
}
}
}
list-of (this) {
where-each(item) {
title-card {
title-area {
slot1: text: value ("#{value(item)}")
}
}
}
}

Deprecation Stages

Learn more about the deprecation stages.

  • Stage 1: R20H
  • Stage 2: R20K
  • End of Life: None
New Size Option for Spacer

You can now customize the spacer size in a single line component with the size key.

New Option to Add Paragraph to Slot 1 of Title Area

You can now add a paragraph to slot1 of title-area.

New Support for Conditionals within Enums

Within Bixby Views, you can now conditionally set a component property, as well as explicitly set them.

Old:

image-card {
aspect-ratio (4:3)
image-url ("[#{value(param.image.url)}]")
text-position (Overlay) // can only be one of the allowed values [Below, Overlay]
}

New:

image-card {
aspect-ratio (4:3)
image-url ("[#{value(param.image.url)}]")
// either
text-position (Overlay) // can only be one of the allowed values [Below, Overlay]

// or
text-position {
if (param.textposition == 'cover') {
value (Overlay) // can only be one of the allowed values [Below, Overlay]
} else {
value (Bottom) // can only be one of the allowed values [Below, Overlay]
}
}
}
New Option to Opt Out of Capsule Lock within Result Moments

If you need to opt out of capsule lock only during specific result moments, you can now use the capsule-lock key in that particular result view.