1 package de
.rmdir
.ms2debounce
; 
   3 import java
.io
.InputStream
; 
   4 import java
.io
.OutputStream
; 
   6 import java
.io
.FileReader
; 
   7 import java
.io
.BufferedReader
; 
   9 import android
.content
.Context
; 
  10 import android
.content
.SharedPreferences
; 
  12 public class DebounceModuleHelper
 
  15         public static final String PREFS_NAME 
= "DebounceCfg"; 
  17         public DebounceModuleHelper(Context context
) { 
  21         public void loadModule() { 
  22                 SharedPreferences settings 
= ctx
.getSharedPreferences(PREFS_NAME
, Context
.MODE_PRIVATE
); 
  24                 int delay 
= settings
.getInt("debounce_delay", 10); 
  28         public synchronized void loadModule(int delay
) { 
  29                 File debounce_ko 
= new File(ctx
.getFilesDir() + "/debounce.ko"); 
  33                 SharedPreferences settings 
= ctx
.getSharedPreferences(PREFS_NAME
, Context
.MODE_PRIVATE
); 
  34                 SharedPreferences
.Editor editor 
= settings
.edit(); 
  35                 if (is_safe_to_load()) { 
  36                         editor
.putBoolean("safe_to_load", false); 
  41                         Process insmod 
= Runtime
.getRuntime().exec(new String
[]{"su","-c","/system/bin/insmod " + debounce_ko 
+ " debounce_delay=" + delay
}); 
  43                 } catch (Exception e
) { 
  47                 if (getDelay() <= 0) { 
  51                 /* Module was obviously loaded, so it is safe to load on boot */ 
  52                 editor
.putBoolean("safe_to_load", true); 
  56         public synchronized void unloadModule() { 
  58                         Process rmmod 
= Runtime
.getRuntime().exec(new String
[]{"su","-c","/system/bin/rmmod debounce"}); 
  60                 } catch (Exception e
) {} 
  63         public synchronized boolean isLoaded() { 
  64                 boolean loaded 
= false; 
  68                         FileReader modules 
= new FileReader("/proc/modules"); 
  69                         BufferedReader modules_buf 
= new BufferedReader(modules
); 
  71                         while((read 
= modules_buf
.readLine()) != null) { 
  72                                 if (read
.regionMatches(0, "debounce", 0, 8)) { 
  77                 } catch (Exception e
) { 
  84         public synchronized int getDelay() { 
  85                 int debounce_delay 
= -1; 
  90                         FileReader delay 
= new FileReader("/sys/module/debounce/parameters/debounce_delay"); 
  91                         BufferedReader delay_buf 
= new BufferedReader(delay
); 
  93                         read 
= delay_buf
.readLine(); 
  95                                 debounce_delay 
= Integer
.parseInt(read
.trim()); 
  97                 } catch (Exception e
) {} 
  99                 return debounce_delay
; 
 102         public synchronized boolean is_safe_to_load() { 
 103                 SharedPreferences settings 
= ctx
.getSharedPreferences(PREFS_NAME
, Context
.MODE_PRIVATE
); 
 104                 boolean safe_to_load 
= settings
.getBoolean("safe_to_load", false); 
 109         private synchronized void extractModule() { 
 110                 File debounce_ko 
= new File(ctx
.getFilesDir() + "/debounce.ko"); 
 112                 if (debounce_ko
.exists()) { 
 117                         InputStream apk 
= ctx
.getAssets().open("debounce.ko"); 
 118                         OutputStream mod 
= ctx
.openFileOutput("debounce.ko.tmp", 0); 
 120                         //I assume a page is 4k... 
 121                         byte buf
[] = new byte[4096]; 
 124                         while((bytes 
= apk
.read(buf
)) != -1) { 
 125                                 mod
.write(buf
, 0, bytes
); 
 131                         File tmpfile 
= new File(debounce_ko 
+ ".tmp"); 
 132                         tmpfile
.renameTo(debounce_ko
); 
 133                 } catch (Exception e
) {}