diff options
6 files changed, 125 insertions, 1 deletions
diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java index bce51f297aff..1df3b4332754 100644 --- a/core/java/android/telephony/PhoneStateListener.java +++ b/core/java/android/telephony/PhoneStateListener.java @@ -37,6 +37,7 @@ import android.telephony.TelephonyManager.EmergencyCallbackModeType; import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.ImsReasonInfo; import android.telephony.ims.MediaQualityStatus; +import android.telephony.satellite.NtnSignalStrength; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.IPhoneStateListener; @@ -1706,6 +1707,11 @@ public class PhoneStateListener { @NetworkRegistrationInfo.ServiceType int[] availableServices) { // not supported on the deprecated interface - Use TelephonyCallback instead } + + public final void onCarrierRoamingNtnSignalStrengthChanged( + @NonNull NtnSignalStrength ntnSignalStrength) { + // not supported on the deprecated interface - Use TelephonyCallback instead + } } private void log(String s) { diff --git a/core/java/android/telephony/TelephonyCallback.java b/core/java/android/telephony/TelephonyCallback.java index 64a5533cbe69..0d1dc4611343 100644 --- a/core/java/android/telephony/TelephonyCallback.java +++ b/core/java/android/telephony/TelephonyCallback.java @@ -30,6 +30,7 @@ import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.ImsReasonInfo; import android.telephony.ims.MediaQualityStatus; import android.telephony.ims.MediaThreshold; +import android.telephony.satellite.NtnSignalStrength; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; @@ -695,6 +696,15 @@ public class TelephonyCallback { public static final int EVENT_CARRIER_ROAMING_NTN_AVAILABLE_SERVICES_CHANGED = 44; /** + * Event for listening to carrier roaming non-terrestrial network signal strength changes. + * + * @see CarrierRoamingNtnModeListener + * + * @hide + */ + public static final int EVENT_CARRIER_ROAMING_NTN_SIGNAL_STRENGTH_CHANGED = 45; + + /** * @hide */ @IntDef(prefix = {"EVENT_"}, value = { @@ -741,7 +751,8 @@ public class TelephonyCallback { EVENT_SIMULTANEOUS_CELLULAR_CALLING_SUBSCRIPTIONS_CHANGED, EVENT_CARRIER_ROAMING_NTN_MODE_CHANGED, EVENT_CARRIER_ROAMING_NTN_ELIGIBLE_STATE_CHANGED, - EVENT_CARRIER_ROAMING_NTN_AVAILABLE_SERVICES_CHANGED + EVENT_CARRIER_ROAMING_NTN_AVAILABLE_SERVICES_CHANGED, + EVENT_CARRIER_ROAMING_NTN_SIGNAL_STRENGTH_CHANGED }) @Retention(RetentionPolicy.SOURCE) public @interface TelephonyEvent { @@ -1805,6 +1816,14 @@ public class TelephonyCallback { */ default void onCarrierRoamingNtnAvailableServicesChanged( @NetworkRegistrationInfo.ServiceType List<Integer> availableServices) {} + + /** + * Callback invoked when carrier roaming non-terrestrial network signal strength changes. + * + * @param ntnSignalStrength non-terrestrial network signal strength. + */ + default void onCarrierRoamingNtnSignalStrengthChanged( + @NonNull NtnSignalStrength ntnSignalStrength) {} } /** @@ -2270,5 +2289,18 @@ public class TelephonyCallback { Binder.withCleanCallingIdentity(() -> mExecutor.execute( () -> listener.onCarrierRoamingNtnAvailableServicesChanged(ServiceList))); } + + public void onCarrierRoamingNtnSignalStrengthChanged( + @NonNull NtnSignalStrength ntnSignalStrength) { + if (!Flags.carrierRoamingNbIotNtn()) return; + + CarrierRoamingNtnModeListener listener = + (CarrierRoamingNtnModeListener) mTelephonyCallbackWeakRef.get(); + if (listener == null) return; + + Binder.withCleanCallingIdentity(() -> mExecutor.execute( + () -> listener.onCarrierRoamingNtnSignalStrengthChanged(ntnSignalStrength))); + + } } } diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java index 1dab2cf75594..90b0bb34c145 100644 --- a/core/java/android/telephony/TelephonyRegistryManager.java +++ b/core/java/android/telephony/TelephonyRegistryManager.java @@ -47,6 +47,7 @@ import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.ImsCallSession; import android.telephony.ims.ImsReasonInfo; import android.telephony.ims.MediaQualityStatus; +import android.telephony.satellite.NtnSignalStrength; import android.telephony.satellite.SatelliteStateChangeListener; import android.util.ArrayMap; import android.util.ArraySet; @@ -1137,6 +1138,23 @@ public class TelephonyRegistryManager { } /** + * Notify external listeners that carrier roaming non-terrestrial network + * signal strength changed. + * @param subId subscription ID. + * @param ntnSignalStrength non-terrestrial network signal strength. + * @hide + */ + public final void notifyCarrierRoamingNtnSignalStrengthChanged(int subId, + @NonNull NtnSignalStrength ntnSignalStrength) { + try { + sRegistry.notifyCarrierRoamingNtnSignalStrengthChanged(subId, ntnSignalStrength); + } catch (RemoteException ex) { + // system server crash + throw ex.rethrowFromSystemServer(); + } + } + + /** * Processes potential event changes from the provided {@link TelephonyCallback}. * * @param telephonyCallback callback for monitoring callback changes to the telephony state. @@ -1293,6 +1311,7 @@ public class TelephonyRegistryManager { eventList.add(TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_MODE_CHANGED); eventList.add(TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_ELIGIBLE_STATE_CHANGED); eventList.add(TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_AVAILABLE_SERVICES_CHANGED); + eventList.add(TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_SIGNAL_STRENGTH_CHANGED); } return eventList; } diff --git a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl index b5c87868af12..0e85e046e1b6 100644 --- a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -27,6 +27,7 @@ import android.telephony.PhoneCapability; import android.telephony.PhysicalChannelConfig; import android.telephony.PreciseCallState; import android.telephony.PreciseDataConnectionState; +import android.telephony.satellite.NtnSignalStrength; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.emergency.EmergencyNumber; @@ -85,4 +86,5 @@ oneway interface IPhoneStateListener { void onCarrierRoamingNtnModeChanged(in boolean active); void onCarrierRoamingNtnEligibleStateChanged(in boolean eligible); void onCarrierRoamingNtnAvailableServicesChanged(in int[] availableServices); + void onCarrierRoamingNtnSignalStrengthChanged(in NtnSignalStrength ntnSignalStrength); } diff --git a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 1c76a6cd4bba..0f268d5de62b 100644 --- a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -29,6 +29,7 @@ import android.telephony.ims.ImsReasonInfo; import android.telephony.PhoneCapability; import android.telephony.PhysicalChannelConfig; import android.telephony.PreciseDataConnectionState; +import android.telephony.satellite.NtnSignalStrength; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.emergency.EmergencyNumber; @@ -125,8 +126,10 @@ interface ITelephonyRegistry { void notifyCarrierRoamingNtnModeChanged(int subId, in boolean active); void notifyCarrierRoamingNtnEligibleStateChanged(int subId, in boolean eligible); void notifyCarrierRoamingNtnAvailableServicesChanged(int subId, in int[] availableServices); + void notifyCarrierRoamingNtnSignalStrengthChanged(int subId, in NtnSignalStrength ntnSignalStrength); void addSatelliteStateChangeListener(ISatelliteStateChangeListener listener, String pkg, String featureId); void removeSatelliteStateChangeListener(ISatelliteStateChangeListener listener, String pkg); void notifySatelliteStateChanged(boolean isEnabled); + } diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 72a9a2d6de26..fa228627c255 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -88,6 +88,7 @@ import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.ImsCallSession; import android.telephony.ims.ImsReasonInfo; import android.telephony.ims.MediaQualityStatus; +import android.telephony.satellite.NtnSignalStrength; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -440,6 +441,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { private boolean[] mCarrierRoamingNtnEligible = null; private List<IntArray> mCarrierRoamingNtnAvailableServices; + private NtnSignalStrength[] mCarrierRoamingNtnSignalStrength; // Local cache to check if Satellite Modem is enabled private AtomicBoolean mIsSatelliteEnabled; @@ -745,6 +747,12 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mSCBMDuration = copyOf(mSCBMDuration, mNumPhones); mCarrierRoamingNtnMode = copyOf(mCarrierRoamingNtnMode, mNumPhones); mCarrierRoamingNtnEligible = copyOf(mCarrierRoamingNtnEligible, mNumPhones); + if (mCarrierRoamingNtnSignalStrength != null) { + mCarrierRoamingNtnSignalStrength = copyOf( + mCarrierRoamingNtnSignalStrength, mNumPhones); + } else { + mCarrierRoamingNtnSignalStrength = new NtnSignalStrength[mNumPhones]; + } // ds -> ss switch. if (mNumPhones < oldNumPhones) { cutListToSize(mCellInfo, mNumPhones); @@ -807,6 +815,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mCarrierRoamingNtnMode[i] = false; mCarrierRoamingNtnEligible[i] = false; mCarrierRoamingNtnAvailableServices.add(i, new IntArray()); + mCarrierRoamingNtnSignalStrength[i] = new NtnSignalStrength( + NtnSignalStrength.NTN_SIGNAL_STRENGTH_NONE); } } } @@ -883,6 +893,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mCarrierRoamingNtnMode = new boolean[numPhones]; mCarrierRoamingNtnEligible = new boolean[numPhones]; mCarrierRoamingNtnAvailableServices = new ArrayList<>(); + mCarrierRoamingNtnSignalStrength = new NtnSignalStrength[numPhones]; mIsSatelliteEnabled = new AtomicBoolean(); mWasSatelliteEnabledNotified = new AtomicBoolean(); @@ -932,6 +943,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mCarrierRoamingNtnMode[i] = false; mCarrierRoamingNtnEligible[i] = false; mCarrierRoamingNtnAvailableServices.add(i, new IntArray()); + mCarrierRoamingNtnSignalStrength[i] = new NtnSignalStrength( + NtnSignalStrength.NTN_SIGNAL_STRENGTH_NONE); } mAppOps = mContext.getSystemService(AppOpsManager.class); @@ -1565,6 +1578,15 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { remove(r.binder); } } + if (events.contains( + TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_SIGNAL_STRENGTH_CHANGED)) { + try { + r.callback.onCarrierRoamingNtnSignalStrengthChanged( + mCarrierRoamingNtnSignalStrength[r.phoneId]); + } catch (RemoteException ex) { + remove(r.binder); + } + } } } } @@ -3803,6 +3825,44 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + + /** + * Notify external listeners that carrier roaming non-terrestrial network + * signal strength changed. + * @param subId subscription ID. + * @param ntnSignalStrength non-terrestrial network signal strength. + */ + public void notifyCarrierRoamingNtnSignalStrengthChanged(int subId, + @NonNull NtnSignalStrength ntnSignalStrength) { + if (!checkNotifyPermission("notifyCarrierRoamingNtnSignalStrengthChanged")) { + log("nnotifyCarrierRoamingNtnSignalStrengthChanged: caller does not have required " + + "permissions."); + return; + } + + if (VDBG) { + log("notifyCarrierRoamingNtnSignalStrengthChanged: " + + "subId=" + subId + " ntnSignalStrength=" + ntnSignalStrength.getLevel()); + } + + synchronized (mRecords) { + int phoneId = getPhoneIdFromSubId(subId); + mCarrierRoamingNtnSignalStrength[phoneId] = ntnSignalStrength; + for (Record r : mRecords) { + if (r.matchTelephonyCallbackEvent( + TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_SIGNAL_STRENGTH_CHANGED) + && idMatch(r, subId, phoneId)) { + try { + r.callback.onCarrierRoamingNtnSignalStrengthChanged(ntnSignalStrength); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + handleRemoveListLocked(); + } + } + @NeverCompile // Avoid size overhead of debugging code. @Override public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { @@ -3858,6 +3918,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { pw.println("mSCBMDuration=" + mSCBMDuration[i]); pw.println("mCarrierRoamingNtnMode=" + mCarrierRoamingNtnMode[i]); pw.println("mCarrierRoamingNtnEligible=" + mCarrierRoamingNtnEligible[i]); + pw.println("mCarrierRoamingNtnSignalStrength=" + + mCarrierRoamingNtnSignalStrength[i]); // We need to obfuscate package names, and primitive arrays' native toString is ugly Pair<List<String>, int[]> carrierPrivilegeState = mCarrierPrivilegeStates.get(i); |