diff --git a/api/current.txt b/api/current.txt index 90c0eab439c42..b251612cbfdf1 100644 --- a/api/current.txt +++ b/api/current.txt @@ -47801,6 +47801,7 @@ package android.telephony { method public void onDataConnectionStateChanged(int); method public void onDataConnectionStateChanged(int, int); method @RequiresPermission("android.permission.READ_PHONE_STATE") public void onDisplayInfoChanged(@NonNull android.telephony.TelephonyDisplayInfo); + method public void onEmergencyNumberListChanged(@NonNull java.util.Map>); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onImsCallDisconnectCauseChanged(@NonNull android.telephony.ims.ImsReasonInfo); method public void onMessageWaitingIndicatorChanged(boolean); method @RequiresPermission("android.permission.MODIFY_PHONE_STATE") public void onPreciseDataConnectionStateChanged(@NonNull android.telephony.PreciseDataConnectionState); diff --git a/api/system-current.txt b/api/system-current.txt index 11b2828e62472..e586d75d70ada 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -10814,7 +10814,8 @@ package android.telephony { public class PhoneStateListener { method public void onCallAttributesChanged(@NonNull android.telephony.CallAttributes); - method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber); + method @Deprecated public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber); + method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber, int); method public void onOutgoingEmergencySms(@NonNull android.telephony.emergency.EmergencyNumber); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseCallStateChanged(@NonNull android.telephony.PreciseCallState); method public void onRadioPowerStateChanged(int); diff --git a/api/test-current.txt b/api/test-current.txt index bdf797e80ccc4..0cabd6f9ef383 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1627,6 +1627,10 @@ package android.telephony { method public static void setMinMatchForTest(int); } + public class PhoneStateListener { + method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber, int); + } + public final class PreciseDataConnectionState implements android.os.Parcelable { ctor @Deprecated public PreciseDataConnectionState(int, int, int, @NonNull String, @Nullable android.net.LinkProperties, int); } diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java index 2be50e496b8bb..2854b78b8a498 100644 --- a/core/java/android/telephony/PhoneStateListener.java +++ b/core/java/android/telephony/PhoneStateListener.java @@ -20,6 +20,7 @@ import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.compat.annotation.ChangeId; import android.compat.annotation.UnsupportedAppUsage; import android.os.Binder; @@ -935,7 +936,6 @@ public class PhoneStateListener { * {@link SubscriptionManager#getDefaultSubscriptionId}) * and the value as the list of {@link EmergencyNumber}; * null if this information is not available. - * @hide */ public void onEmergencyNumberListChanged( @NonNull Map> emergencyNumberList) { @@ -945,15 +945,48 @@ public class PhoneStateListener { /** * Callback invoked when an outgoing call is placed to an emergency number. * - * @param placedEmergencyNumber the emergency number {@link EmergencyNumber} the call is placed - * to. + * This method will be called when an emergency call is placed on any subscription (including + * the no-SIM case), regardless of which subscription this listener was registered on. + * + * This method is deprecated. Both this method and the new + * {@link #onOutgoingEmergencyCall(EmergencyNumber, int)} will be called when an outgoing + * emergency call is placed. + * + * @param placedEmergencyNumber The {@link EmergencyNumber} the emergency call was placed to. + * + * @deprecated Use {@link #onOutgoingEmergencyCall(EmergencyNumber, int)}. * @hide */ @SystemApi + @Deprecated public void onOutgoingEmergencyCall(@NonNull EmergencyNumber placedEmergencyNumber) { // default implementation empty } + /** + * Callback invoked when an outgoing call is placed to an emergency number. + * + * This method will be called when an emergency call is placed on any subscription (including + * the no-SIM case), regardless of which subscription this listener was registered on. + * + * Both this method and the deprecated {@link #onOutgoingEmergencyCall(EmergencyNumber)} will be + * called when an outgoing emergency call is placed. You should only implement one of these + * methods. + * + * @param placedEmergencyNumber The {@link EmergencyNumber} the emergency call was placed to. + * @param subscriptionId The subscription ID used to place the emergency call. If the + * emergency call was placed without a valid subscription (e.g. when there + * are no SIM cards in the device), this will be equal to + * {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID}. + * + * @hide + */ + @SystemApi + @TestApi + public void onOutgoingEmergencyCall(@NonNull EmergencyNumber placedEmergencyNumber, + int subscriptionId) { + } + /** * Callback invoked when an outgoing SMS is placed to an emergency number. * @@ -1331,13 +1364,19 @@ public class PhoneStateListener { () -> psl.onEmergencyNumberListChanged(emergencyNumberList))); } - public void onOutgoingEmergencyCall(@NonNull EmergencyNumber placedEmergencyNumber) { + public void onOutgoingEmergencyCall(@NonNull EmergencyNumber placedEmergencyNumber, + int subscriptionId) { PhoneStateListener psl = mPhoneStateListenerWeakRef.get(); if (psl == null) return; Binder.withCleanCallingIdentity( () -> mExecutor.execute( () -> psl.onOutgoingEmergencyCall(placedEmergencyNumber))); + + Binder.withCleanCallingIdentity( + () -> mExecutor.execute( + () -> psl.onOutgoingEmergencyCall(placedEmergencyNumber, + subscriptionId))); } public void onOutgoingEmergencySms(@NonNull EmergencyNumber sentEmergencyNumber) { diff --git a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl index b2c5a998e2544..d41d30735d7d1 100644 --- a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -61,7 +61,7 @@ oneway interface IPhoneStateListener { void onRadioPowerStateChanged(in int state); void onCallAttributesChanged(in CallAttributes callAttributes); void onEmergencyNumberListChanged(in Map emergencyNumberList); - void onOutgoingEmergencyCall(in EmergencyNumber placedEmergencyNumber); + void onOutgoingEmergencyCall(in EmergencyNumber placedEmergencyNumber, int subscriptionId); void onOutgoingEmergencySms(in EmergencyNumber sentEmergencyNumber); void onCallDisconnectCauseChanged(in int disconnectCause, in int preciseDisconnectCause); void onImsCallDisconnectCauseChanged(in ImsReasonInfo imsReasonInfo); diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt index e7306367daf51..c9959dab93351 100644 --- a/non-updatable-api/current.txt +++ b/non-updatable-api/current.txt @@ -45969,6 +45969,7 @@ package android.telephony { method public void onDataConnectionStateChanged(int); method public void onDataConnectionStateChanged(int, int); method @RequiresPermission("android.permission.READ_PHONE_STATE") public void onDisplayInfoChanged(@NonNull android.telephony.TelephonyDisplayInfo); + method public void onEmergencyNumberListChanged(@NonNull java.util.Map>); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onImsCallDisconnectCauseChanged(@NonNull android.telephony.ims.ImsReasonInfo); method public void onMessageWaitingIndicatorChanged(boolean); method @RequiresPermission("android.permission.MODIFY_PHONE_STATE") public void onPreciseDataConnectionStateChanged(@NonNull android.telephony.PreciseDataConnectionState); diff --git a/non-updatable-api/system-current.txt b/non-updatable-api/system-current.txt index 515d368db9e27..264f01288c9ff 100644 --- a/non-updatable-api/system-current.txt +++ b/non-updatable-api/system-current.txt @@ -9696,7 +9696,8 @@ package android.telephony { public class PhoneStateListener { method public void onCallAttributesChanged(@NonNull android.telephony.CallAttributes); - method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber); + method @Deprecated public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber); + method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber, int); method public void onOutgoingEmergencySms(@NonNull android.telephony.emergency.EmergencyNumber); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseCallStateChanged(@NonNull android.telephony.PreciseCallState); method public void onRadioPowerStateChanged(int); diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 4aa91a38e1725..ef3e8ac0d302d 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -2104,20 +2104,20 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { synchronized (mRecords) { if (validatePhoneId(phoneId)) { mOutgoingCallEmergencyNumber[phoneId] = emergencyNumber; - for (Record r : mRecords) { - if (r.matchPhoneStateListenerEvent( - PhoneStateListener.LISTEN_OUTGOING_EMERGENCY_CALL) - && idMatch(r.subId, subId, phoneId)) { - try { - r.callback.onOutgoingEmergencyCall(emergencyNumber); - } catch (RemoteException ex) { - mRemoveList.add(r.binder); - } + } + for (Record r : mRecords) { + // Send to all listeners regardless of subscription + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_OUTGOING_EMERGENCY_CALL)) { + try { + r.callback.onOutgoingEmergencyCall(emergencyNumber, subId); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); } } } - handleRemoveListLocked(); } + handleRemoveListLocked(); } @Override