diff options
Diffstat (limited to 'src/com/android/cellbroadcastreceiver')
5 files changed, 119 insertions, 73 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertDialog.java b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertDialog.java index 892b7f6a6..eef1825b9 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertDialog.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertDialog.java @@ -86,7 +86,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; -import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; /** @@ -839,29 +838,6 @@ public class CellBroadcastAlertDialog extends Activity { } /** - * If the carrier or country is configured to show the alert dialog title text in the - * language matching the message, this method returns the string in that language. Otherwise - * this method returns the string in the device's current language - * - * @param resId resource Id - * @param res Resources for the subId - * @param languageCode the ISO-639-1 language code for this message, or null if unspecified - */ - private String overrideTranslation(int resId, Resources res, String languageCode) { - if (!TextUtils.isEmpty(languageCode) - && res.getBoolean(R.bool.override_alert_title_language_to_match_message_locale)) { - // TODO change resources to locale from message - Configuration conf = res.getConfiguration(); - conf = new Configuration(conf); - conf.setLocale(new Locale(languageCode)); - Context localizedContext = getApplicationContext().createConfigurationContext(conf); - return localizedContext.getResources().getText(resId).toString(); - } else { - return res.getText(resId).toString(); - } - } - - /** * Update alert text when a new emergency alert arrives. * @param message CB message which is used to update alert text. */ @@ -888,7 +864,8 @@ public class CellBroadcastAlertDialog extends Activity { } if (res.getBoolean(R.bool.show_alert_title)) { - String title = overrideTranslation(titleId, res, languageCode); + String title = CellBroadcastResources.overrideTranslation(context, titleId, res, + languageCode); TextView titleTextView = findViewById(R.id.alertTitle); if (titleTextView != null) { diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java index 0f9a5ed16..2ac1402bf 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java @@ -71,6 +71,7 @@ import android.view.Display; import com.android.cellbroadcastreceiver.CellBroadcastChannelManager.CellBroadcastChannelRange; import com.android.internal.annotations.VisibleForTesting; +import com.android.modules.utils.build.SdkLevel; import java.util.ArrayList; import java.util.List; @@ -523,7 +524,8 @@ public class CellBroadcastAlertService extends Service { // Check if all emergency alerts are disabled. boolean emergencyAlertEnabled = checkAlertConfigEnabled( - subId, CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE, true); + subId, CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE, + res.getBoolean(R.bool.master_toggle_enabled_default)); int channel = message.getServiceCategory(); int resourcesKey = channelManager.getCellBroadcastChannelResourcesKey(channel); CellBroadcastChannelRange range = channelManager.getCellBroadcastChannelRange(channel); @@ -534,8 +536,8 @@ public class CellBroadcastAlertService extends Service { || resourcesKey == R.array.etws_test_alerts_range_strings) { return emergencyAlertEnabled && CellBroadcastSettings.isTestAlertsToggleVisible(getApplicationContext()) - && checkAlertConfigEnabled(subId, - CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, false); + && checkAlertConfigEnabled(subId, CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, + res.getBoolean(R.bool.test_alerts_enabled_default)); } if (message.isEtwsMessage() || resourcesKey == R.array.etws_alerts_range_strings) { @@ -559,11 +561,13 @@ public class CellBroadcastAlertService extends Service { return emergencyAlertEnabled && CellBroadcastSettings.isTestAlertsToggleVisible(getApplicationContext()) && checkAlertConfigEnabled(subId, - CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, false); + CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, + res.getBoolean(R.bool.test_alerts_enabled_default)); } if (range.mAlertType == AlertType.AREA) { return emergencyAlertEnabled && checkAlertConfigEnabled(subId, - CellBroadcastSettings.KEY_ENABLE_AREA_UPDATE_INFO_ALERTS, false); + CellBroadcastSettings.KEY_ENABLE_AREA_UPDATE_INFO_ALERTS, + res.getBoolean(R.bool.area_update_info_alerts_enabled_default)); } return emergencyAlertEnabled; @@ -571,7 +575,8 @@ public class CellBroadcastAlertService extends Service { if (resourcesKey == R.array.emergency_alerts_channels_range_strings) { return emergencyAlertEnabled && checkAlertConfigEnabled( - subId, CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, true); + subId, CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, + res.getBoolean(R.bool.emergency_alerts_enabled_default)); } // CMAS warning types if (resourcesKey == R.array.cmas_presidential_alerts_channels_range_strings) { @@ -580,27 +585,32 @@ public class CellBroadcastAlertService extends Service { } if (resourcesKey == R.array.cmas_alert_extreme_channels_range_strings) { return emergencyAlertEnabled && checkAlertConfigEnabled( - subId, CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, true); + subId, CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, + res.getBoolean(R.bool.extreme_threat_alerts_enabled_default)); } if (resourcesKey == R.array.cmas_alerts_severe_range_strings) { return emergencyAlertEnabled && checkAlertConfigEnabled( - subId, CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, true); + subId, CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, + res.getBoolean(R.bool.severe_threat_alerts_enabled_default)); } if (resourcesKey == R.array.cmas_amber_alerts_channels_range_strings) { return emergencyAlertEnabled && checkAlertConfigEnabled( - subId, CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, true); + subId, CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, + res.getBoolean(R.bool.amber_alerts_enabled_default)); } if (resourcesKey == R.array.exercise_alert_range_strings && res.getBoolean(R.bool.show_separate_exercise_settings)) { return emergencyAlertEnabled && checkAlertConfigEnabled( - subId, CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS, false); + subId, CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS, + res.getBoolean(R.bool.test_exercise_alerts_enabled_default)); } if (resourcesKey == R.array.operator_defined_alert_range_strings && res.getBoolean(R.bool.show_separate_operator_defined_settings)) { return emergencyAlertEnabled && checkAlertConfigEnabled( - subId, CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS, false); + subId, CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS, + res.getBoolean(R.bool.test_operator_defined_alerts_enabled_default)); } if (resourcesKey == R.array.required_monthly_test_range_strings @@ -609,17 +619,20 @@ public class CellBroadcastAlertService extends Service { return emergencyAlertEnabled && CellBroadcastSettings.isTestAlertsToggleVisible(getApplicationContext()) && checkAlertConfigEnabled( - subId, CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, false); + subId, CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, + res.getBoolean(R.bool.test_alerts_enabled_default)); } if (resourcesKey == R.array.public_safety_messages_channels_range_strings) { return emergencyAlertEnabled && checkAlertConfigEnabled( - subId, CellBroadcastSettings.KEY_ENABLE_PUBLIC_SAFETY_MESSAGES, true); + subId, CellBroadcastSettings.KEY_ENABLE_PUBLIC_SAFETY_MESSAGES, + res.getBoolean(R.bool.public_safety_messages_enabled_default)); } if (resourcesKey == R.array.state_local_test_alert_range_strings) { return emergencyAlertEnabled && (checkAlertConfigEnabled( - subId, CellBroadcastSettings.KEY_ENABLE_STATE_LOCAL_TEST_ALERTS, false) + subId, CellBroadcastSettings.KEY_ENABLE_STATE_LOCAL_TEST_ALERTS, + res.getBoolean(R.bool.state_local_test_alerts_enabled_default)) || (!res.getBoolean(R.bool.show_state_local_test_settings) && res.getBoolean(R.bool.state_local_test_alerts_enabled_default))); } @@ -784,11 +797,14 @@ public class CellBroadcastAlertService extends Service { static void addToNotificationBar(SmsCbMessage message, ArrayList<SmsCbMessage> messageList, Context context, boolean fromSaveState, boolean shouldAlert, boolean fromDialog) { + Resources res = CellBroadcastSettings.getResourcesByOperator(context, message.getSubscriptionId(), CellBroadcastReceiver.getRoamingOperatorSupported(context)); + int channelTitleId = CellBroadcastResources.getDialogTitleResource(context, message); - CharSequence channelName = context.getText(channelTitleId); + CharSequence channelName = CellBroadcastResources.overrideTranslation(context, + channelTitleId, res, message.getLanguageCode()); String messageBody = message.getMessageBody(); final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); @@ -819,9 +835,14 @@ public class CellBroadcastAlertService extends Service { if (isWatch) { pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE); } else { + ActivityOptions options = ActivityOptions.makeBasic(); + if (SdkLevel.isAtLeastU()) { + options.setPendingIntentCreatorBackgroundActivityStartMode( + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED); + } pi = PendingIntent.getActivity(context, REQUEST_CODE_CONTENT_INTENT, intent, PendingIntent.FLAG_UPDATE_CURRENT - | PendingIntent.FLAG_IMMUTABLE); + | PendingIntent.FLAG_IMMUTABLE, options.toBundle()); } CellBroadcastChannelManager channelManager = new CellBroadcastChannelManager( context, message.getSubscriptionId()); @@ -868,9 +889,14 @@ public class CellBroadcastAlertService extends Service { // sound, vibration and alert reminder. Intent deleteIntent = new Intent(intent); deleteIntent.putExtra(CellBroadcastAlertService.DISMISS_DIALOG, true); + ActivityOptions options = ActivityOptions.makeBasic(); + if (SdkLevel.isAtLeastU()) { + options.setPendingIntentCreatorBackgroundActivityStartMode( + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED); + } builder.setDeleteIntent(PendingIntent.getActivity(context, REQUEST_CODE_DELETE_INTENT, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT - | PendingIntent.FLAG_IMMUTABLE)); + | PendingIntent.FLAG_IMMUTABLE, options.toBundle())); builder.setContentIntent(pi); // This will break vibration on FEATURE_WATCH, so use it for anything else diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java b/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java index 4419c3eab..bd8fa1a0d 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java @@ -22,6 +22,7 @@ import static com.android.cellbroadcastservice.CellBroadcastMetrics.ERRTYPE_CHAN import static com.android.cellbroadcastservice.CellBroadcastMetrics.ERRTYPE_ENABLECHANNEL; import android.Manifest; +import android.app.ActivityOptions; import android.app.IntentService; import android.app.Notification; import android.app.NotificationManager; @@ -145,11 +146,16 @@ public class CellBroadcastConfigService extends IntentService { CellBroadcastAlertService.createNotificationChannels(c); Intent settingsIntent = new Intent(c, CellBroadcastSettings.class); + ActivityOptions options = ActivityOptions.makeBasic(); + if (SdkLevel.isAtLeastU()) { + options.setPendingIntentCreatorBackgroundActivityStartMode( + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED); + } PendingIntent pi = PendingIntent.getActivity(c, CellBroadcastAlertService.SETTINGS_CHANGED_NOTIFICATION_ID, settingsIntent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT - | PendingIntent.FLAG_IMMUTABLE); + | PendingIntent.FLAG_IMMUTABLE, options.toBundle()); Notification.Builder builder = new Notification.Builder(c, CellBroadcastAlertService.NOTIFICATION_CHANNEL_SETTINGS_UPDATES) diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java b/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java index e8b55feb1..642cfd85a 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastReceiver.java @@ -233,6 +233,18 @@ public class CellBroadcastReceiver extends BroadcastReceiver { } } + + /** + * Get SystemProperties values + * + * @param key string to use get the value + * @return the matched value, but default "" for unmatched case. + */ + @VisibleForTesting + public String getSystemProperties(String key) { + return SystemProperties.get(key, "").trim(); + } + private void onServiceStateChanged(Context context, Resources res, int ss) { logd("onServiceStateChanged, ss: " + ss); // check whether to support roaming network @@ -259,8 +271,8 @@ public class CellBroadcastReceiver extends BroadcastReceiver { roamingOperator = ""; if ((tm.isNetworkRoaming() || ss != ServiceState.STATE_IN_SERVICE) && !networkOperator.equals(tm.getSimOperator())) { - String propRoamingPlmn = SystemProperties.get( - ROAMING_PLMN_SUPPORTED_PROPERTY_KEY, "").trim(); + String propRoamingPlmn = + getSystemProperties(ROAMING_PLMN_SUPPORTED_PROPERTY_KEY); String[] roamingNetworks = propRoamingPlmn.isEmpty() ? res.getStringArray( R.array.cmas_roaming_network_strings) : propRoamingPlmn.split(","); logd("roamingNetworks: " + Arrays.toString(roamingNetworks)); diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastResources.java b/src/com/android/cellbroadcastreceiver/CellBroadcastResources.java index d0aebee98..61512048b 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastResources.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastResources.java @@ -19,6 +19,7 @@ package com.android.cellbroadcastreceiver; import android.annotation.NonNull; import android.content.Context; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Typeface; import android.telephony.SmsCbCmasInfo; import android.telephony.SmsCbEtwsInfo; @@ -312,13 +313,13 @@ public class CellBroadcastResources { context, message.getSubscriptionId()); final int serviceCategory = message.getServiceCategory(); // store to different SMS threads based on channel mappings. - switch (channelManager.getCellBroadcastChannelResourcesKey(serviceCategory)) { - case R.array.cmas_presidential_alerts_channels_range_strings: - return R.string.sms_cb_sender_name_presidential; - case R.array.emergency_alerts_channels_range_strings: - return R.string.sms_cb_sender_name_emergency; - case R.array.public_safety_messages_channels_range_strings: - return R.string.sms_cb_sender_name_public_safety; + int resourcesKey = channelManager.getCellBroadcastChannelResourcesKey(serviceCategory); + if (resourcesKey == R.array.cmas_presidential_alerts_channels_range_strings) { + return R.string.sms_cb_sender_name_presidential; + } else if (resourcesKey == R.array.emergency_alerts_channels_range_strings) { + return R.string.sms_cb_sender_name_emergency; + } else if (resourcesKey == R.array.public_safety_messages_channels_range_strings) { + return R.string.sms_cb_sender_name_public_safety; } return R.string.sms_cb_sender_name_default; @@ -356,27 +357,26 @@ public class CellBroadcastResources { CellBroadcastChannelRange range = channelManager .getCellBroadcastChannelRange(serviceCategory); - switch (resourcesKey) { - case R.array.emergency_alerts_channels_range_strings: - return R.string.pws_other_message_identifiers; - case R.array.cmas_presidential_alerts_channels_range_strings: - return R.string.cmas_presidential_level_alert; - case R.array.cmas_alert_extreme_channels_range_strings: - return R.string.cmas_extreme_alert; - case R.array.cmas_alerts_severe_range_strings: - return R.string.cmas_severe_alert; - case R.array.cmas_amber_alerts_channels_range_strings: - return R.string.cmas_amber_alert; - case R.array.required_monthly_test_range_strings: - return R.string.cmas_required_monthly_test; - case R.array.exercise_alert_range_strings: - return R.string.cmas_exercise_alert; - case R.array.operator_defined_alert_range_strings: - return R.string.cmas_operator_defined_alert; - case R.array.public_safety_messages_channels_range_strings: - return R.string.public_safety_message; - case R.array.state_local_test_alert_range_strings: - return R.string.state_local_test_alert; + if (resourcesKey == R.array.emergency_alerts_channels_range_strings) { + return R.string.pws_other_message_identifiers; + } else if (resourcesKey == R.array.cmas_presidential_alerts_channels_range_strings) { + return R.string.cmas_presidential_level_alert; + } else if (resourcesKey == R.array.cmas_alert_extreme_channels_range_strings) { + return R.string.cmas_extreme_alert; + } else if (resourcesKey == R.array.cmas_alerts_severe_range_strings) { + return R.string.cmas_severe_alert; + } else if (resourcesKey == R.array.cmas_amber_alerts_channels_range_strings) { + return R.string.cmas_amber_alert; + } else if (resourcesKey == R.array.required_monthly_test_range_strings) { + return R.string.cmas_required_monthly_test; + } else if (resourcesKey == R.array.exercise_alert_range_strings) { + return R.string.cmas_exercise_alert; + } else if (resourcesKey == R.array.operator_defined_alert_range_strings) { + return R.string.cmas_operator_defined_alert; + } else if (resourcesKey == R.array.public_safety_messages_channels_range_strings) { + return R.string.public_safety_message; + } else if (resourcesKey == R.array.state_local_test_alert_range_strings) { + return R.string.state_local_test_alert; } if (channelManager.isEmergencyMessage(message)) { @@ -446,4 +446,29 @@ public class CellBroadcastResources { } return -1; } + + /** + * If the carrier or country is configured to show the alert dialog title text + * and the alert notification title in the language matching the message, this method returns + * the string in that language. + * Otherwise this method returns the string in the device's current language + * + * @param resId resource Id + * @param res Resources for the subId + * @param languageCode the ISO-639-1 language code for this message, or null if unspecified + */ + public static String overrideTranslation(Context context, int resId, Resources res, + String languageCode) { + if (!TextUtils.isEmpty(languageCode) + && res.getBoolean(R.bool.override_alert_title_language_to_match_message_locale)) { + // TODO change resources to locale from message + Configuration conf = res.getConfiguration(); + conf = new Configuration(conf); + conf.setLocale(new Locale(languageCode)); + Context localizedContext = context.createConfigurationContext(conf); + return localizedContext.getResources().getText(resId).toString(); + } else { + return res.getText(resId).toString(); + } + } } |