diff --git a/res/values/strings.xml b/res/values/strings.xml index 44377857ac..64e3af7dd9 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -460,7 +460,9 @@ Media message - Sorry, Quick Response is not yet supported by TextSecure! + Quick response unavailable when TextSecure is locked! + Problem sending message! + OLD PASSPHRASE: diff --git a/src/org/thoughtcrime/securesms/service/MasterSecretIntentService.java b/src/org/thoughtcrime/securesms/service/MasterSecretIntentService.java new file mode 100644 index 0000000000..d4e696a14e --- /dev/null +++ b/src/org/thoughtcrime/securesms/service/MasterSecretIntentService.java @@ -0,0 +1,21 @@ +package org.thoughtcrime.securesms.service; + +import android.app.IntentService; +import android.content.Intent; +import android.support.annotation.Nullable; + +import org.thoughtcrime.securesms.crypto.MasterSecret; + +public abstract class MasterSecretIntentService extends IntentService { + + public MasterSecretIntentService(String name) { + super(name); + } + + @Override + protected final void onHandleIntent(Intent intent) { + onHandleIntent(intent, KeyCachingService.getMasterSecret(this)); + } + + protected abstract void onHandleIntent(Intent intent, @Nullable MasterSecret masterSecret); +} diff --git a/src/org/thoughtcrime/securesms/service/QuickResponseService.java b/src/org/thoughtcrime/securesms/service/QuickResponseService.java index b37ed0aeb3..aeda4dcbde 100644 --- a/src/org/thoughtcrime/securesms/service/QuickResponseService.java +++ b/src/org/thoughtcrime/securesms/service/QuickResponseService.java @@ -1,31 +1,62 @@ package org.thoughtcrime.securesms.service; -import android.app.Service; import android.content.Intent; -import android.os.IBinder; +import android.support.annotation.Nullable; import android.telephony.TelephonyManager; +import android.text.TextUtils; import android.util.Log; import android.widget.Toast; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.crypto.MasterSecret; +import org.thoughtcrime.securesms.database.ThreadDatabase; +import org.thoughtcrime.securesms.mms.OutgoingMediaMessage; +import org.thoughtcrime.securesms.mms.SlideDeck; +import org.thoughtcrime.securesms.recipients.RecipientFactory; +import org.thoughtcrime.securesms.recipients.Recipients; +import org.thoughtcrime.securesms.sms.MessageSender; +import org.thoughtcrime.securesms.sms.OutgoingTextMessage; +import org.thoughtcrime.securesms.util.Rfc5724Uri; -public class QuickResponseService extends Service { +import java.net.URISyntaxException; - public int onStartCommand(Intent intent, int flags, int startId) { - if (!TelephonyManager.ACTION_RESPOND_VIA_MESSAGE.equals(intent.getAction())) { - Log.w("QuickResponseService", "Received unknown intent: " + intent.getAction()); - return START_NOT_STICKY; - } +public class QuickResponseService extends MasterSecretIntentService { - Toast.makeText(this, - getString(R.string.QuickResponseService_sorry_quick_response_is_not_yet_supported_by_textsecure), - Toast.LENGTH_LONG).show(); + private static final String TAG = QuickResponseService.class.getSimpleName(); - return START_NOT_STICKY; + public QuickResponseService() { + super("QuickResponseService"); } @Override - public IBinder onBind(Intent intent) { - return null; + protected void onHandleIntent(Intent intent, @Nullable MasterSecret masterSecret) { + if (!TelephonyManager.ACTION_RESPOND_VIA_MESSAGE.equals(intent.getAction())) { + Log.w(TAG, "Received unknown intent: " + intent.getAction()); + return; + } + + if (masterSecret == null) { + Log.w(TAG, "Got quick response request when locked..."); + Toast.makeText(this, R.string.QuickResponseService_quick_response_unavailable_when_TextSecure_is_locked, Toast.LENGTH_LONG).show(); + return; + } + + try { + Rfc5724Uri uri = new Rfc5724Uri(intent.getDataString()); + String content = intent.getStringExtra(Intent.EXTRA_TEXT); + Recipients recipients = RecipientFactory.getRecipientsFromString(this, uri.getPath(), false); + + if (!TextUtils.isEmpty(content)) { + if (recipients.isSingleRecipient()) { + MessageSender.send(this, masterSecret, new OutgoingTextMessage(recipients, content), -1, false); + } else { + MessageSender.send(this, masterSecret, new OutgoingMediaMessage(this, recipients, new SlideDeck(), content, + ThreadDatabase.DistributionTypes.DEFAULT), -1, false); + } + } + } catch (URISyntaxException e) { + Toast.makeText(this, R.string.QuickResponseService_problem_sending_message, Toast.LENGTH_LONG).show(); + Log.w(TAG, e); + } } }