InlineSuggestionUi


@RequiresApi(api = Build.VERSION_CODES.R)
class InlineSuggestionUi


The entry point for building the content or style for the V1 inline suggestion UI.

The V1 UI composes of four widgets, put in order in a horizontal linear layout: start icon, title, subtitle, and end icon. Some of the widgets are optional, or conditionally optional based on existence of other widgets. See build for the conditions.

A default theme will be applied on the UI. The client can use Style to customize the style for individual widgets as well as the overall UI background.

For Autofill provider developer, to build a content Slice that can be used as input to the android.service.autofill.InlinePresentation, you may use the InlineSuggestionUi.Content.Builder. For example:

  public Slice createSlice(
      InlinePresentationSpec imeSpec,
      CharSequence title,
      CharSequence subtitle,
      Icon startIcon,
      Icon endIcon,
      CharSequence contentDescription,
      PendingIntent attribution) {
    // Make sure that the IME spec claims support for v1 UI template.
    Bundle imeStyle = imeSpec.getStyle();
    if (!UiVersions.getVersions(imeStyle).contains(UiVersions.INLINE_UI_VERSION_1)) {
      return null;
    }

    // Build the content for the v1 UI.
    Content.Builder builder =
        InlineSuggestionUi.newContentBuilder(attribution)
          .setContentDescription(contentDescription);
    if(!TextUtils.isEmpty(title)) {
      builder.setTitle(title);
    }
    if (!TextUtils.isEmpty(subtitle)) {
      builder.setSubtitle(subtitle);
    }
    if (startIcon != null) {
      startIcon.setTintBlendMode(BlendMode.DST)
      builder.setStartIcon(startIcon);
    }
    if (endIcon != null) {
      builder.setEndIcon(endIcon);
    }
    return builder.build().getSlice();
  }

For IME developer, to build a styles Bundle that can be used as input to the android.widget.inline.InlinePresentationSpec, you may use the UiVersions.StylesBuilder. For example:

  public Bundle createBundle(Bundle uiExtras) {
    // We have styles builder, because it's possible that the IME can support multiple UI
    // templates in the future.
    StylesBuilder stylesBuilder = UiVersions.newStylesBuilder();

    // Assuming we only want to support v1 UI template. If the provided uiExtras doesn't contain
    // v1, then return null.
    if (!UiVersions.getVersions(uiExtras).contains(UiVersions.INLINE_UI_VERSION_1)) {
      return null;
    }

    // Create the style for v1 template.
    Style style = InlineSuggestionUi.newStyleBuilder()
        .setSingleIconChipStyle(
            new ViewStyle.Builder()
                .setBackgroundColor(Color.TRANSPARENT)
                .setPadding(0, 0, 0, 0)
                .setLayoutMargin(0, 0, 0, 0)
                .build())
        .setSingleIconChipIconStyle(
            new ImageViewStyle.Builder()
                .setMaxWidth(actionIconSize)
                .setMaxHeight(actionIconSize)
                .setScaleType(ScaleType.FIT_CENTER)
                .setLayoutMargin(0, 0, pinnedActionMarginEnd, 0)
                .setTintList(actionIconColor)
                .build())
        .setChipStyle(
            new ViewStyle.Builder()
                .setBackground(
                    Icon.createWithResource(this, R.drawable.chip_background))
                .setPadding(toPixel(13), 0, toPixel(13), 0)
                .build())
        .setStartIconStyle(
            new ImageViewStyle.Builder()
                .setLayoutMargin(0, 0, 0, 0)
                .setTintList(chipIconColor)
                .build())
        .setTitleStyle(
            new TextViewStyle.Builder()
                .setLayoutMargin(toPixel(4), 0, toPixel(4), 0)
                .setTextColor(Color.parseColor("#FF202124"))
                .setTextSize(16)
                .build())
        .setSubtitleStyle(
            new TextViewStyle.Builder()
                .setLayoutMargin(0, 0, toPixel(4), 0)
                .setTextColor(Color.parseColor("#99202124")) // 60% opacity
                .setTextSize(14)
                .build())
        .setEndIconStyle(
            new ImageViewStyle.Builder()
                .setLayoutMargin(0, 0, 0, 0)
                .setTintList(chipIconColor)
                .build())
        .build();

    // Add v1 UI style to the supported styles and return.
    stylesBuilder.addStyle(style);
    Bundle stylesBundle = stylesBuilder.build();
    return stylesBundle;
  }

Alternatively, if the IME wants to use the default style, then:

  public Bundle createBundle(Bundle uiExtras) {
    if (!UiVersions.getVersions(uiExtras).contains(UiVersions.INLINE_UI_VERSION_1)) {
      return null;
    }
    StylesBuilder stylesBuilder = UiVersions.newStylesBuilder();
    stylesBuilder.addStyle(InlineSuggestionUi.newStyleBuilder().build());
    return stylesBuilder.build();
  }

Summary

Nested types

Content for the V1 inline suggestion UI.

Builder for the Content.

Style for the V1 inline suggestion UI.

Builder for the Style.

Public functions

java-static InlineSuggestionUi.Content.Builder
newContentBuilder(attributionIntent: PendingIntent)

Returns a builder to build the content for V1 inline suggestion UI.

java-static InlineSuggestionUi.Style.Builder

Returns a builder to build the style for V1 inline suggestion UI.

Public functions

newContentBuilder

Added in 1.1.0
java-static fun newContentBuilder(attributionIntent: PendingIntent): InlineSuggestionUi.Content.Builder

Returns a builder to build the content for V1 inline suggestion UI.

Important Note: The AutofillService is responsible for keeping track of the PendingIntent attribution intents it has used and cleaning them up properly with cancel, or reusing them for the next set of suggestions. Intents are safe to cleanup on receiving a new onFillRequest call.

Parameters
attributionIntent: PendingIntent

invoked when the UI is long-pressed.

newStyleBuilder

Added in 1.1.0
java-static fun newStyleBuilder(): InlineSuggestionUi.Style.Builder

Returns a builder to build the style for V1 inline suggestion UI.