X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Fro%2Fieval%2Ffonbot%2FHeavy.java;h=f87f3f5457e69aa4ac0357b2a60ebb23a319e1bb;hb=a5259b32f390d9adf8bca1b7a4bbb620bde11479;hp=fadf42c7f40184c9bc818507d0378d9d20aafc46;hpb=62f5262d8bfa537f2b173c0309f1128054cf0916;p=fonbot.git diff --git a/src/ro/ieval/fonbot/Heavy.java b/src/ro/ieval/fonbot/Heavy.java index fadf42c..f87f3f5 100644 --- a/src/ro/ieval/fonbot/Heavy.java +++ b/src/ro/ieval/fonbot/Heavy.java @@ -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; @@ -288,7 +290,7 @@ final class Heavy { Utils.sendMessage(toNonNull(context), toNonNull(replyTo), cannot_connect_to_host_on_port, hostname, Integer.valueOf(port)); return null; } - Utils.sendMessage(toNonNull(context), toNonNull(replyTo), photo_sent); + Utils.sendConfirmMessage(toNonNull(context), toNonNull(replyTo), photo_sent); return null; } } @@ -335,7 +337,7 @@ final class Heavy { try{ sock = SocketChannel.open(new InetSocketAddress(hostname, port)); } catch (final IOException e){ - Utils.sendMessage(context, replyTo, toNonNull(context.getString(cannot_connect_to_host_on_port, hostname, Integer.valueOf(port)))); + Utils.sendMessage(context, replyTo, cannot_connect_to_host_on_port, hostname, Integer.valueOf(port)); try { in.close(); } catch (IOException ex) { @@ -347,7 +349,7 @@ final class Heavy { try{ in.transferTo(0, in.size(), sock); } catch (final IOException e){ - Utils.sendMessage(context, replyTo, toNonNull(context.getString(io_error, e.getMessage()))); + Utils.sendMessage(context, replyTo, io_error, e.getMessage()); } finally { try{ in.close(); @@ -360,7 +362,7 @@ final class Heavy { //ignored } } - Utils.sendMessage(context, replyTo, file_sent); + Utils.sendConfirmMessage(context, replyTo, file_sent); } } @@ -408,7 +410,7 @@ final class Heavy { sock = new Socket(hostname, port); in = sock.getInputStream(); } catch (final IOException e){ - Utils.sendMessage(context, replyTo, toNonNull(context.getString(cannot_connect_to_host_on_port, hostname, Integer.valueOf(port)))); + Utils.sendMessage(context, replyTo, cannot_connect_to_host_on_port, hostname, Integer.valueOf(port)); try { out.close(); } catch (IOException ex) { @@ -423,7 +425,7 @@ final class Heavy { while((nread = in.read(buffer)) > 0) out.write(buffer, 0, nread); } catch (final IOException e){ - Utils.sendMessage(context, replyTo, toNonNull(context.getString(io_error, e.getMessage()))); + Utils.sendMessage(context, replyTo, io_error, e.getMessage()); } finally { try{ out.close(); @@ -436,7 +438,7 @@ final class Heavy { //ignored } } - Utils.sendMessage(context, replyTo, file_received); + Utils.sendConfirmMessage(context, replyTo, file_received); } } @@ -477,7 +479,7 @@ final class Heavy { return; camera.stopPreview(); stopCamera(); - Utils.sendMessage(toNonNull(context), toNonNull(replyTo), sending_photo); + Utils.sendConfirmMessage(toNonNull(context), toNonNull(replyTo), sending_photo); new SendDataAsyncTask(toNonNull(context), toNonNull(replyTo), toNonNull(hostname), port, data).execute(); } } @@ -512,7 +514,7 @@ final class Heavy { } if(exitCode == 0 && new File(filename).exists()) - Utils.sendMessage(toNonNull(context), toNonNull(replyTo), screencap_successful); + Utils.sendConfirmMessage(toNonNull(context), toNonNull(replyTo), screencap_successful); else Utils.sendMessage(toNonNull(context), toNonNull(replyTo), screencap_failed); } @@ -632,6 +634,9 @@ final class Heavy { case SMS: Utils.sendMessage(context, replyTo, sms_help); break; + case SMSQ: + Utils.sendMessage(context, replyTo, smsq_help); + break; case SMSLOG: Utils.sendMessage(context, replyTo, smslog_help); break; @@ -665,6 +670,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); } } @@ -783,7 +799,7 @@ final class Heavy { man.setRingerMode(AudioManager.RINGER_MODE_NORMAL); savedRingVolume=man.getStreamVolume(AudioManager.STREAM_RING); man.setStreamVolume(AudioManager.STREAM_RING, man.getStreamMaxVolume(AudioManager.STREAM_RING), 0); - Utils.sendMessage(context, replyTo, ringing); + Utils.sendConfirmMessage(context, replyTo, ringing); ringtone.play(); } @@ -816,7 +832,7 @@ final class Heavy { private static void stopAlarm(final Context context, final Address replyTo){ Utils.unregisterOngoing(context, toNonNull(OngoingEvent.RING)); final AudioManager man=(AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - Utils.sendMessage(context, replyTo, no_longer_ringing); + Utils.sendConfirmMessage(context, replyTo, no_longer_ringing); ringtone.stop(); man.setStreamVolume(AudioManager.STREAM_RING, savedRingVolume, 0); man.setRingerMode(savedRingerMode); @@ -881,11 +897,11 @@ final class Heavy { if(on) { adapter.enable(); - Utils.sendMessage(context, replyTo, enabling_bluetooth); + Utils.sendConfirmMessage(context, replyTo, enabling_bluetooth); } else { adapter.disable(); - Utils.sendMessage(context, replyTo, disabling_bluetooth); + Utils.sendConfirmMessage(context, replyTo, disabling_bluetooth); } } @@ -989,10 +1005,10 @@ final class Heavy { CommonDataKinds.Phone.LABEL); while(inCursor.moveToNext()) - Utils.sendMessage(context, replyTo, toNonNull(context.getString(contact_info, + Utils.sendMessage(context, replyTo, contact_info, cursor.getString(0), inCursor.getString(0), - phoneNumberType(context, inCursor.getInt(1), inCursor.getString(2))))); + phoneNumberType(context, inCursor.getInt(1), inCursor.getString(2))); inCursor.close(); } @@ -1077,9 +1093,9 @@ final class Heavy { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); final String name=Utils.callerId(context, nr); if(name==null) - Utils.sendMessage(context, replyTo, dialing, nr); + Utils.sendConfirmMessage(context, replyTo, dialing, nr); else - Utils.sendMessage(context, replyTo, dialing, nr+" ("+name+")"); + Utils.sendConfirmMessage(context, replyTo, dialing, nr+" ("+name+")"); context.startActivity(intent); } @@ -1101,7 +1117,7 @@ final class Heavy { Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_NO_USER_ACTION| Intent.FLAG_FROM_BACKGROUND); - Utils.sendMessage(context, toNonNull(replyTo), showing_dialog); + Utils.sendConfirmMessage(context, toNonNull(replyTo), showing_dialog); context.startActivity(intent); } @@ -1150,7 +1166,7 @@ final class Heavy { Utils.sendMessage(context, replyTo, last_known_location); locationListener.onLocationChanged(lastKnownLocation); } - Utils.sendMessage(context, replyTo, listening_for_location_updates); + Utils.sendConfirmMessage(context, replyTo, listening_for_location_updates); man.requestLocationUpdates(provider, minTime, minDistance, locationListener); } @@ -1163,7 +1179,7 @@ final class Heavy { public static void lock(final Context context, final Address replyTo) { final DevicePolicyManager dpm=(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); dpm.lockNow(); - Utils.sendMessage(context, replyTo, device_locked); + Utils.sendConfirmMessage(context, replyTo, device_locked); } /** @@ -1177,7 +1193,7 @@ final class Heavy { final Intent intent=new Intent("com.android.music.musicservicecommand"); intent.putExtra("command", command); context.sendBroadcast(intent); - Utils.sendMessage(context, replyTo, command_sent); + Utils.sendConfirmMessage(context, replyTo, command_sent); } /** @@ -1204,7 +1220,7 @@ final class Heavy { final LocationManager man=(LocationManager) context.getApplicationContext().getSystemService(Context.LOCATION_SERVICE); man.removeUpdates(locationListener); locationListener=null; - Utils.sendMessage(context, replyTo, no_longer_listening_for_location_updates); + Utils.sendConfirmMessage(context, replyTo, no_longer_listening_for_location_updates); } /** @@ -1363,7 +1379,7 @@ final class Heavy { */ public static void rm(final Context context, final Address replyTo, final String filename){ if(new File(filename).delete()) - Utils.sendMessage(context, replyTo, file_deleted); + Utils.sendConfirmMessage(context, replyTo, file_deleted); else Utils.sendMessage(context, replyTo, error_while_deleting_file); } @@ -1379,7 +1395,7 @@ final class Heavy { final DevicePolicyManager dpm=(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); dpm.resetPassword("", 0); - Utils.sendMessage(context, replyTo, password_cleared); + Utils.sendConfirmMessage(context, replyTo, password_cleared); } /** @@ -1394,7 +1410,7 @@ final class Heavy { final DevicePolicyManager dpm=(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); dpm.resetPassword(password, 0); - Utils.sendMessage(context, replyTo, password_set); + Utils.sendConfirmMessage(context, replyTo, password_set); } /** @@ -1405,11 +1421,11 @@ final class Heavy { * @param destination destination phone number * @param text text message contents */ - public static void sms(final Context context, final Address replyTo, final String destination, final String text){ + public static void sms(final Context context, final Address replyTo, final String destination, final String text, final boolean quiet){ final SmsManager manager=SmsManager.getDefault(); final ArrayList messages=manager.divideMessage(text); if(messages.size() > 1) - Utils.sendMessage(context, replyTo, message_was_split_into_parts, Integer.valueOf(messages.size())); + Utils.sendConfirmMessage(context, replyTo, message_was_split_into_parts, Integer.valueOf(messages.size())); final ArrayList sents=new ArrayList(messages.size()); final ArrayList delivereds=new ArrayList(messages.size()); @@ -1427,7 +1443,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); @@ -1435,12 +1451,12 @@ 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)); } Log.d(Heavy.class.getName(), "Sending sms to "+destination); - manager.sendMultipartTextMessage(destination, null, messages, sents, delivereds); + manager.sendMultipartTextMessage(destination, null, messages, sents, quiet ? null : delivereds); } /** @@ -1465,11 +1481,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)); @@ -1498,7 +1519,7 @@ final class Heavy { @Override public void onInit(final int status) { if(status==TextToSpeech.SUCCESS){ - Utils.sendMessage(context, replyTo, speaking); + Utils.sendConfirmMessage(context, replyTo, speaking); tts.speak(text, TextToSpeech.QUEUE_ADD, null); } else Utils.sendMessage(context, replyTo, tts_engine_not_available); @@ -1527,7 +1548,7 @@ final class Heavy { */ public static void toast(final Context context, final Address replyTo, final String text, final int duration){ Toast.makeText(context,text,duration).show(); - Utils.sendMessage(context, replyTo, toast_shown); + Utils.sendConfirmMessage(context, replyTo, toast_shown); } /** @@ -1539,7 +1560,7 @@ final class Heavy { */ public static void vibrate(final Context context, final Address replyTo, final long ms){ final Vibrator v=(Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - Utils.sendMessage(context, replyTo, vibrating); + Utils.sendConfirmMessage(context, replyTo, vibrating); v.vibrate(ms); } @@ -1556,7 +1577,7 @@ final class Heavy { intent.setData(uri); intent.setFlags(Intent.FLAG_FROM_BACKGROUND|Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); - Utils.sendMessage(context, replyTo, url_opened); + Utils.sendConfirmMessage(context, replyTo, url_opened); } catch(ActivityNotFoundException e){ Utils.sendMessage(context, replyTo, no_activity_found_for_this_url); } catch(Exception e){ @@ -1589,9 +1610,9 @@ final class Heavy { final WifiManager man=(WifiManager) context.getSystemService(Context.WIFI_SERVICE); man.setWifiEnabled(on); if(on) - Utils.sendMessage(context, replyTo, enabling_wifi); + Utils.sendConfirmMessage(context, replyTo, enabling_wifi); else - Utils.sendMessage(context, replyTo, disabling_wifi); + Utils.sendConfirmMessage(context, replyTo, disabling_wifi); } /** @@ -1625,7 +1646,7 @@ final class Heavy { public static void disable(final Context context, final Address replyTo, final Command command){ PreferenceManager.getDefaultSharedPreferences(context).edit() .putBoolean(command+"disabled", true).commit(); - Utils.sendMessage(context, replyTo, command_disabled, command); + Utils.sendConfirmMessage(context, replyTo, command_disabled, command); } /** @@ -1638,7 +1659,7 @@ final class Heavy { public static void enable(final Context context, final Address replyTo, final Command command){ PreferenceManager.getDefaultSharedPreferences(context).edit() .remove(command+"disabled").commit(); - Utils.sendMessage(context, replyTo, command_enabled, command); + Utils.sendConfirmMessage(context, replyTo, command_enabled, command); } @@ -1654,13 +1675,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.sendConfirmMessage(context, replyTo, starting_long_polling_if_stopped); context.startService(new Intent(context, FonBotMainService.class)); } @@ -1725,7 +1746,7 @@ final class Heavy { return; } context.startActivity(intent); - Utils.sendMessage(context, replyTo, app_launched); + Utils.sendConfirmMessage(context, replyTo, app_launched); } /** @@ -1760,10 +1781,10 @@ final class Heavy { try{ if(enable){ getITelephony(context).enableDataConnectivity(); - Utils.sendMessage(context, replyTo, enabling_data); + Utils.sendConfirmMessage(context, replyTo, enabling_data); } else { getITelephony(context).disableDataConnectivity(); - Utils.sendMessage(context, replyTo, disabling_data); + Utils.sendConfirmMessage(context, replyTo, disabling_data); } } catch(Exception e){ Utils.sendMessage(context, replyTo, exception_while_getting_itelephony, @@ -1794,9 +1815,9 @@ final class Heavy { public static void gps(final Context context, final Address replyTo, final boolean enabled) { Secure.setLocationProviderEnabled(context.getContentResolver(), LocationManager.GPS_PROVIDER, enabled); if(enabled) - Utils.sendMessage(context, replyTo, enabling_gps); + Utils.sendConfirmMessage(context, replyTo, enabling_gps); else - Utils.sendMessage(context, replyTo, disabling_gps); + Utils.sendConfirmMessage(context, replyTo, disabling_gps); } /** @@ -1822,9 +1843,9 @@ final class Heavy { public static void glocation(final Context context, final Address replyTo, final boolean enabled) { Secure.setLocationProviderEnabled(context.getContentResolver(), LocationManager.NETWORK_PROVIDER, enabled); if(enabled) - Utils.sendMessage(context, replyTo, enabling_network_location); + Utils.sendConfirmMessage(context, replyTo, enabling_network_location); else - Utils.sendMessage(context, replyTo, disabling_network_location); + Utils.sendConfirmMessage(context, replyTo, disabling_network_location); } /** @@ -1838,8 +1859,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.sendConfirmMessage(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); } /** @@ -1852,7 +1887,7 @@ final class Heavy { public static void notify(final Context context, final Address replyTo, final int id) { final NotificationManager man=(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); man.cancel(id); - Utils.sendMessage(context, replyTo, notification_canceled); + Utils.sendConfirmMessage(context, replyTo, notification_canceled); } /** @@ -1871,7 +1906,7 @@ final class Heavy { setContentText(text). setSmallIcon(android.R.drawable.stat_notify_sync_noanim). build()); - Utils.sendMessage(context, replyTo, notification_shown); + Utils.sendConfirmMessage(context, replyTo, notification_shown); } /** @@ -1893,7 +1928,7 @@ final class Heavy { */ public static void torch(final Context context, final Address replyTo){ context.sendBroadcast(new Intent("net.cactii.flash2.TOGGLE_FLASHLIGHT")); - Utils.sendMessage(context, replyTo, toggling_torch_state); + Utils.sendConfirmMessage(context, replyTo, toggling_torch_state); } /** @@ -1908,4 +1943,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); + } + } }