@Override
    protected Pair<String, String> doInBackground(Void... voids) {
      // Looper.prepare();
      if (isFirstStart()) {
        Log.i(
            TAG,
            "App started for the first time. "
                + "Copying default config, keys will be generated automatically");
        copyDefaultConfig();
      }

      moveConfigFiles();
      ConfigXml config = new ConfigXml(getConfigFile());
      if (isFirstStart()) {
        config.createCameraRepo();
      }
      config.update();
      return new Pair<String, String>(config.getWebGuiUrl(), config.getApiKey());
    }
  /**
   * Checks according to preferences and charging/wifi state, whether syncthing should be enabled or
   * not.
   *
   * <p>Depending on the result, syncthing is started or stopped, and {@link #onApiChange()} is
   * called.
   */
  public void updateState() {
    // Start syncthing.
    if (mDeviceStateHolder.shouldRun()) {
      if (mCurrentState == State.ACTIVE || mCurrentState == State.STARTING) {
        mStopScheduled = false;
        return;
      }

      // HACK: Make sure there is no syncthing binary left running from an improper
      // shutdown (eg Play Store update).
      // NOTE: This will log an exception if syncthing is not actually running.
      shutdown();

      Log.i(TAG, "Starting syncthing according to current state and preferences");
      mConfig = null;
      try {
        mConfig = new ConfigXml(SyncthingService.this);
      } catch (ConfigXml.OpenConfigException e) {
        mCurrentState = State.ERROR;
        Toast.makeText(this, R.string.config_create_failed, Toast.LENGTH_LONG).show();
      }

      if (mConfig != null) {
        mCurrentState = State.STARTING;

        if (mApi != null) registerOnWebGuiAvailableListener(mApi);
        if (mEventProcessor != null) registerOnWebGuiAvailableListener(mEventProcessor);
        new PollWebGuiAvailableTaskImpl(
                getWebGuiUrl(), getFilesDir() + "/" + HTTPS_CERT_FILE, mConfig.getApiKey())
            .execute();
        mRunnable = new SyncthingRunnable(this, SyncthingRunnable.Command.main);
        new Thread(mRunnable).start();
        updateNotification();
      }
    }
    // Stop syncthing.
    else {
      if (mCurrentState == State.DISABLED) return;

      Log.i(TAG, "Stopping syncthing according to current state and preferences");
      mCurrentState = State.DISABLED;

      shutdown();
    }
    onApiChange();
  }
 public URL getWebGuiUrl() {
   return mConfig.getWebGuiUrl();
 }