Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

ListBuilder

open class ListBuilder : TemplateSliceBuilder
kotlin.Any
   ↳ androidx.slice.builders.TemplateSliceBuilder
   ↳ androidx.slice.builders.ListBuilder

Builder for constructing slices composed of rows of content.

A slice is a piece of templated app content that can be presented outside of the app providing the slice in a androidx.slice.widget.SliceView. To provide a slice you should implement a androidx.slice.SliceProvider and use ListBuilder to construct your slice when androidx.slice.SliceProvider#onBindSlice(Uri) is called.

ListBuilder allows you to construct a slice made up of rows of content. The row types that ListBuilder supports are:

  • HeaderBuilder - The first row of your slice should be a header. The header supports a title, subtitle, and tappable row action. A header can also have a summary of the contents of the slice which can be shown when not all of the slice can be displayed.
  • RowBuilder - A basic row supports title, subtitle, timestamps, and various action types.
  • GridRowBuilder - A grid row supports cells of vertically laid out content displayed in a single row.
  • RangeBuilder - A range row supports displaying a horizontal progress indicator.
  • InputRangeBuilder - An input range row supports displaying a horizontal slider allowing slider input (e.g. brightness or volume slider).

Handling modes

Slices are meant to be presented outside of the app providing them, the slice presenter could be an Android system surface or another application. The presenter will normally use a androidx.slice.widget.SliceView to display a slice. SliceView supports a couple of different modes. These modes are not controlled by the app providing the slice, but rather by the surface that is presenting the slice. To ensure your slice is presented correctly you should consider the different modes SliceView supports:

Specifying actions

In addition to rows of content, ListBuilder can also have SliceActions added to it. These actions may appear differently on your slice depending on how androidx.slice.widget.SliceView is configured. Normally the actions appear as icons in the header of the slice.

How much content to add

There is no limit to the number of rows added to ListBuilder, however, the contents of a slice should be related to a primary task, action, or set of information. For example: it might make sense for a slice to manage wi-fi state to have a row for each available network, this might result in a large number of rows but each of these rows serve utility for the primary purpose of the slice which is managing wi-fi.

Note that scrolling on SliceView can be disabled, in which case only the header and one or two rows of content may be shown for your slice. If your slice contains many rows of content to scroll through (e.g. list of wifi networks), consider using setSeeMoreAction(PendingIntent) to provide a link to open the activity associated with the content.

Summary

Nested classes

open

Builder to construct a header row.

open

Builder to construct a input range row.

open

Builder to construct a range row which can be added to a ListBuilder.

open

Builder to construct a row.

Constants

static Int

Indicates that an image should be presented as an icon and it can be tinted.

static Long

Constant representing infinity.

static Int

Indicates that an image presented in a larger size and it shouldn't be tinted.

static Int

Indicates that an image should be presented in a smaller size and it shouldn't be tinted.

static Int

Indicates that an image mode is unknown.

Public constructors

<init>(@NonNull context: Context, @NonNull uri: Uri, ttl: Long)

Create a ListBuilder for constructing slice content.

<init>(@NonNull context: Context, @NonNull uri: Uri, @Nullable ttl: Duration?)

Create a ListBuilder for constructing slice content.

Public methods

open ListBuilder
addAction(@NonNull action: SliceAction)

Adds an action to this list builder.

open ListBuilder
addGridRow(@NonNull builder: GridRowBuilder)

Add a grid row to the list builder.

open ListBuilder

Add an input range row to the list builder.

open ListBuilder
addRange(@NonNull rangeBuilder: ListBuilder.RangeBuilder)

Add a range row to the list builder.

open ListBuilder
addRow(@NonNull builder: ListBuilder.RowBuilder)

Add a row to the list builder.

open ListBuilder
addSelection(@NonNull selectionBuilder: SelectionBuilder)

Add a selection row to the list builder.

open Slice

Construct the slice defined by this ListBuilder.

open ListBuilder

