// Signature format: 3.0
package androidx.slice.builders {

  @RequiresApi(19) public class GridRowBuilder {
    ctor public GridRowBuilder();
    method public androidx.slice.builders.GridRowBuilder addCell(androidx.slice.builders.GridRowBuilder.CellBuilder);
    method public androidx.slice.builders.GridRowBuilder setContentDescription(CharSequence);
    method public androidx.slice.builders.GridRowBuilder setLayoutDirection(int);
    method public androidx.slice.builders.GridRowBuilder setPrimaryAction(androidx.slice.builders.SliceAction);
    method public androidx.slice.builders.GridRowBuilder setSeeMoreAction(android.app.PendingIntent);
    method public androidx.slice.builders.GridRowBuilder setSeeMoreAction(androidx.remotecallback.RemoteCallback);
    method public androidx.slice.builders.GridRowBuilder setSeeMoreCell(androidx.slice.builders.GridRowBuilder.CellBuilder);
  }

  public static class GridRowBuilder.CellBuilder {
    ctor public GridRowBuilder.CellBuilder();
    method public androidx.slice.builders.GridRowBuilder.CellBuilder addImage(androidx.core.graphics.drawable.IconCompat, int);
    method public androidx.slice.builders.GridRowBuilder.CellBuilder addImage(androidx.core.graphics.drawable.IconCompat?, int, boolean);
    method public androidx.slice.builders.GridRowBuilder.CellBuilder addText(CharSequence);
    method public androidx.slice.builders.GridRowBuilder.CellBuilder addText(CharSequence?, boolean);
    method public androidx.slice.builders.GridRowBuilder.CellBuilder addTitleText(CharSequence);
    method public androidx.slice.builders.GridRowBuilder.CellBuilder addTitleText(CharSequence?, boolean);
    method public androidx.slice.builders.GridRowBuilder.CellBuilder setContentDescription(CharSequence);
    method public androidx.slice.builders.GridRowBuilder.CellBuilder setContentIntent(android.app.PendingIntent);
    method public androidx.slice.builders.GridRowBuilder.CellBuilder setContentIntent(androidx.remotecallback.RemoteCallback);
  }

  @RequiresApi(19) public class ListBuilder extends androidx.slice.builders.TemplateSliceBuilder {
    ctor public ListBuilder(android.content.Context, android.net.Uri, long);
    ctor @RequiresApi(26) public ListBuilder(android.content.Context, android.net.Uri, java.time.Duration?);
    method public androidx.slice.builders.ListBuilder addAction(androidx.slice.builders.SliceAction);
    method public androidx.slice.builders.ListBuilder addGridRow(androidx.slice.builders.GridRowBuilder);
    method public androidx.slice.builders.ListBuilder addInputRange(androidx.slice.builders.ListBuilder.InputRangeBuilder);
    method public androidx.slice.builders.ListBuilder addRange(androidx.slice.builders.ListBuilder.RangeBuilder);
    method public androidx.slice.builders.ListBuilder addRow(androidx.slice.builders.ListBuilder.RowBuilder);
    method public androidx.slice.builders.ListBuilder addSelection(androidx.slice.builders.SelectionBuilder);
    method public androidx.slice.builders.ListBuilder setAccentColor(@ColorInt int);
    method public androidx.slice.builders.ListBuilder setHeader(androidx.slice.builders.ListBuilder.HeaderBuilder);
    method public androidx.slice.builders.ListBuilder setIsError(boolean);
    method public androidx.slice.builders.ListBuilder setKeywords(java.util.Set<java.lang.String!>!);
    method public androidx.slice.builders.ListBuilder setLayoutDirection(int);
    method public androidx.slice.builders.ListBuilder setSeeMoreAction(android.app.PendingIntent);
    method public androidx.slice.builders.ListBuilder setSeeMoreAction(androidx.remotecallback.RemoteCallback);
    method public androidx.slice.builders.ListBuilder setSeeMoreRow(androidx.slice.builders.ListBuilder.RowBuilder);
    field public static final int ICON_IMAGE = 0; // 0x0
    field public static final long INFINITY = -1L; // 0xffffffffffffffffL
    field public static final int LARGE_IMAGE = 2; // 0x2
    field public static final int SMALL_IMAGE = 1; // 0x1
    field public static final int UNKNOWN_IMAGE = 3; // 0x3
  }

  public static class ListBuilder.HeaderBuilder {
    ctor public ListBuilder.HeaderBuilder();
    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ListBuilder.HeaderBuilder(android.net.Uri!);
    method public androidx.slice.builders.ListBuilder.HeaderBuilder setContentDescription(CharSequence);
    method public androidx.slice.builders.ListBuilder.HeaderBuilder setLayoutDirection(int);
    method public androidx.slice.builders.ListBuilder.HeaderBuilder setPrimaryAction(androidx.slice.builders.SliceAction);
    method public androidx.slice.builders.ListBuilder.HeaderBuilder setSubtitle(CharSequence);
    method public androidx.slice.builders.ListBuilder.HeaderBuilder setSubtitle(CharSequence, boolean);
    method public androidx.slice.builders.ListBuilder.HeaderBuilder setSummary(CharSequence);
    method public androidx.slice.builders.ListBuilder.HeaderBuilder setSummary(CharSequence, boolean);
    method public androidx.slice.builders.ListBuilder.HeaderBuilder setTitle(CharSequence);
    method public androidx.slice.builders.ListBuilder.HeaderBuilder setTitle(CharSequence, boolean);
  }

  public static class ListBuilder.InputRangeBuilder {
    ctor public ListBuilder.InputRangeBuilder();
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setContentDescription(CharSequence);
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setInputAction(android.app.PendingIntent);
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setInputAction(androidx.remotecallback.RemoteCallback);
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setLayoutDirection(int);
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setMax(int);
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setMin(int);
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setPrimaryAction(androidx.slice.builders.SliceAction);
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setSubtitle(CharSequence);
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setThumb(androidx.core.graphics.drawable.IconCompat);
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setTitle(CharSequence);
    method public androidx.slice.builders.ListBuilder.InputRangeBuilder setValue(int);
  }

  public static class ListBuilder.RangeBuilder {
    ctor public ListBuilder.RangeBuilder();
    method public androidx.slice.builders.ListBuilder.RangeBuilder setContentDescription(CharSequence);
    method public androidx.slice.builders.ListBuilder.RangeBuilder setLayoutDirection(int);
    method public androidx.slice.builders.ListBuilder.RangeBuilder setMax(int);
    method public androidx.slice.builders.ListBuilder.RangeBuilder setPrimaryAction(androidx.slice.builders.SliceAction);
    method public androidx.slice.builders.ListBuilder.RangeBuilder setSubtitle(CharSequence);
    method public androidx.slice.builders.ListBuilder.RangeBuilder setTitle(CharSequence);
    method public androidx.slice.builders.ListBuilder.RangeBuilder setValue(int);
  }

  public static class ListBuilder.RowBuilder {
    ctor public ListBuilder.RowBuilder();
    ctor public ListBuilder.RowBuilder(android.net.Uri!);
    method public androidx.slice.builders.ListBuilder.RowBuilder addEndItem(long);
    method public androidx.slice.builders.ListBuilder.RowBuilder addEndItem(androidx.core.graphics.drawable.IconCompat, int);
    method public androidx.slice.builders.ListBuilder.RowBuilder addEndItem(androidx.core.graphics.drawable.IconCompat?, int, boolean);
    method public androidx.slice.builders.ListBuilder.RowBuilder addEndItem(androidx.slice.builders.SliceAction);
    method public androidx.slice.builders.ListBuilder.RowBuilder addEndItem(androidx.slice.builders.SliceAction, boolean);
    method public androidx.slice.builders.ListBuilder.RowBuilder setContentDescription(CharSequence);
    method public androidx.slice.builders.ListBuilder.RowBuilder setLayoutDirection(int);
    method public androidx.slice.builders.ListBuilder.RowBuilder setPrimaryAction(androidx.slice.builders.SliceAction);
    method public androidx.slice.builders.ListBuilder.RowBuilder setSubtitle(CharSequence);
    method public androidx.slice.builders.ListBuilder.RowBuilder setSubtitle(CharSequence?, boolean);
    method public androidx.slice.builders.ListBuilder.RowBuilder setTitle(CharSequence);
    method public androidx.slice.builders.ListBuilder.RowBuilder setTitle(CharSequence?, boolean);
    method public androidx.slice.builders.ListBuilder.RowBuilder setTitleItem(long);
    method public androidx.slice.builders.ListBuilder.RowBuilder! setTitleItem(androidx.core.graphics.drawable.IconCompat, int);
    method public androidx.slice.builders.ListBuilder.RowBuilder setTitleItem(androidx.core.graphics.drawable.IconCompat?, int, boolean);
    method public androidx.slice.builders.ListBuilder.RowBuilder setTitleItem(androidx.slice.builders.SliceAction);
    method public androidx.slice.builders.ListBuilder.RowBuilder setTitleItem(androidx.slice.builders.SliceAction, boolean);
  }

  @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MessagingSliceBuilder extends androidx.slice.builders.TemplateSliceBuilder {
    ctor public MessagingSliceBuilder(android.content.Context, android.net.Uri);
    method public androidx.slice.builders.MessagingSliceBuilder! add(androidx.slice.builders.MessagingSliceBuilder.MessageBuilder!);
    method public androidx.slice.builders.MessagingSliceBuilder! add(androidx.core.util.Consumer<androidx.slice.builders.MessagingSliceBuilder.MessageBuilder!>!);
    field public static final int MAXIMUM_RETAINED_MESSAGES = 50; // 0x32
  }

  public static final class MessagingSliceBuilder.MessageBuilder extends androidx.slice.builders.TemplateSliceBuilder {
    ctor public MessagingSliceBuilder.MessageBuilder(androidx.slice.builders.MessagingSliceBuilder!);
    method @RequiresApi(23) public androidx.slice.builders.MessagingSliceBuilder.MessageBuilder! addSource(android.graphics.drawable.Icon!);
    method public androidx.slice.builders.MessagingSliceBuilder.MessageBuilder! addSource(androidx.core.graphics.drawable.IconCompat!);
    method public androidx.slice.builders.MessagingSliceBuilder.MessageBuilder! addText(CharSequence!);
    method public androidx.slice.builders.MessagingSliceBuilder.MessageBuilder! addTimestamp(long);
  }

  @RequiresApi(19) public class SelectionBuilder {
    ctor public SelectionBuilder();
    method public androidx.slice.builders.SelectionBuilder! addOption(String!, CharSequence!);
    method public androidx.slice.builders.SelectionBuilder! setContentDescription(CharSequence?);
    method public androidx.slice.builders.SelectionBuilder! setInputAction(android.app.PendingIntent);
    method public androidx.slice.builders.SelectionBuilder! setInputAction(androidx.remotecallback.RemoteCallback);
    method public androidx.slice.builders.SelectionBuilder! setLayoutDirection(int);
    method public androidx.slice.builders.SelectionBuilder! setPrimaryAction(androidx.slice.builders.SliceAction);
    method public androidx.slice.builders.SelectionBuilder! setSelectedOption(String!);
    method public androidx.slice.builders.SelectionBuilder! setSubtitle(CharSequence?);
    method public androidx.slice.builders.SelectionBuilder! setTitle(CharSequence?);
  }

  @RequiresApi(19) public class SliceAction implements androidx.slice.core.SliceAction {
    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public SliceAction(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat, int, CharSequence);
    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public SliceAction(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat, CharSequence, boolean);
    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public SliceAction(android.app.PendingIntent, CharSequence, boolean);
    method public static androidx.slice.builders.SliceAction! create(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat, int, CharSequence);
    method public static androidx.slice.builders.SliceAction! create(androidx.remotecallback.RemoteCallback, androidx.core.graphics.drawable.IconCompat, int, CharSequence);
    method public static androidx.slice.builders.SliceAction! createDeeplink(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat, int, CharSequence);
    method public static androidx.slice.builders.SliceAction! createDeeplink(androidx.remotecallback.RemoteCallback, androidx.core.graphics.drawable.IconCompat, int, CharSequence);
    method public static androidx.slice.builders.SliceAction! createToggle(android.app.PendingIntent, CharSequence, boolean);
    method public static androidx.slice.builders.SliceAction! createToggle(androidx.remotecallback.RemoteCallback, CharSequence, boolean);
    method public static androidx.slice.builders.SliceAction! createToggle(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat, CharSequence, boolean);
    method public static androidx.slice.builders.SliceAction! createToggle(androidx.remotecallback.RemoteCallback, androidx.core.graphics.drawable.IconCompat, CharSequence, boolean);
    method public android.app.PendingIntent getAction();
    method public CharSequence? getContentDescription();
    method public androidx.core.graphics.drawable.IconCompat? getIcon();
    method public int getImageMode();
    method public int getPriority();
    method public CharSequence getTitle();
    method public boolean isActivity();
    method public boolean isChecked();
    method public boolean isDefaultToggle();
    method public boolean isToggle();
    method public androidx.slice.builders.SliceAction setChecked(boolean);
    method public androidx.slice.builders.SliceAction setContentDescription(CharSequence);
    method public androidx.slice.builders.SliceAction setPriority(@IntRange(from=0) int);
  }

  @RequiresApi(19) public abstract class TemplateSliceBuilder {
    method public androidx.slice.Slice build();
  }

}

