diff --git a/res/values/strings.xml b/res/values/strings.xml
index 61333d5b3d..28e6b53327 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -678,6 +678,8 @@
Use the data channel for communication with other TextSecure users
+ Allow SMS Fallback
+ Send and receive SMS messages when push is not available
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index ff48af2d16..8919e21aaa 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -16,16 +16,22 @@
android:title="@string/preferences__make_default_sms_app"
android:summary="@string/preferences__make_textsecure_the_default_sms_mms_app" />
-
+
+
+
+
+
+
= Build.VERSION_CODES.KITKAT) {
generalCategory.removePreference(findPreference(TextSecurePreferences.ALL_SMS_PREF));
@@ -198,6 +199,29 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredSherlockPr
}
}
+ private void initializeSmsFallbackOption() {
+ CheckBoxPreference allowSmsPreference =
+ (CheckBoxPreference) findPreference(TextSecurePreferences.ALLOW_SMS_FALLBACK_PREF);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ if (Util.isDefaultSmsProvider(this) || !TextSecurePreferences.isPushRegistered(this)) {
+ allowSmsPreference.setEnabled(false);
+ allowSmsPreference.setChecked(true);
+ } else {
+ allowSmsPreference.setEnabled(true);
+ }
+ } else {
+ if (TextSecurePreferences.isInterceptAllMmsEnabled(this) ||
+ TextSecurePreferences.isInterceptAllSmsEnabled(this))
+ {
+ allowSmsPreference.setEnabled(false);
+ allowSmsPreference.setChecked(true);
+ } else {
+ allowSmsPreference.setEnabled(true);
+ }
+ }
+ }
+
private void initializeEditTextSummary(final EditTextPreference preference) {
if (preference.getText() == null) {
preference.setSummary("Not set");
@@ -268,6 +292,10 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredSherlockPr
dynamicTheme.onResume(this);
} else if (key.equals(TextSecurePreferences.LANGUAGE_PREF)) {
dynamicLanguage.onResume(this);
+ } else if (key.equals(TextSecurePreferences.ALL_MMS_PREF) ||
+ key.equals(TextSecurePreferences.ALL_SMS_PREF))
+ {
+ initializeSmsFallbackOption();
}
}
diff --git a/src/org/thoughtcrime/securesms/service/MmsListener.java b/src/org/thoughtcrime/securesms/service/MmsListener.java
index 5a95bcb4b6..2de7ed702c 100644
--- a/src/org/thoughtcrime/securesms/service/MmsListener.java
+++ b/src/org/thoughtcrime/securesms/service/MmsListener.java
@@ -20,14 +20,12 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
-import android.preference.PreferenceManager;
import android.provider.Telephony;
import android.util.Log;
-import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.protocol.WirePrefix;
-import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
+import org.thoughtcrime.securesms.util.Util;
import ws.com.google.android.mms.pdu.GenericPdu;
import ws.com.google.android.mms.pdu.NotificationInd;
@@ -52,7 +50,8 @@ public class MmsListener extends BroadcastReceiver {
return false;
}
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ||
+ if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT &&
+ TextSecurePreferences.isSmsFallbackEnabled(context)) ||
TextSecurePreferences.isInterceptAllMmsEnabled(context))
{
return true;
diff --git a/src/org/thoughtcrime/securesms/service/SmsListener.java b/src/org/thoughtcrime/securesms/service/SmsListener.java
index 02993176dc..5f0c65b435 100644
--- a/src/org/thoughtcrime/securesms/service/SmsListener.java
+++ b/src/org/thoughtcrime/securesms/service/SmsListener.java
@@ -110,7 +110,8 @@ public class SmsListener extends BroadcastReceiver {
return false;
}
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ||
+ if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT &&
+ TextSecurePreferences.isSmsFallbackEnabled(context)) ||
TextSecurePreferences.isInterceptAllSmsEnabled(context))
{
return true;
@@ -120,8 +121,7 @@ public class SmsListener extends BroadcastReceiver {
}
private boolean isChallenge(Context context, Intent intent) {
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
- String messageBody = getSmsMessageBodyFromIntent(intent);
+ String messageBody = getSmsMessageBodyFromIntent(intent);
if (messageBody == null)
return false;
diff --git a/src/org/thoughtcrime/securesms/transport/SmsTransport.java b/src/org/thoughtcrime/securesms/transport/SmsTransport.java
index 7dd2dfd88d..b6f89b9b5a 100644
--- a/src/org/thoughtcrime/securesms/transport/SmsTransport.java
+++ b/src/org/thoughtcrime/securesms/transport/SmsTransport.java
@@ -48,6 +48,12 @@ public class SmsTransport extends BaseTransport {
}
public void deliver(SmsMessageRecord message) throws UndeliverableMessageException {
+ if (TextSecurePreferences.isPushRegistered(context) &&
+ !TextSecurePreferences.isSmsFallbackEnabled(context))
+ {
+ throw new UndeliverableMessageException("SMS Transport is not enabled!");
+ }
+
if (message.isSecure() || message.isKeyExchange() || message.isEndSession()) {
deliverSecureMessage(message);
} else {
diff --git a/src/org/thoughtcrime/securesms/transport/UniversalTransport.java b/src/org/thoughtcrime/securesms/transport/UniversalTransport.java
index f226963205..6114567eee 100644
--- a/src/org/thoughtcrime/securesms/transport/UniversalTransport.java
+++ b/src/org/thoughtcrime/securesms/transport/UniversalTransport.java
@@ -214,6 +214,12 @@ public class UniversalTransport {
return false;
}
+ if (TextSecurePreferences.isPushRegistered(context) &&
+ !TextSecurePreferences.isSmsFallbackEnabled(context))
+ {
+ return false;
+ }
+
Directory directory = Directory.getInstance(context);
return directory.isSmsFallbackSupported(destination);
}
diff --git a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java
index 0fdba0e687..3b07775dbd 100644
--- a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java
+++ b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java
@@ -44,6 +44,11 @@ public class TextSecurePreferences {
private static final String IN_THREAD_NOTIFICATION_PREF = "pref_key_inthread_notifications";
private static final String LOCAL_REGISTRATION_ID_PREF = "pref_local_registration_id";
+ public static final String ALLOW_SMS_FALLBACK_PREF = "pref_allow_sms_traffic_out";
+
+ public static boolean isSmsFallbackEnabled(Context context) {
+ return getBooleanPreference(context, ALLOW_SMS_FALLBACK_PREF, true);
+ }
public static int getLocalRegistrationId(Context context) {
return getIntegerPreference(context, LOCAL_REGISTRATION_ID_PREF, 0);
@@ -175,7 +180,7 @@ public class TextSecurePreferences {
}
public static boolean isSmsDeliveryReportsEnabled(Context context) {
- return getBooleanPreference(context, SMS_DELIVERY_REPORT_PREF, false);
+ return getBooleanPreference(context, SMS_DELIVERY_REPORT_PREF, true);
}
public static boolean hasPromptedPushRegistration(Context context) {