Sets the color to use on tintable items within the list builder.

open ListBuilder

Sets a header for this list builder.

open ListBuilder
setIsError(isError: Boolean)

Sets whether this slice indicates an error, i.

open ListBuilder

Sets keywords to associate with this slice.

open ListBuilder
setLayoutDirection(layoutDirection: Int)

Sets the desired layout direction for this slice.

open ListBuilder
setSeeMoreAction(@NonNull intent: PendingIntent)

If all content in a slice cannot be shown, a "see more" affordance may be displayed where the content is cut off.

open ListBuilder
setSeeMoreAction(@NonNull callback: RemoteCallback)

If all content in a slice cannot be shown, a "see more" affordance may be displayed where the content is cut off.

open ListBuilder

If all content in a slice cannot be shown, the row added here may be displayed where the content is cut off.

Constants

ICON_IMAGE

static val ICON_IMAGE: Int

Indicates that an image should be presented as an icon and it can be tinted.

Value: SliceHints.ICON_IMAGE

INFINITY

static val INFINITY: Long

Constant representing infinity.

Value: SliceHints.INFINITY

LARGE_IMAGE

static val LARGE_IMAGE: Int

Indicates that an image presented in a larger size and it shouldn't be tinted.

Value: SliceHints.LARGE_IMAGE

SMALL_IMAGE

static val SMALL_IMAGE: Int

Indicates that an image should be presented in a smaller size and it shouldn't be tinted.

Value: SliceHints.SMALL_IMAGE

UNKNOWN_IMAGE

static val UNKNOWN_IMAGE: Int

Indicates that an image mode is unknown.

Value: SliceHints.UNKNOWN_IMAGE

Public constructors

<init>

ListBuilder(@NonNull context: Context, @NonNull uri: Uri, ttl: Long)

Create a ListBuilder for constructing slice content.

A slice requires an associated time-to-live, i.e. how long the data contained in the slice can remain fresh. If your slice has content that is not time sensitive, set a TTL of INFINITY.

Parameters
uri Context: Uri to tag for this slice.
ttl Context: the length in milliseconds that the content in this slice can live for.

<init>

ListBuilder(@NonNull context: Context, @NonNull uri: Uri, @Nullable ttl: Duration?)

Create a ListBuilder for constructing slice content.

A slice requires an associated time-to-live, i.e. how long the data contained in the slice can remain fresh. If your slice has content that is not time sensitive, set Duration to null and the TTL will be INFINITY.

Parameters
uri Context: Uri to tag for this slice.
ttl Context: the Duration that the content in this slice can live for.

Public methods

addAction

@NonNull open fun addAction(@NonNull action: SliceAction): ListBuilder

Adds an action to this list builder.

Actions added with this method are grouped together on the list template and represented as tappable icons or images. These actions may appear differently on the slice depending on how the androidx.slice.widget.SliceView is configured. Generally these actions will be displayed in the order they were added, however, if not all actions can be displayed then actions with a higher priority may be shown first.

These actions are only displayed when the slice is displayed in androidx.slice.widget.SliceView#MODE_LARGE or androidx.slice.widget.SliceView#MODE_SMALL.

These actions differ from a slice's primary action. The primary action is the SliceAction set on the first row of the slice, normally from HeaderBuilder#setPrimaryAction(SliceAction).

addGridRow

@NonNull open fun addGridRow(@NonNull builder: GridRowBuilder): ListBuilder

Add a grid row to the list builder.

Note that grid rows cannot be the first row in your slice. Adding a grid row first without calling setHeader(HeaderBuilder) will result in IllegalStateException when the slice is built.

addInputRange

@NonNull open fun addInputRange(@NonNull b: ListBuilder.InputRangeBuilder): ListBuilder

Add an input range row to the list builder.

If InputRangeBuilder#setValue(int) is not between InputRangeBuilder#setMin(int) and InputRangeBuilder#setMax(int), this will throw IllegalArgumentException.

