package ru.perm.trubnikov.gps2sms;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.telephony.SmsManager;
import android.widget.Toast;
import java.util.ArrayList;
public class ThreadSendSMS extends Thread {
Handler mHandler;
private Context context;
final static int STATE_DONE = 0;
final static int STATE_RUNNING = 1;
final static int STATE_WAITING_RESULT = 2;
BroadcastReceiver sendBroadcastReceiver;
//BroadcastReceiver deliveryBroadcastReciever;
int mState;
String smsMessage;
String smsPhone;
String res_send;
// String res_deliver;
int send_receiver_to_fire;
int send_receiver_fired;
// int deliver_receiver_to_fire;
// int deliver_receiver_fired;
// Constructor
// We need a context from MainActivity to register receivers
ThreadSendSMS(Handler h, Context paramContext) {
mHandler = h;
context = paramContext;
}
// Deliver SMS Receiver
/*
* class deliverReceiver extends BroadcastReceiver {
*
* @Override public void onReceive(Context context, Intent arg1) {
*
* setDeliverRecFired(deliver_receiver_fired+1);
*
* switch (getResultCode()) { case Activity.RESULT_OK:
* setResDeliver(context.getString(R.string.info_sms_delivered)); break;
* case Activity.RESULT_CANCELED:
* setResDeliver(context.getString(R.string.info_sms_not_delivered)); break;
* } } }
*/
// Send SMS Receiver
class sentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
setSendRecFired(send_receiver_fired + 1);
switch (getResultCode()) {
case Activity.RESULT_OK:
setResSend(context.getString(R.string.info_sms_sent));
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
setResSend(context.getString(R.string.info_sms_generic));
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
setResSend(context.getString(R.string.info_sms_noservice));
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
setResSend(context.getString(R.string.info_sms_nullpdu));
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
setResSend(context.getString(R.string.info_sms_radioof));
break;
}
}
}
// Avoid memory leaks, unregister receivers
public void unregisterReceivers() {
context.unregisterReceiver(sendBroadcastReceiver);
// context.unregisterReceiver(deliveryBroadcastReciever);
}
// Main part of the thread
public void run() {
// In this state we send the SMS message
if (mState == STATE_RUNNING) {
res_send = "";
// res_deliver = "n/a";
setSendRecFired(0);
setSendRecToFire(0);
// setDeliverRecFired(0);
// setDeliverRecToFire(0);
sendBroadcastReceiver = new sentReceiver();
// deliveryBroadcastReciever = new deliverReceiver();
try {
String SENT = "SMS_SENT";
// String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this.context,
0, new Intent(SENT), 0);
// PendingIntent deliveredPI =
// PendingIntent.getBroadcast(this.context, 0, new
// Intent(DELIVERED), 0);
context.registerReceiver(sendBroadcastReceiver,
new IntentFilter(SENT));
// context.registerReceiver(deliveryBroadcastReciever, new
// IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
ArrayList<String> mArray = sms.divideMessage(this.smsMessage);
ArrayList<PendingIntent> sentArrayIntents = new ArrayList<PendingIntent>();
// ArrayList<PendingIntent> deliveredArrayIntents = new
// ArrayList<PendingIntent>();
for (int i = 0; i < mArray.size(); i++) {
sentArrayIntents.add(sentPI);
// deliveredArrayIntents.add(deliveredPI);
setSendRecToFire(send_receiver_to_fire + 1);
// setDeliverRecToFire(deliver_receiver_to_fire+1);
}
// sms.sendMultipartTextMessage("+7" + this.smsPhone, null,
// mArray, sentArrayIntents, deliveredArrayIntents);
sms.sendMultipartTextMessage(this.smsPhone, null, mArray,
sentArrayIntents, null);
} catch (Exception e) {
// String res_error = "EX6! " + e.toString() +" Message:"
// +e.getMessage();
} finally {
mState = STATE_WAITING_RESULT;
}
}
// In this state we wait for the result of sending and delivery
while (mState == STATE_WAITING_RESULT) {
// to avoid hi-load cycle
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
// if ( deliver_receiver_fired==deliver_receiver_to_fire &&
// send_receiver_fired==send_receiver_to_fire ) {
if (send_receiver_fired == send_receiver_to_fire) {
unregisterReceivers(); // We need to unregister receivers to
// avoid potential memory leaks
Message msg = mHandler.obtainMessage();
Bundle b = new Bundle();
b.putString("res_send", res_send);
b.putString("res_sms_text", this.smsMessage);
b.putString("phone", this.smsPhone);
msg.setData(b);
mState = STATE_DONE;
mHandler.sendMessage(msg);
}
} // EOF while
}
public void setState(int state) {
mState = state;
}
public void setMsg(String m) {
smsMessage = m;
}
public void setPhone(String p) {
smsPhone = p;
}
public void setResSend(String r) {
// res_send = res_send + r;
res_send = r;
}
public void setSendRecToFire(int f) {
send_receiver_to_fire = f;
}
public void setSendRecFired(int f) {
send_receiver_fired = f;
}
/*
* public void setResDeliver(String r) { res_deliver = res_deliver+r; }
*
* public void setDeliverRecToFire(int f) { deliver_receiver_to_fire = f; }
*
* public void setDeliverRecFired(int f) { deliver_receiver_fired = f; }
*/
}