Java tutorial
/* Copyright (C) 2010 Ben Van Daele (vandaeleben@gmail.com) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package be.benvd.mvforandroid; import java.io.IOException; import org.json.JSONException; import be.benvd.mvforandroid.data.MVDataService; import com.commonsware.cwac.wakeful.WakefulIntentService; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceManager; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.util.Log; public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener, OnPreferenceClickListener { public static final String OPEN_APP = "0"; public static final String UPDATE_DATA = "1"; public static final String WIDGET_ACTION = "widget_action"; private Preference autoCreditPreference; private Preference autoUsagePreference; private Preference autoTopupsPreference; private Preference updateFrequencyPreference; private Preference widgetActionPreference; private ListPreference selectMsisdnPreference; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); findPreferences(); selectMsisdnPreference.setOnPreferenceClickListener(this); updatePreferences(); } @Override protected void onResume() { super.onResume(); getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override protected void onPause() { super.onPause(); getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { if (key.equals("auto_credit") || key.equals("auto_usage") || key.equals("auto_topups")) { switch (getNumEnabledAutoUpdates(prefs)) { case 0: { // An auto update preference has changed, and as a result // none of them are enabled anymore. This // means // we don't need to auto update anything and we can stop the // service. stopService(); break; } case 1: { // At this point, exactly one of the auto updates is // enabled, so the possibility exists that it was // enabled just now, and as such that the service is stopped // and needs to be rescheduled. In other // words, if the currently modified preference is enabled, // it is also the *only* auto update // preference // that is enabled. Therefore the service has to be started. if (prefs.getBoolean(key, false)) startService(); break; } } } if (key.equals("auto_credit")) { updateCreditPreference(prefs); } else if (key.equals("auto_usage")) { updateUsagePreference(prefs); } else if (key.equals("auto_topups")) { updateTopupsPreference(prefs); } else if (key.equals("update_frequency")) { updateFrequencyPreference(); if (getNumEnabledAutoUpdates(prefs) != 0) { stopService(); startService(); } } else if (key.equals(WIDGET_ACTION)) { updateWidgetActionPreference(); } else if (key.equals("select_msisdn")) { updateSelectMsisdnPreference(); } } private void findPreferences() { autoCreditPreference = getPreferenceScreen().findPreference("auto_credit"); autoUsagePreference = getPreferenceScreen().findPreference("auto_usage"); autoTopupsPreference = getPreferenceScreen().findPreference("auto_topups"); updateFrequencyPreference = getPreferenceScreen().findPreference("update_frequency"); widgetActionPreference = getPreferenceScreen().findPreference(WIDGET_ACTION); selectMsisdnPreference = (ListPreference) getPreferenceScreen().findPreference("select_msisdn"); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); String[] msisdns = new String[1]; msisdns[0] = prefs.getString("select_msisdn", "none"); selectMsisdnPreference.setEntries(msisdns); selectMsisdnPreference.setEntryValues(msisdns); } private void updatePreferences() { updateCreditPreference(getPreferenceScreen().getSharedPreferences()); updateUsagePreference(getPreferenceScreen().getSharedPreferences()); updateTopupsPreference(getPreferenceScreen().getSharedPreferences()); updateFrequencyPreference(); updateWidgetActionPreference(); updateSelectMsisdnPreference(); } private int getNumEnabledAutoUpdates(SharedPreferences prefs) { int result = 0; if (prefs.getBoolean("auto_credit", false)) result++; if (prefs.getBoolean("auto_usage", false)) result++; if (prefs.getBoolean("auto_topups", false)) result++; return result; } private void updateCreditPreference(SharedPreferences sharedPreferences) { boolean autoCredit = sharedPreferences.getBoolean("auto_credit", false); autoCreditPreference.setSummary(autoCredit ? getString(R.string.settings_auto_credit_enabled) : getString(R.string.settings_auto_credit_disabled)); } private void updateUsagePreference(SharedPreferences sharedPreferences) { boolean autoUsage = sharedPreferences.getBoolean("auto_usage", false); autoUsagePreference.setSummary(autoUsage ? getString(R.string.settings_auto_usage_enabled) : getString(R.string.settings_auto_usage_disabled)); } private void updateTopupsPreference(SharedPreferences sharedPreferences) { boolean autoTopups = sharedPreferences.getBoolean("auto_topups", false); autoTopupsPreference.setSummary(autoTopups ? getString(R.string.settings_auto_topups_enabled) : getString(R.string.settings_auto_topups_disabled)); } private void updateFrequencyPreference() { updateFrequencyPreference.setSummary( getString(R.string.settings_frequency, ((ListPreference) updateFrequencyPreference).getEntry())); } private void updateWidgetActionPreference() { widgetActionPreference.setSummary( getString(R.string.settings_widget_action, ((ListPreference) widgetActionPreference).getEntry())); } private void updateSelectMsisdnPreference() { selectMsisdnPreference.setSummary( getString(R.string.settings_select_msisdn, ((ListPreference) selectMsisdnPreference).getEntry())); } private void stopService() { Intent stop = new Intent(this, MVDataService.class); stop.setAction(MVDataService.STOP_SERVICE); WakefulIntentService.sendWakefulWork(this, stop); } private void startService() { Intent start = new Intent(this, MVDataService.class); start.setAction(MVDataService.SCHEDULE_SERVICE); WakefulIntentService.sendWakefulWork(this, start); } @Override public boolean onPreferenceClick(Preference preference) { startService(); MVDataService service = MVDataService.getInstance(); String[] msisdns; try { msisdns = service.getMsisdnList(); ((ListPreference) preference).setEntries(msisdns); ((ListPreference) preference).setEntryValues(msisdns); return true; } catch (JSONException e) { Log.e(MVDataService.class.getSimpleName(), "Exception in onPreferenceClick", e); } catch (IOException e) { Log.e(MVDataService.class.getSimpleName(), "Exception in onPreferenceClick", e); } return false; } }