| /* |
| * Copyright (C) 2012 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 android.telephony; |
| |
| import android.os.Parcel; |
| import android.os.Parcelable; |
| import android.text.format.Time; |
| |
| import com.android.internal.telephony.uicc.IccUtils; |
| |
| import java.util.Arrays; |
| |
| /** |
| * Contains information elements for a GSM or UMTS ETWS warning notification. |
| * Supported values for each element are defined in 3GPP TS 23.041. |
| * |
| * {@hide} |
| */ |
| public class SmsCbEtwsInfo implements Parcelable { |
| |
| /** ETWS warning type for earthquake. */ |
| public static final int ETWS_WARNING_TYPE_EARTHQUAKE = 0x00; |
| |
| /** ETWS warning type for tsunami. */ |
| public static final int ETWS_WARNING_TYPE_TSUNAMI = 0x01; |
| |
| /** ETWS warning type for earthquake and tsunami. */ |
| public static final int ETWS_WARNING_TYPE_EARTHQUAKE_AND_TSUNAMI = 0x02; |
| |
| /** ETWS warning type for test messages. */ |
| public static final int ETWS_WARNING_TYPE_TEST_MESSAGE = 0x03; |
| |
| /** ETWS warning type for other emergency types. */ |
| public static final int ETWS_WARNING_TYPE_OTHER_EMERGENCY = 0x04; |
| |
| /** Unknown ETWS warning type. */ |
| public static final int ETWS_WARNING_TYPE_UNKNOWN = -1; |
| |
| /** One of the ETWS warning type constants defined in this class. */ |
| private final int mWarningType; |
| |
| /** Whether or not to activate the emergency user alert tone and vibration. */ |
| private final boolean mEmergencyUserAlert; |
| |
| /** Whether or not to activate a popup alert. */ |
| private final boolean mActivatePopup; |
| |
| /** |
| * 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 |
| * and digital signature if received. Therefore it is treated as a raw byte array and |
| * parceled with the broadcast intent if present, but the timestamp is only computed if an |
| * application asks for the individual components. |
| */ |
| private final byte[] mWarningSecurityInformation; |
| |
| /** Create a new SmsCbEtwsInfo object with the specified values. */ |
| public SmsCbEtwsInfo(int warningType, boolean emergencyUserAlert, boolean activatePopup, |
| byte[] warningSecurityInformation) { |
| mWarningType = warningType; |
| mEmergencyUserAlert = emergencyUserAlert; |
| mActivatePopup = activatePopup; |
| mWarningSecurityInformation = warningSecurityInformation; |
| } |
| |
| /** Create a new SmsCbEtwsInfo object from a Parcel. */ |
| SmsCbEtwsInfo(Parcel in) { |
| mWarningType = in.readInt(); |
| mEmergencyUserAlert = (in.readInt() != 0); |
| mActivatePopup = (in.readInt() != 0); |
| mWarningSecurityInformation = in.createByteArray(); |
| } |
| |
| /** |
| * Flatten this object into a Parcel. |
| * |
| * @param dest The Parcel in which the object should be written. |
| * @param flags Additional flags about how the object should be written (ignored). |
| */ |
| @Override |
| public void writeToParcel(Parcel dest, int flags) { |
| dest.writeInt(mWarningType); |
| dest.writeInt(mEmergencyUserAlert ? 1 : 0); |
| dest.writeInt(mActivatePopup ? 1 : 0); |
| dest.writeByteArray(mWarningSecurityInformation); |
| } |
| |
| /** |
| * Returns the ETWS warning type. |
| * @return a warning type such as {@link #ETWS_WARNING_TYPE_EARTHQUAKE} |
| */ |
| public int getWarningType() { |
| return mWarningType; |
| } |
| |
| /** |
| * Returns the ETWS emergency user alert flag. |
| * @return true to notify terminal to activate emergency user alert; false otherwise |
| */ |
| public boolean isEmergencyUserAlert() { |
| return mEmergencyUserAlert; |
| } |
| |
| /** |
| * Returns the ETWS activate popup flag. |
| * @return true to notify terminal to activate display popup; false otherwise |
| */ |
| public boolean isPopupAlert() { |
| return mActivatePopup; |
| } |
| |
| /** |
| * 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 |
| */ |
| public long getPrimaryNotificationTimestamp() { |
| if (mWarningSecurityInformation == null || mWarningSecurityInformation.length < 7) { |
| return 0; |
| } |
| |
| int year = IccUtils.gsmBcdByteToInt(mWarningSecurityInformation[0]); |
| int month = IccUtils.gsmBcdByteToInt(mWarningSecurityInformation[1]); |
| int day = IccUtils.gsmBcdByteToInt(mWarningSecurityInformation[2]); |
| int hour = IccUtils.gsmBcdByteToInt(mWarningSecurityInformation[3]); |
| int minute = IccUtils.gsmBcdByteToInt(mWarningSecurityInformation[4]); |
| int second = IccUtils.gsmBcdByteToInt(mWarningSecurityInformation[5]); |
| |
| // For the timezone, the most significant bit of the |
| // least significant nibble is the sign byte |
| // (meaning the max range of this field is 79 quarter-hours, |
| // which is more than enough) |
| |
| byte tzByte = mWarningSecurityInformation[6]; |
| |
| // Mask out sign bit. |
| int timezoneOffset = IccUtils.gsmBcdByteToInt((byte) (tzByte & (~0x08))); |
| |
| timezoneOffset = ((tzByte & 0x08) == 0) ? timezoneOffset : -timezoneOffset; |
| |
| Time time = new Time(Time.TIMEZONE_UTC); |
| |
| // We only need to support years above 2000. |
| time.year = year + 2000; |
| time.month = month - 1; |
| time.monthDay = day; |
| time.hour = hour; |
| time.minute = minute; |
| time.second = second; |
| |
| // Timezone offset is in quarter hours. |
| return time.toMillis(true) - timezoneOffset * 15 * 60 * 1000; |
| } |
| |
| /** |
| * Returns the digital signature (GSM primary notifications only). As of Release 10, |
| * 3GPP TS 23.041 states that the UE shall ignore this value if received. |
| * @return a byte array containing a copy of the primary notification digital signature |
| */ |
| public byte[] getPrimaryNotificationSignature() { |
| if (mWarningSecurityInformation == null || mWarningSecurityInformation.length < 50) { |
| return null; |
| } |
| return Arrays.copyOfRange(mWarningSecurityInformation, 7, 50); |
| } |
| |
| @Override |
| public String toString() { |
| return "SmsCbEtwsInfo{warningType=" + mWarningType + ", emergencyUserAlert=" |
| + mEmergencyUserAlert + ", activatePopup=" + mActivatePopup + '}'; |
| } |
| |
| /** |
| * Describe the kinds of special objects contained in the marshalled representation. |
| * @return a bitmask indicating this Parcelable contains no special objects |
| */ |
| @Override |
| public int describeContents() { |
| return 0; |
| } |
| |
| /** Creator for unparcelling objects. */ |
| public static final Creator<SmsCbEtwsInfo> CREATOR = new Creator<SmsCbEtwsInfo>() { |
| @Override |
| public SmsCbEtwsInfo createFromParcel(Parcel in) { |
| return new SmsCbEtwsInfo(in); |
| } |
| |
| @Override |
| public SmsCbEtwsInfo[] newArray(int size) { |
| return new SmsCbEtwsInfo[size]; |
| } |
| }; |
| } |