summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/java/com/android/internal/telephony/SMSDispatcher.java67
-rw-r--r--src/java/com/android/internal/telephony/SmsUsageMonitor.java6
2 files changed, 63 insertions, 10 deletions
diff --git a/src/java/com/android/internal/telephony/SMSDispatcher.java b/src/java/com/android/internal/telephony/SMSDispatcher.java
index da804b4..497b62c 100644
--- a/src/java/com/android/internal/telephony/SMSDispatcher.java
+++ b/src/java/com/android/internal/telephony/SMSDispatcher.java
@@ -31,6 +31,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.Cursor;
+import android.database.ContentObserver;
import android.database.SQLException;
import android.net.Uri;
import android.os.AsyncResult;
@@ -39,6 +40,7 @@ import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.os.SystemProperties;
+import android.provider.Settings;
import android.provider.Telephony;
import android.provider.Telephony.Sms.Intents;
import android.telephony.PhoneNumberUtils;
@@ -67,6 +69,7 @@ import com.android.internal.util.HexDump;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.HashMap;
import java.util.Random;
@@ -108,6 +111,12 @@ public abstract class SMSDispatcher extends Handler {
private static final int SEQUENCE_COLUMN = 1;
private static final int DESTINATION_PORT_COLUMN = 2;
+ private static final int PREMIUM_RULE_USE_SIM = 1;
+ private static final int PREMIUM_RULE_USE_NETWORK = 2;
+ private static final int PREMIUM_RULE_USE_BOTH = 3;
+ private final AtomicInteger mPremiumSmsRule = new AtomicInteger(PREMIUM_RULE_USE_SIM);
+ private final SettingsObserver mSettingsObserver;
+
/** New SMS received. */
protected static final int EVENT_NEW_SMS = 1;
@@ -203,6 +212,9 @@ public abstract class SMSDispatcher extends Handler {
mStorageMonitor = storageMonitor;
mUsageMonitor = usageMonitor;
mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+ mSettingsObserver = new SettingsObserver(this, mPremiumSmsRule, mContext);
+ mContext.getContentResolver().registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.SMS_SHORT_CODE_RULE), false, mSettingsObserver);
createWakelock();
@@ -217,6 +229,26 @@ public abstract class SMSDispatcher extends Handler {
+ " mSmsSendDisabled=" + mSmsSendDisabled);
}
+ /**
+ * Observe the secure setting for updated premium sms determination rules
+ */
+ private static class SettingsObserver extends ContentObserver {
+ private final AtomicInteger mPremiumSmsRule;
+ private final Context mContext;
+ SettingsObserver(Handler handler, AtomicInteger premiumSmsRule, Context context) {
+ super(handler);
+ mPremiumSmsRule = premiumSmsRule;
+ mContext = context;
+ onChange(false); // load initial value;
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ mPremiumSmsRule.set(Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.SMS_SHORT_CODE_RULE, PREMIUM_RULE_USE_SIM));
+ }
+ }
+
/** Unregister for incoming SMS events. */
public abstract void dispose();
@@ -993,16 +1025,31 @@ public abstract class SMSDispatcher extends Handler {
== PackageManager.PERMISSION_GRANTED) {
return true; // app is pre-approved to send to short codes
} else {
- String countryIso = mTelephonyManager.getSimCountryIso();
- if (countryIso == null || countryIso.length() != 2) {
- Log.e(TAG, "Can't get SIM country code: trying network country code");
- countryIso = mTelephonyManager.getNetworkCountryIso();
+ int rule = mPremiumSmsRule.get();
+ int smsCategory = SmsUsageMonitor.CATEGORY_NOT_SHORT_CODE;
+ if (rule == PREMIUM_RULE_USE_SIM || rule == PREMIUM_RULE_USE_BOTH) {
+ String simCountryIso = mTelephonyManager.getSimCountryIso();
+ if (simCountryIso == null || simCountryIso.length() != 2) {
+ Log.e(TAG, "Can't get SIM country Iso: trying network country Iso");
+ simCountryIso = mTelephonyManager.getNetworkCountryIso();
+ }
+
+ smsCategory = mUsageMonitor.checkDestination(tracker.mDestAddress, simCountryIso);
+ }
+ if (rule == PREMIUM_RULE_USE_NETWORK || rule == PREMIUM_RULE_USE_BOTH) {
+ String networkCountryIso = mTelephonyManager.getNetworkCountryIso();
+ if (networkCountryIso == null || networkCountryIso.length() != 2) {
+ Log.e(TAG, "Can't get Network country Iso: trying SIM country Iso");
+ networkCountryIso = mTelephonyManager.getSimCountryIso();
+ }
+
+ smsCategory = mUsageMonitor.mergeShortCodeCategories(smsCategory,
+ mUsageMonitor.checkDestination(tracker.mDestAddress, networkCountryIso));
}
- int destination = mUsageMonitor.checkDestination(tracker.mDestAddress, countryIso);
- if (destination == SmsUsageMonitor.CATEGORY_NOT_SHORT_CODE
- || destination == SmsUsageMonitor.CATEGORY_FREE_SHORT_CODE
- || destination == SmsUsageMonitor.CATEGORY_STANDARD_SHORT_CODE) {
+ if (smsCategory == SmsUsageMonitor.CATEGORY_NOT_SHORT_CODE
+ || smsCategory == SmsUsageMonitor.CATEGORY_FREE_SHORT_CODE
+ || smsCategory == SmsUsageMonitor.CATEGORY_STANDARD_SHORT_CODE) {
return true; // not a premium short code
}
@@ -1027,7 +1074,7 @@ public abstract class SMSDispatcher extends Handler {
case SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER:
default:
int event;
- if (destination == SmsUsageMonitor.CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE) {
+ if (smsCategory == SmsUsageMonitor.CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE) {
event = EVENT_CONFIRM_SEND_TO_POSSIBLE_PREMIUM_SHORT_CODE;
} else {
event = EVENT_CONFIRM_SEND_TO_PREMIUM_SHORT_CODE;
@@ -1357,7 +1404,7 @@ public abstract class SMSDispatcher extends Handler {
mNegativeButton.setText(R.string.sms_short_code_confirm_never_allow);
} else {
mPositiveButton.setText(R.string.sms_short_code_confirm_allow);
- mNegativeButton.setText(R.string.sms_short_code_confirm_allow);
+ mNegativeButton.setText(R.string.sms_short_code_confirm_deny);
}
}
}
diff --git a/src/java/com/android/internal/telephony/SmsUsageMonitor.java b/src/java/com/android/internal/telephony/SmsUsageMonitor.java
index 78cf21d..cd777df 100644
--- a/src/java/com/android/internal/telephony/SmsUsageMonitor.java
+++ b/src/java/com/android/internal/telephony/SmsUsageMonitor.java
@@ -87,6 +87,12 @@ public class SmsUsageMonitor {
/** Return value from {@link #checkDestination} for premium short codes. */
static final int CATEGORY_PREMIUM_SHORT_CODE = 4;
+ /** @hide */
+ public static int mergeShortCodeCategories(int type1, int type2) {
+ if (type1 > type2) return type1;
+ return type2;
+ }
+
/** Premium SMS permission for a new package (ask user when first premium SMS sent). */
public static final int PREMIUM_SMS_PERMISSION_UNKNOWN = 0;