// Signature format: 3.0
package androidx.datastore.preferences {

  public final class PreferenceDataStoreFactory {
    ctor public PreferenceDataStoreFactory();
    method public androidx.datastore.DataStore<androidx.datastore.preferences.Preferences> create(kotlin.jvm.functions.Function0<? extends java.io.File> produceFile, androidx.datastore.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.Preferences>? corruptionHandler = null, java.util.List<? extends kotlin.jvm.functions.Function0<? extends androidx.datastore.DataMigration<androidx.datastore.preferences.Preferences>>> migrationProducers = listOf(), kotlinx.coroutines.CoroutineScope scope = CoroutineScope(Dispatchers.IO + SupervisorJob()));
    method public androidx.datastore.DataStore<androidx.datastore.preferences.Preferences> create(kotlin.jvm.functions.Function0<? extends java.io.File> produceFile, androidx.datastore.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.Preferences>? corruptionHandler = null, java.util.List<? extends kotlin.jvm.functions.Function0<? extends androidx.datastore.DataMigration<androidx.datastore.preferences.Preferences>>> migrationProducers = listOf());
    method public androidx.datastore.DataStore<androidx.datastore.preferences.Preferences> create(kotlin.jvm.functions.Function0<? extends java.io.File> produceFile, androidx.datastore.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.Preferences>? corruptionHandler = null);
    method public androidx.datastore.DataStore<androidx.datastore.preferences.Preferences> create(kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
  }

  public final class Preferences {
    method public operator boolean contains(String key);
    method public java.util.Map<java.lang.String,java.lang.Object> getAll();
    method public boolean getBoolean(String key, boolean defaultValue);
    method public float getFloat(String key, float defaultValue);
    method public int getInt(String key, int defaultValue);
    method public long getLong(String key, long defaultValue);
    method public String getString(String key, String defaultValue);
    method public java.util.Set<java.lang.String> getStringSet(String key, java.util.Set<java.lang.String> defaultValue);
    method public androidx.datastore.preferences.Preferences.Builder toBuilder();
    field public static final androidx.datastore.preferences.Preferences.Companion Companion;
  }

  public static final class Preferences.Builder {
    ctor public Preferences.Builder();
    method public androidx.datastore.preferences.Preferences build();
    method public androidx.datastore.preferences.Preferences.Builder clear();
    method public androidx.datastore.preferences.Preferences.Builder remove(String key);
    method public androidx.datastore.preferences.Preferences.Builder setBoolean(String key, boolean newValue);
    method public androidx.datastore.preferences.Preferences.Builder setFloat(String key, float newValue);
    method public androidx.datastore.preferences.Preferences.Builder setInt(String key, int newValue);
    method public androidx.datastore.preferences.Preferences.Builder setLong(String key, long newValue);
    method public androidx.datastore.preferences.Preferences.Builder setString(String key, String newValue);
    method public androidx.datastore.preferences.Preferences.Builder setStringSet(String key, java.util.Set<java.lang.String> newValue);
  }

  public static final class Preferences.Companion {
    method public androidx.datastore.preferences.Preferences empty();
  }

  public final class SharedPreferencesMigration {
    method public static kotlin.jvm.functions.Function0<androidx.datastore.DataMigration<androidx.datastore.preferences.Preferences>> create(android.content.Context context, String sharedPreferencesName, java.util.Set<java.lang.String>? keysToMigrate = MIGRATE_ALL_KEYS, boolean deleteEmptyPreferences = true);
    field public static final androidx.datastore.preferences.SharedPreferencesMigration.Companion Companion;
  }

  public static final class SharedPreferencesMigration.Companion {
    method public kotlin.jvm.functions.Function0<androidx.datastore.DataMigration<androidx.datastore.preferences.Preferences>> create(android.content.Context context, String sharedPreferencesName, java.util.Set<java.lang.String>? keysToMigrate = MIGRATE_ALL_KEYS, boolean deleteEmptyPreferences = true);
  }

}

