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.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.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;
public class GpuPreferenceFragment extends PreferenceFragment implements OnPreferenceChangeListener {
private Context mContext;
private SharedPreferences mPrefs;
private CustomListPreference mGpuFrequency;
private PreferenceCategory mCategory;
private static final String GPU_FREQUENCIES_FILE = "/sys/class/kgsl/kgsl-3d0/gpu_available_frequencies";
private static final String GPU_FOLDER = "/sys/class/kgsl/";
private static final String GPU_MAX_FREQ_FILE = "/sys/class/kgsl/kgsl-3d0/max_gpuclk";
private String color;
private PreferenceScreen mRoot;
private DatabaseHandler db = MainActivity.db;
private static final String category = "gpu";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_screen_gpu);
mContext = getActivity();
if(MainActivity.menu.isMenuShowing()) {
MainActivity.menu.toggle();
}
Helpers.setPermissions(GPU_FREQUENCIES_FILE);
Helpers.setPermissions(GPU_MAX_FREQ_FILE);
Helpers.setPermissions(GPU_FOLDER);
mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mCategory = (PreferenceCategory) findPreference("key_gpu_category");
mGpuFrequency = (CustomListPreference) findPreference("key_gpu_frequency");
mRoot = (PreferenceScreen) findPreference("key_root");
mGpuFrequency.setOnPreferenceChangeListener(this);
//mGpuFrequency.setSummary(mPrefs.getString(mGpuFrequency.getKey(), "Set GPU maximum frequency"));
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_GPU, Color.parseColor("#ff0099cc"));
color = "#"+Integer.toHexString(col);
}
else {
color = getResources().getStringArray(R.array.menu_colors)[3];
}
mGpuFrequency.setTitleColor(color);
mGpuFrequency.setCategory(category);
mGpuFrequency.setKey(GPU_MAX_FREQ_FILE);
if(new File(GPU_FOLDER).exists()) {
addPreferences();
String gpuFrequencies = Helpers.getFileContent(new File(GPU_FREQUENCIES_FILE));
String[] frequencies = gpuFrequencies.split(" ");
String[] gpuNames = Helpers.getFreqToMhz(GPU_FREQUENCIES_FILE);
mGpuFrequency.setEntries(gpuNames);
mGpuFrequency.setEntryValues(frequencies);
mGpuFrequency.setSummary(Helpers.getFileContent(new File(GPU_MAX_FREQ_FILE)));
mGpuFrequency.setValue(Helpers.getFileContent(new File(GPU_MAX_FREQ_FILE)));
} else {
mCategory.removePreference(mGpuFrequency);
CustomPreference pref = new CustomPreference(mContext, true, category);
pref.setTitle("No Tweakable Values");
pref.setSummary("This kernel doesn\'t support GPU Tweaks");
pref.setTitleColor("#ff4444");
pref.setSummaryColor("#ff4444");
pref.excludeFromDialog(true);
mCategory.addPreference(pref);
}
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);
v.findViewById(android.R.id.list);
return v;
}
@Override
public boolean onPreferenceChange(Preference pref, Object newValue) {
// TODO Auto-generated method stub
if(pref == mGpuFrequency) {
String value = ((String) newValue).trim();
mGpuFrequency.setSummary(value);
mGpuFrequency.setValue(value);
CMDProcessor.runSuCommand("echo "+value+" > "+GPU_MAX_FREQ_FILE);
updateListDb(pref, value, ((CustomListPreference) pref).isBootChecked());
Log.d("TAG",""+((CustomListPreference) pref).isBootChecked());
}
return false;
}
private void addPreferences() {
File f = new File("/sys/module/msm_kgsl_core/parameters/down_threshold");
File f2 = new File("/sys/module/msm_kgsl_core/parameters/sample_time_ms");
File f3 = new File("/sys/module/msm_kgsl_core/parameters/up_threshold");
File f4 = new File("/sys/module/msm_kgsl_core/parameters/simple_laziness");
File f5 = new File("/sys/module/msm_kgsl_core/parameters/simple_ramp_threshold");
if(f.exists())
createPreference(f, color);
if(f2.exists())
createPreference(f2, color);
if(f3.exists())
createPreference(f3, color);
if(f4.exists())
createPreference(f4, color);
if(f5.exists())
createPreference(f5, color);
}
private void createPreference(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);
db.getAllItems();
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());
updateDb(p, 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 updateDb(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();
}
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();
}
}