package com.steps.geosms;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.telephony.SmsManager;
import android.util.Log;
import android.widget.Toast;
import com.ioane.sharvadze.geosms.R;
import com.steps.geosms.notifications.SmsReceiver;
import com.steps.geosms.objects.SMS;
import com.steps.geosms.utils.Constants;
import com.steps.geosms.websms.SyncedWebSms;
import com.steps.geosms.websms.WebSms;
import java.util.ArrayList;
import java.util.Date;
/**
* Class GeoSmsManager
*
* manages sms sending
*
* Created by Ioane on 3/1/2015.
*/
public class GeoSmsManager {
private static final String TAG = GeoSmsManager.class.getSimpleName();
/**
* Context to get content resolver.
*/
private Context context;
/**
* To send web sms messages.
*/
private WebSms webSmsManager;
public GeoSmsManager(Context context){
this.context = context;
this.webSmsManager = new SyncedWebSms(context);
}
public void sendSms(SMS sms, String address, long threadId, Boolean web){
new AsyncTask<Object,Void,Integer>(){
/**
* Executes async task of sending sms through WEB or GSM.
* @param params SMS sms, String address,Boolean web
* @return message resource id.
*/
@SuppressWarnings("unchecked")
@Override
protected Integer doInBackground(Object... params) {
SMS sms = (SMS)params[0];
sms.setMsgType(SMS.MsgType.PENDING);
sms.setDate(new Date());
String address = (String)params[1];
long threadId = (Long)params[2];
boolean web = (Boolean)params[3];
ContentValues values = sms.getContentValues();
values.put(Constants.ADDRESS,address);
values.put(Constants.THREAD_ID, threadId);
Uri insertedSmsURI = context.getContentResolver().insert(Uri.parse("content://sms/"), values);
Intent sentPI = new Intent(Constants.Actions.MESSAGE_SENT, insertedSmsURI ,
context.getApplicationContext(), SmsReceiver.class);
sentPI.putExtra(Constants.ADDRESS, address);
sentPI.putExtra(Constants.THREAD_ID, threadId);
if(!web){
// send normal sms using GSM.
SmsManager manager = SmsManager.getDefault();
ArrayList<String> dividedMessage = manager.divideMessage(sms.getText());
ArrayList<PendingIntent> sentPIs = new ArrayList<>(dividedMessage.size());
context.getSharedPreferences(MyPreferencesManager.DELIVERY_REQUEST,Context.MODE_PRIVATE);
boolean isDeliveryRequested = MyPreferencesManager.isDeliveryRequested(context);
ArrayList<PendingIntent> deliveryPIs = null;
if(isDeliveryRequested){
Intent deliveryPI = new Intent(Constants.Actions.SMS_DELIVERED, insertedSmsURI,
context.getApplicationContext(),SmsReceiver.class);
deliveryPIs = new ArrayList<>(dividedMessage.size());
for (int i = 0; i < dividedMessage.size() ; i++)
deliveryPIs.add(PendingIntent.getBroadcast(context,0,new Intent(deliveryPI),0));
}
for (int i = 0; i < dividedMessage.size() ; i++)
sentPIs.add(PendingIntent.getBroadcast(context,0,new Intent(sentPI),0));
try{
manager.sendMultipartTextMessage(address, null, dividedMessage, sentPIs, deliveryPIs);
Log.d(TAG,"sending");
}catch (Exception e){
Log.e(TAG,"error occured");
e.printStackTrace();
}
}else {
PendingIntent pi = PendingIntent.getBroadcast(context,0,new Intent(sentPI),0);
// send using WIFI
try {
if(webSmsManager == null){
pi.send(Activity.RESULT_CANCELED);
return R.string.websms_not_found;
}
if(!webSmsManager.sendSms(sms.getText(),address)){
webSmsManager.authenticate(); // try to auth second time.
if(!webSmsManager.sendSms(sms.getText(),address)){
pi.send(Activity.RESULT_CANCELED);
return R.string.websms_unable_login;
}
}
// we sent successfully
pi.send(Activity.RESULT_OK);
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
return null; // this return is just for Void object return type.
}
@Override
protected void onPostExecute(Integer messageId) {
super.onPostExecute(messageId);
if(messageId != null)
Toast.makeText(context,messageId,Toast.LENGTH_SHORT).show();
}
}.execute(sms,address,threadId,web);
}
public String getWebSmsBalance(){
if(webSmsManager == null)
return null;
if(webSmsManager.authenticate())
return webSmsManager.getBalance();
else{
return MyPreferencesManager.getWebSmsBalance(context);
}
}
public WebSms getWebSmsManager(){
return webSmsManager;
}
public void saveDraft(SMS sms){
}
public void deleteSms(SMS sms){
}
public void updateSms(SMS sms){
}
}