package com.dsht.kerneltweaker.fragments;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.text.InputFilter;
import android.text.InputFilter.LengthFilter;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.File;
import java.io.FileWriter;
import com.dsht.kerneltweaker.Helpers;
import com.dsht.kerneltweaker.MainActivity;
import com.dsht.kerneltweaker.R;
import com.dsht.kernetweaker.cmdprocessor.CMDProcessor;
public class PropModder extends PreferenceFragment implements
Preference.OnPreferenceChangeListener {
private static final String TAG = "PropModder";
private static final String APPEND_CMD = "echo \"%s=%s\" >> /system/build.prop";
private static final String KILL_PROP_CMD = "busybox sed -i \"/%s/D\" /system/build.prop";
private static final String REPLACE_CMD = "busybox sed -i \"/%s/ c %<s=%s\" /system/build.prop";
private static final String REMOUNT_CMD = "busybox mount -o %s,remount -t yaffs2 /dev/block/mtdblock1 /system";
private static final String PROP_EXISTS_CMD = "grep -q %s /system/build.prop";
private static final String DISABLE = "disable";
private static final String SHOWBUILD_PATH = "/system/tmp/showbuild";
private static final String WIFI_SCAN_PREF = "pref_wifi_scan_interval";
private static final String WIFI_SCAN_PROP = "wifi.supplicant_scan_interval";
private static final String WIFI_SCAN_PERSIST_PROP = "persist.wifi_scan_interval";
private static final String WIFI_SCAN_DEFAULT = System.getProperty(WIFI_SCAN_PROP);
private static final String MAX_EVENTS_PREF = "pref_max_events";
private static final String MAX_EVENTS_PROP = "windowsmgr.max_events_per_sec";
private static final String MAX_EVENTS_PERSIST_PROP = "persist.max_events";
private static final String MAX_EVENTS_DEFAULT = System.getProperty(MAX_EVENTS_PROP);
private static final String USB_MODE_PROP = "ro.default_usb_mode";
private static final String USB_MODE_DEFAULT = System.getProperty(USB_MODE_PROP);
private static final String RING_DELAY_PREF = "pref_ring_delay";
private static final String RING_DELAY_PROP = "ro.telephony.call_ring.delay";
private static final String RING_DELAY_PERSIST_PROP = "persist.call_ring.delay";
private static final String RING_DELAY_DEFAULT = System.getProperty(RING_DELAY_PROP);
private static final String VM_HEAPSIZE_PREF = "pref_vm_heapsize";
private static final String VM_HEAPSIZE_PROP = "dalvik.vm.heapsize";
private static final String VM_HEAPSIZE_PERSIST_PROP = "persist.vm_heapsize";
private static final String VM_HEAPSIZE_DEFAULT = System.getProperty(VM_HEAPSIZE_PROP);
private static final String FAST_UP_PREF = "pref_fast_up";
private static final String FAST_UP_PROP = "ro.ril.hsxpa";
private static final String FAST_UP_PERSIST_PROP = "persist.fast_up";
private static final String FAST_UP_DEFAULT = System.getProperty(FAST_UP_PROP);
private static final String PROX_DELAY_PREF = "pref_prox_delay";
private static final String PROX_DELAY_PROP = "mot.proximity.delay";
private static final String PROX_DELAY_PERSIST_PROP = "persist.prox.delay";
private static final String PROX_DELAY_DEFAULT = System.getProperty(PROX_DELAY_PROP);
private static final String MOD_VERSION_PREF = "pref_mod_version";
private static final String MOD_VERSION_PROP = "ro.build.display.id";
private static final String MOD_VERSION_PERSIST_PROP = "persist.build.display.id";
private static final String MOD_VERSION_DEFAULT = System.getProperty(MOD_VERSION_PROP);
private static final String MOD_LCD_PROP = "ro.sf.lcd_density";
private static final String MOD_LCD_PREF = "pref_lcd_density";
private static final String MOD_LCD_PERSIST_PROP = "persist.lcd_density";
private static final String SLEEP_PREF = "pref_sleep";
private static final String SLEEP_PROP = "pm.sleep_mode";
private static final String SLEEP_PERSIST_PROP = "persist.sleep";
private static final String SLEEP_DEFAULT = System.getProperty(SLEEP_PROP);
private static final String TCP_STACK_PREF = "pref_tcp_stack";
private static final String TCP_STACK_PERSIST_PROP = "persist_tcp_stack";
private static final String TCP_STACK_PROP_0 = "net.tcp.buffersize.default";
private static final String TCP_STACK_PROP_1 = "net.tcp.buffersize.wifi";
private static final String TCP_STACK_PROP_2 = "net.tcp.buffersize.umts";
private static final String TCP_STACK_PROP_3 = "net.tcp.buffersize.gprs";
private static final String TCP_STACK_PROP_4 = "net.tcp.buffersize.edge";
private static final String TCP_STACK_BUFFER = "4096,87380,256960,4096,16384,256960";
private static final String JIT_PREF = "pref_jit";
private static final String JIT_PERSIST_PROP = "persist_jit";
private static final String JIT_PROP = "dalvik.vm.execution-mode";
private static final String THREE_G_PREF = "pref_g_speed";
private static final String THREE_G_PERSIST_PROP = "persist_3g_speed";
private static final String THREE_G_PROP_0 = "ro.ril.enable.3g.prefix";
private static final String THREE_G_PROP_1 = "ro.ril.hep";
private static final String THREE_G_PROP_2 = FAST_UP_PROP;
private static final String THREE_G_PROP_3 = "ro.ril.enable.dtm";
private static final String THREE_G_PROP_4 = "ro.ril.gprsclass";
private static final String THREE_G_PROP_5 = "ro.ril.hsdpa.category";
private static final String THREE_G_PROP_6 = "ro.ril.enable.a53";
private static final String THREE_G_PROP_7 = "ro.ril.hsupa.category";
private static final String GPU_PREF = "pref_gpu";
private static final String GPU_PERSIST_PROP = "persist_gpu";
private static final String GPU_PROP = "debug.sf.hw";
private ListPreference mWifiScanPref;
private ListPreference mMaxEventsPref;
private ListPreference mRingDelayPref;
private ListPreference mVmHeapsizePref;
private ListPreference mFastUpPref;
private ListPreference mProxDelayPref;
private EditTextPreference mModVersionPref;
private EditTextPreference mLcdPref;
private ListPreference mSleepPref;
private CheckBoxPreference mTcpStackPref;
private CheckBoxPreference mJitPref;
private CheckBoxPreference m3gSpeedPref;
private CheckBoxPreference mGpuPref;
private File tmpDir = new File("/system/tmp");
private File init_d = new File("/system/etc/init.d");
private boolean result = false;
//handler for command processor
private final CMDProcessor cmd = new CMDProcessor();
private PreferenceScreen prefSet;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.propmodder);
prefSet = getPreferenceScreen();
mWifiScanPref = (ListPreference) prefSet.findPreference(WIFI_SCAN_PREF);
mWifiScanPref.setOnPreferenceChangeListener(this);
mMaxEventsPref = (ListPreference) prefSet.findPreference(MAX_EVENTS_PREF);
mMaxEventsPref.setOnPreferenceChangeListener(this);
mRingDelayPref = (ListPreference) prefSet.findPreference(RING_DELAY_PREF);
mRingDelayPref.setOnPreferenceChangeListener(this);
mVmHeapsizePref = (ListPreference) prefSet.findPreference(VM_HEAPSIZE_PREF);
mVmHeapsizePref.setOnPreferenceChangeListener(this);
mFastUpPref = (ListPreference) prefSet.findPreference(FAST_UP_PREF);
mFastUpPref.setOnPreferenceChangeListener(this);
mProxDelayPref = (ListPreference) prefSet.findPreference(PROX_DELAY_PREF);
mProxDelayPref.setOnPreferenceChangeListener(this);
mSleepPref = (ListPreference) prefSet.findPreference(SLEEP_PREF);
mSleepPref.setOnPreferenceChangeListener(this);
mTcpStackPref = (CheckBoxPreference) prefSet.findPreference(TCP_STACK_PREF);
mJitPref = (CheckBoxPreference) prefSet.findPreference(JIT_PREF);
mModVersionPref = (EditTextPreference) prefSet.findPreference(MOD_VERSION_PREF);
String mod = Helpers.findBuildPropValueOf(MOD_VERSION_PROP);
if (mModVersionPref != null) {
EditText modET = mModVersionPref.getEditText();
if (modET != null){
InputFilter lengthFilter = new InputFilter.LengthFilter(100);
modET.setFilters(new InputFilter[]{lengthFilter});
modET.setSingleLine(true);
}
mModVersionPref.setSummary(String.format(getString(R.string.pref_mod_version_alt_summary), mod));
mModVersionPref.setText(mod);
}
//Log.d(TAG, String.format("ModPrefHoler = '%s' found build number = '%s'", mod));
mModVersionPref.setOnPreferenceChangeListener(this);
mLcdPref = (EditTextPreference) prefSet.findPreference(MOD_LCD_PREF);
String lcd = Helpers.findBuildPropValueOf(MOD_LCD_PROP);
if (mLcdPref != null) {
EditText lcdET = mLcdPref.getEditText();
if (lcdET != null){
InputFilter lengthFilter = new InputFilter.LengthFilter(3);
lcdET.setFilters(new InputFilter[]{lengthFilter});
lcdET.setSingleLine(true);
}
mLcdPref.setSummary(String.format(getString(R.string.pref_lcd_alt_summary), lcd));
mLcdPref.setText(lcd);
}
//Log.d(TAG, String.format("ModPrefHoler = '%s' found build number = '%s'", mod));
mLcdPref.setOnPreferenceChangeListener(this);
m3gSpeedPref = (CheckBoxPreference) prefSet.findPreference(THREE_G_PREF);
mGpuPref = (CheckBoxPreference) prefSet.findPreference(GPU_PREF);
updateScreen();
if(MainActivity.menu.isMenuShowing()) {
MainActivity.menu.toggle(true);
}
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onResume() {
super.onResume();
}
/* handle CheckBoxPreference clicks */
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
boolean value;
if (preference == mTcpStackPref) {
Log.d(TAG, "mTcpStackPref.onPreferenceTreeClick()");
value = mTcpStackPref.isChecked();
return doMod(null, TCP_STACK_PROP_0, String.valueOf(value ? TCP_STACK_BUFFER : DISABLE))
&& doMod(null, TCP_STACK_PROP_1, String.valueOf(value ? TCP_STACK_BUFFER : DISABLE))
&& doMod(null, TCP_STACK_PROP_2, String.valueOf(value ? TCP_STACK_BUFFER : DISABLE))
&& doMod(null, TCP_STACK_PROP_3, String.valueOf(value ? TCP_STACK_BUFFER : DISABLE))
&& doMod(TCP_STACK_PERSIST_PROP, TCP_STACK_PROP_4, String.valueOf(value ? TCP_STACK_BUFFER : DISABLE));
} else if (preference == mJitPref) {
Log.d(TAG, "mJitPref.onPreferenceTreeClick()");
value = mJitPref.isChecked();
if(value)
//return doMod(JIT_PERSIST_PROP, JIT_PROP, String.valueOf(value ? "int:fast" : "int:jit"));
return doMod(JIT_PERSIST_PROP, JIT_PROP, "int:jit");
else if(!value) {
return doMod(JIT_PERSIST_PROP, JIT_PROP, "int:fast");
}
} else if (preference == m3gSpeedPref) {
value = m3gSpeedPref.isChecked();
return doMod(THREE_G_PERSIST_PROP, THREE_G_PROP_0, String.valueOf(value ? 1 : DISABLE))
&& doMod(THREE_G_PERSIST_PROP, THREE_G_PROP_1, String.valueOf(value ? 1 : DISABLE))
&& doMod(THREE_G_PERSIST_PROP, THREE_G_PROP_2, String.valueOf(value ? 2 : DISABLE))
&& doMod(THREE_G_PERSIST_PROP, THREE_G_PROP_3, String.valueOf(value ? 1 : DISABLE))
&& doMod(THREE_G_PERSIST_PROP, THREE_G_PROP_4, String.valueOf(value ? 12 : DISABLE))
&& doMod(THREE_G_PERSIST_PROP, THREE_G_PROP_5, String.valueOf(value ? 8 : DISABLE))
&& doMod(THREE_G_PERSIST_PROP, THREE_G_PROP_6, String.valueOf(value ? 1 : DISABLE))
&& doMod(THREE_G_PERSIST_PROP, THREE_G_PROP_7, String.valueOf(value ? 5 : DISABLE));
} else if (preference == mGpuPref) {
value = mGpuPref.isChecked();
return doMod(GPU_PERSIST_PROP, GPU_PROP, String.valueOf(value ? 1 : DISABLE));
}
return false;
}
/* handle ListPreferences and EditTextPreferences */
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue != null) {
Log.e(TAG, "New preference selected: " + newValue);
if (preference == mWifiScanPref) {
return doMod(WIFI_SCAN_PERSIST_PROP, WIFI_SCAN_PROP,
newValue.toString());
} else if (preference == mMaxEventsPref) {
return doMod(MAX_EVENTS_PERSIST_PROP, MAX_EVENTS_PROP,
newValue.toString());
} else if (preference == mRingDelayPref) {
return doMod(RING_DELAY_PERSIST_PROP, RING_DELAY_PROP,
newValue.toString());
} else if (preference == mVmHeapsizePref) {
return doMod(VM_HEAPSIZE_PERSIST_PROP, VM_HEAPSIZE_PROP,
newValue.toString());
} else if (preference == mFastUpPref) {
return doMod(FAST_UP_PERSIST_PROP, FAST_UP_PROP,
newValue.toString());
} else if (preference == mProxDelayPref) {
return doMod(PROX_DELAY_PERSIST_PROP, PROX_DELAY_PROP,
newValue.toString());
} else if (preference == mModVersionPref) {
return doMod(MOD_VERSION_PERSIST_PROP, MOD_VERSION_PROP,
newValue.toString());
}else if (preference == mLcdPref) {
return doMod(MOD_LCD_PERSIST_PROP, MOD_LCD_PROP,
newValue.toString());
} else if (preference == mSleepPref) {
return doMod(SLEEP_PERSIST_PROP, SLEEP_PROP,
newValue.toString());
}
}
return false;
}
/* method to handle mods */
private boolean doMod(final String persist, final String key, final String value) {
result = false;
class AsyncDoModTask extends AsyncTask<Void, Void, Boolean> {
ProgressDialog pd;
@Override
protected void onPreExecute() {
pd = new ProgressDialog(getActivity());
pd.setIndeterminate(true);
pd.setMessage("Applying values...Please wait");
pd.setCancelable(false);
pd.show();
}
@Override
protected Boolean doInBackground(Void... params) {
Log.d(TAG, String.format("Calling script with args '%s' and '%s'", key, value));
backupBuildProp();
if (!mount("rw")) {
throw new RuntimeException("Could not remount /system rw");
}
boolean success = false;
try {
if (!propExists(key) && value.equals(DISABLE)) {
Log.d(TAG, String.format("We want {%s} DISABLED however it doesn't exist so we do nothing and move on", key));
} else if (propExists(key)) {
if (value.equals(DISABLE)) {
Log.d(TAG, String.format("value == %s", DISABLE));
success = cmd.su.runWaitFor(String.format(KILL_PROP_CMD, key)).success();
} else {
Log.d(TAG, String.format("value != %s", DISABLE));
success = cmd.su.runWaitFor(String.format(REPLACE_CMD, key, value)).success();
}
} else {
Log.d(TAG, "append command starting");
success = cmd.su.runWaitFor(String.format(APPEND_CMD, key, value)).success();
}
} finally {
};
return success;
}
@Override
protected void onPostExecute(Boolean res) {
// result holds what you return from doInBackground
super.onPostExecute(res);
result = res;
if (!res) {
restoreBuildProp();
} else {
updateScreen();
}
mount("ro");
pd.dismiss();
}
}
new AsyncDoModTask().execute();
return result;
}
public boolean mount(String read_value) {
Log.d(TAG, "Remounting /system " + read_value);
return cmd.su.runWaitFor(String.format(REMOUNT_CMD, read_value)).success();
}
public boolean propExists(String prop) {
Log.d(TAG, "Checking if prop " + prop + " exists in /system/build.prop");
return cmd.su.runWaitFor(String.format(PROP_EXISTS_CMD, prop)).success();
}
public void updateShowBuild() {
Log.d(TAG, "Setting up /system/tmp/showbuild");
try {
mount("rw");
cmd.su.runWaitFor("cp -f /system/build.prop " + SHOWBUILD_PATH).success();
cmd.su.runWaitFor("chmod 777 " + SHOWBUILD_PATH).success();
} finally {
mount("ro");
}
}
public boolean backupBuildProp() {
Log.d(TAG, "Backing up build.prop to /system/tmp/pm_build.prop");
return cmd.su.runWaitFor("cp /system/build.prop /system/tmp/pm_build.prop").success();
}
public boolean restoreBuildProp() {
Log.d(TAG, "Restoring build.prop from /system/tmp/pm_build.prop");
return cmd.su.runWaitFor("cp /system/tmp/pm_build.prop /system/build.prop").success();
}
public void updateScreen() {
//update all the summaries
String wifi = Helpers.findBuildPropValueOf(WIFI_SCAN_PROP);
if (!wifi.equals(DISABLE)) {
mWifiScanPref.setValue(wifi);
mWifiScanPref.setSummary(String.format(getString(R.string.pref_wifi_scan_alt_summary), wifi));
} else {
mWifiScanPref.setValue(WIFI_SCAN_DEFAULT);
}
String maxE = Helpers.findBuildPropValueOf(MAX_EVENTS_PROP);
if (!maxE.equals(DISABLE)) {
mMaxEventsPref.setValue(maxE);
mMaxEventsPref.setSummary(String.format(getString(R.string.pref_max_events_alt_summary), maxE));
} else {
mMaxEventsPref.setValue(MAX_EVENTS_DEFAULT);
}
String ring = Helpers.findBuildPropValueOf(RING_DELAY_PROP);
if (!ring.equals(DISABLE)) {
mRingDelayPref.setValue(ring);
mRingDelayPref.setSummary(String.format(getString(R.string.pref_ring_delay_alt_summary), ring));
} else {
mRingDelayPref.setValue(RING_DELAY_DEFAULT);
}
String vm = Helpers.findBuildPropValueOf(VM_HEAPSIZE_PROP);
if (!vm.equals(DISABLE)) {
mVmHeapsizePref.setValue(vm);
mVmHeapsizePref.setSummary(String.format(getString(R.string.pref_vm_heapsize_alt_summary), vm));
} else {
mVmHeapsizePref.setValue(VM_HEAPSIZE_DEFAULT);
}
String fast = Helpers.findBuildPropValueOf(FAST_UP_PROP);
if (!fast.equals(DISABLE)) {
mFastUpPref.setValue(fast);
mFastUpPref.setSummary(String.format(getString(R.string.pref_fast_up_alt_summary), fast));
} else {
mFastUpPref.setValue(FAST_UP_DEFAULT);
}
String prox = Helpers.findBuildPropValueOf(PROX_DELAY_PROP);
if (!prox.equals(DISABLE)) {
mProxDelayPref.setValue(prox);
mProxDelayPref.setSummary(String.format(getString(R.string.pref_prox_delay_alt_summary), prox));
} else {
mProxDelayPref.setValue(PROX_DELAY_DEFAULT);
}
String sleep = Helpers.findBuildPropValueOf(SLEEP_PROP);
if (!sleep.equals(DISABLE)) {
mSleepPref.setValue(sleep);
mSleepPref.setSummary(String.format(getString(R.string.pref_sleep_alt_summary), sleep));
} else {
mSleepPref.setValue(SLEEP_DEFAULT);
}
String tcp = Helpers.findBuildPropValueOf(TCP_STACK_PROP_0);
if (tcp.equals(TCP_STACK_BUFFER)) {
mTcpStackPref.setChecked(true);
} else {
mTcpStackPref.setChecked(false);
}
String jit = Helpers.findBuildPropValueOf(JIT_PROP);
if (jit.equals("int:jit")) {
mJitPref.setChecked(true);
} else {
mJitPref.setChecked(false);
}
String mod = Helpers.findBuildPropValueOf(MOD_VERSION_PROP);
mModVersionPref.setSummary(String.format(getString(R.string.pref_mod_version_alt_summary), mod));
String lcd = Helpers.findBuildPropValueOf(MOD_LCD_PROP);
mLcdPref.setSummary(String.format(getString(R.string.pref_lcd_alt_summary), lcd));
String g0 = Helpers.findBuildPropValueOf(THREE_G_PROP_0);
String g3 = Helpers.findBuildPropValueOf(THREE_G_PROP_3);
String g6 = Helpers.findBuildPropValueOf(THREE_G_PROP_6);
if (g0.equals("1") && g3.equals("1") && g6.equals("1")) {
m3gSpeedPref.setChecked(true);
} else {
m3gSpeedPref.setChecked(false);
}
String gpu = Helpers.findBuildPropValueOf(GPU_PROP);
if (!gpu.equals(DISABLE)) {
mGpuPref.setChecked(true);
} else {
mGpuPref.setChecked(false);
}
}
}