session-android/src/org/thoughtcrime/securesms/service/SmsSender.java

147 lines
5.5 KiB
Java
Raw Normal View History

2012-10-30 00:34:14 +00:00
/**
2011-12-20 18:20:44 +00:00
* Copyright (C) 2011 Whisper Systems
2012-10-30 00:34:14 +00:00
*
2011-12-20 18:20:44 +00:00
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
2012-10-30 00:34:14 +00:00
*
2011-12-20 18:20:44 +00:00
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.thoughtcrime.securesms.service;
2013-02-15 03:15:40 +00:00
import android.app.Activity;
2012-10-30 00:34:14 +00:00
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
2012-10-30 00:34:14 +00:00
import android.telephony.SmsManager;
2013-02-15 03:15:40 +00:00
import android.telephony.SmsMessage;
2012-10-30 00:34:14 +00:00
import android.util.Log;
2011-12-20 18:20:44 +00:00
2013-02-15 03:15:40 +00:00
import org.thoughtcrime.securesms.R;
2011-12-20 18:20:44 +00:00
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.EncryptingSmsDatabase;
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
2013-02-15 03:15:40 +00:00
import org.thoughtcrime.securesms.notifications.MessageNotifier;
import org.thoughtcrime.securesms.recipients.Recipients;
import org.thoughtcrime.securesms.service.SendReceiveService.ToastHandler;
import org.thoughtcrime.securesms.transport.UndeliverableMessageException;
import org.thoughtcrime.securesms.transport.UniversalTransport;
2011-12-20 18:20:44 +00:00
2013-02-15 03:15:40 +00:00
import java.util.HashSet;
import java.util.Set;
2011-12-20 18:20:44 +00:00
public class SmsSender {
private final Set<Long> pendingMessages = new HashSet<Long>();
2012-10-30 00:34:14 +00:00
2011-12-20 18:20:44 +00:00
private final Context context;
2013-02-15 03:15:40 +00:00
private final ToastHandler toastHandler;
2012-10-30 00:34:14 +00:00
2013-02-15 03:15:40 +00:00
public SmsSender(Context context, ToastHandler toastHandler) {
this.context = context;
this.toastHandler = toastHandler;
2011-12-20 18:20:44 +00:00
}
2012-10-30 00:34:14 +00:00
2011-12-20 18:20:44 +00:00
public void process(MasterSecret masterSecret, Intent intent) {
2013-02-15 03:15:40 +00:00
if (intent.getAction().equals(SendReceiveService.SEND_SMS_ACTION)) {
handleSendMessage(masterSecret, intent);
} else if (intent.getAction().equals(SendReceiveService.SENT_SMS_ACTION)) {
handleSentMessage(intent);
} else if (intent.getAction().equals(SendReceiveService.DELIVERED_SMS_ACTION)) {
handleDeliveredMessage(intent);
}
}
private void handleSendMessage(MasterSecret masterSecret, Intent intent) {
long messageId = intent.getLongExtra("message_id", -1);
UniversalTransport transport = new UniversalTransport(context, masterSecret);
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
2011-12-20 18:20:44 +00:00
EncryptingSmsDatabase.Reader reader = null;
SmsMessageRecord record;
2011-12-20 18:20:44 +00:00
Log.w("SmsSender", "Sending message: " + messageId);
2013-02-15 03:15:40 +00:00
try {
if (messageId != -1) reader = database.getMessage(masterSecret, messageId);
else reader = database.getOutgoingMessages(masterSecret);
while (reader != null && (record = reader.getNext()) != null) {
if (!pendingMessages.contains(record.getId())) {
pendingMessages.add(record.getId());
transport.deliver(record);
}
2012-10-30 00:34:14 +00:00
}
} catch (UndeliverableMessageException ude) {
Log.w("SmsSender", ude);
DatabaseFactory.getSmsDatabase(context).markAsSentFailed(messageId);
2011-12-20 18:20:44 +00:00
} finally {
if (reader != null)
reader.close();
2011-12-20 18:20:44 +00:00
}
}
2012-10-30 00:34:14 +00:00
2013-02-15 03:15:40 +00:00
private void handleSentMessage(Intent intent) {
long messageId = intent.getLongExtra("message_id", -1);
int result = intent.getIntExtra("ResultCode", -31337);
Log.w("SMSReceiverService", "Intent resultcode: " + result);
Log.w("SMSReceiverService", "Running sent callback: " + messageId);
2013-02-15 03:15:40 +00:00
if (result == Activity.RESULT_OK) {
DatabaseFactory.getSmsDatabase(context).markAsSent(messageId);
unregisterForRadioChanges();
2013-02-15 03:15:40 +00:00
} else if (result == SmsManager.RESULT_ERROR_NO_SERVICE || result == SmsManager.RESULT_ERROR_RADIO_OFF) {
toastHandler
.obtainMessage(0, context.getString(R.string.SmsReceiver_currently_unable_to_send_your_sms_message))
.sendToTarget();
registerForRadioChanges();
2013-02-15 03:15:40 +00:00
} else {
long threadId = DatabaseFactory.getSmsDatabase(context).getThreadIdForMessage(messageId);
Recipients recipients = DatabaseFactory.getThreadDatabase(context).getRecipientsForThreadId(context, threadId);
DatabaseFactory.getSmsDatabase(context).markAsSentFailed(messageId);
MessageNotifier.notifyMessageDeliveryFailed(context, recipients, threadId);
unregisterForRadioChanges();
2013-02-15 03:15:40 +00:00
}
pendingMessages.remove(messageId);
}
private void handleDeliveredMessage(Intent intent) {
long messageId = intent.getLongExtra("message_id", -1);
byte[] pdu = intent.getByteArrayExtra("pdu");
SmsMessage message = SmsMessage.createFromPdu(pdu);
if (message == null) {
return;
}
DatabaseFactory.getSmsDatabase(context).markStatus(messageId, message.getStatus());
}
private void registerForRadioChanges() {
unregisterForRadioChanges();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SystemStateListener.ACTION_SERVICE_STATE);
context.registerReceiver(SystemStateListener.getInstance(), intentFilter);
}
private void unregisterForRadioChanges() {
try {
context.unregisterReceiver(SystemStateListener.getInstance());
} catch (IllegalArgumentException iae) {
Log.w("SmsSender", iae);
2011-12-20 18:20:44 +00:00
}
}
}