All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.android.telephony.ims.ProvisioningManager Maven / Gradle / Ivy

Go to download

A library jar that provides APIs for Applications written for the Google Android Platform.

There is a newer version: 15-robolectric-12650502
Show newest version
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.telephony.ims;

import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.StringDef;
import android.annotation.SystemApi;
import android.annotation.WorkerThread;
import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyFrameworkInitializer;
import android.telephony.TelephonyManager;
import android.telephony.ims.aidl.IImsConfigCallback;
import android.telephony.ims.aidl.IRcsConfigCallback;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.feature.RcsFeature;
import android.telephony.ims.stub.ImsConfigImplBase;
import android.telephony.ims.stub.ImsRegistrationImplBase;

import com.android.internal.telephony.ITelephony;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.Executor;

/**
 * Manages IMS provisioning and configuration parameters, as well as callbacks for apps to listen
 * to changes in these configurations.
 *
 * IMS provisioning keys are defined per carrier or OEM using OMA-DM or other provisioning
 * applications and may vary. It is up to the carrier and OEM applications to ensure that the
 * correct provisioning keys are being used when integrating with a vendor's ImsService.
 *
 * Note: For compatibility purposes, the integer values [0 - 99] used in
 * {@link #setProvisioningIntValue(int, int)} have been reserved for existing provisioning keys
 * previously defined in the Android framework. Please do not redefine new provisioning keys in this
 * range or it may generate collisions with existing keys. Some common constants have also been
 * defined in this class to make integrating with other system apps easier.
 * @hide
 */
@SystemApi
public class ProvisioningManager {

