Loading api/current.txt +4 −0 Original line number Diff line number Diff line Loading @@ -43380,6 +43380,7 @@ package android.telephony.emergency { method public int compareTo(android.telephony.emergency.EmergencyNumber); method public int describeContents(); method public java.lang.String getCountryIso(); method public int getEmergencyCallRouting(); method public int getEmergencyNumberSourceBitmask(); method public java.util.List<java.lang.Integer> getEmergencyNumberSources(); method public java.util.List<java.lang.Integer> getEmergencyServiceCategories(); Loading @@ -43390,6 +43391,9 @@ package android.telephony.emergency { 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_CALL_ROUTING_EMERGENCY = 1; // 0x1 field public static final int EMERGENCY_CALL_ROUTING_NORMAL = 2; // 0x2 field public static final int EMERGENCY_CALL_ROUTING_UNKNOWN = 0; // 0x0 field public static final int EMERGENCY_NUMBER_SOURCE_DATABASE = 16; // 0x10 field public static final int EMERGENCY_NUMBER_SOURCE_DEFAULT = 8; // 0x8 field public static final int EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG = 4; // 0x4 api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -6040,6 +6040,7 @@ package android.telephony.ims { method public android.os.Bundle getCallExtras(); method public int getCallType(); method public static int getCallTypeFromVideoState(int); method public int getEmergencyCallRouting(); method public int getEmergencyServiceCategories(); method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); method public int getRestrictCause(); Loading @@ -6053,6 +6054,7 @@ package android.telephony.ims { method public void setCallExtraBoolean(java.lang.String, boolean); method public void setCallExtraInt(java.lang.String, int); method public void setCallRestrictCause(int); method public void setEmergencyCallRouting(int); method public void setEmergencyServiceCategories(int); method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallType(android.telephony.ims.ImsCallProfile); Loading telephony/java/android/telephony/emergency/EmergencyNumber.java +103 −37 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; /** Loading Loading @@ -198,21 +199,53 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu EMERGENCY_NUMBER_SOURCE_SET.add(EMERGENCY_NUMBER_SOURCE_DEFAULT); } /** * Indicated the framework does not know whether an emergency call should be placed using * emergency or normal call routing. This means the underlying radio or IMS implementation is * free to determine for itself how to route the call. */ public static final int EMERGENCY_CALL_ROUTING_UNKNOWN = 0; /** * Indicates the radio or IMS implementation must handle the call through emergency routing. */ public static final int EMERGENCY_CALL_ROUTING_EMERGENCY = 1; /** * Indicates the radio or IMS implementation must handle the call through normal call routing. */ public static final int EMERGENCY_CALL_ROUTING_NORMAL = 2; /** * The routing to tell how to handle the call for the corresponding emergency number. * * @hide */ @IntDef(flag = false, prefix = { "EMERGENCY_CALL_ROUTING_" }, value = { EMERGENCY_CALL_ROUTING_UNKNOWN, EMERGENCY_CALL_ROUTING_EMERGENCY, EMERGENCY_CALL_ROUTING_NORMAL }) @Retention(RetentionPolicy.SOURCE) public @interface EmergencyCallRouting {} private final String mNumber; private final String mCountryIso; private final String mMnc; private final int mEmergencyServiceCategoryBitmask; private final int mEmergencyNumberSourceBitmask; private final int mEmergencyCallRouting; /** @hide */ public EmergencyNumber(@NonNull String number, @NonNull String countryIso, @NonNull String mnc, int emergencyServiceCategories, int emergencyNumberSources) { public EmergencyNumber(@NonNull String number, @NonNull String countryIso, @NonNull String mnc, @EmergencyServiceCategories int emergencyServiceCategories, @EmergencyNumberSources int emergencyNumberSources, @EmergencyCallRouting int emergencyCallRouting) { this.mNumber = number; this.mCountryIso = countryIso; this.mMnc = mnc; this.mEmergencyServiceCategoryBitmask = emergencyServiceCategories; this.mEmergencyNumberSourceBitmask = emergencyNumberSources; this.mEmergencyCallRouting = emergencyCallRouting; } /** @hide */ Loading @@ -222,7 +255,32 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu mMnc = source.readString(); mEmergencyServiceCategoryBitmask = source.readInt(); mEmergencyNumberSourceBitmask = source.readInt(); mEmergencyCallRouting = source.readInt(); } @Override /** @hide */ public void writeToParcel(Parcel dest, int flags) { dest.writeString(mNumber); dest.writeString(mCountryIso); dest.writeString(mMnc); dest.writeInt(mEmergencyServiceCategoryBitmask); dest.writeInt(mEmergencyNumberSourceBitmask); dest.writeInt(mEmergencyCallRouting); } 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]; } }; /** * Get the dialing number of the emergency number. Loading Loading @@ -352,14 +410,17 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu return (mEmergencyNumberSourceBitmask & sources) == sources; } @Override /** @hide */ public void writeToParcel(Parcel dest, int flags) { dest.writeString(mNumber); dest.writeString(mCountryIso); dest.writeString(mMnc); dest.writeInt(mEmergencyServiceCategoryBitmask); dest.writeInt(mEmergencyNumberSourceBitmask); /** * Returns the emergency call routing information. * * <p>Some regions require some emergency numbers which are not routed using typical emergency * call processing, but are instead placed as regular phone calls. The emergency call routing * field provides information about how an emergency call will be routed when it is placed. * * @return the emergency call routing requirement */ public @EmergencyCallRouting int getEmergencyCallRouting() { return mEmergencyCallRouting; } @Override Loading @@ -373,7 +434,8 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu return "EmergencyNumber:" + "Number-" + mNumber + "|CountryIso-" + mCountryIso + "|Mnc-" + mMnc + "|ServiceCategories-" + Integer.toBinaryString(mEmergencyServiceCategoryBitmask) + "|Sources-" + Integer.toBinaryString(mEmergencyNumberSourceBitmask); + "|Sources-" + Integer.toBinaryString(mEmergencyNumberSourceBitmask) + "|Routing-" + Integer.toBinaryString(mEmergencyCallRouting); } @Override Loading @@ -381,7 +443,19 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu if (!EmergencyNumber.class.isInstance(o)) { return false; } return (o == this || toString().equals(o.toString())); EmergencyNumber other = (EmergencyNumber) o; return mNumber.equals(other.mNumber) && mCountryIso.equals(other.mCountryIso) && mMnc.equals(other.mMnc) && mEmergencyServiceCategoryBitmask == other.mEmergencyServiceCategoryBitmask && mEmergencyNumberSourceBitmask == other.mEmergencyNumberSourceBitmask && mEmergencyCallRouting == other.mEmergencyCallRouting; } @Override public int hashCode() { return Objects.hash(mNumber, mCountryIso, mMnc, mEmergencyServiceCategoryBitmask, mEmergencyNumberSourceBitmask, mEmergencyCallRouting); } /** Loading Loading @@ -462,12 +536,12 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu continue; } for (int j = i + 1; j < emergencyNumberList.size(); j++) { if (isSameEmergencyNumber( if (areSameEmergencyNumbers( emergencyNumberList.get(i), emergencyNumberList.get(j))) { Rlog.e(LOG_TAG, "Found unexpected duplicate numbers: " + emergencyNumberList.get(i) + " vs " + emergencyNumberList.get(j)); // Set the merged emergency number in the current position emergencyNumberList.set(i, mergeNumbers( emergencyNumberList.set(i, mergeSameEmergencyNumbers( emergencyNumberList.get(i), emergencyNumberList.get(j))); // Mark the emergency number has been merged mergedEmergencyNumber.add(emergencyNumberList.get(j)); Loading @@ -486,8 +560,8 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu * Check if two emergency numbers are the same. * * A unique EmergencyNumber has a unique combination of ‘number’, ‘mcc’, 'mnc' and * 'categories' fields. Multiple Emergency Number Sources should be merged into one bitfield * for the same EmergencyNumber. * 'categories', and 'routing' fields. Multiple Emergency Number Sources should be * merged into one bitfield for the same EmergencyNumber. * * @param first first EmergencyNumber to compare * @param second second EmergencyNumber to compare Loading @@ -495,7 +569,7 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu * * @hide */ public static boolean isSameEmergencyNumber(@NonNull EmergencyNumber first, public static boolean areSameEmergencyNumbers(@NonNull EmergencyNumber first, @NonNull EmergencyNumber second) { if (!first.getNumber().equals(second.getNumber())) { return false; Loading @@ -510,11 +584,15 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu != second.getEmergencyServiceCategoryBitmask()) { return false; } if (first.getEmergencyCallRouting() != second.getEmergencyCallRouting()) { return false; } return true; } /** * Get a merged EmergencyNumber for two numbers if they are the same. * Get a merged EmergencyNumber from two same emergency numbers. Two emergency numbers are * the same if {@link #areSameEmergencyNumbers} returns {@code true}. * * @param first first EmergencyNumber to compare * @param second second EmergencyNumber to compare Loading @@ -522,27 +600,15 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu * * @hide */ public static EmergencyNumber mergeNumbers(@NonNull EmergencyNumber first, public static EmergencyNumber mergeSameEmergencyNumbers(@NonNull EmergencyNumber first, @NonNull EmergencyNumber second) { if (isSameEmergencyNumber(first, second)) { if (areSameEmergencyNumbers(first, second)) { return new EmergencyNumber(first.getNumber(), first.getCountryIso(), first.getMnc(), first.getEmergencyServiceCategoryBitmask(), first.getEmergencyNumberSourceBitmask() | second.getEmergencyNumberSourceBitmask()); | second.getEmergencyNumberSourceBitmask(), first.getEmergencyCallRouting()); } return null; } 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]; } }; } telephony/java/android/telephony/ims/ImsCallProfile.java +71 −4 Original line number Diff line number Diff line Loading @@ -24,9 +24,11 @@ import android.os.Parcel; import android.os.Parcelable; import android.telecom.VideoProfile; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.PhoneConstants; import java.lang.annotation.Retention; Loading Loading @@ -320,6 +322,20 @@ public final class ImsCallProfile implements Parcelable { private @EmergencyServiceCategories int mEmergencyServiceCategories = EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED; /** * The emergency call routing, only valid if {@link #getServiceType} returns * {@link #SERVICE_TYPE_EMERGENCY} * * If valid, the value is any of the following constants: * <ol> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_UNKNOWN} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_NORMAL} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_EMERGENCY} </li> * </ol> */ private @EmergencyCallRouting int mEmergencyCallRouting = EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN; /** * Extras associated with this {@link ImsCallProfile}. * <p> Loading Loading @@ -503,10 +519,12 @@ public final class ImsCallProfile implements Parcelable { @Override public String toString() { return "{ serviceType=" + mServiceType + ", callType=" + mCallType + ", restrictCause=" + mRestrictCause + ", mediaProfile=" + mMediaProfile.toString() + " }"; return "{ serviceType=" + mServiceType + ", callType=" + mCallType + ", restrictCause=" + mRestrictCause + ", mediaProfile=" + mMediaProfile.toString() + ", emergencyServiceCategories=" + mEmergencyCallRouting + ", emergencyCallRouting=" + mEmergencyCallRouting + " }"; } @Override Loading @@ -522,6 +540,7 @@ public final class ImsCallProfile implements Parcelable { out.writeBundle(filteredExtras); out.writeParcelable(mMediaProfile, 0); out.writeInt(mEmergencyServiceCategories); out.writeInt(mEmergencyCallRouting); } private void readFromParcel(Parcel in) { Loading @@ -530,6 +549,7 @@ public final class ImsCallProfile implements Parcelable { mCallExtras = in.readBundle(); mMediaProfile = in.readParcelable(ImsStreamMediaProfile.class.getClassLoader()); mEmergencyServiceCategories = in.readInt(); mEmergencyCallRouting = in.readInt(); } public static final Creator<ImsCallProfile> CREATOR = new Creator<ImsCallProfile>() { Loading Loading @@ -739,6 +759,21 @@ public final class ImsCallProfile implements Parcelable { return (videoState & videoStateToCheck) == videoStateToCheck; } /** * Set the emergency service categories and emergency call routing. The set value is valid * only if {@link #getServiceType} returns {@link #SERVICE_TYPE_EMERGENCY} * * Reference: 3gpp 23.167, Section 6 - Functional description; * 3gpp 22.101, Section 10 - Emergency Calls. * * @hide */ public void setEmergencyCallInfo(EmergencyNumber num) { setEmergencyServiceCategories(num.getEmergencyServiceCategoryBitmask()); setEmergencyCallRouting(num.getEmergencyCallRouting()); } /** * Set the emergency service categories. The set value is valid only if * {@link #getServiceType} returns {@link #SERVICE_TYPE_EMERGENCY} Loading @@ -758,11 +793,28 @@ public final class ImsCallProfile implements Parcelable { * Reference: 3gpp 23.167, Section 6 - Functional description; * 3gpp 22.101, Section 10 - Emergency Calls. */ @VisibleForTesting public void setEmergencyServiceCategories( @EmergencyServiceCategories int emergencyServiceCategories) { mEmergencyServiceCategories = emergencyServiceCategories; } /** * Set the emergency call routing, only valid if {@link #getServiceType} returns * {@link #SERVICE_TYPE_EMERGENCY} * * If valid, the value is any of the following constants: * <ol> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_UNKNOWN} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_NORMAL} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_EMERGENCY} </li> * </ol> */ @VisibleForTesting public void setEmergencyCallRouting(@EmergencyCallRouting int emergencyCallRouting) { mEmergencyCallRouting = emergencyCallRouting; } /** * Get the emergency service categories, only valid if {@link #getServiceType} returns * {@link #SERVICE_TYPE_EMERGENCY} Loading @@ -787,4 +839,19 @@ public final class ImsCallProfile implements Parcelable { public @EmergencyServiceCategories int getEmergencyServiceCategories() { return mEmergencyServiceCategories; } /** * Get the emergency call routing, only valid if {@link #getServiceType} returns * {@link #SERVICE_TYPE_EMERGENCY} * * If valid, the value is any of the following constants: * <ol> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_UNKNOWN} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_NORMAL} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_EMERGENCY} </li> * </ol> */ public @EmergencyCallRouting int getEmergencyCallRouting() { return mEmergencyCallRouting; } } Loading
api/current.txt +4 −0 Original line number Diff line number Diff line Loading @@ -43380,6 +43380,7 @@ package android.telephony.emergency { method public int compareTo(android.telephony.emergency.EmergencyNumber); method public int describeContents(); method public java.lang.String getCountryIso(); method public int getEmergencyCallRouting(); method public int getEmergencyNumberSourceBitmask(); method public java.util.List<java.lang.Integer> getEmergencyNumberSources(); method public java.util.List<java.lang.Integer> getEmergencyServiceCategories(); Loading @@ -43390,6 +43391,9 @@ package android.telephony.emergency { 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_CALL_ROUTING_EMERGENCY = 1; // 0x1 field public static final int EMERGENCY_CALL_ROUTING_NORMAL = 2; // 0x2 field public static final int EMERGENCY_CALL_ROUTING_UNKNOWN = 0; // 0x0 field public static final int EMERGENCY_NUMBER_SOURCE_DATABASE = 16; // 0x10 field public static final int EMERGENCY_NUMBER_SOURCE_DEFAULT = 8; // 0x8 field public static final int EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG = 4; // 0x4
api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -6040,6 +6040,7 @@ package android.telephony.ims { method public android.os.Bundle getCallExtras(); method public int getCallType(); method public static int getCallTypeFromVideoState(int); method public int getEmergencyCallRouting(); method public int getEmergencyServiceCategories(); method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); method public int getRestrictCause(); Loading @@ -6053,6 +6054,7 @@ package android.telephony.ims { method public void setCallExtraBoolean(java.lang.String, boolean); method public void setCallExtraInt(java.lang.String, int); method public void setCallRestrictCause(int); method public void setEmergencyCallRouting(int); method public void setEmergencyServiceCategories(int); method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallType(android.telephony.ims.ImsCallProfile); Loading
telephony/java/android/telephony/emergency/EmergencyNumber.java +103 −37 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; /** Loading Loading @@ -198,21 +199,53 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu EMERGENCY_NUMBER_SOURCE_SET.add(EMERGENCY_NUMBER_SOURCE_DEFAULT); } /** * Indicated the framework does not know whether an emergency call should be placed using * emergency or normal call routing. This means the underlying radio or IMS implementation is * free to determine for itself how to route the call. */ public static final int EMERGENCY_CALL_ROUTING_UNKNOWN = 0; /** * Indicates the radio or IMS implementation must handle the call through emergency routing. */ public static final int EMERGENCY_CALL_ROUTING_EMERGENCY = 1; /** * Indicates the radio or IMS implementation must handle the call through normal call routing. */ public static final int EMERGENCY_CALL_ROUTING_NORMAL = 2; /** * The routing to tell how to handle the call for the corresponding emergency number. * * @hide */ @IntDef(flag = false, prefix = { "EMERGENCY_CALL_ROUTING_" }, value = { EMERGENCY_CALL_ROUTING_UNKNOWN, EMERGENCY_CALL_ROUTING_EMERGENCY, EMERGENCY_CALL_ROUTING_NORMAL }) @Retention(RetentionPolicy.SOURCE) public @interface EmergencyCallRouting {} private final String mNumber; private final String mCountryIso; private final String mMnc; private final int mEmergencyServiceCategoryBitmask; private final int mEmergencyNumberSourceBitmask; private final int mEmergencyCallRouting; /** @hide */ public EmergencyNumber(@NonNull String number, @NonNull String countryIso, @NonNull String mnc, int emergencyServiceCategories, int emergencyNumberSources) { public EmergencyNumber(@NonNull String number, @NonNull String countryIso, @NonNull String mnc, @EmergencyServiceCategories int emergencyServiceCategories, @EmergencyNumberSources int emergencyNumberSources, @EmergencyCallRouting int emergencyCallRouting) { this.mNumber = number; this.mCountryIso = countryIso; this.mMnc = mnc; this.mEmergencyServiceCategoryBitmask = emergencyServiceCategories; this.mEmergencyNumberSourceBitmask = emergencyNumberSources; this.mEmergencyCallRouting = emergencyCallRouting; } /** @hide */ Loading @@ -222,7 +255,32 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu mMnc = source.readString(); mEmergencyServiceCategoryBitmask = source.readInt(); mEmergencyNumberSourceBitmask = source.readInt(); mEmergencyCallRouting = source.readInt(); } @Override /** @hide */ public void writeToParcel(Parcel dest, int flags) { dest.writeString(mNumber); dest.writeString(mCountryIso); dest.writeString(mMnc); dest.writeInt(mEmergencyServiceCategoryBitmask); dest.writeInt(mEmergencyNumberSourceBitmask); dest.writeInt(mEmergencyCallRouting); } 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]; } }; /** * Get the dialing number of the emergency number. Loading Loading @@ -352,14 +410,17 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu return (mEmergencyNumberSourceBitmask & sources) == sources; } @Override /** @hide */ public void writeToParcel(Parcel dest, int flags) { dest.writeString(mNumber); dest.writeString(mCountryIso); dest.writeString(mMnc); dest.writeInt(mEmergencyServiceCategoryBitmask); dest.writeInt(mEmergencyNumberSourceBitmask); /** * Returns the emergency call routing information. * * <p>Some regions require some emergency numbers which are not routed using typical emergency * call processing, but are instead placed as regular phone calls. The emergency call routing * field provides information about how an emergency call will be routed when it is placed. * * @return the emergency call routing requirement */ public @EmergencyCallRouting int getEmergencyCallRouting() { return mEmergencyCallRouting; } @Override Loading @@ -373,7 +434,8 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu return "EmergencyNumber:" + "Number-" + mNumber + "|CountryIso-" + mCountryIso + "|Mnc-" + mMnc + "|ServiceCategories-" + Integer.toBinaryString(mEmergencyServiceCategoryBitmask) + "|Sources-" + Integer.toBinaryString(mEmergencyNumberSourceBitmask); + "|Sources-" + Integer.toBinaryString(mEmergencyNumberSourceBitmask) + "|Routing-" + Integer.toBinaryString(mEmergencyCallRouting); } @Override Loading @@ -381,7 +443,19 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu if (!EmergencyNumber.class.isInstance(o)) { return false; } return (o == this || toString().equals(o.toString())); EmergencyNumber other = (EmergencyNumber) o; return mNumber.equals(other.mNumber) && mCountryIso.equals(other.mCountryIso) && mMnc.equals(other.mMnc) && mEmergencyServiceCategoryBitmask == other.mEmergencyServiceCategoryBitmask && mEmergencyNumberSourceBitmask == other.mEmergencyNumberSourceBitmask && mEmergencyCallRouting == other.mEmergencyCallRouting; } @Override public int hashCode() { return Objects.hash(mNumber, mCountryIso, mMnc, mEmergencyServiceCategoryBitmask, mEmergencyNumberSourceBitmask, mEmergencyCallRouting); } /** Loading Loading @@ -462,12 +536,12 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu continue; } for (int j = i + 1; j < emergencyNumberList.size(); j++) { if (isSameEmergencyNumber( if (areSameEmergencyNumbers( emergencyNumberList.get(i), emergencyNumberList.get(j))) { Rlog.e(LOG_TAG, "Found unexpected duplicate numbers: " + emergencyNumberList.get(i) + " vs " + emergencyNumberList.get(j)); // Set the merged emergency number in the current position emergencyNumberList.set(i, mergeNumbers( emergencyNumberList.set(i, mergeSameEmergencyNumbers( emergencyNumberList.get(i), emergencyNumberList.get(j))); // Mark the emergency number has been merged mergedEmergencyNumber.add(emergencyNumberList.get(j)); Loading @@ -486,8 +560,8 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu * Check if two emergency numbers are the same. * * A unique EmergencyNumber has a unique combination of ‘number’, ‘mcc’, 'mnc' and * 'categories' fields. Multiple Emergency Number Sources should be merged into one bitfield * for the same EmergencyNumber. * 'categories', and 'routing' fields. Multiple Emergency Number Sources should be * merged into one bitfield for the same EmergencyNumber. * * @param first first EmergencyNumber to compare * @param second second EmergencyNumber to compare Loading @@ -495,7 +569,7 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu * * @hide */ public static boolean isSameEmergencyNumber(@NonNull EmergencyNumber first, public static boolean areSameEmergencyNumbers(@NonNull EmergencyNumber first, @NonNull EmergencyNumber second) { if (!first.getNumber().equals(second.getNumber())) { return false; Loading @@ -510,11 +584,15 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu != second.getEmergencyServiceCategoryBitmask()) { return false; } if (first.getEmergencyCallRouting() != second.getEmergencyCallRouting()) { return false; } return true; } /** * Get a merged EmergencyNumber for two numbers if they are the same. * Get a merged EmergencyNumber from two same emergency numbers. Two emergency numbers are * the same if {@link #areSameEmergencyNumbers} returns {@code true}. * * @param first first EmergencyNumber to compare * @param second second EmergencyNumber to compare Loading @@ -522,27 +600,15 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu * * @hide */ public static EmergencyNumber mergeNumbers(@NonNull EmergencyNumber first, public static EmergencyNumber mergeSameEmergencyNumbers(@NonNull EmergencyNumber first, @NonNull EmergencyNumber second) { if (isSameEmergencyNumber(first, second)) { if (areSameEmergencyNumbers(first, second)) { return new EmergencyNumber(first.getNumber(), first.getCountryIso(), first.getMnc(), first.getEmergencyServiceCategoryBitmask(), first.getEmergencyNumberSourceBitmask() | second.getEmergencyNumberSourceBitmask()); | second.getEmergencyNumberSourceBitmask(), first.getEmergencyCallRouting()); } return null; } 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]; } }; }
telephony/java/android/telephony/ims/ImsCallProfile.java +71 −4 Original line number Diff line number Diff line Loading @@ -24,9 +24,11 @@ import android.os.Parcel; import android.os.Parcelable; import android.telecom.VideoProfile; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.PhoneConstants; import java.lang.annotation.Retention; Loading Loading @@ -320,6 +322,20 @@ public final class ImsCallProfile implements Parcelable { private @EmergencyServiceCategories int mEmergencyServiceCategories = EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED; /** * The emergency call routing, only valid if {@link #getServiceType} returns * {@link #SERVICE_TYPE_EMERGENCY} * * If valid, the value is any of the following constants: * <ol> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_UNKNOWN} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_NORMAL} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_EMERGENCY} </li> * </ol> */ private @EmergencyCallRouting int mEmergencyCallRouting = EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN; /** * Extras associated with this {@link ImsCallProfile}. * <p> Loading Loading @@ -503,10 +519,12 @@ public final class ImsCallProfile implements Parcelable { @Override public String toString() { return "{ serviceType=" + mServiceType + ", callType=" + mCallType + ", restrictCause=" + mRestrictCause + ", mediaProfile=" + mMediaProfile.toString() + " }"; return "{ serviceType=" + mServiceType + ", callType=" + mCallType + ", restrictCause=" + mRestrictCause + ", mediaProfile=" + mMediaProfile.toString() + ", emergencyServiceCategories=" + mEmergencyCallRouting + ", emergencyCallRouting=" + mEmergencyCallRouting + " }"; } @Override Loading @@ -522,6 +540,7 @@ public final class ImsCallProfile implements Parcelable { out.writeBundle(filteredExtras); out.writeParcelable(mMediaProfile, 0); out.writeInt(mEmergencyServiceCategories); out.writeInt(mEmergencyCallRouting); } private void readFromParcel(Parcel in) { Loading @@ -530,6 +549,7 @@ public final class ImsCallProfile implements Parcelable { mCallExtras = in.readBundle(); mMediaProfile = in.readParcelable(ImsStreamMediaProfile.class.getClassLoader()); mEmergencyServiceCategories = in.readInt(); mEmergencyCallRouting = in.readInt(); } public static final Creator<ImsCallProfile> CREATOR = new Creator<ImsCallProfile>() { Loading Loading @@ -739,6 +759,21 @@ public final class ImsCallProfile implements Parcelable { return (videoState & videoStateToCheck) == videoStateToCheck; } /** * Set the emergency service categories and emergency call routing. The set value is valid * only if {@link #getServiceType} returns {@link #SERVICE_TYPE_EMERGENCY} * * Reference: 3gpp 23.167, Section 6 - Functional description; * 3gpp 22.101, Section 10 - Emergency Calls. * * @hide */ public void setEmergencyCallInfo(EmergencyNumber num) { setEmergencyServiceCategories(num.getEmergencyServiceCategoryBitmask()); setEmergencyCallRouting(num.getEmergencyCallRouting()); } /** * Set the emergency service categories. The set value is valid only if * {@link #getServiceType} returns {@link #SERVICE_TYPE_EMERGENCY} Loading @@ -758,11 +793,28 @@ public final class ImsCallProfile implements Parcelable { * Reference: 3gpp 23.167, Section 6 - Functional description; * 3gpp 22.101, Section 10 - Emergency Calls. */ @VisibleForTesting public void setEmergencyServiceCategories( @EmergencyServiceCategories int emergencyServiceCategories) { mEmergencyServiceCategories = emergencyServiceCategories; } /** * Set the emergency call routing, only valid if {@link #getServiceType} returns * {@link #SERVICE_TYPE_EMERGENCY} * * If valid, the value is any of the following constants: * <ol> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_UNKNOWN} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_NORMAL} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_EMERGENCY} </li> * </ol> */ @VisibleForTesting public void setEmergencyCallRouting(@EmergencyCallRouting int emergencyCallRouting) { mEmergencyCallRouting = emergencyCallRouting; } /** * Get the emergency service categories, only valid if {@link #getServiceType} returns * {@link #SERVICE_TYPE_EMERGENCY} Loading @@ -787,4 +839,19 @@ public final class ImsCallProfile implements Parcelable { public @EmergencyServiceCategories int getEmergencyServiceCategories() { return mEmergencyServiceCategories; } /** * Get the emergency call routing, only valid if {@link #getServiceType} returns * {@link #SERVICE_TYPE_EMERGENCY} * * If valid, the value is any of the following constants: * <ol> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_UNKNOWN} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_NORMAL} </li> * <li>{@link EmergencyNumber#EMERGENCY_CALL_ROUTING_EMERGENCY} </li> * </ol> */ public @EmergencyCallRouting int getEmergencyCallRouting() { return mEmergencyCallRouting; } }