// Signature format: 3.0
package androidx.room.migration.bundle {

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class BundleUtil {
    field public static final String TABLE_NAME_PLACEHOLDER = "${TABLE_NAME}";
    field public static final String VIEW_NAME_PLACEHOLDER = "${VIEW_NAME}";
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DatabaseBundle {
    ctor public DatabaseBundle(int, String!, java.util.List<androidx.room.migration.bundle.EntityBundle!>!, java.util.List<androidx.room.migration.bundle.DatabaseViewBundle!>!, java.util.List<java.lang.String!>!);
    ctor public DatabaseBundle();
    method public java.util.List<java.lang.String!>! buildCreateQueries();
    method public java.util.List<androidx.room.migration.bundle.EntityBundle!>! getEntities();
    method public java.util.Map<java.lang.String!,androidx.room.migration.bundle.EntityBundle!>! getEntitiesByTableName();
    method public String! getIdentityHash();
    method public int getVersion();
    method public java.util.List<androidx.room.migration.bundle.DatabaseViewBundle!>! getViews();
    method public boolean isSchemaEqual(androidx.room.migration.bundle.DatabaseBundle!);
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DatabaseViewBundle {
    ctor public DatabaseViewBundle(String!, String!);
    method public String! createView();
    method public String! getCreateSql();
    method public String! getViewName();
    method public boolean isSchemaEqual(androidx.room.migration.bundle.DatabaseViewBundle!);
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class EntityBundle {
    ctor public EntityBundle(String!, String!, java.util.List<androidx.room.migration.bundle.FieldBundle!>!, androidx.room.migration.bundle.PrimaryKeyBundle!, java.util.List<androidx.room.migration.bundle.IndexBundle!>!, java.util.List<androidx.room.migration.bundle.ForeignKeyBundle!>!);
    method public java.util.Collection<java.lang.String!>! buildCreateQueries();
    method public String! createNewTable();
    method public String! createTable();
    method public String! getCreateSql();
    method public java.util.List<androidx.room.migration.bundle.FieldBundle!>! getFields();
    method public java.util.Map<java.lang.String!,androidx.room.migration.bundle.FieldBundle!>! getFieldsByColumnName();
    method public java.util.List<androidx.room.migration.bundle.ForeignKeyBundle!>! getForeignKeys();
    method public java.util.List<androidx.room.migration.bundle.IndexBundle!>! getIndices();
    method public String! getNewTableName();
    method public androidx.room.migration.bundle.PrimaryKeyBundle! getPrimaryKey();
    method public String! getTableName();
    method public boolean isSchemaEqual(androidx.room.migration.bundle.EntityBundle!);
    method public String renameToOriginal();
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FieldBundle {
    ctor public FieldBundle(String!, String!, String!, boolean);
    method public String! getAffinity();
    method public String! getColumnName();
    method public String! getFieldPath();
    method public boolean isNonNull();
    method public boolean isSchemaEqual(androidx.room.migration.bundle.FieldBundle!);
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ForeignKeyBundle {
    ctor public ForeignKeyBundle(String!, String!, String!, java.util.List<java.lang.String!>!, java.util.List<java.lang.String!>!);
    method public java.util.List<java.lang.String!>! getColumns();
    method public String! getOnDelete();
    method public String! getOnUpdate();
    method public java.util.List<java.lang.String!>! getReferencedColumns();
    method public String! getTable();
    method public boolean isSchemaEqual(androidx.room.migration.bundle.ForeignKeyBundle!);
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FtsEntityBundle extends androidx.room.migration.bundle.EntityBundle {
    ctor public FtsEntityBundle(String!, String!, java.util.List<androidx.room.migration.bundle.FieldBundle!>!, androidx.room.migration.bundle.PrimaryKeyBundle!, String!, androidx.room.migration.bundle.FtsOptionsBundle!, java.util.List<java.lang.String!>!);
    method public androidx.room.migration.bundle.FtsOptionsBundle! getFtsOptions();
    method public java.util.List<java.lang.String!>! getShadowTableNames();
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FtsOptionsBundle {
    ctor public FtsOptionsBundle(String!, java.util.List<java.lang.String!>!, String!, String!, String!, java.util.List<java.lang.String!>!, java.util.List<java.lang.Integer!>!, String!);
    method public String! getContentTable();
    method public boolean isSchemaEqual(androidx.room.migration.bundle.FtsOptionsBundle!);
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class IndexBundle {
    ctor public IndexBundle(String!, boolean, java.util.List<java.lang.String!>!, String!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String! create(String!);
    method public java.util.List<java.lang.String!>! getColumnNames();
    method public String! getName();
    method public boolean isSchemaEqual(androidx.room.migration.bundle.IndexBundle!);
    method public boolean isUnique();
    field public static final String DEFAULT_PREFIX = "index_";
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PrimaryKeyBundle {
    ctor public PrimaryKeyBundle(boolean, java.util.List<java.lang.String!>!);
    method public java.util.List<java.lang.String!>! getColumnNames();
    method public boolean isAutoGenerate();
    method public boolean isSchemaEqual(androidx.room.migration.bundle.PrimaryKeyBundle!);
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SchemaBundle {
    ctor public SchemaBundle(int, androidx.room.migration.bundle.DatabaseBundle!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.room.migration.bundle.SchemaBundle! deserialize(java.io.InputStream!) throws java.io.UnsupportedEncodingException;
    method public androidx.room.migration.bundle.DatabaseBundle! getDatabase();
    method public int getFormatVersion();
    method public boolean isSchemaEqual(androidx.room.migration.bundle.SchemaBundle!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void serialize(androidx.room.migration.bundle.SchemaBundle!, java.io.File!) throws java.io.IOException;
    field public static final int LATEST_FORMAT = 1; // 0x1
  }

}

