Loading src/java/com/android/internal/telephony/SMSDispatcher.java +5 −5 Original line number Diff line number Diff line Loading @@ -1217,7 +1217,7 @@ public abstract class SMSDispatcher extends Handler { return true; // app is pre-approved to send to short codes } else { int rule = mPremiumSmsRule.get(); int smsCategory = SmsUsageMonitor.CATEGORY_NOT_SHORT_CODE; int smsCategory = SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; if (rule == PREMIUM_RULE_USE_SIM || rule == PREMIUM_RULE_USE_BOTH) { String simCountryIso = mTelephonyManager.getSimCountryIsoForPhone(mPhone.getPhoneId()); Loading @@ -1244,9 +1244,9 @@ public abstract class SMSDispatcher extends Handler { tracker.mDestAddress, networkCountryIso)); } if (smsCategory == SmsUsageMonitor.CATEGORY_NOT_SHORT_CODE || smsCategory == SmsUsageMonitor.CATEGORY_FREE_SHORT_CODE || smsCategory == SmsUsageMonitor.CATEGORY_STANDARD_SHORT_CODE) { if (smsCategory == SmsManager.SMS_CATEGORY_NOT_SHORT_CODE || smsCategory == SmsManager.SMS_CATEGORY_FREE_SHORT_CODE || smsCategory == SmsManager.SMS_CATEGORY_STANDARD_SHORT_CODE) { return true; // not a premium short code } Loading Loading @@ -1281,7 +1281,7 @@ public abstract class SMSDispatcher extends Handler { case SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER: default: int event; if (smsCategory == SmsUsageMonitor.CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE) { if (smsCategory == SmsManager.SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE) { event = EVENT_CONFIRM_SEND_TO_POSSIBLE_PREMIUM_SHORT_CODE; } else { event = EVENT_CONFIRM_SEND_TO_PREMIUM_SHORT_CODE; Loading src/java/com/android/internal/telephony/SmsUsageMonitor.java +15 −26 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.telephony.PhoneNumberUtils; import android.telephony.Rlog; import android.telephony.SmsManager; import android.util.AtomicFile; import android.util.Xml; Loading Loading @@ -76,21 +77,6 @@ public class SmsUsageMonitor { /** Default number of SMS sent in checking period without user permission. */ private static final int DEFAULT_SMS_MAX_COUNT = 30; /** Return value from {@link #checkDestination} for regular phone numbers. */ static final int CATEGORY_NOT_SHORT_CODE = 0; /** Return value from {@link #checkDestination} for free (no cost) short codes. */ static final int CATEGORY_FREE_SHORT_CODE = 1; /** Return value from {@link #checkDestination} for standard rate (non-premium) short codes. */ static final int CATEGORY_STANDARD_SHORT_CODE = 2; /** Return value from {@link #checkDestination} for possible premium short codes. */ public static final int CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE = 3; /** 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; Loading Loading @@ -204,20 +190,20 @@ public class SmsUsageMonitor { int getNumberCategory(String phoneNumber) { if (mFreeShortCodePattern != null && mFreeShortCodePattern.matcher(phoneNumber) .matches()) { return CATEGORY_FREE_SHORT_CODE; return SmsManager.SMS_CATEGORY_FREE_SHORT_CODE; } if (mStandardShortCodePattern != null && mStandardShortCodePattern.matcher(phoneNumber) .matches()) { return CATEGORY_STANDARD_SHORT_CODE; return SmsManager.SMS_CATEGORY_STANDARD_SHORT_CODE; } if (mPremiumShortCodePattern != null && mPremiumShortCodePattern.matcher(phoneNumber) .matches()) { return CATEGORY_PREMIUM_SHORT_CODE; return SmsManager.SMS_CATEGORY_PREMIUM_SHORT_CODE; } if (mShortCodePattern != null && mShortCodePattern.matcher(phoneNumber).matches()) { return CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; return SmsManager.SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; } return CATEGORY_NOT_SHORT_CODE; return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } } Loading Loading @@ -389,20 +375,23 @@ public class SmsUsageMonitor { * destination phone number. * * @param destAddress the destination address to test for possible short code * @return {@link #CATEGORY_NOT_SHORT_CODE}, {@link #CATEGORY_FREE_SHORT_CODE}, * {@link #CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE}, or {@link #CATEGORY_PREMIUM_SHORT_CODE}. * @return {@link SmsManager#SMS_CATEGORY_FREE_SHORT_CODE}, * {@link SmsManager#SMS_CATEGORY_NOT_SHORT_CODE}, * {@link SmsManager#SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE}, * {@link SmsManager#SMS_CATEGORY_STANDARD_SHORT_CODE}, or * {@link SmsManager#SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE} */ public int checkDestination(String destAddress, String countryIso) { synchronized (mSettingsObserverHandler) { // always allow emergency numbers if (PhoneNumberUtils.isEmergencyNumber(destAddress, countryIso)) { if (DBG) Rlog.d(TAG, "isEmergencyNumber"); return CATEGORY_NOT_SHORT_CODE; return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } // always allow if the feature is disabled if (!mCheckEnabled.get()) { if (DBG) Rlog.e(TAG, "check disabled"); return CATEGORY_NOT_SHORT_CODE; return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } if (countryIso != null) { Loading @@ -425,9 +414,9 @@ public class SmsUsageMonitor { // Generic rule: numbers of 5 digits or less are considered potential short codes Rlog.e(TAG, "No patterns for \"" + countryIso + "\": using generic short code rule"); if (destAddress.length() <= 5) { return CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; return SmsManager.SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; } else { return CATEGORY_NOT_SHORT_CODE; return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } } } Loading src/java/com/android/internal/telephony/UiccSmsController.java +15 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,21 @@ public class UiccSmsController extends ISmsImplBase { callingPkg, params, callback); } @Override public int checkSmsShortCodeDestination( int subId, String callingPackage, String destAddress, String countryIso) { if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(getPhone(subId).getContext(), subId, callingPackage, "checkSmsShortCodeDestination")) { return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } final long identity = Binder.clearCallingIdentity(); try { return getPhone(subId).mSmsUsageMonitor.checkDestination(destAddress, countryIso); } finally { Binder.restoreCallingIdentity(identity); } } @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!checkDumpPermission(mContext, LOG_TAG, pw)) { Loading tests/telephonytests/src/com/android/internal/telephony/SmsUsageMonitorShortCodeTest.java +410 −410 File changed.Preview size limit exceeded, changes collapsed. Show changes tests/telephonytests/src/com/android/internal/telephony/gsm/GsmSmsDispatcherTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ package com.android.internal.telephony.gsm; import static android.telephony.SmsManager.RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED; import static com.android.internal.telephony.SmsUsageMonitor.CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; import static android.telephony.SmsManager.SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; import static com.android.internal.telephony.SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW; import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; Loading Loading @@ -241,7 +241,7 @@ public class GsmSmsDispatcherTest extends TelephonyTest { // Set values to return to simulate EVENT_STOP_SENDING when(mSmsUsageMonitor.checkDestination(any(), any())) .thenReturn(CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE); .thenReturn(SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE); when(mSmsUsageMonitor.getPremiumSmsPermission(any())) .thenReturn(PREMIUM_SMS_PERMISSION_NEVER_ALLOW); when(mSmsTracker.getAppPackageName()).thenReturn(""); Loading Loading
src/java/com/android/internal/telephony/SMSDispatcher.java +5 −5 Original line number Diff line number Diff line Loading @@ -1217,7 +1217,7 @@ public abstract class SMSDispatcher extends Handler { return true; // app is pre-approved to send to short codes } else { int rule = mPremiumSmsRule.get(); int smsCategory = SmsUsageMonitor.CATEGORY_NOT_SHORT_CODE; int smsCategory = SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; if (rule == PREMIUM_RULE_USE_SIM || rule == PREMIUM_RULE_USE_BOTH) { String simCountryIso = mTelephonyManager.getSimCountryIsoForPhone(mPhone.getPhoneId()); Loading @@ -1244,9 +1244,9 @@ public abstract class SMSDispatcher extends Handler { tracker.mDestAddress, networkCountryIso)); } if (smsCategory == SmsUsageMonitor.CATEGORY_NOT_SHORT_CODE || smsCategory == SmsUsageMonitor.CATEGORY_FREE_SHORT_CODE || smsCategory == SmsUsageMonitor.CATEGORY_STANDARD_SHORT_CODE) { if (smsCategory == SmsManager.SMS_CATEGORY_NOT_SHORT_CODE || smsCategory == SmsManager.SMS_CATEGORY_FREE_SHORT_CODE || smsCategory == SmsManager.SMS_CATEGORY_STANDARD_SHORT_CODE) { return true; // not a premium short code } Loading Loading @@ -1281,7 +1281,7 @@ public abstract class SMSDispatcher extends Handler { case SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER: default: int event; if (smsCategory == SmsUsageMonitor.CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE) { if (smsCategory == SmsManager.SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE) { event = EVENT_CONFIRM_SEND_TO_POSSIBLE_PREMIUM_SHORT_CODE; } else { event = EVENT_CONFIRM_SEND_TO_PREMIUM_SHORT_CODE; Loading
src/java/com/android/internal/telephony/SmsUsageMonitor.java +15 −26 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.telephony.PhoneNumberUtils; import android.telephony.Rlog; import android.telephony.SmsManager; import android.util.AtomicFile; import android.util.Xml; Loading Loading @@ -76,21 +77,6 @@ public class SmsUsageMonitor { /** Default number of SMS sent in checking period without user permission. */ private static final int DEFAULT_SMS_MAX_COUNT = 30; /** Return value from {@link #checkDestination} for regular phone numbers. */ static final int CATEGORY_NOT_SHORT_CODE = 0; /** Return value from {@link #checkDestination} for free (no cost) short codes. */ static final int CATEGORY_FREE_SHORT_CODE = 1; /** Return value from {@link #checkDestination} for standard rate (non-premium) short codes. */ static final int CATEGORY_STANDARD_SHORT_CODE = 2; /** Return value from {@link #checkDestination} for possible premium short codes. */ public static final int CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE = 3; /** 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; Loading Loading @@ -204,20 +190,20 @@ public class SmsUsageMonitor { int getNumberCategory(String phoneNumber) { if (mFreeShortCodePattern != null && mFreeShortCodePattern.matcher(phoneNumber) .matches()) { return CATEGORY_FREE_SHORT_CODE; return SmsManager.SMS_CATEGORY_FREE_SHORT_CODE; } if (mStandardShortCodePattern != null && mStandardShortCodePattern.matcher(phoneNumber) .matches()) { return CATEGORY_STANDARD_SHORT_CODE; return SmsManager.SMS_CATEGORY_STANDARD_SHORT_CODE; } if (mPremiumShortCodePattern != null && mPremiumShortCodePattern.matcher(phoneNumber) .matches()) { return CATEGORY_PREMIUM_SHORT_CODE; return SmsManager.SMS_CATEGORY_PREMIUM_SHORT_CODE; } if (mShortCodePattern != null && mShortCodePattern.matcher(phoneNumber).matches()) { return CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; return SmsManager.SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; } return CATEGORY_NOT_SHORT_CODE; return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } } Loading Loading @@ -389,20 +375,23 @@ public class SmsUsageMonitor { * destination phone number. * * @param destAddress the destination address to test for possible short code * @return {@link #CATEGORY_NOT_SHORT_CODE}, {@link #CATEGORY_FREE_SHORT_CODE}, * {@link #CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE}, or {@link #CATEGORY_PREMIUM_SHORT_CODE}. * @return {@link SmsManager#SMS_CATEGORY_FREE_SHORT_CODE}, * {@link SmsManager#SMS_CATEGORY_NOT_SHORT_CODE}, * {@link SmsManager#SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE}, * {@link SmsManager#SMS_CATEGORY_STANDARD_SHORT_CODE}, or * {@link SmsManager#SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE} */ public int checkDestination(String destAddress, String countryIso) { synchronized (mSettingsObserverHandler) { // always allow emergency numbers if (PhoneNumberUtils.isEmergencyNumber(destAddress, countryIso)) { if (DBG) Rlog.d(TAG, "isEmergencyNumber"); return CATEGORY_NOT_SHORT_CODE; return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } // always allow if the feature is disabled if (!mCheckEnabled.get()) { if (DBG) Rlog.e(TAG, "check disabled"); return CATEGORY_NOT_SHORT_CODE; return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } if (countryIso != null) { Loading @@ -425,9 +414,9 @@ public class SmsUsageMonitor { // Generic rule: numbers of 5 digits or less are considered potential short codes Rlog.e(TAG, "No patterns for \"" + countryIso + "\": using generic short code rule"); if (destAddress.length() <= 5) { return CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; return SmsManager.SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; } else { return CATEGORY_NOT_SHORT_CODE; return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } } } Loading
src/java/com/android/internal/telephony/UiccSmsController.java +15 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,21 @@ public class UiccSmsController extends ISmsImplBase { callingPkg, params, callback); } @Override public int checkSmsShortCodeDestination( int subId, String callingPackage, String destAddress, String countryIso) { if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(getPhone(subId).getContext(), subId, callingPackage, "checkSmsShortCodeDestination")) { return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } final long identity = Binder.clearCallingIdentity(); try { return getPhone(subId).mSmsUsageMonitor.checkDestination(destAddress, countryIso); } finally { Binder.restoreCallingIdentity(identity); } } @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!checkDumpPermission(mContext, LOG_TAG, pw)) { Loading
tests/telephonytests/src/com/android/internal/telephony/SmsUsageMonitorShortCodeTest.java +410 −410 File changed.Preview size limit exceeded, changes collapsed. Show changes
tests/telephonytests/src/com/android/internal/telephony/gsm/GsmSmsDispatcherTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ package com.android.internal.telephony.gsm; import static android.telephony.SmsManager.RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED; import static com.android.internal.telephony.SmsUsageMonitor.CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; import static android.telephony.SmsManager.SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE; import static com.android.internal.telephony.SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW; import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; Loading Loading @@ -241,7 +241,7 @@ public class GsmSmsDispatcherTest extends TelephonyTest { // Set values to return to simulate EVENT_STOP_SENDING when(mSmsUsageMonitor.checkDestination(any(), any())) .thenReturn(CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE); .thenReturn(SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE); when(mSmsUsageMonitor.getPremiumSmsPermission(any())) .thenReturn(PREMIUM_SMS_PERMISSION_NEVER_ALLOW); when(mSmsTracker.getAppPackageName()).thenReturn(""); Loading