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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 754 - (hide annotations) (download)
Wed May 26 14:43:20 2010 UTC (14 years ago) by torben
File size: 9756 byte(s)
Move generic http related code to its own class
1 torben 745 package dk.thoerup.smssend;
2    
3 torben 751 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 torben 745 import java.net.URL;
9     import java.net.URLConnection;
10 torben 751 import java.net.URLDecoder;
11 torben 747 import java.net.URLEncoder;
12 torben 745 import java.util.ArrayList;
13 torben 754 import java.util.HashMap;
14     import java.util.Map;
15 torben 745
16     import android.app.Activity;
17 torben 750 import android.app.ProgressDialog;
18 torben 745 import android.content.Intent;
19     import android.content.SharedPreferences;
20 torben 750 import android.os.AsyncTask;
21 torben 745 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 torben 748
45     final int LOOKUP_PHONENR = 2000;
46 torben 750
47 torben 745
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 torben 748
97    
98 torben 745
99 torben 748 @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 torben 745 void lookup() {
115    
116     Intent intent = new Intent(Intent.ACTION_PICK);
117 torben 748 intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
118 torben 745
119 torben 748 startActivityForResult(intent, LOOKUP_PHONENR);
120 torben 745
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 torben 750 SendWorker worker = new SendWorker();
171     worker.execute();
172 torben 745 }
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 torben 750 sleep(5000); //give the phone some time to send the message
222 torben 745 }
223    
224     return true;
225     }
226    
227 torben 750 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 torben 745 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 torben 747
245 torben 745
246 torben 754
247 torben 745 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 torben 751
264     String url = "http://sms.coolsmsc.dk:8080/";
265    
266 torben 754 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 torben 745
275 torben 754 String paramStr = HttpUtil.encodeParams(params);
276 torben 745
277 torben 754 Log.v("SmsSend", paramStr);
278 torben 751
279 torben 754
280 torben 751 boolean success = false;
281     String msg = "";
282 torben 745 try {
283 torben 754 byte bytes[] = HttpUtil.postContent(url, paramStr, 2500 );
284 torben 751 String res = new String(bytes);
285 torben 754 Map<String,String> vals = HttpUtil.decodeParams(res);
286 torben 745
287 torben 754 success = vals.get("status").equals("success");
288     msg = vals.get("result");
289 torben 745
290     } catch (Exception e) {
291     Log.e("SmsSend", "sendCoolSms", e);
292 torben 751 success = false;
293 torben 745 }
294    
295 torben 751 return success;
296 torben 745 }
297 torben 754
298 torben 745 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 torben 751
315    
316 torben 752
317 torben 745
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 torben 750
345     class SendWorker extends AsyncTask<Void, Void, Void> {
346 torben 745
347 torben 750 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 torben 751 }

  ViewVC Help
Powered by ViewVC 1.1.20