1 /* 2 * wpadebug - wpa_supplicant and Wi-Fi debugging app for Android 3 * Copyright (c) 2013, Jouni Malinen <j@w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 package w1.fi.wpadebug; 10 11 import java.util.ArrayList; 12 import java.util.Scanner; 13 import java.io.FileReader; 14 import java.io.BufferedReader; 15 import java.io.InputStreamReader; 16 import java.io.InputStream; 17 import java.io.IOException; 18 19 import android.app.ListActivity; 20 import android.content.Intent; 21 import android.os.Bundle; 22 import android.os.Parcelable; 23 import android.view.View; 24 import android.widget.ListView; 25 import android.widget.ArrayAdapter; 26 import android.widget.Toast; 27 import android.text.method.ScrollingMovementMethod; 28 import android.util.Log; 29 30 class CmdList 31 { 32 String title; 33 String command; 34 CmdList(String _title, String _command)35 public CmdList(String _title, String _command) 36 { 37 title = _title; 38 command = _command; 39 } 40 41 @Override toString()42 public String toString() 43 { 44 return title; 45 } 46 } 47 48 public class CommandListActivity extends ListActivity 49 { 50 private static final String TAG = "wpadebug"; 51 private static final String cmdfile = "/data/local/wpadebug.cmds"; 52 read_commands(ArrayList<CmdList> list, Scanner in)53 private void read_commands(ArrayList<CmdList> list, Scanner in) 54 { 55 in.useDelimiter("@"); 56 while (in.hasNext()) { 57 String title = in.next(); 58 String cmd = in.nextLine().substring(1); 59 list.add(new CmdList(title, cmd)); 60 } 61 in.close(); 62 } 63 64 @Override onCreate(Bundle savedInstanceState)65 public void onCreate(Bundle savedInstanceState) 66 { 67 super.onCreate(savedInstanceState); 68 69 ArrayList<CmdList> list = new ArrayList<CmdList>(); 70 71 FileReader in; 72 try { 73 in = new FileReader(cmdfile); 74 read_commands(list, new Scanner(in)); 75 } catch (IOException e) { 76 Toast.makeText(this, "Could not read " + cmdfile, 77 Toast.LENGTH_SHORT).show(); 78 } 79 80 InputStream inres; 81 try { 82 inres = getResources().openRawResource(R.raw.shell_commands); 83 read_commands(list, new Scanner(inres)); 84 } catch (android.content.res.Resources.NotFoundException e) { 85 Toast.makeText(this, "Could not read internal resource", 86 Toast.LENGTH_SHORT).show(); 87 } 88 89 ArrayAdapter<CmdList> listAdapter; 90 listAdapter = new ArrayAdapter<CmdList>(this, android.R.layout.simple_list_item_1, list); 91 92 setListAdapter(listAdapter); 93 } 94 95 @Override onListItemClick(ListView l, View v, int position, long id)96 protected void onListItemClick(ListView l, View v, int position, long id) 97 { 98 CmdList item = (CmdList) getListAdapter().getItem(position); 99 Toast.makeText(this, "Running: " + item.command, 100 Toast.LENGTH_SHORT).show(); 101 String message = run(item.command); 102 if (message == null) 103 return; 104 Intent intent = new Intent(this, DisplayMessageActivity.class); 105 intent.putExtra(MainActivity.EXTRA_MESSAGE, message); 106 startActivity(intent); 107 } 108 run(String cmd)109 private String run(String cmd) 110 { 111 try { 112 Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/mksh-su", "-c", cmd}); 113 BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); 114 StringBuffer output = new StringBuffer(); 115 int read; 116 char[] buffer = new char[1024]; 117 while ((read = reader.read(buffer)) > 0) 118 output.append(buffer, 0, read); 119 reader.close(); 120 proc.waitFor(); 121 return output.toString(); 122 } catch (IOException e) { 123 Toast.makeText(this, "Could not run command", 124 Toast.LENGTH_LONG).show(); 125 return null; 126 } catch (InterruptedException e) { 127 throw new RuntimeException(e); 128 } 129 } 130 } 131