blob: bc53b628131ee18535083d9394c5cc4cdb75f3fa [file] [log] [blame]
/*
* 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.ims;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Provides the result to the update operation for the supplementary service configuration.
*
* Also supports IMS specific Incoming Communication Barring (ICB) as well as Anonymous
* Communication Rejection (ACR), as per 3GPP 24.611.
*
* @see Builder
* @hide
*/
@SystemApi
public final class ImsSsInfo implements Parcelable {
/**@hide*/
@IntDef(value = {
NOT_REGISTERED,
DISABLED,
ENABLED
})
@Retention(RetentionPolicy.SOURCE)
public @interface ServiceStatus {}
/**
* For the status of service registration or activation/deactivation.
*/
public static final int NOT_REGISTERED = (-1);
public static final int DISABLED = 0;
public static final int ENABLED = 1;
/**
* Provision status of service.
* @hide
*/
@IntDef(value = {
SERVICE_PROVISIONING_UNKNOWN,
SERVICE_NOT_PROVISIONED,
SERVICE_PROVISIONED
}, prefix = "SERVICE_")
@Retention(RetentionPolicy.SOURCE)
public @interface ServiceProvisionStatus {}
/**
* Unknown provision status for the service.
*/
public static final int SERVICE_PROVISIONING_UNKNOWN = (-1);
/**
* Service is not provisioned.
*/
public static final int SERVICE_NOT_PROVISIONED = 0;
/**
* Service is provisioned.
*/
public static final int SERVICE_PROVISIONED = 1;
/**@hide*/
@IntDef(value = {
CLIR_OUTGOING_DEFAULT,
CLIR_OUTGOING_INVOCATION,
CLIR_OUTGOING_SUPPRESSION
}, prefix = "CLIR_OUTGOING_")
@Retention(RetentionPolicy.SOURCE)
public @interface ClirOutgoingState {}
/**
* Calling line identification restriction (CLIR) is set to the default according to the
* subscription of the CLIR service.
*
* See TS 27.007, section 7.7 for more information.
*/
public static final int CLIR_OUTGOING_DEFAULT = 0;
/**
* Activate Calling line identification restriction for outgoing calls.
*
* See TS 27.007, section 7.7 for more information.
*/
public static final int CLIR_OUTGOING_INVOCATION = 1;
/**
* Deactivate Calling line identification restriction for outgoing calls.
*
* See TS 27.007, section 7.7 for more information.
*/
public static final int CLIR_OUTGOING_SUPPRESSION = 2;
/**
* Calling line identification restriction is currently not provisioned.
*
* See TS 27.007, section 7.7 for more information.
*/
public static final int CLIR_STATUS_NOT_PROVISIONED = 0;
/**
* Calling line identification restriction is currently provisioned in permanent mode.
*
* See TS 27.007, section 7.7 for more information.
*/
public static final int CLIR_STATUS_PROVISIONED_PERMANENT = 1;
/**
* Calling line identification restriction is currently unknown, e.g. no network, etc.
*
* See TS 27.007, section 7.7 for more information.
*/
public static final int CLIR_STATUS_UNKNOWN = 2;
/**
* Calling line identification restriction temporary mode, temporarily restricted.
*
* See TS 27.007, section 7.7 for more information.
*/
public static final int CLIR_STATUS_TEMPORARILY_RESTRICTED = 3;
/**
* Calling line identification restriction temporary mode, temporarily allowed.
*
* See TS 27.007, section 7.7 for more information.
*/
public static final int CLIR_STATUS_TEMPORARILY_ALLOWED = 4;
/**@hide*/
@IntDef(value = {
CLIR_STATUS_NOT_PROVISIONED,
CLIR_STATUS_PROVISIONED_PERMANENT,
CLIR_STATUS_UNKNOWN,
CLIR_STATUS_TEMPORARILY_RESTRICTED,
CLIR_STATUS_TEMPORARILY_ALLOWED
}, prefix = "CLIR_STATUS_")
@Retention(RetentionPolicy.SOURCE)
public @interface ClirInterrogationStatus {}
// 0: disabled, 1: enabled
/** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public int mStatus;
/** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public String mIcbNum;
/** @hide */
public int mProvisionStatus = SERVICE_PROVISIONING_UNKNOWN;
private int mClirInterrogationStatus = CLIR_STATUS_UNKNOWN;
private int mClirOutgoingState = CLIR_OUTGOING_DEFAULT;
/**@hide*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public ImsSsInfo() {
}
/**
* Builds {@link ImsSsInfo} instances, which may include optional parameters.
*/
public static final class Builder {
private final ImsSsInfo mImsSsInfo;
public Builder(@ServiceStatus int status) {
mImsSsInfo = new ImsSsInfo();
mImsSsInfo.mStatus = status;
}
/**
* Set the ICB number for IMS call barring.
* @param number The number in E.164 international format.
*/
public @NonNull Builder setIncomingCommunicationBarringNumber(@NonNull String number) {
mImsSsInfo.mIcbNum = number;
return this;
}
/**
* Set the provisioning status for a Supplementary Service interrogation response.
*/
public @NonNull Builder setProvisionStatus(@ServiceProvisionStatus int provisionStatus) {
mImsSsInfo.mProvisionStatus = provisionStatus;
return this;
}
/**
* Set the Calling Line Identification Restriction (CLIR) status for a supplementary service
* interrogation response.
*/
public @NonNull Builder setClirInterrogationStatus(@ClirInterrogationStatus int status) {
mImsSsInfo.mClirInterrogationStatus = status;
return this;
}
/**
* Set the Calling line identification Restriction (CLIR) state for outgoing calls.
*/
public @NonNull Builder setClirOutgoingState(@ClirOutgoingState int state) {
mImsSsInfo.mClirOutgoingState = state;
return this;
}
/**
* @return a built {@link ImsSsInfo} containing optional the parameters that were set.
*/
public @NonNull ImsSsInfo build() {
return mImsSsInfo;
}
}
/**
*
* @param status The status of the service registration of activation/deactiviation.
* @param icbNum The Incoming barring number.
* @deprecated use {@link ImsSsInfo.Builder} instead.
*/
@Deprecated
public ImsSsInfo(@ServiceStatus int status, @Nullable String icbNum) {
mStatus = status;
mIcbNum = icbNum;
}
private ImsSsInfo(Parcel in) {
readFromParcel(in);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mStatus);
out.writeString(mIcbNum);
out.writeInt(mProvisionStatus);
out.writeInt(mClirInterrogationStatus);
out.writeInt(mClirOutgoingState);
}
@NonNull
@Override
public String toString() {
return super.toString() + ", Status: " + ((mStatus == 0) ? "disabled" : "enabled")
+ ", ProvisionStatus: " + provisionStatusToString(mProvisionStatus);
}
private static String provisionStatusToString(int pStatus) {
switch (pStatus) {
case SERVICE_NOT_PROVISIONED:
return "Service not provisioned";
case SERVICE_PROVISIONED:
return "Service provisioned";
default:
return "Service provisioning unknown";
}
}
private void readFromParcel(Parcel in) {
mStatus = in.readInt();
mIcbNum = in.readString();
mProvisionStatus = in.readInt();
mClirInterrogationStatus = in.readInt();
mClirOutgoingState = in.readInt();
}
public static final @android.annotation.NonNull Creator<ImsSsInfo> CREATOR =
new Creator<ImsSsInfo>() {
@Override
public ImsSsInfo createFromParcel(Parcel in) {
return new ImsSsInfo(in);
}
@Override
public ImsSsInfo[] newArray(int size) {
return new ImsSsInfo[size];
}
};
/**
* @return Supplementary Service Configuration status.
*/
public @ServiceStatus int getStatus() {
return mStatus;
}
/** @deprecated Use {@link #getIncomingCommunicationBarringNumber()} instead.*/
@Deprecated
public String getIcbNum() {
return mIcbNum;
}
/**
* @return The Incoming Communication Barring (ICB) number.
*/
public @Nullable String getIncomingCommunicationBarringNumber() {
return mIcbNum;
}
/**
* @return Supplementary Service Provision status.
*/
public @ServiceProvisionStatus int getProvisionStatus() {
return mProvisionStatus;
}
/**
* @return the Calling Line Identification Restriction State for outgoing calls with respect to
* this subscription. Will be {@link #CLIR_OUTGOING_DEFAULT} if not applicable to this SS info.
*/
public @ClirOutgoingState int getClirOutgoingState() {
return mClirOutgoingState;
}
/**
* @return the calling line identification restriction provisioning status upon interrogation of
* the service for this subscription. Will be {@link #CLIR_STATUS_UNKNOWN} if not applicable to
* this SS info.
*/
public @ClirInterrogationStatus int getClirInterrogationStatus() {
return mClirInterrogationStatus;
}
/**
* Parts of telephony still use the old {m,n} 3GPP definition, so convert to that format.
* @hide
*/
public int[] getCompatArray(@ImsSsData.ServiceType int type) {
int[] result = new int[2];
// Convert ImsSsInfo into a form that telephony can read (as per 3GPP 27.007)
// CLIR (section 7.7)
if (type == ImsSsData.SS_CLIR) {
// Assume there will only be one ImsSsInfo.
// contains {"n","m"} parameters
result[0] = getClirOutgoingState();
result[1] = getClirInterrogationStatus();
return result;
}
// COLR 7.31
if (type == ImsSsData.SS_COLR) {
result[0] = getProvisionStatus();
}
// Facility Lock CLCK 7.4 (for call barring), CLIP 7.6, COLP 7.8, as well as any
// other result, just return the status for the "n" parameter and provisioning status for
// "m" as the default.
result[0] = getStatus();
result[1] = getProvisionStatus();
return result;
}
}