Fix GETFILE documentation and reply when a command is undocumented
[fonbot.git] / src / ro / ieval / fonbot / Heavy.java
index cac04f7a14f3130d300f274bf6f4bff862fdedd8..8fa72677a31461728dbd49e0dd6e437634f11d8c 100644 (file)
@@ -3,11 +3,13 @@ package ro.ieval.fonbot;
 import static ro.ieval.fonbot.R.string.*;
 import static ro.ieval.fonbot.Utils.toNonNull;
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.reflect.InvocationTargetException;
@@ -58,6 +60,7 @@ import android.os.BatteryManager;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.PowerManager;
+import android.os.SystemClock;
 import android.os.Vibrator;
 import android.preference.PreferenceManager;
 import android.provider.BaseColumns;
@@ -664,6 +667,17 @@ final class Heavy {
                case TORCH:
                        Utils.sendMessage(context, replyTo, torch_help);
                        break;
+               case GETFILE:
+                       Utils.sendMessage(context, replyTo, getfile_help);
+                       break;
+               case SH:
+                       Utils.sendMessage(context, replyTo, sh_help);
+                       break;
+               case ROOTSH:
+                       Utils.sendMessage(context, replyTo, rootsh_help);
+                       break;
+               default:
+                       Utils.sendMessage(context, replyTo, command_not_documented);
                }
        }
 
@@ -1237,16 +1251,16 @@ final class Heavy {
                new Thread(new Runnable() {
                        @Override
                        public void run() {
-                               try {
-                                       Thread.sleep(2000);
-                               } catch (InterruptedException e) {
-                                       //ignored
-                               }
+                               SystemClock.sleep(2000);
 
                                handler.post(new Runnable() {
                                        @Override
                                        public void run() {
-                                               camera.takePicture(null, null, new FonBotPictureCallback(context, replyTo, hostname, port));
+                                               try {
+                                                       camera.takePicture(null, null, new FonBotPictureCallback(context, replyTo, hostname, port));
+                                               } catch(Exception e){
+                                                       Utils.sendMessage(context, replyTo, error_while_processing_command, e.getClass().getName(), e.getMessage());
+                                               }
                                        }
                                });
                        }
@@ -1426,7 +1440,7 @@ final class Heavy {
                        sent.putExtra(SmsStatusReceiver.EXTRA_PART, i+1);
                        sent.putExtra(SmsStatusReceiver.EXTRA_TOTAL, messages.size());
                        sent.putExtra(SmsStatusReceiver.EXTRA_REPLY_TO, replyTo.toString());
-                       sent.setAction(SmsStatusReceiver.SENT_ACTION+i);//actions must be unique
+                       sent.setAction(SmsStatusReceiver.SENT_ACTION+i+System.currentTimeMillis());//actions must be unique
                        sents.add(PendingIntent.getBroadcast(context, 0, sent, PendingIntent.FLAG_UPDATE_CURRENT));
 
                        final Intent delivered=new Intent(context, SmsStatusReceiver.class);
@@ -1434,7 +1448,7 @@ final class Heavy {
                        delivered.putExtra(SmsStatusReceiver.EXTRA_PART, i+1);
                        delivered.putExtra(SmsStatusReceiver.EXTRA_TOTAL, messages.size());
                        delivered.putExtra(SmsStatusReceiver.EXTRA_REPLY_TO, replyTo.toString());
-                       delivered.setAction(SmsStatusReceiver.DELIVERED_ACTION+i);//actions must be unique
+                       delivered.setAction(SmsStatusReceiver.DELIVERED_ACTION+i+System.currentTimeMillis());//actions must be unique
                        delivereds.add(PendingIntent.getBroadcast(context, 0, delivered, PendingIntent.FLAG_UPDATE_CURRENT));
                }
 
@@ -1464,11 +1478,16 @@ final class Heavy {
                        do {
                                final String fromNumber=cursor.getString(1);
                                final String from;
-                               final String name=Utils.callerId(context, Utils.toNonNull(fromNumber));
-                               if(name==null)
-                                       from=fromNumber;
-                               else
-                                       from=fromNumber+" ("+name+')';
+                               if(fromNumber == null)
+                                       from = null;
+                               else {
+                                       final String name=Utils.callerId(context, Utils.toNonNull(fromNumber));
+                                       if(name==null)
+                                               from=fromNumber;
+                                       else
+                                               from=fromNumber+" ("+name+')';
+                               }
+
                                final String message=cursor.getString(2).replace("\n", "\n                             ");
                                final Date date=new Date(cursor.getLong(3));
 
@@ -1653,13 +1672,13 @@ final class Heavy {
        }
 
        /**
-        * Poll the server for pending commands.
+        * Start long polling if stopped
         *
         * @param context Context instance
         * @param replyTo reply Address
         */
        public static void poll(final Context context, final Address replyTo) {
-               Utils.sendMessage(context, replyTo, polling_server);
+               Utils.sendMessage(context, replyTo, starting_long_polling_if_stopped);
                context.startService(new Intent(context, FonBotMainService.class));
        }
 
@@ -1837,8 +1856,22 @@ final class Heavy {
         */
        public static void reboot(final Context context, final Address replyTo, final @Nullable String reason) {
                final PowerManager pm=(PowerManager) context.getSystemService(Context.POWER_SERVICE);
-               Utils.sendMessage(context, replyTo, rebooting); 
-               pm.reboot(reason);
+               Utils.sendMessage(context, replyTo, rebooting);
+               try {
+                       pm.reboot(reason);
+               } catch (final Exception e){
+                       e.printStackTrace();
+               }
+               try {
+                       Runtime.getRuntime().exec(new String[]{
+                                       "su",
+                                       "-c",
+                                       "reboot"
+                               }).waitFor();
+               } catch (final Exception e){
+                       e.printStackTrace();
+               }
+               Utils.sendMessage(toNonNull(context), toNonNull(replyTo), reboot_failed);
        }
 
        /**
@@ -1907,4 +1940,30 @@ final class Heavy {
        public static void getfile(final Context context, final Address replyTo, final String filename, final String hostname, final int port){
                new GetfileExecutableRunnable(context, replyTo, filename, hostname, port).execute();
        }
+
+       /**
+        * Execute a command using a given shell and reply with the output.
+        *
+        * @param context Context instance
+        * @param replyTo reply Address
+        * @param shell The shell to execute with. Usually sh or su.
+        * @param command The command to pass to the shell.
+        */
+       public static void execute(final Context context, final Address replyTo, final String shell, final String command) {
+               try {
+                       final Process proc = Runtime.getRuntime().exec(new String[]{
+                                       shell,
+                                       "-c",
+                                       command
+                               });
+                       final BufferedReader br = new BufferedReader (new InputStreamReader(proc.getInputStream()));
+                       String line;
+                       while((line = br.readLine()) != null)
+                               Utils.sendMessage(context, replyTo, line);
+                       proc.waitFor();
+               } catch (final Exception e){
+                       Utils.sendMessage(context, replyTo, error_while_processing_command, e.getClass().getName(), e.getMessage());
+                       Log.w(Heavy.class.getName(), "Error while processing command", e);
+               }
+       }
 }
This page took 0.013288 seconds and 4 git commands to generate.