package com.gettingmobile.goodnews.settings; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; import com.gettingmobile.android.app.actions.Action; import com.gettingmobile.android.app.actions.ActionContext; import com.gettingmobile.goodnews.Application; public final class SettingsFragment extends PreferenceFragment implements ActionContext<Application>, SettingsManager, PreferenceActionController.PreferenceProvider { protected static final String ARG_SETTINGS_HANDLER = "settingsHandler"; protected final PreferenceActionController actionController = new PreferenceActionController(this, this); private SettingsHandler settingsHandler = null; /* * helpers */ private SettingsHandler createSettingsHandler() { try { final Class<?> settingsHandlerClass = Class.forName( SettingsHandler.class.getPackage().getName() + "." + getArguments().getString(ARG_SETTINGS_HANDLER)); return (SettingsHandler) settingsHandlerClass.newInstance(); } catch (Exception ex) { throw new RuntimeException("Failed to create SettingsHandler", ex); } } /* * life cycle */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); settingsHandler = createSettingsHandler(); for (int resId : settingsHandler.getPreferenceResourceIds()) { addPreferencesFromResource(resId); } /* * We are using a trick for all the view settings to provide them all as preference screen in the global * settings, they are each wrapped into a preference screen which we would like to omit if they are used * standalone, which is the case here. So we take the single preference entry and -- if it is a preference * screen -- set it as the preference root. */ final PreferenceScreen currentRoot = getPreferenceScreen(); if (currentRoot.getPreferenceCount() == 1) { final Preference singlePref = currentRoot.getPreference(0); if (singlePref instanceof PreferenceScreen) { setPreferenceScreen((PreferenceScreen) singlePref); } } settingsHandler.setup(this); updateActionPreferenceStatus(); } @Override public void onDestroy() { settingsHandler.cleanup(); super.onDestroy(); } /* * event handling */ @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { return actionController.fireAction(preference.getKey()) || super.onPreferenceTreeClick(preferenceScreen, preference); } /* * interface implementation */ private SettingsActivity getSettingsActivity() { return (SettingsActivity) getActivity(); } @Override public Application getApp() { return getSettingsActivity().getApp(); } @Override public void showWaitDialog() { getSettingsActivity().showWaitDialog(); } @Override public void dismissWaitDialog() { getSettingsActivity().dismissWaitDialog(); } @Override public ActionContext<Application> getActionContext() { return this; } @Override public void registerChangeListener(String key, Preference.OnPreferenceChangeListener l) { final Preference pref = findPreference(key); pref.setOnPreferenceChangeListener(l); } @Override public void registerAction(String key, Action<?> action) { actionController.registerAction(key, action); } @Override public <A extends Action<?>> A registerAction(String key, Class<A> actionClass) { return actionController.registerAction(key, actionClass); } @Override public void unregisterAction(String key) { actionController.unregisterAction(key); } @Override public void updateActionPreferenceStatus() { //noinspection unchecked new AsyncTask<Object, Object, Object>() { @Override protected Object doInBackground(Object... objects) { final Activity activity = getActivity(); if (activity != null && !activity.isFinishing()) { activity.runOnUiThread(new Runnable() { @Override public void run() { actionController.updateActionPreferenceStatus(); } }); } return null; } }.execute(); } }