package com.dsht.kerneltweaker.fragments;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeoutException;
import com.dsht.kerneltweaker.CustomListPreference;
import com.dsht.kerneltweaker.CustomPreference;
import com.dsht.kerneltweaker.Helpers;
import com.dsht.kerneltweaker.ListViewMultiChoiceModeListener;
import com.dsht.kerneltweaker.MainActivity;
import com.dsht.kerneltweaker.R;
import com.dsht.kerneltweaker.database.DataItem;
import com.dsht.kerneltweaker.database.DatabaseHandler;
import com.dsht.kernetweaker.cmdprocessor.CMDProcessor;
import com.dsht.settings.SettingsFragment;
import com.stericson.RootTools.RootTools;
import com.stericson.RootTools.exceptions.RootDeniedException;
import com.stericson.RootTools.execution.CommandCapture;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.text.InputType;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.EditText;
import android.widget.ListView;
public class CpuPreferenceFragment extends PreferenceFragment implements OnPreferenceChangeListener, OnPreferenceClickListener {
private Context mContext;
private SharedPreferences mPrefs;
private CustomListPreference mCpuMaxFreq;
private CustomListPreference mCpuMinFreq;
private CustomListPreference mCpuGovernor;
private CustomPreference mAdvancedGovernor;
private PreferenceCategory mHotPlugCategory;
private CustomListPreference mCpuquiet;
private CustomPreference mAdvancedCpuquiet;
private PreferenceCategory mAdvancedCategory;
private PreferenceScreen mRoot;
private static final String MAX_FREQ_FILE = "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq";
private static final String GOVERNOR_FILE = "/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor";
private static final String MIN_FREQ_FILE = "/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq";
private static final String HOTPLUG_FILE ="/sys/devices/virtual/misc/mako_hotplug_control/";
private static final String CPUQUIET_DIR = "/sys/devices/system/cpu/cpuquiet";
private static final String CPUQUIET_FILE = "/sys/devices/system/cpu/cpuquiet/current_governor";
private static final String CPUQUIET_GOVERNORS = "/sys/devices/system/cpu/cpuquiet/available_governors";
private static final String category = "cpu";
private DatabaseHandler db = MainActivity.db;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_screen_cpu);
mContext = getActivity();
if(MainActivity.menu.isMenuShowing()) {
MainActivity.menu.toggle();
}
RootTools.isRootAvailable();
Helpers.setPermissions(MAX_FREQ_FILE);
Helpers.setPermissions(MIN_FREQ_FILE);
Helpers.setPermissions(GOVERNOR_FILE);
Helpers.setPermissions(HOTPLUG_FILE);
Helpers.setPermissions(CPUQUIET_FILE);
Helpers.setPermissions(CPUQUIET_DIR);
Helpers.setPermissions(CPUQUIET_GOVERNORS);
mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mRoot = (PreferenceScreen) findPreference("key_root");
mHotPlugCategory = (PreferenceCategory) findPreference("key_hotplug_category");
mCpuMaxFreq = (CustomListPreference) findPreference("key_cpu_max");
mCpuMinFreq = (CustomListPreference) findPreference("key_cpu_min");
mCpuGovernor = (CustomListPreference) findPreference("key_cpu_governor");
mAdvancedGovernor = (CustomPreference) findPreference("key_advanced_governor");
mAdvancedCpuquiet = (CustomPreference) findPreference("key_advanced_cpuquiet");
mCpuquiet = (CustomListPreference) findPreference("key_cpuquiet");
mAdvancedCategory = (PreferenceCategory) findPreference("key_advanced");
mAdvancedGovernor.setOnPreferenceClickListener(this);
mAdvancedCpuquiet.setOnPreferenceClickListener(this);
if(!new File(CPUQUIET_DIR).exists()) {
mAdvancedCategory.removePreference(mAdvancedCpuquiet);
}
String color = "";
if(MainActivity.mPrefs.getBoolean(SettingsFragment.KEY_ENABLE_GLOBAL, false)) {
int col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_GLOBAL_COLOR, Color.parseColor("#FFFFFF"));
color = "#"+Integer.toHexString(col);
}else if(mPrefs.getBoolean(SettingsFragment.KEY_ENABLE_PERSONAL, false)) {
int col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_CPU, Color.parseColor("#ff0099cc"));
color = "#"+Integer.toHexString(col);
}
else {
String col = mContext.getResources().getStringArray(R.array.menu_colors)[2];
color = col;
}
mCpuMaxFreq.setTitleColor(color);
mCpuMinFreq.setTitleColor(color);
mCpuGovernor.setTitleColor(color);
mAdvancedGovernor.setTitleColor(color);
mCpuquiet.setTitleColor(color);
mAdvancedCpuquiet.setTitleColor(color);
mCpuMaxFreq.setCategory(category);
mCpuMinFreq.setCategory(category);
mCpuGovernor.setCategory(category);
mCpuquiet.setCategory(category);
mCpuMaxFreq.setKey(MAX_FREQ_FILE);
mCpuMinFreq.setKey(MIN_FREQ_FILE);
mCpuGovernor.setKey(GOVERNOR_FILE);
mCpuquiet.setKey(CPUQUIET_FILE);
String[] frequencies = Helpers.getFrequencies();
String[] governors = Helpers.getGovernors();
String[] names = Helpers.getFrequenciesNames();
mCpuMaxFreq.setEntries(names);
mCpuMaxFreq.setEntryValues(frequencies);
mCpuMinFreq.setEntries(names);
mCpuMinFreq.setEntryValues(frequencies);
mCpuGovernor.setEntries(governors);
mCpuGovernor.setEntryValues(governors);
if(new File(CPUQUIET_DIR).exists()) {
String cpuquiet = Helpers.getFileContent(new File(CPUQUIET_GOVERNORS));
String[] cpuquiet_govs = cpuquiet.trim().replaceAll("\n", "").split(" ");
String currQuiet = Helpers.getFileContent(new File(CPUQUIET_FILE)).trim().replace("\n", "");
mCpuquiet.setSummary(currQuiet);
mCpuquiet.setEntries(cpuquiet_govs);
mCpuquiet.setEntryValues(cpuquiet_govs);
mCpuquiet.setValue(currQuiet);
} else {
mHotPlugCategory.removePreference(mCpuquiet);
}
if(new File(MAX_FREQ_FILE).exists()) {
mCpuMaxFreq.setSummary(Helpers.readOneLine(MAX_FREQ_FILE));
mCpuMaxFreq.setValue(mCpuMaxFreq.getSummary().toString());
}
if(new File(MIN_FREQ_FILE).exists()) {
mCpuMinFreq.setSummary(Helpers.readOneLine(MIN_FREQ_FILE));
mCpuMinFreq.setValue(mCpuMinFreq.getSummary().toString());
}
if(new File(GOVERNOR_FILE).exists()) {
Helpers.runRootCommand("chmod 655 /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor");
mCpuGovernor.setSummary(Helpers.getCurrentGovernor());
mCpuGovernor.setValue(mCpuGovernor.getSummary().toString());
}
mCpuMaxFreq.setOnPreferenceChangeListener(this);
mCpuMinFreq.setOnPreferenceChangeListener(this);
mCpuGovernor.setOnPreferenceChangeListener(this);
mAdvancedGovernor.excludeFromDialog(true);
mCpuquiet.setOnPreferenceChangeListener(this);
if(new File(HOTPLUG_FILE).exists()) {
createPreference(mHotPlugCategory,new File(HOTPLUG_FILE+"cores_on_touch"), color );
createPreference(mHotPlugCategory,new File(HOTPLUG_FILE+"first_level"), color );
}
if(mHotPlugCategory.getPreferenceCount() == 0) {
mRoot.removePreference(mHotPlugCategory);
}
mAdvancedCpuquiet.hideBoot(true);
mAdvancedGovernor.hideBoot(true);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View v = inflater.inflate(R.layout.layout_list, container,false);
return v;
}
@Override
public boolean onPreferenceChange(Preference pref, Object newValue) {
// TODO Auto-generated method stub
if(pref == mCpuMaxFreq) {
String value = (String) newValue;
mCpuMaxFreq.setSummary(value);
mCpuMaxFreq.setValue(value);
CMDProcessor.runSuCommand("echo "+value+" > "+MAX_FREQ_FILE);
updateListDb(pref, value, ((CustomListPreference) pref).isBootChecked());
}
if(pref == mCpuMinFreq) {
String value = (String) newValue;
mCpuMinFreq.setSummary(value);
mCpuMinFreq.setValue(value);
CMDProcessor.runSuCommand("echo "+value+" > "+MIN_FREQ_FILE);
updateListDb(pref, value,((CustomListPreference) pref).isBootChecked());
}
if(pref == mCpuGovernor) {
String value = ((String)newValue).trim().replaceAll(" ", "").replaceAll("\n", "");
mCpuGovernor.setSummary(value);
mCpuGovernor.setValue(value);
CMDProcessor.runSuCommand("echo "+value+" > "+GOVERNOR_FILE);
updateListDb(pref, value, ((CustomListPreference) pref).isBootChecked());
}
if(pref == mCpuquiet) {
String value = (String) newValue;
mCpuquiet.setSummary(value);
mCpuquiet.setValue(value);
CMDProcessor.runSuCommand("echo "+value+" > "+CPUQUIET_FILE);
updateListDb(pref, value, ((CustomListPreference) pref).isBootChecked());
}
return false;
}
@Override
public boolean onPreferenceClick(Preference pref) {
// TODO Auto-generated method stub
Fragment f = null;
if(pref == mAdvancedGovernor) {
f = new CpuGovernorPreferenceFragment();
}
if(pref == mAdvancedCpuquiet) {
f = new CpuquietGovernorPreferenceFragment();
}
FragmentTransaction ft = getFragmentManager().beginTransaction();
// This adds the newly created Preference fragment to my main layout, shown below
ft.replace(R.id.activity_container,f);
// By hiding the main fragment, transparency isn't an issue
ft.addToBackStack("TAG");
ft.commit();
return false;
}
private void createPreference(PreferenceCategory mCategory, File file, String color) {
String fileName = file.getName();
String filePath = file.getAbsolutePath();
final String fileContent = Helpers.getFileContent(file);
final CustomPreference pref = new CustomPreference(mContext, false, category);
pref.setTitle(fileName);
pref.setTitleColor(color);
pref.setSummary(fileContent);
pref.setKey(filePath);
Log.d("CONTENT", fileContent);
mCategory.addPreference(pref);
pref.setOnPreferenceClickListener(new OnPreferenceClickListener(){
@Override
public boolean onPreferenceClick(final Preference p) {
// TODO Auto-generated method stub
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
LayoutInflater inflater = getActivity().getLayoutInflater();
View v = inflater.inflate(R.layout.dialog_layout, null, false);
final EditText et = (EditText) v.findViewById(R.id.et);
String val = p.getSummary().toString();
et.setText(val);
et.setRawInputType(InputType.TYPE_CLASS_NUMBER);
et.setGravity(Gravity.CENTER_HORIZONTAL);
builder.setView(v);
builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
String value = et.getText().toString();
p.setSummary(value);
Log.d("TEST", "echo "+value+" > "+ p.getKey());
CMDProcessor.runSuCommand("echo "+value+" > "+p.getKey());
updateListDb(pref, value, pref.isBootChecked());
}
} );
AlertDialog dialog = builder.create();
dialog.show();
dialog.getWindow().getAttributes().windowAnimations = R.style.dialog_animation;
Window window = dialog.getWindow();
window.setLayout(800, LayoutParams.WRAP_CONTENT);
return true;
}
});
}
private void updateListDb(final Preference p, final String value, final boolean isChecked) {
class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
if(isChecked) {
List<DataItem> items = db.getAllItems();
for(DataItem item : items) {
if(item.getName().equals("'"+p.getKey()+"'")) {
db.deleteItemByName("'"+p.getKey()+"'");
}
}
db.addItem(new DataItem("'"+p.getKey()+"'", value, p.getTitle().toString(), category));
} else {
if(db.getContactsCount() != 0) {
db.deleteItemByName("'"+p.getKey()+"'");
}
}
return "Executed";
}
@Override
protected void onPostExecute(String result) {
}
}
new LongOperation().execute();
}
}