]> git.zerfleddert.de Git - ms2-fixes/blame - MS2Debounce/src/de/rmdir/ms2debounce/DebounceModuleHelper.java
small update to adapt app to new module interface
[ms2-fixes] / MS2Debounce / src / de / rmdir / ms2debounce / DebounceModuleHelper.java
CommitLineData
0ae502f6
MG
1package de.rmdir.ms2debounce;
2
5738a32f
MG
3import java.io.InputStream;
4import java.io.OutputStream;
226a7d4d 5import java.io.File;
d82ae589 6import java.io.FileReader;
0b9d6422 7import java.io.FileWriter;
d82ae589 8import java.io.BufferedReader;
0b9d6422 9import java.io.BufferedWriter;
6bb245ae 10import java.io.DataOutputStream;
226a7d4d 11
5738a32f 12import android.content.Context;
08fec0be 13import android.content.SharedPreferences;
5738a32f 14
0ae502f6
MG
15public class DebounceModuleHelper
16{
5738a32f 17 private Context ctx;
08fec0be 18 public static final String PREFS_NAME = "DebounceCfg";
6bb245ae 19 final int SUPERUSER_REQUEST = 4223;
226a7d4d 20
5738a32f
MG
21 public DebounceModuleHelper(Context context) {
22 ctx = context;
226a7d4d
MG
23 }
24
25 public void loadModule() {
0b9d6422
MG
26 _loadModule();
27 setDelay(getSavedDelay());
40697a47
MG
28 }
29
6bb245ae
MG
30 protected void runAsRoot(String command) throws java.io.IOException,java.lang.InterruptedException {
31 Process rootcmd = Runtime.getRuntime().exec(new String[]{"su","-c","sh"});
32 DataOutputStream sh = new DataOutputStream(rootcmd.getOutputStream());
33 sh.writeBytes(command + "\n");
34 sh.writeBytes("exit\n");
35 sh.flush();
36 sh.close();
37
38 rootcmd.waitFor();
39 }
40
0b9d6422 41 public synchronized void _loadModule() {
40697a47
MG
42 File debounce_ko = new File(ctx.getFilesDir() + "/debounce.ko");
43
226a7d4d
MG
44 extractModule();
45
d3e7b10c
MG
46 SharedPreferences settings = ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
47 SharedPreferences.Editor editor = settings.edit();
48 if (is_safe_to_load()) {
49 editor.putBoolean("safe_to_load", false);
50 editor.commit();
51 }
40697a47 52
0ae502f6 53 try {
0b9d6422 54 runAsRoot("/system/bin/insmod " + debounce_ko);
08fec0be
MG
55 } catch (Exception e) {
56 return;
a6cf1017
MG
57 }
58
59 if (!isLoaded()) {
60 return;
08fec0be 61 }
dea0f4b0 62
818fb327 63 if (getDelay() < 0) {
08fec0be
MG
64 return;
65 }
66
67 /* Module was obviously loaded, so it is safe to load on boot */
d3e7b10c
MG
68 editor.putBoolean("safe_to_load", true);
69 editor.commit();
0ae502f6
MG
70 }
71
08fec0be 72 public synchronized void unloadModule() {
40697a47 73 try {
6bb245ae 74 runAsRoot("/system/bin/rmmod debounce");
40697a47
MG
75 } catch (Exception e) {}
76 }
77
08fec0be 78 public synchronized boolean isLoaded() {
d82ae589
MG
79 boolean loaded = false;
80 try {
81 String read;
82
83 FileReader modules = new FileReader("/proc/modules");
84 BufferedReader modules_buf = new BufferedReader(modules);
85
86 while((read = modules_buf.readLine()) != null) {
87 if (read.regionMatches(0, "debounce", 0, 8)) {
88 loaded = true;
89 }
90 }
91
92 } catch (Exception e) {
93 loaded = false;
94 }
95
96 return loaded;
0ae502f6 97 }
226a7d4d 98
08fec0be 99 public synchronized int getDelay() {
d82ae589
MG
100 int debounce_delay = -1;
101
102 try {
103 String read;
104
0b9d6422 105 FileReader delay = new FileReader("/sys/devices/debounce/debounce_delay");
d82ae589
MG
106 BufferedReader delay_buf = new BufferedReader(delay);
107
108 read = delay_buf.readLine();
109 if (read != null) {
110 debounce_delay = Integer.parseInt(read.trim());
111 }
0b9d6422
MG
112
113 delay_buf.close();
d82ae589
MG
114 } catch (Exception e) {}
115
116 return debounce_delay;
ee6322a1
MG
117 }
118
0b9d6422
MG
119 public synchronized void setDelay(int debounce_delay) {
120 if (!isLoaded()) {
121 return;
376c6ac7
MG
122 }
123
0b9d6422
MG
124 try {
125 FileWriter delay = new FileWriter("/sys/devices/debounce/debounce_delay");
126 BufferedWriter delay_buf = new BufferedWriter(delay);
127
128 delay_buf.write((new Integer(debounce_delay)).toString());
129
130 delay_buf.close();
131 } catch (Exception e) {}
376c6ac7
MG
132 }
133
dea0f4b0
MG
134 public synchronized int getSavedDelay() {
135 SharedPreferences settings = ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
136
0b9d6422 137 return settings.getInt("debounce_delay", 8);
dea0f4b0
MG
138 }
139
140 public synchronized void setSavedDelay(int delay) {
141 SharedPreferences settings = ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
142 SharedPreferences.Editor editor = settings.edit();
143
144 editor.putInt("debounce_delay", delay);
145 editor.commit();
146 }
147
08fec0be
MG
148 public synchronized boolean is_safe_to_load() {
149 SharedPreferences settings = ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
c3053460
MG
150 return settings.getBoolean("safe_to_load", false);
151 }
152
153 public synchronized boolean get_on_boot() {
154 SharedPreferences settings = ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
155 return settings.getBoolean("on_boot", false);
156 }
08fec0be 157
c3053460
MG
158 public synchronized void set_on_boot(boolean on_boot) {
159 SharedPreferences settings = ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
160 SharedPreferences.Editor editor = settings.edit();
161
162 editor.putBoolean("on_boot", on_boot);
163 editor.commit();
08fec0be
MG
164 }
165
5738a32f
MG
166 private synchronized void extractModule() {
167 File debounce_ko = new File(ctx.getFilesDir() + "/debounce.ko");
226a7d4d
MG
168
169 if (debounce_ko.exists()) {
170 return;
171 }
5738a32f
MG
172
173 try {
174 InputStream apk = ctx.getAssets().open("debounce.ko");
40697a47
MG
175 OutputStream mod = ctx.openFileOutput("debounce.ko.tmp", 0);
176
177 //I assume a page is 4k...
178 byte buf[] = new byte[4096];
179 int bytes;
180
181 while((bytes = apk.read(buf)) != -1) {
182 mod.write(buf, 0, bytes);
183 }
5738a32f
MG
184
185 apk.close();
186 mod.close();
40697a47
MG
187
188 File tmpfile = new File(debounce_ko + ".tmp");
189 tmpfile.renameTo(debounce_ko);
5738a32f 190 } catch (Exception e) {}
226a7d4d 191 }
0ae502f6 192}
Impressum, Datenschutz