import android.content.Context;
import android.content.SharedPreferences;
+import android.util.Log;
public class DebounceModuleHelper
{
public static final String PREFS_NAME = "DebounceCfg";
final int SUPERUSER_REQUEST = 4223;
+ private static final String TAG = "DebounceModuleHelper";
+
public DebounceModuleHelper(Context context) {
ctx = context;
}
protected void runAsRoot(String command) throws NotRootedException,ShellException {
Process rootcmd;
+ Log.i(TAG, "Running as root: " + command);
try {
rootcmd = Runtime.getRuntime().exec(new String[]{"su","-c","sh"});
} catch (java.io.IOException e) {
+ Log.e(TAG, "Got IOException: " + e.getMessage() + " (" + e.getCause() + ")");
throw new NotRootedException();
}
sh.flush();
sh.close();
} catch (java.io.IOException e) {
+ Log.e(TAG, "Got IOException: " + e.getMessage() + " (" + e.getCause() + ")");
throw new ShellException();
}
try {
- if (rootcmd.waitFor() != 0)
+ int r = rootcmd.waitFor();
+
+ if (r != 0) {
+ Log.e(TAG, "Process returned: " + r);
throw new ShellException();
+ }
} catch (java.lang.InterruptedException e) {
+ Log.e(TAG, "Got InterruptedException: " + e.getMessage() + " (" + e.getCause() + ")");
throw new ShellException();
}
+
+ Log.i(TAG, "Process executed successfully");
}
public synchronized boolean _loadModule() throws NotRootedException,ShellException {
+ Log.i(TAG, "Loading module");
+
+ if (isLoaded()) {
+ Log.i(TAG, "Module already loaded");
+ return true;
+ }
+
File insmod = new File("/system/bin/insmod");
if (!insmod.exists()) {
insmod = new File("/system/xbin/insmod");
if (!insmod.exists()) {
+ Log.e(TAG, "insmod not found");
return false;
}
}
runAsRoot(insmod + " " + debounce_ko);
+ int cnt = 10;
+ while ((!isLoaded()) && (cnt > 0)) {
+ try {
+ Thread.sleep(100);
+ } catch (Exception e) {
+ Log.e(TAG, "Got Exception: " + e.getMessage() + " (" + e.getCause() + ")");
+ return false;
+ }
+ cnt--;
+ }
+
if (!isLoaded()) {
+ Log.e(TAG, "Module doesn't appear to be correctly loaded");
return false;
}
editor.putBoolean("safe_to_load", true);
editor.commit();
+ Log.i(TAG, "Module loaded successfully");
return true;
}
public synchronized void unloadModule() throws NotRootedException,ShellException {
+ Log.i(TAG, "Unloading module");
+
+ if (!isLoaded()) {
+ Log.i(TAG, "Module not loaded");
+ return;
+ }
+
File rmmod = new File("/system/bin/rmmod");
if (!rmmod.exists()) {
rmmod = new File("/system/xbin/rmmod");
if (!rmmod.exists()) {
+ Log.e(TAG, "rmmod not found");
return;
}
}
public synchronized boolean isLoaded() {
boolean loaded = false;
+
try {
String read;
while((read = modules_buf.readLine()) != null) {
if (read.regionMatches(0, "debounce", 0, 8)) {
- loaded = true;
+ File sysdir = new File("/sys/devices/debounce");
+ if (sysdir.exists() && sysdir.isDirectory()) {
+ loaded = true;
+ break;
+ }
}
}
-
} catch (Exception e) {
loaded = false;
}