diff options
-rw-r--r-- | Android.bp | 1 | ||||
-rwxr-xr-x | api/current.txt | 30 | ||||
-rw-r--r-- | telephony/java/android/telephony/emergency/EmergencyNumber.aidl | 19 | ||||
-rw-r--r-- | telephony/java/android/telephony/emergency/EmergencyNumber.java | 374 |
4 files changed, 424 insertions, 0 deletions
diff --git a/Android.bp b/Android.bp index e0e80629716b..b2cd4ee08555 100644 --- a/Android.bp +++ b/Android.bp @@ -686,6 +686,7 @@ java_defaults { "android.hardware.vibrator-V1.2-java", "android.hardware.wifi-V1.0-java-constants", "android.hardware.radio-V1.0-java", + "android.hardware.radio-V1.3-java", "android.hardware.usb.gadget-V1.0-java", ], diff --git a/api/current.txt b/api/current.txt index fe8ee501cde0..318118d93414 100755 --- a/api/current.txt +++ b/api/current.txt @@ -42842,6 +42842,36 @@ package android.telephony.data { } +package android.telephony.emergency { + + public final class EmergencyNumber implements android.os.Parcelable { + method public int describeContents(); + method public java.lang.String getCountryIso(); + method public int getEmergencyNumberSourceBitmask(); + method public java.util.List<java.lang.Integer> getEmergencyNumberSources(); + method public java.util.List<java.lang.Integer> getEmergencyServiceCategories(); + method public int getEmergencyServiceCategoryBitmask(); + method public java.lang.String getNumber(); + method public boolean isFromSources(int); + method public boolean isInEmergencyServiceCategories(int); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.telephony.emergency.EmergencyNumber> CREATOR; + field public static final int EMERGENCY_NUMBER_SOURCE_DEFAULT = 8; // 0x8 + field public static final int EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG = 4; // 0x4 + field public static final int EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING = 1; // 0x1 + field public static final int EMERGENCY_NUMBER_SOURCE_SIM = 2; // 0x2 + field public static final int EMERGENCY_SERVICE_CATEGORY_AIEC = 64; // 0x40 + field public static final int EMERGENCY_SERVICE_CATEGORY_AMBULANCE = 2; // 0x2 + field public static final int EMERGENCY_SERVICE_CATEGORY_FIRE_BRIGADE = 4; // 0x4 + field public static final int EMERGENCY_SERVICE_CATEGORY_MARINE_GUARD = 8; // 0x8 + field public static final int EMERGENCY_SERVICE_CATEGORY_MIEC = 32; // 0x20 + field public static final int EMERGENCY_SERVICE_CATEGORY_MOUNTAIN_RESCUE = 16; // 0x10 + field public static final int EMERGENCY_SERVICE_CATEGORY_POLICE = 1; // 0x1 + field public static final int EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED = 0; // 0x0 + } + +} + package android.telephony.euicc { public final class DownloadableSubscription implements android.os.Parcelable { diff --git a/telephony/java/android/telephony/emergency/EmergencyNumber.aidl b/telephony/java/android/telephony/emergency/EmergencyNumber.aidl new file mode 100644 index 000000000000..bfb0a59b16c8 --- /dev/null +++ b/telephony/java/android/telephony/emergency/EmergencyNumber.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2018, 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.emergency; + +parcelable EmergencyNumber; diff --git a/telephony/java/android/telephony/emergency/EmergencyNumber.java b/telephony/java/android/telephony/emergency/EmergencyNumber.java new file mode 100644 index 000000000000..d6a08543b9cd --- /dev/null +++ b/telephony/java/android/telephony/emergency/EmergencyNumber.java @@ -0,0 +1,374 @@ +/* + * Copyright (C) 2018 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.emergency; + +import android.annotation.IntDef; +import android.hardware.radio.V1_3.EmergencyNumberSource; +import android.hardware.radio.V1_3.EmergencyServiceCategory; +import android.os.Parcel; +import android.os.Parcelable; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * A parcelable class that wraps and retrieves the information of number, service category(s) and + * country code for a specific emergency number. + */ +public final class EmergencyNumber implements Parcelable { + + private static final String LOG_TAG = "EmergencyNumber"; + + /** + * Defining Emergency Service Category as follows: + * - General emergency call, all categories; + * - Police; + * - Ambulance; + * - Fire Brigade; + * - Marine Guard; + * - Mountain Rescue; + * - Manually Initiated eCall (MIeC); + * - Automatically Initiated eCall (AIeC); + * + * Category UNSPECIFIED (General emergency call, all categories) indicates that no specific + * services are associated with this emergency number; if the emergency number is specified, + * it has one or more defined emergency service categories. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + * + * @hide + */ + @IntDef(flag = true, prefix = { "EMERGENCY_SERVICE_CATEGORY_" }, value = { + EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED, + EMERGENCY_SERVICE_CATEGORY_POLICE, + EMERGENCY_SERVICE_CATEGORY_AMBULANCE, + EMERGENCY_SERVICE_CATEGORY_FIRE_BRIGADE, + EMERGENCY_SERVICE_CATEGORY_MARINE_GUARD, + EMERGENCY_SERVICE_CATEGORY_MOUNTAIN_RESCUE, + EMERGENCY_SERVICE_CATEGORY_MIEC, + EMERGENCY_SERVICE_CATEGORY_AIEC + }) + @Retention(RetentionPolicy.SOURCE) + public @interface EmergencyServiceCategories {} + + /** + * Emergency Service Category UNSPECIFIED (General emergency call, all categories) bit-field + * indicates that no specific services are associated with this emergency number; if the + * emergency number is specified, it has one or more defined emergency service categories. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED = + EmergencyServiceCategory.UNSPECIFIED; + /** + * Bit-field that indicates Emergency Service Category for Police. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_SERVICE_CATEGORY_POLICE = EmergencyServiceCategory.POLICE; + /** + * Bit-field that indicates Emergency Service Category for Ambulance. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_SERVICE_CATEGORY_AMBULANCE = + EmergencyServiceCategory.AMBULANCE; + /** + * Bit-field that indicates Emergency Service Category for Fire Brigade. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_SERVICE_CATEGORY_FIRE_BRIGADE = + EmergencyServiceCategory.FIRE_BRIGADE; + /** + * Bit-field that indicates Emergency Service Category for Marine Guard. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_SERVICE_CATEGORY_MARINE_GUARD = + EmergencyServiceCategory.MARINE_GUARD; + /** + * Bit-field that indicates Emergency Service Category for Mountain Rescue. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_SERVICE_CATEGORY_MOUNTAIN_RESCUE = + EmergencyServiceCategory.MOUNTAIN_RESCUE; + /** + * Bit-field that indicates Emergency Service Category for Manually Initiated eCall (MIeC) + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_SERVICE_CATEGORY_MIEC = EmergencyServiceCategory.MIEC; + /** + * Bit-field that indicates Emergency Service Category for Automatically Initiated eCall (AIeC) + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_SERVICE_CATEGORY_AIEC = EmergencyServiceCategory.AIEC; + + private static final Set<Integer> EMERGENCY_SERVICE_CATEGORY_SET; + static { + EMERGENCY_SERVICE_CATEGORY_SET = new HashSet<Integer>(); + EMERGENCY_SERVICE_CATEGORY_SET.add(EMERGENCY_SERVICE_CATEGORY_POLICE); + EMERGENCY_SERVICE_CATEGORY_SET.add(EMERGENCY_SERVICE_CATEGORY_AMBULANCE); + EMERGENCY_SERVICE_CATEGORY_SET.add(EMERGENCY_SERVICE_CATEGORY_FIRE_BRIGADE); + EMERGENCY_SERVICE_CATEGORY_SET.add(EMERGENCY_SERVICE_CATEGORY_MARINE_GUARD); + EMERGENCY_SERVICE_CATEGORY_SET.add(EMERGENCY_SERVICE_CATEGORY_MOUNTAIN_RESCUE); + EMERGENCY_SERVICE_CATEGORY_SET.add(EMERGENCY_SERVICE_CATEGORY_MIEC); + EMERGENCY_SERVICE_CATEGORY_SET.add(EMERGENCY_SERVICE_CATEGORY_AIEC); + } + + /** + * The source to tell where the corresponding @1.3::EmergencyNumber comes from. + * + * The emergency number has one or more defined emergency number sources. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + * + * @hide + */ + @IntDef(flag = true, prefix = { "EMERGENCY_NUMBER_SOURCE_" }, value = { + EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING, + EMERGENCY_NUMBER_SOURCE_SIM, + EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG, + EMERGENCY_NUMBER_SOURCE_DEFAULT + }) + @Retention(RetentionPolicy.SOURCE) + public @interface EmergencyNumberSources {} + + /** + * Bit-field which indicates the number is from the network signaling. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING = + EmergencyNumberSource.NETWORK_SIGNALING; + /** + * Bit-field which indicates the number is from the sim. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_NUMBER_SOURCE_SIM = EmergencyNumberSource.SIM; + /** Bit-field which indicates the number is from the modem config. */ + public static final int EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG = + EmergencyNumberSource.MODEM_CONFIG; + /** + * Bit-field which indicates the number is available as default. + * + * 112, 911 must always be available; additionally, 000, 08, 110, 999, 118 and 119 must be + * available when sim is not present. + * + * Reference: 3gpp 22.101, Section 10 - Emergency Calls + */ + public static final int EMERGENCY_NUMBER_SOURCE_DEFAULT = EmergencyNumberSource.DEFAULT; + + private static final Set<Integer> EMERGENCY_NUMBER_SOURCE_SET; + static { + EMERGENCY_NUMBER_SOURCE_SET = new HashSet<Integer>(); + EMERGENCY_NUMBER_SOURCE_SET.add(EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING); + EMERGENCY_NUMBER_SOURCE_SET.add(EMERGENCY_NUMBER_SOURCE_SIM); + EMERGENCY_NUMBER_SOURCE_SET.add(EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG); + EMERGENCY_NUMBER_SOURCE_SET.add(EMERGENCY_NUMBER_SOURCE_DEFAULT); + } + + private final String mNumber; + private final String mCountryIso; + private final int mEmergencyServiceCategoryBitmask; + private final int mEmergencyNumberSourceBitmask; + + /** @hide */ + public EmergencyNumber(String number, String countryIso, + int emergencyServiceCategories, + int emergencyNumberSources) { + this.mNumber = number; + this.mCountryIso = countryIso; + this.mEmergencyServiceCategoryBitmask = emergencyServiceCategories; + this.mEmergencyNumberSourceBitmask = emergencyNumberSources; + } + + /** @hide */ + public EmergencyNumber(Parcel source) { + mNumber = source.readString(); + mCountryIso = source.readString(); + mEmergencyServiceCategoryBitmask = source.readInt(); + mEmergencyNumberSourceBitmask = source.readInt(); + } + + /** + * Get the dialing number of the emergency number. + * + * The character in the number string is only the dial pad + * character('0'-'9', '*', or '#'). For example: 911. + * + * @return the dialing number. + */ + public String getNumber() { + return mNumber; + } + + /** + * Get the country code string (lowercase character) in ISO 3166 format of the emergency number. + * + * @return the country code string (lowercase character) in ISO 3166 format. + */ + public String getCountryIso() { + return mCountryIso; + } + + /** + * Returns the bitmask of emergency service categories {@link EmergencyServiceCategories} of + * the emergency number. + * + * @return bitmask of the emergency service categories {@link EmergencyServiceCategories} + */ + public @EmergencyServiceCategories int getEmergencyServiceCategoryBitmask() { + return mEmergencyServiceCategoryBitmask; + } + + /** + * Returns the emergency service categories {@link EmergencyServiceCategories} of the emergency + * number. + * + * @return a list of the emergency service categories {@link EmergencyServiceCategories} + */ + public List<Integer> getEmergencyServiceCategories() { + List<Integer> categories = new ArrayList<>(); + if (serviceUnspecified()) { + categories.add(EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED); + return categories; + } + for (Integer category : EMERGENCY_SERVICE_CATEGORY_SET) { + if (isInEmergencyServiceCategories(category)) { + categories.add(category); + } + } + return categories; + } + + /** + * Checks if the emergency service category is unspecified for the emergency number + * {@link #EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED}. + * + * @return {@code true} if the emergency service category is unspecified for the emergency + * number {@link #EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED}; {@code false} otherwise. + */ + private boolean serviceUnspecified() { + return mEmergencyServiceCategoryBitmask == EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED; + } + + /** + * Checks if the emergency number is in the specified emergency service category(s) + * {@link EmergencyServiceCategories}. + * + * @return {@code true} if the emergency number is in the specified emergency service + * category(s) {@link EmergencyServiceCategories}; {@code false} otherwise. + * + * @param categories - emergency service categories {@link EmergencyServiceCategories} + */ + public boolean isInEmergencyServiceCategories(@EmergencyServiceCategories int categories) { + if (categories == EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED) { + return serviceUnspecified(); + } + return (mEmergencyServiceCategoryBitmask & categories) == categories; + } + + /** + * Returns the bitmask of the sources {@link EmergencyNumberSources} of the emergency number. + * + * @return bitmask of the emergency number sources {@link EmergencyNumberSources} + */ + public @EmergencyNumberSources int getEmergencyNumberSourceBitmask() { + return mEmergencyNumberSourceBitmask; + } + + /** + * Returns a list of {@link EmergencyNumberSources} of the emergency number. + * + * @return a list of {@link EmergencyNumberSources} + */ + public List<Integer> getEmergencyNumberSources() { + List<Integer> sources = new ArrayList<>(); + for (Integer source : EMERGENCY_NUMBER_SOURCE_SET) { + if ((mEmergencyNumberSourceBitmask & source) == source) { + sources.add(source); + } + } + return sources; + } + + /** + * Checks if the emergency number is from the specified emergency number source(s) + * {@link EmergencyNumberSources}. + * + * @return {@code true} if the emergency number is from the specified emergency number + * source(s) {@link EmergencyNumberSources}; {@code false} otherwise. + * + * @param sources - {@link EmergencyNumberSources} + */ + public boolean isFromSources(@EmergencyNumberSources int sources) { + return (mEmergencyNumberSourceBitmask & sources) == sources; + } + + @Override + /** @hide */ + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(mNumber); + dest.writeString(mCountryIso); + dest.writeInt(mEmergencyServiceCategoryBitmask); + dest.writeInt(mEmergencyNumberSourceBitmask); + } + + @Override + /** @hide */ + public int describeContents() { + return 0; + } + + @Override + public String toString() { + return "EmergencyNumber = " + "[Number]" + mNumber + " / [CountryIso]" + mCountryIso + + " / [ServiceCategories]" + + Integer.toBinaryString(mEmergencyServiceCategoryBitmask) + + " / [Sources]" + Integer.toBinaryString(mEmergencyNumberSourceBitmask); + } + + @Override + public boolean equals(Object o) { + if (!EmergencyNumber.class.isInstance(o)) { + return false; + } + return (o == this || toString().equals(o.toString())); + } + + public static final Parcelable.Creator<EmergencyNumber> CREATOR = + new Parcelable.Creator<EmergencyNumber>() { + @Override + public EmergencyNumber createFromParcel(Parcel in) { + return new EmergencyNumber(in); + } + + @Override + public EmergencyNumber[] newArray(int size) { + return new EmergencyNumber[size]; + } + }; +} |