// Signature format: 4.0
package androidx.room {

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface AutoMigration {
    method public abstract int from();
    method public abstract Class<?> spec() default java.lang.Object.class;
    method public abstract int to();
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({}) public @interface BuiltInTypeConverters {
    method public abstract androidx.room.BuiltInTypeConverters.State enums() default androidx.room.BuiltInTypeConverters.State.INHERITED;
    method public abstract androidx.room.BuiltInTypeConverters.State uuid() default androidx.room.BuiltInTypeConverters.State.INHERITED;
  }

  public enum BuiltInTypeConverters.State {
    enum_constant public static final androidx.room.BuiltInTypeConverters.State DISABLED;
    enum_constant public static final androidx.room.BuiltInTypeConverters.State ENABLED;
    enum_constant public static final androidx.room.BuiltInTypeConverters.State INHERITED;
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface ColumnInfo {
    method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
    method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
    method public abstract boolean index() default false;
    method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
    method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
    field public static final int BINARY = 2; // 0x2
    field public static final int BLOB = 5; // 0x5
    field public static final String INHERIT_FIELD_NAME = "[field-name]";
    field public static final int INTEGER = 3; // 0x3
    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
    field public static final int NOCASE = 3; // 0x3
    field public static final int REAL = 4; // 0x4
    field public static final int RTRIM = 4; // 0x4
    field public static final int TEXT = 2; // 0x2
    field public static final int UNDEFINED = 1; // 0x1
    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
    field public static final int UNSPECIFIED = 1; // 0x1
    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
  }

  @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.Collate {
  }

  @IntDef({androidx.room.ColumnInfo.UNDEFINED, androidx.room.ColumnInfo.TEXT, androidx.room.ColumnInfo.INTEGER, androidx.room.ColumnInfo.REAL, androidx.room.ColumnInfo.BLOB}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.SQLiteTypeAffinity {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Dao {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Database {
    method public abstract androidx.room.AutoMigration[] autoMigrations() default {};
    method public abstract Class<?>[] entities();
    method public abstract boolean exportSchema() default true;
    method public abstract int version();
    method public abstract Class<?>[] views() default {};
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface DatabaseView {
    method public abstract String value() default "";
    method public abstract String viewName() default "";
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface Delete {
    method public abstract Class<?> entity() default java.lang.Object.class;
  }

  @java.lang.annotation.Repeatable(DeleteColumn.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface DeleteColumn {
    method public abstract String columnName();
    method public abstract String tableName();
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface DeleteColumn.Entries {
    method public abstract androidx.room.DeleteColumn[] value();
  }

  @java.lang.annotation.Repeatable(DeleteTable.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface DeleteTable {
    method public abstract String tableName();
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface DeleteTable.Entries {
    method public abstract androidx.room.DeleteTable[] value();
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface Embedded {
    method public abstract String prefix() default "";
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Entity {
    method public abstract androidx.room.ForeignKey[] foreignKeys() default {};
    method public abstract String[] ignoredColumns() default {};
    method public abstract androidx.room.Index[] indices() default {};
    method public abstract boolean inheritSuperIndices() default false;
    method public abstract String[] primaryKeys() default {};
    method public abstract String tableName() default "";
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({}) public @interface ForeignKey {
    method public abstract String[] childColumns();
    method public abstract boolean deferred() default false;
    method public abstract Class<?> entity();
    method @androidx.room.ForeignKey.Action public abstract int onDelete() default androidx.room.ForeignKey.NO_ACTION;
    method @androidx.room.ForeignKey.Action public abstract int onUpdate() default androidx.room.ForeignKey.NO_ACTION;
    method public abstract String[] parentColumns();
    field public static final int CASCADE = 5; // 0x5
    field public static final int NO_ACTION = 1; // 0x1
    field public static final int RESTRICT = 2; // 0x2
    field public static final int SET_DEFAULT = 4; // 0x4
    field public static final int SET_NULL = 3; // 0x3
  }

  @IntDef({androidx.room.ForeignKey.NO_ACTION, androidx.room.ForeignKey.RESTRICT, androidx.room.ForeignKey.SET_NULL, androidx.room.ForeignKey.SET_DEFAULT, androidx.room.ForeignKey.CASCADE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ForeignKey.Action {
  }

  @RequiresApi(16) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Fts3 {
    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
    method public abstract String[] tokenizerArgs() default {};
  }

  @RequiresApi(16) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Fts4 {
    method public abstract Class<?> contentEntity() default java.lang.Object.class;
    method public abstract String languageId() default "";
    method public abstract androidx.room.FtsOptions.MatchInfo matchInfo() default androidx.room.FtsOptions.MatchInfo.FTS4;
    method public abstract String[] notIndexed() default {};
    method public abstract androidx.room.FtsOptions.Order order() default androidx.room.FtsOptions.Order.ASC;
    method public abstract int[] prefix() default {};
    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
    method public abstract String[] tokenizerArgs() default {};
  }

  public class FtsOptions {
    field public static final String TOKENIZER_ICU = "icu";
    field public static final String TOKENIZER_PORTER = "porter";
    field public static final String TOKENIZER_SIMPLE = "simple";
    field @RequiresApi(21) public static final String TOKENIZER_UNICODE61 = "unicode61";
  }

  public enum FtsOptions.MatchInfo {
    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS3;
    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS4;
  }

  public enum FtsOptions.Order {
    enum_constant public static final androidx.room.FtsOptions.Order ASC;
    enum_constant public static final androidx.room.FtsOptions.Order DESC;
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface Ignore {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({}) public @interface Index {
    method public abstract String name() default "";
    method public abstract androidx.room.Index.Order[] orders() default {};
    method public abstract boolean unique() default false;
    method public abstract String[] value();
  }

  public enum Index.Order {
    enum_constant public static final androidx.room.Index.Order ASC;
    enum_constant public static final androidx.room.Index.Order DESC;
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface Insert {
    method public abstract Class<?> entity() default java.lang.Object.class;
    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({}) public @interface Junction {
    method public abstract String entityColumn() default "";
    method public abstract String parentColumn() default "";
    method public abstract Class<?> value();
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface MapInfo {
    method public abstract String keyColumn() default "";
    method public abstract String valueColumn() default "";
  }

  @IntDef({androidx.room.OnConflictStrategy.REPLACE, androidx.room.OnConflictStrategy.ROLLBACK, androidx.room.OnConflictStrategy.ABORT, androidx.room.OnConflictStrategy.FAIL, androidx.room.OnConflictStrategy.IGNORE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface OnConflictStrategy {
    field public static final int ABORT = 3; // 0x3
    field @Deprecated public static final int FAIL = 4; // 0x4
    field public static final int IGNORE = 5; // 0x5
    field public static final int REPLACE = 1; // 0x1
    field @Deprecated public static final int ROLLBACK = 2; // 0x2
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface PrimaryKey {
    method public abstract boolean autoGenerate() default false;
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface ProvidedAutoMigrationSpec {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface ProvidedTypeConverter {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface Query {
    method public abstract String value();
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface RawQuery {
    method public abstract Class<?>[] observedEntities() default {};
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface Relation {
    method public abstract androidx.room.Junction associateBy() default @androidx.room.Junction;
    method public abstract Class<?> entity() default java.lang.Object.class;
    method public abstract String entityColumn();
    method public abstract String parentColumn();
    method public abstract String[] projection() default {};
  }

  @java.lang.annotation.Repeatable(RenameColumn.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface RenameColumn {
    method public abstract String fromColumnName();
    method public abstract String tableName();
    method public abstract String toColumnName();
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface RenameColumn.Entries {
    method public abstract androidx.room.RenameColumn[] value();
  }

  @java.lang.annotation.Repeatable(RenameTable.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface RenameTable {
    method public abstract String fromTableName();
    method public abstract String toTableName();
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface RenameTable.Entries {
    method public abstract androidx.room.RenameTable[] value();
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface RewriteQueriesToDropUnusedColumns {
  }

  public class RoomWarnings {
    ctor @Deprecated public RoomWarnings();
    field public static final String CANNOT_CREATE_VERIFICATION_DATABASE = "ROOM_CANNOT_CREATE_VERIFICATION_DATABASE";
    field public static final String CURSOR_MISMATCH = "ROOM_CURSOR_MISMATCH";
    field public static final String DEFAULT_CONSTRUCTOR = "ROOM_DEFAULT_CONSTRUCTOR";
    field public static final String DOES_NOT_IMPLEMENT_EQUALS_HASHCODE = "ROOM_TYPE_DOES_NOT_IMPLEMENT_EQUALS_HASHCODE";
    field public static final String INDEX_FROM_EMBEDDED_ENTITY_IS_DROPPED = "ROOM_EMBEDDED_ENTITY_INDEX_IS_DROPPED";
    field public static final String INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED = "ROOM_EMBEDDED_INDEX_IS_DROPPED";
    field public static final String INDEX_FROM_PARENT_FIELD_IS_DROPPED = "ROOM_PARENT_FIELD_INDEX_IS_DROPPED";
    field public static final String INDEX_FROM_PARENT_IS_DROPPED = "ROOM_PARENT_INDEX_IS_DROPPED";
    field public static final String MISMATCHED_GETTER = "ROOM_MISMATCHED_GETTER_TYPE";
    field public static final String MISMATCHED_SETTER = "ROOM_MISMATCHED_SETTER_TYPE";
    field public static final String MISSING_INDEX_ON_FOREIGN_KEY_CHILD = "ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX";
    field public static final String MISSING_INDEX_ON_JUNCTION = "MISSING_INDEX_ON_JUNCTION";
    field public static final String MISSING_JAVA_TMP_DIR = "ROOM_MISSING_JAVA_TMP_DIR";
    field public static final String MISSING_SCHEMA_LOCATION = "ROOM_MISSING_SCHEMA_LOCATION";
    field public static final String PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED = "ROOM_EMBEDDED_PRIMARY_KEY_IS_DROPPED";
    field public static final String RELATION_QUERY_WITHOUT_TRANSACTION = "ROOM_RELATION_QUERY_WITHOUT_TRANSACTION";
    field public static final String RELATION_TYPE_MISMATCH = "ROOM_RELATION_TYPE_MISMATCH";
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface SkipQueryVerification {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface Transaction {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface TypeConverter {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public @interface TypeConverters {
    method public abstract androidx.room.BuiltInTypeConverters builtInTypeConverters() default @androidx.room.BuiltInTypeConverters;
    method public abstract Class<?>[] value() default {};
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Update {
    method public abstract Class<?> entity() default java.lang.Object.class;
    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
  }

}

