package com.dsht.kerneltweaker.fragments; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import com.dsht.kerneltweaker.MainActivity; import com.dsht.kerneltweaker.R; import com.dsht.kernetweaker.cmdprocessor.CMDProcessor; import android.app.ProgressDialog; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.util.Log; public class InitD extends PreferenceFragment implements OnPreferenceChangeListener { private static final String KEY_ZIPALIGN_APKS = "zipalign_apks"; private static final String KEY_FIX_PERMISSIONS = "fix_permissions"; private static final String KEY_CLEAR_DATA_CACHE = "clear_data_cache"; private static final String KEY_ENABLE_CRON = "enable_cron"; private static final String KEY_FILE_SYSTEM_SPEEDUPS = "file_system_speedups"; private static final String REMOUNT_CMD = "busybox mount -o %s,remount /dev/block/mmcblk0p1 /system"; private static final String[] KEYS = { KEY_ZIPALIGN_APKS, //0 KEY_FIX_PERMISSIONS, //1 KEY_CLEAR_DATA_CACHE, //2 KEY_ENABLE_CRON, //3 KEY_FILE_SYSTEM_SPEEDUPS, //4 }; protected SharedPreferences mPrefs; private CheckBoxPreference mZipAlign; private CheckBoxPreference mFixPermissions; private CheckBoxPreference mClearCache; private CheckBoxPreference mEnableCron; private CheckBoxPreference mSysSpeedup; private static InitD sActivity; private static final String SCRIPT_HEAD = "#!/system/bin/sh"; private static final String SCRIPT_HELPERS = ". /system/etc/helpers.sh"; private static final String SCRIPT_PERMS = "chmod 755"; private static final String ZIPALIGN_FILE = "01zipalign"; private static final String INIT_PATH = "/system/etc/init.d/"; private static final String CLEAR_CACHE_COMMAND = "busybox find /data/data -type d -iname \"*cache*\" -maxdepth 2 -mindepth 2 -exec busybox rm -rf {} ';' "; private static final String CACHE_FILE = "06removecache"; private static final String FIXPERMS_FILE = "07fixperms"; private static final String CRON_FILE = "09cron"; private static final String TWEAKS_FILE = "98tweaks"; public static InitD whatActivity() { return sActivity; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sActivity = this; mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); addPreferencesFromResource(R.xml.init_d); mZipAlign = (CheckBoxPreference) findPreference(KEYS[0]); mFixPermissions = (CheckBoxPreference) findPreference(KEYS[1]); mClearCache = (CheckBoxPreference) findPreference(KEYS[2]); mEnableCron = (CheckBoxPreference) findPreference(KEYS[3]); mSysSpeedup = (CheckBoxPreference) findPreference(KEYS[4]); mZipAlign.setOnPreferenceChangeListener(this); mFixPermissions.setOnPreferenceChangeListener(this); mClearCache.setOnPreferenceChangeListener(this); mEnableCron.setOnPreferenceChangeListener(this); mSysSpeedup.setOnPreferenceChangeListener(this); loadValues(); copyHelpers(); if(MainActivity.menu.isMenuShowing()) { MainActivity.menu.toggle(true); } } @Override public boolean onPreferenceChange(Preference pref, Object newValue) { // TODO Auto-generated method stub boolean value = (Boolean)newValue; if(pref == mZipAlign) { if(value) { createInitD(ZIPALIGN_FILE, "zipalign_apks"); } else { deleteInitD(INIT_PATH+ZIPALIGN_FILE); } return true; } if(pref == mFixPermissions) { if(value) { createInitD(FIXPERMS_FILE,"fix_permissions"); } else { deleteInitD(INIT_PATH+FIXPERMS_FILE); } return true; } if(pref == mClearCache) { if(value) { createInitD(CACHE_FILE, CLEAR_CACHE_COMMAND); }else { deleteInitD(INIT_PATH+CACHE_FILE); } return true; } if(pref == mEnableCron) { if(value) { copyScript(CRON_FILE); }else { deleteInitD(INIT_PATH+CRON_FILE); } return true; } if(pref == mSysSpeedup) { if(value) { copyScript(TWEAKS_FILE); }else { deleteInitD(INIT_PATH+TWEAKS_FILE); } return true; } loadValues(); return false; } private void createInitD(final String filename, final String filecontent) { class AsyncCreateInitTask extends AsyncTask<Void, Void, Boolean> { ProgressDialog pd; @Override protected void onPreExecute() { pd = new ProgressDialog(getActivity()); pd.setIndeterminate(true); pd.setMessage("Creating script...Please wait"); pd.setCancelable(false); pd.show(); } @Override protected Boolean doInBackground(Void... params) { mount("rw"); new CMDProcessor().su.runWaitFor("echo \""+SCRIPT_HEAD+"\" >> " + INIT_PATH + filename); new CMDProcessor().su.runWaitFor("echo \""+SCRIPT_HELPERS+"\" >> "+ INIT_PATH + filename ); new CMDProcessor().su.runWaitFor("echo \""+ filecontent + "\" >> " + INIT_PATH + filename); new CMDProcessor().su.runWaitFor(SCRIPT_PERMS+" " + INIT_PATH + filename); mount("ro"); return true; } @Override protected void onPostExecute(Boolean res) { // result holds what you return from doInBackground super.onPostExecute(res); pd.dismiss(); } } new AsyncCreateInitTask().execute(); } private void deleteInitD(final String filepath) { class AsyncDeleteInitTask extends AsyncTask<Void, Void, Boolean> { ProgressDialog pd; @Override protected void onPreExecute() { pd = new ProgressDialog(getActivity()); pd.setIndeterminate(true); pd.setMessage("Deleting script...Please wait"); pd.setCancelable(false); pd.show(); } @Override protected Boolean doInBackground(Void... params) { mount("rw"); new CMDProcessor().su.runWaitFor("rm -f "+filepath); mount("ro"); return true; } @Override protected void onPostExecute(Boolean res) { // result holds what you return from doInBackground super.onPostExecute(res); pd.dismiss(); } } new AsyncDeleteInitTask().execute(); } private void loadValues() { if(new File(INIT_PATH+ZIPALIGN_FILE).exists()) { mZipAlign.setChecked(true); } if(new File(INIT_PATH+FIXPERMS_FILE).exists()) { mFixPermissions.setChecked(true); } if(new File(INIT_PATH+CACHE_FILE).exists()) { mClearCache.setChecked(true); } if(new File(INIT_PATH+CRON_FILE).exists()) { mEnableCron.setChecked(true); } if(new File(INIT_PATH+TWEAKS_FILE).exists()) { mSysSpeedup.setChecked(true); } } public boolean mount(String read_value) { Log.d("TAG", "Remounting /system " + read_value); return new CMDProcessor().su.runWaitFor(String.format(REMOUNT_CMD, read_value)).success(); } private void copyHelpers() { if(!new File("/system/etc/helpers.sh").exists()) { class AsyncCopyHelpersTask extends AsyncTask<Void, Void, Boolean> { ProgressDialog pd; @Override protected void onPreExecute() { pd = new ProgressDialog(getActivity()); pd.setIndeterminate(true); pd.setMessage("Copying Helpers...Please wait"); pd.setCancelable(false); pd.show(); } @Override protected Boolean doInBackground(Void... params) { mount("rw"); new CMDProcessor().su.runWaitFor("cp /data/data/com.dsht.kerneltweaker/files/helpers.sh " + "/system/etc"); new CMDProcessor().su.runWaitFor("chmod 644 /system/etc/helpers.sh"); mount("ro"); return true; } @Override protected void onPostExecute(Boolean res) { // result holds what you return from doInBackground super.onPostExecute(res); pd.dismiss(); } } new AsyncCopyHelpersTask().execute(); } } private void copyScript(final String name) { class AsyncCopyScriptTask extends AsyncTask<Void, Void, Boolean> { ProgressDialog pd; @Override protected void onPreExecute() { pd = new ProgressDialog(getActivity()); pd.setIndeterminate(true); pd.setMessage("Copying script...Please wait"); pd.setCancelable(false); pd.show(); } @Override protected Boolean doInBackground(Void... params) { copyAsset(name); mount("rw"); new CMDProcessor().su.runWaitFor("cp /data/data/com.dsht.kerneltweaker/files/"+name+" " + "/system/etc/init.d"); new CMDProcessor().su.runWaitFor("chmod 644 /system/etc/init.d/"+name); mount("ro"); return true; } @Override protected void onPostExecute(Boolean res) { // result holds what you return from doInBackground super.onPostExecute(res); pd.dismiss(); } } new AsyncCopyScriptTask().execute(); } private void copyAsset(String name) { if(!new File(getActivity().getFilesDir().getPath(),name).exists()) { InputStream stream = null; OutputStream output = null; try { stream = getActivity().getAssets().open(name); output = new BufferedOutputStream(new FileOutputStream(getActivity().getFilesDir()+"/"+name)); byte data[] = new byte[1024]; int count; while((count = stream.read(data)) != -1) { output.write(data, 0, count); } output.flush(); output.close(); stream.close(); stream = null; output = null; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }