Add Emergency Number Test Mode

Add EMERGENCY_NUMBER_SOURCE_TEST_MODE

This also does not allow to send the service categories from database when
dialing.

Bug: 122840137
Test: Manual; Treehugger
Change-Id: I4ea3539e3b814b71e03e956d4a857ec20141fa8c
This commit is contained in:
sqian
2019-01-15 18:26:35 -08:00
parent c2f2977c4b
commit cb4bd3a30f
4 changed files with 78 additions and 3 deletions

View File

@@ -7182,6 +7182,7 @@ package android.telephony.ims {
method public int getServiceType(); method public int getServiceType();
method public static int getVideoStateFromCallType(int); method public static int getVideoStateFromCallType(int);
method public static int getVideoStateFromImsCallProfile(android.telephony.ims.ImsCallProfile); method public static int getVideoStateFromImsCallProfile(android.telephony.ims.ImsCallProfile);
method public boolean isEmergencyCallTesting();
method public boolean isVideoCall(); method public boolean isVideoCall();
method public boolean isVideoPaused(); method public boolean isVideoPaused();
method public static int presentationToOir(int); method public static int presentationToOir(int);
@@ -7190,6 +7191,7 @@ package android.telephony.ims {
method public void setCallExtraInt(java.lang.String, int); method public void setCallExtraInt(java.lang.String, int);
method public void setCallRestrictCause(int); method public void setCallRestrictCause(int);
method public void setEmergencyCallRouting(int); method public void setEmergencyCallRouting(int);
method public void setEmergencyCallTesting(boolean);
method public void setEmergencyServiceCategories(int); method public void setEmergencyServiceCategories(int);
method public void setEmergencyUrns(java.util.List<java.lang.String>); method public void setEmergencyUrns(java.util.List<java.lang.String>);
method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallExtras(android.telephony.ims.ImsCallProfile);

View File

@@ -27,6 +27,7 @@ import android.telephony.Rlog;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -176,6 +177,12 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
* Bit-field which indicates the number is from the platform-maintained database. * Bit-field which indicates the number is from the platform-maintained database.
*/ */
public static final int EMERGENCY_NUMBER_SOURCE_DATABASE = 1 << 4; public static final int EMERGENCY_NUMBER_SOURCE_DATABASE = 1 << 4;
/**
* Bit-field which indicates the number is from test mode.
*
* @hide
*/
public static final int EMERGENCY_NUMBER_SOURCE_TEST = 1 << 5;
/** Bit-field which indicates the number is from the modem config. */ /** Bit-field which indicates the number is from the modem config. */
public static final int EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG = public static final int EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG =
EmergencyNumberSource.MODEM_CONFIG; EmergencyNumberSource.MODEM_CONFIG;
@@ -326,6 +333,21 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
return mEmergencyServiceCategoryBitmask; return mEmergencyServiceCategoryBitmask;
} }
/**
* Returns the bitmask of emergency service categories of the emergency number for
* internal dialing.
*
* @return bitmask of the emergency service categories
*
* @hide
*/
public @EmergencyServiceCategories int getEmergencyServiceCategoryBitmaskInternalDial() {
if (mEmergencyNumberSourceBitmask == EMERGENCY_NUMBER_SOURCE_DATABASE) {
return EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED;
}
return mEmergencyServiceCategoryBitmask;
}
/** /**
* Returns the emergency service categories of the emergency number. * Returns the emergency service categories of the emergency number.
* *
@@ -577,6 +599,7 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
emergencyNumberList.remove(i--); emergencyNumberList.remove(i--);
} }
} }
Collections.sort(emergencyNumberList);
} }
/** /**
@@ -613,6 +636,12 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
if (first.getEmergencyCallRouting() != second.getEmergencyCallRouting()) { if (first.getEmergencyCallRouting() != second.getEmergencyCallRouting()) {
return false; return false;
} }
// Never merge two numbers if one of them is from test mode but the other one is not;
// This supports to remove a number from the test mode.
if (first.isFromSources(EMERGENCY_NUMBER_SOURCE_TEST)
^ second.isFromSources(EMERGENCY_NUMBER_SOURCE_TEST)) {
return false;
}
return true; return true;
} }
@@ -638,4 +667,13 @@ public final class EmergencyNumber implements Parcelable, Comparable<EmergencyNu
} }
return null; return null;
} }
/**
* Validate Emergency Number address that only allows '0'-'9', '*', or '#'
*
* @hide
*/
public static boolean validateEmergencyNumberAddress(String address) {
return address.matches("[0-9*#]+");
}
} }

View File

