Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b928d6f authored by Hidayat Khan's avatar Hidayat Khan Committed by Android (Google) Code Review
Browse files

Merge "Changes to support emergency registration APIs and callbacks." into main

parents 38fc4f35 a7476ee1
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -46622,6 +46622,8 @@ package android.telephony.ims {
    method public int getTransportType();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field public static final int ATTR_EPDG_OVER_CELL_INTERNET = 1; // 0x1
    field @FlaggedApi("com.android.internal.telephony.flags.emergency_registration_state") public static final int ATTR_REGISTRATION_TYPE_EMERGENCY = 2; // 0x2
    field @FlaggedApi("com.android.internal.telephony.flags.emergency_registration_state") public static final int ATTR_VIRTUAL_FOR_ANONYMOUS_EMERGENCY_CALL = 4; // 0x4
    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsRegistrationAttributes> CREATOR;
  }
+6 −0
Original line number Diff line number Diff line
@@ -15723,6 +15723,7 @@ package android.telephony.ims {
    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAvailable(int, int);
    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isCapable(int, int);
    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void isSupported(int, int, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>) throws android.telephony.ims.ImsException;
    method @FlaggedApi("com.android.internal.telephony.flags.emergency_registration_state") public void registerImsEmergencyRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
    method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback) throws android.telephony.ims.ImsException;
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSettingEnabled(boolean);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCrossSimCallingEnabled(boolean) throws android.telephony.ims.ImsException;
@@ -15733,6 +15734,7 @@ package android.telephony.ims {
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSettingEnabled(boolean);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean);
    method @FlaggedApi("com.android.internal.telephony.flags.emergency_registration_state") public void unregisterImsEmergencyRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
    method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback);
  }
@@ -15765,6 +15767,8 @@ package android.telephony.ims {
    ctor public ImsRegistrationAttributes.Builder(int);
    method @NonNull public android.telephony.ims.ImsRegistrationAttributes build();
    method @NonNull public android.telephony.ims.ImsRegistrationAttributes.Builder setFeatureTags(@NonNull java.util.Set<java.lang.String>);
    method @FlaggedApi("com.android.internal.telephony.flags.emergency_registration_state") @NonNull public android.telephony.ims.ImsRegistrationAttributes.Builder setFlagRegistrationTypeEmergency();
    method @FlaggedApi("com.android.internal.telephony.flags.emergency_registration_state") @NonNull public android.telephony.ims.ImsRegistrationAttributes.Builder setFlagVirtualRegistrationForEmergencyCall();
    method @NonNull public android.telephony.ims.ImsRegistrationAttributes.Builder setSipDetails(@NonNull android.telephony.ims.SipDetails);
  }
