/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.android.cellbroadcastreceiver; import android.content.Context; import android.graphics.Typeface; import android.telephony.CellBroadcastMessage; import android.telephony.SmsCbCmasInfo; import android.telephony.SmsCbEtwsInfo; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.style.StyleSpan; import com.android.cellbroadcastreceiver.CellBroadcastChannelManager.CellBroadcastChannelRange; import java.util.ArrayList; /** * Returns the string resource ID's for CMAS and ETWS emergency alerts. */ public class CellBroadcastResources { private CellBroadcastResources() { } /** * Returns a styled CharSequence containing the message date/time and alert details. * @param context a Context for resource string access * @return a CharSequence for display in the broadcast alert dialog */ public static CharSequence getMessageDetails(Context context, CellBroadcastMessage cbm) { SpannableStringBuilder buf = new SpannableStringBuilder(); // Alert date/time int start = buf.length(); buf.append(context.getString(R.string.delivery_time_heading)); int end = buf.length(); buf.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); buf.append(" "); buf.append(cbm.getDateString(context)); if (cbm.isCmasMessage()) { // CMAS category, response type, severity, urgency, certainty appendCmasAlertDetails(context, buf, cbm.getCmasWarningInfo()); } return buf; } private static void appendCmasAlertDetails(Context context, SpannableStringBuilder buf, SmsCbCmasInfo cmasInfo) { // CMAS category int categoryId = getCmasCategoryResId(cmasInfo); if (categoryId != 0) { appendMessageDetail(context, buf, R.string.cmas_category_heading, categoryId); } // CMAS response type int responseId = getCmasResponseResId(cmasInfo); if (responseId != 0) { appendMessageDetail(context, buf, R.string.cmas_response_heading, responseId); } // CMAS severity int severityId = getCmasSeverityResId(cmasInfo); if (severityId != 0) { appendMessageDetail(context, buf, R.string.cmas_severity_heading, severityId); } // CMAS urgency int urgencyId = getCmasUrgencyResId(cmasInfo); if (urgencyId != 0) { appendMessageDetail(context, buf, R.string.cmas_urgency_heading, urgencyId); } // CMAS certainty int certaintyId = getCmasCertaintyResId(cmasInfo); if (certaintyId != 0) { appendMessageDetail(context, buf, R.string.cmas_certainty_heading, certaintyId); } } private static void appendMessageDetail(Context context, SpannableStringBuilder buf, int typeId, int valueId) { if (buf.length() != 0) { buf.append("\n"); } int start = buf.length(); buf.append(context.getString(typeId)); int end = buf.length(); buf.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); buf.append(" "); buf.append(context.getString(valueId)); } /** * Returns the string resource ID for the CMAS category. * @return a string resource ID, or 0 if the CMAS category is unknown or not present */ private static int getCmasCategoryResId(SmsCbCmasInfo cmasInfo) { switch (cmasInfo.getCategory()) { case SmsCbCmasInfo.CMAS_CATEGORY_GEO: return R.string.cmas_category_geo; case SmsCbCmasInfo.CMAS_CATEGORY_MET: return R.string.cmas_category_met; case SmsCbCmasInfo.CMAS_CATEGORY_SAFETY: return R.string.cmas_category_safety; case SmsCbCmasInfo.CMAS_CATEGORY_SECURITY: return R.string.cmas_category_security; case SmsCbCmasInfo.CMAS_CATEGORY_RESCUE: return R.string.cmas_category_rescue; case SmsCbCmasInfo.CMAS_CATEGORY_FIRE: return R.string.cmas_category_fire; case SmsCbCmasInfo.CMAS_CATEGORY_HEALTH: return R.string.cmas_category_health; case SmsCbCmasInfo.CMAS_CATEGORY_ENV: return R.string.cmas_category_env; case SmsCbCmasInfo.CMAS_CATEGORY_TRANSPORT: return R.string.cmas_category_transport; case SmsCbCmasInfo.CMAS_CATEGORY_INFRA: return R.string.cmas_category_infra; case SmsCbCmasInfo.CMAS_CATEGORY_CBRNE: return R.string.cmas_category_cbrne; case SmsCbCmasInfo.CMAS_CATEGORY_OTHER: return R.string.cmas_category_other; default: return 0; } } /** * Returns the string resource ID for the CMAS response type. * @return a string resource ID, or 0 if the CMAS response type is unknown or not present */ private static int getCmasResponseResId(SmsCbCmasInfo cmasInfo) { switch (cmasInfo.getResponseType()) { case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_SHELTER: return R.string.cmas_response_shelter; case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_EVACUATE: return R.string.cmas_response_evacuate; case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_PREPARE: return R.string.cmas_response_prepare; case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_EXECUTE: return R.string.cmas_response_execute; case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_MONITOR: return R.string.cmas_response_monitor; case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_AVOID: return R.string.cmas_response_avoid; case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_ASSESS: return R.string.cmas_response_assess; case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_NONE: return R.string.cmas_response_none; default: return 0; } } /** * Returns the string resource ID for the CMAS severity. * @return a string resource ID, or 0 if the CMAS severity is unknown or not present */ private static int getCmasSeverityResId(SmsCbCmasInfo cmasInfo) { switch (cmasInfo.getSeverity()) { case SmsCbCmasInfo.CMAS_SEVERITY_EXTREME: return R.string.cmas_severity_extreme; case SmsCbCmasInfo.CMAS_SEVERITY_SEVERE: return R.string.cmas_severity_severe; default: return 0; } } /** * Returns the string resource ID for the CMAS urgency. * @return a string resource ID, or 0 if the CMAS urgency is unknown or not present */ private static int getCmasUrgencyResId(SmsCbCmasInfo cmasInfo) { switch (cmasInfo.getUrgency()) { case SmsCbCmasInfo.CMAS_URGENCY_IMMEDIATE: return R.string.cmas_urgency_immediate; case SmsCbCmasInfo.CMAS_URGENCY_EXPECTED: return R.string.cmas_urgency_expected; default: return 0; } } /** * Returns the string resource ID for the CMAS certainty. * @return a string resource ID, or 0 if the CMAS certainty is unknown or not present */ private static int getCmasCertaintyResId(SmsCbCmasInfo cmasInfo) { switch (cmasInfo.getCertainty()) { case SmsCbCmasInfo.CMAS_CERTAINTY_OBSERVED: return R.string.cmas_certainty_observed; case SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY: return R.string.cmas_certainty_likely; default: return 0; } } public static int getDialogTitleResource(Context context, CellBroadcastMessage cbm) { // ETWS warning types SmsCbEtwsInfo etwsInfo = cbm.getEtwsWarningInfo(); if (etwsInfo != null) { switch (etwsInfo.getWarningType()) { case SmsCbEtwsInfo.ETWS_WARNING_TYPE_EARTHQUAKE: return R.string.etws_earthquake_warning; case SmsCbEtwsInfo.ETWS_WARNING_TYPE_TSUNAMI: return R.string.etws_tsunami_warning; case SmsCbEtwsInfo.ETWS_WARNING_TYPE_EARTHQUAKE_AND_TSUNAMI: return R.string.etws_earthquake_and_tsunami_warning; case SmsCbEtwsInfo.ETWS_WARNING_TYPE_TEST_MESSAGE: return R.string.etws_test_message; case SmsCbEtwsInfo.ETWS_WARNING_TYPE_OTHER_EMERGENCY: default: return R.string.etws_other_emergency_type; } } // CMAS warning types SmsCbCmasInfo cmasInfo = cbm.getCmasWarningInfo(); if (cmasInfo != null) { switch (cmasInfo.getMessageClass()) { case SmsCbCmasInfo.CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT: return R.string.cmas_presidential_level_alert; case SmsCbCmasInfo.CMAS_CLASS_EXTREME_THREAT: return R.string.cmas_extreme_alert; case SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT: return R.string.cmas_severe_alert; case SmsCbCmasInfo.CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY: return R.string.cmas_amber_alert; case SmsCbCmasInfo.CMAS_CLASS_REQUIRED_MONTHLY_TEST: return R.string.cmas_required_monthly_test; case SmsCbCmasInfo.CMAS_CLASS_CMAS_EXERCISE: return R.string.cmas_exercise_alert; case SmsCbCmasInfo.CMAS_CLASS_OPERATOR_DEFINED_USE: return R.string.cmas_operator_defined_alert; default: return R.string.pws_other_message_identifiers; } } if (CellBroadcastAlertService.isEmergencyMessage(context, cbm)) { ArrayList ranges = CellBroadcastChannelManager .getInstance().getCellBroadcastChannelRanges(context); if (ranges != null) { for (CellBroadcastChannelRange range : ranges) { if (cbm.getServiceCategory() >= range.mStartId && cbm.getServiceCategory() <= range.mEndId) { // Apply the closest title to the specified tones. switch (range.mAlertType) { case CMAS_DEFAULT: return R.string.pws_other_message_identifiers; case ETWS_EARTHQUAKE: return R.string.etws_earthquake_warning; case ETWS_TSUNAMI: return R.string.etws_tsunami_warning; case ETWS_TEST: return R.string.etws_test_message; case ETWS_DEFAULT: case OTHER: return R.string.etws_other_emergency_type; } } } } return R.string.pws_other_message_identifiers; } else { return R.string.cb_other_message_identifiers; } } }