/*
* Copyright (C) 2013 - 2014 Alexander "Evisceration" Martinz
*
* 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 org.namelessrom.devicecontrol.modules.performance.sub;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;
import android.support.annotation.NonNull;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import org.namelessrom.devicecontrol.DeviceConstants;
import org.namelessrom.devicecontrol.R;
import org.namelessrom.devicecontrol.actions.ActionProcessor;
import org.namelessrom.devicecontrol.hardware.UksmUtils;
import org.namelessrom.devicecontrol.models.BootupConfig;
import org.namelessrom.devicecontrol.preferences.AwesomeTogglePreference;
import org.namelessrom.devicecontrol.preferences.CustomListPreference;
import org.namelessrom.devicecontrol.preferences.CustomPreference;
import org.namelessrom.devicecontrol.utils.DialogHelper;
import org.namelessrom.devicecontrol.utils.Utils;
import org.namelessrom.devicecontrol.views.AttachPreferenceFragment;
import java.util.ArrayList;
import java.util.List;
/*
abundant_threshold
cpu_governor [full] medium low quiet
cpu_ratios 20 40 MAX/4 MAX/1
ema_per_page_time
eval_intervals
full_scans
hash_strength
max_cpu_percentage
pages_scanned
pages_shared
pages_sharing
pages_unshared
run
sleep_millisecs
sleep_times
thrash_threshold
*/
public class UksmFragment extends AttachPreferenceFragment implements Preference.OnPreferenceChangeListener {
//----------------------------------------------------------------------------------------------
private PreferenceScreen mRoot;
//----------------------------------------------------------------------------------------------
private CustomPreference mPagesShared;
private CustomPreference mPagesScanned;
private CustomPreference mFullScans;
private CustomPreference mHashStrength;
private CustomPreference mPagesSharing;
private CustomPreference mSleepTimes;
//----------------------------------------------------------------------------------------------
private AwesomeTogglePreference mEnable;
private CustomPreference mSleep;
private CustomListPreference mCpuGovernor;
@Override protected int getFragmentId() { return DeviceConstants.ID_UKSM; }
@Override public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.extras_uksm);
setHasOptionsMenu(true);
mRoot = getPreferenceScreen();
PreferenceCategory category;
String tmpString;
//------------------------------------------------------------------------------------------
// UKSM-Informations
//------------------------------------------------------------------------------------------
category = (PreferenceCategory) findPreference("uksm_info");
if (category != null) {
mPagesShared = (CustomPreference) findPreference("uksm_pages_shared");
if (mPagesShared != null) {
if (!Utils.fileExists(UksmUtils.UKSM_PAGES_SHARED)) {
category.removePreference(mPagesShared);
}
}
mPagesScanned = (CustomPreference) findPreference("uksm_pages_scanned");
if (mPagesScanned != null) {
if (!Utils.fileExists(UksmUtils.UKSM_PAGES_SCANNED)) {
category.removePreference(mPagesScanned);
}
}
mFullScans = (CustomPreference) findPreference("uksm_full_scans");
if (mFullScans != null) {
if (!Utils.fileExists(UksmUtils.UKSM_FULL_SCANS)) {
category.removePreference(mFullScans);
}
}
mHashStrength = (CustomPreference) findPreference("uksm_hash_strength");
if (mHashStrength != null) {
if (!Utils.fileExists(UksmUtils.UKSM_HASH_STRENGTH)) {
category.removePreference(mHashStrength);
}
}
mPagesSharing = (CustomPreference) findPreference("uksm_pages_sharing");
if (mPagesSharing != null) {
if (!Utils.fileExists(UksmUtils.UKSM_PAGES_SHARING)) {
category.removePreference(mPagesSharing);
}
}
mSleepTimes = (CustomPreference) findPreference("uksm_sleep_times");
if (mSleepTimes != null) {
if (!Utils.fileExists(UksmUtils.UKSM_SLEEP_TIMES)) {
category.removePreference(mSleepTimes);
}
}
new RefreshTask().execute();
}
removeIfEmpty(category);
//------------------------------------------------------------------------------------------
// UKSM-Tweakables
//------------------------------------------------------------------------------------------
category = (PreferenceCategory) findPreference("uksm_settings");
if (category != null) {
mEnable = (AwesomeTogglePreference) findPreference("uksm_run");
if (mEnable != null) {
if (mEnable.isSupported()) {
mEnable.initValue();
mEnable.setOnPreferenceChangeListener(this);
} else {
category.removePreference(mEnable);
}
}
mSleep = (CustomPreference) findPreference("uksm_sleep");
if (mSleep != null) {
if (Utils.fileExists(UksmUtils.UKSM_SLEEP)) {
tmpString = Utils.readOneLine(UksmUtils.UKSM_SLEEP);
mSleep.setSummary(tmpString);
} else {
category.removePreference(mSleep);
}
}
mCpuGovernor = (CustomListPreference) findPreference("uksm_governor");
if (mCpuGovernor != null) {
if (Utils.fileExists(UksmUtils.UKSM_CPU_GOV)) {
final String[] uksm_cpu_governors = UksmUtils.get().getAvailableCpuGovernors();
final String uksm_cpu_governor = UksmUtils.get().getCurrentCpuGovernor();
mCpuGovernor.setEntries(uksm_cpu_governors);
mCpuGovernor.setEntryValues(uksm_cpu_governors);
mCpuGovernor.setSummary(uksm_cpu_governor);
mCpuGovernor.setValue(uksm_cpu_governor);
mCpuGovernor.setOnPreferenceChangeListener(this);
} else {
category.removePreference(mSleep);
}
}
}
removeIfEmpty(category);
isSupported(mRoot, getActivity());
}
private void removeIfEmpty(final PreferenceCategory preferenceCategory) {
if (mRoot != null && preferenceCategory.getPreferenceCount() == 0) {
mRoot.removePreference(preferenceCategory);
}
}
@Override public boolean onPreferenceTreeClick(final PreferenceScreen preferenceScreen,
@NonNull final Preference preference) {
if (mSleep == preference) {
final String title = String.valueOf(mSleep.getTitle());
final int currentProgress = Utils.parseInt(Utils.readOneLine(UksmUtils.UKSM_SLEEP));
DialogHelper.openSeekbarDialog(getActivity(), currentProgress, title, 50,
1000, preference, UksmUtils.UKSM_SLEEP, BootupConfig.CATEGORY_EXTRAS);
return true;
}
return false;
}
@Override public boolean onPreferenceChange(final Preference preference, final Object o) {
if (mEnable == preference) {
mEnable.writeValue((Boolean) o);
return true;
} else if (mCpuGovernor == preference) {
final String value = String.valueOf(o);
mCpuGovernor.setSummary(value);
ActionProcessor.processAction(ActionProcessor.ACTION_UKSM_GOVERNOR, value, true);
return true;
}
return false;
}
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_refresh, menu);
}
@Override public boolean onOptionsItemSelected(final MenuItem item) {
final int id = item.getItemId();
switch (id) {
case R.id.menu_action_refresh:
new RefreshTask().execute();
break;
}
return false;
}
private class RefreshTask extends AsyncTask<Void, Void, List<String>> {
@Override protected List<String> doInBackground(Void... params) {
final ArrayList<String> list = new ArrayList<>();
list.add(Utils.readOneLine(UksmUtils.UKSM_PAGES_SHARED)); // 0
list.add(Utils.readOneLine(UksmUtils.UKSM_PAGES_SCANNED)); // 1
list.add(Utils.readOneLine(UksmUtils.UKSM_FULL_SCANS)); // 2
list.add(Utils.readOneLine(UksmUtils.UKSM_HASH_STRENGTH)); // 3
list.add(Utils.readOneLine(UksmUtils.UKSM_PAGES_SHARING)); // 4
list.add(Utils.readOneLine(UksmUtils.UKSM_SLEEP_TIMES)); // 5
return list;
}
@Override protected void onPostExecute(final List<String> strings) {
if (isAdded()) {
String tmp;
if (mPagesShared != null) {
tmp = strings.get(0);
mPagesShared.setSummary(tmp);
}
if (mPagesScanned != null) {
tmp = strings.get(1);
mPagesScanned.setSummary(tmp);
}
if (mFullScans != null) {
tmp = strings.get(2);
mFullScans.setSummary(tmp);
}
if (mHashStrength != null) {
tmp = strings.get(3);
mHashStrength.setSummary(tmp);
}
if (mPagesSharing != null) {
tmp = strings.get(4);
mPagesSharing.setSummary(tmp);
}
if (mSleepTimes != null) {
tmp = strings.get(5);
mSleepTimes.setSummary(tmp);
}
}
}
}
}