1 package de
.rmdir
.ms2debounce
;
3 import android
.app
.Activity
;
4 import android
.app
.Dialog
;
5 import android
.app
.AlertDialog
;
6 import android
.os
.Bundle
;
7 import android
.content
.Intent
;
8 import android
.content
.DialogInterface
;
9 import android
.widget
.TextView
;
10 import android
.widget
.EditText
;
11 import android
.widget
.Button
;
12 import android
.widget
.CheckBox
;
13 import android
.view
.View
;
14 import android
.view
.Menu
;
15 import android
.view
.MenuInflater
;
16 import android
.view
.MenuItem
;
17 import android
.text
.TextWatcher
;
18 import android
.text
.Editable
;
20 public class MS2Debounce
extends Activity
22 private DebounceModuleHelper module
;
24 // Calling these is expensive, so cache the result...
25 private boolean loaded
;
26 private boolean safe_to_load
;
27 private int debounce_delay
;
28 private int settle_time
;
29 private int poll_time
;
30 private boolean hw_debounce_en
;
31 private int hw_debounce_time
;
32 private boolean drive_inactive_en
;
33 private boolean active_high_en
;
38 module
= new DebounceModuleHelper(this);
42 public void onCreate(Bundle savedInstanceState
)
44 super.onCreate(savedInstanceState
);
46 setContentView(R
.layout
.main
);
48 EditText textDelay
= (EditText
)findViewById(R
.id
.debounce_delay
);
49 textDelay
.addTextChangedListener(new TextWatcher() {
51 public void afterTextChanged(Editable delay
) {
52 if (delay
.toString().length() > 0) {
53 module
.setSavedDelay(Integer
.parseInt(delay
.toString()));
58 public void beforeTextChanged(CharSequence s
, int start
, int count
, int after
) {
62 public void onTextChanged(CharSequence s
, int start
, int before
, int count
) {
66 EditText textSettle
= (EditText
)findViewById(R
.id
.settle_time
);
67 textSettle
.addTextChangedListener(new TextWatcher() {
69 public void afterTextChanged(Editable settle_time
) {
70 if (settle_time
.toString().length() > 0) {
71 module
.setSavedSettle(Integer
.parseInt(settle_time
.toString()));
76 public void beforeTextChanged(CharSequence s
, int start
, int count
, int after
) {
80 public void onTextChanged(CharSequence s
, int start
, int before
, int count
) {
84 EditText textPoll
= (EditText
)findViewById(R
.id
.poll_time
);
85 textPoll
.addTextChangedListener(new TextWatcher() {
87 public void afterTextChanged(Editable poll_time
) {
88 if (poll_time
.toString().length() > 0) {
89 module
.setSavedPoll(Integer
.parseInt(poll_time
.toString()));
94 public void beforeTextChanged(CharSequence s
, int start
, int count
, int after
) {
98 public void onTextChanged(CharSequence s
, int start
, int before
, int count
) {
102 EditText textHwDebounceTime
= (EditText
)findViewById(R
.id
.hw_debounce_time
);
103 textHwDebounceTime
.addTextChangedListener(new TextWatcher() {
105 public void afterTextChanged(Editable hw_debounce_time
) {
106 if (hw_debounce_time
.toString().length() > 0) {
107 module
.setSavedHwDebounceTime(Integer
.parseInt(hw_debounce_time
.toString()));
112 public void beforeTextChanged(CharSequence s
, int start
, int count
, int after
) {
116 public void onTextChanged(CharSequence s
, int start
, int before
, int count
) {
123 private void updateUI() {
126 // Calling these is expensive, so cache the result...
127 loaded
= module
.isLoaded();
128 safe_to_load
= module
.is_safe_to_load();
129 debounce_delay
= module
.getDelay();
130 settle_time
= module
.getSettle();
131 poll_time
= module
.getPoll();
132 hw_debounce_en
= module
.getHwDebounce();
133 hw_debounce_time
= module
.getHwDebounceTime();
134 //drive_inactive_en = module.getDriveInactive();
135 active_high_en
= module
.getActiveHigh();
137 TextView text
= (TextView
)findViewById(R
.id
.text
);
138 text
.setText("Module loaded: " + loaded
+ "\n" +
139 "debounce_delay: " + debounce_delay
+ "ms\n" +
140 "settle_time: " + settle_time
+ "us\n" +
141 "poll_time: " + poll_time
+ "ms\n" +
142 "safe_to_load: " + safe_to_load
+ " (module loaded by this app)\n" +
143 "hw_debounce: " + (hw_debounce_en?
"en":"dis") + "abled, " + ((hw_debounce_time
+1)*31) + "us (" + hw_debounce_time
+ "), active high: " + (active_high_en?
"en":"dis") + "abled");
145 EditText textDelay
= (EditText
)findViewById(R
.id
.debounce_delay
);
146 textDelay
.setText(Integer
.toString(module
.getSavedDelay()));
147 textDelay
.setEnabled(true);
149 EditText textSettle
= (EditText
)findViewById(R
.id
.settle_time
);
150 textSettle
.setText(Integer
.toString(module
.getSavedSettle()));
151 textSettle
.setEnabled(true);
153 EditText textPoll
= (EditText
)findViewById(R
.id
.poll_time
);
154 textPoll
.setText(Integer
.toString(module
.getSavedPoll()));
155 textPoll
.setEnabled(true);
157 EditText textHwDebounceTime
= (EditText
)findViewById(R
.id
.hw_debounce_time
);
158 textHwDebounceTime
.setText(Integer
.toString(module
.getSavedHwDebounceTime()));
159 textHwDebounceTime
.setEnabled(true);
161 Button set
= (Button
)findViewById(R
.id
.set
);
163 set
.setEnabled(true);
165 set
.setEnabled(false);
168 Button load
= (Button
)findViewById(R
.id
.load
);
170 load
.setEnabled(false);
172 load
.setEnabled(true);
175 Button unload
= (Button
)findViewById(R
.id
.unload
);
177 unload
.setEnabled(true);
179 unload
.setEnabled(false);
182 CheckBox on_boot
= (CheckBox
)findViewById(R
.id
.on_boot
);
183 on_boot
.setChecked(module
.get_on_boot());
185 on_boot
.setEnabled(true);
187 on_boot
.setEnabled(false);
190 CheckBox hw_debounce
= (CheckBox
)findViewById(R
.id
.hw_debounce
);
191 hw_debounce
.setChecked(module
.getSavedHwDebounce());
192 hw_debounce
.setEnabled(true);
194 //CheckBox drive_inactive = (CheckBox)findViewById(R.id.drive_inactive);
195 //drive_inactive.setChecked(module.getSavedDriveInactive());
196 //drive_inactive.setEnabled(true);
198 CheckBox active_high
= (CheckBox
)findViewById(R
.id
.active_high
);
199 active_high
.setChecked(module
.getSavedActiveHigh());
200 active_high
.setEnabled(true);
203 private void disableUI() {
204 EditText textDelay
= (EditText
)findViewById(R
.id
.debounce_delay
);
205 textDelay
.setEnabled(false);
207 EditText textSettle
= (EditText
)findViewById(R
.id
.settle_time
);
208 textSettle
.setEnabled(false);
210 EditText textPoll
= (EditText
)findViewById(R
.id
.poll_time
);
211 textPoll
.setEnabled(false);
213 EditText textHwDebounceTime
= (EditText
)findViewById(R
.id
.hw_debounce_time
);
214 textHwDebounceTime
.setEnabled(false);
216 Button set
= (Button
)findViewById(R
.id
.set
);
217 set
.setEnabled(false);
219 Button load
= (Button
)findViewById(R
.id
.load
);
220 load
.setEnabled(false);
222 Button unload
= (Button
)findViewById(R
.id
.unload
);
223 unload
.setEnabled(false);
225 CheckBox on_boot
= (CheckBox
)findViewById(R
.id
.on_boot
);
226 on_boot
.setEnabled(false);
228 CheckBox hw_debounce
= (CheckBox
)findViewById(R
.id
.hw_debounce
);
229 hw_debounce
.setEnabled(false);
231 //CheckBox drive_inactive = (CheckBox)findViewById(R.id.drive_inactive);
232 //drive_inactive.setEnabled(false);
234 CheckBox active_high
= (CheckBox
)findViewById(R
.id
.active_high
);
235 active_high
.setEnabled(false);
238 public void loadModule(View view
) {
240 if (!module
.isLoaded()) {
242 if (!module
.loadModule())
244 } catch (NotRootedException e
) {
246 } catch (ShellException e
) {
253 public void unloadModule(View view
) {
255 if (module
.isLoaded()) {
257 module
.unloadModule();
258 } catch (NotRootedException e
) {
260 } catch (ShellException e
) {
267 public void setValues(View view
) {
269 if (!module
.isLoaded()) {
271 if (!module
.loadModule())
273 } catch (NotRootedException e
) {
275 } catch (ShellException e
) {
279 module
.setAllValues();
283 public void toggle_on_boot(View view
) {
284 CheckBox on_boot
= (CheckBox
)view
;
286 module
.set_on_boot(on_boot
.isChecked());
289 public void toggle_hw_debounce(View view
) {
290 CheckBox hw_debounce
= (CheckBox
)view
;
292 module
.setSavedHwDebounce(hw_debounce
.isChecked());
295 //public void toggle_drive_inactive(View view) {
296 // CheckBox drive_inactive = (CheckBox)view;
298 // module.setSavedDriveInactive(drive_inactive.isChecked());
301 public void toggle_active_high(View view
) {
302 CheckBox active_high
= (CheckBox
)view
;
304 module
.setSavedActiveHigh(active_high
.isChecked());
308 public boolean onCreateOptionsMenu(Menu menu
) {
309 MenuInflater inflater
= getMenuInflater();
310 inflater
.inflate(R
.menu
.main
, menu
);
315 public boolean onOptionsItemSelected(MenuItem item
) {
316 switch (item
.getItemId()) {
321 return super.onOptionsItemSelected(item
);
325 protected Dialog
onCreateDialog(int id
) {
330 AlertDialog
.Builder noload
= new AlertDialog
.Builder(this);
331 noload
.setMessage("Could not load/unload the module! Do you have a MS2/Droid2 with kernel 2.6.32?")
333 .setPositiveButton("Ok", new DialogInterface
.OnClickListener() {
334 public void onClick(DialogInterface dialog
, int id
) {
338 dlg
= noload
.create();
341 AlertDialog
.Builder noroot
= new AlertDialog
.Builder(this);
342 noroot
.setMessage("Could not get root access! Is this device rooted and have you granted Superuser privileges?")
344 .setPositiveButton("Ok", new DialogInterface
.OnClickListener() {
345 public void onClick(DialogInterface dialog
, int id
) {
349 dlg
= noroot
.create();
352 AlertDialog
.Builder shellexec
= new AlertDialog
.Builder(this);
353 shellexec
.setMessage("Problems executing shell commands as root! Is this device rooted, are insmod/rmmod binaries available and do you have a MS2/Droid2 with kernel 2.6.32 (or matching debounce-module for a custom kernel)?")
355 .setPositiveButton("Ok", new DialogInterface
.OnClickListener() {
356 public void onClick(DialogInterface dialog
, int id
) {
360 dlg
= shellexec
.create();
366 version
= getPackageManager().getPackageInfo(getPackageName(), 0).versionName
;
367 } catch (Exception e
) {
371 AlertDialog
.Builder about
= new AlertDialog
.Builder(this);
372 about
.setMessage("Milestone 2 Debounce " + version
+ "\n\n(C) 2011 Michael Gernoth <michael@gernoth.net>\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA")
374 .setPositiveButton("Ok", new DialogInterface
.OnClickListener() {
375 public void onClick(DialogInterface dialog
, int id
) {
379 dlg
= about
.create();