public void onCreate() {
    final Activity activity = ui.getActivity();

    if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
      // disable expanded notification option on unsupported android versions
      ui.findPreference(PreferenceController.PREF_EXPANDED_NOTIFICATION).setEnabled(false);
      ui.findPreference(PreferenceController.PREF_EXPANDED_NOTIFICATION)
          .setOnPreferenceClickListener(
              preference -> {
                Toast toast =
                    Toast.makeText(
                        activity, R.string.pref_expand_notify_unsupport_toast, Toast.LENGTH_SHORT);
                toast.show();
                return true;
              });
    }
    ui.findPreference(PreferenceController.PREF_FLATTR_REVOKE)
        .setOnPreferenceClickListener(
            preference -> {
              FlattrUtils.revokeAccessToken(activity);
              checkItemVisibility();
              return true;
            });
    ui.findPreference(PreferenceController.PREF_ABOUT)
        .setOnPreferenceClickListener(
            preference -> {
              activity.startActivity(new Intent(activity, AboutActivity.class));
              return true;
            });
    ui.findPreference(PreferenceController.STATISTICS)
        .setOnPreferenceClickListener(
            preference -> {
              activity.startActivity(new Intent(activity, StatisticsActivity.class));
              return true;
            });
    ui.findPreference(PreferenceController.PREF_OPML_EXPORT)
        .setOnPreferenceClickListener(
            preference -> {
              new OpmlExportWorker(activity).executeAsync();
              return true;
            });
    ui.findPreference(PreferenceController.PREF_CHOOSE_DATA_DIR)
        .setOnPreferenceClickListener(
            preference -> {
              if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT
                  && Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
                showChooseDataFolderDialog();
              } else {
                int readPermission =
                    ActivityCompat.checkSelfPermission(
                        activity, Manifest.permission.READ_EXTERNAL_STORAGE);
                int writePermission =
                    ActivityCompat.checkSelfPermission(
                        activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
                if (readPermission == PackageManager.PERMISSION_GRANTED
                    && writePermission == PackageManager.PERMISSION_GRANTED) {
                  openDirectoryChooser();
                } else {
                  requestPermission();
                }
              }
              return true;
            });
    ui.findPreference(PreferenceController.PREF_CHOOSE_DATA_DIR)
        .setOnPreferenceClickListener(
            preference -> {
              if (Build.VERSION.SDK_INT >= 19) {
                showChooseDataFolderDialog();
              } else {
                Intent intent = new Intent(activity, DirectoryChooserActivity.class);
                activity.startActivityForResult(
                    intent, DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED);
              }
              return true;
            });
    ui.findPreference(UserPreferences.PREF_THEME)
        .setOnPreferenceChangeListener(
            (preference, newValue) -> {
              Intent i = new Intent(activity, MainActivity.class);
              i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
              activity.finish();
              activity.startActivity(i);
              return true;
            });
    ui.findPreference(UserPreferences.PREF_HIDDEN_DRAWER_ITEMS)
        .setOnPreferenceClickListener(
            preference -> {
              showDrawerPreferencesDialog();
              return true;
            });

    ui.findPreference(UserPreferences.PREF_COMPACT_NOTIFICATION_BUTTONS)
        .setOnPreferenceClickListener(
            preference -> {
              showNotificationButtonsDialog();
              return true;
            });

    ui.findPreference(UserPreferences.PREF_UPDATE_INTERVAL)
        .setOnPreferenceClickListener(
            preference -> {
              showUpdateIntervalTimePreferencesDialog();
              return true;
            });

    ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL)
        .setOnPreferenceChangeListener(
            (preference, newValue) -> {
              if (newValue instanceof Boolean) {
                boolean enabled = (Boolean) newValue;
                ui.findPreference(UserPreferences.PREF_EPISODE_CACHE_SIZE).setEnabled(enabled);
                ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_ON_BATTERY)
                    .setEnabled(enabled);
                ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER)
                    .setEnabled(enabled);
                setSelectedNetworksEnabled(
                    enabled && UserPreferences.isEnableAutodownloadWifiFilter());
              }
              return true;
            });
    ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER)
        .setOnPreferenceChangeListener(
            (preference, newValue) -> {
              if (newValue instanceof Boolean) {
                setSelectedNetworksEnabled((Boolean) newValue);
                return true;
              } else {
                return false;
              }
            });
    ui.findPreference(UserPreferences.PREF_PARALLEL_DOWNLOADS)
        .setOnPreferenceChangeListener(
            (preference, o) -> {
              if (o instanceof String) {
                try {
                  int value = Integer.parseInt((String) o);
                  if (1 <= value && value <= 50) {
                    setParallelDownloadsText(value);
                    return true;
                  }
                } catch (NumberFormatException e) {
                  return false;
                }
              }
              return false;
            });
    // validate and set correct value: number of downloads between 1 and 50 (inclusive)
    final EditText ev =
        ((EditTextPreference) ui.findPreference(UserPreferences.PREF_PARALLEL_DOWNLOADS))
            .getEditText();
    ev.addTextChangedListener(
        new TextWatcher() {
          @Override
          public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

          @Override
          public void onTextChanged(CharSequence s, int start, int before, int count) {}

          @Override
          public void afterTextChanged(Editable s) {
            if (s.length() > 0) {
              try {
                int value = Integer.parseInt(s.toString());
                if (value <= 0) {
                  ev.setText("1");
                } else if (value > 50) {
                  ev.setText("50");
                }
              } catch (NumberFormatException e) {
                ev.setText("6");
              }
              ev.setSelection(ev.getText().length());
            }
          }
        });
    ui.findPreference(UserPreferences.PREF_EPISODE_CACHE_SIZE)
        .setOnPreferenceChangeListener(
            (preference, o) -> {
              if (o instanceof String) {
                setEpisodeCacheSizeText(UserPreferences.readEpisodeCacheSize((String) o));
              }
              return true;
            });
    ui.findPreference(PreferenceController.PREF_PLAYBACK_SPEED_LAUNCHER)
        .setOnPreferenceClickListener(
            preference -> {
              VariableSpeedDialog.showDialog(activity);
              return true;
            });
    ui.findPreference(PreferenceController.PREF_GPODNET_SETLOGIN_INFORMATION)
        .setOnPreferenceClickListener(
            preference -> {
              AuthenticationDialog dialog =
                  new AuthenticationDialog(
                      activity,
                      R.string.pref_gpodnet_setlogin_information_title,
                      false,
                      false,
                      GpodnetPreferences.getUsername(),
                      null) {

                    @Override
                    protected void onConfirmed(
                        String username, String password, boolean saveUsernamePassword) {
                      GpodnetPreferences.setPassword(password);
                    }
                  };
              dialog.show();
              return true;
            });
    ui.findPreference(PreferenceController.PREF_GPODNET_SYNC)
        .setOnPreferenceClickListener(
            preference -> {
              GpodnetSyncService.sendSyncIntent(ui.getActivity().getApplicationContext());
              Toast toast =
                  Toast.makeText(
                      ui.getActivity(), R.string.pref_gpodnet_sync_started, Toast.LENGTH_SHORT);
              toast.show();
              return true;
            });
    ui.findPreference(PreferenceController.PREF_GPODNET_LOGOUT)
        .setOnPreferenceClickListener(
            preference -> {
              GpodnetPreferences.logout();
              Toast toast =
                  Toast.makeText(activity, R.string.pref_gpodnet_logout_toast, Toast.LENGTH_SHORT);
              toast.show();
              updateGpodnetPreferenceScreen();
              return true;
            });
    ui.findPreference(PreferenceController.PREF_GPODNET_HOSTNAME)
        .setOnPreferenceClickListener(
            preference -> {
              GpodnetSetHostnameDialog.createDialog(activity)
                  .setOnDismissListener(dialog -> updateGpodnetPreferenceScreen());
              return true;
            });

    ui.findPreference(PreferenceController.PREF_AUTO_FLATTR_PREFS)
        .setOnPreferenceClickListener(
            preference -> {
              AutoFlattrPreferenceDialog.newAutoFlattrPreferenceDialog(
                  activity,
                  new AutoFlattrPreferenceDialog.AutoFlattrPreferenceDialogInterface() {
                    @Override
                    public void onCancelled() {}

                    @Override
                    public void onConfirmed(boolean autoFlattrEnabled, float autoFlattrValue) {
                      UserPreferences.setAutoFlattrSettings(autoFlattrEnabled, autoFlattrValue);
                      checkItemVisibility();
                    }
                  });
              return true;
            });
    ui.findPreference(UserPreferences.PREF_IMAGE_CACHE_SIZE)
        .setOnPreferenceChangeListener(
            (preference, o) -> {
              if (o instanceof String) {
                int newValue = Integer.parseInt((String) o) * 1024 * 1024;
                if (newValue != UserPreferences.getImageCacheSize()) {
                  AlertDialog.Builder dialog = new AlertDialog.Builder(ui.getActivity());
                  dialog.setTitle(android.R.string.dialog_alert_title);
                  dialog.setMessage(R.string.pref_restart_required);
                  dialog.setPositiveButton(android.R.string.ok, null);
                  dialog.show();
                }
                return true;
              }
              return false;
            });
    ui.findPreference(PREF_PROXY)
        .setOnPreferenceClickListener(
            preference -> {
              ProxyDialog dialog = new ProxyDialog(ui.getActivity());
              dialog.createDialog().show();
              return true;
            });
    ui.findPreference(PREF_KNOWN_ISSUES)
        .setOnPreferenceClickListener(
            preference -> {
              openInBrowser("https://github.com/AntennaPod/AntennaPod/labels/bug");
              return true;
            });
    ui.findPreference(PREF_FAQ)
        .setOnPreferenceClickListener(
            preference -> {
              openInBrowser("http://antennapod.org/faq.html");
              return true;
            });
    ui.findPreference(PREF_SEND_CRASH_REPORT)
        .setOnPreferenceClickListener(
            preference -> {
              Intent emailIntent = new Intent(Intent.ACTION_SEND);
              emailIntent.setType("text/plain");
              emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"*****@*****.**"});
              emailIntent.putExtra(Intent.EXTRA_SUBJECT, "AntennaPod Crash Report");
              emailIntent.putExtra(
                  Intent.EXTRA_TEXT, "Please describe what you were doing when the app crashed");
              // the attachment
              emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(CrashReportWriter.getFile()));
              String intentTitle = ui.getActivity().getString(R.string.send_email);
              ui.getActivity().startActivity(Intent.createChooser(emailIntent, intentTitle));
              return true;
            });
    // checks whether Google Play Services is installed on the device (condition necessary for Cast
    // support)
    ui.findPreference(UserPreferences.PREF_CAST_ENABLED)
        .setOnPreferenceChangeListener(
            (preference, o) -> {
              if (o instanceof Boolean && ((Boolean) o)) {
                final int googlePlayServicesCheck =
                    GoogleApiAvailability.getInstance()
                        .isGooglePlayServicesAvailable(ui.getActivity());
                if (googlePlayServicesCheck == ConnectionResult.SUCCESS) {
                  return true;
                } else {
                  GoogleApiAvailability.getInstance()
                      .getErrorDialog(ui.getActivity(), googlePlayServicesCheck, 0)
                      .show();
                  return false;
                }
              }
              return true;
            });
    buildEpisodeCleanupPreference();
    buildSmartMarkAsPlayedPreference();
    buildAutodownloadSelectedNetworsPreference();
    setSelectedNetworksEnabled(UserPreferences.isEnableAutodownloadWifiFilter());
  }