Java tutorial
/* * XPerience Kernel Tweaker - An Android CPU Control application * Copyright (C) 2011-2015 Carlos "Klozz" Jesus <TeamMEX@XDA-Developers> * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package mx.klozz.xperience.tweaker.fragments; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.res.Resources; import android.os.Bundle; import android.os.Vibrator; import android.preference.*; import android.support.v4.view.ViewPager; import android.text.Editable; import android.text.TextWatcher; import android.view.*; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import mx.klozz.xperience.tweaker.R; import mx.klozz.xperience.tweaker.activities.Settings; import mx.klozz.xperience.tweaker.activities.PFKActivity; import mx.klozz.xperience.tweaker.activities.TouchScreenSettings; import mx.klozz.xperience.tweaker.activities.VMSettings; import mx.klozz.xperience.tweaker.util.CMDProcessor; import mx.klozz.xperience.tweaker.util.Constants; import mx.klozz.xperience.tweaker.helpers.Helpers; import mx.klozz.xperience.tweaker.util.VibratorClass; import java.io.File; public class Advanced extends PreferenceFragment implements OnSharedPreferenceChangeListener, Constants { SharedPreferences mPreferences; private Preference mBltimeout, mViber, mPFK, mDynamicWriteBackActive, mDynamicWriteBackSuspend, mVM, mTouchScr; private SwitchPreference mBltouch, mBln, mDynamicWriteBackOn, mDsync, mWifiPM; private ListPreference mReadAhead; private String sreadahead; private String BLN_PATH, VIBE_PATH, WIFIPM_PATH; private Context context; VibratorClass vib = new VibratorClass(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = getActivity(); mPreferences = PreferenceManager.getDefaultSharedPreferences(context); mPreferences.registerOnSharedPreferenceChangeListener(this); addPreferencesFromResource(R.layout.advanced); sreadahead = getResources().getString(R.string.ps_read_ahead, ""); mReadAhead = (ListPreference) findPreference(PREF_READ_AHEAD); mBltimeout = findPreference(PREF_BLTIMEOUT); mBltouch = (SwitchPreference) findPreference(PREF_BLTOUCH); mBln = (SwitchPreference) findPreference(PREF_BLN); mWifiPM = (SwitchPreference) findPreference("pref_wifi_pm"); mTouchScr = findPreference("touchscr_settings"); mViber = findPreference("pref_viber"); mVM = findPreference("vm_settings"); mDsync = (SwitchPreference) findPreference(PREF_DSYNC); mPFK = findPreference("pfk_settings"); mDynamicWriteBackOn = (SwitchPreference) findPreference(PREF_DYNAMIC_DIRTY_WRITEBACK); mDynamicWriteBackActive = findPreference(PREF_DIRTY_WRITEBACK_ACTIVE); mDynamicWriteBackSuspend = findPreference(PREF_DIRTY_WRITEBACK_SUSPEND); if (!new File(DSYNC_PATH).exists()) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("dsync"); getPreferenceScreen().removePreference(hideCat); } else { mDsync.setChecked(Helpers.LeerUnaLinea(DSYNC_PATH).equals("1")); } if (!new File(PFK_HOME_ENABLED).exists() || !new File(PFK_MENUBACK_ENABLED).exists()) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("pfk"); getPreferenceScreen().removePreference(hideCat); } if (!new File(BL_TIMEOUT_PATH).exists()) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("bltimeout"); getPreferenceScreen().removePreference(hideCat); } else { mBltimeout.setSummary(Helpers.LeerUnaLinea(BL_TIMEOUT_PATH)); } if (!new File(BL_TOUCH_ON_PATH).exists()) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("bltouch"); getPreferenceScreen().removePreference(hideCat); } else { mBltouch.setChecked(Helpers.LeerUnaLinea(BL_TOUCH_ON_PATH).equals("1")); } BLN_PATH = Helpers.bln_path(); if (BLN_PATH == null) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("bln"); getPreferenceScreen().removePreference(hideCat); } else { mBln.setChecked(Helpers.LeerUnaLinea(BLN_PATH).equals("1")); } if (no_touchscreen()) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("touch_scr"); getPreferenceScreen().removePreference(hideCat); } VIBE_PATH = vib.get_path(); if (VIBE_PATH == null) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("viber"); getPreferenceScreen().removePreference(hideCat); } else { mViber.setSummary(vib.get_val(VIBE_PATH)); } if (!new File(DYNAMIC_DIRTY_WRITEBACK_PATH).exists()) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("cat_dynamic_write_back"); getPreferenceScreen().removePreference(hideCat); } else { boolean ison = Helpers.LeerUnaLinea(DYNAMIC_DIRTY_WRITEBACK_PATH).equals("1"); mDynamicWriteBackOn.setChecked(ison); mDynamicWriteBackActive.setSummary(Helpers.LeerUnaLinea(DIRTY_WRITEBACK_ACTIVE_PATH)); mDynamicWriteBackSuspend.setSummary(Helpers.LeerUnaLinea(DIRTY_WRITEBACK_SUSPEND_PATH)); } WIFIPM_PATH = Helpers.wifipm_path(); if (WIFIPM_PATH == null) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("wifi_pm"); getPreferenceScreen().removePreference(hideCat); } else { mWifiPM.setChecked(Helpers.LeerUnaLinea(WIFIPM_PATH).equals("1")); } final String readahead = Helpers.LeerUnaLinea(READ_AHEAD_PATH); mReadAhead.setValue(readahead); mReadAhead.setSummary(getString(R.string.ps_read_ahead, readahead + " kb")); setHasOptionsMenu(true); } @Override public void onResume() { super.onResume(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.tablist: Helpers.getTabList(getString(R.string.menu_tab), (ViewPager) getView().getParent(), getActivity()); break; case R.id.app_settings: Intent intent = new Intent(context, Settings.class); startActivity(intent); break; } return true; } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference == mDsync) { if (Helpers.LeerUnaLinea(DSYNC_PATH).equals("0")) { new CMDProcessor().su.runWaitFor("busybox echo 1 > " + DSYNC_PATH); } else { new CMDProcessor().su.runWaitFor("busybox echo 0 > " + DSYNC_PATH); } return true; } else if (preference == mBltimeout) { openDialog(getString(R.string.bltimeout_title), 0, 5000, preference, BL_TIMEOUT_PATH, PREF_BLTIMEOUT); return true; } else if (preference == mBltouch) { if (Helpers.LeerUnaLinea(BL_TOUCH_ON_PATH).equals("0")) { new CMDProcessor().su.runWaitFor("busybox echo 1 > " + BL_TOUCH_ON_PATH); } else { new CMDProcessor().su.runWaitFor("busybox echo 0 > " + BL_TOUCH_ON_PATH); } return true; } else if (preference == mBln) { if (Helpers.LeerUnaLinea(BLN_PATH).equals("0")) { new CMDProcessor().su.runWaitFor("busybox echo 1 > " + BLN_PATH); } else { new CMDProcessor().su.runWaitFor("busybox echo 0 > " + BLN_PATH); } return true; } else if (preference == mTouchScr) { Intent intent = new Intent(context, TouchScreenSettings.class); startActivity(intent); return true; } else if (preference == mViber) { openDialog(getString(R.string.viber_title), vib.get_min(), vib.get_max(), preference, VIBE_PATH, "pref_viber"); return true; } else if (preference == mPFK) { Intent intent = new Intent(context, PFKActivity.class); startActivity(intent); return true; } else if (preference == mDynamicWriteBackOn) { if (Helpers.LeerUnaLinea(DYNAMIC_DIRTY_WRITEBACK_PATH).equals("0")) { new CMDProcessor().su.runWaitFor("busybox echo 1 > " + DYNAMIC_DIRTY_WRITEBACK_PATH); } else { new CMDProcessor().su.runWaitFor("busybox echo 0 > " + DYNAMIC_DIRTY_WRITEBACK_PATH); } return true; } else if (preference == mDynamicWriteBackActive) { openDialog(getString(R.string.dynamic_writeback_active_title), 0, 5000, preference, DIRTY_WRITEBACK_ACTIVE_PATH, PREF_DIRTY_WRITEBACK_ACTIVE); return true; } else if (preference == mDynamicWriteBackSuspend) { openDialog(getString(R.string.dynamic_writeback_suspend_title), 0, 5000, preference, DIRTY_WRITEBACK_SUSPEND_PATH, PREF_DIRTY_WRITEBACK_SUSPEND); return true; } else if (preference == mVM) { Intent intent = new Intent(context, VMSettings.class); startActivity(intent); return true; } else if (preference == mWifiPM) { if (Helpers.LeerUnaLinea(WIFIPM_PATH).equals("0")) { new CMDProcessor().su.runWaitFor("busybox echo 1 > " + WIFIPM_PATH); } else { new CMDProcessor().su.runWaitFor("busybox echo 0 > " + WIFIPM_PATH); } return true; } return super.onPreferenceTreeClick(preferenceScreen, preference); } @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, String key) { final SharedPreferences.Editor editor = sharedPreferences.edit(); if (key.equals(PREF_READ_AHEAD)) { final String values = mReadAhead.getValue(); if (!values.equals(Helpers.LeerUnaLinea(READ_AHEAD_PATH))) { for (byte i = 0; i < 2; i++) { if (new File(READ_AHEAD_PATH.replace("mmcblk0", "mmcblk" + i)).exists()) new CMDProcessor().su.runWaitFor("busybox echo " + values + " > " + READ_AHEAD_PATH.replace("mmcblk0", "mmcblk" + i)); } } mReadAhead.setSummary(sreadahead + values + " kb"); } else if (key.equals(PREF_BLTIMEOUT)) { mBltimeout.setSummary(Helpers.LeerUnaLinea(BL_TIMEOUT_PATH)); } else if (key.equals(BLX_SOB)) { if (sharedPreferences.getBoolean(key, false)) { editor.putInt(PREF_BLX, Integer.parseInt(Helpers.LeerUnaLinea(BLX_PATH))).apply(); } else { editor.remove(PREF_BLX).apply(); } } else if (key.equals(BLTIMEOUT_SOB)) { if (sharedPreferences.getBoolean(key, false)) { editor.putInt(PREF_BLTIMEOUT, Integer.parseInt(Helpers.LeerUnaLinea(BL_TIMEOUT_PATH))).apply(); } else { editor.remove(PREF_BLTIMEOUT).apply(); } } else if (key.equals(PFK_SOB)) { if (sharedPreferences.getBoolean(key, false)) { if (Helpers.LeerUnaLinea(PFK_HOME_ENABLED).equals("1")) { editor.putBoolean(PFK_HOME_ON, true); } else { editor.putBoolean(PFK_HOME_ON, false); } editor.putInt(PREF_HOME_ALLOWED_IRQ, Integer.parseInt(Helpers.LeerUnaLinea(PFK_HOME_ALLOWED_IRQ))) .putInt(PREF_HOME_REPORT_WAIT, Integer.parseInt(Helpers.LeerUnaLinea(PFK_HOME_REPORT_WAIT))); if (Helpers.LeerUnaLinea(PFK_MENUBACK_ENABLED).equals("1")) { editor.putBoolean(PFK_MENUBACK_ON, true); } else { editor.putBoolean(PFK_MENUBACK_ON, false); } editor.putInt(PREF_MENUBACK_INTERRUPT_CHECKS, Integer.parseInt(Helpers.LeerUnaLinea(PFK_MENUBACK_INTERRUPT_CHECKS))) .putInt(PREF_MENUBACK_FIRST_ERR_WAIT, Integer.parseInt(Helpers.LeerUnaLinea(PFK_MENUBACK_FIRST_ERR_WAIT))) .putInt(PREF_MENUBACK_LAST_ERR_WAIT, Integer.parseInt(Helpers.LeerUnaLinea(PFK_MENUBACK_LAST_ERR_WAIT))) .apply(); } else { editor.remove(PFK_HOME_ON).remove(PREF_HOME_ALLOWED_IRQ).remove(PREF_HOME_REPORT_WAIT) .remove(PFK_MENUBACK_ON).remove(PREF_MENUBACK_INTERRUPT_CHECKS) .remove(PREF_MENUBACK_FIRST_ERR_WAIT).remove(PREF_MENUBACK_LAST_ERR_WAIT).apply(); } } else if (key.equals(DYNAMIC_DIRTY_WRITEBACK_SOB)) { if (sharedPreferences.getBoolean(key, false)) { if (Helpers.LeerUnaLinea(DYNAMIC_DIRTY_WRITEBACK_PATH).equals("1")) { editor.putBoolean(PREF_DYNAMIC_DIRTY_WRITEBACK, true); } else { editor.putBoolean(PREF_DYNAMIC_DIRTY_WRITEBACK, false); } editor.putInt(PREF_DIRTY_WRITEBACK_ACTIVE, Integer.parseInt(Helpers.LeerUnaLinea(DIRTY_WRITEBACK_ACTIVE_PATH))) .putInt(PREF_DIRTY_WRITEBACK_SUSPEND, Integer.parseInt(Helpers.LeerUnaLinea(DIRTY_WRITEBACK_SUSPEND_PATH))) .apply(); } else { editor.remove(PREF_DYNAMIC_DIRTY_WRITEBACK).remove(PREF_DIRTY_WRITEBACK_ACTIVE) .remove(PREF_DIRTY_WRITEBACK_SUSPEND).apply(); } } } public void openDialog(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); final EditText settingText; 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 - min); int currentProgress = min; if (key.equals("pref_viber")) { currentProgress = Integer.parseInt(Helpers.LeerUnaLinea(path)); } else { currentProgress = Integer.parseInt(vib.get_val(path)); } if (currentProgress > max) currentProgress = max - min; else if (currentProgress < min) currentProgress = 0; else currentProgress = currentProgress - min; seekbar.setProgress(currentProgress); settingText = (EditText) alphaDialog.findViewById(R.id.setting_text); settingText.setText(Integer.toString(currentProgress + min)); 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()) - min; seekbar.setProgress(val); return true; } return false; } }); 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 - min); } catch (NumberFormatException ex) { } } }); OnSeekBarChangeListener seekBarChangeListener = new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) { final int mSeekbarProgress = seekbar.getProgress(); if (fromUser) { settingText.setText(Integer.toString(mSeekbarProgress + min)); } } @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 = min; if (!settingText.getText().toString().equals("")) val = Integer.parseInt(settingText.getText().toString()); if (val < min) val = min; seekbar.setProgress(val - min); int newProgress = seekbar.getProgress() + min; new CMDProcessor().su .runWaitFor("busybox echo " + Integer.toString(newProgress) + " > " + path); String v; if (key.equals("pref_viber")) { v = vib.get_val(path); Vibrator vb = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); vb.vibrate(1000); } else { v = Helpers.LeerUnaLinea(path); } final SharedPreferences.Editor editor = mPreferences.edit(); editor.putInt(key, Integer.parseInt(v)).commit(); pref.setSummary(v); } }).create().show(); } private boolean no_touchscreen() { return (!new File(SLIDE2WAKE).exists() && !new File(SWIPE2WAKE).exists() && !new File(HOME2WAKE).exists() && !new File(LOGO2WAKE).exists() && !new File(LOGO2MENU).exists() && !new File(POCKET_DETECT).exists() && !new File(PICK2WAKE).exists() && !new File(FLICK2SLEEP).exists() && Helpers.touch2wake_path() == null); } }