package com.dsht.open; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; 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.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.ListView; import android.widget.SeekBar; import android.widget.TextView; import java.io.File; import java.util.List; 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; public class VM extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener, Constants { private CustomPreference mDirtyRatio; private CustomPreference mDirtyBackground; private CustomPreference mDirtyExpireCentisecs; private CustomPreference mDirtyWriteback; private CustomPreference mMinFreeK; private CustomPreference mOvercommit; private CustomPreference mSwappiness; private PreferenceScreen mRootScreen; private CustomPreference mVfs; private DatabaseHandler db; String category = "vm"; private SharedPreferences mPreferences; private int mSeekbarProgress; private EditText settingText; private Context context; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = getActivity(); mPreferences = PreferenceManager.getDefaultSharedPreferences(context); mPreferences.registerOnSharedPreferenceChangeListener(this); addPreferencesFromResource(R.xml.vm); db = new DatabaseHandler(context); mRootScreen = (PreferenceScreen) findPreference("key_root"); mDirtyRatio = (CustomPreference) findPreference(PREF_DIRTY_RATIO); mDirtyBackground = (CustomPreference) findPreference(PREF_DIRTY_BACKGROUND); mDirtyExpireCentisecs = (CustomPreference) findPreference(PREF_DIRTY_EXPIRE); mDirtyWriteback = (CustomPreference) findPreference(PREF_DIRTY_WRITEBACK); mMinFreeK = (CustomPreference) findPreference(PREF_MIN_FREE_KB); mOvercommit = (CustomPreference) findPreference(PREF_OVERCOMMIT); mSwappiness = (CustomPreference) findPreference(PREF_SWAPPINESS); mVfs = (CustomPreference) findPreference(PREF_VFS); mDirtyRatio.setSummary(Helpers.readOneLine(DIRTY_RATIO_PATH)); mDirtyBackground.setSummary(Helpers.readOneLine(DIRTY_BACKGROUND_PATH)); mDirtyExpireCentisecs.setSummary(Helpers.readOneLine(DIRTY_EXPIRE_PATH)); mDirtyWriteback.setSummary(Helpers.readOneLine(DIRTY_WRITEBACK_PATH)); mMinFreeK.setSummary(Helpers.readOneLine(MIN_FREE_PATH)); mOvercommit.setSummary(Helpers.readOneLine(OVERCOMMIT_PATH)); mSwappiness.setSummary(Helpers.readOneLine(SWAPPINESS_PATH)); mVfs.setSummary(Helpers.readOneLine(VFS_CACHE_PRESSURE_PATH)); 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(MainActivity.mPrefs.getBoolean(SettingsFragment.KEY_ENABLE_PERSONAL, false)) { int col = MainActivity.mPrefs.getInt(SettingsFragment.KEY_VM, Color.parseColor("#ff0099cc")); color = "#"+Integer.toHexString(col); } else { color = getResources().getStringArray(R.array.menu_colors)[7]; } mDirtyRatio.setTitleColor(color); mDirtyBackground.setTitleColor(color); mDirtyExpireCentisecs.setTitleColor(color); mDirtyWriteback.setTitleColor(color); mMinFreeK.setTitleColor(color); mOvercommit.setTitleColor(color); mSwappiness.setTitleColor(color); mVfs.setTitleColor(color); mDirtyRatio.setKey(DIRTY_RATIO_PATH); mDirtyBackground.setKey(DIRTY_BACKGROUND_PATH); mDirtyExpireCentisecs.setKey(DIRTY_EXPIRE_PATH); mDirtyWriteback.setKey(DIRTY_WRITEBACK_PATH); mMinFreeK.setKey(MIN_FREE_PATH); mOvercommit.setKey(OVERCOMMIT_PATH); mSwappiness.setKey(SWAPPINESS_PATH); mVfs.setKey(VFS_CACHE_PRESSURE_PATH); mDirtyRatio.setCategory(category); mDirtyBackground.setCategory(category); mDirtyExpireCentisecs.setCategory(category); mDirtyWriteback.setCategory(category); mMinFreeK.setCategory(category); mOvercommit.setCategory(category); mSwappiness.setCategory(category); mVfs.setCategory(category); MainActivity.menu.toggle(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); ListView listView = (ListView) v.findViewById(android.R.id.list); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); registerForContextMenu(listView); listView.setMultiChoiceModeListener(new ListViewMultiChoiceModeListener( context,getActivity(), listView,mRootScreen, false, MainActivity.db, MainActivity.vddDb)); return v; } @Override public void onResume() { super.onResume(); if (!new File(DYNAMIC_DIRTY_WRITEBACK_PATH).exists()) { mDirtyWriteback.setEnabled(true); } else { mDirtyWriteback.setEnabled( !Helpers.readOneLine(DYNAMIC_DIRTY_WRITEBACK_PATH).equals("1")); } } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference == mDirtyRatio) { String title = getString(R.string.dirty_ratio_title); int currentProgress = Integer.parseInt(Helpers.readOneLine(DIRTY_RATIO_PATH)); openDialog(currentProgress, title, 0, 100, preference, DIRTY_RATIO_PATH, PREF_DIRTY_RATIO); return true; } else if (preference == mDirtyBackground) { String title = getString(R.string.dirty_background_title); int currentProgress = Integer.parseInt(Helpers.readOneLine(DIRTY_BACKGROUND_PATH)); openDialog(currentProgress, title, 0, 100, preference, DIRTY_BACKGROUND_PATH, PREF_DIRTY_BACKGROUND); return true; } else if (preference == mDirtyExpireCentisecs) { String title = getString(R.string.dirty_expire_title); int currentProgress = Integer.parseInt(Helpers.readOneLine(DIRTY_EXPIRE_PATH)); openDialog(currentProgress, title, 0, 5000, preference, DIRTY_EXPIRE_PATH, PREF_DIRTY_EXPIRE); return true; } else if (preference == mDirtyWriteback) { String title = getString(R.string.dirty_writeback_title); int currentProgress = Integer.parseInt(Helpers.readOneLine(DIRTY_WRITEBACK_PATH)); openDialog(currentProgress, title, 0, 5000, preference, DIRTY_WRITEBACK_PATH, PREF_DIRTY_WRITEBACK); return true; } else if (preference == mMinFreeK) { String title = getString(R.string.min_free_title); int currentProgress = Integer.parseInt(Helpers.readOneLine(MIN_FREE_PATH)); openDialog(currentProgress, title, 0, 8192, preference, MIN_FREE_PATH, PREF_MIN_FREE_KB); return true; } else if (preference == mOvercommit) { String title = getString(R.string.overcommit_title); int currentProgress = Integer.parseInt(Helpers.readOneLine(OVERCOMMIT_PATH)); openDialog(currentProgress, title, 0, 100, preference, OVERCOMMIT_PATH, PREF_OVERCOMMIT); return true; } else if (preference == mSwappiness) { String title = getString(R.string.swappiness_title); int currentProgress = Integer.parseInt(Helpers.readOneLine(SWAPPINESS_PATH)); openDialog(currentProgress, title, 0, 100, preference, SWAPPINESS_PATH, PREF_SWAPPINESS); return true; } else if (preference == mVfs) { String title = getString(R.string.vfs_title); int currentProgress = Integer.parseInt(Helpers.readOneLine(VFS_CACHE_PRESSURE_PATH)); openDialog(currentProgress, title, 0, 200, preference, VFS_CACHE_PRESSURE_PATH, PREF_VFS); return true; } return super.onPreferenceTreeClick(preferenceScreen, preference); } @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, String key) { SharedPreferences.Editor editor = sharedPreferences.edit(); if (key.equals(VM_SOB)) { if (sharedPreferences.getBoolean(key, false)) { editor.putInt(PREF_DIRTY_RATIO, Integer.parseInt(Helpers.readOneLine(DIRTY_RATIO_PATH))) .putInt(PREF_DIRTY_BACKGROUND, Integer.parseInt(Helpers.readOneLine(DIRTY_BACKGROUND_PATH))) .putInt(PREF_DIRTY_EXPIRE, Integer.parseInt(Helpers.readOneLine(DIRTY_EXPIRE_PATH))) .putInt(PREF_DIRTY_WRITEBACK, Integer.parseInt(Helpers.readOneLine(DIRTY_WRITEBACK_PATH))) .putInt(PREF_MIN_FREE_KB, Integer.parseInt(Helpers.readOneLine(MIN_FREE_PATH))) .putInt(PREF_OVERCOMMIT, Integer.parseInt(Helpers.readOneLine(OVERCOMMIT_PATH))) .putInt(PREF_SWAPPINESS, Integer.parseInt(Helpers.readOneLine(SWAPPINESS_PATH))) .putInt(PREF_VFS, Integer.parseInt(Helpers.readOneLine(VFS_CACHE_PRESSURE_PATH))) .apply(); } else { editor.remove(PREF_DIRTY_RATIO) .remove(PREF_DIRTY_BACKGROUND) .remove(PREF_DIRTY_EXPIRE) .remove(PREF_DIRTY_WRITEBACK) .remove(PREF_MIN_FREE_KB) .remove(PREF_OVERCOMMIT) .remove(PREF_SWAPPINESS) .remove(PREF_VFS) .apply(); } } } public void openDialog(int currentProgress, String title, final int min, final int max, final Preference pref, final String path, final String key) { Resources res = context.getResources(); String cancel = res.getString(R.string.cancel); String ok = res.getString(R.string.ok); LayoutInflater factory = LayoutInflater.from(context); final View alphaDialog = factory.inflate(R.layout.seekbar_dialog, null); final SeekBar seekbar = (SeekBar) alphaDialog.findViewById(R.id.seek_bar); seekbar.setMax(max); seekbar.setProgress(currentProgress); settingText = (EditText) alphaDialog.findViewById(R.id.setting_text); settingText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { int val = Integer.parseInt(settingText.getText().toString()); seekbar.setProgress(val); return true; } return false; } }); settingText.setText(Integer.toString(currentProgress)); settingText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { try { int val = Integer.parseInt(s.toString()); if (val > max) { s.replace(0, s.length(), Integer.toString(max)); val = max; } seekbar.setProgress(val); } catch (NumberFormatException ex) { } } }); SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) { mSeekbarProgress = seekbar.getProgress(); if (fromUser) { settingText.setText(Integer.toString(mSeekbarProgress)); } } @Override public void onStopTrackingTouch(SeekBar seekbar) { } @Override public void onStartTrackingTouch(SeekBar seekbar) { } }; seekbar.setOnSeekBarChangeListener(seekBarChangeListener); new AlertDialog.Builder(context) .setTitle(title) .setView(alphaDialog) .setNegativeButton(cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // nothing } }) .setPositiveButton(ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int val = Integer.parseInt(settingText.getText().toString()); if (val < min) { val = min; } seekbar.setProgress(val); int newProgress = seekbar.getProgress(); pref.setSummary(Integer.toString(newProgress)); if (Helpers.isSystemApp(getActivity())) { Helpers.writeOneLine(path, Integer.toString(newProgress)); } else { CMDProcessor.runSuCommand("busybox echo " + newProgress + " > " + path); } updateListDb(pref, Integer.toString(newProgress), ((CustomPreference)pref).isBootChecked()); final SharedPreferences.Editor editor = mPreferences.edit(); editor.putInt(key, newProgress); editor.commit(); } }).create().show(); } 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(); } }