diff options
author | Steve Slaven <bpk@hoopajoo.net> | 2011-01-04 23:11:37 (GMT) |
---|---|---|
committer | Steve Slaven <bpk@hoopajoo.net> | 2011-01-04 23:11:37 (GMT) |
commit | 27e58b98fa26d9f9986d9421bec61e0eb837fc07 (patch) | |
tree | 2861f5147ce8b697cbad417fc22f08605a131869 /src/net/hoopajoo/android/SoftKeys/Globals.java | |
parent | c8c2f024a5fd55cb570d744f965f23acc5744ced (diff) | |
download | SoftKeys-27e58b98fa26d9f9986d9421bec61e0eb837fc07.zip SoftKeys-27e58b98fa26d9f9986d9421bec61e0eb837fc07.tar.gz SoftKeys-27e58b98fa26d9f9986d9421bec61e0eb837fc07.tar.bz2 |
Moved main key sending stuff in to globals, added new smaller activity to
receive the intents, intents are generic now allowing sending any keycode
once the extras are set
Diffstat (limited to 'src/net/hoopajoo/android/SoftKeys/Globals.java')
-rw-r--r-- | src/net/hoopajoo/android/SoftKeys/Globals.java | 114 |
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 ); + } } |