package com.dsht.kerneltweaker.fragments;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeoutException;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.text.InputType;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
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.kerneltweaker.database.VddDatabaseHandler;
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;
public class UvPreferenceFragment extends PreferenceFragment {
private PreferenceCategory mCategory;
private Context mContext;
private String[] names;
private String[] values;
private LinearLayout mButtonLayout;
private Button mButtonApply;
private Button mButtonCancel;
private String UV_TABLE_FILE = "/sys/devices/system/cpu/cpu0/cpufreq/UV_mV_table";
private String category = "uv";
private DatabaseHandler db = MainActivity.db;
private VddDatabaseHandler VddDb = MainActivity.vddDb;
private List<DataItem> items;
private List<DataItem> vddItems;
private MenuItem boot;
private boolean isVdd = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
init();
items = db.getAllItems();
vddItems = VddDb.getAllItems();
if(Helpers.UvTableExists(UV_TABLE_FILE)) {
if(mCategory.getPreferenceCount() != 0) {
mCategory.removeAll();
}
MainActivity.menu.setEnabled(false);
addPreferences(true);
isVdd = false;
} else {
if(Helpers.UvTableExists("/sys/devices/system/cpu/cpufreq/vdd_table/vdd_levels")) {
if(mCategory.getPreferenceCount() != 0) {
mCategory.removeAll();
}
MainActivity.menu.setEnabled(false);
UV_TABLE_FILE = "/sys/devices/system/cpu/cpufreq/vdd_table/vdd_levels";
addPreferences(false);
isVdd = true;
} else {
if(mCategory.getPreferenceCount() != 0) {
mCategory.removeAll();
}
CustomPreference pref = new CustomPreference(mContext, true, category);
pref.setTitle("Your Device Doesn\'t support UV");
pref.hideBoot(true);
pref.setSummary("You need a custom kernel that supports UnderVolt");
pref.setTitleColor("#ff4444");
pref.setSummaryColor("#ff4444");
mCategory.addPreference(pref);
if(MainActivity.menu.isMenuShowing()) {
MainActivity.menu.toggle();
}
}
}
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);
final ListView list = (ListView) v.findViewById(android.R.id.list);
mButtonLayout = (LinearLayout) v.findViewById(R.id.btn_layout);
mButtonApply = (Button) v.findViewById(R.id.btn_apply);
mButtonCancel = (Button) v.findViewById(R.id.btn_cancel);
mButtonCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
for (int i = 0; i < mCategory.getPreferenceCount(); i++) {
CustomPreference pref = (CustomPreference) mCategory.getPreference(i);
pref.restoreSummaryKey(values[i], values[i]);
}
mButtonLayout.setVisibility(View.GONE);
list.bringToFront();
}
});
mButtonApply.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if(isVdd) {
for(int i = 0; i<mCategory.getPreferenceCount(); i++) {
CustomPreference pref = (CustomPreference) mCategory.getPreference(i);
String value = "'"+pref.getTitle().toString()+" "+pref.getSummary().toString()+"'";
applyVddUV(value);
Log.d("VALUE", value);
}
} else {
String[] newValues = new String[values.length];
for (int i = 0; i < mCategory.getPreferenceCount(); i++) {
CustomPreference pref = (CustomPreference) mCategory.getPreference(i);
newValues[i] = pref.getKey();
values[i] = pref.getKey();
}
CMDProcessor.runSuCommand("echo \""+buildTable(values)+"\" > "+UV_TABLE_FILE);
if(boot.isChecked()) {
db.deleteItemByName("'"+UV_TABLE_FILE+"'");
db.addItem(new DataItem("'"+UV_TABLE_FILE+"'",
buildTable(values),
"UV Table",
category));
}
}
mButtonLayout.setVisibility(View.GONE);
list.bringToFront();
}
});
return v;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
if(Helpers.UvTableExists(UV_TABLE_FILE)) {
inflater.inflate(R.menu.menu_uv, menu);
boot = (MenuItem) menu.findItem(R.id.action_boot);
if(isVdd) {
if(vddItems.size() != 0) {
boot.setChecked(true);
}else {
boot.setChecked(false);
}
} else {
for (DataItem item : items) {
if(item.getName().contains(UV_TABLE_FILE)) {
boot.setChecked(true);
break;
}
boot.setChecked(false);
}
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int prefsIndex = mCategory.getPreferenceCount();
switch (item.getItemId()) {
case R.id.action_plus:
for (int i = 0; i< prefsIndex; i++) {
CustomPreference pref = (CustomPreference) mCategory.getPreference(i);
if(isVdd) {
pref.setCustomSummaryKeyPlus(25000);
} else {
pref.setCustomSummaryKeyPlus(25);
}
if (!pref.getKey().equals(values[i])) {
mButtonLayout.setVisibility(View.VISIBLE);
} else {
mButtonLayout.setVisibility(View.GONE);
}
}
return true;
case R.id.action_minus:
for (int i = 0; i< prefsIndex; i++) {
CustomPreference pref = (CustomPreference) mCategory.getPreference(i);
if(isVdd) {
pref.setCustomSummaryKeyMinus(25000);
}else {
pref.setCustomSummaryKeyMinus(25);
}
if (!pref.getKey().equals(values[i])) {
mButtonLayout.setVisibility(View.VISIBLE);
} else {
mButtonLayout.setVisibility(View.GONE);
}
}
return true;
case R.id.action_boot:
if(item.isChecked()) {
if(isVdd) {
VddDb.deleteAllItems();
} else {
db.deleteItemByName("'"+UV_TABLE_FILE+"'");
}
item.setChecked(false);
}else {
if(isVdd) {
addVddBoot();
} else {
db.deleteItemByName("'"+UV_TABLE_FILE+"'");
db.addItem(new DataItem("'"+UV_TABLE_FILE+"'",
buildTable(values),
"UV Table",
category));
}
item.setChecked(true);
}
return true;
default:
break;
}
return false;
}
public void addPreferences(final boolean millivolts) {
class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
names = Helpers.getUvTableNames();
values = Helpers.getUvValues();
Log.d("table", buildTable(values));
for(int i = 0; i<names.length; i++) {
String name = names[i];
final int j = i;
CustomPreference pref = new CustomPreference(mContext, false, category);
pref.setTitle(name);
pref.areMilliVolts(millivolts);
pref.hideBoot(true);
String color = "";
if(MainActivity.mPrefs.getBoolean(SettingsFragment.KEY_ENABLE_GLOBAL, false)) {
int col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_GLOBAL_COLOR, Color.parseColor("#ff0099cc"));
color = "#"+Integer.toHexString(col);
}else if(MainActivity.mPrefs.getBoolean(SettingsFragment.KEY_ENABLE_PERSONAL, false)) {
int col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_UV, Color.parseColor("#ff0099cc"));
color = "#"+Integer.toHexString(col);
}
else {
color = getResources().getStringArray(R.array.menu_colors)[4];
}
pref.setTitleColor(color);
if(isVdd){
pref.setSummary(values[i]);
}else {
pref.setSummary(values[i]+ " mV");
}
pref.setKey(values[i]);
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);
LinearLayout ll = new LinearLayout(mContext);
ll.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT));
final EditText et = new EditText(mContext);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(40, 40, 40, 40);
params.gravity = Gravity.CENTER;
final String val = p.getKey().toString();
et.setLayoutParams(params);
et.setRawInputType(InputType.TYPE_CLASS_NUMBER);
et.setGravity(Gravity.CENTER_HORIZONTAL);
et.setText(val);
ll.addView(et);
builder.setView(ll);
builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if(isVdd) {
String value = "'"+p.getTitle().toString()+" "+et.getText().toString()+"'";
CMDProcessor.runSuCommand("echo "+value+" > "+UV_TABLE_FILE);
p.setSummary(et.getText().toString());
p.setKey(et.getText().toString());
} else {
String value = et.getText().toString();
p.setSummary(value+" mV");
p.setKey(value);
values[j] = value;
CMDProcessor.runSuCommand("echo \""+buildTable(values)+"\" > "+UV_TABLE_FILE);
}
if(boot.isChecked()) {
if(isVdd) {
addVddBoot();
} else {
db.deleteItemByName("'"+UV_TABLE_FILE+"'");
db.addItem(new DataItem("'"+UV_TABLE_FILE+"'",
buildTable(values),
"UV Table",
category));
}
}
}
} );
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;
}
});
}
return "Executed";
}
@Override
protected void onPostExecute(String result) {
Helpers.waitForMillis(500, mContext);
MainActivity.menu.setEnabled(true);
if(MainActivity.menu.isMenuShowing()) {
MainActivity.menu.toggle();
}
}
@Override
protected void onPreExecute() {
}
}
new LongOperation().execute();
}
private String buildTable(String[] vals) {
String newTable="";
for(int j = 0; j<vals.length; j++) {
if(j!= vals.length-1) {
newTable+=vals[j]+" ";
}else{
newTable+=vals[j];
}
}
return newTable;
}
public void init() {
addPreferencesFromResource(R.xml.pref_sccreen_uv);
mContext = getActivity();
mCategory = (PreferenceCategory) findPreference("key_uv_category");
}
private void applyVddUV(String value) {
CMDProcessor.runSuCommand("echo "+value+" > "+UV_TABLE_FILE);
}
private void addVddBoot() {
VddDb.deleteAllItems();
for(int i = 0; i<mCategory.getPreferenceCount(); i++) {
CustomPreference pref = (CustomPreference)mCategory.getPreference(i);
String value = "'"+pref.getTitle().toString()+" "+pref.getSummary().toString()+"'";
VddDb.addItem(new DataItem("'"+UV_TABLE_FILE+"'", value, "vdd_levels", category));
}
}
}