Merge "CB: Add CDMA CMAS"
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java b/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
index a321d1b..4258e5c 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
@@ -27,6 +27,7 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.internal.telephony.cdma.sms.SmsEnvelope;
 import com.android.internal.telephony.gsm.SmsCbConstants;
 
 import static com.android.cellbroadcastreceiver.CellBroadcastReceiver.DBG;
@@ -47,6 +48,9 @@
 
     static final String ACTION_ENABLE_CHANNELS = "ACTION_ENABLE_CHANNELS";
 
+    static final String EMERGENCY_BROADCAST_RANGE_GSM =
+            "ro.cb.gsm.emergencyids";
+
     public CellBroadcastConfigService() {
         super(TAG);          // use class name for worker thread name
     }
@@ -84,7 +88,11 @@
 
         // Make sure CMAS Presidential is enabled (See 3GPP TS 22.268 Section 6.2).
         if (DBG) log("setChannelRange: enabling CMAS Presidential");
-        manager.enableCellBroadcast(SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL);
+        if (CellBroadcastReceiver.phoneIsCdma()) {
+            manager.enableCellBroadcast(SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT);
+        } else {
+            manager.enableCellBroadcast(SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL);
+        }
     }
 
     /**
@@ -99,7 +107,9 @@
         }
 
         // Check for system property defining the emergency channel ranges to enable
-        String emergencyIdRange = SystemProperties.get("ro.cellbroadcast.emergencyids");
+        String emergencyIdRange = (CellBroadcastReceiver.phoneIsCdma()) ?
+                "" : SystemProperties.get(EMERGENCY_BROADCAST_RANGE_GSM);
+
         if (TextUtils.isEmpty(emergencyIdRange)) {
             return false;
         }
@@ -132,9 +142,11 @@
             try {
                 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
                 Resources res = getResources();
+                boolean isCdma = CellBroadcastReceiver.phoneIsCdma();
 
                 // Check for system property defining the emergency channel ranges to enable
-                String emergencyIdRange = SystemProperties.get("ro.cellbroadcast.emergencyids");
+                String emergencyIdRange = isCdma ?
+                        "" : SystemProperties.get(EMERGENCY_BROADCAST_RANGE_GSM);
 
                 boolean enableEmergencyAlerts = prefs.getBoolean(
                         CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, true);
@@ -147,6 +159,15 @@
                     if (DBG) log("enabling emergency cell broadcast channels");
                     if (!TextUtils.isEmpty(emergencyIdRange)) {
                         setChannelRange(manager, emergencyIdRange, true);
+                    } else if (isCdma){
+                        // No emergency channel system property, enable all emergency channels
+                        manager.enableCellBroadcastRange(
+                                SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT,
+                                SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE);
+
+                        // CMAS Presidential must be on.
+                        manager.enableCellBroadcast(
+                                SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT);
                     } else {
                         // No emergency channel system property, enable all emergency channels
                         manager.enableCellBroadcastRange(
@@ -163,6 +184,15 @@
                     if (DBG) log("disabling emergency cell broadcast channels");
                     if (!TextUtils.isEmpty(emergencyIdRange)) {
                         setChannelRange(manager, emergencyIdRange, false);
+                    } else if (isCdma) {
+                        // No emergency channel system property, disable all emergency channels
+                        manager.disableCellBroadcastRange(
+                                SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT,
+                                SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE);
+
+                        // CMAS Presidential must be on.
+                        manager.enableCellBroadcast(
+                                SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT);
                     } else {
                         // No emergency channel system property, disable all emergency channels
                         // except for CMAS Presidential (See 3GPP TS 22.268 Section 6.2)
@@ -176,7 +206,9 @@
                     if (DBG) log("disabled emergency cell broadcast channels");
                 }
 
-                if (enableChannel50Alerts) {
+                if (isCdma) {
+                    if (DBG) log("channel 50 is not aplicable for cdma");
+                } else if (enableChannel50Alerts) {
                     if (DBG) log("enabling cell broadcast channel 50");
                     manager.enableCellBroadcast(50);
                     if (DBG) log("enabled cell broadcast channel 50");
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java b/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java
index 94d7179..ac5b1d8 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java
@@ -49,6 +49,7 @@
             startConfigService(context);
         } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
             boolean airplaneModeOn = intent.getBooleanExtra("state", false);
+            if (DBG) log("airplaneModeOn: " + airplaneModeOn);
             if (!airplaneModeOn) {
                 startConfigService(context);
             }
@@ -62,7 +63,7 @@
                 intent.setClass(context, CellBroadcastAlertService.class);
                 context.startService(intent);
             } else {
-                Log.e(TAG, "ignoring unprivileged action received " + action);
+                loge("ignoring unprivileged action received " + action);
             }
         } else if (Telephony.Sms.Intents.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION
                 .equals(action)) {
@@ -72,10 +73,10 @@
                 if (programDataList != null) {
                     handleCdmaSmsCbProgramData(context, programDataList);
                 } else {
-                    Log.e(TAG, "SCPD intent received with no program_data_list");
+                    loge("SCPD intent received with no program_data_list");
                 }
             } else {
-                Log.e(TAG, "ignoring unprivileged action received " + action);
+                loge("ignoring unprivileged action received " + action);
             }
         } else {
             Log.w(TAG, "onReceive() unexpected action " + action);
@@ -113,7 +114,7 @@
                     break;
 
                 default:
-                    Log.e(TAG, "Ignoring unknown SCPD operation " + programData.getOperation());
+                    loge("Ignoring unknown SCPD operation " + programData.getOperation());
             }
         }
     }
@@ -155,19 +156,15 @@
      * @param context the broadcast receiver context
      */
     static void startConfigService(Context context) {
-        if (phoneIsCdma()) {
-            if (DBG) log("CDMA phone detected; doing nothing");
-        } else {
-            Intent serviceIntent = new Intent(CellBroadcastConfigService.ACTION_ENABLE_CHANNELS,
-                    null, context, CellBroadcastConfigService.class);
-            context.startService(serviceIntent);
-        }
+        Intent serviceIntent = new Intent(CellBroadcastConfigService.ACTION_ENABLE_CHANNELS,
+                null, context, CellBroadcastConfigService.class);
+        context.startService(serviceIntent);
     }
 
     /**
      * @return true if the phone is a CDMA phone type
      */
-    private static boolean phoneIsCdma() {
+    static boolean phoneIsCdma() {
         boolean isCdma = false;
         try {
             ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
@@ -183,4 +180,8 @@
     private static void log(String msg) {
         Log.d(TAG, msg);
     }
+
+    private static void loge(String msg) {
+        Log.e(TAG, msg);
+    }
 }