blob: 05cb77240e2e5e630e6f2bf3dd839892e1e68744 [file] [log] [blame]
/*
* 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<CellBroadcastChannelRange> 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;
}
}
}