Add SMSQ command that skips delivery reports
[fonbot.git] / src / ro / ieval / fonbot / Utils.java
index 849848bd592133f731cb8629d31ee29198d1aad8..37049c566a75fb4e2fdc8fc2299c9c78b29bc01f 100644 (file)
@@ -1,31 +1,10 @@
 package ro.ieval.fonbot;
 
-import static ro.ieval.fonbot.R.string.cannot_parse_count;
-import static ro.ieval.fonbot.R.string.cannot_parse_interval;
-import static ro.ieval.fonbot.R.string.cannot_parse_min_distance;
-import static ro.ieval.fonbot.R.string.cannot_parse_min_time;
-import static ro.ieval.fonbot.R.string.cannot_parse_port;
-import static ro.ieval.fonbot.R.string.cannot_parse_provider_allowed_values_are;
-import static ro.ieval.fonbot.R.string.command_disabled;
-import static ro.ieval.fonbot.R.string.could_not_parse_argument_allowed_values_are;
-import static ro.ieval.fonbot.R.string.could_not_parse_ms;
-import static ro.ieval.fonbot.R.string.error_while_processing_command;
-import static ro.ieval.fonbot.R.string.invalid_length_allowed_values_are;
-import static ro.ieval.fonbot.R.string.invalid_ringer_mode_valid_values_are;
-import static ro.ieval.fonbot.R.string.location_tracking_is_active;
-import static ro.ieval.fonbot.R.string.messagetype_should_be_one_of;
-import static ro.ieval.fonbot.R.string.no_such_command_command_list;
-import static ro.ieval.fonbot.R.string.notification_disabled;
-import static ro.ieval.fonbot.R.string.notification_enabled;
-import static ro.ieval.fonbot.R.string.ringing;
-import static ro.ieval.fonbot.R.string.security_exception;
-import static ro.ieval.fonbot.R.string.the_polling_service_is_running;
-import static ro.ieval.fonbot.R.string.the_second_argument_to_wipe_must_be;
-import static ro.ieval.fonbot.R.string.unknown_command;
-import static ro.ieval.fonbot.R.string.wipetype_should_be_one_of;
+import static ro.ieval.fonbot.R.string.*;
 
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Locale;
 
@@ -40,6 +19,8 @@ import android.database.Cursor;
 import android.location.LocationManager;
 import android.media.AudioManager;
 import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
 import android.preference.PreferenceManager;
 import android.provider.ContactsContract.PhoneLookup;
 import android.telephony.SmsManager;
