[5G] Implement Physical Channel Listener
To support the new listen event, use long instead of int for the new one then creat bitmask for old events. Bug: 162300897 Test: manual - 5g testing Change-Id: I002cb3579eb920ffc0b0a8dbf59e8d1153222411
This commit is contained in:
@@ -48366,7 +48366,8 @@ package android.telephony {
|
||||
method public boolean isVoiceCapable();
|
||||
method public boolean isVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle);
|
||||
method public boolean isWorldPhone();
|
||||
method public void listen(android.telephony.PhoneStateListener, int);
|
||||
method @Deprecated public void listen(android.telephony.PhoneStateListener, int);
|
||||
method public void listen(long, @NonNull android.telephony.PhoneStateListener);
|
||||
method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestCellInfoUpdate(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
|
||||
method @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.ACCESS_FINE_LOCATION}) public android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, java.util.concurrent.Executor, android.telephony.TelephonyScanManager.NetworkScanCallback);
|
||||
method public void sendDialerSpecialCode(String);
|
||||
|
||||
@@ -10818,6 +10818,7 @@ package android.telephony {
|
||||
method public void onCallAttributesChanged(@NonNull android.telephony.CallAttributes);
|
||||
method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber);
|
||||
method public void onOutgoingEmergencySms(@NonNull android.telephony.emergency.EmergencyNumber);
|
||||
method public void onPhysicalChannelConfigurationChanged(@NonNull java.util.List<android.telephony.PhysicalChannelConfig>);
|
||||
method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseCallStateChanged(@NonNull android.telephony.PreciseCallState);
|
||||
method public void onRadioPowerStateChanged(int);
|
||||
method public void onSrvccStateChanged(int);
|
||||
@@ -10825,12 +10826,29 @@ package android.telephony {
|
||||
field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_CALL_ATTRIBUTES_CHANGED = 67108864; // 0x4000000
|
||||
field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_CALL = 268435456; // 0x10000000
|
||||
field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_SMS = 536870912; // 0x20000000
|
||||
field @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public static final long LISTEN_PHYSICAL_CHANNEL_CONFIGURATION = 4294967296L; // 0x100000000L
|
||||
field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_PRECISE_CALL_STATE = 2048; // 0x800
|
||||
field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 8388608; // 0x800000
|
||||
field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_SRVCC_STATE_CHANGED = 16384; // 0x4000
|
||||
field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_VOICE_ACTIVATION_STATE = 131072; // 0x20000
|
||||
}
|
||||
|
||||
public final class PhysicalChannelConfig implements android.os.Parcelable {
|
||||
method public int describeContents();
|
||||
method public int getCellBandwidthDownlink();
|
||||
method public int getChannelNumber();
|
||||
method public int getConnectionStatus();
|
||||
method public int getNetworkType();
|
||||
method @IntRange(from=0, to=1007) public int getPhysicalCellId();
|
||||
method public void writeToParcel(@NonNull android.os.Parcel, int);
|
||||
field public static final int CHANNEL_NUMBER_UNKNOWN = -1; // 0xffffffff
|
||||
field public static final int CONNECTION_PRIMARY_SERVING = 1; // 0x1
|
||||
field public static final int CONNECTION_SECONDARY_SERVING = 2; // 0x2
|
||||
field public static final int CONNECTION_UNKNOWN = -1; // 0xffffffff
|
||||
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhysicalChannelConfig> CREATOR;
|
||||
field public static final int PHYSICAL_CELL_ID_UNKNOWN = -1; // 0xffffffff
|
||||
}
|
||||
|
||||
public final class PreciseCallState implements android.os.Parcelable {
|
||||
ctor public PreciseCallState(int, int, int, int, int);
|
||||
method public int describeContents();
|
||||
|
||||
@@ -486,6 +486,16 @@ public class PhoneStateListener {
|
||||
@RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE)
|
||||
public static final int LISTEN_BARRING_INFO = 0x80000000;
|
||||
|
||||
/**
|
||||
* Listen for changes to the physical channel configuration.
|
||||
*
|
||||
* @see #onPhysicalChannelConfigurationChanged
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
@RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE)
|
||||
public static final long LISTEN_PHYSICAL_CHANNEL_CONFIGURATION = 0x100000000L;
|
||||
|
||||
/*
|
||||
* Subscription used to listen to the phone state changes
|
||||
* @hide
|
||||
@@ -1114,6 +1124,18 @@ public class PhoneStateListener {
|
||||
// default implementation empty
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback invoked when the current physical channel configuration has changed
|
||||
*
|
||||
* @param configs List of the current {@link PhysicalChannelConfig}s
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public void onPhysicalChannelConfigurationChanged(
|
||||
@NonNull List<PhysicalChannelConfig> configs) {
|
||||
// default implementation empty
|
||||
}
|
||||
|
||||
/**
|
||||
* The callback methods need to be called on the handler thread where
|
||||
* this object was created. If the binder did that for us it'd be nice.
|
||||
@@ -1415,6 +1437,15 @@ public class PhoneStateListener {
|
||||
Binder.withCleanCallingIdentity(
|
||||
() -> mExecutor.execute(() -> psl.onBarringInfoChanged(barringInfo)));
|
||||
}
|
||||
|
||||
public void onPhysicalChannelConfigurationChanged(List<PhysicalChannelConfig> configs) {
|
||||
PhoneStateListener psl = mPhoneStateListenerWeakRef.get();
|
||||
if (psl == null) return;
|
||||
|
||||
Binder.withCleanCallingIdentity(
|
||||
() -> mExecutor.execute(
|
||||
() -> psl.onPhysicalChannelConfigurationChanged(configs)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -211,7 +211,7 @@ public class TelephonyRegistryManager {
|
||||
* @param notifyNow Whether to notify instantly
|
||||
*/
|
||||
public void listenForSubscriber(int subId, @NonNull String pkg, @NonNull String featureId,
|
||||
@NonNull PhoneStateListener listener, int events, boolean notifyNow) {
|
||||
@NonNull PhoneStateListener listener, long events, boolean notifyNow) {
|
||||
try {
|
||||
// subId from PhoneStateListener is deprecated Q on forward, use the subId from
|
||||
// TelephonyManager instance. Keep using subId from PhoneStateListener for pre-Q.
|
||||
@@ -754,4 +754,19 @@ public class TelephonyRegistryManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify {@link PhysicalChannelConfig} has changed for a specific subscription.
|
||||
*
|
||||
* @param subId the subId
|
||||
* @param configs a list of {@link PhysicalChannelConfig}, the configs of physical channel.
|
||||
*/
|
||||
public void notifyPhysicalChannelConfigurationForSubscriber(
|
||||
int subId, List<PhysicalChannelConfig> configs) {
|
||||
try {
|
||||
sRegistry.notifyPhysicalChannelConfigurationForSubscriber(subId, configs);
|
||||
} catch (RemoteException ex) {
|
||||
// system server crash
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import android.telephony.CellInfo;
|
||||
import android.telephony.DataConnectionRealTimeInfo;
|
||||
import android.telephony.TelephonyDisplayInfo;
|
||||
import android.telephony.PhoneCapability;
|
||||
import android.telephony.PhysicalChannelConfig;
|
||||
import android.telephony.PreciseCallState;
|
||||
import android.telephony.PreciseDataConnectionState;
|
||||
import android.telephony.ServiceState;
|
||||
@@ -68,4 +69,6 @@ oneway interface IPhoneStateListener {
|
||||
void onRegistrationFailed(in CellIdentity cellIdentity,
|
||||
String chosenPlmn, int domain, int causeCode, int additionalCauseCode);
|
||||
void onBarringInfoChanged(in BarringInfo barringInfo);
|
||||
void onPhysicalChannelConfigurationChanged(in List<PhysicalChannelConfig> configs);
|
||||
|
||||
}
|
||||
|
||||
@@ -47,10 +47,10 @@ interface ITelephonyRegistry {
|
||||
*/
|
||||
@UnsupportedAppUsage
|
||||
void listen(String pkg, IPhoneStateListener callback, int events, boolean notifyNow);
|
||||
void listenWithFeature(String pkg, String featureId, IPhoneStateListener callback, int events,
|
||||
void listenWithFeature(String pkg, String featureId, IPhoneStateListener callback, long events,
|
||||
boolean notifyNow);
|
||||
void listenForSubscriber(in int subId, String pkg, String featureId,
|
||||
IPhoneStateListener callback, int events, boolean notifyNow);
|
||||
IPhoneStateListener callback, long events, boolean notifyNow);
|
||||
@UnsupportedAppUsage
|
||||
void notifyCallStateForAllSubs(int state, String incomingNumber);
|
||||
void notifyCallState(in int phoneId, in int subId, int state, String incomingNumber);
|
||||
@@ -99,4 +99,6 @@ interface ITelephonyRegistry {
|
||||
void notifyRegistrationFailed(int slotIndex, int subId, in CellIdentity cellIdentity,
|
||||
String chosenPlmn, int domain, int causeCode, int additionalCauseCode);
|
||||
void notifyBarringInfoChanged(int slotIndex, int subId, in BarringInfo barringInfo);
|
||||
void notifyPhysicalChannelConfigurationForSubscriber(in int subId,
|
||||
in List<PhysicalChannelConfig> configs);
|
||||
}
|
||||
|
||||
@@ -46516,7 +46516,8 @@ package android.telephony {
|
||||
method public boolean isVoiceCapable();
|
||||
method public boolean isVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle);
|
||||
method public boolean isWorldPhone();
|
||||
method public void listen(android.telephony.PhoneStateListener, int);
|
||||
method @Deprecated public void listen(android.telephony.PhoneStateListener, int);
|
||||
method public void listen(long, @NonNull android.telephony.PhoneStateListener);
|
||||
method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestCellInfoUpdate(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
|
||||
method @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.ACCESS_FINE_LOCATION}) public android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, java.util.concurrent.Executor, android.telephony.TelephonyScanManager.NetworkScanCallback);
|
||||
method public void sendDialerSpecialCode(String);
|
||||
|
||||
@@ -9684,6 +9684,7 @@ package android.telephony {
|
||||
method public void onCallAttributesChanged(@NonNull android.telephony.CallAttributes);
|
||||
method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber);
|
||||
method public void onOutgoingEmergencySms(@NonNull android.telephony.emergency.EmergencyNumber);
|
||||
method public void onPhysicalChannelConfigurationChanged(@NonNull java.util.List<android.telephony.PhysicalChannelConfig>);
|
||||
method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseCallStateChanged(@NonNull android.telephony.PreciseCallState);
|
||||
method public void onRadioPowerStateChanged(int);
|
||||
method public void onSrvccStateChanged(int);
|
||||
@@ -9691,12 +9692,29 @@ package android.telephony {
|
||||
field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_CALL_ATTRIBUTES_CHANGED = 67108864; // 0x4000000
|
||||
field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_CALL = 268435456; // 0x10000000
|
||||
field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_SMS = 536870912; // 0x20000000
|
||||
field @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public static final long LISTEN_PHYSICAL_CHANNEL_CONFIGURATION = 4294967296L; // 0x100000000L
|
||||
field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_PRECISE_CALL_STATE = 2048; // 0x800
|
||||
field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 8388608; // 0x800000
|
||||
field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_SRVCC_STATE_CHANGED = 16384; // 0x4000
|
||||
field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_VOICE_ACTIVATION_STATE = 131072; // 0x20000
|
||||
}
|
||||
|
||||
public final class PhysicalChannelConfig implements android.os.Parcelable {
|
||||
method public int describeContents();
|
||||
method public int getCellBandwidthDownlink();
|
||||
method public int getChannelNumber();
|
||||
method public int getConnectionStatus();
|
||||
method public int getNetworkType();
|
||||
method @IntRange(from=0, to=1007) public int getPhysicalCellId();
|
||||
method public void writeToParcel(@NonNull android.os.Parcel, int);
|
||||
field public static final int CHANNEL_NUMBER_UNKNOWN = -1; // 0xffffffff
|
||||
field public static final int CONNECTION_PRIMARY_SERVING = 1; // 0x1
|
||||
field public static final int CONNECTION_SECONDARY_SERVING = 2; // 0x2
|
||||
field public static final int CONNECTION_UNKNOWN = -1; // 0xffffffff
|
||||
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhysicalChannelConfig> CREATOR;
|
||||
field public static final int PHYSICAL_CELL_ID_UNKNOWN = -1; // 0xffffffff
|
||||
}
|
||||
|
||||
public final class PreciseCallState implements android.os.Parcelable {
|
||||
ctor public PreciseCallState(int, int, int, int, int);
|
||||
method public int describeContents();
|
||||
|
||||
@@ -64,6 +64,7 @@ import android.telephony.DisconnectCause;
|
||||
import android.telephony.LocationAccessPolicy;
|
||||
import android.telephony.PhoneCapability;
|
||||
import android.telephony.PhoneStateListener;
|
||||
import android.telephony.PhysicalChannelConfig;
|
||||
import android.telephony.PreciseCallState;
|
||||
import android.telephony.PreciseDataConnectionState;
|
||||
import android.telephony.PreciseDisconnectCause;
|
||||
@@ -142,13 +143,13 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
int callerUid;
|
||||
int callerPid;
|
||||
|
||||
int events;
|
||||
long events;
|
||||
|
||||
int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
||||
|
||||
int phoneId = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
|
||||
|
||||
boolean matchPhoneStateListenerEvent(int events) {
|
||||
boolean matchPhoneStateListenerEvent(long events) {
|
||||
return (callback != null) && ((events & this.events) != 0);
|
||||
}
|
||||
|
||||
@@ -177,7 +178,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
+ onSubscriptionsChangedListenerCallback
|
||||
+ " onOpportunisticSubscriptionsChangedListenererCallback="
|
||||
+ onOpportunisticSubscriptionsChangedListenerCallback + " subId=" + subId
|
||||
+ " phoneId=" + phoneId + " events=" + Integer.toHexString(events) + "}";
|
||||
+ " phoneId=" + phoneId + " events=" + Long.toHexString(events) + "}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,6 +307,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
|
||||
private final LocalLog mListenLog = new LocalLog(00);
|
||||
|
||||
private List<PhysicalChannelConfig> mPhysicalChannelConfigs;
|
||||
|
||||
/**
|
||||
* Per-phone map of precise data connection state. The key of the map is the pair of transport
|
||||
* type and APN setting. This is the cache to prevent redundant callbacks to the listeners.
|
||||
@@ -318,19 +321,19 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
// Starting in Q, almost all cellular location requires FINE location enforcement.
|
||||
// Prior to Q, cellular was available with COARSE location enforcement. Bits in this
|
||||
// list will be checked for COARSE on apps targeting P or earlier and FINE on Q or later.
|
||||
static final int ENFORCE_LOCATION_PERMISSION_MASK =
|
||||
static final long ENFORCE_LOCATION_PERMISSION_MASK =
|
||||
PhoneStateListener.LISTEN_CELL_LOCATION
|
||||
| PhoneStateListener.LISTEN_CELL_INFO
|
||||
| PhoneStateListener.LISTEN_REGISTRATION_FAILURE
|
||||
| PhoneStateListener.LISTEN_BARRING_INFO;
|
||||
|
||||
static final int ENFORCE_PHONE_STATE_PERMISSION_MASK =
|
||||
static final long ENFORCE_PHONE_STATE_PERMISSION_MASK =
|
||||
PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR
|
||||
| PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
|
||||
| PhoneStateListener.LISTEN_EMERGENCY_NUMBER_LIST
|
||||
| PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED;
|
||||
|
||||
static final int ENFORCE_PRECISE_PHONE_STATE_PERMISSION_MASK =
|
||||
static final long ENFORCE_PRECISE_PHONE_STATE_PERMISSION_MASK =
|
||||
PhoneStateListener.LISTEN_PRECISE_CALL_STATE
|
||||
| PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE
|
||||
| PhoneStateListener.LISTEN_CALL_DISCONNECT_CAUSES
|
||||
@@ -339,11 +342,11 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
| PhoneStateListener.LISTEN_REGISTRATION_FAILURE
|
||||
| PhoneStateListener.LISTEN_BARRING_INFO;
|
||||
|
||||
static final int READ_ACTIVE_EMERGENCY_SESSION_PERMISSION_MASK =
|
||||
static final long READ_ACTIVE_EMERGENCY_SESSION_PERMISSION_MASK =
|
||||
PhoneStateListener.LISTEN_OUTGOING_EMERGENCY_CALL
|
||||
| PhoneStateListener.LISTEN_OUTGOING_EMERGENCY_SMS;
|
||||
|
||||
static final int READ_PRIVILEGED_PHONE_STATE_PERMISSION_MASK =
|
||||
static final long READ_PRIVILEGED_PHONE_STATE_PERMISSION_MASK =
|
||||
PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT
|
||||
| PhoneStateListener.LISTEN_SRVCC_STATE_CHANGED
|
||||
| PhoneStateListener.LISTEN_RADIO_POWER_STATE_CHANGED
|
||||
@@ -495,6 +498,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
cutListToSize(mImsReasonInfo, mNumPhones);
|
||||
cutListToSize(mPreciseDataConnectionStates, mNumPhones);
|
||||
cutListToSize(mBarringInfo, mNumPhones);
|
||||
cutListToSize(mPhysicalChannelConfigs, mNumPhones);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -528,6 +532,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
mPreciseDataConnectionStates.add(new ArrayMap<>());
|
||||
mBarringInfo.add(i, new BarringInfo());
|
||||
mTelephonyDisplayInfos[i] = null;
|
||||
mPhysicalChannelConfigs.add(i, new PhysicalChannelConfig(
|
||||
PhysicalChannelConfig.CONNECTION_UNKNOWN,0));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -588,6 +594,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
mOutgoingSmsEmergencyNumber = new EmergencyNumber[numPhones];
|
||||
mBarringInfo = new ArrayList<>();
|
||||
mTelephonyDisplayInfos = new TelephonyDisplayInfo[numPhones];
|
||||
mPhysicalChannelConfigs = new ArrayList<>();
|
||||
for (int i = 0; i < numPhones; i++) {
|
||||
mCallState[i] = TelephonyManager.CALL_STATE_IDLE;
|
||||
mDataActivity[i] = TelephonyManager.DATA_ACTIVITY_NONE;
|
||||
@@ -617,6 +624,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
mPreciseDataConnectionStates.add(new ArrayMap<>());
|
||||
mBarringInfo.add(i, new BarringInfo());
|
||||
mTelephonyDisplayInfos[i] = null;
|
||||
mPhysicalChannelConfigs.add(i, new PhysicalChannelConfig(
|
||||
PhysicalChannelConfig.CONNECTION_UNKNOWN,0));
|
||||
}
|
||||
|
||||
mAppOps = mContext.getSystemService(AppOpsManager.class);
|
||||
@@ -795,23 +804,23 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
|
||||
@Override
|
||||
public void listenWithFeature(String callingPackage, String callingFeatureId,
|
||||
IPhoneStateListener callback, int events, boolean notifyNow) {
|
||||
IPhoneStateListener callback, long events, boolean notifyNow) {
|
||||
listenForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, callingPackage,
|
||||
callingFeatureId, callback, events, notifyNow);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void listenForSubscriber(int subId, String callingPackage, String callingFeatureId,
|
||||
IPhoneStateListener callback, int events, boolean notifyNow) {
|
||||
IPhoneStateListener callback, long events, boolean notifyNow) {
|
||||
listen(callingPackage, callingFeatureId, callback, events, notifyNow, subId);
|
||||
}
|
||||
|
||||
private void listen(String callingPackage, @Nullable String callingFeatureId,
|
||||
IPhoneStateListener callback, int events, boolean notifyNow, int subId) {
|
||||
IPhoneStateListener callback, long events, boolean notifyNow, int subId) {
|
||||
int callerUserId = UserHandle.getCallingUserId();
|
||||
mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
|
||||
String str = "listen: E pkg=" + pii(callingPackage) + " uid=" + Binder.getCallingUid()
|
||||
+ " events=0x" + Integer.toHexString(events) + " notifyNow=" + notifyNow + " subId="
|
||||
+ " events=0x" + Long.toHexString(events) + " notifyNow=" + notifyNow + " subId="
|
||||
+ subId + " myUserId=" + UserHandle.myUserId() + " callerUserId=" + callerUserId;
|
||||
mListenLog.log(str);
|
||||
if (VDBG) {
|
||||
@@ -1098,6 +1107,14 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
remove(r.binder);
|
||||
}
|
||||
}
|
||||
if ((events & PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION) != 0) {
|
||||
try {
|
||||
r.callback.onPhysicalChannelConfigurationChanged(
|
||||
mPhysicalChannelConfigs);
|
||||
} catch (RemoteException ex) {
|
||||
remove(r.binder);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -2258,6 +2275,47 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a notification to registrants that the configs of physical channel has changed for
|
||||
* a particular subscription.
|
||||
*
|
||||
* @param subId the subId
|
||||
* @param configs a list of {@link PhysicalChannelConfig}, the configs of physical channel.
|
||||
*/
|
||||
public void notifyPhysicalChannelConfigurationForSubscriber(
|
||||
int subId, List<PhysicalChannelConfig> configs) {
|
||||
if (!checkNotifyPermission("notifyPhysicalChannelConfiguration()")) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (VDBG) {
|
||||
log("notifyPhysicalChannelConfiguration: subId=" + subId + " configs=" + configs);
|
||||
}
|
||||
|
||||
synchronized (mRecords) {
|
||||
int phoneId = SubscriptionManager.getPhoneId(subId);
|
||||
if (validatePhoneId(phoneId)) {
|
||||
mPhysicalChannelConfigs.set(phoneId, configs.get(phoneId));
|
||||
for (Record r : mRecords) {
|
||||
if (r.matchPhoneStateListenerEvent(
|
||||
PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION)
|
||||
&& idMatch(r.subId, subId, phoneId)) {
|
||||
try {
|
||||
if (DBG_LOC) {
|
||||
log("notifyPhysicalChannelConfiguration: "
|
||||
+ "mPhysicalChannelConfigs="
|
||||
+ configs + " r=" + r);
|
||||
}
|
||||
r.callback.onPhysicalChannelConfigurationChanged(configs);
|
||||
} catch (RemoteException ex) {
|
||||
mRemoveList.add(r.binder);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
handleRemoveListLocked();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
|
||||
@@ -2310,6 +2368,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
pw.println("mEmergencyNumberList=" + mEmergencyNumberList);
|
||||
pw.println("mDefaultPhoneId=" + mDefaultPhoneId);
|
||||
pw.println("mDefaultSubId=" + mDefaultSubId);
|
||||
pw.println("mPhysicalChannelConfigs=" + mPhysicalChannelConfigs);
|
||||
|
||||
pw.decreaseIndent();
|
||||
|
||||
@@ -2536,7 +2595,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
== PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
private boolean checkListenerPermission(int events, int subId, String callingPackage,
|
||||
private boolean checkListenerPermission(long events, int subId, String callingPackage,
|
||||
@Nullable String callingFeatureId, String message) {
|
||||
LocationAccessPolicy.LocationPermissionQuery.Builder locationQueryBuilder =
|
||||
new LocationAccessPolicy.LocationPermissionQuery.Builder()
|
||||
@@ -2742,7 +2801,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
}
|
||||
|
||||
private void checkPossibleMissNotify(Record r, int phoneId) {
|
||||
int events = r.events;
|
||||
long events = r.events;
|
||||
|
||||
if ((events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) {
|
||||
try {
|
||||
|
||||
@@ -291,6 +291,22 @@ package android.telephony {
|
||||
method public static boolean isVoiceMailNumber(@NonNull android.content.Context, int, @Nullable String);
|
||||
}
|
||||
|
||||
public final class PhysicalChannelConfig implements android.os.Parcelable {
|
||||
method public int describeContents();
|
||||
method public int getCellBandwidthDownlink();
|
||||
method public int getChannelNumber();
|
||||
method public int getConnectionStatus();
|
||||
method public int getNetworkType();
|
||||
method @IntRange(from=0, to=1007) public int getPhysicalCellId();
|
||||
method public void writeToParcel(@NonNull android.os.Parcel, int);
|
||||
field public static final int CHANNEL_NUMBER_UNKNOWN = -1; // 0xffffffff
|
||||
field public static final int CONNECTION_PRIMARY_SERVING = 1; // 0x1
|
||||
field public static final int CONNECTION_SECONDARY_SERVING = 2; // 0x2
|
||||
field public static final int CONNECTION_UNKNOWN = -1; // 0xffffffff
|
||||
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhysicalChannelConfig> CREATOR;
|
||||
field public static final int PHYSICAL_CELL_ID_UNKNOWN = -1; // 0xffffffff
|
||||
}
|
||||
|
||||
public final class PreciseCallState implements android.os.Parcelable {
|
||||
ctor public PreciseCallState(int, int, int, int, int);
|
||||
method public int describeContents();
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
package android.telephony;
|
||||
|
||||
import android.annotation.IntDef;
|
||||
import android.annotation.IntRange;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.SystemApi;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.telephony.Annotation.NetworkType;
|
||||
@@ -29,9 +32,11 @@ import java.util.Objects;
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public final class PhysicalChannelConfig implements Parcelable {
|
||||
|
||||
// TODO(b/72993578) consolidate these enums in a central location.
|
||||
/** @hide */
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({CONNECTION_PRIMARY_SERVING, CONNECTION_SECONDARY_SERVING, CONNECTION_UNKNOWN})
|
||||
public @interface ConnectionStatus {}
|
||||
@@ -47,7 +52,13 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
public static final int CONNECTION_SECONDARY_SERVING = 2;
|
||||
|
||||
/** Connection status is unknown. */
|
||||
public static final int CONNECTION_UNKNOWN = Integer.MAX_VALUE;
|
||||
public static final int CONNECTION_UNKNOWN = -1;
|
||||
|
||||
/** Channel number is unknown. */
|
||||
public static final int CHANNEL_NUMBER_UNKNOWN = -1;
|
||||
|
||||
/** Physical Cell Id is unknown. */
|
||||
public static final int PHYSICAL_CELL_ID_UNKNOWN = -1;
|
||||
|
||||
/**
|
||||
* Connection status of the cell.
|
||||
@@ -75,7 +86,7 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
private int mFrequencyRange;
|
||||
|
||||
/**
|
||||
* The absolute radio frequency channel number, {@link Integer#MAX_VALUE} if unknown.
|
||||
* The absolute radio frequency channel number, {@link CHANNEL_NUMBER_UNKNOWN} if unknown.
|
||||
*/
|
||||
private int mChannelNumber;
|
||||
|
||||
@@ -86,7 +97,8 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
private int[] mContextIds;
|
||||
|
||||
/**
|
||||
* The physical cell identifier for this cell - PCI, PSC, {@link Integer#MAX_VALUE} if known.
|
||||
* The physical cell identifier for this cell - PCI, PSC, {@link PHYSICAL_CELL_ID_UNKNOWN}
|
||||
* if unknown.
|
||||
*/
|
||||
private int mPhysicalCellId;
|
||||
|
||||
@@ -96,7 +108,7 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||||
dest.writeInt(mCellConnectionStatus);
|
||||
dest.writeInt(mCellBandwidthDownlinkKhz);
|
||||
dest.writeInt(mRat);
|
||||
@@ -120,6 +132,7 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
* physical channel has no data call mapped to it.
|
||||
*
|
||||
* @return an integer list indicates the data call ids.
|
||||
* @hide
|
||||
*/
|
||||
public int[] getContextIds() {
|
||||
return mContextIds;
|
||||
@@ -131,6 +144,7 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
* @see {@link ServiceState#FREQUENCY_RANGE_MID}
|
||||
* @see {@link ServiceState#FREQUENCY_RANGE_HIGH}
|
||||
* @see {@link ServiceState#FREQUENCY_RANGE_MMWAVE}
|
||||
* @hide
|
||||
*/
|
||||
@ServiceState.FrequencyRange
|
||||
public int getFrequencyRange() {
|
||||
@@ -139,7 +153,7 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
|
||||
/**
|
||||
* @return the absolute radio frequency channel number for this physical channel,
|
||||
* {@link Integer#MAX_VALUE} if unknown.
|
||||
* {@link CHANNEL_NUMBER_UNKNOWN} if unknown.
|
||||
*/
|
||||
public int getChannelNumber() {
|
||||
return mChannelNumber;
|
||||
@@ -152,18 +166,20 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
* In EUTRAN, this value is physical layer cell identity. The range is [0, 503].
|
||||
* Reference: 3GPP TS 36.211 section 6.11.
|
||||
*
|
||||
* In 5G RAN, this value is physical layer cell identity. The range is [0, 1008].
|
||||
* In 5G RAN, this value is physical layer cell identity. The range is [0, 1007].
|
||||
* Reference: 3GPP TS 38.211 section 7.4.2.1.
|
||||
*
|
||||
* @return the physical cell identifier for this cell, {@link Integer#MAX_VALUE} if unknown.
|
||||
* @return the physical cell identifier for this cell, {@link PHYSICAL_CELL_ID_UNKNOWN}
|
||||
* if {@link android.telephony.CellInfo#UNAVAILABLE}.
|
||||
*/
|
||||
@IntRange(from = 0, to = 1007)
|
||||
public int getPhysicalCellId() {
|
||||
return mPhysicalCellId;
|
||||
}
|
||||
|
||||
/**The radio technology for this physical channel. */
|
||||
@NetworkType
|
||||
public int getRat() {
|
||||
public int getNetworkType() {
|
||||
return mRat;
|
||||
}
|
||||
|
||||
@@ -181,7 +197,10 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
return mCellConnectionStatus;
|
||||
}
|
||||
|
||||
/** @return String representation of the connection status */
|
||||
/**
|
||||
* @return String representation of the connection status
|
||||
* @hide
|
||||
*/
|
||||
private String getConnectionStatusString() {
|
||||
switch(mCellConnectionStatus) {
|
||||
case CONNECTION_PRIMARY_SERVING:
|
||||
@@ -254,6 +273,12 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
.toString();
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public PhysicalChannelConfig(int status, int bandwidth) {
|
||||
mCellConnectionStatus = status;
|
||||
mCellBandwidthDownlinkKhz = bandwidth;
|
||||
}
|
||||
|
||||
private PhysicalChannelConfig(Parcel in) {
|
||||
mCellConnectionStatus = in.readInt();
|
||||
mCellBandwidthDownlinkKhz = in.readInt();
|
||||
@@ -274,7 +299,10 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
mPhysicalCellId = builder.mPhysicalCellId;
|
||||
}
|
||||
|
||||
/** The builder of {@code PhysicalChannelConfig}. */
|
||||
/**
|
||||
* The builder of {@code PhysicalChannelConfig}.
|
||||
* @hide
|
||||
*/
|
||||
public static final class Builder {
|
||||
private int mRat;
|
||||
private int mFrequencyRange;
|
||||
@@ -284,60 +312,51 @@ public final class PhysicalChannelConfig implements Parcelable {
|
||||
private int[] mContextIds;
|
||||
private int mPhysicalCellId;
|
||||
|
||||
/** @hide */
|
||||
public Builder() {
|
||||
mRat = ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN;
|
||||
mFrequencyRange = ServiceState.FREQUENCY_RANGE_UNKNOWN;
|
||||
mChannelNumber = Integer.MAX_VALUE;
|
||||
mChannelNumber = CHANNEL_NUMBER_UNKNOWN;
|
||||
mCellBandwidthDownlinkKhz = 0;
|
||||
mCellConnectionStatus = CONNECTION_UNKNOWN;
|
||||
mContextIds = new int[0];
|
||||
mPhysicalCellId = Integer.MAX_VALUE;
|
||||
mPhysicalCellId = PHYSICAL_CELL_ID_UNKNOWN;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public PhysicalChannelConfig build() {
|
||||
return new PhysicalChannelConfig(this);
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public Builder setRat(int rat) {
|
||||
this.mRat = rat;
|
||||
return this;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public Builder setFrequencyRange(int frequencyRange) {
|
||||
this.mFrequencyRange = frequencyRange;
|
||||
return this;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public Builder setChannelNumber(int channelNumber) {
|
||||
this.mChannelNumber = channelNumber;
|
||||
return this;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public Builder setCellBandwidthDownlinkKhz(int cellBandwidthDownlinkKhz) {
|
||||
this.mCellBandwidthDownlinkKhz = cellBandwidthDownlinkKhz;
|
||||
return this;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public Builder setCellConnectionStatus(int connectionStatus) {
|
||||
this.mCellConnectionStatus = connectionStatus;
|
||||
return this;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public Builder setContextIds(int[] contextIds) {
|
||||
if (contextIds != null) Arrays.sort(contextIds);
|
||||
this.mContextIds = contextIds;
|
||||
return this;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public Builder setPhysicalCellId(int physicalCellId) {
|
||||
this.mPhysicalCellId = physicalCellId;
|
||||
return this;
|
||||
|
||||
@@ -5555,8 +5555,51 @@ public class TelephonyManager {
|
||||
* @param events The telephony state(s) of interest to the listener,
|
||||
* as a bitwise-OR combination of {@link PhoneStateListener}
|
||||
* LISTEN_ flags.
|
||||
* @deprecated use {@link #listen(long, PhoneStateListener) instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public void listen(PhoneStateListener listener, int events) {
|
||||
listen(events, listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Since the limit of {@link PhoneStateListener} LISTEN_ flags is exceeded, use long type to
|
||||
* extend it.
|
||||
*
|
||||
* Registers a listener object to receive notification of changes
|
||||
* in specified telephony states.
|
||||
* <p>
|
||||
* To register a listener, pass a {@link PhoneStateListener} and specify at least one telephony
|
||||
* state of interest in the events argument.
|
||||
*
|
||||
* At registration, and when a specified telephony state changes, the telephony manager invokes
|
||||
* the appropriate callback method on the listener object and passes the current (updated)
|
||||
* values.
|
||||
* <p>
|
||||
* To un-register a listener, pass the listener object and set the events argument to
|
||||
* {@link PhoneStateListener#LISTEN_NONE LISTEN_NONE} (0).
|
||||
*
|
||||
* If this TelephonyManager object has been created with {@link #createForSubscriptionId},
|
||||
* applies to the given subId. Otherwise, applies to
|
||||
* {@link SubscriptionManager#getDefaultSubscriptionId()}. To listen events for multiple subIds,
|
||||
* pass a separate listener object to each TelephonyManager object created with
|
||||
* {@link #createForSubscriptionId}.
|
||||
*
|
||||
* Note: if you call this method while in the middle of a binder transaction, you <b>must</b>
|
||||
* call {@link android.os.Binder#clearCallingIdentity()} before calling this method. A
|
||||
* {@link SecurityException} will be thrown otherwise.
|
||||
*
|
||||
* This API should be used sparingly -- large numbers of listeners will cause system
|
||||
* instability. If a process has registered too many listeners without unregistering them, it
|
||||
* may encounter an {@link IllegalStateException} when trying to register more listeners.
|
||||
*
|
||||
* @param events The telephony state(s) of interest to the listener,
|
||||
* as a bitwise-OR combination of {@link PhoneStateListener}
|
||||
* LISTEN_ flags.
|
||||
* @param listener The {@link PhoneStateListener} object to register
|
||||
* (or unregister)
|
||||
*/
|
||||
public void listen(long events, @NonNull PhoneStateListener listener) {
|
||||
if (mContext == null) return;
|
||||
boolean notifyNow = (getITelephony() != null);
|
||||
TelephonyRegistryManager telephonyRegistry =
|
||||
|
||||
Reference in New Issue
Block a user