private void updateSeekBarPreference(String key) {
   SeekBarPreference seekpref = (SeekBarPreference) getPreferenceScreen().findPreference(key);
   try {
     if (mListsToUpdate.containsKey(key)) {
       seekpref.setSummary(
           replaceString(mListsToUpdate.get(key), Integer.toString(seekpref.getValue())));
     } else {
       String oldsum = (String) seekpref.getSummary();
       if (oldsum.contains("XXX")) {
         mListsToUpdate.put(key, oldsum);
         seekpref.setSummary(replaceString(oldsum, Integer.toString(seekpref.getValue())));
       } else {
         seekpref.setSummary(Integer.toString(seekpref.getValue()));
       }
     }
   } catch (NullPointerException e) {
     Log.e(AnkiDroidApp.TAG, "Exception when updating seekbar preference: " + e);
   }
 }
 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
   try {
     if (key.equals("swipe")) {
       zoomCheckboxPreference.setChecked(false);
       zoomCheckboxPreference.setEnabled(!swipeCheckboxPreference.isChecked());
     } else if (key.equals("timeoutAnswer")) {
       keepScreenOnCheckBoxPreference.setChecked(showAnswerCheckBoxPreference.isChecked());
     } else if (key.equals("language")) {
       closePreferences();
     } else if (key.equals("theme")) {
       String theme = sharedPreferences.getString("theme", "3");
       if (theme.equals("2") || theme.equals("3")) {
         animationsCheckboxPreference.setChecked(false);
         animationsCheckboxPreference.setEnabled(false);
       } else {
         animationsCheckboxPreference.setEnabled(true);
       }
       Themes.loadTheme();
       switch (Integer.parseInt(sharedPreferences.getString("theme", "3"))) {
         case Themes.THEME_ANDROID_DARK:
         case Themes.THEME_ANDROID_LIGHT:
         case Themes.THEME_BLUE:
           sharedPreferences.edit().putString("defaultFont", "").commit();
           break;
         case Themes.THEME_FLAT:
           sharedPreferences.edit().putString("defaultFont", "OpenSans").commit();
           break;
         case Themes.THEME_WHITE:
           sharedPreferences.edit().putString("defaultFont", "OpenSans").commit();
           break;
       }
       Intent intent = this.getIntent();
       setResult(DeckPicker.RESULT_RESTART, intent);
       closePreferences();
     } else if (key.equals("writeAnswers") && sharedPreferences.getBoolean("writeAnswers", true)) {
       showDialog(DIALOG_WRITE_ANSWERS);
     } else if (key.equals("useBackup")) {
       if (lockCheckAction) {
         lockCheckAction = false;
       } else if (!useBackupPreference.isChecked()) {
         lockCheckAction = true;
         useBackupPreference.setChecked(true);
         showDialog(DIALOG_BACKUP);
       }
     } else if (key.equals("asyncMode")) {
       if (lockCheckAction) {
         lockCheckAction = false;
       } else if (asyncModePreference.isChecked()) {
         lockCheckAction = true;
         asyncModePreference.setChecked(false);
         showDialog(DIALOG_ASYNC);
       }
     } else if (key.equals("deckPath")) {
       File decksDirectory = new File(AnkiDroidApp.getCurrentAnkiDroidDirectory());
       if (decksDirectory.exists()) {
         AnkiDroidApp.createNoMediaFileIfMissing(decksDirectory);
       }
     } else if (key.equals("eInkDisplay")) {
       animationsCheckboxPreference.setChecked(false);
       animationsCheckboxPreference.setEnabled(!eInkDisplayPreference.isChecked());
       fadeScrollbars.setChecked(false);
       fadeScrollbars.setEnabled(!eInkDisplayPreference.isChecked());
     } else if (key.equals("convertFenText")) {
       if (convertFenText.isChecked()) {
         ChessFilter.install(AnkiDroidApp.getHooks());
       } else {
         ChessFilter.uninstall(AnkiDroidApp.getHooks());
       }
     } else if (key.equals("fixHebrewText")) {
       if (fixHebrewText.isChecked()) {
         HebrewFixFilter.install(AnkiDroidApp.getHooks());
         showDialog(DIALOG_HEBREW_FONT);
       } else {
         HebrewFixFilter.uninstall(AnkiDroidApp.getHooks());
       }
     } else if (key.equals("showProgress")) {
       mCol.getConf().put("dueCounts", showProgress.isChecked());
       mCol.setMod();
     } else if (key.equals("showEstimates")) {
       mCol.getConf().put("estTimes", showEstimates.isChecked());
       mCol.setMod();
     } else if (key.equals("newSpread")) {
       mCol.getConf().put("newSpread", Integer.parseInt(newSpread.getValue()));
       mCol.setMod();
     } else if (key.equals("timeLimit")) {
       mCol.getConf().put("timeLim", timeLimit.getValue() * 60);
       mCol.setMod();
     } else if (key.equals("learnCutoff")) {
       mCol.getConf().put("collapseTime", learnCutoff.getValue() * 60);
       mCol.setMod();
     } else if (key.equals("useCurrent")) {
       mCol.getConf().put("addToCur", useCurrent.getValue().equals("0") ? true : false);
       mCol.setMod();
     } else if (key.equals("dayOffset")) {
       int hours = dayOffset.getValue();
       Calendar date = (Calendar) mStartDate.clone();
       date.set(Calendar.HOUR_OF_DAY, hours);
       mCol.setCrt(date.getTimeInMillis() / 1000);
       mCol.setMod();
     }
     if (Arrays.asList(mShowValueInSummList).contains(key)) {
       updateListPreference(key);
     } else if (Arrays.asList(mShowValueInSummSeek).contains(key)) {
       updateSeekBarPreference(key);
     } else if (Arrays.asList(mShowValueInSummEditText).contains(key)) {
       updateEditTextPreference(key);
     } else if (Arrays.asList(mShowValueInSummNumRange).contains(key)) {
       updateNumberRangePreference(key);
     }
   } catch (BadTokenException e) {
     Log.e(AnkiDroidApp.TAG, "Preferences: BadTokenException on showDialog: " + e);
   } catch (NumberFormatException e) {
     throw new RuntimeException();
   } catch (JSONException e) {
     throw new RuntimeException();
   }
 }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // Workaround for bug 4611: http://code.google.com/p/android/issues/detail?id=4611
    if (AnkiDroidApp.SDK_VERSION >= 7 && AnkiDroidApp.SDK_VERSION <= 10) {
      Themes.applyTheme(this, Themes.THEME_ANDROID_DARK);
    }
    super.onCreate(savedInstanceState);

    mCol = AnkiDroidApp.getCol();
    mPrefMan = getPreferenceManager();
    mPrefMan.setSharedPreferencesName(AnkiDroidApp.SHARED_PREFS_NAME);

    addPreferencesFromResource(R.xml.preferences);

    swipeCheckboxPreference = (CheckBoxPreference) getPreferenceScreen().findPreference("swipe");
    zoomCheckboxPreference = (CheckBoxPreference) getPreferenceScreen().findPreference("zoom");
    keepScreenOnCheckBoxPreference =
        (CheckBoxPreference) getPreferenceScreen().findPreference("keepScreenOn");
    showAnswerCheckBoxPreference =
        (CheckBoxPreference) getPreferenceScreen().findPreference("timeoutAnswer");
    animationsCheckboxPreference =
        (CheckBoxPreference) getPreferenceScreen().findPreference("themeAnimations");
    useBackupPreference = (CheckBoxPreference) getPreferenceScreen().findPreference("useBackup");
    asyncModePreference = (CheckBoxPreference) getPreferenceScreen().findPreference("asyncMode");
    eInkDisplayPreference =
        (CheckBoxPreference) getPreferenceScreen().findPreference("eInkDisplay");
    fadeScrollbars = (CheckBoxPreference) getPreferenceScreen().findPreference("fadeScrollbars");
    //        ListPreference listpref = (ListPreference)
    // getPreferenceScreen().findPreference("theme");
    convertFenText = (CheckBoxPreference) getPreferenceScreen().findPreference("convertFenText");
    fixHebrewText = (CheckBoxPreference) getPreferenceScreen().findPreference("fixHebrewText");
    syncAccount = (Preference) getPreferenceScreen().findPreference("syncAccount");
    showEstimates = (CheckBoxPreference) getPreferenceScreen().findPreference("showEstimates");
    showProgress = (CheckBoxPreference) getPreferenceScreen().findPreference("showProgress");
    learnCutoff = (NumberRangePreference) getPreferenceScreen().findPreference("learnCutoff");
    timeLimit = (NumberRangePreference) getPreferenceScreen().findPreference("timeLimit");
    useCurrent = (ListPreference) getPreferenceScreen().findPreference("useCurrent");
    newSpread = (ListPreference) getPreferenceScreen().findPreference("newSpread");
    dayOffset = (SeekBarPreference) getPreferenceScreen().findPreference("dayOffset");
    //        String theme = listpref.getValue();
    //        animationsCheckboxPreference.setEnabled(theme.equals("2") || theme.equals("3"));
    zoomCheckboxPreference.setEnabled(!swipeCheckboxPreference.isChecked());

    initializeLanguageDialog();
    initializeCustomFontsDialog();

    if (mCol != null) {
      // For collection preferences, we need to fetch the correct values from the collection
      mStartDate = GregorianCalendar.getInstance();
      Timestamp timestamp = new Timestamp(mCol.getCrt() * 1000);
      mStartDate.setTimeInMillis(timestamp.getTime());
      dayOffset.setValue(mStartDate.get(Calendar.HOUR_OF_DAY));
      try {
        JSONObject conf = mCol.getConf();
        learnCutoff.setValue(conf.getInt("collapseTime") / 60);
        timeLimit.setValue(conf.getInt("timeLim") / 60);
        showEstimates.setChecked(conf.getBoolean("estTimes"));
        showProgress.setChecked(conf.getBoolean("dueCounts"));
        newSpread.setValueIndex(conf.getInt("newSpread"));
        useCurrent.setValueIndex(conf.getBoolean("addToCur") ? 0 : 1);
      } catch (JSONException e) {
        throw new RuntimeException();
      } catch (NumberFormatException e) {
        throw new RuntimeException();
      }
    } else {
      // It's possible to open the preferences from the loading screen if no SD card is found.
      // In that case, there will be no collection loaded, so we need to disable the settings
      // that read from and write to the collection.
      dayOffset.setEnabled(false);
      learnCutoff.setEnabled(false);
      timeLimit.setEnabled(false);
      showEstimates.setEnabled(false);
      showProgress.setEnabled(false);
      newSpread.setEnabled(false);
      useCurrent.setEnabled(false);
    }

    for (String key : mShowValueInSummList) {
      updateListPreference(key);
    }
    for (String key : mShowValueInSummSeek) {
      updateSeekBarPreference(key);
    }
    for (String key : mShowValueInSummEditText) {
      updateEditTextPreference(key);
    }
    for (String key : mShowValueInSummNumRange) {
      updateNumberRangePreference(key);
    }

    if (AnkiDroidApp.SDK_VERSION <= 4) {
      fadeScrollbars.setChecked(false);
      fadeScrollbars.setEnabled(false);
    }
  }