Domain selection service

For devices running Android 15 or higher, you can implement domain selection between the IMS service and legacy services over circuit switched networks using the DomainSelectionService system API. DomainSelectionService is a well-defined interface between the Android platform and a vendor provided domain selection implementation. This interface lets the vendor implementation provide signaling information, such as the domain that outgoing calls and SMS are placed and network type preference in network scanning, to the platform.

domain-selection-architecture

Figure 1. Architecture diagram for the domain selection feature

Examples and source

Android provides a reference implementation for the domain selection feature in AOSP at TelephonyDomainSelectionService. For detailed documentation for the DomainSelectionService API, see DomainSelectionService and the other classes in the API.

Implementation

To implement the domain selection feature on an Android device, the following steps are required:

  1. Create a domain selection app. The service must be defined in the AndroidManifest.xml file.

  2. Add a configuration to the device overlay to let the platform bind to the DomainSelectionService implementation.

  3. Support the required radio HAL interfaces for the domain selection feature.

This section provides further details of these steps.

Add service entry in AndroidManifest.xml

For your domain selection app to register the DomainSelectionService service with the framework, add a service entry in the manifest file using the following format:

<service
     android:name="com.example.domainselection.DomainSelectionService"
     android:directBootAware="true"
     android:persistent="true"
     …
     android:permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE"
     …
    <intent-filter>
        <action android:name="android.telephony.DomainSelectionService"/>
    </intent-filter>
    …
</service>

The service definition in AndroidManifest.xml must define the following attributes for the domain selection feature to operate.

  • directBootAware="true": Lets the service be discovered and run by telephony before the user unlocks the device. The service can't access device-encrypted storage before the user unlocks the device. For more information, see Support Direct Boot mode and File-Based Encryption.

  • persistent="true": Lets the service be run persistently and not be killed by the system to reclaim memory. This attribute works only if the app is built as a system app.

  • permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE": Ensures that only a process that has the BIND_DOMAIN_SELECTION_SERVICE permission granted to it can bind to the app. This prevents a rogue app from binding to the service, because only system apps can be granted the permission by the framework.

The service must also specify the intent-filter element with the android.telephony.DomainSelectionService action. This lets the framework find the DomainSelectionService service.

Define configuration in device overlay

For the platform to securely bind to the DomainSelectionService service, add the following configuration to the device overlay:

Because Android doesn't support apps with third-party downloadable DomainSelectionService implementations, the domain selection app must be a system app that resides in the /system_ext/priv-app/ or /product/priv-app/ folder. The framework verifies whether the package name of the implementation matches the device overlay value to ensure only trusted, preinstalled apps are bound.

Support radio HAL interfaces

To enable the domain selection feature, support the following required radio HAL interfaces:

  • IRadioNetwork

    void setEmergencyMode(int serial, EmergencyMode emcModeType);
    void triggerEmergencyNetworkScan(int serial,
            EmergencyNetworkScanTrigger request);
    void cancelEmergencyNetworkScan(int serial, boolean resetScan);
    void exitEmergencyMode(int serial);
    
  • IRadioNetworkIndication

    void emergencyNetworkScanResult(RadioIndicationType type,
            EmergencyRegResult result);
    

Validation

To test that the telephony framework properly responds to the DomainSelectionService interface, run the CTS tests in DomainSelectionServiceTestOnMockModem.