summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Yu <jackyu@google.com>2015-12-10 14:24:21 -0800
committerJack Yu <jackyu@google.com>2015-12-10 14:24:21 -0800
commit12f032f5cc8be62d8370973513d00314588ac69e (patch)
treefbbaa2dcbfff293dc72541174387d7b4d4dda166
parent0ea7a56458f95be92988f0cd962b509c6a6e53a6 (diff)
downloadbase-12f032f5cc8be62d8370973513d00314588ac69e.tar.gz
Merge from master
Change-Id: Ifbd86600111d2c444031ff608fab62fb2ee4b236
-rw-r--r--src/java/android/provider/Telephony.java48
-rw-r--r--src/java/android/telephony/SmsCbEtwsInfo.java16
-rw-r--r--src/java/com/android/internal/telephony/SmsApplication.java155
-rw-r--r--src/java/com/android/internal/telephony/cdma/SmsMessage.java4
-rw-r--r--src/java/com/android/internal/telephony/gsm/GsmSmsCbMessage.java7
-rw-r--r--src/java/com/android/internal/telephony/gsm/SmsCbConstants.java186
-rw-r--r--src/java/com/android/internal/telephony/gsm/SmsCbHeader.java42
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