// Signature format: 3.0
package androidx.savedstate {

  public final class SavedStateRegistry {
    method @MainThread public android.os.Bundle? consumeRestoredStateForKey(String);
    method @MainThread public boolean isRestored();
    method @MainThread public void registerSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
    method @MainThread public void unregisterSavedStateProvider(String);
  }

  public static interface SavedStateRegistry.SavedStateProvider {
    method public android.os.Bundle saveState();
  }

  public final class SavedStateRegistryController {
    ctor public SavedStateRegistryController();
    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
    method @MainThread public void performRestore(android.os.Bundle?);
    method @MainThread public void performSave(android.os.Bundle);
  }

  public interface SavedStateRegistryOwner {
    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
  }

}

