// Signature format: 3.0
package androidx.room {

  public class DatabaseConfiguration {
    method public boolean isMigrationRequired(int, int);
    method @Deprecated public boolean isMigrationRequiredFrom(int);
    field public final boolean allowDestructiveMigrationOnDowngrade;
    field public final boolean allowMainThreadQueries;
    field public final java.util.List<androidx.room.RoomDatabase.Callback!>? callbacks;
    field public final android.content.Context context;
    field public final String? copyFromAssetPath;
    field public final java.io.File? copyFromFile;
    field public final androidx.room.RoomDatabase.JournalMode! journalMode;
    field public final androidx.room.RoomDatabase.MigrationContainer migrationContainer;
    field public final boolean multiInstanceInvalidation;
    field public final String? name;
    field public final java.util.concurrent.Executor queryExecutor;
    field public final boolean requireMigration;
    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory;
    field public final java.util.concurrent.Executor transactionExecutor;
  }

  public class InvalidationTracker {
    method @WorkerThread public void addObserver(androidx.room.InvalidationTracker.Observer);
    method public void refreshVersionsAsync();
    method @WorkerThread public void removeObserver(androidx.room.InvalidationTracker.Observer);
  }

  public abstract static class InvalidationTracker.Observer {
    ctor protected InvalidationTracker.Observer(String, java.lang.String!...);
    ctor public InvalidationTracker.Observer(String![]);
    method public abstract void onInvalidated(java.util.Set<java.lang.String!>);
  }

  public class Room {
    ctor @Deprecated public Room();
    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T!> databaseBuilder(android.content.Context, Class<T!>, String);
    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T!> inMemoryDatabaseBuilder(android.content.Context, Class<T!>);
    field public static final String MASTER_TABLE_NAME = "room_master_table";
  }

  public abstract class RoomDatabase {
    ctor public RoomDatabase();
    method @Deprecated public void beginTransaction();
    method @WorkerThread public abstract void clearAllTables();
    method public void close();
    method public androidx.sqlite.db.SupportSQLiteStatement! compileStatement(String);
    method protected abstract androidx.room.InvalidationTracker createInvalidationTracker();
    method protected abstract androidx.sqlite.db.SupportSQLiteOpenHelper createOpenHelper(androidx.room.DatabaseConfiguration!);
    method @Deprecated public void endTransaction();
    method public androidx.room.InvalidationTracker getInvalidationTracker();
    method public androidx.sqlite.db.SupportSQLiteOpenHelper getOpenHelper();
    method public java.util.concurrent.Executor getQueryExecutor();
    method public java.util.concurrent.Executor getTransactionExecutor();
    method public boolean inTransaction();
    method @CallSuper public void init(androidx.room.DatabaseConfiguration);
    method protected void internalInitInvalidationTracker(androidx.sqlite.db.SupportSQLiteDatabase);
    method public boolean isOpen();
    method public android.database.Cursor! query(String!, Object![]?);
    method public android.database.Cursor! query(androidx.sqlite.db.SupportSQLiteQuery!);
    method public void runInTransaction(Runnable);
    method public <V> V! runInTransaction(java.util.concurrent.Callable<V!>);
    method @Deprecated public void setTransactionSuccessful();
    field @Deprecated protected java.util.List<androidx.room.RoomDatabase.Callback!>? mCallbacks;
    field @Deprecated protected volatile androidx.sqlite.db.SupportSQLiteDatabase! mDatabase;
  }

  public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
    method public androidx.room.RoomDatabase.Builder<T!> addCallback(androidx.room.RoomDatabase.Callback);
    method public androidx.room.RoomDatabase.Builder<T!> addMigrations(androidx.room.migration.Migration!...);
    method public androidx.room.RoomDatabase.Builder<T!> allowMainThreadQueries();
    method public T build();
    method public androidx.room.RoomDatabase.Builder<T!> createFromAsset(String);
    method public androidx.room.RoomDatabase.Builder<T!> createFromFile(java.io.File);
    method public androidx.room.RoomDatabase.Builder<T!> enableMultiInstanceInvalidation();
    method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigration();
    method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigrationFrom(int...);
    method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigrationOnDowngrade();
    method public androidx.room.RoomDatabase.Builder<T!> openHelperFactory(androidx.sqlite.db.SupportSQLiteOpenHelper.Factory?);
    method public androidx.room.RoomDatabase.Builder<T!> setJournalMode(androidx.room.RoomDatabase.JournalMode);
    method public androidx.room.RoomDatabase.Builder<T!> setQueryExecutor(java.util.concurrent.Executor);
    method public androidx.room.RoomDatabase.Builder<T!> setTransactionExecutor(java.util.concurrent.Executor);
  }

  public abstract static class RoomDatabase.Callback {
    ctor public RoomDatabase.Callback();
    method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase);
    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase);
  }

  public enum RoomDatabase.JournalMode {
    enum_constant public static final androidx.room.RoomDatabase.JournalMode AUTOMATIC;
    enum_constant public static final androidx.room.RoomDatabase.JournalMode TRUNCATE;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.JELLY_BEAN) public static final androidx.room.RoomDatabase.JournalMode WRITE_AHEAD_LOGGING;
  }

  public static class RoomDatabase.MigrationContainer {
    ctor public RoomDatabase.MigrationContainer();
    method public void addMigrations(androidx.room.migration.Migration!...);
    method public java.util.List<androidx.room.migration.Migration!>? findMigrationPath(int, int);
  }

}

package androidx.room.migration {

  public abstract class Migration {
    ctor public Migration(int, int);
    method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
    field public final int endVersion;
    field public final int startVersion;
  }

}

