package androidx.app.slice.builders {

  public class GridBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
    ctor public GridBuilder(android.net.Uri);
    ctor public GridBuilder(androidx.app.slice.builders.TemplateSliceBuilder);
    method public androidx.app.slice.builders.GridBuilder addCell(androidx.app.slice.builders.GridBuilder.CellBuilder);
    method public androidx.app.slice.builders.GridBuilder addCell(java.util.function.Consumer<androidx.app.slice.builders.GridBuilder.CellBuilder>);
  }

  public static final class GridBuilder.CellBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
    ctor public GridBuilder.CellBuilder(androidx.app.slice.builders.GridBuilder);
    ctor public GridBuilder.CellBuilder(android.net.Uri);
    method public androidx.app.slice.builders.GridBuilder.CellBuilder addImage(android.graphics.drawable.Icon);
    method public androidx.app.slice.builders.GridBuilder.CellBuilder addLargeImage(android.graphics.drawable.Icon);
    method public androidx.app.slice.builders.GridBuilder.CellBuilder addText(java.lang.CharSequence);
    method public androidx.app.slice.builders.GridBuilder.CellBuilder addTitleText(java.lang.CharSequence);
    method public androidx.app.slice.builders.GridBuilder.CellBuilder setContentIntent(android.app.PendingIntent);
  }

  public class ListBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
    ctor public ListBuilder(android.net.Uri);
    method public androidx.app.slice.builders.ListBuilder addGrid(androidx.app.slice.builders.GridBuilder);
    method public androidx.app.slice.builders.ListBuilder addGrid(java.util.function.Consumer<androidx.app.slice.builders.GridBuilder>);
    method public androidx.app.slice.builders.ListBuilder addRow(androidx.app.slice.builders.ListBuilder.RowBuilder);
    method public androidx.app.slice.builders.ListBuilder addRow(java.util.function.Consumer<androidx.app.slice.builders.ListBuilder.RowBuilder>);
    method public androidx.app.slice.builders.ListBuilder addSummaryRow(androidx.app.slice.builders.ListBuilder.RowBuilder);
    method public androidx.app.slice.builders.ListBuilder addSummaryRow(java.util.function.Consumer<androidx.app.slice.builders.ListBuilder.RowBuilder>);
  }

  public static class ListBuilder.RowBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
    ctor public ListBuilder.RowBuilder(androidx.app.slice.builders.ListBuilder);
    ctor public ListBuilder.RowBuilder(android.net.Uri);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder addEndItem(long);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder addEndItem(android.graphics.drawable.Icon);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder addEndItem(android.graphics.drawable.Icon, android.app.PendingIntent);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder addToggle(android.app.PendingIntent, boolean);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder addToggle(android.app.PendingIntent, boolean, android.graphics.drawable.Icon);
    method public void apply(androidx.app.slice.Slice.Builder);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder setContentIntent(android.app.PendingIntent);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder setIsHeader(boolean);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder setSubtitle(java.lang.CharSequence);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitle(java.lang.CharSequence);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitleItem(long);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitleItem(android.graphics.drawable.Icon);
    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitleItem(android.graphics.drawable.Icon, android.app.PendingIntent);
  }

  public abstract class TemplateSliceBuilder {
    ctor public TemplateSliceBuilder(android.net.Uri);
    method public androidx.app.slice.Slice build();
  }

}

