summaryrefslogtreecommitdiffstats
path: root/src/net/hoopajoo/android/SoftKeys/Globals.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/hoopajoo/android/SoftKeys/Globals.java')
-rw-r--r--src/net/hoopajoo/android/SoftKeys/Globals.java114
1 files changed, 110 insertions, 4 deletions
diff --git a/src/net/hoopajoo/android/SoftKeys/Globals.java b/src/net/hoopajoo/android/SoftKeys/Globals.java
index de6c76b..50f23a1 100644
--- a/src/net/hoopajoo/android/SoftKeys/Globals.java
+++ b/src/net/hoopajoo/android/SoftKeys/Globals.java
@@ -18,18 +18,27 @@
*/
package net.hoopajoo.android.SoftKeys;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
import android.app.Application;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.util.Log;
+import android.widget.Toast;
public class Globals extends Application {
private CommandShell cmd = null;
private String android_id = null;
+ private String LOG = "SoftKeys.Global";
public boolean restartKeys = false;
public int homeCounter = 0;
@@ -45,7 +54,7 @@ public class Globals extends Application {
// # cat /system/bin/sh > /data/tmp/su
// # chmod 6755 /data/tmp/su
// # mount -oremount,suid /dev/block/mtdblock1 /data
- Log.d( "softkeys", "Detected emulator" );
+ Log.d( LOG, "Detected emulator" );
cmd = new CommandShell( "/data/tmp/su" );
}else{
cmd = new CommandShell( "su" );
@@ -55,23 +64,61 @@ public class Globals extends Application {
return( cmd );
}
+ // this is a string of keydown/keyup events by key id
+ public int sendKeys( List<Integer> a ) {
+ return sendKeys( listToInt( a ) );
+ }
+
+ public int sendKeys( int[] keyids ) {
+ try {
+ Globals.CommandShell cmd = getCommandShell();
+
+ // run our key script
+ String wd = getFilesDir().getAbsolutePath();
+
+ // check if we have a dev script
+ File script = new File( wd + "/pushkey.dev" );
+
+ // check if we have a test script
+ if( script.exists() ) {
+ Log.d( LOG, "Using dev key script" );
+ }else{
+ // write out our default script
+ script = new File( wd + "/pushkey" );
+ FileOutputStream out = new FileOutputStream( script );
+ out.write( "for f in $* ; do input keyevent $f ; done\n".getBytes( "ASCII" ) );
+ out.close();
+ }
+
+ // source the file since datadata might be noexec
+ String keyid = "";
+ cmd.system( "sh " + script.getAbsolutePath() + " " + keyid );
+ }catch( Exception e ) {
+ Log.e( LOG, "Error: " + e.getMessage() );
+ Toast.makeText( this, "Unable to execute as root", Toast.LENGTH_LONG ).show();
+ return 1;
+ }
+
+ return 0;
+ }
+
public class CommandShell {
Process p;
OutputStream o;
CommandShell( String shell ) throws Exception {
- Log.d( "softkeys.cmdshell", "Starting shell: '" + shell + "'" );
+ Log.d( "SoftKeys.cmdshell", "Starting shell: '" + shell + "'" );
p = Runtime.getRuntime().exec( shell );
o = p.getOutputStream();
}
public void system( String cmd ) throws Exception {
- Log.d( "softkeys.cmdshell", "Running command: '" + cmd + "'" );
+ Log.d( "SoftKeys.cmdshell", "Running command: '" + cmd + "'" );
o.write( (cmd + "\n" ).getBytes( "ASCII" ) );
}
public void close() throws Exception {
- Log.d( "softkeys.cmdshell", "Destroying shell" );
+ Log.d( "SoftKeys.cmdshell", "Destroying shell" );
o.flush();
o.close();
p.destroy();
@@ -80,6 +127,19 @@ public class Globals extends Application {
@Override
public void onCreate() {
+ // warn if we don't notice some binaries we need
+ for( String name : new String[] { "/system/bin/su", "/system/bin/input" } ) {
+ File check = new File( name );
+ try {
+ if( ! check.exists() ) {
+ Toast.makeText( this, "Failed to find file: " + name + ", SoftKeys may not function", Toast.LENGTH_LONG ).show();
+ }
+ }catch( Exception e ) {
+ Toast.makeText( this, "Unable to check for file: " + name, Toast.LENGTH_LONG ).show();
+ }
+
+ }
+
android_id = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
restartService();
}
@@ -92,4 +152,50 @@ public class Globals extends Application {
this.startService( new Intent( this, SoftKeysService.class ) );
}
}
+
+ private int[] listToInt( List<Integer> a ) {
+ int[] ret = new int[ a.size() ];
+ for( int i = 0; i < a.size(); i++ ) {
+ ret[ i ] = a.get( i ).intValue();
+ }
+ return( ret );
+ }
+
+ public void doHomeAction( boolean longClick ) {
+ // special case
+ SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences( this );
+
+ Intent ni = new Intent( Intent.ACTION_MAIN );
+ String launcher = settings.getString( longClick ? "launcher2" : "launcher" , null );
+ if( launcher == null ) {
+ launcher = getDefaultLauncher();
+ }
+ ni.setPackage( launcher );
+ ni.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity( ni );
+ }
+
+ private String getDefaultLauncher() {
+ // Set default launcher to the first launcher we find so we don't freak out if it's not
+ // set and there is no com.android.launcher
+ Intent i = new Intent( Intent.ACTION_MAIN );
+ i.addCategory( Intent.CATEGORY_HOME );
+ PackageManager p = getPackageManager();
+ List<ResolveInfo> packages = p.queryIntentActivities( i, 0 );
+
+ String defaultLauncher = null;
+ for( Iterator<ResolveInfo> it = packages.iterator(); it.hasNext(); ) {
+ ResolveInfo info = it.next();
+ if( defaultLauncher == null ) {
+ if( ! info.activityInfo.applicationInfo.packageName.equals( "net.hoopajoo.android.SoftKeys" ) ) {
+ defaultLauncher = info.activityInfo.applicationInfo.packageName;
+ }
+ }
+ }
+ if( defaultLauncher == null ) {
+ // last ditch
+ defaultLauncher = "com.android.launcher";
+ }
+ return( defaultLauncher );
+ }
}