@@ -347,6 +347,9 @@ public final class ImsCallProfile implements Parcelable {
private @EmergencyCallRouting int mEmergencyCallRouting = private @EmergencyCallRouting int mEmergencyCallRouting =
EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN; EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN;
/** Indicates if the call is for testing purpose */
private boolean mEmergencyCallTesting = false;
/** /**
* Extras associated with this {@link ImsCallProfile}. * Extras associated with this {@link ImsCallProfile}.
* <p> * <p>
@@ -534,9 +537,10 @@ public final class ImsCallProfile implements Parcelable {
+ ", callType=" + mCallType + ", callType=" + mCallType
+ ", restrictCause=" + mRestrictCause + ", restrictCause=" + mRestrictCause
+ ", mediaProfile=" + mMediaProfile.toString() + ", mediaProfile=" + mMediaProfile.toString()
+ ", emergencyServiceCategories=" + mEmergencyCallRouting + ", emergencyServiceCategories=" + mEmergencyServiceCategories
+ ", emergencyUrns=" + mEmergencyUrns + ", emergencyUrns=" + mEmergencyUrns
+ ", emergencyCallRouting=" + mEmergencyCallRouting + " }"; + ", emergencyCallRouting=" + mEmergencyCallRouting
+ ", emergencyCallTesting=" + mEmergencyCallTesting + " }";
} }
@Override @Override
@@ -554,6 +558,7 @@ public final class ImsCallProfile implements Parcelable {
out.writeInt(mEmergencyServiceCategories); out.writeInt(mEmergencyServiceCategories);
out.writeStringList(mEmergencyUrns); out.writeStringList(mEmergencyUrns);
out.writeInt(mEmergencyCallRouting); out.writeInt(mEmergencyCallRouting);
out.writeBoolean(mEmergencyCallTesting);
} }
private void readFromParcel(Parcel in) { private void readFromParcel(Parcel in) {
@@ -564,6 +569,7 @@ public final class ImsCallProfile implements Parcelable {
mEmergencyServiceCategories = in.readInt(); mEmergencyServiceCategories = in.readInt();
mEmergencyUrns = in.createStringArrayList(); mEmergencyUrns = in.createStringArrayList();
mEmergencyCallRouting = in.readInt(); mEmergencyCallRouting = in.readInt();
mEmergencyCallTesting = in.readBoolean();
} }
public static final Creator<ImsCallProfile> CREATOR = new Creator<ImsCallProfile>() { public static final Creator<ImsCallProfile> CREATOR = new Creator<ImsCallProfile>() {
@@ -784,9 +790,11 @@ public final class ImsCallProfile implements Parcelable {
* @hide * @hide
*/ */
public void setEmergencyCallInfo(EmergencyNumber num) { public void setEmergencyCallInfo(EmergencyNumber num) {
setEmergencyServiceCategories(num.getEmergencyServiceCategoryBitmask()); setEmergencyServiceCategories(num.getEmergencyServiceCategoryBitmaskInternalDial());
setEmergencyUrns(num.getEmergencyUrns()); setEmergencyUrns(num.getEmergencyUrns());
setEmergencyCallRouting(num.getEmergencyCallRouting()); setEmergencyCallRouting(num.getEmergencyCallRouting());
setEmergencyCallTesting(num.getEmergencyNumberSourceBitmask()
== EmergencyNumber.EMERGENCY_NUMBER_SOURCE_TEST);
} }
/** /**
@@ -842,6 +850,15 @@ public final class ImsCallProfile implements Parcelable {
mEmergencyCallRouting = emergencyCallRouting; mEmergencyCallRouting = emergencyCallRouting;
} }
/**
* Set if this is for testing emergency call, only valid if {@link #getServiceType} returns
* {@link #SERVICE_TYPE_EMERGENCY}.
*/
@VisibleForTesting
public void setEmergencyCallTesting(boolean isTesting) {
mEmergencyCallTesting = isTesting;
}
/** /**
* Get the emergency service categories, only valid if {@link #getServiceType} returns * Get the emergency service categories, only valid if {@link #getServiceType} returns
* {@link #SERVICE_TYPE_EMERGENCY} * {@link #SERVICE_TYPE_EMERGENCY}
@@ -892,4 +909,11 @@ public final class ImsCallProfile implements Parcelable {
public @EmergencyCallRouting int getEmergencyCallRouting() { public @EmergencyCallRouting int getEmergencyCallRouting() {
return mEmergencyCallRouting; return mEmergencyCallRouting;
} }
/**
* Get if the emergency call is for testing purpose.
*/
public boolean isEmergencyCallTesting() {
return mEmergencyCallTesting;
}
} }

View File

@@ -41,6 +41,7 @@ import android.telephony.ServiceState;
import android.telephony.SignalStrength; import android.telephony.SignalStrength;
import android.telephony.TelephonyHistogram; import android.telephony.TelephonyHistogram;
import android.telephony.VisualVoicemailSmsFilterSettings; import android.telephony.VisualVoicemailSmsFilterSettings;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.aidl.IImsCapabilityCallback; import android.telephony.ims.aidl.IImsCapabilityCallback;
import android.telephony.ims.aidl.IImsConfig; import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsConfigCallback; import android.telephony.ims.aidl.IImsConfigCallback;
@@ -1776,4 +1777,14 @@ interface ITelephony {
* Set the String provisioning value for the provisioning key specified. * Set the String provisioning value for the provisioning key specified.
*/ */
int setImsProvisioningString(int subId, int key, String value); int setImsProvisioningString(int subId, int key, String value);
/**
* Update Emergency Number List for Test Mode.
*/
void updateEmergencyNumberListTestMode(int action, in EmergencyNumber num);
/**
* Get the full emergency number list for Test Mode.
*/
List<String> getEmergencyNumberListTestMode();
} }