diff options
Diffstat (limited to 'src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java')
-rw-r--r-- | src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java | 87 |
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 */ |