diff options
author | Jack Yu <jackyu@google.com> | 2015-12-10 14:24:21 -0800 |
---|---|---|
committer | Jack Yu <jackyu@google.com> | 2015-12-10 14:24:21 -0800 |
commit | 12f032f5cc8be62d8370973513d00314588ac69e (patch) | |
tree | fbbaa2dcbfff293dc72541174387d7b4d4dda166 | |
parent | 0ea7a56458f95be92988f0cd962b509c6a6e53a6 (diff) | |
download | base-12f032f5cc8be62d8370973513d00314588ac69e.tar.gz |
Merge from master
Change-Id: Ifbd86600111d2c444031ff608fab62fb2ee4b236
7 files changed, 391 insertions, 67 deletions
diff --git a/src/java/android/provider/Telephony.java b/src/java/android/provider/Telephony.java index d2b20bc5a559..00b6279ac240 100644 --- a/src/java/android/provider/Telephony.java +++ b/src/java/android/provider/Telephony.java @@ -1071,6 +1071,39 @@ public final class Telephony { "android.provider.Telephony.MMS_DOWNLOADED"; /** + * Broadcast action: When the default SMS package changes, + * the previous default SMS package and the new default SMS + * package are sent this broadcast to notify them of the change. + * A boolean is specified in {@link #EXTRA_IS_DEFAULT_SMS_APP} to + * indicate whether the package is the new default SMS package. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_DEFAULT_SMS_PACKAGE_CHANGED = + "android.provider.action.DEFAULT_SMS_PACKAGE_CHANGED"; + + /** + * The IsDefaultSmsApp boolean passed as an + * extra for {@link #ACTION_DEFAULT_SMS_PACKAGE_CHANGED} to indicate whether the + * SMS app is becoming the default SMS app or is no longer the default. + * + * @see #ACTION_DEFAULT_SMS_PACKAGE_CHANGED + */ + public static final String EXTRA_IS_DEFAULT_SMS_APP = + "android.provider.extra.IS_DEFAULT_SMS_APP"; + + /** + * Broadcast action: When a change is made to the SmsProvider or + * MmsProvider by a process other than the default SMS application, + * this intent is broadcast to the default SMS application so it can + * re-sync or update the change. The uri that was used to call the provider + * can be retrieved from the intent with getData(). The actual affected uris + * (which would depend on the selection specified) are not included. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_EXTERNAL_PROVIDER_CHANGE = + "android.provider.action.EXTERNAL_PROVIDER_CHANGE"; + + /** * Read the PDUs out of an {@link #SMS_RECEIVED_ACTION} or a * {@link #DATA_SMS_RECEIVED_ACTION} intent. * @@ -1078,7 +1111,20 @@ public final class Telephony { * @return an array of SmsMessages for the PDUs */ public static SmsMessage[] getMessagesFromIntent(Intent intent) { - Object[] messages = (Object[]) intent.getSerializableExtra("pdus"); + Object[] messages; + try { + messages = (Object[]) intent.getSerializableExtra("pdus"); + } + catch (ClassCastException e) { + Rlog.e(TAG, "getMessagesFromIntent: " + e); + return null; + } + + if (messages == null) { + Rlog.e(TAG, "pdus does not exist in the intent"); + return null; + } + String format = intent.getStringExtra("format"); int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, SubscriptionManager.getDefaultSmsSubId()); diff --git a/src/java/android/telephony/SmsCbEtwsInfo.java b/src/java/android/telephony/SmsCbEtwsInfo.java index 286efd601803..14e02de276fd 100644 --- a/src/java/android/telephony/SmsCbEtwsInfo.java +++ b/src/java/android/telephony/SmsCbEtwsInfo.java @@ -59,6 +59,9 @@ public class SmsCbEtwsInfo implements Parcelable { /** Whether or not to activate a popup alert. */ private final boolean mActivatePopup; + /** Whether ETWS primary message or not/ */ + private final boolean mPrimary; + /** * 50-byte security information (ETWS primary notification for GSM only). As of Release 10, * 3GPP TS 23.041 states that the UE shall ignore the ETWS primary notification timestamp @@ -70,10 +73,11 @@ public class SmsCbEtwsInfo implements Parcelable { /** Create a new SmsCbEtwsInfo object with the specified values. */ public SmsCbEtwsInfo(int warningType, boolean emergencyUserAlert, boolean activatePopup, - byte[] warningSecurityInformation) { + boolean primary, byte[] warningSecurityInformation) { mWarningType = warningType; mEmergencyUserAlert = emergencyUserAlert; mActivatePopup = activatePopup; + mPrimary = primary; mWarningSecurityInformation = warningSecurityInformation; } @@ -82,6 +86,7 @@ public class SmsCbEtwsInfo implements Parcelable { mWarningType = in.readInt(); mEmergencyUserAlert = (in.readInt() != 0); mActivatePopup = (in.readInt() != 0); + mPrimary = (in.readInt() != 0); mWarningSecurityInformation = in.createByteArray(); } @@ -96,6 +101,7 @@ public class SmsCbEtwsInfo implements Parcelable { dest.writeInt(mWarningType); dest.writeInt(mEmergencyUserAlert ? 1 : 0); dest.writeInt(mActivatePopup ? 1 : 0); + dest.writeInt(mPrimary ? 1 : 0); dest.writeByteArray(mWarningSecurityInformation); } @@ -124,6 +130,14 @@ public class SmsCbEtwsInfo implements Parcelable { } /** + * Returns the ETWS format flag. + * @return true if the message is primary message, otherwise secondary message + */ + public boolean isPrimary() { + return mPrimary; + } + + /** * Returns the Warning-Security-Information timestamp (GSM primary notifications only). * As of Release 10, 3GPP TS 23.041 states that the UE shall ignore this value if received. * @return a UTC timestamp in System.currentTimeMillis() format, or 0 if not present diff --git a/src/java/com/android/internal/telephony/SmsApplication.java b/src/java/com/android/internal/telephony/SmsApplication.java index 5a95394241fd..6e6e80900b92 100644 --- a/src/java/com/android/internal/telephony/SmsApplication.java +++ b/src/java/com/android/internal/telephony/SmsApplication.java @@ -34,6 +34,7 @@ import android.os.Binder; import android.os.Debug; import android.os.UserHandle; import android.provider.Settings; +import android.provider.Telephony; import android.provider.Telephony.Sms.Intents; import android.telephony.Rlog; import android.telephony.SmsManager; @@ -41,6 +42,7 @@ import android.telephony.TelephonyManager; import android.util.Log; import com.android.internal.content.PackageMonitor; +import com.android.internal.logging.MetricsLogger; import java.util.Collection; import java.util.HashMap; @@ -98,6 +100,16 @@ public final class SmsApplication { public String mSendToClass; /** + * The class name of the ACTION_DEFAULT_SMS_PACKAGE_CHANGED receiver in this app. + */ + public String mSmsAppChangedReceiverClass; + + /** + * The class name of the ACTION_EXTERNAL_PROVIDER_CHANGE receiver in this app. + */ + public String mProviderChangedReceiverClass; + + /** * The user-id for this application */ public int mUid; @@ -116,6 +128,19 @@ public final class SmsApplication { mPackageName = packageName; mUid = uid; } + + @Override + public String toString() { + return "mApplicationName: " + mApplicationName + + " mPackageName: " + mPackageName + + " mSmsReceiverClass: " + mSmsReceiverClass + + " mMmsReceiverClass: " + mMmsReceiverClass + + " mRespondViaMessageClass: " + mRespondViaMessageClass + + " mSendToClass: " + mSendToClass + + " mSmsAppChangedClass: " + mSmsAppChangedReceiverClass + + " mProviderChangedReceiverClass: " + mProviderChangedReceiverClass + + " mUid: " + mUid; + } } /** @@ -255,6 +280,56 @@ public final class SmsApplication { } } + // Update any existing entries with the default sms changed handler. + intent = new Intent(Telephony.Sms.Intents.ACTION_DEFAULT_SMS_PACKAGE_CHANGED); + List<ResolveInfo> smsAppChangedReceivers = packageManager.queryBroadcastReceivers(intent, + 0, userId); + if (DEBUG_MULTIUSER) { + Log.i(LOG_TAG, "getApplicationCollectionInternal smsAppChangedActivities=" + + smsAppChangedReceivers); + } + for (ResolveInfo resolveInfo : smsAppChangedReceivers) { + final ActivityInfo activityInfo = resolveInfo.activityInfo; + if (activityInfo == null) { + continue; + } + final String packageName = activityInfo.packageName; + final SmsApplicationData smsApplicationData = receivers.get(packageName); + if (DEBUG_MULTIUSER) { + Log.i(LOG_TAG, "getApplicationCollectionInternal packageName=" + + packageName + " smsApplicationData: " + smsApplicationData + + " activityInfo.name: " + activityInfo.name); + } + if (smsApplicationData != null) { + smsApplicationData.mSmsAppChangedReceiverClass = activityInfo.name; + } + } + + // Update any existing entries with the external provider changed handler. + intent = new Intent(Telephony.Sms.Intents.ACTION_EXTERNAL_PROVIDER_CHANGE); + List<ResolveInfo> providerChangedReceivers = packageManager.queryBroadcastReceivers(intent, + 0, userId); + if (DEBUG_MULTIUSER) { + Log.i(LOG_TAG, "getApplicationCollectionInternal providerChangedActivities=" + + providerChangedReceivers); + } + for (ResolveInfo resolveInfo : providerChangedReceivers) { + final ActivityInfo activityInfo = resolveInfo.activityInfo; + if (activityInfo == null) { + continue; + } + final String packageName = activityInfo.packageName; + final SmsApplicationData smsApplicationData = receivers.get(packageName); + if (DEBUG_MULTIUSER) { + Log.i(LOG_TAG, "getApplicationCollectionInternal packageName=" + + packageName + " smsApplicationData: " + smsApplicationData + + " activityInfo.name: " + activityInfo.name); + } + if (smsApplicationData != null) { + smsApplicationData.mProviderChangedReceiverClass = activityInfo.name; + } + } + // Remove any entries for which we did not find all required intents. for (ResolveInfo resolveInfo : smsReceivers) { final ActivityInfo activityInfo = resolveInfo.activityInfo; @@ -427,6 +502,11 @@ public final class SmsApplication { String oldPackageName = Settings.Secure.getStringForUser(context.getContentResolver(), Settings.Secure.SMS_DEFAULT_APPLICATION, userId); + if (DEBUG_MULTIUSER) { + Log.i(LOG_TAG, "setDefaultApplicationInternal old=" + oldPackageName + + " new=" + packageName); + } + if (packageName != null && oldPackageName != null && packageName.equals(oldPackageName)) { // No change return; @@ -435,6 +515,8 @@ public final class SmsApplication { // We only make the change if the new package is valid PackageManager packageManager = context.getPackageManager(); Collection<SmsApplicationData> applications = getApplicationCollection(context); + SmsApplicationData oldAppData = oldPackageName != null ? + getApplicationForPackage(applications, oldPackageName) : null; SmsApplicationData applicationData = getApplicationForPackage(applications, packageName); if (applicationData != null) { // Ignore OP_WRITE_SMS for the previously configured default SMS app. @@ -472,6 +554,43 @@ public final class SmsApplication { MMS_SERVICE_PACKAGE_NAME); assignWriteSmsPermissionToSystemApp(context, packageManager, appOps, TELEPHONY_PROVIDER_PACKAGE_NAME); + + if (DEBUG_MULTIUSER) { + Log.i(LOG_TAG, "setDefaultApplicationInternal oldAppData=" + oldAppData); + } + if (oldAppData != null && oldAppData.mSmsAppChangedReceiverClass != null) { + // Notify the old sms app that it's no longer the default + final Intent oldAppIntent = + new Intent(Telephony.Sms.Intents.ACTION_DEFAULT_SMS_PACKAGE_CHANGED); + final ComponentName component = new ComponentName(oldAppData.mPackageName, + oldAppData.mSmsAppChangedReceiverClass); + oldAppIntent.setComponent(component); + oldAppIntent.putExtra(Telephony.Sms.Intents.EXTRA_IS_DEFAULT_SMS_APP, false); + if (DEBUG_MULTIUSER) { + Log.i(LOG_TAG, "setDefaultApplicationInternal old=" + oldAppData.mPackageName); + } + context.sendBroadcast(oldAppIntent); + } + // Notify the new sms app that it's now the default (if the new sms app has a receiver + // to handle the changed default sms intent). + if (DEBUG_MULTIUSER) { + Log.i(LOG_TAG, "setDefaultApplicationInternal new applicationData=" + + applicationData); + } + if (applicationData.mSmsAppChangedReceiverClass != null) { + final Intent intent = + new Intent(Telephony.Sms.Intents.ACTION_DEFAULT_SMS_PACKAGE_CHANGED); + final ComponentName component = new ComponentName(applicationData.mPackageName, + applicationData.mSmsAppChangedReceiverClass); + intent.setComponent(component); + intent.putExtra(Telephony.Sms.Intents.EXTRA_IS_DEFAULT_SMS_APP, true); + if (DEBUG_MULTIUSER) { + Log.i(LOG_TAG, "setDefaultApplicationInternal new=" + packageName); + } + context.sendBroadcast(intent); + } + MetricsLogger.action(context, MetricsLogger.ACTION_DEFAULT_SMS_APP_CHANGED, + applicationData.mPackageName); } } @@ -523,24 +642,24 @@ public final class SmsApplication { @Override public void onPackageDisappeared(String packageName, int reason) { - onPackageChanged(packageName); + onPackageChanged(); } @Override public void onPackageAppeared(String packageName, int reason) { - onPackageChanged(packageName); + onPackageChanged(); } @Override public void onPackageModified(String packageName) { - onPackageChanged(packageName); + onPackageChanged(); } - private void onPackageChanged(String packageName) { + private void onPackageChanged() { PackageManager packageManager = mContext.getPackageManager(); Context userContext = mContext; final int userId = getSendingUserId(); - if (userId != UserHandle.USER_OWNER) { + if (userId != UserHandle.USER_SYSTEM) { try { userContext = mContext.createPackageContextAsUser(mContext.getPackageName(), 0, new UserHandle(userId)); @@ -707,6 +826,32 @@ public final class SmsApplication { } /** + * Gets the default application that handles external changes to the SmsProvider and + * MmsProvider. + * @param context context from the calling app + * @param updateIfNeeded update the default app if there is no valid default app configured. + * @return component name of the app and class to deliver change intents to + */ + public static ComponentName getDefaultExternalTelephonyProviderChangedApplication( + Context context, boolean updateIfNeeded) { + int userId = getIncomingUserId(context); + final long token = Binder.clearCallingIdentity(); + try { + ComponentName component = null; + SmsApplicationData smsApplicationData = getApplication(context, updateIfNeeded, + userId); + if (smsApplicationData != null + && smsApplicationData.mProviderChangedReceiverClass != null) { + component = new ComponentName(smsApplicationData.mPackageName, + smsApplicationData.mProviderChangedReceiverClass); + } + return component; + } finally { + Binder.restoreCallingIdentity(token); + } + } + + /** * Returns whether need to write the SMS message to SMS database for this package. * <p> * Caller must pass in the correct user context if calling from a singleton service. diff --git a/src/java/com/android/internal/telephony/cdma/SmsMessage.java b/src/java/com/android/internal/telephony/cdma/SmsMessage.java index a137dacc1aeb..66b4044738e4 100644 --- a/src/java/com/android/internal/telephony/cdma/SmsMessage.java +++ b/src/java/com/android/internal/telephony/cdma/SmsMessage.java @@ -713,7 +713,7 @@ public class SmsMessage extends SmsMessageBase { /** * Parses a SMS message from its BearerData stream. (mobile-terminated only) */ - protected void parseSms() { + public void parseSms() { // Message Waiting Info Record defined in 3GPP2 C.S-0005, 3.7.5.6 // It contains only an 8-bit number with the number of messages waiting if (mEnvelope.teleService == SmsEnvelope.TELESERVICE_MWI) { @@ -790,7 +790,7 @@ public class SmsMessage extends SmsMessageBase { /** * Parses a broadcast SMS, possibly containing a CMAS alert. */ - SmsCbMessage parseBroadcastSms() { + public SmsCbMessage parseBroadcastSms() { BearerData bData = BearerData.decode(mEnvelope.bearerData, mEnvelope.serviceCategory); if (bData == null) { Rlog.w(LOG_TAG, "BearerData.decode() returned null"); diff --git a/src/java/com/android/internal/telephony/gsm/GsmSmsCbMessage.java b/src/java/com/android/internal/telephony/gsm/GsmSmsCbMessage.java index 78590fb02c1b..15ed81098813 100644 --- a/src/java/com/android/internal/telephony/gsm/GsmSmsCbMessage.java +++ b/src/java/com/android/internal/telephony/gsm/GsmSmsCbMessage.java @@ -59,9 +59,14 @@ public class GsmSmsCbMessage { * * @param pdus PDU bytes */ - static SmsCbMessage createSmsCbMessage(SmsCbHeader header, SmsCbLocation location, + public static SmsCbMessage createSmsCbMessage(SmsCbHeader header, SmsCbLocation location, byte[][] pdus) throws IllegalArgumentException { if (header.isEtwsPrimaryNotification()) { + // ETSI TS 23.041 ETWS Primary Notification message + // ETWS primary message only contains 4 fields including serial number, + // message identifier, warning type, and warning security information. + // There is no field for the content/text. We hardcode "ETWS" in the + // text body so the user won't see an empty dialog without any text. return new SmsCbMessage(SmsCbMessage.MESSAGE_FORMAT_3GPP, header.getGeographicalScope(), header.getSerialNumber(), location, header.getServiceCategory(), diff --git a/src/java/com/android/internal/telephony/gsm/SmsCbConstants.java b/src/java/com/android/internal/telephony/gsm/SmsCbConstants.java index 017b8854c08e..bce5680b2863 100644 --- a/src/java/com/android/internal/telephony/gsm/SmsCbConstants.java +++ b/src/java/com/android/internal/telephony/gsm/SmsCbConstants.java @@ -30,108 +30,188 @@ public class SmsCbConstants { /** Private constructor for utility class. */ private SmsCbConstants() { } + /** Channel 50 required by Brazil. ID 0~999 is allocated by GSMA */ + public static final int MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_50 + = 0x0032; + + /** Channel 911 required by Taiwan NCC. ID 0~999 is allocated by GSMA */ + public static final int MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_911 + = 0x038F; // 911 + + /** Channel 919 required by Taiwan NCC and Israel. ID 0~999 is allocated by GSMA */ + public static final int MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_919 + = 0x0397; // 919 + + /** Channel 928 required by Israel. ID 0~999 is allocated by GSMA */ + public static final int MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_928 + = 0x03A0; // 928 + /** Start of PWS Message Identifier range (includes ETWS and CMAS). */ - public static final int MESSAGE_ID_PWS_FIRST_IDENTIFIER = 0x1100; + public static final int MESSAGE_ID_PWS_FIRST_IDENTIFIER + = 0x1100; // 4352 /** Bitmask for messages of ETWS type (including future extensions). */ - public static final int MESSAGE_ID_ETWS_TYPE_MASK = 0xFFF8; + public static final int MESSAGE_ID_ETWS_TYPE_MASK + = 0xFFF8; /** Value for messages of ETWS type after applying {@link #MESSAGE_ID_ETWS_TYPE_MASK}. */ - public static final int MESSAGE_ID_ETWS_TYPE = 0x1100; + public static final int MESSAGE_ID_ETWS_TYPE + = 0x1100; // 4352 /** ETWS Message Identifier for earthquake warning message. */ - public static final int MESSAGE_ID_ETWS_EARTHQUAKE_WARNING = 0x1100; + public static final int MESSAGE_ID_ETWS_EARTHQUAKE_WARNING + = 0x1100; // 4352 /** ETWS Message Identifier for tsunami warning message. */ - public static final int MESSAGE_ID_ETWS_TSUNAMI_WARNING = 0x1101; + public static final int MESSAGE_ID_ETWS_TSUNAMI_WARNING + = 0x1101; // 4353 /** ETWS Message Identifier for earthquake and tsunami combined warning message. */ - public static final int MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING = 0x1102; + public static final int MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING + = 0x1102; // 4354 /** ETWS Message Identifier for test message. */ - public static final int MESSAGE_ID_ETWS_TEST_MESSAGE = 0x1103; + public static final int MESSAGE_ID_ETWS_TEST_MESSAGE + = 0x1103; // 4355 /** ETWS Message Identifier for messages related to other emergency types. */ - public static final int MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE = 0x1104; + public static final int MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE + = 0x1104; // 4356 /** Start of CMAS Message Identifier range. */ - public static final int MESSAGE_ID_CMAS_FIRST_IDENTIFIER = 0x1112; + public static final int MESSAGE_ID_CMAS_FIRST_IDENTIFIER + = 0x1112; // 4370 /** CMAS Message Identifier for Presidential Level alerts. */ - public static final int MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL = 0x1112; + public static final int MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL + = 0x1112; // 4370 /** CMAS Message Identifier for Extreme alerts, Urgency=Immediate, Certainty=Observed. */ - public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED = 0x1113; + public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED + = 0x1113; // 4371 /** CMAS Message Identifier for Extreme alerts, Urgency=Immediate, Certainty=Likely. */ - public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY = 0x1114; + public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY + = 0x1114; // 4372 /** CMAS Message Identifier for Extreme alerts, Urgency=Expected, Certainty=Observed. */ - public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED = 0x1115; + public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED + = 0x1115; // 4373 /** CMAS Message Identifier for Extreme alerts, Urgency=Expected, Certainty=Likely. */ - public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY = 0x1116; + public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY + = 0x1116; // 4374 /** CMAS Message Identifier for Severe alerts, Urgency=Immediate, Certainty=Observed. */ - public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED = 0x1117; + public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED + = 0x1117; // 4375 /** CMAS Message Identifier for Severe alerts, Urgency=Immediate, Certainty=Likely. */ - public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY = 0x1118; + public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY + = 0x1118; // 4376 /** CMAS Message Identifier for Severe alerts, Urgency=Expected, Certainty=Observed. */ - public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED = 0x1119; + public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED + = 0x1119; // 4377 /** CMAS Message Identifier for Severe alerts, Urgency=Expected, Certainty=Likely. */ - public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY = 0x111A; + public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY + = 0x111A; // 4378 /** CMAS Message Identifier for Child Abduction Emergency (Amber Alert). */ - public static final int MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY = 0x111B; + public static final int MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY + = 0x111B; // 4379 /** CMAS Message Identifier for the Required Monthly Test. */ - public static final int MESSAGE_ID_CMAS_ALERT_REQUIRED_MONTHLY_TEST = 0x111C; + public static final int MESSAGE_ID_CMAS_ALERT_REQUIRED_MONTHLY_TEST + = 0x111C; // 4380 /** CMAS Message Identifier for CMAS Exercise. */ - public static final int MESSAGE_ID_CMAS_ALERT_EXERCISE = 0x111D; + public static final int MESSAGE_ID_CMAS_ALERT_EXERCISE + = 0x111D; // 4381 /** CMAS Message Identifier for operator defined use. */ - public static final int MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE = 0x111E; - - /** CMAS Message Identifier for Presidential Level alerts for additional languages. */ - public static final int MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL_LANGUAGE = 0x111F; - - /** CMAS Message Identifier for the Required Monthly Test for additional languages. */ - public static final int MESSAGE_ID_CMAS_ALERT_REQUIRED_MONTHLY_TEST_LANGUAGE = 0x1129; - - /** CMAS Message Identifier for CMAS Exercise for additional languages. */ - public static final int MESSAGE_ID_CMAS_ALERT_EXERCISE_LANGUAGE = 0x112A; - - /** CMAS Message Identifier for operator defined use for additional languages. */ - public static final int MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE_LANGUAGE = 0x112B; + public static final int MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE + = 0x111E; // 4382 + + /** CMAS Message Identifier for Presidential Level alerts for additional languages + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL_LANGUAGE + = 0x111F; // 4383 + + /** CMAS Message Identifier for Extreme alerts, Urgency=Immediate, Certainty=Observed + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED_LANGUAGE + = 0x1120; // 4384 + + /** CMAS Message Identifier for Extreme alerts, Urgency=Immediate, Certainty=Likely + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY_LANGUAGE + = 0x1121; // 4385 + + /** CMAS Message Identifier for Extreme alerts, Urgency=Expected, Certainty=Observed + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED_LANGUAGE + = 0x1122; // 4386 + + /** CMAS Message Identifier for Extreme alerts, Urgency=Expected, Certainty=Likely + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY_LANGUAGE + = 0x1123; // 4387 + + /** CMAS Message Identifier for Severe alerts, Urgency=Immediate, Certainty=Observed + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED_LANGUAGE + = 0x1124; // 4388 + + /** CMAS Message Identifier for Severe alerts, Urgency=Immediate, Certainty=Likely + * for additional languages.*/ + public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY_LANGUAGE + = 0x1125; // 4389 + + /** CMAS Message Identifier for Severe alerts, Urgency=Expected, Certainty=Observed + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED_LANGUAGE + = 0x1126; // 4390 + + /** CMAS Message Identifier for Severe alerts, Urgency=Expected, Certainty=Likely + * for additional languages.*/ + public static final int MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY_LANGUAGE + = 0x1127; // 4391 + + /** CMAS Message Identifier for Child Abduction Emergency (Amber Alert) + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY_LANGUAGE + = 0x1128; // 4392 + + /** CMAS Message Identifier for the Required Monthly Test + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_REQUIRED_MONTHLY_TEST_LANGUAGE + = 0x1129; // 4393 + + /** CMAS Message Identifier for CMAS Exercise + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_EXERCISE_LANGUAGE + = 0x112A; // 4394 + + /** CMAS Message Identifier for operator defined use + * for additional languages. */ + public static final int MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE_LANGUAGE + = 0x112B; // 4395 /** End of CMAS Message Identifier range (including future extensions). */ - public static final int MESSAGE_ID_CMAS_LAST_IDENTIFIER = 0x112F; + public static final int MESSAGE_ID_CMAS_LAST_IDENTIFIER + = 0x112F; // 4399 /** End of PWS Message Identifier range (includes ETWS, CMAS, and future extensions). */ - public static final int MESSAGE_ID_PWS_LAST_IDENTIFIER = 0x18FF; + public static final int MESSAGE_ID_PWS_LAST_IDENTIFIER + = 0x18FF; // 6399 /** ETWS serial number flag to activate the popup display. */ - public static final int SERIAL_NUMBER_ETWS_ACTIVATE_POPUP = 0x1000; + public static final int SERIAL_NUMBER_ETWS_ACTIVATE_POPUP + = 0x1000; // 4096 /** ETWS serial number flag to activate the emergency user alert. */ - public static final int SERIAL_NUMBER_ETWS_EMERGENCY_USER_ALERT = 0x2000; - - /** ETWS warning type value for earthquake. */ - public static final int ETWS_WARNING_TYPE_EARTHQUAKE = 0x00; - - /** ETWS warning type value for tsunami. */ - public static final int ETWS_WARNING_TYPE_TSUNAMI = 0x01; - - /** ETWS warning type value for earthquake and tsunami. */ - public static final int ETWS_WARNING_TYPE_EARTHQUAKE_AND_TSUNAMI = 0x02; - - /** ETWS warning type value for test broadcast. */ - public static final int ETWS_WARNING_TYPE_TEST = 0x03; - - /** ETWS warning type value for other notifications. */ - public static final int ETWS_WARNING_TYPE_OTHER = 0x04; + public static final int SERIAL_NUMBER_ETWS_EMERGENCY_USER_ALERT + = 0x2000; // 8192 } diff --git a/src/java/com/android/internal/telephony/gsm/SmsCbHeader.java b/src/java/com/android/internal/telephony/gsm/SmsCbHeader.java index 48cc76867faf..d267ad204f57 100644 --- a/src/java/com/android/internal/telephony/gsm/SmsCbHeader.java +++ b/src/java/com/android/internal/telephony/gsm/SmsCbHeader.java @@ -31,7 +31,7 @@ import java.util.Arrays; * {@link android.provider.Telephony.Sms.Intents#SMS_EMERGENCY_CB_RECEIVED_ACTION} intent. * The raw PDU is no longer sent to SMS CB applications. */ -class SmsCbHeader { +public class SmsCbHeader { /** * Length of SMS-CB header @@ -119,7 +119,7 @@ class SmsCbHeader { warningSecurityInfo = null; } mEtwsInfo = new SmsCbEtwsInfo(warningType, emergencyUserAlert, activatePopup, - warningSecurityInfo); + true, warningSecurityInfo); mCmasInfo = null; return; // skip the ETWS/CMAS initialization code for regular notifications } else { @@ -166,7 +166,8 @@ class SmsCbHeader { boolean emergencyUserAlert = isEtwsEmergencyUserAlert(); boolean activatePopup = isEtwsPopupAlert(); int warningType = getEtwsWarningType(); - mEtwsInfo = new SmsCbEtwsInfo(warningType, emergencyUserAlert, activatePopup, null); + mEtwsInfo = new SmsCbEtwsInfo(warningType, emergencyUserAlert, activatePopup, + false, null); mCmasInfo = null; } else if (isCmasMessage()) { int messageClass = getCmasMessageClass(); @@ -299,18 +300,27 @@ class SmsCbHeader { return SmsCbCmasInfo.CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT; case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY_LANGUAGE: return SmsCbCmasInfo.CMAS_CLASS_EXTREME_THREAT; case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY_LANGUAGE: return SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT; case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY_LANGUAGE: return SmsCbCmasInfo.CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY; case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_REQUIRED_MONTHLY_TEST: @@ -339,15 +349,23 @@ class SmsCbHeader { private int getCmasSeverity() { switch (mMessageIdentifier) { case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY_LANGUAGE: return SmsCbCmasInfo.CMAS_SEVERITY_EXTREME; case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY_LANGUAGE: return SmsCbCmasInfo.CMAS_SEVERITY_SEVERE; default: @@ -364,15 +382,23 @@ class SmsCbHeader { private int getCmasUrgency() { switch (mMessageIdentifier) { case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY_LANGUAGE: return SmsCbCmasInfo.CMAS_URGENCY_IMMEDIATE; case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY_LANGUAGE: return SmsCbCmasInfo.CMAS_URGENCY_EXPECTED; default: @@ -389,15 +415,23 @@ class SmsCbHeader { private int getCmasCertainty() { switch (mMessageIdentifier) { case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED_LANGUAGE: return SmsCbCmasInfo.CMAS_CERTAINTY_OBSERVED; case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY_LANGUAGE: case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY: + case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY_LANGUAGE: return SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY; default: @@ -413,4 +447,4 @@ class SmsCbHeader { ", DCS=0x" + Integer.toHexString(mDataCodingScheme) + ", page " + mPageIndex + " of " + mNrOfPages + '}'; } -} +}
\ No newline at end of file |