    /**@hide*/
    @StringDef(prefix = "STRING_QUERY_RESULT_ERROR_", value = {
            STRING_QUERY_RESULT_ERROR_GENERIC,
            STRING_QUERY_RESULT_ERROR_NOT_READY
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface StringResultError {}

    /**
     * The query from {@link #getProvisioningStringValue(int)} has resulted in an unspecified error.
     */
    public static final String STRING_QUERY_RESULT_ERROR_GENERIC =
            "STRING_QUERY_RESULT_ERROR_GENERIC";

    /**
     * The query from {@link #getProvisioningStringValue(int)} has resulted in an error because the
     * ImsService implementation was not ready for provisioning queries.
     */
    public static final String STRING_QUERY_RESULT_ERROR_NOT_READY =
            "STRING_QUERY_RESULT_ERROR_NOT_READY";

    /**
     * There is no existing configuration for the queried provisioning key.
     * @hide
     */
    public static final int PROVISIONING_RESULT_UNKNOWN = -1;

    /**
     * The integer result of provisioning for the queried key is disabled.
     */
    public static final int PROVISIONING_VALUE_DISABLED = 0;

    /**
     * The integer result of provisioning for the queried key is enabled.
     */
    public static final int PROVISIONING_VALUE_ENABLED = 1;


    // Inheriting values from ImsConfig for backwards compatibility.
    /**
     * AMR CODEC Mode Value set, 0-7 in comma separated sequence.
     * 

* This corresponds to the {@code mode-set} parameter for the AMR codec. * See 3GPP TS 26.101 Table 1A for more information. *

*

    *
  • 0 - AMR 4.75 kbit/s
  • *
  • 1 - AMR 5.15 kbit/s
  • *
  • 2 - AMR 5.90 kbit/s
  • *
  • 3 - AMR 6.70 kbit/s (PDC-EFR)
  • *
  • 4 - AMR 7.40 kbit/s (TDMA-EFR)
  • *
  • 5 - AMR 7.95 kbit/s
  • *
  • 6 - AMR 10.2 kbit/s
  • *
  • 7 - AMR 12.2 kbit/s (GSM-EFR)
  • *
*

* Value is in String format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_AMR_CODEC_MODE_SET_VALUES = 0; /** * Wide Band AMR CODEC Mode Value set,0-7 in comma separated sequence. *

* This corresponds to the {@code mode-set} parameter for the AMR wideband codec. * See 3GPP TS 26.101 Table 1A for more information. *

*

    *
  • 0 - AMR 4.75 kbit/s
  • *
  • 1 - AMR 5.15 kbit/s
  • *
  • 2 - AMR 5.90 kbit/s
  • *
  • 3 - AMR 6.70 kbit/s (PDC-EFR)
  • *
  • 4 - AMR 7.40 kbit/s (TDMA-EFR)
  • *
  • 5 - AMR 7.95 kbit/s
  • *
  • 6 - AMR 10.2 kbit/s
  • *
  • 7 - AMR 12.2 kbit/s (GSM-EFR)
  • *
*

* Value is in String format. * @see #setProvisioningStringValue(int, String) * @see #getProvisioningStringValue(int) * @hide */ public static final int KEY_AMR_WB_CODEC_MODE_SET_VALUES = 1; /** * SIP Session Timer value (seconds). *

* See RFC4028 for more information. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_SESSION_TIMER_SEC = 2; /** * Minimum SIP Session Expiration Timer in (seconds). *

* See RFC4028 for more information. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_MINIMUM_SIP_SESSION_EXPIRATION_TIMER_SEC = 3; /** * SIP_INVITE cancellation time out value (in milliseconds). Integer format. *

* See RFC4028 for more information. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_INVITE_CANCELLATION_TIMER_MS = 4; /** * Delay time when an iRAT transitions from eHRPD/HRPD/1xRTT to LTE. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_TRANSITION_TO_LTE_DELAY_MS = 5; /** * Silent redial status of Enabled (True), or Disabled (False). * Value is in boolean format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_ENABLE_SILENT_REDIAL = 6; /** * An integer key representing the SIP T1 timer value in milliseconds for the associated * subscription. *

* The SIP T1 timer is an estimate of the round-trip time and will retransmit * INVITE transactions that are longer than T1 milliseconds over unreliable transports, doubling * the time before retransmission every time there is no response. See RFC3261, section 17.1.1.1 * for more details. *

* The value is an integer. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_T1_TIMER_VALUE_MS = 7; /** * SIP T2 timer value in milliseconds. See RFC 3261 for information. *

* The T2 timer is the maximum retransmit interval for non-INVITE requests and INVITE responses. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_T2_TIMER_VALUE_MS = 8; /** * SIP TF timer value in milliseconds. See RFC 3261 for information. *

* The TF timer is the non-INVITE transaction timeout timer. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_TF_TIMER_VALUE_MS = 9; /** * An integer key representing the voice over LTE (VoLTE) provisioning status for the * associated subscription. Determines whether the user can register for voice services over * LTE. *

* Use {@link #PROVISIONING_VALUE_ENABLED} to enable VoLTE provisioning and * {@link #PROVISIONING_VALUE_DISABLED} to disable VoLTE provisioning. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_VOLTE_PROVISIONING_STATUS = 10; /** * An integer key representing the video telephony (VT) provisioning status for the * associated subscription. Determines whether the user can register for video services over * LTE. *

* Use {@link #PROVISIONING_VALUE_ENABLED} to enable VT provisioning and * {@link #PROVISIONING_VALUE_DISABLED} to disable VT provisioning. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_VT_PROVISIONING_STATUS = 11; /** * Domain Name for the device to populate the request URI for REGISTRATION. * Value is in String format. * @see #setProvisioningStringValue(int, String) * @see #getProvisioningStringValue(int) * @hide */ public static final int KEY_REGISTRATION_DOMAIN_NAME = 12; /** * Device Outgoing SMS based on either 3GPP or 3GPP2 standards. * Value is in Integer format. * Valid values are {@link #SMS_FORMAT_3GPP} and {@link #SMS_FORMAT_3GPP2}. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SMS_FORMAT = 13; /** * Value used with {@link #KEY_SMS_FORMAT} to indicate 3GPP2 SMS format is used. * See {@link android.telephony.SmsMessage#FORMAT_3GPP2} for more information. * @hide */ public static final int SMS_FORMAT_3GPP2 = 0; /** * Value used with {@link #KEY_SMS_FORMAT} to indicate 3GPP SMS format is used. * See {@link android.telephony.SmsMessage#FORMAT_3GPP} for more information. * @hide */ public static final int SMS_FORMAT_3GPP = 1; /** * Turns SMS over IMS ON/OFF on the device. * Value is in Integer format. ON (1), OFF(0). * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SMS_OVER_IP_ENABLED = 14; /** * An integer key associated with the carrier configured SIP PUBLISH timer, which dictates the * expiration time in seconds for published online availability in RCS presence. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RCS_PUBLISH_TIMER_SEC = 15; /** * An integer key associated with the carrier configured expiration time in seconds for * published offline availability in RCS presence provided, which is provided to the network. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RCS_PUBLISH_OFFLINE_AVAILABILITY_TIMER_SEC = 16; /** * An integer key associated with whether or not capability discovery is provisioned for this * subscription. Any capability requests will be ignored by the RCS service. *

* The value is an integer, either {@link #PROVISIONING_VALUE_DISABLED} if capability * discovery is disabled or {@link #PROVISIONING_VALUE_ENABLED} if capability discovery is * enabled. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RCS_CAPABILITY_DISCOVERY_ENABLED = 17; /** * An integer key associated with the period of time in seconds the capability information of * each contact is cached on the device. *

* Seconds are used because this is usually measured in the span of days. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC = 18; /** * An integer key associated with the period of time in seconds that the availability * information of a contact is cached on the device, which is based on the carrier provisioning * configuration from the network. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RCS_AVAILABILITY_CACHE_EXPIRATION_SEC = 19; /** * An integer key associated with the carrier configured interval in seconds expected between * successive capability polling attempts, which is based on the carrier provisioning * configuration from the network. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RCS_CAPABILITIES_POLL_INTERVAL_SEC = 20; /** * An integer key representing the minimum time allowed between two consecutive presence publish * messages from the device in milliseconds. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RCS_PUBLISH_SOURCE_THROTTLE_MS = 21; /** * An integer key associated with the maximum number of MDNs contained in one SIP Request * Contained List (RCS) used to retrieve the RCS capabilities of the contacts book. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RCS_MAX_NUM_ENTRIES_IN_RCL = 22; /** * An integer associated with the expiration timer used during the SIP subscription of a * Request Contained List (RCL), which is used to retrieve the RCS capabilities of the contact * book. This timer value is sent in seconds to the network. *

* Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RCS_CAPABILITY_POLL_LIST_SUB_EXP_SEC = 23; /** * Applies compression to LIST Subscription. * Value is in Integer format. Enable (1), Disable(0). * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_USE_GZIP_FOR_LIST_SUBSCRIPTION = 24; /** * An integer key representing the RCS enhanced address book (EAB) provisioning status for the * associated subscription. Determines whether or not SIP OPTIONS or presence will be used to * retrieve RCS capabilities for the user's contacts. *

* Use {@link #PROVISIONING_VALUE_ENABLED} to enable EAB provisioning and * {@link #PROVISIONING_VALUE_DISABLED} to disable EAB provisioning. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_EAB_PROVISIONING_STATUS = 25; /** * Override the user-defined WiFi Roaming enabled setting for this subscription, defined in * {@link SubscriptionManager#WFC_ROAMING_ENABLED_CONTENT_URI}, for the purposes of provisioning * the subscription for WiFi Calling. * * @see #getProvisioningIntValue(int) * @see #setProvisioningIntValue(int, int) */ public static final int KEY_VOICE_OVER_WIFI_ROAMING_ENABLED_OVERRIDE = 26; /** * Override the user-defined WiFi mode for this subscription, defined in * {@link SubscriptionManager#WFC_MODE_CONTENT_URI}, for the purposes of provisioning * this subscription for WiFi Calling. * * Valid values for this key are: * {@link ImsMmTelManager#WIFI_MODE_WIFI_ONLY}, * {@link ImsMmTelManager#WIFI_MODE_CELLULAR_PREFERRED}, or * {@link ImsMmTelManager#WIFI_MODE_WIFI_PREFERRED}. * * @see #getProvisioningIntValue(int) * @see #setProvisioningIntValue(int, int) */ public static final int KEY_VOICE_OVER_WIFI_MODE_OVERRIDE = 27; /** * Enable voice over wifi. Enabled (1), or Disabled (0). * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE = 28; /** * Mobile data enabled. * Value is in Integer format. On (1), OFF(0). * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_MOBILE_DATA_ENABLED = 29; /** * VoLTE user opted in status. * Value is in Integer format. Opted-in (1) Opted-out (0). * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_VOLTE_USER_OPT_IN_STATUS = 30; /** * Proxy for Call Session Control Function(P-CSCF) address for Local-BreakOut(LBO). * Value is in String format. * @hide */ public static final int KEY_LOCAL_BREAKOUT_PCSCF_ADDRESS = 31; /** * Keep Alive Enabled for SIP. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_KEEP_ALIVE_ENABLED = 32; /** * Registration retry Base Time value in seconds, which is based off of the carrier * configuration. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_REGISTRATION_RETRY_BASE_TIME_SEC = 33; /** * Registration retry Max Time value in seconds, which is based off of the carrier * configuration. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_REGISTRATION_RETRY_MAX_TIME_SEC = 34; /** * Smallest RTP port for speech codec. * Value is in integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RTP_SPEECH_START_PORT = 35; /** * Largest RTP port for speech code. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RTP_SPEECH_END_PORT = 36; /** * SIP Timer A's value in milliseconds. Timer A is the INVITE request retransmit interval (in * milliseconds), for UDP only. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_INVITE_REQUEST_TRANSMIT_INTERVAL_MS = 37; /** * SIP Timer B's value in milliseconds. Timer B is the wait time for INVITE message to be, * in milliseconds. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_INVITE_ACK_WAIT_TIME_MS = 38; /** * SIP Timer D's value in milliseconds. Timer D is the wait time for response retransmits of * the invite client transactions, in milliseconds. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_INVITE_RESPONSE_RETRANSMIT_WAIT_TIME_MS = 39; /** * SIP Timer E's value in milliseconds. Timer E is the value Non-INVITE request retransmit * interval (in milliseconds), for UDP only. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_NON_INVITE_REQUEST_RETRANSMIT_INTERVAL_MS = 40; /** * SIP Timer F's value in milliseconds. Timer F is the Non-INVITE transaction timeout timer, * in milliseconds. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_NON_INVITE_TRANSACTION_TIMEOUT_TIMER_MS = 41; /** * SIP Timer G's value in milliseconds. Timer G is the value of INVITE response * retransmit interval. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_INVITE_RESPONSE_RETRANSMIT_INTERVAL_MS = 42; /** * SIP Timer H's value in milliseconds. Timer H is the value of wait time for * ACK receipt. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_ACK_RECEIPT_WAIT_TIME_MS = 43; /** * SIP Timer I's value in milliseconds. Timer I is the value of wait time for * ACK retransmits. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_ACK_RETRANSMIT_WAIT_TIME_MS = 44; /** * SIP Timer J's value in milliseconds. Timer J is the value of wait time for * non-invite request retransmission. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_NON_INVITE_REQUEST_RETRANSMISSION_WAIT_TIME_MS = 45; /** * SIP Timer K's value in milliseconds. Timer K is the value of wait time for * non-invite response retransmits. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_SIP_NON_INVITE_RESPONSE_RETRANSMISSION_WAIT_TIME_MS = 46; /** * AMR WB octet aligned dynamic payload type. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_AMR_WB_OCTET_ALIGNED_PAYLOAD_TYPE = 47; /** * AMR WB bandwidth efficient payload type. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_AMR_WB_BANDWIDTH_EFFICIENT_PAYLOAD_TYPE = 48; /** * AMR octet aligned dynamic payload type. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_AMR_OCTET_ALIGNED_PAYLOAD_TYPE = 49; /** * AMR bandwidth efficient payload type. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_AMR_BANDWIDTH_EFFICIENT_PAYLOAD_TYPE = 50; /** * DTMF WB payload type. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_DTMF_WB_PAYLOAD_TYPE = 51; /** * DTMF NB payload type. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_DTMF_NB_PAYLOAD_TYPE = 52; /** * AMR Default encoding mode. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_AMR_DEFAULT_ENCODING_MODE = 53; /** * SMS Public Service Identity. * Value is in String format. * @hide */ public static final int KEY_SMS_PUBLIC_SERVICE_IDENTITY = 54; /** * Video Quality - VideoQualityFeatureValuesConstants. * Valid values are: {@link #VIDEO_QUALITY_HIGH} and {@link #VIDEO_QUALITY_LOW}. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_VIDEO_QUALITY = 55; /** * Used with {@link #KEY_VIDEO_QUALITY} to indicate low video quality. * @hide */ public static final int VIDEO_QUALITY_LOW = 0; /** * Used with {@link #KEY_VIDEO_QUALITY} to indicate high video quality. * @hide */ public static final int VIDEO_QUALITY_HIGH = 1; /** * LTE to WIFI handover threshold. * Handover from LTE to WiFi if LTE < THLTE1 and WiFi >= {@link #KEY_WIFI_THRESHOLD_A}. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_LTE_THRESHOLD_1 = 56; /** * WIFI to LTE handover threshold. * Handover from WiFi to LTE if LTE >= {@link #KEY_LTE_THRESHOLD_3} or (WiFi < {@link * #KEY_WIFI_THRESHOLD_B} and LTE >= {@link #KEY_LTE_THRESHOLD_2}). * Value is in Integer format. * * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_LTE_THRESHOLD_2 = 57; /** * LTE to WIFI handover threshold. * Handover from WiFi to LTE if LTE >= {@link #KEY_LTE_THRESHOLD_3} or (WiFi < {@link * #KEY_WIFI_THRESHOLD_B} and LTE >= {@link #KEY_LTE_THRESHOLD_2}). * Value is in Integer format. * * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_LTE_THRESHOLD_3 = 58; /** * 1x to WIFI handover threshold. * Handover from 1x to WiFi if 1x < {@link #KEY_1X_THRESHOLD}. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_1X_THRESHOLD = 59; /** * LTE to WIFI threshold A. * Handover from LTE to WiFi if LTE < {@link #KEY_LTE_THRESHOLD_1} and WiFi >= {@link * #KEY_WIFI_THRESHOLD_A}. * Value is in Integer format. * * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_WIFI_THRESHOLD_A = 60; /** * WiFi to LTRE handover threshold B. * Handover from WiFi to LTE if LTE >= {@link #KEY_LTE_THRESHOLD_3} or (WiFi < * {@link #KEY_WIFI_THRESHOLD_B} and LTE >= {@link #KEY_LTE_THRESHOLD_2}). * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_WIFI_THRESHOLD_B = 61; /** * LTE ePDG timer (in seconds). * Device shall not handover back to LTE until the T_ePDG_LTE timer expires. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_LTE_EPDG_TIMER_SEC = 62; /** * WiFi ePDG timer (in seconds). * Device shall not handover back to WiFi until the T_ePDG_WiFi timer expires. * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_WIFI_EPDG_TIMER_SEC = 63; /** * 1x ePDG timer (in seconds). * Device shall not re-register on 1x until the T_ePDG_1x timer expires. * @hide */ public static final int KEY_1X_EPDG_TIMER_SEC = 64; /** * MultiEndpoint status: Enabled (1), or Disabled (0). * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_MULTIENDPOINT_ENABLED = 65; /** * RTT status: Enabled (1), or Disabled (0). * Value is in Integer format. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_RTT_ENABLED = 66; /** * An obfuscated string defined by the carrier to indicate VoWiFi entitlement status. * *

Implementation note: how to generate the value and how it affects VoWiFi service * should follow carrier requirements. For example, set an empty string could result in * VoWiFi being disabled by IMS service, and set to a specific string could enable. * *

Value is in String format. * @see #setProvisioningStringValue(int, String) * @see #getProvisioningStringValue(int) */ public static final int KEY_VOICE_OVER_WIFI_ENTITLEMENT_ID = 67; /** * An integer key representing the voice over IMS opt-in provisioning status for the * associated subscription. Determines whether the user can see for voice services over * IMS. * *

The flag will force to show the VoLTE option in settings irrespective of others VoLTE * carrier config which hide the VoLTE option (e.g. * {@link CarrierConfigManager#KEY_HIDE_ENHANCED_4G_LTE_BOOL}). * *

Use {@link #PROVISIONING_VALUE_ENABLED} to enable VoIMS provisioning and * {@link #PROVISIONING_VALUE_DISABLED} to disable VoIMS provisioning. * @see #setProvisioningIntValue(int, int) * @see #getProvisioningIntValue(int) * @hide */ public static final int KEY_VOIMS_OPT_IN_STATUS = 68; /** * Callback for IMS provisioning changes. */ public static class Callback { private static class CallbackBinder extends IImsConfigCallback.Stub { private final Callback mLocalConfigurationCallback; private Executor mExecutor; private CallbackBinder(Callback localConfigurationCallback) { mLocalConfigurationCallback = localConfigurationCallback; } @Override public final void onIntConfigChanged(int item, int value) { final long callingIdentity = Binder.clearCallingIdentity(); try { mExecutor.execute(() -> mLocalConfigurationCallback.onProvisioningIntChanged(item, value)); } finally { restoreCallingIdentity(callingIdentity); } } @Override public final void onStringConfigChanged(int item, String value) { final long callingIdentity = Binder.clearCallingIdentity(); try { mExecutor.execute(() -> mLocalConfigurationCallback.onProvisioningStringChanged(item, value)); } finally { restoreCallingIdentity(callingIdentity); } } private void setExecutor(Executor executor) { mExecutor = executor; } } private final CallbackBinder mBinder = new CallbackBinder(this); /** * Called when a provisioning item has changed. * @param item the IMS provisioning key constant, as defined by the OEM. * @param value the new integer value of the IMS provisioning key. */ public void onProvisioningIntChanged(int item, int value) { // Base Implementation } /** * Called when a provisioning item has changed. * @param item the IMS provisioning key constant, as defined by the OEM. * @param value the new String value of the IMS configuration constant. */ public void onProvisioningStringChanged(int item, @NonNull String value) { // Base Implementation } /**@hide*/ public final IImsConfigCallback getBinder() { return mBinder; } /**@hide*/ public void setExecutor(Executor executor) { mBinder.setExecutor(executor); } } private int mSubId; /** * The callback for RCS provisioning changes. */ public static class RcsProvisioningCallback { private static class CallbackBinder extends IRcsConfigCallback.Stub { private final RcsProvisioningCallback mLocalCallback; private Executor mExecutor; private CallbackBinder(RcsProvisioningCallback localCallback) { mLocalCallback = localCallback; } @Override public void onConfigurationChanged(byte[] configXml) { final long identity = Binder.clearCallingIdentity(); try { mExecutor.execute(() -> mLocalCallback.onConfigurationChanged(configXml)); } finally { Binder.restoreCallingIdentity(identity); } } @Override public void onAutoConfigurationErrorReceived(int errorCode, String errorString) { final long identity = Binder.clearCallingIdentity(); try { mExecutor.execute(() -> mLocalCallback.onAutoConfigurationErrorReceived( errorCode, errorString)); } finally { Binder.restoreCallingIdentity(identity); } } @Override public void onConfigurationReset() { final long identity = Binder.clearCallingIdentity(); try { mExecutor.execute(() -> mLocalCallback.onConfigurationReset()); } finally { Binder.restoreCallingIdentity(identity); } } @Override public void onRemoved() { final long identity = Binder.clearCallingIdentity(); try { mExecutor.execute(() -> mLocalCallback.onRemoved()); } finally { Binder.restoreCallingIdentity(identity); } } @Override public void onPreProvisioningReceived(byte[] configXml) { final long identity = Binder.clearCallingIdentity(); try { mExecutor.execute(() -> mLocalCallback.onPreProvisioningReceived(configXml)); } finally { Binder.restoreCallingIdentity(identity); } } private void setExecutor(Executor executor) { mExecutor = executor; } } private final CallbackBinder mBinder = new CallbackBinder(this); /** * RCS configuration received via OTA provisioning. Configuration may change * due to various triggers defined in GSMA RCC.14 for ACS(auto configuration * server) or other operator defined triggers. If RCS provisioning is already * completed at the time of callback registration, then this method shall be * invoked with the current configuration. * @param configXml The RCS configuration XML received by OTA. It is defined * by GSMA RCC.07. */ public void onConfigurationChanged(@NonNull byte[] configXml) {} /** * Errors during autoconfiguration connection setup are notified by the * ACS(auto configuration server) client using this interface. * @param errorCode HTTP error received during connection setup defined in * GSMA RCC.14 2.4.3, like {@link java.net.HttpURLConnection#HTTP_UNAUTHORIZED}, * {@link java.net.HttpURLConnection#HTTP_FORBIDDEN}, etc. * @param errorString reason phrase received with the error */ public void onAutoConfigurationErrorReceived(int errorCode, @NonNull String errorString) {} /** * When the previously valid RCS configuration is cleaned up by telephony for * any case like SIM removed, default messaging application changed, etc., * this method will be invoked to notify the application regarding this change. */ public void onConfigurationReset() {} /** * When the RCS application is no longer the Default messaging application, * or when the subscription associated with this callback is removed (SIM * removed, ESIM swap,etc...), callback will automatically be removed and * the below method is invoked. There is a possibility that the method is * invoked after the subscription has become inactive */ public void onRemoved() {} /** * Some carriers using ACS (auto configuration server) may send a carrier-specific * pre-provisioning configuration XML if the user has not been provisioned for RCS * services yet. When this provisioning XML is received, the framework will move * into a "not provisioned" state for RCS. In order for provisioning to proceed, * the application must parse this configuration XML and perform the carrier specific * opt-in flow for RCS services. If the user accepts, {@link #triggerRcsReconfiguration} * must be called in order for the device to move out of this state and try to fetch * the RCS provisioning information. * * @param configXml the pre-provisioning config in carrier specified format. */ public void onPreProvisioningReceived(@NonNull byte[] configXml) {} /**@hide*/ public final IRcsConfigCallback getBinder() { return mBinder; } /**@hide*/ public void setExecutor(Executor executor) { mBinder.setExecutor(executor); } } /** * Create a new {@link ProvisioningManager} for the subscription specified. * * @param subId The ID of the subscription that this ProvisioningManager will use. * @see android.telephony.SubscriptionManager#getActiveSubscriptionInfoList() * @throws IllegalArgumentException if the subscription is invalid. */ public static @NonNull ProvisioningManager createForSubscriptionId(int subId) { if (!SubscriptionManager.isValidSubscriptionId(subId)) { throw new IllegalArgumentException("Invalid subscription ID"); } return new ProvisioningManager(subId); } private ProvisioningManager(int subId) { mSubId = subId; } /** * Register a new {@link Callback} to listen to changes to changes in IMS provisioning. * * When the subscription associated with this callback is removed (SIM removed, ESIM swap, * etc...), this callback will automatically be removed. * @param executor The {@link Executor} to call the callback methods on * @param callback The provisioning callbackto be registered. * @see #unregisterProvisioningChangedCallback(Callback) * @see SubscriptionManager.OnSubscriptionsChangedListener * @throws IllegalArgumentException if the subscription associated with this callback is not * active (SIM is not inserted, ESIM inactive) or the subscription is invalid. * @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. */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerProvisioningChangedCallback(@NonNull @CallbackExecutor Executor executor, @NonNull Callback callback) throws ImsException { callback.setExecutor(executor); try { getITelephony().registerImsProvisioningChangedCallback(mSubId, callback.getBinder()); } catch (ServiceSpecificException e) { throw new ImsException(e.getMessage(), e.errorCode); } catch (RemoteException | IllegalStateException e) { throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE); } } /** * Unregister an existing {@link Callback}. 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. * @param callback The existing {@link Callback} to be removed. * @see #registerProvisioningChangedCallback(Executor, Callback) * * @throws IllegalArgumentException if the subscription associated with this callback is * invalid. */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull Callback callback) { try { getITelephony().unregisterImsProvisioningChangedCallback(mSubId, callback.getBinder()); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Query for the integer value associated with the provided key. * * This operation is blocking and should not be performed on the UI thread. * * @param key An integer that represents the provisioning key, which is defined by the OEM. * @return an integer value for the provided key, or * {@link ImsConfigImplBase#CONFIG_RESULT_UNKNOWN} if the key doesn't exist. * @throws IllegalArgumentException if the key provided was invalid. */ @WorkerThread @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getProvisioningIntValue(int key) { try { return getITelephony().getImsProvisioningInt(mSubId, key); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Query for the String value associated with the provided key. * * This operation is blocking and should not be performed on the UI thread. * * @param key A String that represents the provisioning key, which is defined by the OEM. * @return a String value for the provided key, {@code null} if the key doesn't exist, or * {@link StringResultError} if there was an error getting the value for the provided key. * @throws IllegalArgumentException if the key provided was invalid. */ @WorkerThread @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public @Nullable @StringResultError String getProvisioningStringValue(int key) { try { return getITelephony().getImsProvisioningString(mSubId, key); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Set the integer value associated with the provided key. * * This operation is blocking and should not be performed on the UI thread. * * Use {@link #setProvisioningStringValue(int, String)} with proper namespacing (to be defined * per OEM or carrier) when possible instead to avoid key collision if needed. * @param key An integer that represents the provisioning key, which is defined by the OEM. * @param value a integer value for the provided key. * @return the result of setting the configuration value. */ @WorkerThread @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public @ImsConfigImplBase.SetConfigResult int setProvisioningIntValue(int key, int value) { try { return getITelephony().setImsProvisioningInt(mSubId, key, value); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Set the String value associated with the provided key. * * This operation is blocking and should not be performed on the UI thread. * * @param key A String that represents the provisioning key, which is defined by the OEM and * should be appropriately namespaced to avoid collision. * @param value a String value for the provided key. * @return the result of setting the configuration value. */ @WorkerThread @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public @ImsConfigImplBase.SetConfigResult int setProvisioningStringValue(int key, @NonNull String value) { try { return getITelephony().setImsProvisioningString(mSubId, key, value); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Set the provisioning status for the IMS MmTel capability using the specified subscription. * * Provisioning may or may not be required, depending on the carrier configuration. If * provisioning is not required for the carrier associated with this subscription or the device * does not support the capability/technology combination specified, this operation will be a * no-op. * * @see CarrierConfigManager#KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL * @see CarrierConfigManager#KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL * @param isProvisioned true if the device is provisioned for UT over IMS, false otherwise. */ @WorkerThread @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setProvisioningStatusForCapability( @MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int tech, boolean isProvisioned) { try { getITelephony().setImsProvisioningStatusForCapability(mSubId, capability, tech, isProvisioned); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Get the provisioning status for the IMS MmTel capability specified. * * If provisioning is not required for the queried * {@link MmTelFeature.MmTelCapabilities.MmTelCapability} and * {@link ImsRegistrationImplBase.ImsRegistrationTech} combination specified, this method will * always return {@code true}. * * @see CarrierConfigManager#KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL * @see CarrierConfigManager#KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL * @return true if the device is provisioned for the capability or does not require * provisioning, false if the capability does require provisioning and has not been * provisioned yet. */ @WorkerThread @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getProvisioningStatusForCapability( @MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int tech) { try { return getITelephony().getImsProvisioningStatusForCapability(mSubId, capability, tech); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Get the provisioning status for the IMS RCS capability specified. * * If provisioning is not required for the queried * {@link RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag} this method will always return * {@code true}. * * @see CarrierConfigManager#KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL * @return true if the device is provisioned for the capability or does not require * provisioning, false if the capability does require provisioning and has not been * provisioned yet. */ @WorkerThread @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getRcsProvisioningStatusForCapability( @RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability) { try { return getITelephony().getRcsProvisioningStatusForCapability(mSubId, capability); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Set the provisioning status for the IMS RCS capability using the specified subscription. * * Provisioning may or may not be required, depending on the carrier configuration. If * provisioning is not required for the carrier associated with this subscription or the device * does not support the capability/technology combination specified, this operation will be a * no-op. * * @see CarrierConfigManager#KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL * @param isProvisioned true if the device is provisioned for the RCS capability specified, * false otherwise. */ @WorkerThread @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setRcsProvisioningStatusForCapability( @RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability, boolean isProvisioned) { try { getITelephony().setRcsProvisioningStatusForCapability(mSubId, capability, isProvisioned); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Notify the framework that an RCS autoconfiguration XML file has been received for * provisioning. *

* Requires Permission: Manifest.permission.MODIFY_PHONE_STATE or that the calling app has * carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}). * @param config The XML file to be read. ASCII/UTF8 encoded text if not compressed. * @param isCompressed The XML file is compressed in gzip format and must be decompressed * before being read. * */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void notifyRcsAutoConfigurationReceived(@NonNull byte[] config, boolean isCompressed) { if (config == null) { throw new IllegalArgumentException("Must include a non-null config XML file."); } try { getITelephony().notifyRcsAutoConfigurationReceived(mSubId, config, isCompressed); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Provides the single registration capability of the device and the carrier. * *

This intent only provides the capability and not the current provisioning status of * the RCS VoLTE single registration feature. Only default messaging application may receive * the intent. * *

Contains {@link #EXTRA_SUBSCRIPTION_ID} to specify the subscription index for which * the intent is valid. and {@link #EXTRA_STATUS} to specify RCS VoLTE single registration * status. */ @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE = "android.telephony.ims.action.RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE"; /** * Integer extra to specify subscription index. */ public static final String EXTRA_SUBSCRIPTION_ID = "android.telephony.ims.extra.SUBSCRIPTION_ID"; /** * Integer extra to specify RCS single registration status * *

The value can be {@link #STATUS_CAPABLE}, {@link #STATUS_DEVICE_NOT_CAPABLE}, * {@link #STATUS_CARRIER_NOT_CAPABLE}, or bitwise OR of * {@link #STATUS_DEVICE_NOT_CAPABLE} and {@link #STATUS_CARRIER_NOT_CAPABLE}. */ public static final String EXTRA_STATUS = "android.telephony.ims.extra.STATUS"; /** * RCS VoLTE single registration is supported by the device and carrier. */ public static final int STATUS_CAPABLE = 0; /** * RCS VoLTE single registration is not supported by the device. */ public static final int STATUS_DEVICE_NOT_CAPABLE = 0x01; /** * RCS VoLTE single registration is not supported by the carrier */ public static final int STATUS_CARRIER_NOT_CAPABLE = 0x01 << 1; /** * Provide the client configuration parameters of the RCS application. * *

When this application is also the default messaging application, and RCS * provisioning is done using autoconfiguration, then these parameters shall be * sent in the HTTP get request to fetch the RCS provisioning. RCS client * configuration must be provided by the application before registering for the * provisioning status events {@link #registerRcsProvisioningCallback()} * When the IMS/RCS service receives the RCS client configuration, it will detect * the change in the configuration, and trigger the auto-configuration as needed. * @param rcc RCS client configuration {@link RcsClientConfiguration} */ @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void setRcsClientConfiguration( @NonNull RcsClientConfiguration rcc) throws ImsException { try { getITelephony().setRcsClientConfiguration(mSubId, rcc); } catch (ServiceSpecificException e) { throw new ImsException(e.getMessage(), e.errorCode); } catch (RemoteException | IllegalStateException e) { throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE); } } /** * Returns a flag to indicate whether or not the device supports IMS single registration for * MMTEL and RCS features as well as if the carrier has provisioned the feature. * *

Requires Permission: *

    *
  • {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},
  • *
  • {@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},
  • *
  • or that the caller has carrier privileges (see * {@link TelephonyManager#hasCarrierPrivileges()}).
  • *
* @return true if IMS single registration is capable at this time, or false otherwise * @throws ImsException If the remote ImsService is not available for * any reason or the subscription associated with this instance is no * longer active. See {@link ImsException#getCode()} for more * information. * @see PackageManager#FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION for whether or not this * device supports IMS single registration. */ @RequiresPermission(anyOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public boolean isRcsVolteSingleRegistrationCapable() throws ImsException { try { return getITelephony().isRcsVolteSingleRegistrationCapable(mSubId); } catch (RemoteException | IllegalStateException e) { throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE); } } /** * Registers a new {@link RcsProvisioningCallback} to listen to changes to * RCS provisioning xml. * *

RCS application must be the default messaging application and must * have already registered its {@link RcsClientConfiguration} by using * {@link #setRcsClientConfiguration} before it registers the provisioning * callback. If ProvisioningManager has a valid RCS configuration at the * time of callback registration and a reconfiguration is not required * due to RCS client parameters change, then the callback shall be invoked * immediately with the xml. * When the subscription associated with this callback is removed (SIM removed, * ESIM swap,etc...), this callback will automatically be removed. *

Requires Permission: *

    *
  • {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},
  • *
  • {@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},
  • *
  • or that the caller has carrier privileges (see * {@link TelephonyManager#hasCarrierPrivileges()}).
  • *
* * @param executor The {@link Executor} to call the callback methods on * @param callback The rcs provisioning callback to be registered. * @see #unregisterRcsProvisioningCallback(RcsProvisioningCallback) * @see SubscriptionManager.OnSubscriptionsChangedListener * @throws IllegalArgumentException if the subscription associated with this * callback is not active (SIM is not inserted, ESIM inactive) or the * subscription is invalid. * @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. * It shall also throw this exception when the RCS client parameters for the * application are not valid. In that case application must set the client * params (See {@link #setRcsClientConfiguration}) and re register the * callback. * See {@link ImsException#getCode()} for a more detailed reason. */ @RequiresPermission(anyOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void registerRcsProvisioningCallback( @NonNull @CallbackExecutor Executor executor, @NonNull RcsProvisioningCallback callback) throws ImsException { callback.setExecutor(executor); try { getITelephony().registerRcsProvisioningCallback(mSubId, callback.getBinder()); } catch (ServiceSpecificException e) { throw new ImsException(e.getMessage(), e.errorCode); } catch (RemoteException | IllegalStateException e) { throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE); } } /** * Unregister an existing {@link RcsProvisioningCallback}. Application can * unregister when its no longer interested in the provisioning updates * like when a user disables RCS from the UI/settings. * 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. *

Requires Permission: *

    *
  • {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},
  • *
  • {@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},
  • *
  • or that the caller has carrier privileges (see * {@link TelephonyManager#hasCarrierPrivileges()}).
  • *
* * @param callback The existing {@link RcsProvisioningCallback} to be * removed. * @see #registerRcsProvisioningCallback(Executor, RcsProvisioningCallback) * @throws IllegalArgumentException if the subscription associated with * this callback is invalid. */ @RequiresPermission(anyOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void unregisterRcsProvisioningCallback( @NonNull RcsProvisioningCallback callback) { try { getITelephony().unregisterRcsProvisioningCallback( mSubId, callback.getBinder()); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } /** * Reconfiguration triggered by the RCS application. Most likely cause * is the 403 forbidden to a HTTP request. * *

When this api is called, the RCS configuration for the associated * subscription will be removed, and the application which has registered * {@link RcsProvisioningCallback} may expect to receive * {@link RcsProvisioningCallback#onConfigurationReset}, then * {@link RcsProvisioningCallback#onConfigurationChanged} when the new * RCS configuration is received and notified by * {@link #notifyRcsAutoConfigurationReceived} */ @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void triggerRcsReconfiguration() { try { getITelephony().triggerRcsReconfiguration(mSubId); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } private static ITelephony getITelephony() { ITelephony binder = ITelephony.Stub.asInterface( TelephonyFrameworkInitializer .getTelephonyServiceManager() .getTelephonyServiceRegisterer() .get()); if (binder == null) { throw new RuntimeException("Could not find Telephony Service."); } return binder; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy