summaryrefslogtreecommitdiffstats
path: root/src/net/hoopajoo/android/SoftKeys/Globals.java
diff options
context:
space:
mode:
authorSteve Slaven <bpk@hoopajoo.net>2011-01-04 23:11:37 (GMT)
committerSteve Slaven <bpk@hoopajoo.net>2011-01-04 23:11:37 (GMT)
commit27e58b98fa26d9f9986d9421bec61e0eb837fc07 (patch)
tree2861f5147ce8b697cbad417fc22f08605a131869 /src/net/hoopajoo/android/SoftKeys/Globals.java
parentc8c2f024a5fd55cb570d744f965f23acc5744ced (diff)
downloadSoftKeys-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.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 );
+ }
}