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.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.res.Resources; import android.os.AsyncTask; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Environment; import android.preference.*; import android.support.v4.view.ViewPager; import android.text.format.DateUtils; import android.view.*; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import mx.klozz.xperience.tweaker.R; import mx.klozz.xperience.tweaker.activities.BuildPropEditor; import mx.klozz.xperience.tweaker.activities.FlasherActivity; import mx.klozz.xperience.tweaker.activities.FreezerActivity; import mx.klozz.xperience.tweaker.activities.Settings; import mx.klozz.xperience.tweaker.activities.ResidualsActivity; import mx.klozz.xperience.tweaker.activities.SysctlEditor; import mx.klozz.xperience.tweaker.util.CMDProcessor; import mx.klozz.xperience.tweaker.util.Constants; import mx.klozz.xperience.tweaker.helpers.Helpers; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; public class Tools extends PreferenceFragment implements OnSharedPreferenceChangeListener, Constants { private int tip; SharedPreferences mPreferences; private EditText settingText; private Boolean isrun = false; private ProgressDialog progressDialog; private Preference mResidualFiles; private Preference mOptimDB; private Context context; private String nf; private String dn; private final SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd_HHmmss"); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = getActivity(); mPreferences = PreferenceManager.getDefaultSharedPreferences(context); mPreferences.registerOnSharedPreferenceChangeListener(this); dn = mPreferences.getString("int_sd_path", Environment.getExternalStorageDirectory().getAbsolutePath()) + "/" + TAG + "/logs"; addPreferencesFromResource(R.layout.tools); new File(dn).mkdirs(); mResidualFiles = findPreference(RESIDUAL_FILES); mOptimDB = findPreference(PREF_OPTIM_DB); long mStartTime = mPreferences.getLong(RESIDUAL_FILES, 0); mResidualFiles.setSummary(""); if (mStartTime > 0) mResidualFiles.setSummary(DateUtils.getRelativeTimeSpanString(mStartTime)); mStartTime = mPreferences.getLong(PREF_OPTIM_DB, 0); mOptimDB.setSummary(""); if (mStartTime > 0) mOptimDB.setSummary(DateUtils.getRelativeTimeSpanString(mStartTime)); Preference mlogcat = findPreference("pref_logcat"); mlogcat.setSummary(getString(R.string.ps_logs, dn)); mlogcat = findPreference("pref_dmesg"); mlogcat.setSummary(getString(R.string.ps_logs, dn)); if (Helpers.BinExist("dd") == null || NO_FLASH) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("category_flash_img"); getPreferenceScreen().removePreference(hideCat); } if (Helpers.BinExist("pm") == null) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("category_freezer"); getPreferenceScreen().removePreference(hideCat); } if (!new File("/system/build.prop").exists()) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("category_build_prop"); getPreferenceScreen().removePreference(hideCat); } if (Helpers.BinExist("sysctl") == null) { PreferenceCategory hideCat = (PreferenceCategory) findPreference("category_sysctl"); getPreferenceScreen().removePreference(hideCat); } setRetainInstance(true); setHasOptionsMenu(true); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (isrun) { switch (tip) { case 0: progressDialog = ProgressDialog.show(context, getString(R.string.wipe_cache_title), getString(R.string.wait)); break; case 1: progressDialog = ProgressDialog.show(context, getString(R.string.fix_perms_title), getString(R.string.wait)); break; case 2: progressDialog = ProgressDialog.show(context, getString(R.string.optim_db_title), getString(R.string.wait)); break; case 3: progressDialog = ProgressDialog.show(context, getString(R.string.logcat_title), getString(R.string.wait)); break; case 4: progressDialog = ProgressDialog.show(context, getString(R.string.dmesg_title), getString(R.string.wait)); break; } } } @Override public void onResume() { super.onResume(); } @Override public void onDetach() { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } super.onDetach(); } @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 void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals(RESIDUAL_FILES)) { mResidualFiles.setSummary(""); final long mStartTime = sharedPreferences.getLong(key, 0); if (mStartTime > 0) mResidualFiles.setSummary(DateUtils.getRelativeTimeSpanString(mStartTime)); } else if (key.equals(PREF_OPTIM_DB)) { mOptimDB.setSummary(""); final long mStartTime = sharedPreferences.getLong(key, 0); if (mStartTime > 0) mOptimDB.setSummary(DateUtils.getRelativeTimeSpanString(mStartTime)); } } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { final String key = preference.getKey(); if (key.equals(PREF_SH)) { Resources res = context.getResources(); String cancel = res.getString(R.string.cancel); String ok = res.getString(R.string.ps_volt_save); LayoutInflater factory = LayoutInflater.from(context); final View alphaDialog = factory.inflate(R.layout.sh_dialog, null); settingText = (EditText) alphaDialog.findViewById(R.id.shText); settingText.setHint(R.string.sh_msg); settingText.setText(mPreferences.getString(key, "")); settingText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { return true; } }); new AlertDialog.Builder(context).setTitle(getString(R.string.sh_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) { final SharedPreferences.Editor editor = mPreferences.edit(); editor.putString(key, settingText.getText().toString()).commit(); } }).create().show(); } else if (key.equals(PREF_WIPE_CACHE)) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getString(R.string.wipe_cache_title)).setMessage(getString(R.string.wipe_cache_msg)) .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }).setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); //alertDialog.setCancelable(false); Button theButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); theButton.setOnClickListener(new opListener(alertDialog, 0)); } else if (key.equals(FLASH_KERNEL)) { Intent flash = new Intent(context, FlasherActivity.class); flash.putExtra("mod", "kernel"); startActivity(flash); } else if (key.equals(RESIDUAL_FILES)) { Intent intent = new Intent(context, ResidualsActivity.class); startActivity(intent); } else if (key.equals(PREF_FIX_PERMS)) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getString(R.string.fix_perms_title)).setMessage(getString(R.string.fix_perms_msg)) .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }).setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); //alertDialog.setCancelable(false); Button theButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); theButton.setOnClickListener(new opListener(alertDialog, 1)); } else if (key.equals(PREF_OPTIM_DB)) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getString(R.string.optim_db_title)) .setMessage(getString(R.string.ps_optim_db) + "\n\n" + getString(R.string.fix_perms_msg)) .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }).setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); //alertDialog.setCancelable(false); Button theButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); theButton.setOnClickListener(new opListener(alertDialog, 2)); } else if (key.equals(PREF_FRREZE)) { Intent intent = new Intent(context, FreezerActivity.class); intent.putExtra("freeze", true); intent.putExtra("packs", "usr"); startActivity(intent); } else if (key.equals(PREF_UNFRREZE)) { Intent intent = new Intent(context, FreezerActivity.class); intent.putExtra("freeze", false); startActivity(intent); } else if (key.equals("pref_build_prop")) { Intent intent = new Intent(context, BuildPropEditor.class); startActivity(intent); } else if (key.equals("pref_sysctl")) { Intent intent = new Intent(context, SysctlEditor.class); startActivity(intent); } else if (key.equals("pref_logcat")) { Date now = new Date(); nf = "/logcat_" + formatter.format(now) + ".txt"; AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getString(R.string.logcat_title)).setMessage(getString(R.string.logcat_msg, dn + nf)) .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }).setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); //alertDialog.setCancelable(false); Button theButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); theButton.setOnClickListener(new opListener(alertDialog, 3)); } else if (key.equals("pref_dmesg")) { Date now = new Date(); nf = "/dmesg_" + formatter.format(now) + ".txt"; AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getString(R.string.dmesg_title)).setMessage(getString(R.string.dmesg_msg, dn + nf)) .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }).setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); //alertDialog.setCancelable(false); Button theButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); theButton.setOnClickListener(new opListener(alertDialog, 4)); } return super.onPreferenceTreeClick(preferenceScreen, preference); } class opListener implements View.OnClickListener { private final Dialog dialog; private final int mod; public opListener(Dialog dialog, int k) { this.dialog = dialog; this.mod = k; } @Override public void onClick(View v) { dialog.cancel(); tip = this.mod; switch (tip) { case 0: new WipeCacheOperation().execute(); break; case 1: new FixPermissionsOperation().execute(); break; case 2: new DBoptimOperation().execute(); break; case 3: new LogcatOperation().execute(); break; case 4: new dmesgOperation().execute(); break; } } } private class FixPermissionsOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { new CMDProcessor().su.runWaitFor(context.getFilesDir() + "/fix_permissions"); return null; } @Override protected void onPostExecute(String result) { isrun = false; if (progressDialog != null) { progressDialog.dismiss(); } } @Override protected void onPreExecute() { isrun = true; progressDialog = ProgressDialog.show(context, getString(R.string.fix_perms_title), getString(R.string.wait)); Helpers.get_assetsScript("fix_permissions", context, "#", ""); new CMDProcessor().sh.runWaitFor("busybox chmod 750 " + context.getFilesDir() + "/fix_permissions"); } } private class WipeCacheOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { final StringBuilder sb = new StringBuilder(); sb.append("busybox rm -rf /data/dalvik-cache/*\n"); sb.append("busybox rm -rf /cache/*\n"); sb.append("reboot\n"); mPreferences.edit().putBoolean("booting", true).commit(); Helpers.shExec(sb, context, true); return null; } @Override protected void onPostExecute(String result) { isrun = false; if (progressDialog != null) { progressDialog.dismiss(); } } @Override protected void onPreExecute() { isrun = true; progressDialog = ProgressDialog.show(context, getString(R.string.wipe_cache_title), getString(R.string.wait)); } } private class DBoptimOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { new CMDProcessor().su.runWaitFor(context.getFilesDir() + "/sql_optimize"); return null; } @Override protected void onPostExecute(String result) { isrun = false; if (progressDialog != null) { progressDialog.dismiss(); } } @Override protected void onPreExecute() { isrun = true; progressDialog = ProgressDialog.show(context, getString(R.string.optim_db_title), getString(R.string.wait)); mPreferences.edit().putLong(PREF_OPTIM_DB, System.currentTimeMillis()).commit(); Helpers.get_assetsBinary("sqlite3", context); Helpers.get_assetsScript("sql_optimize", context, "busybox chmod 750 " + context.getFilesDir() + "/sqlite3", ""); new CMDProcessor().sh.runWaitFor("busybox chmod 750 " + context.getFilesDir() + "/sql_optimize"); } } private class LogcatOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { new CMDProcessor().sh.runWaitFor("logcat -v time -d > " + dn + nf); return null; } @Override protected void onPostExecute(String result) { isrun = false; if (progressDialog != null) { progressDialog.dismiss(); } } @Override protected void onPreExecute() { isrun = true; progressDialog = ProgressDialog.show(context, getString(R.string.logcat_title), getString(R.string.wait)); } } private class dmesgOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { new CMDProcessor().sh.runWaitFor("dmesg > " + dn + nf); return null; } @Override protected void onPostExecute(String result) { isrun = false; if (progressDialog != null) { progressDialog.dismiss(); } } @Override protected void onPreExecute() { isrun = true; progressDialog = ProgressDialog.show(context, getString(R.string.dmesg_title), getString(R.string.wait)); } } }