<?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="de.rmdir.ms2debounce"
-      android:versionCode="1"
-      android:versionName="1.0">
+      android:versionCode="4"
+      android:versionName="1.4">
+    <uses-sdk android:minSdkVersion="8" />
+    <uses-configuration android:reqKeyboardType="qwerty" />
+    <supports-screens android:smallScreens="false"
+                     android:normalScreens="true"
+                     android:largeScreens="false" />
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     <application android:label="@string/app_name" android:icon="@drawable/icon">
         <activity android:name="MS2Debounce"
 
                setActiveHigh(getSavedActiveHigh());
        }
 
-       public void loadModule() {
-               _loadModule();
+       public boolean loadModule() {
+               if (!_loadModule())
+                       return false;
+
                setAllValues();
+
+               return true;
        }
 
        protected void runAsRoot(String command) throws java.io.IOException,java.lang.InterruptedException {
                rootcmd.waitFor();
        }
 
-       public synchronized void _loadModule() {
+       public synchronized boolean _loadModule() {
                File debounce_ko = new File(ctx.getFilesDir() + "/debounce.ko");
 
                extractModule();
                }
 
                try {
-                       runAsRoot("/system/bin/insmod " + debounce_ko);
+                       runAsRoot("/system/bin/insmod " + debounce_ko + " || /system/xbin/insmod " + debounce_ko);
                } catch (Exception e) {
-                       return;
+                       return false;
                }
 
                if (!isLoaded()) {
-                       return;
+                       return false;
                }
 
                if (getDelay() < 0) {
-                       return;
+                       return false;
                }
 
                /* Module was obviously loaded, so it is safe to load on boot */
                editor.putBoolean("safe_to_load", true);
                editor.commit();
+
+               return true;
        }
 
-       public synchronized void unloadModule() {
+       public synchronized boolean unloadModule() {
                try {
-                       runAsRoot("/system/bin/rmmod debounce");
-               } catch (Exception e) {}
+                       runAsRoot("/system/bin/rmmod debounce || /system/xbin/rmmod debounce");
+               } catch (Exception e) {
+                       return false;
+               }
+
+               return true;
        }
 
        public synchronized boolean isLoaded() {
                        fbuf.write((new Integer(value)).toString());
 
                        fbuf.close();
-               } catch (Exception e) {}
+               } catch (Exception e) {
+               }
        }
 
        public synchronized int getDelay() {
 
        public void loadModule(View view) {
                disableUI();
                if (!module.isLoaded()) {
-                       module.loadModule();
+                       if (!module.loadModule())
+                               showDialog(23);
                }
                updateUI();
        }
        public void unloadModule(View view) {
                disableUI();
                if (module.isLoaded()) {
-                       module.unloadModule();
+                       if (!module.unloadModule())
+                               showDialog(23);
                }
                updateUI();
        }
        public void setValues(View view) {
                disableUI();
                if (!module.isLoaded()) {
-                       module.loadModule();
+                       if (!module.loadModule())
+                               showDialog(23);
                }
                module.setAllValues();
                updateUI();
        protected Dialog onCreateDialog(int id) {
                Dialog dlg = null;
 
-               AlertDialog.Builder about = new AlertDialog.Builder(this);
-               about.setMessage("Milestone 2 Debounce\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")
-                       .setCancelable(true)
-                       .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
-                               public void onClick(DialogInterface dialog, int id) {
-                                       dialog.cancel();
-                               }
-                       });
-               dlg = about.create();
+               switch(id) {
+                       case 23:
+                               AlertDialog.Builder noroot = new AlertDialog.Builder(this);
+                               noroot.setMessage("Could not get root access! Is this device rooted and have you granted SuperUser privileges?")
+                                       .setCancelable(true)
+                                       .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                                               public void onClick(DialogInterface dialog, int id) {
+                                                       dialog.cancel();
+                                               }
+                                       });
+                               dlg = noroot.create();
+                               break;
+                       case 42:
+                               AlertDialog.Builder about = new AlertDialog.Builder(this);
+                               about.setMessage("Milestone 2 Debounce\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")
+                                       .setCancelable(true)
+                                       .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                                               public void onClick(DialogInterface dialog, int id) {
+                                                       dialog.cancel();
+                                               }
+                                       });
+                               dlg = about.create();
+                               break;
+                       default:
+                               dlg = null;
+                               break;
+               }
 
                return dlg;
        }