/[projects]/android/SmsSend/src/dk/thoerup/smssend/SmsSend.java
ViewVC logotype

Contents of /android/SmsSend/src/dk/thoerup/smssend/SmsSend.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 754 - (show annotations) (download)
Wed May 26 14:43:20 2010 UTC (13 years, 11 months ago) by torben
File size: 9756 byte(s)
Move generic http related code to its own class
1 package dk.thoerup.smssend;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.OutputStream;
7 import java.net.HttpURLConnection;
8 import java.net.URL;
9 import java.net.URLConnection;
10 import java.net.URLDecoder;
11 import java.net.URLEncoder;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.Map;
15
16 import android.app.Activity;
17 import android.app.ProgressDialog;
18 import android.content.Intent;
19 import android.content.SharedPreferences;
20 import android.os.AsyncTask;
21 import android.os.Bundle;
22 import android.provider.ContactsContract;
23 import android.telephony.SmsManager;
24 import android.util.Log;
25 import android.view.Menu;
26 import android.view.MenuItem;
27 import android.view.View;
28 import android.view.View.OnClickListener;
29 import android.widget.AdapterView;
30 import android.widget.ArrayAdapter;
31 import android.widget.Button;
32 import android.widget.EditText;
33 import android.widget.Spinner;
34 import android.widget.Toast;
35 import android.widget.AdapterView.OnItemSelectedListener;
36
37 public class SmsSend extends Activity {
38 /** Called when the activity is first created. */
39
40 final int MAXCOUNT = 25;
41 final String SMSDAEMON = "42407617";
42
43 final int OPTIONS_SETTINGS = 1000;
44
45 final int LOOKUP_PHONENR = 2000;
46
47
48 @Override
49 public void onCreate(Bundle savedInstanceState) {
50 super.onCreate(savedInstanceState);
51 setContentView(R.layout.main);
52
53 Button select = (Button) findViewById(R.id.selectNumber);
54 select.setOnClickListener( selectListener );
55
56 Button send = (Button) findViewById(R.id.send);
57 send.setOnClickListener(sendListener);
58
59
60
61 Spinner method = (Spinner) findViewById(R.id.method);
62 ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(this, R.array.methods, android.R.layout.simple_spinner_item);
63 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
64 method.setOnItemSelectedListener(methodSelected);
65 method.setAdapter(adapter);
66 method.setSelection(0);
67
68 }
69
70 @Override
71 public boolean onCreateOptionsMenu(Menu menu) {
72 MenuItem item;
73
74 item = menu.add(0, OPTIONS_SETTINGS, 0, "Settings");
75 item.setIcon(android.R.drawable.ic_menu_edit);
76
77 return true;
78 }
79
80 @Override
81 public boolean onOptionsItemSelected(MenuItem item) {
82 boolean retval = true;
83
84 //TODO: Cleanup
85 switch (item.getItemId()) {
86 case OPTIONS_SETTINGS:
87 Intent i = new Intent(this, dk.thoerup.smssend.SmsConfig.class);
88 startActivity(i);
89 break;
90 default:
91 retval = super.onOptionsItemSelected(item);
92 }
93 return retval;
94
95 }
96
97
98
99 @Override
100 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
101 super.onActivityResult(requestCode, resultCode, data);
102
103 switch(requestCode) {
104 case LOOKUP_PHONENR:
105 if (resultCode == Activity.RESULT_OK) {
106 String phone = data.getStringExtra("phone");
107 EditText dest = (EditText) findViewById(R.id.destination);
108 dest.setText(phone);
109 }
110 break;
111 }
112 }
113
114 void lookup() {
115
116 Intent intent = new Intent(Intent.ACTION_PICK);
117 intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
118
119 startActivityForResult(intent, LOOKUP_PHONENR);
120
121
122
123 /*
124 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
125 null, null, null, null);
126 while (cursor.moveToNext()) {
127 String contactId = cursor.getString(cursor.getColumnIndex(
128 ContactsContract.Contacts._ID));
129 String hasPhone = cursor.getString(cursor.getColumnIndex(
130 ContactsContract.Contacts.HAS_PHONE_NUMBER));
131 String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
132
133 Log.v("contact", name + " : " + hasPhone);
134
135
136
137 if (Integer.parseInt(hasPhone) > 0) {
138 // You know have the number so now query it like this
139 Cursor phones = getContentResolver().query(
140 ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
141 null,
142 ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,
143 null, null);
144 while (phones.moveToNext()) {
145 int phoneIdx = phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER);
146 String phoneNumber = phones.getString( phoneIdx );
147 Log.v("phone", phoneNumber);
148
149 }
150 phones.close();
151 }
152
153 }
154 cursor.close();
155 */
156
157 }
158
159 OnClickListener selectListener = new OnClickListener() {
160 @Override
161 public void onClick(View v) {
162 lookup();
163 }
164 };
165
166
167 OnClickListener sendListener = new OnClickListener() {
168 @Override
169 public void onClick(View v) {
170 SendWorker worker = new SendWorker();
171 worker.execute();
172 }
173 };
174
175 int getCount() {
176 EditText countView = (EditText) findViewById(R.id.count);
177 String strCount = countView.getText().toString();
178
179 int count = Integer.parseInt(strCount);
180
181 return Math.min(count, MAXCOUNT); //limit to MAXCOUNT
182 }
183
184 int getInterval() {
185 EditText intView = (EditText) findViewById(R.id.interval);
186 String strInt = intView.getText().toString();
187
188 return Integer.parseInt(strInt);
189 }
190
191 String getFrom() {
192 EditText origin = (EditText) findViewById(R.id.origin);
193 return origin.getText().toString().trim();
194 }
195
196 String getTo() {
197 EditText destination = (EditText) findViewById(R.id.destination);
198 String to = destination.getText().toString().trim();
199
200 to = to.replace("+", "");
201 if (to.length() < 10) {
202 to = "45" + to;
203 }
204 return to;
205 }
206
207 String getMessage() {
208 EditText message = (EditText) findViewById(R.id.message);
209 return message.getText().toString().trim();
210 }
211
212 boolean sendInternal() {
213 int count = getCount();
214 String to = getTo();
215
216 SmsManager sms = SmsManager.getDefault();
217 ArrayList<String> parts = sms.divideMessage(getMessage() );
218
219 for (int i=0; i<count; i++) {
220 sms.sendMultipartTextMessage(to, null, parts, null, null);
221 sleep(5000); //give the phone some time to send the message
222 }
223
224 return true;
225 }
226
227 void sleep(int s) {
228 try {
229 Thread.sleep(s);
230 } catch (InterruptedException e) {
231 Log.e("SmsSend", "Sleep interrupted", e);
232 }
233 }
234
235 boolean isNumeric(String str) {
236 for (int i=0; i<str.length(); i++) {
237 char c = str.charAt(i);
238 if (! Character.isDigit(c) )
239 return false;
240 }
241
242 return true;
243 }
244
245
246
247 boolean sendCoolSms() {
248 SharedPreferences prefs = this.getSharedPreferences("SmsSend", MODE_PRIVATE);
249 String user = prefs.getString("cooluser", "");
250 String pass = prefs.getString("coolpass", "");
251
252 if (user.equals("") || pass.equals("")) {
253 Toast.makeText(this, "No username or password set!", Toast.LENGTH_LONG).show();
254 return false;
255 }
256
257 if ( isNumeric(getFrom()) ) {
258 Toast.makeText(this, "Can not send when 'from' equals a number\nmust add letters", Toast.LENGTH_LONG).show();
259 return false;
260 }
261
262 //"http://sms.coolsmsc.dk:8080/?username=%s&password=%s&to=%s&from=SMS+HTTP+GW&message=hello+world"
263
264 String url = "http://sms.coolsmsc.dk:8080/";
265
266 Map<String,String> params = new HashMap<String,String>();
267 params.put("username", user);
268 params.put("password", pass);
269 params.put("to", getTo());
270 params.put("from", getFrom());
271 params.put("message", getMessage() );
272 params.put("resulttype", "urlencoded" );
273 params.put("lang", "lang" );
274
275 String paramStr = HttpUtil.encodeParams(params);
276
277 Log.v("SmsSend", paramStr);
278
279
280 boolean success = false;
281 String msg = "";
282 try {
283 byte bytes[] = HttpUtil.postContent(url, paramStr, 2500 );
284 String res = new String(bytes);
285 Map<String,String> vals = HttpUtil.decodeParams(res);
286
287 success = vals.get("status").equals("success");
288 msg = vals.get("result");
289
290 } catch (Exception e) {
291 Log.e("SmsSend", "sendCoolSms", e);
292 success = false;
293 }
294
295 return success;
296 }
297
298 boolean sendSmsDaemon() {
299
300 int count = getCount();
301 int interval = getInterval();
302 String to = getTo();
303
304 String msg = "spam " + to + " " + count + " " + interval + " " + getMessage();
305
306 SmsManager sms = SmsManager.getDefault();
307 ArrayList<String> parts = sms.divideMessage(msg);
308
309
310 sms.sendMultipartTextMessage(SMSDAEMON, null, parts, null, null);
311
312 return true;
313 }
314
315
316
317
318 OnItemSelectedListener methodSelected = new OnItemSelectedListener() {
319 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
320 switch (pos) {
321 case 0:
322 findViewById(R.id.interval).setEnabled(false);
323 findViewById(R.id.origin).setEnabled(false);
324 findViewById(R.id.count).setEnabled(true);
325 break;
326 case 1:
327 findViewById(R.id.interval).setEnabled(false);
328 findViewById(R.id.origin).setEnabled(true);
329 findViewById(R.id.count).setEnabled(false);
330 break;
331 case 2:
332 findViewById(R.id.interval).setEnabled(true);
333 findViewById(R.id.origin).setEnabled(false);
334 findViewById(R.id.count).setEnabled(true);
335 break;
336 }
337 }
338
339 @Override
340 public void onNothingSelected(AdapterView<?> arg0) {
341
342 }
343 };
344
345 class SendWorker extends AsyncTask<Void, Void, Void> {
346
347 boolean ret;
348 ProgressDialog dlg;
349
350 @Override
351 protected void onPreExecute() {
352 super.onPreExecute();
353
354 dlg = new ProgressDialog(SmsSend.this);
355 dlg.setMessage( "Sending" );
356 dlg.setCancelable(true);
357 dlg.show();
358
359 ret = false;
360 }
361
362 @Override
363 protected Void doInBackground(Void... params) {
364 Spinner method = (Spinner) findViewById(R.id.method);
365 int sel = method.getSelectedItemPosition();
366
367
368 switch (sel) {
369 case 0:
370 ret = sendInternal();
371 break;
372 case 1:
373 ret = sendCoolSms();
374 break;
375 case 2:
376 ret = sendSmsDaemon();
377 break;
378
379 }
380
381 return null;
382 }
383
384 @Override
385 protected void onPostExecute(Void result) {
386 dlg.dismiss();
387 dlg = null;
388
389 String msg = "Done!";
390 if (ret == false)
391 msg = "failed!";
392
393 Toast.makeText(SmsSend.this, msg, Toast.LENGTH_LONG).show();
394 }
395
396 }
397
398 }

  ViewVC Help
Powered by ViewVC 1.1.20