Send CMAS broadcast to additional package
This is for sl4a automation to receive CMAS messages
broadcasdt. The automation should inject the settings
through 'adb settings'.
Test: manual
bug: 34393649
Merged-In: I88b0a568183b9701712e5071a6692e5d1ce08c7d
Change-Id: I88b0a568183b9701712e5071a6692e5d1ce08c7d
diff --git a/src/java/com/android/internal/telephony/CellBroadcastHandler.java b/src/java/com/android/internal/telephony/CellBroadcastHandler.java
index 3f2303e..778cbd3 100644
--- a/src/java/com/android/internal/telephony/CellBroadcastHandler.java
+++ b/src/java/com/android/internal/telephony/CellBroadcastHandler.java
@@ -16,14 +16,17 @@
package com.android.internal.telephony;
+import static android.provider.Settings.Secure.CMAS_ADDITIONAL_BROADCAST_PKG;
+
import android.Manifest;
import android.app.Activity;
import android.app.AppOpsManager;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.os.Build;
import android.os.Message;
import android.os.UserHandle;
+import android.provider.Settings;
import android.provider.Telephony;
import android.telephony.SmsCbMessage;
import android.telephony.SubscriptionManager;
@@ -92,21 +95,21 @@
appOp = AppOpsManager.OP_RECEIVE_SMS;
}
// explicitly send it to the default cell broadcast receiver only.
- intent.setComponent(getDefaultCellBroadcastReceiverApp(mContext));
+ intent.setPackage(mContext.getResources().getString(
+ com.android.internal.R.string.config_defaultCellBroadcastReceiverPkg));
intent.putExtra("message", message);
SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhone.getPhoneId());
mContext.sendOrderedBroadcastAsUser(intent, UserHandle.ALL, receiverPermission, appOp,
mReceiver, getHandler(), Activity.RESULT_OK, null, null);
- }
- /**
- * Get the default cell broadcast receiver component name.
- * @param context Device context
- * @return Component name of the default cell broadcast receiver
- */
- public static ComponentName getDefaultCellBroadcastReceiverApp(Context context) {
- String defaultCellBroadcastReceiver = context.getResources().getString(
- com.android.internal.R.string.config_defaultCellBroadcastReceiverComponent);
- return ComponentName.unflattenFromString(defaultCellBroadcastReceiver);
+ if (Build.IS_DEBUGGABLE) {
+ String additionalPackage = Settings.Secure.getString(mContext.getContentResolver(),
+ CMAS_ADDITIONAL_BROADCAST_PKG);
+ if (additionalPackage != null) {
+ intent.setPackage(additionalPackage);
+ mContext.sendOrderedBroadcastAsUser(intent, UserHandle.ALL, receiverPermission,
+ appOp, mReceiver, getHandler(), Activity.RESULT_OK, null, null);
+ }
+ }
}
}
diff --git a/src/java/com/android/internal/telephony/cdma/CdmaServiceCategoryProgramHandler.java b/src/java/com/android/internal/telephony/cdma/CdmaServiceCategoryProgramHandler.java
index 50fa566..bcbce53 100644
--- a/src/java/com/android/internal/telephony/cdma/CdmaServiceCategoryProgramHandler.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaServiceCategoryProgramHandler.java
@@ -30,7 +30,6 @@
import android.telephony.cdma.CdmaSmsCbProgramData;
import android.telephony.cdma.CdmaSmsCbProgramResults;
-import com.android.internal.telephony.CellBroadcastHandler;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.WakeLockStateMachine;
import com.android.internal.telephony.cdma.sms.BearerData;
@@ -103,7 +102,8 @@
}
Intent intent = new Intent(Intents.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION);
- intent.setComponent(CellBroadcastHandler.getDefaultCellBroadcastReceiverApp(mContext));
+ intent.setPackage(mContext.getResources().getString(
+ com.android.internal.R.string.config_defaultCellBroadcastReceiverPkg));
intent.putExtra("sender", sms.getOriginatingAddress());
intent.putParcelableArrayListExtra("program_data", programDataList);
SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhone.getPhoneId());
diff --git a/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmCellBroadcastHandlerTest.java b/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmCellBroadcastHandlerTest.java
index f883a52..8bbc9e3 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmCellBroadcastHandlerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmCellBroadcastHandlerTest.java
@@ -16,14 +16,26 @@
package com.android.internal.telephony.gsm;
-import static org.junit.Assert.assertTrue;
+import static android.provider.Settings.Secure.CMAS_ADDITIONAL_BROADCAST_PKG;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import android.Manifest;
+import android.app.Activity;
+import android.app.AppOpsManager;
+import android.content.BroadcastReceiver;
import android.content.Intent;
+import android.os.Handler;
import android.os.HandlerThread;
+import android.os.UserHandle;
+import android.provider.Settings;
import android.provider.Telephony;
import android.test.suitebuilder.annotation.SmallTest;
@@ -37,6 +49,8 @@
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
+import java.util.List;
+
public class GsmCellBroadcastHandlerTest extends TelephonyTest {
@Mock
private SmsStorageMonitor mSmsStorageMonitor;
@@ -86,8 +100,11 @@
@Test @SmallTest
public void testBroadcastSms() {
mContextFixture.putResource(
- com.android.internal.R.string.config_defaultCellBroadcastReceiverComponent,
- "fake.cellbroadcastreceiver.component");
+ com.android.internal.R.string.config_defaultCellBroadcastReceiverPkg,
+ "fake.cellbroadcastreceiver");
+
+ Settings.Secure.putString(mContext.getContentResolver(),
+ CMAS_ADDITIONAL_BROADCAST_PKG, "another.fake.pkg");
mSimulatedCommands.notifyGsmBroadcastSms(new byte[] {
(byte)0xc0, //geographical scope
(byte)0x01, //serial number
@@ -96,12 +113,23 @@
(byte)0x01, //message identifier
(byte)0x01
});
- TelephonyTestUtils.waitForMs(50);
+ TelephonyTestUtils.waitForMs(100);
ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class);
- verify(mContextFixture.getTestDouble()).sendBroadcast(intentArgumentCaptor.capture());
- assertTrue(intentArgumentCaptor.getValue().getAction().equals(
- Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION) ||
- intentArgumentCaptor.getValue().getAction().equals(
- Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION));
+ verify(mContextFixture.getTestDouble(), times(2)).sendOrderedBroadcastAsUser(
+ intentArgumentCaptor.capture(), eq(UserHandle.ALL),
+ eq(Manifest.permission.RECEIVE_SMS), eq(AppOpsManager.OP_RECEIVE_SMS),
+ any(BroadcastReceiver.class), any(Handler.class), eq(Activity.RESULT_OK), eq(null),
+ eq(null));
+
+ List<Intent> intentList = intentArgumentCaptor.getAllValues();
+
+ assertEquals(Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION,
+ intentList.get(0).getAction());
+ // TODO: uncomment the following once ArgumentCaptor's bug is fixed.
+ // assertEquals("fake.cellbroadcastreceiver", intentList.get(0).getPackage());
+
+ assertEquals(Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION,
+ intentList.get(1).getAction());
+ assertEquals("another.fake.pkg", intentList.get(0).getPackage());
}
}