/* * This source is part of the * _____ ___ ____ * __ / / _ \/ _ | / __/___ _______ _ * / // / , _/ __ |/ _/_/ _ \/ __/ _ `/ * \___/_/|_/_/ |_/_/ (_)___/_/ \_, / * /___/ * repository. * * Copyright (C) 2013 Benoit 'BoD' Lubek (BoD@JRAF.org) * Copyright (C) 2013-2015 Carmen Alvarez (c@rmen.ca) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ca.rmen.android.networkmonitor.app.email; import android.annotation.TargetApi; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.support.v14.preference.MultiSelectListPreference; import android.support.v7.app.AppCompatActivity; import android.support.v7.preference.EditTextPreference; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceManager; import android.text.TextUtils; import android.text.format.DateUtils; import java.util.ArrayList; import java.util.List; import java.util.Set; import ca.rmen.android.networkmonitor.Constants; import ca.rmen.android.networkmonitor.R; import ca.rmen.android.networkmonitor.app.dialog.DialogFragmentFactory; import ca.rmen.android.networkmonitor.app.email.EmailPreferences.EmailConfig; import ca.rmen.android.networkmonitor.app.prefs.NetMonPreferenceFragmentCompat; import ca.rmen.android.networkmonitor.util.Log; @TargetApi(14) public class EmailPreferencesActivity extends AppCompatActivity { private static final String TAG = Constants.TAG + EmailPreferencesActivity.class.getSimpleName(); private NetMonPreferenceFragmentCompat mPreferenceFragment; @Override protected void onCreate(Bundle savedInstanceState) { Log.v(TAG, "onCreate"); super.onCreate(savedInstanceState); if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true); mPreferenceFragment = NetMonPreferenceFragmentCompat.newInstance(R.xml.email_preferences); getSupportFragmentManager(). beginTransaction(). replace(android.R.id.content, mPreferenceFragment). commit(); getSupportFragmentManager().executePendingTransactions(); updatePreferenceSummary(EmailPreferences.PREF_EMAIL_REPORT_FORMATS, R.string.pref_summary_email_report_formats); updatePreferenceSummary(EmailPreferences.PREF_EMAIL_RECIPIENTS, R.string.pref_summary_email_recipients); updatePreferenceSummary(EmailPreferences.PREF_EMAIL_SERVER, R.string.pref_summary_email_server); updatePreferenceSummary(EmailPreferences.PREF_EMAIL_PORT, R.string.pref_summary_email_port); updatePreferenceSummary(EmailPreferences.PREF_EMAIL_USER, R.string.pref_summary_email_user); updatePreferenceSummary(EmailPreferences.PREF_EMAIL_LAST_EMAIL_SENT, R.string.pref_summary_email_last_email_sent); mPreferenceFragment.findPreference(EmailPreferences.PREF_EMAIL_REPORT_FORMATS).setOnPreferenceChangeListener(mOnPreferenceChangeListener); } @Override protected void onStart() { Log.v(TAG, "onStart"); super.onStart(); PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener); } @Override public void onBackPressed() { Log.v(TAG, "onBackPressed"); int emailInterval = EmailPreferences.getInstance(this).getEmailReportInterval(); // If the user enabled sending e-mails, make sure we have enough info. if (emailInterval > 0) { EmailConfig emailConfig = EmailPreferences.getInstance(this).getEmailConfig(); if (!emailConfig.isValid()) { ListPreference preference = (ListPreference) mPreferenceFragment.findPreference(EmailPreferences.PREF_EMAIL_INTERVAL); preference.setValue("0"); DialogFragmentFactory.showInfoDialog(this, getString(R.string.missing_email_settings_info_dialog_title), getString(R.string.missing_email_settings_info_dialog_message)); updatePreferenceSummary(EmailPreferences.PREF_EMAIL_INTERVAL, R.string.pref_summary_email_report_interval); return; } } super.onBackPressed(); } @Override protected void onStop() { Log.v(TAG, "onStop"); PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener); super.onStop(); } private final OnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener = (sharedPreferences, key) -> { Log.v(TAG, "onSharedPreferenceChanged: key = " + key); if (EmailPreferences.PREF_EMAIL_RECIPIENTS.equals(key)) { updatePreferenceSummary(EmailPreferences.PREF_EMAIL_RECIPIENTS, R.string.pref_summary_email_recipients); } else if (EmailPreferences.PREF_EMAIL_REPORT_FORMATS.equals(key)) { updatePreferenceSummary(EmailPreferences.PREF_EMAIL_REPORT_FORMATS, R.string.pref_summary_email_report_formats); } else if (EmailPreferences.PREF_EMAIL_SERVER.equals(key)) { updatePreferenceSummary(EmailPreferences.PREF_EMAIL_SERVER, R.string.pref_summary_email_server); } else if (EmailPreferences.PREF_EMAIL_PORT.equals(key)) { updatePreferenceSummary(EmailPreferences.PREF_EMAIL_PORT, R.string.pref_summary_email_port); } else if (EmailPreferences.PREF_EMAIL_USER.equals(key)) { updatePreferenceSummary(EmailPreferences.PREF_EMAIL_USER, R.string.pref_summary_email_user); } else if (EmailPreferences.PREF_EMAIL_LAST_EMAIL_SENT.equals(key)) { updatePreferenceSummary(EmailPreferences.PREF_EMAIL_LAST_EMAIL_SENT, R.string.pref_summary_email_last_email_sent); } }; /** * @return a String containing the user-friendly names of the values selected by the user. */ private String getSummary(MultiSelectListPreference preference, Set<String> values) { List<CharSequence> result = new ArrayList<>(); CharSequence[] entries = preference.getEntries(); for (String value : values) { int index = preference.findIndexOfValue(value); result.add(entries[index]); } return TextUtils.join(", ", result); } private void updatePreferenceSummary(CharSequence key, int summaryResId) { Preference pref = mPreferenceFragment.findPreference(key); CharSequence value; if (key.equals(EmailPreferences.PREF_EMAIL_LAST_EMAIL_SENT)) { long lastEmailSent = EmailPreferences.getInstance(this).getLastEmailSent(); if (lastEmailSent > 0) value = DateUtils.formatDateTime(this, lastEmailSent, DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_YEAR); else value = getString(R.string.pref_value_email_report_interval_never); } else if (pref instanceof EditTextPreference) value = ((EditTextPreference) pref).getText(); else if (pref instanceof MultiSelectListPreference) value = getSummary((MultiSelectListPreference) pref, ((MultiSelectListPreference) pref).getValues()); else if (pref instanceof ListPreference) value = ((ListPreference)pref).getEntry(); else return; String summary = getString(summaryResId, value); pref.setSummary(summary); } /** * The OnSharedPreferenceChangeListener is not always called for the MultiSelectListPreference. * Because of this, we set a listener directly on the MultiSelectListPreference. * http://stackoverflow.com/questions/22388683/multiselectlistpreference-onsharedpreferencechanged-not-called-after-first-time */ private final Preference.OnPreferenceChangeListener mOnPreferenceChangeListener = (preference, newValue) -> { Log.v(TAG, "onPreferenceChange: preference = " + preference + ", newValue = " + newValue); if (EmailPreferences.PREF_EMAIL_REPORT_FORMATS.equals(preference.getKey())) { @SuppressWarnings("unchecked") String valueStr = getSummary((MultiSelectListPreference) preference, (Set<String>) newValue); String summary = getString(R.string.pref_summary_email_report_formats, valueStr); preference.setSummary(summary); } return true; }; }