Update Telephony APIs for Cell Broadcast

Bug: 256043136
Test: atest CtsTelephonyTestCases
Test: manual
Change-Id: Ib1b149c5902c1615b6f1aa118c6f809c0486ff33
This commit is contained in:
Hui Wang
2022-12-05 14:58:27 -06:00
parent 3d0e4a42a9
commit 473ed52726
9 changed files with 352 additions and 3 deletions

View File

@@ -13080,6 +13080,17 @@ package android.telephony {
method @NonNull public java.util.List<android.telephony.CbGeoUtils.LatLng> getVertices();
}
public final class CellBroadcastIdRange implements android.os.Parcelable {
ctor public CellBroadcastIdRange(int, int, int, boolean) throws java.lang.IllegalArgumentException;
method public int describeContents();
method public int getEndId();
method public int getStartId();
method public int getType();
method public boolean isEnabled();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CellBroadcastIdRange> CREATOR;
}
public class CellBroadcastIntents {
method public static void sendSmsCbReceivedBroadcast(@NonNull android.content.Context, @Nullable android.os.UserHandle, @NonNull android.telephony.SmsCbMessage, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, int);
field public static final String ACTION_AREA_INFO_UPDATED = "android.telephony.action.AREA_INFO_UPDATED";
@@ -13639,10 +13650,10 @@ package android.telephony {
}
public final class SmsManager {
method public boolean disableCellBroadcastRange(int, int, int);
method public boolean enableCellBroadcastRange(int, int, int);
method @Deprecated public boolean disableCellBroadcastRange(int, int, int);
method @Deprecated public boolean enableCellBroadcastRange(int, int, int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getPremiumSmsConsent(@NonNull String);
method @RequiresPermission(android.Manifest.permission.MODIFY_CELL_BROADCASTS) public void resetAllCellBroadcastRanges();
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_CELL_BROADCASTS) public void resetAllCellBroadcastRanges();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void sendMultipartTextMessageWithoutPersisting(String, String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPremiumSmsConsent(@NonNull String, int);
field public static final int PREMIUM_SMS_CONSENT_ALWAYS_ALLOW = 3; // 0x3
@@ -13847,6 +13858,7 @@ package android.telephony {
method public String getCdmaPrlVersion();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCdmaRoamingMode();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCdmaSubscriptionMode();
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_CELL_BROADCASTS) public java.util.List<android.telephony.CellBroadcastIdRange> getCellBroadcastIdRanges();
method public int getCurrentPhoneType();
method public int getCurrentPhoneType(int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getDataActivationState();
@@ -13935,6 +13947,7 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setCarrierRestrictionRules(@NonNull android.telephony.CarrierRestrictionRules);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCdmaRoamingMode(int);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCdmaSubscriptionMode(int);
method @RequiresPermission(android.Manifest.permission.MODIFY_CELL_BROADCASTS) public void setCellBroadcastIdRanges(@NonNull java.util.List<android.telephony.CellBroadcastIdRange>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataActivationState(int);
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataEnabled(int, boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataRoamingEnabled(boolean);
@@ -13998,6 +14011,11 @@ package android.telephony {
field public static final int CDMA_SUBSCRIPTION_NV = 1; // 0x1
field public static final int CDMA_SUBSCRIPTION_RUIM_SIM = 0; // 0x0
field public static final int CDMA_SUBSCRIPTION_UNKNOWN = -1; // 0xffffffff
field public static final int CELLBROADCAST_RESULT_FAIL_ACTIVATION = 3; // 0x3
field public static final int CELLBROADCAST_RESULT_FAIL_CONFIG = 2; // 0x2
field public static final int CELLBROADCAST_RESULT_SUCCESS = 0; // 0x0
field public static final int CELLBROADCAST_RESULT_UNKNOWN = -1; // 0xffffffff
field public static final int CELLBROADCAST_RESULT_UNSUPPORTED = 1; // 0x1
field public static final int ENABLE_NR_DUAL_CONNECTIVITY_INVALID_STATE = 4; // 0x4
field public static final int ENABLE_NR_DUAL_CONNECTIVITY_NOT_SUPPORTED = 1; // 0x1
field public static final int ENABLE_NR_DUAL_CONNECTIVITY_RADIO_ERROR = 3; // 0x3

View File

@@ -501,6 +501,7 @@ applications that come with the platform
<permission name="android.permission.CAPTURE_MEDIA_OUTPUT" />
<permission name="android.permission.CAPTURE_TUNER_AUDIO_INPUT" />
<permission name="android.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT" />
<permission name="android.permission.MODIFY_CELL_BROADCASTS" />
</privapp-permissions>
<privapp-permissions package="com.android.statementservice">

View File

@@ -701,6 +701,7 @@
<!-- Permission required for CTS test - CtsTelephonyTestCases -->
<uses-permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE" />
<uses-permission android:name="android.permission.MODIFY_CELL_BROADCASTS" />
<!-- Permission required for CTS test - CtsPersistentDataBlockManagerTestCases -->
<uses-permission android:name="android.permission.ACCESS_PDB_STATE" />

View File

@@ -0,0 +1,19 @@
/*
* Copyright (c) 2022, 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;
parcelable CellBroadcastIdRange;

View File

@@ -0,0 +1,159 @@
/*
* Copyright (C) 2022 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.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.Objects;
/**
* Describes a particular cell broadcast message identifier range.
* @hide
*/
@SystemApi
public final class CellBroadcastIdRange implements Parcelable {
private int mStartId;
private int mEndId;
private int mType;
private boolean mIsEnabled;
/**
* Create a new CellBroacastRange
*
* @param startId first message identifier as specified in TS 23.041 (3GPP)
* or C.R1001-G (3GPP2)
* @param endId last message identifier as specified in TS 23.041 (3GPP)
* or C.R1001-G (3GPP2)
* @param type the message format as defined in {@link SmsCbMessage}
* @param isEnabled whether the range is enabled
*
* @throws IllegalArgumentException if endId < startId or invalid value
*/
public CellBroadcastIdRange(int startId, int endId,
@android.telephony.SmsCbMessage.MessageFormat int type, boolean isEnabled)
throws IllegalArgumentException {
if (startId < 0 || endId < 0) {
throw new IllegalArgumentException("invalid id");
}
if (endId < startId) {
throw new IllegalArgumentException("endId must be greater than or equal to startId");
}
mStartId = startId;
mEndId = endId;
mType = type;
mIsEnabled = isEnabled;
}
/**
* Return the first message identifier of this range as specified in TS 23.041 (3GPP)
* or C.R1001-G (3GPP2)
*/
public int getStartId() {
return mStartId;
}
/**
* Return the last message identifier of this range as specified in TS 23.041 (3GPP)
* or C.R1001-G (3GPP2)
*/
public int getEndId() {
return mEndId;
}
/**
* Return the message format of this range as defined in {@link SmsCbMessage}
*/
public @android.telephony.SmsCbMessage.MessageFormat int getType() {
return mType;
}
/**
* Return whether the range is enabled
*/
public boolean isEnabled() {
return mIsEnabled;
}
/**
* {@link Parcelable#writeToParcel}
*/
@Override
public void writeToParcel(@NonNull Parcel out, int flags) {
out.writeInt(mStartId);
out.writeInt(mEndId);
out.writeInt(mType);
out.writeBoolean(mIsEnabled);
}
/**
* {@link Parcelable.Creator}
*
*/
public static final @NonNull Parcelable.Creator<CellBroadcastIdRange> CREATOR =
new Creator<CellBroadcastIdRange>() {
@NonNull
@Override
public CellBroadcastIdRange createFromParcel(Parcel in) {
int startId = in.readInt();
int endId = in.readInt();
int type = in.readInt();
boolean isEnabled = in.readBoolean();
return new CellBroadcastIdRange(startId, endId, type, isEnabled);
}
@NonNull
@Override
public CellBroadcastIdRange[] newArray(int size) {
return new CellBroadcastIdRange[size];
}
};
/**
* {@link Parcelable#describeContents}
*/
@Override
public int describeContents() {
return 0;
}
@Override
public int hashCode() {
return Objects.hash(mStartId, mEndId, mType, mIsEnabled);
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof CellBroadcastIdRange)) {
return false;
}
CellBroadcastIdRange other = (CellBroadcastIdRange) obj;
return mStartId == other.mStartId && mEndId == other.mEndId && mType == other.mType
&& mIsEnabled == other.mIsEnabled;
}
@Override
public String toString() {
return "CellBroadcastIdRange[" + mStartId + ", " + mEndId + ", " + mType + ", "
+ mIsEnabled + "]";
}
}

View File

@@ -1914,8 +1914,10 @@ public final class SmsManager {
* @see #disableCellBroadcastRange(int, int, int)
*
* @throws IllegalArgumentException if endMessageId < startMessageId
* @deprecated Use {@link TelephonyManager#setCellBroadcastRanges} instead.
* {@hide}
*/
@Deprecated
@SystemApi
public boolean enableCellBroadcastRange(int startMessageId, int endMessageId,
@android.telephony.SmsCbMessage.MessageFormat int ranType) {
@@ -1974,8 +1976,10 @@ public final class SmsManager {
* @see #enableCellBroadcastRange(int, int, int)
*
* @throws IllegalArgumentException if endMessageId < startMessageId
* @deprecated Use {@link TelephonyManager#setCellBroadcastRanges} instead.
* {@hide}
*/
@Deprecated
@SystemApi
public boolean disableCellBroadcastRange(int startMessageId, int endMessageId,
@android.telephony.SmsCbMessage.MessageFormat int ranType) {
@@ -3374,8 +3378,10 @@ public final class SmsManager {
/**
* Reset all cell broadcast ranges. Previously enabled ranges will become invalid after this.
* @deprecated Use {@link TelephonyManager#resetAllCellBroadcastRanges} instead
* @hide
*/
@Deprecated
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_CELL_BROADCASTS)
public void resetAllCellBroadcastRanges() {

View File

@@ -17821,4 +17821,115 @@ public class TelephonyManager {
ex.rethrowFromSystemServer();
}
}
/**
* Get current cell broadcast message identifier ranges.
*
* @throws SecurityException if the caller does not have the required permission
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_CELL_BROADCASTS)
@NonNull
public List<CellBroadcastIdRange> getCellBroadcastIdRanges() {
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
return telephony.getCellBroadcastIdRanges(getSubId());
} else {
throw new IllegalStateException("telephony service is null.");
}
} catch (RemoteException ex) {
ex.rethrowFromSystemServer();
}
return new ArrayList<>();
}
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"CELLBROADCAST_RESULT_"}, value = {
CELLBROADCAST_RESULT_UNKNOWN,
CELLBROADCAST_RESULT_SUCCESS,
CELLBROADCAST_RESULT_UNSUPPORTED,
CELLBROADCAST_RESULT_FAIL_CONFIG,
CELLBROADCAST_RESULT_FAIL_ACTIVATION})
public @interface CellBroadcastResult {}
/**
* The result of the cell broadcast request is unknown
* @hide
*/
@SystemApi
public static final int CELLBROADCAST_RESULT_UNKNOWN = -1;
/**
* The cell broadcast request is successful.
* @hide
*/
@SystemApi
public static final int CELLBROADCAST_RESULT_SUCCESS = 0;
/**
* The cell broadcast request is not supported.
* @hide
*/
@SystemApi
public static final int CELLBROADCAST_RESULT_UNSUPPORTED = 1;
/**
* The cell broadcast request is failed due to the error to set config
* @hide
*/
@SystemApi
public static final int CELLBROADCAST_RESULT_FAIL_CONFIG = 2;
/**
* The cell broadcast request is failed due to the error to set activation
* @hide
*/
@SystemApi
public static final int CELLBROADCAST_RESULT_FAIL_ACTIVATION = 3;
/**
* Set reception of cell broadcast messages with the list of the given ranges
*
* <p>The ranges set previously will be overridden by the new one. Empty list
* can be used to clear the ranges.
*
* @param ranges the list of {@link CellBroadcastIdRange} to be set.
* @param executor The {@link Executor} that will be used to call the callback.
* @param callback A callback called on the supplied {@link Executor} to notify
* the result when the operation completes.
* @throws SecurityException if the caller does not have the required permission
* @throws IllegalArgumentException when the ranges are invalid.
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_CELL_BROADCASTS)
public void setCellBroadcastIdRanges(@NonNull List<CellBroadcastIdRange> ranges,
@NonNull @CallbackExecutor Executor executor,
@NonNull Consumer<Integer> callback) {
IIntegerConsumer consumer = callback == null ? null : new IIntegerConsumer.Stub() {
@Override
public void accept(int result) {
final long identity = Binder.clearCallingIdentity();
try {
executor.execute(() -> callback.accept(result));
} finally {
Binder.restoreCallingIdentity(identity);
}
}
};
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
telephony.setCellBroadcastIdRanges(getSubId(), ranges, consumer);
} else {
throw new IllegalStateException("telephony service is null.");
}
} catch (RemoteException ex) {
ex.rethrowFromSystemServer();
}
}
}

View File

@@ -35,6 +35,7 @@ import android.telephony.CallForwardingInfo;
import android.telephony.CarrierRestrictionRules;
import android.telephony.CellIdentity;
import android.telephony.CellInfo;
import android.telephony.CellBroadcastIdRange;
import android.telephony.ClientRequestStats;
import android.telephony.ThermalMitigationRequest;
import android.telephony.gba.UaSecurityProtocolIdentifier;
@@ -2658,4 +2659,15 @@ interface ITelephony {
* @hide
*/
boolean isNullCipherAndIntegrityPreferenceEnabled();
/**
* Get current broadcast ranges.
*/
List<CellBroadcastIdRange> getCellBroadcastIdRanges(int subId);
/**
* Set reception of cell broadcast messages with the list of the given ranges
*/
void setCellBroadcastIdRanges(int subId, in List<CellBroadcastIdRange> ranges,
IIntegerConsumer callback);
}

View File

@@ -16,6 +16,8 @@
package com.android.internal.telephony.gsm;
import java.util.Objects;
/**
* SmsBroadcastConfigInfo defines one configuration of Cell Broadcast
* Message (CBM) to be received by the ME
@@ -130,4 +132,24 @@ public final class SmsBroadcastConfigInfo {
mFromCodeScheme + ',' + mToCodeScheme + "] " +
(mSelected ? "ENABLED" : "DISABLED");
}
@Override
public int hashCode() {
return Objects.hash(mFromServiceId, mToServiceId,
mFromCodeScheme, mToCodeScheme, mSelected);
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof SmsBroadcastConfigInfo)) {
return false;
}
SmsBroadcastConfigInfo other = (SmsBroadcastConfigInfo) obj;
return mFromServiceId == other.mFromServiceId
&& mToServiceId == other.mToServiceId
&& mFromCodeScheme == other.mFromCodeScheme
&& mToCodeScheme == other.mToCodeScheme && mSelected == other.mSelected;
}
}