summaryrefslogtreecommitdiff
path: root/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java')
-rw-r--r--src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java87
1 files changed, 86 insertions, 1 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java b/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java
index bce3afde4..164cd8fce 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java
@@ -19,17 +19,21 @@ package com.android.cellbroadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.preference.PreferenceManager;
import android.provider.Telephony;
import android.telephony.TelephonyManager;
+import android.telephony.cdma.CdmaSmsCbProgramData;
import android.util.Log;
import com.android.internal.telephony.ITelephony;
+import com.android.internal.telephony.cdma.sms.SmsEnvelope;
public class CellBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "CellBroadcastReceiver";
- static final boolean DBG = true; // TODO: change to false before ship
+ static final boolean DBG = true; // STOPSHIP: change to false before ship
@Override
public void onReceive(Context context, Intent intent) {
@@ -60,12 +64,93 @@ public class CellBroadcastReceiver extends BroadcastReceiver {
} else {
Log.e(TAG, "ignoring unprivileged action received " + action);
}
+ } else if (Telephony.Sms.Intents.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION
+ .equals(action)) {
+ if (privileged) {
+ CdmaSmsCbProgramData[] programDataList = (CdmaSmsCbProgramData[])
+ intent.getParcelableArrayExtra("program_data_list");
+ if (programDataList != null) {
+ handleCdmaSmsCbProgramData(context, programDataList);
+ } else {
+ Log.e(TAG, "SCPD intent received with no program_data_list");
+ }
+ } else {
+ Log.e(TAG, "ignoring unprivileged action received " + action);
+ }
} else {
Log.w(TAG, "onReceive() unexpected action " + action);
}
}
/**
+ * Handle Service Category Program Data message.
+ * TODO: Send Service Category Program Results response message to sender
+ *
+ * @param context
+ * @param programDataList
+ */
+ private void handleCdmaSmsCbProgramData(Context context,
+ CdmaSmsCbProgramData[] programDataList) {
+ for (CdmaSmsCbProgramData programData : programDataList) {
+ switch (programData.getOperation()) {
+ case CdmaSmsCbProgramData.OPERATION_ADD_CATEGORY:
+ tryCdmaSetCategory(context, programData.getCategory(), true);
+ break;
+
+ case CdmaSmsCbProgramData.OPERATION_DELETE_CATEGORY:
+ tryCdmaSetCategory(context, programData.getCategory(), false);
+ break;
+
+ case CdmaSmsCbProgramData.OPERATION_CLEAR_CATEGORIES:
+ tryCdmaSetCategory(context,
+ SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT, false);
+ tryCdmaSetCategory(context,
+ SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT, false);
+ tryCdmaSetCategory(context,
+ SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY, false);
+ tryCdmaSetCategory(context,
+ SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE, false);
+ break;
+
+ default:
+ Log.e(TAG, "Ignoring unknown SCPD operation " + programData.getOperation());
+ }
+ }
+ }
+
+ private void tryCdmaSetCategory(Context context, int category, boolean enable) {
+ SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+
+ switch (category) {
+ case SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT:
+ sharedPrefs.edit().putBoolean(
+ CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, enable)
+ .apply();
+ break;
+
+ case SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT:
+ sharedPrefs.edit().putBoolean(
+ CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, enable)
+ .apply();
+ break;
+
+ case SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY:
+ sharedPrefs.edit().putBoolean(
+ CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, enable).apply();
+ break;
+
+ case SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE:
+ sharedPrefs.edit().putBoolean(
+ CellBroadcastSettings.KEY_ENABLE_CMAS_TEST_ALERTS, enable).apply();
+ break;
+
+ default:
+ Log.w(TAG, "Ignoring SCPD command to " + (enable ? "enable" : "disable")
+ + " alerts in category " + category);
+ }
+ }
+
+ /**
* Tell {@link CellBroadcastConfigService} to enable the CB channels.
* @param context the broadcast receiver context
*/