Bomber source code


SUBMITTED BY: JohnSmith

DATE: Dec. 31, 2017, 11:43 a.m.

FORMAT: Java

SIZE: 16.4 kB

HITS: 577

  1. package text.androidad3;
  2. import java.util.ArrayList;
  3. import org.baole.core.ContactEntry;
  4. import org.baole.service.Service;
  5. import android.app.Activity;
  6. import android.app.AlertDialog;
  7. import android.app.Dialog;
  8. import android.content.ContentResolver;
  9. import android.content.ContentValues;
  10. import android.content.Context;
  11. import android.content.DialogInterface;
  12. import android.content.Intent;
  13. import android.content.SharedPreferences;
  14. import android.content.SharedPreferences.Editor;
  15. import android.database.Cursor;
  16. import android.net.Uri;
  17. import android.os.AsyncTask;
  18. import android.os.Build;
  19. import android.os.Bundle;
  20. import android.preference.PreferenceManager;
  21. import android.text.Editable;
  22. import android.text.TextUtils;
  23. import android.text.TextWatcher;
  24. import android.text.method.ScrollingMovementMethod;
  25. import android.util.Log;
  26. import android.view.LayoutInflater;
  27. import android.view.Menu;
  28. import android.view.MenuInflater;
  29. import android.view.MenuItem;
  30. import android.view.View;
  31. import android.view.ViewGroup;
  32. import android.view.View.OnClickListener;
  33. import android.view.inputmethod.InputMethodManager;
  34. import android.widget.Button;
  35. import android.widget.CursorAdapter;
  36. import android.widget.EditText;
  37. import android.widget.Filterable;
  38. import android.widget.ProgressBar;
  39. import android.widget.Spinner;
  40. import android.widget.TextView;
  41. import android.widget.Toast;
  42. public class SMSBomber extends Activity implements OnClickListener {
  43. private static final int DIALOG_CHANGLOGS = 1;
  44. private static final String PREFS_LAST_RUN = "lastrun";
  45. private static final String MESSAGE = "message";
  46. private static final String CONTACT = "contact";
  47. private static final String COUNTER = "%c%";
  48. private static final String NUMBER = "NUMBER";
  49. private static final String NAME = "NAME";
  50. public int recent_numberItems = 3;
  51. private Button btnSend;
  52. private Button btnCancel;
  53. private Button btnClear;
  54. private ProgressBar progressSend;
  55. private ArrayList<ContactEntry> contacts;
  56. private String message;
  57. private EditText txtMessage;
  58. private EditText txtMessageCount;
  59. private Spinner spdInterval;
  60. private TextView txtInfo;
  61. private TextView txtSelectedContact;
  62. private boolean isCancel = false;
  63. Service service;
  64. private boolean deliveryReport;
  65. private boolean isSaveSMS;
  66. private boolean isSplit;
  67. @Override
  68. protected void onCreate(Bundle inState) {
  69. super.onCreate(inState);
  70. setContentView(R.layout.compose);
  71. btnSend = (Button) findViewById(R.id.btnSend);
  72. btnSend.setOnClickListener(this);
  73. btnClear = (Button) findViewById(R.id.btnClear);
  74. btnClear.setOnClickListener(this);
  75. btnCancel = (Button) findViewById(R.id.btnCancel);
  76. btnCancel.setOnClickListener(this);
  77. btnCancel.setEnabled(false);
  78. progressSend = (ProgressBar) findViewById(R.id.progressSend);
  79. progressSend.setVisibility(View.GONE);
  80. txtMessage = (EditText) findViewById(R.id.txtMessage);
  81. txtMessageCount = (EditText) findViewById(R.id.txtMsgCount);
  82. spdInterval = (Spinner) findViewById(R.id.spnInterval);
  83. txtInfo = (TextView) findViewById(R.id.txtInfo);
  84. txtSelectedContact = (TextView) findViewById(R.id.txtSelectedContact);
  85. txtSelectedContact.setMovementMethod(new ScrollingMovementMethod());
  86. if (inState != null) {
  87. txtMessage.setText(inState.getString(MESSAGE));
  88. contacts = inState.getParcelableArrayList(CONTACT);
  89. }
  90. if (contacts == null) {
  91. contacts = new ArrayList<ContactEntry>();
  92. }
  93. String name = getIntent().getStringExtra(NAME);
  94. String number = getIntent().getStringExtra(NUMBER);
  95. if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(number)) {
  96. contacts.add(new ContactEntry(name, number));
  97. SharedPreferences settings = this
  98. .getSharedPreferences(SMSBOMBER, 0);
  99. Editor editor = settings.edit();
  100. int msgCount = getIntent().getIntExtra(MESSAGE_COUNT, 10);
  101. editor.putString(MESSAGE_COUNT, "" + msgCount);
  102. editor.commit();
  103. }
  104. adapter = new ContactListAdapter(this, ContactHelper.getInstance(this)
  105. .getContactCursor());
  106. txtMessage.addTextChangedListener(new TextWatcher() {
  107. @Override
  108. public void onTextChanged(CharSequence s, int start, int before,
  109. int count) {
  110. }
  111. @Override
  112. public void beforeTextChanged(CharSequence s, int start, int count,
  113. int after) {
  114. }
  115. @Override
  116. public void afterTextChanged(Editable s) {
  117. setMessageCharCount();
  118. }
  119. });
  120. loadPreference();
  121. showContacts();
  122. SharedPreferences preferences = PreferenceManager
  123. .getDefaultSharedPreferences(this);
  124. deliveryReport = preferences.getBoolean("delivery_report", true);
  125. isSaveSMS = preferences.getBoolean("save_sent_sms", true);
  126. isSplit = preferences.getBoolean("split_long_sms", true);
  127. StringBuffer buff = new StringBuffer();
  128. buff.append("Split long SMS (> 160 chars): " + (isSplit ? "ON" : "OFF")
  129. + "\n");
  130. buff.append("Save sent SMS to Inbox: " + (isSaveSMS ? "ON" : "OFF")
  131. + "\n");
  132. buff.append("Delivery report: " + (deliveryReport ? "ON" : "OFF"));
  133. addReport(buff.toString());
  134. final String v0 = preferences.getString(PREFS_LAST_RUN, "");
  135. final String v1 = this.getString(R.string.app_version);
  136. if (!v0.equals(v1)) {
  137. SharedPreferences.Editor editor = preferences.edit();
  138. editor.putString(PREFS_LAST_RUN, v1);
  139. editor.commit();
  140. this.showDialog(DIALOG_CHANGLOGS);
  141. }
  142. }
  143. @Override
  144. protected void onSaveInstanceState(Bundle outState) {
  145. super.onSaveInstanceState(outState);
  146. outState.putSerializable(MESSAGE, txtMessage.getText().toString());
  147. outState.putParcelableArrayList(CONTACT, contacts);
  148. this.updatePreference();
  149. }
  150. @Override
  151. protected void onPause() {
  152. super.onPause();
  153. updatePreference();
  154. }
  155. @Override
  156. protected void onResume() {
  157. super.onResume();
  158. loadPreference();
  159. }
  160. @Override
  161. protected Dialog onCreateDialog(int id) {
  162. switch (id) {
  163. case DIALOG_CHANGLOGS:
  164. return DialogUtil.createChangLogDialog(this);
  165. default:
  166. return null;
  167. }
  168. }
  169. protected void setMessageCharCount() {
  170. btnSend.setText(getString(R.string.send_prog, txtMessage.getText()
  171. .length()));
  172. }
  173. ContactListAdapter adapter;
  174. ContactEntry ceContact = null;
  175. private int delay;
  176. private int messageCount;
  177. public void onClick(View v) {
  178. if (btnSend.equals(v)) {
  179. send();
  180. } else if (btnCancel.equals(v)) {
  181. isCancel = true;
  182. } else if (btnClear.equals(v)) {
  183. new AlertDialog.Builder(this).setIcon(
  184. android.R.drawable.ic_dialog_alert).setTitle(
  185. R.string.confirmation).setMessage(
  186. R.string.contact_remove_message).setPositiveButton(
  187. R.string.all, new DialogInterface.OnClickListener() {
  188. @Override
  189. public void onClick(DialogInterface dialog, int which) {
  190. contacts.clear();
  191. showContacts();
  192. }
  193. }).setNeutralButton(R.string.last,
  194. new DialogInterface.OnClickListener() {
  195. @Override
  196. public void onClick(DialogInterface dialog, int which) {
  197. int size = contacts.size();
  198. if (size > 0) {
  199. contacts.remove(size - 1);
  200. showContacts();
  201. }
  202. }
  203. }).setNegativeButton(R.string.cancel, null).show();
  204. }
  205. }
  206. private void send() {
  207. message = txtMessage.getText().toString();
  208. if (TextUtils.isEmpty(message)) {
  209. Toast.makeText(getApplicationContext(), R.string.enter_message,
  210. Toast.LENGTH_LONG).show();
  211. return;
  212. }
  213. if (contacts.size() <= 0) {
  214. Toast.makeText(getApplicationContext(), R.string.select_contact,
  215. Toast.LENGTH_LONG).show();
  216. return;
  217. }
  218. String msgCount = txtMessageCount.getText().toString();
  219. try {
  220. messageCount = Integer.parseInt(msgCount);
  221. } catch (Exception e) {
  222. messageCount = 0;
  223. }
  224. if (messageCount <= 0) {
  225. Toast.makeText(getApplicationContext(),
  226. R.string.incorrect_message_count, Toast.LENGTH_LONG).show();
  227. return;
  228. }
  229. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  230. imm.hideSoftInputFromWindow(txtMessage.getWindowToken(),
  231. InputMethodManager.HIDE_NOT_ALWAYS);
  232. new SendTask().execute();
  233. }
  234. @Override
  235. protected void onDestroy() {
  236. if (sentCount < messageCount && !isCancel) {
  237. SharedPreferences.Editor settingsEditor = getSharedPreferences(
  238. SMSBOMBER, 0).edit();
  239. settingsEditor.putInt(FORCE_CLOSE_MAX, sentCount);
  240. settingsEditor.commit();
  241. }
  242. super.onDestroy();
  243. }
  244. private static String SMSBOMBER = "sms_bomber";
  245. private static String INTERVAL = "interval";
  246. private static String MESSAGE_COUNT = "message_count";
  247. private static String FORCE_CLOSE_MAX = "force_close_max";
  248. private void loadPreference() {
  249. SharedPreferences settings = this.getSharedPreferences(SMSBOMBER, 0);
  250. spdInterval.setSelection(settings.getInt(INTERVAL, 0));
  251. int forceClose = settings.getInt(FORCE_CLOSE_MAX, 1000);
  252. int msgCount = Integer
  253. .parseInt(settings.getString(MESSAGE_COUNT, "10"));
  254. if (forceClose < msgCount) {
  255. addReport(getString(R.string.warning_force_close, forceClose));
  256. msgCount = forceClose;
  257. }
  258. txtMessageCount.setText("" + msgCount);
  259. }
  260. private void updatePreference() {
  261. int intervalIndex = spdInterval.getSelectedItemPosition();
  262. if (intervalIndex == Spinner.INVALID_POSITION) {
  263. intervalIndex = 0;
  264. }
  265. int[] intervalValues = getResources().getIntArray(
  266. R.array.interval_values);
  267. delay = intervalValues[intervalIndex];
  268. SharedPreferences.Editor settingsEditor = getSharedPreferences(
  269. SMSBOMBER, 0).edit();
  270. settingsEditor.putInt(INTERVAL, intervalIndex);
  271. settingsEditor.putString(MESSAGE_COUNT, "" + messageCount);
  272. settingsEditor.commit();
  273. }
  274. // stats
  275. int sentOKCount[];
  276. int sentFailedCount[];
  277. public int sentCount;
  278. private void showContacts() {
  279. int size = contacts.size();
  280. StringBuffer buff = new StringBuffer(getString(R.string.to, size));
  281. for (int i = 0; i < size; i++) {
  282. buff.append(contacts.get(i).name).append(
  283. "(" + contacts.get(i).number + "), ");
  284. }
  285. txtSelectedContact.setText(buff.toString());
  286. }
  287. @Override
  288. public boolean onCreateOptionsMenu(Menu menu) {
  289. MenuInflater inflater = getMenuInflater();
  290. inflater.inflate(R.menu.main_menu, menu);
  291. return super.onCreateOptionsMenu(menu);
  292. }
  293. public boolean onOptionsItemSelected(MenuItem item) {
  294. switch (item.getItemId()) {
  295. case R.id.menu_blacklist:
  296. onMarketLaunch("org.baole.app.blacklist");
  297. break;
  298. case R.id.menu_groupsms:
  299. onMarketLaunch("org.baole.app.groupsmsad2");
  300. break;
  301. case R.id.menu_sms_limitremoval:
  302. onMarketLaunch("org.baole.smslimitremoval");
  303. break;
  304. case R.id.menu_go_pro:
  305. openUrl("http://code.google.com/p/sms-bomber/");
  306. break;
  307. case R.id.menu_anti_sms_bomber:
  308. onMarketLaunch("org.baole.antibomber");
  309. break;
  310. case R.id.menu_counter:
  311. txtMessage.getEditableText().insert(txtMessage.getSelectionStart(),
  312. COUNTER);
  313. break;
  314. case R.id.menu_setting:
  315. startActivity(new Intent(this, Preferences.class));
  316. break;
  317. case R.id.menu_help:
  318. showDialog(DIALOG_CHANGLOGS);
  319. break;
  320. }
  321. return true;
  322. }
  323. private void openUrl(String url) {
  324. Intent donate = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
  325. startActivity(donate);
  326. }
  327. private void onMarketLaunch(String url) {
  328. Intent donate = new Intent(Intent.ACTION_VIEW, Uri.parse(String.format(
  329. "market://details?id=%s", url)));
  330. startActivity(donate);
  331. }
  332. private class SendTask extends AsyncTask<Void, Integer, Void> {
  333. @Override
  334. protected void onPreExecute() {
  335. final ProgressBar progress = progressSend;
  336. SharedPreferences settings = PreferenceManager
  337. .getDefaultSharedPreferences(SMSBomber.this);
  338. deliveryReport = settings.getBoolean("delivery_report", true);
  339. isSaveSMS = settings.getBoolean("save_sent_sms", true);
  340. isSplit = settings.getBoolean("split_long_sms", true);
  341. int size = contacts.size();
  342. sentFailedCount = new int[size];
  343. sentOKCount = new int[size];
  344. sentCount = 0;
  345. isCancel = false;
  346. updatePreference();
  347. // TODO
  348. service = getInstance(SMSBomber.this);
  349. service.setDeliveryReport(deliveryReport);
  350. service.setSplitLongSMS(isSplit);
  351. int status = service.init();
  352. if (status == Service.STATUS_LOGGIN_FAILED) {
  353. String info = service.getReport();
  354. txtInfo.setText(info);
  355. return;
  356. }
  357. progress.setVisibility(View.VISIBLE);
  358. progress.setMax(messageCount);
  359. progress.setProgress(0);
  360. btnSend.setEnabled(false);
  361. btnCancel.setEnabled(true);
  362. txtInfo.setText("");
  363. }
  364. @Override
  365. protected Void doInBackground(Void... params) {
  366. boolean isContainCounter = message.contains(COUNTER);
  367. int size = contacts.size();
  368. for (sentCount = 1; sentCount <= messageCount; sentCount++) {
  369. for (int i = 0; i < size; i++) {
  370. String msg = message;
  371. if (isContainCounter)
  372. msg = message.replaceAll(COUNTER, "" + sentCount);
  373. service.send(contacts.get(i).number, msg);
  374. try {
  375. Thread.sleep((delay == 1) ? 500 : delay * 1000);
  376. } catch (InterruptedException e) {
  377. e.printStackTrace();
  378. }
  379. }
  380. }
  381. return null;
  382. }
  383. }
  384. ContentValues values = new ContentValues();
  385. private void addReport(String s) {
  386. txtInfo.setText(s + "\n" + txtInfo.getText());
  387. }
  388. private void saveMessage(ContentResolver cr, ContactEntry ce, long date,
  389. int type, String message) {
  390. values.put(ADDRESS, ce.number);
  391. values.put(DATE, date);
  392. values.put(READ, 1);
  393. values.put(STATUS, -1);
  394. values.put(SMS_TYPE, type);
  395. values.put(BODY, message);
  396. // Uri inserted =
  397. cr.insert(Uri.parse("content://sms"), values);
  398. }
  399. public static class ContactListAdapter extends CursorAdapter implements
  400. Filterable {
  401. Activity ctx;
  402. public ContactListAdapter(Activity context, Cursor c) {
  403. super(context, c);
  404. ctx = context;
  405. }
  406. @Override
  407. public View newView(Context context, Cursor cursor, ViewGroup parent) {
  408. final LayoutInflater inflater = LayoutInflater.from(context);
  409. final TextView view = (TextView) inflater.inflate(
  410. android.R.layout.simple_dropdown_item_1line, parent, false);
  411. view.setText(cursor.getString(5) + "(" + cursor.getString(3) + ")");
  412. return view;
  413. }
  414. @Override
  415. public void bindView(View view, Context context, Cursor cursor) {
  416. ((TextView) view).setText(cursor.getString(5) + "("
  417. + cursor.getString(3) + ")");
  418. }
  419. @Override
  420. public String convertToString(Cursor cursor) {
  421. return cursor.getString(5);
  422. }
  423. @Override
  424. public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
  425. if (getFilterQueryProvider() != null) {
  426. return getFilterQueryProvider().runQuery(constraint);
  427. }
  428. return ContactHelper.getInstance(ctx).queryFilter(constraint);
  429. }
  430. // private ContentResolver mContent;
  431. }
  432. public static final String ADDRESS = "address";
  433. public static final String PERSON = "person";
  434. public static final String DATE = "date";
  435. public static final String READ = "read";
  436. public static final String STATUS = "status";
  437. public static final String SMS_TYPE = "type";
  438. public static final String BODY = "body";
  439. public static final int TYPE_INBOX = 1;
  440. public static final int TYPE_SENT = 2;
  441. public static final int TYPE_DRAFT = 3;
  442. public static final int TYPE_OUTBOX = 4;
  443. private static Service sInstance;
  444. public static Service getInstance(Context ctx) {
  445. // if(true) return new MockService();
  446. if (sInstance == null) {
  447. String className;
  448. int sdkVersion = Integer.parseInt(Build.VERSION.SDK); // Cupcake
  449. // style
  450. if (sdkVersion < Build.VERSION_CODES.DONUT) {
  451. className = "org.baole.service.SMSService34";
  452. } else {
  453. className = "org.baole.service.SMSService";
  454. }
  455. /*
  456. * Find the required class by name and instantiate it.
  457. */
  458. try {
  459. Class<? extends Service> clazz = Class.forName(className)
  460. .asSubclass(Service.class);
  461. sInstance = clazz.newInstance();
  462. sInstance.setContext(ctx);
  463. } catch (Exception e) {
  464. Log.e("SMSWraper", "" + e.getMessage());
  465. e.printStackTrace();
  466. }
  467. }
  468. return sInstance;
  469. }
  470. }

comments powered by Disqus