/**
   * The init method is responsible for intializing all singletons of the research stack framework
   *
   * @param context android context, preferably application context.
   * @param concreteResearchStack implementation of ResearchStack class
   */
  public static void init(Context context, ResearchStack concreteResearchStack) {
    instance = concreteResearchStack;

    ResourceManager.init(concreteResearchStack.createResourceManagerImplementation(context));

    UiManager.init(concreteResearchStack.createUiManagerImplementation(context));

    DataProvider.init(concreteResearchStack.createDataProviderImplementation(context));

    StorageAccess.getInstance()
        .init(
            concreteResearchStack.getPinCodeConfig(context),
            concreteResearchStack.getEncryptionProvider(context),
            concreteResearchStack.createFileAccessImplementation(context),
            concreteResearchStack.createAppDatabaseImplementation(context));

    TaskProvider.init(concreteResearchStack.createTaskProviderImplementation(context));

    NotificationConfig.init(concreteResearchStack.createNotificationConfigImplementation(context));

    PermissionRequestManager.init(
        concreteResearchStack.createPermissionRequestManagerImplementation(context));
  }