addRange

@NonNull open fun addRange(@NonNull rangeBuilder: ListBuilder.RangeBuilder): ListBuilder

Add a range row to the list builder.

If RangeBuilder#setValue(int) is not between 0 and RangeBuilder#setMax(int), this will throw IllegalArgumentException.

addRow

@NonNull open fun addRow(@NonNull builder: ListBuilder.RowBuilder): ListBuilder

Add a row to the list builder.

addSelection

@NonNull open fun addSelection(@NonNull selectionBuilder: SelectionBuilder): ListBuilder

Add a selection row to the list builder.

build

@NonNull open fun build(): Slice

Construct the slice defined by this ListBuilder.

Note that a ListBuilder requires a row containing a piece of text that is not created from a GridRowBuilder. If the first row added does not fulfill this requirement, build the slice will throw IllegalStateException.

Note that a ListBuilder requires a primary action, this can be set on any of the rows added to the list. If a primary action has not been set on any of the rows, building this slice will throw IllegalStateException.

setAccentColor

@NonNull open fun setAccentColor(color: Int): ListBuilder

Sets the color to use on tintable items within the list builder. Things that might be tinted are:

setHeader

@NonNull open fun setHeader(@NonNull builder: ListBuilder.HeaderBuilder): ListBuilder

Sets a header for this list builder. A list can have only one header. Setting a header allows some flexibility in what's displayed in your slice when SliceView displays in androidx.slice.widget.SliceView#MODE_SMALL and androidx.slice.widget.SliceView#MODE_SHORTCUT.

In MODE_SMALL, the header row shown if one has been added. The header will also display the HeaderBuilder#setSummary(CharSequence) text if it has been specified, allowing a summary of otherwise hidden content to be shown.

In MODE_SHORTCUT, the primary action set using HeaderBuilder#setPrimaryAction(SliceAction) will be used for the shortcut representation.

setIsError

@NonNull open fun setIsError(isError: Boolean): ListBuilder

Sets whether this slice indicates an error, i.e. the normal contents of this slice are unavailable and instead the slice contains a message indicating an error.

setKeywords

@NonNull open fun setKeywords(keywords: MutableSet<String!>!): ListBuilder

Sets keywords to associate with this slice.

setLayoutDirection

@NonNull open fun setLayoutDirection(layoutDirection: Int): ListBuilder

Sets the desired layout direction for this slice.

Parameters
layoutDirection Int: the layout direction to set.

setSeeMoreAction

@NonNull open fun setSeeMoreAction(@NonNull intent: PendingIntent): ListBuilder

If all content in a slice cannot be shown, a "see more" affordance may be displayed where the content is cut off. The action added here should take the user to an activity to see all of the content, and will be invoked when the "see more" affordance is tapped.

Only one see more affordance can be added, this throws IllegalStateException if a row or action has been previously added.

setSeeMoreAction

@NonNull open fun setSeeMoreAction(@NonNull callback: RemoteCallback): ListBuilder

If all content in a slice cannot be shown, a "see more" affordance may be displayed where the content is cut off. The action added here should take the user to an activity to see all of the content, and will be invoked when the "see more" affordance is tapped.

Only one see more affordance can be added, this throws IllegalStateException if a row or action has been previously added.

setSeeMoreRow

@NonNull open fun setSeeMoreRow(@NonNull builder: ListBuilder.RowBuilder): ListBuilder

If all content in a slice cannot be shown, the row added here may be displayed where the content is cut off. This row should have an affordance to take the user to an activity to see all of the content.

This method should only be used if you want to display a customized row to indicate more content, consider using setSeeMoreAction(PendingIntent) otherwise. If you do choose to specify a custom row, the row should have a content intent or action end item specified to take the user to an activity to see all of the content. The row added here will only appear when not all content can be displayed and it will not be styled any differently from row built by RowBuilder normally.

Only one see more affordance can be added, this throws IllegalStateException if a row or action has been previously added.