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

Commit e431f633 authored by Jordan Liu's avatar Jordan Liu
Browse files

Do not reuse phonestatelistener

Due to b/117555407, the same PhoneStateListener object can not be used
to register on different subIds, so we workaround this by recreating
the PhoneStateListener when reregistering.

Fixes: 129989656
Test: manual
Change-Id: I9d6631da628351511e285afeb5b6d4331aaab7e5
Merged-In: I9d6631da628351511e285afeb5b6d4331aaab7e5
Merged-In: I7630e74a9361093d8cbe72fa72c14aaaab9fcc17
parent 70cae1ce
Loading
Loading
Loading
Loading
+77 −53
Original line number Diff line number Diff line
@@ -228,7 +228,7 @@ public class RadioInfo extends Activity {
    private ConnectivityManager mConnectivityManager;
    private TelephonyManager mTelephonyManager;
    private ImsManager mImsManager = null;
    private Phone phone = null;
    private Phone mPhone = null;

    private String mPingHostnameResultV4;
    private String mPingHostnameResultV6;
@@ -256,7 +256,9 @@ public class RadioInfo extends Activity {
        }
    };

    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
    // not final because we need to recreate this object to register on a new subId (b/117555407)
    private PhoneStateListener mPhoneStateListener = new RadioInfoPhoneStateListener();
    private class RadioInfoPhoneStateListener extends PhoneStateListener {
        @Override
        public void onDataConnectionStateChanged(int state) {
            updateDataState();
@@ -324,7 +326,7 @@ public class RadioInfo extends Activity {
            updatePhysicalChannelConfiguration(configs);
        }

    };
    }

    private void updatePhysicalChannelConfiguration(List<PhysicalChannelConfig> configs) {
            StringBuilder sb = new StringBuilder();
@@ -353,15 +355,15 @@ public class RadioInfo extends Activity {

    private void updatePhoneIndex(int phoneIndex, int subId) {
        // unregister listeners on the old subId
        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
        unregisterPhoneStateListener();
        mTelephonyManager.setCellInfoListRate(CELL_INFO_LIST_RATE_DISABLED);

        // update the subId
        mTelephonyManager = mTelephonyManager.createForSubscriptionId(subId);
        mImsManager = ImsManager.getInstance(getApplicationContext(), phoneIndex);

        // update the phoneId
        phone = PhoneFactory.getPhone(phoneIndex);
        mImsManager = ImsManager.getInstance(getApplicationContext(), phoneIndex);
        mPhone = PhoneFactory.getPhone(phoneIndex);

        updateAllFields();
    }
@@ -424,7 +426,7 @@ public class RadioInfo extends Activity {

        mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
        mConnectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
        phone = PhoneFactory.getDefaultPhone();
        mPhone = PhoneFactory.getDefaultPhone();

        mImsManager = ImsManager.getInstance(getApplicationContext(),
                SubscriptionManager.getDefaultVoicePhoneId());
@@ -484,7 +486,7 @@ public class RadioInfo extends Activity {
        imsWfcProvisionedSwitch = (Switch) findViewById(R.id.wfc_provisioned_switch);
        eabProvisionedSwitch = (Switch) findViewById(R.id.eab_provisioned_switch);

        if (!ImsManager.isImsSupportedOnDevice(phone.getContext())) {
        if (!ImsManager.isImsSupportedOnDevice(mPhone.getContext())) {
            imsVolteProvisionedSwitch.setVisibility(View.GONE);
            imsVtProvisionedSwitch.setVisibility(View.GONE);
            imsWfcProvisionedSwitch.setVisibility(View.GONE);
@@ -525,7 +527,7 @@ public class RadioInfo extends Activity {
        mSelectedPhoneIndex = 0; //phone 0

        //FIXME: Replace with TelephonyManager call
        phone.getPreferredNetworkType(
        mPhone.getPreferredNetworkType(
                mHandler.obtainMessage(EVENT_QUERY_PREFERRED_TYPE_DONE));

        restoreFromBundle(icicle);
@@ -577,6 +579,7 @@ public class RadioInfo extends Activity {
        imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
        eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);

        unregisterPhoneStateListener();
        registerPhoneStateListener();

        mConnectivityManager.registerNetworkCallback(
@@ -641,7 +644,7 @@ public class RadioInfo extends Activity {
                R.string.radioInfo_menu_viewFDN).setOnMenuItemClickListener(mViewFDNCallback);
        menu.add(1, MENU_ITEM_VIEW_SDN, 0,
                R.string.radioInfo_menu_viewSDN).setOnMenuItemClickListener(mViewSDNCallback);
        if (ImsManager.isImsSupportedOnDevice(phone.getContext())) {
        if (ImsManager.isImsSupportedOnDevice(mPhone.getContext())) {
            menu.add(1, MENU_ITEM_GET_IMS_STATUS,
                    0, R.string.radioInfo_menu_getIMS).setOnMenuItemClickListener(mGetImsStatus);
        }
@@ -684,8 +687,32 @@ public class RadioInfo extends Activity {
        return labels;
    }

    private void unregisterPhoneStateListener() {
        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);

        // clear all fields so they are blank until the next listener event occurs
        operatorName.setText("");
        gprsState.setText("");
        dataNetwork.setText("");
        voiceNetwork.setText("");
        sent.setText("");
        received.setText("");
        callState.setText("");
        mLocation.setText("");
        mMwiValue = false;
        mMwi.setText("");
        mCfiValue = false;
        mCfi.setText("");
        mCellInfo.setText("");
        dBm.setText("");
        gsmState.setText("");
        roamingState.setText("");
        mPhyChanConfig.setText("");
    }

    // register mPhoneStateListener for relevant fields using the current TelephonyManager
    private void registerPhoneStateListener() {
        mPhoneStateListener = new RadioInfoPhoneStateListener();
        mTelephonyManager.listen(mPhoneStateListener,
                  PhoneStateListener.LISTEN_CALL_STATE
        //b/27803938 - RadioInfo currently cannot read PRECISE_CALL_STATE
@@ -703,7 +730,7 @@ public class RadioInfo extends Activity {

    private void updateDnsCheckState() {
        //FIXME: Replace with a TelephonyManager call
        dnsCheckState.setText(phone.isDnsCheckDisabled() ?
        dnsCheckState.setText(mPhone.isDnsCheckDisabled() ?
                "0.0.0.0 allowed" :"0.0.0.0 not allowed");
    }

@@ -923,7 +950,7 @@ public class RadioInfo extends Activity {
    }

    private final void updateSubscriptionIds() {
        mSubscriptionId.setText(Integer.toString(phone.getSubId()));
        mSubscriptionId.setText(Integer.toString(mPhone.getSubId()));
        mDds.setText(Integer.toString(SubscriptionManager.getDefaultDataSubscriptionId()));
    }

@@ -1013,12 +1040,12 @@ public class RadioInfo extends Activity {
    }

    private final void updateNetworkType() {
        if(phone != null) {
            ServiceState ss = phone.getServiceState();
        if(mPhone != null) {
            ServiceState ss = mPhone.getServiceState();
            dataNetwork.setText(ServiceState.rilRadioTechnologyToString(
                    phone.getServiceState().getRilDataRadioTechnology()));
                    mPhone.getServiceState().getRilDataRadioTechnology()));
            voiceNetwork.setText(ServiceState.rilRadioTechnologyToString(
                    phone.getServiceState().getRilVoiceRadioTechnology()));
                    mPhone.getServiceState().getRilVoiceRadioTechnology()));
        }
    }

@@ -1027,16 +1054,16 @@ public class RadioInfo extends Activity {
        String s;
        Resources r = getResources();

        s = phone.getDeviceId();
        s = mPhone.getDeviceId();
        if (s == null) s = r.getString(R.string.radioInfo_unknown);
        mDeviceId.setText(s);

        s = phone.getSubscriberId();
        s = mPhone.getSubscriberId();
        if (s == null) s = r.getString(R.string.radioInfo_unknown);
        mSubscriberId.setText(s);

        //FIXME: Replace with a TelephonyManager call
        s = phone.getLine1Number();
        s = mPhone.getLine1Number();
        if (s == null) s = r.getString(R.string.radioInfo_unknown);
        number.setText(s);
    }
@@ -1113,7 +1140,7 @@ public class RadioInfo extends Activity {

    private void refreshSmsc() {
        //FIXME: Replace with a TelephonyManager call
        phone.getSmscAddress(mHandler.obtainMessage(EVENT_QUERY_SMSC_DONE));
        mPhone.getSmscAddress(mHandler.obtainMessage(EVENT_QUERY_SMSC_DONE));
    }

    private final void updateAllCellInfo() {
@@ -1185,8 +1212,7 @@ public class RadioInfo extends Activity {
            // the content provider, which causes it to be loaded in a process
            // other than the Dialer process, which causes a lot of stuff to
            // break.
            intent.setClassName("com.android.phone",
                    "com.android.phone.SimContacts");
            intent.setClassName("com.android.phone", "com.android.phone.SimContacts");
            startActivity(intent);
            return true;
        }
@@ -1200,8 +1226,7 @@ public class RadioInfo extends Activity {
            // the content provider, which causes it to be loaded in a process
            // other than the Dialer process, which causes a lot of stuff to
            // break.
            intent.setClassName("com.android.phone",
                    "com.android.phone.settings.fdn.FdnList");
            intent.setClassName("com.android.phone", "com.android.phone.settings.fdn.FdnList");
            startActivity(intent);
            return true;
        }
@@ -1216,8 +1241,7 @@ public class RadioInfo extends Activity {
            // the content provider, which causes it to be loaded in a process
            // other than the Dialer process, which causes a lot of stuff to
            // break.
            intent.setClassName("com.android.phone",
                    "com.android.phone.ADNList");
            intent.setClassName("com.android.phone", "com.android.phone.ADNList");
            startActivity(intent);
            return true;
        }
@@ -1225,11 +1249,11 @@ public class RadioInfo extends Activity {

    private MenuItem.OnMenuItemClickListener mGetImsStatus = new MenuItem.OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            boolean isImsRegistered = phone.isImsRegistered();
            boolean availableVolte = phone.isVolteEnabled();
            boolean availableWfc = phone.isWifiCallingEnabled();
            boolean availableVt = phone.isVideoEnabled();
            boolean availableUt = phone.isUtEnabled();
            boolean isImsRegistered = mPhone.isImsRegistered();
            boolean availableVolte = mPhone.isVolteEnabled();
            boolean availableWfc = mPhone.isWifiCallingEnabled();
            boolean availableVt = mPhone.isVideoEnabled();
            boolean availableUt = mPhone.isUtEnabled();

            final String imsRegString = isImsRegistered ?
                getString(R.string.radio_info_ims_reg_status_registered) :
@@ -1286,7 +1310,7 @@ public class RadioInfo extends Activity {

    private boolean isRadioOn() {
        //FIXME: Replace with a TelephonyManager call
        return phone.getServiceState().getState() != ServiceState.STATE_POWER_OFF;
        return mPhone.getServiceState().getState() != ServiceState.STATE_POWER_OFF;
    }

    private void updateRadioPowerState() {
@@ -1318,7 +1342,7 @@ public class RadioInfo extends Activity {
    }

    void setImsConfigProvisionedState(int configItem, boolean state) {
        if (phone != null && mImsManager != null) {
        if (mPhone != null && mImsManager != null) {
            QueuedWork.queue(new Runnable() {
                public void run() {
                    try {
@@ -1337,14 +1361,14 @@ public class RadioInfo extends Activity {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            log("toggle radio power: currently " + (isRadioOn()?"on":"off"));
            phone.setRadioPower(isChecked);
            mPhone.setRadioPower(isChecked);
       }
    };

    private boolean isImsVolteProvisioned() {
        if (phone != null && mImsManager != null) {
            return mImsManager.isVolteEnabledByPlatform(phone.getContext())
                && mImsManager.isVolteProvisionedOnDevice(phone.getContext());
        if (mPhone != null && mImsManager != null) {
            return mImsManager.isVolteEnabledByPlatform(mPhone.getContext())
                && mImsManager.isVolteProvisionedOnDevice(mPhone.getContext());
        }
        return false;
    }
@@ -1357,9 +1381,9 @@ public class RadioInfo extends Activity {
    };

    private boolean isImsVtProvisioned() {
        if (phone != null && mImsManager != null) {
            return mImsManager.isVtEnabledByPlatform(phone.getContext())
                && mImsManager.isVtProvisionedOnDevice(phone.getContext());
        if (mPhone != null && mImsManager != null) {
            return mImsManager.isVtEnabledByPlatform(mPhone.getContext())
                && mImsManager.isVtProvisionedOnDevice(mPhone.getContext());
        }
        return false;
    }
@@ -1372,9 +1396,9 @@ public class RadioInfo extends Activity {
    };

    private boolean isImsWfcProvisioned() {
        if (phone != null && mImsManager != null) {
            return mImsManager.isWfcEnabledByPlatform(phone.getContext())
                && mImsManager.isWfcProvisionedOnDevice(phone.getContext());
        if (mPhone != null && mImsManager != null) {
            return mImsManager.isWfcEnabledByPlatform(mPhone.getContext())
                && mImsManager.isWfcProvisionedOnDevice(mPhone.getContext());
        }
        return false;
    }
@@ -1429,7 +1453,7 @@ public class RadioInfo extends Activity {
    }

    private void updateImsProvisionedState() {
        if (!ImsManager.isImsSupportedOnDevice(phone.getContext())) {
        if (!ImsManager.isImsSupportedOnDevice(mPhone.getContext())) {
            return;
        }
        log("updateImsProvisionedState isImsVolteProvisioned()=" + isImsVolteProvisioned());
@@ -1439,31 +1463,31 @@ public class RadioInfo extends Activity {
        imsVolteProvisionedSwitch.setChecked(isImsVolteProvisioned());
        imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
        imsVolteProvisionedSwitch.setEnabled(!Build.IS_USER
                && mImsManager.isVolteEnabledByPlatform(phone.getContext()));
                && mImsManager.isVolteEnabledByPlatform(mPhone.getContext()));

        imsVtProvisionedSwitch.setOnCheckedChangeListener(null);
        imsVtProvisionedSwitch.setChecked(isImsVtProvisioned());
        imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
        imsVtProvisionedSwitch.setEnabled(!Build.IS_USER
                && mImsManager.isVtEnabledByPlatform(phone.getContext()));
                && mImsManager.isVtEnabledByPlatform(mPhone.getContext()));

        imsWfcProvisionedSwitch.setOnCheckedChangeListener(null);
        imsWfcProvisionedSwitch.setChecked(isImsWfcProvisioned());
        imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
        imsWfcProvisionedSwitch.setEnabled(!Build.IS_USER
                && mImsManager.isWfcEnabledByPlatform(phone.getContext()));
                && mImsManager.isWfcEnabledByPlatform(mPhone.getContext()));

        eabProvisionedSwitch.setOnCheckedChangeListener(null);
        eabProvisionedSwitch.setChecked(isEabProvisioned());
        eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
        eabProvisionedSwitch.setEnabled(!Build.IS_USER
                && isEabEnabledByPlatform(phone.getContext()));
                && isEabEnabledByPlatform(mPhone.getContext()));
    }

    OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
        public void onClick(View v) {
            //FIXME: Replace with a TelephonyManager call
            phone.disableDnsCheck(!phone.isDnsCheckDisabled());
            mPhone.disableDnsCheck(!mPhone.isDnsCheckDisabled());
            updateDnsCheckState();
        }
    };
@@ -1490,7 +1514,7 @@ public class RadioInfo extends Activity {
    OnClickListener mUpdateSmscButtonHandler = new OnClickListener() {
        public void onClick(View v) {
            updateSmscButton.setEnabled(false);
            phone.setSmscAddress(smsc.getText().toString(),
            mPhone.setSmscAddress(smsc.getText().toString(),
                    mHandler.obtainMessage(EVENT_UPDATE_SMSC_DONE));
        }
    };
@@ -1535,14 +1559,14 @@ public class RadioInfo extends Activity {
                // want this setting to be set, so that if the radio hiccups and this setting
                // is for some reason unsuccessful, future calls to the radio will reflect
                // the users's preference which is set here.
                final int subId = phone.getSubId();
                final int subId = mPhone.getSubId();
                if (SubscriptionManager.isUsableSubIdValue(subId)) {
                    Settings.Global.putInt(phone.getContext().getContentResolver(),
                    Settings.Global.putInt(mPhone.getContext().getContentResolver(),
                            PREFERRED_NETWORK_MODE + subId, mPreferredNetworkTypeResult);
                }
                log("Calling setPreferredNetworkType(" + mPreferredNetworkTypeResult + ")");
                Message msg = mHandler.obtainMessage(EVENT_SET_PREFERRED_TYPE_DONE);
                phone.setPreferredNetworkType(mPreferredNetworkTypeResult, msg);
                mPhone.setPreferredNetworkType(mPreferredNetworkTypeResult, msg);
            }
        }