@@ -78,7 +59,7 @@ public final class Utils {
         */
        @SuppressWarnings("javadoc")
        public static enum Command{
-               TOAST, ECHO, SMS, FLASH, WIFI,
+               TOAST, ECHO, SMS, SMSQ, FLASH, WIFI,
                BLUETOOTH, DIAL, RING, SPEAK, VIBRATE,
                DIALOG, LOCATION, NOLOCATION, RINGER, NCFILE,
                PHOTO, SETNOTIFICATION, DELNOTIFICATION, SETPASSWORD, HELP,
@@ -86,7 +67,8 @@ public final class Utils {
                NEXT, PREV, BATT, CALLLOG, SMSLOG,
                LS, RM, CONTACTS, DISABLE, ENABLE,
                POLL, HANGUP, ANSWER, LAUNCH, DATA,
-               GPS, GLOCATION, REBOOT, SHUTDOWN, NOTIFY
+               GPS, GLOCATION, REBOOT, NOTIFY, SCREENCAP,
+               TORCH, GETFILE, SH, ROOTSH
        }
 
        /**
@@ -109,7 +91,9 @@ public final class Utils {
                /** Fine battery status notifications */
                BATTERY_CHANGED,
                /** Headset plug/unplug notifications */
-               HEADSET
+               HEADSET,
+               /** Phone booted notifications */
+               BOOT,
        }
 
        /**
@@ -181,9 +165,7 @@ public final class Utils {
                /** Location tracking is active. Registered by {@link Command#LOCATION}, unregistered by {@link Command#NOLOCATION} */
                LOCATION(location_tracking_is_active),
                /** The phone is ringing. Registered/unregistered by {@link Command#RING} */
-               RING(ringing),
-               /** The polling alarm is on. Registered/unregistered by {@link Command#POLL} */
-               POLL(the_polling_service_is_running);
+               RING(ringing);
 
                /** String resource: the event description */
                public final int resource;
@@ -209,10 +191,8 @@ public final class Utils {
         * @throws AssertionError if the given object is null
         */
        public static <T> T toNonNull(@Nullable T object) throws AssertionError{
-               if(object==null){
-                       Log.wtf(Utils.class.getName(), "toNonNull called with null");
-                       throw new AssertionError("Log.wtf did not terminate the process");
-               }
+               if(object==null)
+                       throw new NullPointerException();
                return object;
        }
 
@@ -316,12 +296,17 @@ public final class Utils {
        public static void sendMessage(final Context context, final Address address, final String message){
                switch(address.protocol){
                case HTTP:
-                       new HttpCallExecutableRunnable("/send", toNonNull(Arrays.asList(
-                                       new Header("X-Destination", toNonNull(address.data)))), context, null, true, message).execute();
+                       new HttpCallExecutableRunnable("/send", toNonNull(Arrays.asList(new Header("X-Destination", toNonNull(address.data)))), context, null, true, address.requestId == null ? message : address.requestId + " " + message).execute();
                        break;
 
                case SMS:
-                       SmsManager.getDefault().sendTextMessage(address.data, null, message, null, null);
+                       new Handler(Looper.getMainLooper()).post(new Runnable(){
+                                       @Override
+                                       public void run(){
+                                               final ArrayList<String> parts = SmsManager.getDefault().divideMessage(message);
+                                               SmsManager.getDefault().sendMultipartTextMessage(address.data, null, parts, null, null);
+                                       }
+                               });
                        break;
 
                case LOCAL:
@@ -404,31 +389,13 @@ public final class Utils {
         * @throws MalformedURLException if the user preferences create an invalid URL
         */
        public static URL getServerURL(final Context context, final String path) throws MalformedURLException{
+               final String protocol=PreferenceManager.getDefaultSharedPreferences(context).getString("protocol", "https");
                final String hostname=PreferenceManager.getDefaultSharedPreferences(context).getString("hostname", "fonbot.ieval.ro");
                final int port=Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(context).getString("port", "443"));
-               final URL url=new URL("https", hostname, port, path);
+               final URL url=new URL(protocol, hostname, port, path);
                return url;
        }
 
-       /**
-        * Poll the server for pending commands. This function must not be called from BroadcastReceivers
-        *
-        * @param context Context instance
-        */
-       public static void pollServer(final Context context){
-               new HttpCallExecutableRunnable("/get", null, context, new PollResultCallback(context), false).execute();
-       }
-
-       /**
-        * Poll the server for pending commands from {@link FonBotMainService}. This function should be used from BroadcastReceviers instead of {@link #pollServer}
-        *
-        * @param context Context instance
-        */
-       public static void safePollServer(final Context context){
-               final Intent intent=new Intent(context, FonBotMainService.class);
-               intent.setAction(FonBotMainService.ACTION_TRIGGER_POLL);
-               context.startService(intent);
-       }
        /**
         * Executes a given command
         *
@@ -480,7 +447,15 @@ public final class Utils {
                                Heavy.help(context, replyTo, toNonNull(Command.SMS));
                                break;
                        }
-                       Heavy.sms(context, replyTo, toNonNull(args[0]), join(" ", 1, args));
+                       Heavy.sms(context, replyTo, toNonNull(args[0]), join(" ", 1, args), false);
+                       break;
+
+               case SMSQ:
+                       if(args.length < 2){
+                               Heavy.help(context, replyTo, toNonNull(Command.SMSQ));
+                               break;
+                       }
+                       Heavy.sms(context, replyTo, toNonNull(args[0]), join(" ", 1, args), true);
                        break;
 
                case FLASH:
@@ -680,18 +655,27 @@ public final class Utils {
                        break;
 
                case PHOTO:
-                       if(args.length!=2){
+                       if(args.length!=3){
                                Heavy.help(context, replyTo, toNonNull(Command.PHOTO));
                                break;
                        }
+
+                       final int cameraNumber;
+                       try{
+                               cameraNumber=Integer.parseInt(args[0]);
+                       } catch (NumberFormatException e){
+                               sendMessage(context, replyTo, cannot_parse_camera_number);
+                               break;
+                       }
+
                        final int photoPort;
                        try{
-                               photoPort=Integer.parseInt(args[1]);
+                               photoPort=Integer.parseInt(args[2]);
                        } catch (NumberFormatException e){
                                sendMessage(context, replyTo, cannot_parse_port);
                                break;
                        }
-                       Heavy.photo(context, replyTo, toNonNull(args[0]), photoPort);
+                       Heavy.photo(context, replyTo, cameraNumber, toNonNull(args[1]), photoPort);
                        break;
 
                case SETNOTIFICATION:
@@ -904,25 +888,7 @@ public final class Utils {
                        break;
 
                case POLL:
-                       if(args.length>1){
-                               Heavy.help(context, replyTo, toNonNull(Command.POLL));
-                               break;
-                       }
-
-                       if(args.length==0){
-                               Heavy.poll(context, replyTo);
-                               break;
-                       }
-
-                       final long interval;
-                       try{
-                               interval=Long.parseLong(args[0]);
-                       } catch(NumberFormatException e){
-                               sendMessage(context, replyTo, cannot_parse_interval);
-                               break;
-                       }
-
-                       Heavy.poll(context, replyTo, interval);
+                       Heavy.poll(context, replyTo);
                        break;
 
                case HANGUP:
@@ -1003,10 +969,6 @@ public final class Utils {
                        Heavy.reboot(context, replyTo, args.length==0?null:args[0]);
                        break;
 
-               case SHUTDOWN:
-                       //TODO: implement command
-                       break;
-
                case NOTIFY:
                        if(args.length!=1 && args.length!=3){
                                Heavy.help(context, replyTo, toNonNull(Command.NOTIFY));
@@ -1026,6 +988,53 @@ public final class Utils {
                        else
                                Heavy.notify(context, replyTo, id, toNonNull(args[1]), toNonNull(args[2]));
                        break;
+
+               case SCREENCAP:
+                       if(args.length != 1){
+                               Heavy.help(context, replyTo, toNonNull(Command.SCREENCAP));
+                               return;
+                       }
+
+                       Heavy.screencap(context, replyTo, args[0]);
+                       break;
+
+               case TORCH:
+                       Heavy.torch(context, replyTo);
+                       break;
+
+               case GETFILE:
+                       if(args.length != 3){
+                               Heavy.help(context, replyTo, toNonNull(Command.GETFILE));
+                               return;
+                       }
+
+                       final int getfilePort;
+                       try{
+                               getfilePort=Integer.parseInt(args[2]);
+                       } catch (NumberFormatException e){
+                               sendMessage(context, replyTo, cannot_parse_port);
+                               break;
+                       }
+                       Heavy.getfile(context, replyTo, toNonNull(args[0]), toNonNull(args[1]), getfilePort);
+                       break;
+
+               case SH:
+                       if(args.length == 0){
+                               Heavy.help(context, replyTo, toNonNull(Command.SH));
+                               return;
+                       }
+
+                       Heavy.execute(context, replyTo, "sh", join(" ", args));
+                       break;
+
+               case ROOTSH:
+                       if(args.length == 0){
+                               Heavy.help(context, replyTo, toNonNull(Command.ROOTSH));
+                               return;
+                       }
+
+                       Heavy.execute(context, replyTo, "su", join(" ", args));
+                       break;
                }
 
        }
This page took 0.015083 seconds and 4 git commands to generate.