Loading src/java/com/android/internal/telephony/SMSDispatcher.java +15 −5 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ import android.widget.CompoundButton; import android.widget.TextView; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.uicc.UiccCard; import com.android.internal.telephony.uicc.UiccController; Loading Loading @@ -970,7 +971,8 @@ public abstract class SMSDispatcher extends Handler { * raw pdu of the status report is in the extended data ("pdu"). * -param destAddr the destination phone number (for short code confirmation) */ protected void sendRawPdu(SmsTracker tracker) { @VisibleForTesting public void sendRawPdu(SmsTracker tracker) { HashMap map = tracker.getData(); byte pdu[] = (byte[]) map.get("pdu"); Loading Loading @@ -1075,7 +1077,7 @@ public abstract class SMSDispatcher extends Handler { // Wait for user confirmation unless the user has set permission to always allow/deny int premiumSmsPermission = mUsageMonitor.getPremiumSmsPermission( tracker.mAppInfo.packageName); tracker.getAppPackageName()); if (premiumSmsPermission == SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { // First time trying to send to premium SMS. premiumSmsPermission = SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER; Loading Loading @@ -1150,7 +1152,7 @@ public abstract class SMSDispatcher extends Handler { return; // queue limit reached; error was returned to caller } CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName, tracker.mUserId); CharSequence appLabel = getAppLabel(tracker.getAppPackageName(), tracker.mUserId); Resources r = Resources.getSystem(); Spanned messageText = Html.fromHtml(r.getString(R.string.sms_control_message, appLabel)); Loading Loading @@ -1188,7 +1190,7 @@ public abstract class SMSDispatcher extends Handler { detailsId = R.string.sms_short_code_details; } CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName, tracker.mUserId); CharSequence appLabel = getAppLabel(tracker.getAppPackageName(), tracker.mUserId); Resources r = Resources.getSystem(); Spanned messageText = Html.fromHtml(r.getString(R.string.sms_short_code_confirm_message, appLabel, tracker.mDestAddress)); Loading Loading @@ -1400,6 +1402,14 @@ public abstract class SMSDispatcher extends Handler { return mData; } /** * Get the App package name * @return App package name info */ public String getAppPackageName() { return mAppInfo != null ? mAppInfo.packageName : null; } /** * Update the status of this message if we persisted it */ Loading Loading @@ -1710,7 +1720,7 @@ public abstract class SMSDispatcher extends Handler { } sendMessage(msg); } setPremiumSmsPermission(mTracker.mAppInfo.packageName, newSmsPermission); setPremiumSmsPermission(mTracker.getAppPackageName(), newSmsPermission); } @Override Loading src/java/com/android/internal/telephony/SmsUsageMonitor.java +3 −3 Original line number Diff line number Diff line Loading @@ -29,8 +29,8 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.telephony.PhoneNumberUtils; import android.util.AtomicFile; import android.telephony.Rlog; import android.util.AtomicFile; import android.util.Xml; import com.android.internal.util.FastXmlSerializer; Loading @@ -48,10 +48,10 @@ import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicBoolean; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; /** Loading Loading @@ -85,7 +85,7 @@ public class SmsUsageMonitor { static final int CATEGORY_STANDARD_SHORT_CODE = 2; /** Return value from {@link #checkDestination} for possible premium short codes. */ static final int CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE = 3; 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; Loading tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +8 −1 Original line number Diff line number Diff line Loading @@ -439,7 +439,14 @@ public class ContextFixture implements TestFixture<Context> { @Override public int checkCallingOrSelfPermission(String permission) { if (mPermissionTable.contains(permission) || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) { logd("checkCallingOrSelfPermission: " + permission + " return GRANTED"); return PackageManager.PERMISSION_GRANTED; } else { logd("checkCallingOrSelfPermission: " + permission + " return DENIED"); return PackageManager.PERMISSION_DENIED; } } @Override Loading tests/telephonytests/src/com/android/internal/telephony/gsm/GsmSmsDispatcherTest.java +44 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,14 @@ 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 com.android.internal.telephony.SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW; import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading @@ -35,6 +40,7 @@ import android.location.CountryDetector; import android.os.HandlerThread; import android.os.Message; import android.os.SystemProperties; import android.provider.Settings; import android.provider.Telephony; import android.support.test.filters.FlakyTest; import android.telephony.SmsManager; Loading @@ -42,8 +48,10 @@ import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.SmallTest; import android.util.Singleton; import com.android.internal.telephony.ContextFixture; import com.android.internal.telephony.ISub; import com.android.internal.telephony.ImsSMSDispatcher; import com.android.internal.telephony.SMSDispatcher; import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.TelephonyTestUtils; import com.android.internal.telephony.TestApplication; Loading @@ -51,8 +59,11 @@ import com.android.internal.telephony.TestApplication; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import java.util.HashMap; public class GsmSmsDispatcherTest extends TelephonyTest { @Mock private android.telephony.SmsMessage mSmsMessage; Loading @@ -65,6 +76,8 @@ public class GsmSmsDispatcherTest extends TelephonyTest { @Mock private CountryDetector mCountryDetector; @Mock private SMSDispatcher.SmsTracker mSmsTracker; @Mock private ISub.Stub mISubStub; private Object mLock = new Object(); private boolean mReceivedTestIntent = false; Loading Loading @@ -191,4 +204,35 @@ public class GsmSmsDispatcherTest extends TelephonyTest { assertEquals(SmsManager.RESULT_ERROR_NULL_PDU, mTestReceiver.getResultCode()); } } @Test public void testSendRawPduWithEventStopSending() throws Exception { setupMockPackagePermissionChecks(); mContextFixture.removeCallingOrSelfPermission(ContextFixture.PERMISSION_ENABLE_ALL); // return a fake value to pass getData() HashMap data = new HashMap<String, String>(); data.put("pdu", new byte[1]); when(mSmsTracker.getData()).thenReturn(data); // Set values to return to simulate EVENT_STOP_SENDING when(mSmsUsageMonitor.checkDestination(any(), any())) .thenReturn(CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE); when(mSmsUsageMonitor.getPremiumSmsPermission(any())) .thenReturn(PREMIUM_SMS_PERMISSION_NEVER_ALLOW); when(mSmsTracker.getAppPackageName()).thenReturn(""); // Settings.Global.DEVICE_PROVISIONED to 1 Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); mGsmSmsDispatcher.sendRawPdu(mSmsTracker); verify(mSmsUsageMonitor, times(1)).checkDestination(any(), any()); verify(mSmsUsageMonitor, times(1)).getPremiumSmsPermission(any()); ArgumentCaptor<Integer> argumentCaptor = ArgumentCaptor .forClass(Integer.class); verify(mSmsTracker, times(1)).onFailed(any(), argumentCaptor.capture(), anyInt()); assertEquals(RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED, (int) argumentCaptor.getValue()); } } Loading
src/java/com/android/internal/telephony/SMSDispatcher.java +15 −5 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ import android.widget.CompoundButton; import android.widget.TextView; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.uicc.UiccCard; import com.android.internal.telephony.uicc.UiccController; Loading Loading @@ -970,7 +971,8 @@ public abstract class SMSDispatcher extends Handler { * raw pdu of the status report is in the extended data ("pdu"). * -param destAddr the destination phone number (for short code confirmation) */ protected void sendRawPdu(SmsTracker tracker) { @VisibleForTesting public void sendRawPdu(SmsTracker tracker) { HashMap map = tracker.getData(); byte pdu[] = (byte[]) map.get("pdu"); Loading Loading @@ -1075,7 +1077,7 @@ public abstract class SMSDispatcher extends Handler { // Wait for user confirmation unless the user has set permission to always allow/deny int premiumSmsPermission = mUsageMonitor.getPremiumSmsPermission( tracker.mAppInfo.packageName); tracker.getAppPackageName()); if (premiumSmsPermission == SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { // First time trying to send to premium SMS. premiumSmsPermission = SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER; Loading Loading @@ -1150,7 +1152,7 @@ public abstract class SMSDispatcher extends Handler { return; // queue limit reached; error was returned to caller } CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName, tracker.mUserId); CharSequence appLabel = getAppLabel(tracker.getAppPackageName(), tracker.mUserId); Resources r = Resources.getSystem(); Spanned messageText = Html.fromHtml(r.getString(R.string.sms_control_message, appLabel)); Loading Loading @@ -1188,7 +1190,7 @@ public abstract class SMSDispatcher extends Handler { detailsId = R.string.sms_short_code_details; } CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName, tracker.mUserId); CharSequence appLabel = getAppLabel(tracker.getAppPackageName(), tracker.mUserId); Resources r = Resources.getSystem(); Spanned messageText = Html.fromHtml(r.getString(R.string.sms_short_code_confirm_message, appLabel, tracker.mDestAddress)); Loading Loading @@ -1400,6 +1402,14 @@ public abstract class SMSDispatcher extends Handler { return mData; } /** * Get the App package name * @return App package name info */ public String getAppPackageName() { return mAppInfo != null ? mAppInfo.packageName : null; } /** * Update the status of this message if we persisted it */ Loading Loading @@ -1710,7 +1720,7 @@ public abstract class SMSDispatcher extends Handler { } sendMessage(msg); } setPremiumSmsPermission(mTracker.mAppInfo.packageName, newSmsPermission); setPremiumSmsPermission(mTracker.getAppPackageName(), newSmsPermission); } @Override Loading
src/java/com/android/internal/telephony/SmsUsageMonitor.java +3 −3 Original line number Diff line number Diff line Loading @@ -29,8 +29,8 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.telephony.PhoneNumberUtils; import android.util.AtomicFile; import android.telephony.Rlog; import android.util.AtomicFile; import android.util.Xml; import com.android.internal.util.FastXmlSerializer; Loading @@ -48,10 +48,10 @@ import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicBoolean; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; /** Loading Loading @@ -85,7 +85,7 @@ public class SmsUsageMonitor { static final int CATEGORY_STANDARD_SHORT_CODE = 2; /** Return value from {@link #checkDestination} for possible premium short codes. */ static final int CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE = 3; 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; Loading
tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +8 −1 Original line number Diff line number Diff line Loading @@ -439,7 +439,14 @@ public class ContextFixture implements TestFixture<Context> { @Override public int checkCallingOrSelfPermission(String permission) { if (mPermissionTable.contains(permission) || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) { logd("checkCallingOrSelfPermission: " + permission + " return GRANTED"); return PackageManager.PERMISSION_GRANTED; } else { logd("checkCallingOrSelfPermission: " + permission + " return DENIED"); return PackageManager.PERMISSION_DENIED; } } @Override Loading
tests/telephonytests/src/com/android/internal/telephony/gsm/GsmSmsDispatcherTest.java +44 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,14 @@ 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 com.android.internal.telephony.SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW; import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading @@ -35,6 +40,7 @@ import android.location.CountryDetector; import android.os.HandlerThread; import android.os.Message; import android.os.SystemProperties; import android.provider.Settings; import android.provider.Telephony; import android.support.test.filters.FlakyTest; import android.telephony.SmsManager; Loading @@ -42,8 +48,10 @@ import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.SmallTest; import android.util.Singleton; import com.android.internal.telephony.ContextFixture; import com.android.internal.telephony.ISub; import com.android.internal.telephony.ImsSMSDispatcher; import com.android.internal.telephony.SMSDispatcher; import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.TelephonyTestUtils; import com.android.internal.telephony.TestApplication; Loading @@ -51,8 +59,11 @@ import com.android.internal.telephony.TestApplication; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import java.util.HashMap; public class GsmSmsDispatcherTest extends TelephonyTest { @Mock private android.telephony.SmsMessage mSmsMessage; Loading @@ -65,6 +76,8 @@ public class GsmSmsDispatcherTest extends TelephonyTest { @Mock private CountryDetector mCountryDetector; @Mock private SMSDispatcher.SmsTracker mSmsTracker; @Mock private ISub.Stub mISubStub; private Object mLock = new Object(); private boolean mReceivedTestIntent = false; Loading Loading @@ -191,4 +204,35 @@ public class GsmSmsDispatcherTest extends TelephonyTest { assertEquals(SmsManager.RESULT_ERROR_NULL_PDU, mTestReceiver.getResultCode()); } } @Test public void testSendRawPduWithEventStopSending() throws Exception { setupMockPackagePermissionChecks(); mContextFixture.removeCallingOrSelfPermission(ContextFixture.PERMISSION_ENABLE_ALL); // return a fake value to pass getData() HashMap data = new HashMap<String, String>(); data.put("pdu", new byte[1]); when(mSmsTracker.getData()).thenReturn(data); // Set values to return to simulate EVENT_STOP_SENDING when(mSmsUsageMonitor.checkDestination(any(), any())) .thenReturn(CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE); when(mSmsUsageMonitor.getPremiumSmsPermission(any())) .thenReturn(PREMIUM_SMS_PERMISSION_NEVER_ALLOW); when(mSmsTracker.getAppPackageName()).thenReturn(""); // Settings.Global.DEVICE_PROVISIONED to 1 Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); mGsmSmsDispatcher.sendRawPdu(mSmsTracker); verify(mSmsUsageMonitor, times(1)).checkDestination(any(), any()); verify(mSmsUsageMonitor, times(1)).getPremiumSmsPermission(any()); ArgumentCaptor<Integer> argumentCaptor = ArgumentCaptor .forClass(Integer.class); verify(mSmsTracker, times(1)).onFailed(any(), argumentCaptor.capture(), anyInt()); assertEquals(RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED, (int) argumentCaptor.getValue()); } }