package com.bel.android.dspmanager.activity; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import com.bel.android.dspmanager.R; import com.bel.android.dspmanager.preference.EqualizerPreference; import com.bel.android.dspmanager.preference.SummariedListPreference; import com.bel.android.dspmanager.service.HeadsetService; /** * This class implements a general PreferencesActivity that we can use to * adjust DSP settings. It adds a menu to clear the preferences on this page, * and a listener that ensures that our {@link HeadsetService} is running if * required. * * @author alankila */ public final class DSPScreen extends PreferenceFragment { protected static final String TAG = DSPScreen.class.getSimpleName(); public static final String PREF_KEY_EQ = "dsp.tone.eq"; public static final String PREF_KEY_CUSTOM_EQ = "dsp.tone.eq.custom"; public static final String EQ_VALUE_CUSTOM = "custom"; private final OnSharedPreferenceChangeListener listener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { /* If the listpref is updated, copy the changed setting to the eq. */ if (PREF_KEY_EQ.equals(key)) { String newValue = prefs.getString(key, null); if (!EQ_VALUE_CUSTOM.equals(newValue)) { prefs.edit().putString(PREF_KEY_CUSTOM_EQ, newValue).commit(); /* Now tell the equalizer that it must display something else. */ EqualizerPreference eq = (EqualizerPreference) findPreference(PREF_KEY_CUSTOM_EQ); eq.refreshFromPreference(); } } /* If the equalizer surface is updated, select matching pref entry or "custom". */ if (PREF_KEY_CUSTOM_EQ.equals(key)) { String newValue = prefs.getString(key, null); String desiredValue = EQ_VALUE_CUSTOM; SummariedListPreference preset = (SummariedListPreference) findPreference(PREF_KEY_EQ); for (CharSequence entry : preset.getEntryValues()) { if (entry.equals(newValue)) { desiredValue = newValue; break; } } /* Tell listpreference that it must display something else. */ if (!desiredValue.equals(preset.getEntry())) { prefs.edit().putString(PREF_KEY_EQ, desiredValue).commit(); preset.refreshFromPreference(); } } getActivity().sendBroadcast(new Intent(DSPManager.ACTION_UPDATE_PREFERENCES)); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String config = getArguments().getString("config"); PreferenceManager prefMgr = getPreferenceManager(); prefMgr.setSharedPreferencesName(DSPManager.SHARED_PREFERENCES_BASENAME + "." + config); try { int xmlId = R.xml.class.getField(config + "_preferences").getInt(null); addPreferencesFromResource(xmlId); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } prefMgr.getSharedPreferences().registerOnSharedPreferenceChangeListener(listener); } @Override public void onDestroy() { super.onDestroy(); PreferenceManager prefMgr = getPreferenceManager(); prefMgr.getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener); } }