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.SwipeDismissListViewTouchListener; 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; 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.OnPreferenceChangeListener; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceScreen; import android.util.Log; import android.view.ContextMenu; 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.ViewGroup; import android.view.Window; import android.view.WindowManager.LayoutParams; import android.widget.EditText; import android.widget.ListView; public class ReviewBootPreferenceFragment extends PreferenceFragment { private DatabaseHandler db; private VddDatabaseHandler VddDb; private List<DataItem> items; private List<DataItem> vddItems; private PreferenceScreen mRoot; private Context mContext; private PreferenceCategory mCpu; private PreferenceCategory mGpu; private PreferenceCategory mUv; private PreferenceCategory mKernel; private PreferenceCategory mLmk; private PreferenceCategory mGov; private PreferenceCategory mSched; private PreferenceCategory mQuiet; private PreferenceCategory mVm; private static final String cpuCat = "cpu"; private static final String gpuCat = "gpu"; private static final String uvCat ="uv"; private static final String kernelCat = "kernel"; private static final String LmkCat = "lmk"; private static final String GovCat = "governor"; private static final String SchedCat ="scheduler"; private static final String QuietCat ="cpuquiet"; private static final String vmCat = "vm"; private ListView listView; private SwipeDismissListViewTouchListener touchListener; private MenuItem edit; String[] frequencies; String[] names; String[] governors; String[] gpuFrequencies; String[] schedulers; String[] cpuquiet_govs; String[] availTCP; String[] readAheadKb = {"128","256","384","512","640","768","896","1024","1152", "1280","1408","1536","1664","1792","1920","2048", "2176", "2304", "2432", "2560", "2688", "2816", "2944", "3072", "3200", "3328", "3456", "3584", "3712", "3840", "3968", "4096"}; private static final String GPU_FREQUENCIES_FILE = "/sys/class/kgsl/kgsl-3d0/gpu_available_frequencies"; private static final String SCHEDULER_FILE = "/sys/block/mmcblk0/queue/scheduler"; private static final String READ_AHEAD_FILE = "/sys/block/mmcblk0/queue/read_ahead_kb"; 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 TCP_OPTIONS = "sysctl net.ipv4.tcp_available_congestion_control"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_screen_review); mRoot = (PreferenceScreen) findPreference("key_pref_screen"); mContext = getActivity(); mCpu = (PreferenceCategory) findPreference("cat_cpu"); mGpu = (PreferenceCategory) findPreference("cat_gpu"); mUv = (PreferenceCategory) findPreference("cat_uv"); mKernel = (PreferenceCategory) findPreference("cat_kernel"); mLmk = (PreferenceCategory) findPreference("cat_lmk"); mGov = (PreferenceCategory) findPreference("cat_gov"); mSched = (PreferenceCategory) findPreference("cat_sched"); mQuiet = (PreferenceCategory) findPreference("cat_quiet"); mVm= (PreferenceCategory) findPreference("cat_vm"); setHasOptionsMenu(true); Helpers.setPermissions(CPUQUIET_FILE); Helpers.setPermissions(GPU_FREQUENCIES_FILE); Helpers.setPermissions(READ_AHEAD_FILE); Helpers.setPermissions(CPUQUIET_DIR); Helpers.setPermissions(CPUQUIET_GOVERNORS); frequencies = Helpers.getFrequencies(); names = Helpers.getFrequenciesNames(); governors = Helpers.getGovernors(); String gpu = Helpers.getFileContent(new File(GPU_FREQUENCIES_FILE)); gpuFrequencies = gpu.split(" "); String[] gpuNames = Helpers.getFreqToMhz(GPU_FREQUENCIES_FILE); schedulers = Helpers.getAvailableSchedulers(); db = new DatabaseHandler(mContext); VddDb = new VddDatabaseHandler(mContext); items = db.getAllItems(); vddItems = VddDb.getAllItems(); if(new File(CPUQUIET_DIR).exists()) { String cpuquiet = Helpers.getFileContent(new File(CPUQUIET_GOVERNORS)); cpuquiet_govs = cpuquiet.trim().replaceAll("\n", "").split(" "); } if(items.size() != 0) { for(DataItem item : items) { String fPath = item.getName().replaceAll("'", ""); String fName = item.getFileName(); Log.d("PATH", fPath); String value = item.getValue(); String category = item.getCategory(); if(category.equals(cpuCat)) { String color = getColor(2); if(fName.contains("CPU Max Frequency")) { createListPreference(mCpu,fPath,fName,value,frequencies, names,color,category,false); } else if(fName.contains("CPU Min Frequency")) { createListPreference(mCpu,fPath,fName,value,frequencies, names,color,category,false); } else if(fName.contains("Governor")) { createListPreference(mCpu,fPath,fName,value,governors, governors,color,category,false); } else if(fName.contains("Cpuquiet")) { createListPreference(mCpu,fPath,fName,value,cpuquiet_govs,cpuquiet_govs,color,category,false); }else { createPreference(mCpu,fPath, fName, value, color, category, false); } } else if (category.equals(gpuCat)) { String color = getColor(3); if(fName.contains("GPU Max Frequency")) { createListPreference(mGpu,fPath, fName, value, gpuFrequencies, gpuNames, color, category, false); }else { createPreference(mGpu,fPath, fName, value, color, category, false); } } else if(category.equals(uvCat)) { String color = getColor(4); createPreference(mUv,fPath, fName, value, color, category, false); } else if(category.equals(kernelCat)) { String color = getColor(5); if(fName.contains("I/O Scheduler")) { createListPreference(mKernel,fPath, fName, value, schedulers, schedulers, color, category, false); }else if(fName.contains("Read Ahead size")) { createListPreference(mKernel,fPath, fName, value, readAheadKb,readAheadKb, color, category, false); }else if(fName.contains("TCP Congestion control")) { String[] availTCP = Helpers.readCommandStrdOut(TCP_OPTIONS, false).replaceAll("net.ipv4.tcp_available_congestion_control = ", "").replaceAll("\n", "").split(" "); createListPreference(mKernel, fPath, fName, value, availTCP, availTCP, color, category, false); } else { createPreference(mKernel,fPath, fName, value, color, category, false); } } else if(category.equals(LmkCat)) { String color = getColor(6); createPreference(mLmk,fPath, fName, value, color, category, false); } else if(category.equals(GovCat)) { String color = getColor(12); createPreference(mGov,fPath, fName, value, color, category, false); } else if(category.equals(SchedCat)) { String color = getColor(12); createPreference(mSched,fPath, fName, value, color, category, false); } else if(category.equals(QuietCat)) { String color = getColor(12); createPreference(mQuiet,fPath, fName, value, color, category, false); } else if(category.equals(vmCat)) { String color = getColor(7); createPreference(mVm,fPath, fName, value, color, category, false); } } } if(vddItems.size() != 0) { String color = getResources().getStringArray(R.array.menu_colors)[2]; createPreference(mUv,"", getResources().getString(R.string.vdd_pref), getResources().getString(R.string.vdd_desc), color, "uv", true); } checkEmpty(); if(mRoot.getPreferenceCount() == 0) { addEmptyView(); } if(MainActivity.menu.isMenuShowing()) { MainActivity.menu.toggle(true); } setRetainInstance(true); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { getActivity().getMenuInflater().inflate(R.menu.main, menu); } @Override public boolean onContextItemSelected(MenuItem item) { return super.onContextItemSelected(item); } @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); listView = (ListView) v.findViewById(android.R.id.list); listView.setFastScrollEnabled(true); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); registerForContextMenu(listView); listView.setMultiChoiceModeListener(new ListViewMultiChoiceModeListener( mContext,getActivity(), listView,mRoot, mCpu, mGpu, mUv, mKernel, mLmk, mGov, mSched, mQuiet, mVm, db, VddDb, true)); return v; } private void createPreference(PreferenceCategory mCategory, String fPath, String fName, String value, String color, final String category, boolean excludeEdit) { final CustomPreference pref = new CustomPreference(mContext, false, category); pref.setTitle(fName); pref.setTitleColor(color); pref.setSummary(value); pref.setKey(fPath); pref.hideBoot(true); Log.d("CONTENT", value); mCategory.addPreference(pref); if(!excludeEdit) { 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, true, 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; } }); } } @Override public void onDetach() { super.onDetach(); mRoot.removeAll(); } private void createListPreference(PreferenceCategory mCategory, String fPath, String fName, String value,String[] entries, String[] names, String color, final String category, boolean excludeEdit) { final CustomListPreference pref = new CustomListPreference(mContext, category); pref.setTitle(fName); pref.setTitleColor(color); pref.setSummary(value); pref.setEntries(names); pref.setEntryValues(entries); pref.hideBoot(true); pref.setKey(fPath); Log.d("CONTENT", value); mCategory.addPreference(pref); if(!excludeEdit) { pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){ @Override public boolean onPreferenceChange(final Preference p, Object newValue) { // TODO Auto-generated method stub p.setSummary((String)newValue); pref.setValue(p.getSummary().toString()); CMDProcessor.runSuCommand("echo \""+(String)newValue+"\" > "+p.getKey()); updateDb(p, (String)newValue, true, category); return true; } }); } } private void updateDb(final Preference p, final String value,final boolean isChecked, final String category) { 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()+"'"); } } if(p.getTitle().toString().contains("TCP")) { db.addItem(new DataItem("'"+"sysctl -w net.ipv4.tcp_congestion_control="+value+"'", value, p.getTitle().toString(), category)); } else { 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(); } public void addEmptyView() { mRoot.removeAll(); CustomPreference pref = new CustomPreference(mContext, true, ""); pref.setTitle("EMPTY"); pref.setSummary("No Values set at boot"); String color = getResources().getStringArray(R.array.menu_colors)[8]; pref.setTitleColor(color); pref.setSummaryColor(color); pref.hideBoot(true); mRoot.addPreference(pref); } private void checkEmpty() { if(mCpu.getPreferenceCount() == 0) { mRoot.removePreference(mCpu); } if(mGpu.getPreferenceCount() == 0) { mRoot.removePreference(mGpu); } if(mUv.getPreferenceCount() == 0) { mRoot.removePreference(mUv); } if(mKernel.getPreferenceCount() == 0) { mRoot.removePreference(mKernel); } if(mLmk.getPreferenceCount() == 0) { mRoot.removePreference(mLmk); } if(mGov.getPreferenceCount() == 0) { mRoot.removePreference(mGov); } if(mSched.getPreferenceCount() == 0) { mRoot.removePreference(mSched); } if(mQuiet.getPreferenceCount() == 0) { mRoot.removePreference(mQuiet); } if(mVm.getPreferenceCount()==0) { mRoot.removePreference(mVm); } } private String getColor(int pos) { 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 = Color.parseColor("#ff0099cc"); switch(pos) { case 0: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_STAT, Color.parseColor("#FFFFFF")); break; case 1: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_INFO, Color.parseColor("#FFFFFF")); break; case 2: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_CPU, Color.parseColor("#FFFFFF")); break; case 3: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_GPU, Color.parseColor("#FFFFFF")); break; case 4: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_UV, Color.parseColor("#FFFFFF")); break; case 5: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_KERNEL, Color.parseColor("#FFFFFF")); break; case 6: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_LMK, Color.parseColor("#FFFFFF")); break; case 7: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_VM, Color.parseColor("#FFFFFF")); break; case 8: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_REVIEW, Color.parseColor("#FFFFFF")); break; case 9: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_FILE, Color.parseColor("#FFFFFF")); break; case 10: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_BAK, Color.parseColor("#FFFFFF")); break; case 11: col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_RECOVERY, Color.parseColor("#FFFFFF")); break; } color = "#"+Integer.toHexString(col); } else { color = getResources().getStringArray(R.array.menu_colors)[pos]; } return color; } }