Cómo get un PhoneStateListener cuando usa la funcionalidad Dual SIM

así que actualmente estoy implementando una function de desvío de llamadas en Android, para dispositivos con doble SIM. Para leer el estado actual del desvío de llamadas (habilitado / deshabilitado) para una tarjeta SIM, hago lo siguiente:

  1. Creo un object de TelephonyManager :

val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager

  1. Creo un object PhoneStateListener y onCallForwardingIndicatorChanged método onCallForwardingIndicatorChanged :

     val myPhoneStateListener = object: PhoneStateListener() { override fun onCallForwardingIndicatorChanged(isCallForwardingEnabled: Boolean) { if(isCallForwardingEnabled) println("Call forwarding enabled!") else println("Call forwarding disabled!") } } 
  2. PhoneStateListener el PhoneStateListener :

telephonyManager.listen(myPhoneStateListener, LISTEN_CALL_FORWARDING_INDICATOR)

Esto funciona perfectamente bien para la tarjeta SIM primaria (la primera).

Pero tengo problemas para hacer lo mismo con la segunda tarjeta SIM. Así es como estoy tratando de hacerlo:

  1. Utilizo un object SubscriptionManager para recuperar el subscriptionId de la segunda tarjeta SIM:

     val subscriptionManager = getSystemService(TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager val subscriptionIdOfSimCard2 = subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(1).subscriptionId 
  2. Creo un TelephonyManager separado para la segunda tarjeta SIM, con el subscriptionId correcto:

     val secondTelephonyManager = (getSystemService(TELEPHONY_SERVICE) as TelephonyManager).createForSubscriptionId(subscriptionIdOfSimCard2) 
  3. Creo un segundo PhoneStateListener , como el de la primera tarjeta SIM, llamémoslo mySecondPhoneStateListener y lo registramos con el segundo TelephonyManager :

     secondTelephonyManager.listen(mySecondPhoneStateListener, LISTEN_CALL_FORWARDING_INDICATOR) 

El problema ahora es que en mySecondPhoneStateListener no obtengo devoluciones de llamada para la segunda tarjeta SIM, pero sigue siendo la principal, la primera. Después de search en el código fuente de Android, descubrí por qué: en el método de listen(PhoneStateListener listener, int events) del TelephonyManager se usa el subscriptionId incorrecto, es decir, no el configurado en el TelephonyManager sino el del PhoneStateListener object, que es el subscriptionId de la primera tarjeta SIM, por defecto:

 public void listen(PhoneStateListener listener, int events) { if (mContext == null) return; try { Boolean notifyNow = (getITelephony() != null); sRegistry.listenForSubscriber(listener.mSubId, */ HERE: listener.mSubId is used instead of this.mSubId */ getOpPackageName(), listener.callback, events, notifyNow); } catch (RemoteException ex) { // system process dead } catch (NullPointerException ex) { // system process dead } } 

Este problema podría resolverse estableciendo el subscriptionId correcto para el object PhoneStateListener , sin embargo, el constructor apropiado está oculto:

 /** * Create a PhoneStateListener for the Phone using the specified subscription. * This class requires Looper.myLooper() not return null. To supply your * own non-null Looper use PhoneStateListener(int subId, Looper looper) below. * @hide */<-- HIDDEN, NOT ACCESSIBLE*/ */ public PhoneStateListener(int subId) { this(subId, Looper.myLooper()); } 

Pude "resolver" esto con la reflexión, estableciendo el campo PhoneStateListener object PhoneStateListener en el subscriptionId apropiado de la segunda tarjeta SIM.

Pero tiene que haber una mejor manera de hacer esto, ¿me estoy perdiendo algo?