content: package im.actor.runtime;
  
  import im.actor.runtime.bser.BserCreator;
  import im.actor.runtime.bser.BserObject;
  import im.actor.runtime.files.FileSystemReference;
  import im.actor.runtime.mvvm.BaseValueModel;
  import im.actor.runtime.mvvm.PlatformDisplayList;
  import im.actor.runtime.mvvm.MVVMCollection;
  import im.actor.runtime.mvvm.ValueDefaultCreator;
  import im.actor.runtime.mvvm.ValueModelCreator;
  import im.actor.runtime.storage.KeyValueItem;
  import im.actor.runtime.storage.KeyValueStorage;
  import im.actor.runtime.storage.ListEngine;
  import im.actor.runtime.storage.ListEngineItem;
  import im.actor.runtime.storage.PreferencesStorage;
  
  public class Storage {
  
      private static final StorageRuntime storageRuntime = new StorageRuntimeProvider();
      private static final EnginesRuntime enginesRuntime = new EnginesRuntimeProvider();
      private static final FileSystemRuntime fileSystemRuntime = new FileSystemRuntimeProvider();
  
      // Runtimes
  
      public static StorageRuntime getStorageRuntime() {
          return storageRuntime;
      }
  
      public static EnginesRuntime getEnginesRuntime() {
          return enginesRuntime;
      }
  
      public static FileSystemRuntime getFileSystemRuntime() {
          return fileSystemRuntime;
      }
  
  
      // Storage
  
      public static PreferencesStorage createPreferencesStorage() {
          return storageRuntime.createPreferencesStorage();
      }
  
      public static KeyValueStorage createKeyValue(String name) {
          return storageRuntime.createKeyValue(name);
      }
  
      public static <T extends BserObject & ListEngineItem> ListEngine<T> createList(String name, BserCreator<T> creator) {
          return enginesRuntime.createListEngine(storageRuntime.createList(name), creator);
      }
  
      public static <V extends BaseValueModel<T>, T extends BserObject & KeyValueItem> MVVMCollection<T, V> createKeyValue(String name,
                                                                                                                           ValueModelCreator<T, V> wrapperCreator,
                                                                                                                           BserCreator<T> creator) {
          return new MVVMCollection<>(storageRuntime.createKeyValue(name), wrapperCreator, creator);
      }
  
      public static <V extends BaseValueModel<T>, T extends BserObject & KeyValueItem> MVVMCollection<T, V> createKeyValue(String name,
                                                                                                                           ValueModelCreator<T, V> wrapperCreator,
                                                                                                                           BserCreator<T> creator,
                                                                                                                           ValueDefaultCreator<T> defaultCreator) {
          return new MVVMCollection<>(storageRuntime.createKeyValue(name), wrapperCreator, creator, defaultCreator);
      }
  
      public static <T extends BserObject & ListEngineItem> PlatformDisplayList<T> createDisplayList(ListEngine<T> engine,
                                                                                                     boolean isSharedInstance,
                                                                                                     String entityName) {
          return enginesRuntime.createDisplayList(engine, isSharedInstance, entityName);
      }
  
      public static void resetStorage() {
          storageRuntime.resetStorage();
      }
  
      // Files
  
      public static FileSystemReference createTempFile() {
          return fileSystemRuntime.createTempFile();
      }
  
      public static boolean isFsPersistent() {
          return fileSystemRuntime.isFsPersistent();
      }
  
      public static FileSystemReference fileFromDescriptor(String descriptor) {
          return fileSystemRuntime.fileFromDescriptor(descriptor);
      }
  
      public static FileSystemReference commitTempFile(FileSystemReference sourceFile, long fileId, String fileName) {
          return fileSystemRuntime.commitTempFile(sourceFile, fileId, fileName);
      }
  }
  