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

Commit b64c84f4 authored by Sarah Chin's avatar Sarah Chin Committed by Android (Google) Code Review
Browse files

Merge "Add 5G booster slice APIs"

parents dc2f9fe1 dca0e87e
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -41551,6 +41551,10 @@ package android.telephony {
    field public static final String KEY_OPPORTUNISTIC_NETWORK_PING_PONG_TIME_LONG = "opportunistic_network_ping_pong_time_long";
    field public static final String KEY_PING_TEST_BEFORE_DATA_SWITCH_BOOL = "ping_test_before_data_switch_bool";
    field public static final String KEY_PREFER_2G_BOOL = "prefer_2g_bool";
    field public static final String KEY_PREMIUM_CAPABILITY_NOTIFICATION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG = "premium_capability_notification_backoff_hysteresis_time_millis_long";
    field public static final String KEY_PREMIUM_CAPABILITY_NOTIFICATION_DISPLAY_TIMEOUT_MILLIS_LONG = "premium_capability_notification_display_timeout_millis_long";
    field public static final String KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG = "premium_capability_purchase_condition_backoff_hysteresis_time_millis_long";
    field public static final String KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING = "premium_capability_purchase_url_string";
    field public static final String KEY_PREVENT_CLIR_ACTIVATION_AND_DEACTIVATION_CODE_BOOL = "prevent_clir_activation_and_deactivation_code_bool";
    field public static final String KEY_RADIO_RESTART_FAILURE_CAUSES_INT_ARRAY = "radio_restart_failure_causes_int_array";
    field public static final String KEY_RCS_CONFIG_SERVER_URL_STRING = "rcs_config_server_url_string";
@@ -41583,6 +41587,7 @@ package android.telephony {
    field public static final String KEY_SMDP_SERVER_ADDRESS_STRING = "smdp_server_address_string";
    field public static final String KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL = "sms_requires_destination_number_conversion_bool";
    field public static final String KEY_SUBSCRIPTION_GROUP_UUID_STRING = "subscription_group_uuid_string";
    field public static final String KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY = "supported_premium_capabilities_int_array";
    field public static final String KEY_SUPPORTS_CALL_COMPOSER_BOOL = "supports_call_composer_bool";
    field public static final String KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_DTMF_BOOL = "supports_device_to_device_communication_using_dtmf_bool";
    field public static final String KEY_SUPPORTS_DEVICE_TO_DEVICE_COMMUNICATION_USING_RTP_BOOL = "supports_device_to_device_communication_using_rtp_bool";
@@ -43646,6 +43651,7 @@ package android.telephony {
    method @RequiresPermission(anyOf={android.Manifest.permission.READ_PHONE_STATE, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) public boolean isModemEnabledForSlot(int);
    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int isMultiSimSupported();
    method public boolean isNetworkRoaming();
    method @RequiresPermission(android.Manifest.permission.READ_BASIC_PHONE_STATE) public boolean isPremiumCapabilityAvailableForPurchase(int);
    method public boolean isRadioInterfaceCapabilitySupported(@NonNull String);
    method public boolean isRttSupported();
    method public boolean isSmsCapable();
@@ -43654,6 +43660,7 @@ package android.telephony {
    method public boolean isVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle);
    method public boolean isWorldPhone();
    method @Deprecated public void listen(android.telephony.PhoneStateListener, int);
    method @RequiresPermission(android.Manifest.permission.READ_BASIC_PHONE_STATE) public void purchasePremiumCapability(int, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void rebootModem();
    method public void registerTelephonyCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyCallback);
    method public void registerTelephonyCallback(int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyCallback);
@@ -43823,6 +43830,20 @@ package android.telephony {
    field public static final int PHONE_TYPE_GSM = 1; // 0x1
    field public static final int PHONE_TYPE_NONE = 0; // 0x0
    field public static final int PHONE_TYPE_SIP = 3; // 0x3
    field public static final int PREMIUM_CAPABILITY_REALTIME_INTERACTIVE_TRAFFIC = 1; // 0x1
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS = 4; // 0x4
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED = 3; // 0x3
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED = 7; // 0x7
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR = 8; // 0x8
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED = 10; // 0xa
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_CONGESTED = 13; // 0xd
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE = 12; // 0xc
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED = 11; // 0xb
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS = 1; // 0x1
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED = 2; // 0x2
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT = 9; // 0x9
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED = 6; // 0x6
    field public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_DISABLED = 5; // 0x5
    field public static final int SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION = 2; // 0x2
    field public static final int SET_OPPORTUNISTIC_SUB_NO_OPPORTUNISTIC_SUB_AVAILABLE = 3; // 0x3
    field public static final int SET_OPPORTUNISTIC_SUB_REMOTE_SERVICE_EXCEPTION = 4; // 0x4
+78 −0
Original line number Diff line number Diff line
@@ -52,7 +52,9 @@ import com.android.internal.telephony.ICarrierConfigLoader;
import com.android.telephony.Rlog;

import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

/**
 * Provides access to telephony configuration values that are carrier-specific.
@@ -8646,6 +8648,73 @@ public class CarrierConfigManager {
    public static final String KEY_UNTHROTTLE_DATA_RETRY_WHEN_TAC_CHANGES_BOOL =
            "unthrottle_data_retry_when_tac_changes_bool";

    /**
     * A list of premium capabilities the carrier supports. Applications can prompt users to
     * purchase these premium capabilities from their carrier for a network boost.
     * Valid values are any of {@link TelephonyManager.PremiumCapability}.
     *
     * This is empty by default, indicating that no premium capabilities are supported.
     *
     * @see TelephonyManager#isPremiumCapabilityAvailableForPurchase(int)
     * @see TelephonyManager#purchasePremiumCapability(int, Executor, Consumer)
     */
    public static final String KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY =
            "supported_premium_capabilities_int_array";

    /**
     * The amount of time in milliseconds the notification for a network boost via
     * premium capabilities will be visible to the user after
     * {@link TelephonyManager#purchasePremiumCapability(int, Executor, Consumer)}
     * requests user action to purchase the boost from the carrier. Once the timeout expires,
     * the booster notification will be automatically dismissed and the request will fail with
     * {@link TelephonyManager#PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT}.
     *
     * The default value is 30 minutes.
     */
    public static final String KEY_PREMIUM_CAPABILITY_NOTIFICATION_DISPLAY_TIMEOUT_MILLIS_LONG =
            "premium_capability_notification_display_timeout_millis_long";

    /**
     * The amount of time in milliseconds that the notification for a network boost via
     * premium capabilities should be blocked when
     * {@link TelephonyManager#purchasePremiumCapability(int, Executor, Consumer)}
     * returns a failure due to user action or timeout.
     *
     * The default value is 30 minutes.
     *
     * @see TelephonyManager#PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED
     * @see TelephonyManager#PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT
     */
    public static final String
            KEY_PREMIUM_CAPABILITY_NOTIFICATION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG =
            "premium_capability_notification_backoff_hysteresis_time_millis_long";

    /**
     * The amount of time in milliseconds that the purchase request should be throttled when
     * {@link TelephonyManager#purchasePremiumCapability(int, Executor, Consumer)}
     * returns a failure due to the carrier.
     *
     * The default value is 30 minutes.
     *
     * @see TelephonyManager#PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR
     * @see TelephonyManager#PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_CONGESTED
     */
    public static final String
            KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG =
            "premium_capability_purchase_condition_backoff_hysteresis_time_millis_long";

    /**
     * The URL to redirect to when the user clicks on the notification for a network boost via
     * premium capabilities after applications call
     * {@link TelephonyManager#purchasePremiumCapability(int, Executor, Consumer)}.
     * If the URL is empty or invalid, the purchase request will return
     * {@link TelephonyManager#PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED}.
     *
     * This is empty by default.
     */
    public static final String KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING =
            "premium_capability_purchase_url_string";

    /**
     * IWLAN handover rules that determine whether handover is allowed or disallowed between
     * cellular and IWLAN.
@@ -9312,6 +9381,15 @@ public class CarrierConfigManager {
        sDefaults.putBoolean(KEY_UNTHROTTLE_DATA_RETRY_WHEN_TAC_CHANGES_BOOL, false);
        sDefaults.putBoolean(KEY_VONR_SETTING_VISIBILITY_BOOL, true);
        sDefaults.putBoolean(KEY_VONR_ENABLED_BOOL, false);
        sDefaults.putIntArray(KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY, new int[]{});
        sDefaults.putLong(KEY_PREMIUM_CAPABILITY_NOTIFICATION_DISPLAY_TIMEOUT_MILLIS_LONG,
                TimeUnit.MINUTES.toMillis(30));
        sDefaults.putLong(KEY_PREMIUM_CAPABILITY_NOTIFICATION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG,
                TimeUnit.MINUTES.toMillis(30));
        sDefaults.putLong(
                KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG,
                TimeUnit.MINUTES.toMillis(30));
        sDefaults.putString(KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING, null);
        sDefaults.putStringArray(KEY_IWLAN_HANDOVER_POLICY_STRING_ARRAY, new String[]{
                "source=GERAN|UTRAN|EUTRAN|NGRAN|IWLAN, "
                        + "target=GERAN|UTRAN|EUTRAN|NGRAN|IWLAN, type=allowed"});
+260 −0
Original line number Diff line number Diff line
@@ -17111,6 +17111,266 @@ public class TelephonyManager {
        }
    }
    /**
     * A premium capability boosting the network to allow real-time interactive traffic.
     * Corresponds to NetworkCapabilities#NET_CAPABILITY_REALTIME_INTERACTIVE_TRAFFIC.
     */
    // TODO(b/245748544): add @link once NET_CAPABILITY_REALTIME_INTERACTIVE_TRAFFIC is defined.
    public static final int PREMIUM_CAPABILITY_REALTIME_INTERACTIVE_TRAFFIC = 1;
    /**
     * Purchasable premium capabilities.
     * @hide
     */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = { "PREMIUM_CAPABILITY_" }, value = {
            PREMIUM_CAPABILITY_REALTIME_INTERACTIVE_TRAFFIC})
    public @interface PremiumCapability {}
    /**
     * Returns the premium capability {@link PremiumCapability} as a String.
     *
     * @param capability The premium capability.
     * @return The premium capability as a String.
     * @hide
     */
    public static String convertPremiumCapabilityToString(@PremiumCapability int capability) {
        switch (capability) {
            case PREMIUM_CAPABILITY_REALTIME_INTERACTIVE_TRAFFIC:
                return "REALTIME_INTERACTIVE_TRAFFIC";
            default:
                return "UNKNOWN (" + capability + ")";
        }
    }
    /**
     * Check whether the given premium capability is available for purchase from the carrier.
     * If this is {@code true}, the capability can be purchased from the carrier using
     * {@link #purchasePremiumCapability(int, Executor, Consumer)}.
     *
     * @param capability The premium capability to check.
     * @return Whether the given premium capability is available to purchase.
     * @throws SecurityException if the caller does not hold permission READ_BASIC_PHONE_STATE.
     */
    @RequiresPermission(android.Manifest.permission.READ_BASIC_PHONE_STATE)
    public boolean isPremiumCapabilityAvailableForPurchase(@PremiumCapability int capability) {
        try {
            ITelephony telephony = getITelephony();
            if (telephony == null) {
                throw new IllegalStateException("telephony service is null.");
            }
            return telephony.isPremiumCapabilityAvailableForPurchase(capability, getSubId());
        } catch (RemoteException ex) {
            ex.rethrowAsRuntimeException();
        }
        return false;
    }
    /**
     * Purchase premium capability request was successful. Subsequent attempts will return
     * {@link #PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED} until the booster expires.
     * The expiry time is determined by the type or duration of boost purchased from the carrier,
     * provided at {@link CarrierConfigManager#KEY_PREMIUM_CAPABILITY_PURCHASE_URL_STRING}.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS = 1;
    /**
     * Purchase premium capability failed because the request is throttled for the amount of time
     * specified by {@link CarrierConfigManager
     * #KEY_PREMIUM_CAPABILITY_NOTIFICATION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG}
     * or {@link CarrierConfigManager
     * #KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG}.
     * Subsequent attempts will return the same error until the request is no longer throttled
     * or throttling conditions change.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED = 2;
    /**
     * Purchase premium capability failed because it is already purchased and available.
     * Subsequent attempts will return the same error until the booster expires.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED = 3;
    /**
     * Purchase premium capability failed because a request was already made and is in progress.
     * This may have been requested by either the same app or another app.
     * Subsequent attempts will return the same error until the previous request completes.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS = 4;
    /**
     * Purchase premium capability failed because the user disabled the feature.
     * Subsequent attempts will return the same error until the user re-enables the feature.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_DISABLED = 5;
    /**
     * Purchase premium capability failed because the user canceled the operation.
     * Subsequent attempts will be throttled for the amount of time specified by
     * {@link CarrierConfigManager
     * #KEY_PREMIUM_CAPABILITY_NOTIFICATION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG}
     * and return {@link #PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED}.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED = 6;
    /**
     * Purchase premium capability failed because the carrier disabled or does not support
     * the capability, as specified in
     * {@link CarrierConfigManager#KEY_SUPPORTED_PREMIUM_CAPABILITIES_INT_ARRAY}.
     * Subsequent attempts will return the same error until the carrier enables the feature.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED = 7;
    /**
     * Purchase premium capability failed because the carrier app did not indicate success.
     * Subsequent attempts will be throttled for the amount of time specified by
     * {@link CarrierConfigManager
     * #KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG}
     * and return {@link #PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED}.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR = 8;
    /**
     * Purchase premium capability failed because we did not receive a response from the user
     * for the booster notification within the time specified by
     * {@link CarrierConfigManager#KEY_PREMIUM_CAPABILITY_NOTIFICATION_DISPLAY_TIMEOUT_MILLIS_LONG}.
     * The booster notification will be automatically dismissed and subsequent attempts will be
     * throttled for the amount of time specified by
     * {@link CarrierConfigManager
     * #KEY_PREMIUM_CAPABILITY_NOTIFICATION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG}
     * and return {@link #PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED}.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT = 9;
    /**
     * Purchase premium capability failed because the device does not support the feature.
     * Subsequent attempts will return the same error.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED = 10;
    /**
     * Purchase premium capability failed because the telephony service is down or unavailable.
     * Subsequent attempts will return the same error until request conditions are satisfied.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED = 11;
    /**
     * Purchase premium capability failed because the network is not available.
     * Subsequent attempts will return the same error until network conditions change.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE = 12;
    /**
     * Purchase premium capability failed because the network is congested.
     * Subsequent attempts will be throttled for the amount of time specified by
     * {@link CarrierConfigManager
     * #KEY_PREMIUM_CAPABILITY_PURCHASE_CONDITION_BACKOFF_HYSTERESIS_TIME_MILLIS_LONG}
     * and return {@link #PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED}.
     * Throttling will be reevaluated when the network is no longer congested.
     */
    public static final int PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_CONGESTED = 13;
    /**
     * Results of the purchase premium capability request.
     * @hide
     */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = { "PURCHASE_PREMIUM_CAPABILITY_RESULT_" }, value = {
            PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_DISABLED,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE,
            PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_CONGESTED})
    public @interface PurchasePremiumCapabilityResult {}
    /**
     * Returns the purchase result {@link PurchasePremiumCapabilityResult} as a String.
     *
     * @param result The purchase premium capability result.
     * @return The purchase result as a String.
     * @hide
     */
    public static String convertPurchaseResultToString(
            @PurchasePremiumCapabilityResult int result) {
        switch (result) {
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS:
                return "SUCCESS";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED:
                return "THROTTLED";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED:
                return "ALREADY_PURCHASED";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS:
                return "ALREADY_IN_PROGRESS";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_DISABLED:
                return "USER_DISABLED";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED:
                return "USER_CANCELED";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED:
                return "CARRIER_DISABLED";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR:
                return "CARRIER_ERROR";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT:
                return "TIMEOUT";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED:
                return "FEATURE_NOT_SUPPORTED";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED:
                return "REQUEST_FAILED";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE:
                return "NETWORK_NOT_AVAILABLE";
            case PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_CONGESTED:
                return "NETWORK_CONGESTED";
            default:
                return "UNKNOWN (" + result + ")";
        }
    }
    /**
     * Purchase the given premium capability from the carrier.
     * This requires user action to purchase the boost from the carrier.
     * If this returns {@link #PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS} or
     * {@link #PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED}, applications can request
     * the premium capability via {@link ConnectivityManager#requestNetwork}.
     *
     * @param capability The premium capability to purchase.
     * @param executor The callback executor for the response.
     * @param callback The result of the purchase request.
     *                 One of {@link PurchasePremiumCapabilityResult}.
     * @throws SecurityException if the caller does not hold permission READ_BASIC_PHONE_STATE.
     * @see #isPremiumCapabilityAvailableForPurchase(int) to check whether the capability is valid
     */
    @RequiresPermission(android.Manifest.permission.READ_BASIC_PHONE_STATE)
    public void purchasePremiumCapability(@PremiumCapability int capability,
            @NonNull @CallbackExecutor Executor executor,
            @NonNull @PurchasePremiumCapabilityResult Consumer<Integer> callback) {
        Objects.requireNonNull(executor);
        Objects.requireNonNull(callback);
        IIntegerConsumer internalCallback = new IIntegerConsumer.Stub() {
            @Override
            public void accept(int result) {
                executor.execute(() -> callback.accept(result));
            }
        };
        try {
            ITelephony telephony = getITelephony();
            if (telephony == null) {
                callback.accept(PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED);
                return;
            }
            telephony.purchasePremiumCapability(capability, internalCallback, getSubId());
        } catch (RemoteException ex) {
            callback.accept(PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED);
        }
    }
    /**
     * Get last known cell identity.
     * Require {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
+10 −0
Original line number Diff line number Diff line
@@ -2528,6 +2528,16 @@ interface ITelephony {
     */
    void getSlicingConfig(in ResultReceiver callback);

    /**
     * Check whether the given premium capability is available for purchase from the carrier.
     */
    boolean isPremiumCapabilityAvailableForPurchase(int capability, int subId);

    /**
     * Purchase the given premium capability from the carrier.
     */
    void purchasePremiumCapability(int capability, IIntegerConsumer callback, int subId);

    /**
     * Register an IMS connection state callback
     */