@@ -16691,6 +16695,7 @@ package android.telephony.ims.stub {
    ctor public ImsRegistrationImplBase(@NonNull java.util.concurrent.Executor);
    method public final void onDeregistered(android.telephony.ims.ImsReasonInfo);
    method public final void onDeregistered(@Nullable android.telephony.ims.ImsReasonInfo, int, int);
    method @FlaggedApi("com.android.internal.telephony.flags.emergency_registration_state") public final void onDeregistered(@Nullable android.telephony.ims.ImsReasonInfo, int, @NonNull android.telephony.ims.ImsRegistrationAttributes);
    method public final void onDeregistered(@Nullable android.telephony.ims.ImsReasonInfo, @NonNull android.telephony.ims.SipDetails);
    method public final void onDeregistered(@Nullable android.telephony.ims.ImsReasonInfo, int, int, @NonNull android.telephony.ims.SipDetails);
    method public final void onRegistered(int);
@@ -16699,6 +16704,7 @@ package android.telephony.ims.stub {
    method public final void onRegistering(@NonNull android.telephony.ims.ImsRegistrationAttributes);
    method public final void onSubscriberAssociatedUriChanged(android.net.Uri[]);
    method public final void onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo);
    method @FlaggedApi("com.android.internal.telephony.flags.emergency_registration_state") public final void onTechnologyChangeFailed(@Nullable android.telephony.ims.ImsReasonInfo, @NonNull android.telephony.ims.ImsRegistrationAttributes);
    method public void triggerFullNetworkRegistration(@IntRange(from=100, to=699) int, @Nullable String);
    method public void triggerSipDelegateDeregistration();
    method public void updateSipDelegateRegistration();
+110 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.telephony.ims;

import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.RequiresFeature;
@@ -45,6 +46,7 @@ import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.IIntegerConsumer;
import com.android.internal.telephony.ITelephony;
import com.android.internal.telephony.flags.Flags;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -446,6 +448,114 @@ public class ImsMmTelManager implements RegistrationManager {
        }
    }

    /**
     * Registers a {@link RegistrationCallback} with the system, which will provide IMS emergency
     * registration updates for the subscription specified in
     * {@link ImsManager#getImsMmTelManager(int)}. Use
     * {@link SubscriptionManager.OnSubscriptionsChangedListener} to listen to Subscription changed
     * events and call {@link #unregisterImsRegistrationCallback(RegistrationCallback)} to clean up.
     *
     * When the callback is registered, it will initiate the callback c to be called with the
     * current emergency registration state.
     * Emergency registration callback is available when there is valid SIM card.
     * <p>This API requires one of the following:
     * <ul>
     *     <li>The caller holds the READ_PRECISE_PHONE_STATE permission.</li>
     *     <li>If the caller is the device or profile owner, the caller holds the
     *     {@link Manifest.permission#READ_PRECISE_PHONE_STATE} permission.</li>
     *     <li>The caller has carrier privileges (see
     *     {@link android.telephony.TelephonyManager#hasCarrierPrivileges}) on any
     *     active subscription.</li>
     * </ul>
     * <p>The profile owner is an app that owns a managed profile on the device; for more details
     * see <a href="https://developer.android.com/work/managed-profiles">Work profiles</a>.
     * Access by profile owners is deprecated and will be removed in a future release.
     *
     * @param executor The executor the callback events should be run on.
     * @param c The {@link RegistrationCallback} to be added.
     * @see #unregisterImsEmergencyRegistrationCallback
     * @throws ImsException if the subscription associated with this callback is valid, but
     * the {@link ImsService} associated with the subscription is not available. This can happen if
     * the service crashed, for example. See {@link ImsException#getCode()} for a more detailed
     * reason.
     * @hide
     */
    @SystemApi
    @FlaggedApi(Flags.FLAG_EMERGENCY_REGISTRATION_STATE)
    public void registerImsEmergencyRegistrationCallback(
            @NonNull @CallbackExecutor Executor executor,
            @NonNull RegistrationManager.RegistrationCallback c) throws ImsException {
        if (c == null) {
            throw new IllegalArgumentException("Must include a non-null RegistrationCallback.");
        }
        if (executor == null) {
            throw new IllegalArgumentException("Must include a non-null Executor.");
        }
        c.setExecutor(executor);

        ITelephony iTelephony = getITelephony();
        if (iTelephony == null) {
            throw new ImsException("Could not find Telephony Service.",
                    ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
        }

        try {
            iTelephony.registerImsEmergencyRegistrationCallback(mSubId, c.getBinder());
        } catch (ServiceSpecificException e) {
            throw new ImsException(e.getMessage(), e.errorCode);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
        }  catch (IllegalStateException e) {
            throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
        }
    }

    /**
     * Removes an existing {@link RegistrationCallback} for Emergency IMS registration.
     *
     * When the subscription associated with this callback is removed (SIM removed, ESIM swap,
     * etc...), this callback will automatically be removed. If this method is called for an
     * inactive subscription, it will result in a no-op.
     * <p>This API requires one of the following:
     * <ul>
     *     <li>The caller holds the READ_PRECISE_PHONE_STATE permission.</li>
     *     <li>If the caller is the device or profile owner, the caller holds the
     *     {@link Manifest.permission#READ_PRECISE_PHONE_STATE} permission.</li>
     *     <li>The caller has carrier privileges (see
     *     {@link android.telephony.TelephonyManager#hasCarrierPrivileges}) on any
     *     active subscription.</li>
     * </ul>
     * <p>The profile owner is an app that owns a managed profile on the device; for more details
     * see <a href="https://developer.android.com/work/managed-profiles">Work profiles</a>.
     * Access by profile owners is deprecated and will be removed in a future release.
     *
     * @param c The {@link RegistrationCallback} to be removed.
     * @see android.telephony.SubscriptionManager.OnSubscriptionsChangedListener
     * @see #registerImsEmergencyRegistrationCallback(Executor,
     *                                 RegistrationManager.RegistrationCallback)
     * @hide
     */
    @SystemApi
    @FlaggedApi(Flags.FLAG_EMERGENCY_REGISTRATION_STATE)
    public void unregisterImsEmergencyRegistrationCallback(
            @NonNull RegistrationManager.RegistrationCallback c) {
        if (c == null) {
            throw new IllegalArgumentException("Must include a non-null RegistrationCallback.");
        }

        ITelephony iTelephony = getITelephony();
        if (iTelephony == null) {
            Log.w("ImsMmTelManager", "Could not find Telephony Service.");
            return;
        }

        try {
            iTelephony.unregisterImsEmergencyRegistrationCallback(mSubId, c.getBinder());
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
        }
    }

    /**
     * {@inheritDoc}
     * @hide
+51 −12
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.telephony.ims;

import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -26,6 +27,8 @@ import android.telephony.AccessNetworkConstants;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.util.ArraySet;

import com.android.internal.telephony.flags.Flags;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -46,12 +49,36 @@ public final class ImsRegistrationAttributes implements Parcelable {
     *
     */
    public static final int ATTR_EPDG_OVER_CELL_INTERNET = 1 << 0;
    /**
     * Attribute to specify if ims registration is of type normal or emergency.
     * <p>
     *     For emergency registration bit will be set.
     *     For normal registration bit will not be set.
     *     This flag is only applicable when listening to emergency IMS registration state updates
     *     via the ImsMmTelManager#registerImsEmergencyRegistrationCallback API
     * </p>
     */
    @FlaggedApi(Flags.FLAG_EMERGENCY_REGISTRATION_STATE)
    public static final int ATTR_REGISTRATION_TYPE_EMERGENCY = 1 << 1;
    /**
     * Attribute to specify if virtual registration is required.
     * <p>
     *     If emergency registration is not required for making emergency call, in such cases
     *     bit will be set and callback will represent virtual registration status update.
     *     This flag is only applicable when listening to emergency IMS registration state updates
     *     via the ImsMmTelManager#registerImsEmergencyRegistrationCallback API
     * </p>
     */
    @FlaggedApi(Flags.FLAG_EMERGENCY_REGISTRATION_STATE)
    public static final int ATTR_VIRTUAL_FOR_ANONYMOUS_EMERGENCY_CALL = 1 << 2;

    /** @hide */
    // Defines the underlying radio technology type that we have registered for IMS over.
    @IntDef(prefix = "ATTR_",
            value = {
                    ATTR_EPDG_OVER_CELL_INTERNET,
                    ATTR_REGISTRATION_TYPE_EMERGENCY,
                    ATTR_VIRTUAL_FOR_ANONYMOUS_EMERGENCY_CALL,
            },
            flag = true)
    @Retention(RetentionPolicy.SOURCE)
@@ -67,6 +94,8 @@ public final class ImsRegistrationAttributes implements Parcelable {
        private Set<String> mFeatureTags = Collections.emptySet();
        private @Nullable SipDetails mSipDetails;

        private @ImsAttributeFlag int mAttributeFlags;

        /**
         * Build a new instance of {@link ImsRegistrationAttributes}.
         *
@@ -74,6 +103,9 @@ public final class ImsRegistrationAttributes implements Parcelable {
         */
        public Builder(@ImsRegistrationImplBase.ImsRegistrationTech int registrationTech) {
            mRegistrationTech = registrationTech;
            if (registrationTech == ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM) {
                mAttributeFlags |= ATTR_EPDG_OVER_CELL_INTERNET;
            }
        }

        /**
@@ -110,24 +142,31 @@ public final class ImsRegistrationAttributes implements Parcelable {
        }

        /**
         * @return A new instance created from this builder.
         * Set the attribute flag ATTR_REGISTRATION_TYPE_EMERGENCY.
         */
        public @NonNull ImsRegistrationAttributes build() {
            return new ImsRegistrationAttributes(mRegistrationTech,
                    RegistrationManager.getAccessType(mRegistrationTech),
                    getAttributeFlags(mRegistrationTech),
                    mFeatureTags, mSipDetails);
        @FlaggedApi(Flags.FLAG_EMERGENCY_REGISTRATION_STATE)
        public @NonNull Builder setFlagRegistrationTypeEmergency() {
            mAttributeFlags |= ATTR_REGISTRATION_TYPE_EMERGENCY;
            return this;
        }

        /**
         * @return attribute flags from the registration technology.
         * Set the attribute flag ATTR_VIRTUAL_FOR_ANONYMOUS_EMERGENCY_CALL.
         */
        private static int getAttributeFlags(int imsRadioTech) {
            int attributes = 0;
            if (imsRadioTech == ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM) {
                attributes |= ATTR_EPDG_OVER_CELL_INTERNET;
        @FlaggedApi(Flags.FLAG_EMERGENCY_REGISTRATION_STATE)
        public @NonNull Builder setFlagVirtualRegistrationForEmergencyCall() {
            mAttributeFlags |= ATTR_VIRTUAL_FOR_ANONYMOUS_EMERGENCY_CALL;
            return this;
        }
            return attributes;

        /**
         * @return A new instance created from this builder.
         */
        public @NonNull ImsRegistrationAttributes build() {
            return new ImsRegistrationAttributes(mRegistrationTech,
                    RegistrationManager.getAccessType(mRegistrationTech),
                    mAttributeFlags,
                    mFeatureTags, mSipDetails);
        }
    }

+2 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ interface IImsRegistration {
   int getRegistrationTechnology();
   oneway void addRegistrationCallback(IImsRegistrationCallback c);
   oneway void removeRegistrationCallback(IImsRegistrationCallback c);
   oneway void addEmergencyRegistrationCallback(IImsRegistrationCallback c);
   oneway void removeEmergencyRegistrationCallback(IImsRegistrationCallback c);
   oneway void triggerFullNetworkRegistration(int sipCode, String sipReason);
   oneway void triggerUpdateSipDelegateRegistration();
   oneway void triggerSipDelegateDeregistration();
Loading