class FirebaseRemoteConfig {

  @NonNull
  public Task<FirebaseRemoteConfigInfo> ensureInitialized() {
    Task<ConfigContainer> activatedConfigsTask = activatedConfigsCache.get();
    Task<ConfigContainer> defaultsConfigsTask = defaultConfigsCache.get();
    Task<ConfigContainer> fetchedConfigsTask = fetchedConfigsCache.get();
    Task<FirebaseRemoteConfigInfo> metadataTask = Tasks.call(executor, this::getInfo);
    Task<String> installationIdTask = firebaseInstallations.getId();
    Task<InstallationTokenResult> installationTokenTask = firebaseInstallations.getToken(false);

    return Tasks.whenAllComplete(
            activatedConfigsTask,
            defaultsConfigsTask,
            fetchedConfigsTask,
            metadataTask,
            installationIdTask,
            installationTokenTask)
        .continueWith(executor, (unusedListOfCompletedTasks) -> metadataTask.getResult());
  }

    FirebaseRemoteConfig(
      Context context,
      FirebaseApp firebaseApp,
      FirebaseInstallationsApi firebaseInstallations,
      @Nullable FirebaseABTesting firebaseAbt,
      Executor executor,
      ConfigCacheClient fetchedConfigsCache,
      ConfigCacheClient activatedConfigsCache,
      ConfigCacheClient defaultConfigsCache,
      ConfigFetchHandler fetchHandler,
      ConfigGetParameterHandler getHandler,
      ConfigMetadataClient frcMetadata);

}