package com.eolwral.osmonitor.preference; import android.content.Intent; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; import com.eolwral.osmonitor.OSMonitorService; import com.eolwral.osmonitor.R; import com.eolwral.osmonitor.ipc.IpcService; import com.eolwral.osmonitor.settings.Settings; import com.eolwral.osmonitor.settings.SettingsHelper; import com.eolwral.osmonitor.util.CoreUtil; import net.margaritov.preference.colorpicker.ColorPickerPreference; public class OSMPreference extends PreferenceActivity { private SettingsHelper helper = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // reload settings helper = new SettingsHelper(this); // add layout addPreferencesFromResource(R.xml.ui_preference_main); // initial preferences initPreferences(); } private void initPreferences() { PreferenceScreen prefScreen = getPreferenceScreen(); if (prefScreen != null) { // Disable start on boot feature if application installed on extra storage Preference prefAutoStart = prefScreen.findPreference(Settings.PREFERENCE_AUTOSTART); if ((helper.getBoolean(Settings.PREFERENCE_CPUUSAGE, false) || helper.getBoolean(Settings.PREFERENCE_SHORTCUT, false)) && !CoreUtil.isExtraStroage(this)) { prefAutoStart.setEnabled(true); } else { prefAutoStart.setEnabled(false); } // notification color is disabled on Lollipop if (CoreUtil.isGreaterThanMarshmallow()) { Preference prefColor = prefScreen.findPreference(Settings.PREFERENCE_COLOR); if (getParent(prefColor) != null) getParent(prefColor).removePreference(prefColor); } preparePreferenceScreen(prefScreen); } } /* Thanks fo Stanislav Bokach http://stackoverflow.com/questions/6177244/how-do-i-get-the-category-of-an-android-preference */ private PreferenceGroup getParent(Preference preference) { return getParent(getPreferenceScreen(), preference); } private PreferenceGroup getParent(PreferenceGroup root, Preference preference) { for (int i = 0; i < root.getPreferenceCount(); i++) { Preference p = root.getPreference(i); if (p == preference) return root; if (PreferenceGroup.class.isInstance(p)) { PreferenceGroup parent = getParent((PreferenceGroup)p, preference); if (parent != null) return parent; } } return null; } private void preparePreferenceScreen(PreferenceScreen prefScreen) { int prefCategoryCount = prefScreen.getPreferenceCount(); for (int checkCategoryItem = 0; checkCategoryItem < prefCategoryCount; checkCategoryItem++) { // lookup all subitems if (prefScreen.getPreference(checkCategoryItem) instanceof PreferenceCategory) { PreferenceCategory prefCategory = (PreferenceCategory) prefScreen .getPreference(checkCategoryItem); if (prefCategory == null) continue; preparePreferenceCategory(prefCategory); } else { preparePreferenceItem(prefScreen.getPreference(checkCategoryItem)); } } } private void preparePreferenceCategory(PreferenceCategory prefCategory) { // lookup all preferences for (int checkItem = 0; checkItem < prefCategory.getPreferenceCount(); checkItem++) { android.preference.Preference pref = prefCategory .getPreference(checkItem); if (pref == null) continue; preparePreferenceItem(pref); } return; } private void preparePreferenceItem(android.preference.Preference pref) { // set value if (pref instanceof CheckBoxPreference) { ((CheckBoxPreference) pref).setChecked(helper.getBoolean(pref.getKey(), false)); } else if (pref instanceof ListPreference) { ((ListPreference) pref).setValue(helper.getString(pref.getKey(), "")); } else if (pref instanceof ColorPickerPreference) { int defaultColor = helper.getInteger(pref.getKey(), 0x00000000); if (defaultColor != 0x00000000) ((ColorPickerPreference) pref).setColor(defaultColor); } // bind event if (pref instanceof PreferenceScreen) pref.setOnPreferenceClickListener(new preferencScreenChangeListener()); else pref.setOnPreferenceChangeListener(new preferencChangeListener()); } private class preferencScreenChangeListener implements OnPreferenceClickListener { @Override public boolean onPreferenceClick(android.preference.Preference prefSubScreen) { PreferenceScreen prefScreen = (PreferenceScreen) prefSubScreen; for (int checkItem = 0; checkItem < prefScreen.getPreferenceCount(); checkItem++) { android.preference.Preference pref = prefScreen .getPreference(checkItem); if (pref == null) continue; preparePreferenceItem(pref); } return false; } } private class preferencChangeListener implements OnPreferenceChangeListener { @Override public boolean onPreferenceChange(android.preference.Preference preference, Object newValue) { if (!onPrePreferenceCheck(preference.getKey())) return false; if (preference instanceof CheckBoxPreference) { helper.setBoolean(preference.getKey(), (Boolean) newValue); } else if (preference instanceof ListPreference) { helper.setString(preference.getKey(), (String) newValue); } else if (preference instanceof ColorPickerPreference) { helper.setInteger(preference.getKey(), (Integer) newValue); } else if (preference instanceof ProcessorPreference) { helper.setString(preference.getKey(), (String) newValue); } // force read value from content provider helper.clearCache(); onPostPreferenceCheck(preference.getKey()); return true; } } private boolean onPostPreferenceCheck(String key) { // Disable start on boot feature if application installed on extra storage if (key.equals(Settings.PREFERENCE_CPUUSAGE) || key.equals(Settings.PREFERENCE_SHORTCUT)) { CheckBoxPreference prefAutoStart = (CheckBoxPreference) getPreferenceScreen() .findPreference(Settings.PREFERENCE_AUTOSTART); if ((helper.getBoolean(Settings.PREFERENCE_CPUUSAGE, false) || helper.getBoolean(Settings.PREFERENCE_SHORTCUT, false)) && !CoreUtil.isExtraStroage(this)) { prefAutoStart.setEnabled(true); } else { prefAutoStart.setEnabled(false); } } // check following option if changed if (key.equals(Settings.PREFERENCE_CPUUSAGE) || key.equals(Settings.PREFERENCE_COLOR) || key.equals(Settings.PREFERENCE_ROOT) || key.equals(Settings.PREFERENCE_TEMPVALUE) || key.equals(Settings.PREFERENCE_SHORTCUT) || key.equals(Settings.PREFERENCE_NOTIFICATION_COLOR) || key.equals(Settings.PREFERENCE_NOTIFICATION_BACKGROUND) || key.equals(Settings.PREFERENCE_NOTIFICATION_TOP) || key.equals(Settings.PREFERENCE_NOTIFICATION_CUSTOMIZE)) { if (key.equals(Settings.PREFERENCE_ROOT)) { IpcService.getInstance().forceExit(); IpcService.getInstance().createConnection(); } // prevent exit if (helper.getBoolean(Settings.PREFERENCE_CPUUSAGE, false) || helper.getBoolean(Settings.PREFERENCE_SHORTCUT, false)) { helper.setString(Settings.SESSION_SECTION, "Non-Exit"); } // restart background daemon getApplication().stopService( new Intent(getApplication(), OSMonitorService.class)); // restart notification if (helper.getBoolean(Settings.PREFERENCE_CPUUSAGE, false) || helper.getBoolean(Settings.PREFERENCE_SHORTCUT, false)) { getApplication().startService( new Intent(getApplication(), OSMonitorService.class)); } } return true; } public boolean onPrePreferenceCheck(String key) { if (key.equals(Settings.PREFERENCE_ROOT) && !helper.getBoolean(Settings.PREFERENCE_ROOT, false)) { if (CoreUtil.preCheckRoot() == false) return false; } return true; } }