@Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Save location so we can tell when it changes
    saveLocation = ManagePreferences.location();

    // Build preference tree
    addPreferencesFromResource(R.xml.preferences);

    // Set preferences initialized flag
    ManagePreferences.setInitialized(true);

    // Set up the two enable components preferences
    Preference pref = findPreference(getString(R.string.pref_enabled_key));
    pref.setOnPreferenceChangeListener(
        new OnPreferenceChangeListener() {
          @Override
          public boolean onPreferenceChange(Preference preference, Object newValue) {
            boolean enabled = (Boolean) newValue;
            String enableStr = (enabled ? ManagePreferences.enableMsgType() : "");
            SmsPopupUtils.enableSMSPopup(SmsPopupConfigActivity.this, enableStr);
            CadPageWidget.update(SmsPopupConfigActivity.this);
            return true;
          }
        });
    pref = findPreference(getString(R.string.pref_enable_msg_type_key));
    pref.setOnPreferenceChangeListener(
        new OnPreferenceChangeListener() {
          @Override
          public boolean onPreferenceChange(Preference preference, Object newValue) {
            SmsPopupUtils.enableSMSPopup(SmsPopupConfigActivity.this, (String) newValue);
            return true;
          }
        });

    // Two other preferences should update the widget display
    pref = findPreference(getString(R.string.pref_notif_enabled_key));
    pref.setOnPreferenceChangeListener(
        new OnPreferenceChangeListener() {
          @Override
          public boolean onPreferenceChange(Preference preference, Object newValue) {
            CadPageWidget.update(SmsPopupConfigActivity.this);
            return true;
          }
        });
    pref = findPreference(getString(R.string.pref_popup_enabled_key));
    pref.setOnPreferenceChangeListener(
        new OnPreferenceChangeListener() {
          @Override
          public boolean onPreferenceChange(Preference preference, Object newValue) {
            CadPageWidget.update(SmsPopupConfigActivity.this);
            return true;
          }
        });

    // Set the version number in the about dialog preference
    final DialogPreference aboutPref =
        (DialogPreference) findPreference(getString(R.string.pref_about_key));
    aboutPref.setDialogTitle(CadPageApplication.getNameVersion());
    aboutPref.setDialogLayoutResource(R.layout.about);

    // Set up the payment status tracking screens
    Preference donate = (Preference) findPreference(getString(R.string.pref_payment_status_key));
    MainDonateEvent.instance().setPreference(this, donate);

    // Set up the two location preference screens
    Preference descPreference = findPreference(getString(R.string.pref_loc_desc_key));
    LocationManager locMgr = new LocationManager(this, descPreference);
    setupLocationMenu(R.string.pref_location_tree_key, false, locMgr);
    setupLocationMenu(R.string.pref_location_mtree_key, true, locMgr);
    locMgr.updateDisplay();

    // The location, filter override checkbox, and filter edit box have a complex
    // relationship.  The override checkbox is enabled only when the location parser
    // has a default parser to override.  If it doesn't then it is disabled by forced
    // to true.  The filter is enabled when the override box is checked, whether it
    // is enabled or not.  We have to do this ourselves because the Android dependency
    // logic considers the value to be false if it isn't enabled.

    // On top of all that, the general alert box is enabled only if the current
    // parser has a default filter OR a user filter has been specified

    genAlertPref = (CheckBoxPreference) findPreference(getString(R.string.pref_gen_alert_key));
    filterPref =
        (net.anei.cadpage.preferences.EditTextPreference)
            findPreference(getString(R.string.pref_filter_key));
    filterPref.setOnPreferenceChangeListener(
        new OnPreferenceChangeListener() {
          @Override
          public boolean onPreferenceChange(Preference preference, Object newValue) {
            String filter = (String) newValue;
            genAlertPref.setEnabled(filter.length() > 1 || parserFilter.length() > 0);
            return true;
          }
        });
    filterPref.setDialogClosedListener(
        new OnDialogClosedListener() {
          @Override
          public void onDialogClosed(boolean positiveResult) {
            if (positiveResult) {
              if ("General".equals(saveLocation)) {
                DonationManager.instance().reset();
                MainDonateEvent.instance().refreshStatus();
              }
            }
          }
        });

    overrideFilterPref =
        (CheckBoxPreference) findPreference(getString(R.string.pref_override_filter_key));
    filterPref.setEnabled(overrideFilterPref.isChecked());
    overrideFilterPref.setOnPreferenceChangeListener(
        new OnPreferenceChangeListener() {
          @Override
          public boolean onPreferenceChange(Preference preference, Object newValue) {
            filterPref.setEnabled((Boolean) newValue);
            return true;
          }
        });

    adjustLocationChange(ManagePreferences.location(), false);
    locMgr.setOnPreferenceChangeListener(
        new OnPreferenceChangeListener() {
          @Override
          public boolean onPreferenceChange(Preference preference, Object newValue) {
            adjustLocationChange((String) newValue, true);
            return true;
          }
        });

    // Have to play some games with the override default settings
    // If the override defaults is turned on, enable the default city and state items
    // If it is turned off, force the default city and state to the current parser
    // defaults and disable them.
    overrideDefaultPref =
        (CheckBoxPreference) findPreference(getString(R.string.pref_override_default_key));
    defCityPref = (EditTextPreference) findPreference(getString(R.string.pref_defcity_key));
    defStatePref = (EditTextPreference) findPreference(getString(R.string.pref_defstate_key));

    overrideDefaultPref =
        (CheckBoxPreference) findPreference(getString(R.string.pref_override_default_key));
    overrideDefaultPref.setOnPreferenceChangeListener(
        new OnPreferenceChangeListener() {
          @Override
          public boolean onPreferenceChange(Preference preference, Object newValue) {
            boolean value = ((Boolean) newValue).booleanValue();
            if (!value) {
              defCityPref.setText(parserDefCity);
              defCityPref.refreshSummary();
              defStatePref.setText(parserDefState);
              defStatePref.refreshSummary();
            }
            defCityPref.setEnabled(value);
            defStatePref.setEnabled(value);
            return true;
          }
        });

    // Make an initial call to our preference change listener to set up the
    // correct default summary displays
    overrideDefaultPref
        .getOnPreferenceChangeListener()
        .onPreferenceChange(overrideDefaultPref, ManagePreferences.overrideDefaults());

    // Set up Scanner channel selection preference
    scannerPref = findPreference(getString(R.string.pref_scanner_channel_key));
    if (scannerPref != null) {
      String channel = ManagePreferences.scannerChannel();
      scannerPref.setSummary(channel);
      scannerPref.setOnPreferenceClickListener(
          new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference pref) {

              // When clicked, ask the scanner app to select a favorite channel
              Intent intent = new Intent("com.scannerradio.intent.action.ACTION_PICK");
              try {
                startActivityForResult(intent, REQ_SCANNER_CHANNEL);
              } catch (ActivityNotFoundException ex) {

                // Scanner radio either isn't installed, or isn't responding to the ACTION_PICK
                // request.  Check the package manager to which, if any, are currently installed
                PackageManager pkgMgr = getPackageManager();
                String pkgName = "com.scannerradio_pro";
                boolean installed = false;
                try {
                  pkgMgr.getPackageInfo(pkgName, 0);
                  installed = true;
                } catch (PackageManager.NameNotFoundException ex2) {
                }
                if (!installed) {
                  pkgName = "com.scannerradio";
                  try {
                    pkgMgr.getPackageInfo(pkgName, 0);
                    installed = true;
                  } catch (PackageManager.NameNotFoundException ex2) {
                  }
                }

                // OK, show a dialog box asking if they want to install Scanner Radio
                final String pkgName2 = pkgName;
                new AlertDialog.Builder(SmsPopupConfigActivity.this)
                    .setMessage(
                        installed ? R.string.scanner_not_current : R.string.scanner_not_installed)
                    .setPositiveButton(
                        R.string.donate_btn_yes,
                        new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, int which) {
                            Intent intent =
                                new Intent(
                                    Intent.ACTION_VIEW,
                                    Uri.parse("market://details?id=" + pkgName2));
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            SmsPopupConfigActivity.this.startActivity(intent);
                          }
                        })
                    .setNegativeButton(R.string.donate_btn_no, null)
                    .create()
                    .show();
              }
              return true;
            }
          });
    }

    // Email developer response
    Preference emailPref = findPreference(getString(R.string.pref_email_key));
    emailPref.setOnPreferenceClickListener(
        new OnPreferenceClickListener() {
          @Override
          public boolean onPreferenceClick(Preference preference) {
            EmailDeveloperActivity.sendGeneralEmail(SmsPopupConfigActivity.this);
            return true;
          }
        });

    // Set up C2DM vendor preference screen
    PreferenceScreen vendorPref =
        (PreferenceScreen) findPreference(getString(R.string.pref_direct_paging_key));
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO
        || DonationManager.instance().isFreeVersion()) {
      vendorPref.setEnabled(false);
    } else {
      VendorManager.instance().setupPreference(this, vendorPref);
    }

    // If free version, switch release notes text to free release notes text
    if (DonationManager.instance().isFreeVersion()) {
      DialogPreference dlg =
          (DialogPreference) findPreference(getString(R.string.pref_releasenotes_key));
      dlg.setDialogMessage(R.string.free_release_text);
    }
    // Add developer dialog preference if appropriate
    DeveloperToolsManager.instance().addPreference(this, getPreferenceScreen());
  }