From e431f6337f0eadd775c8bed64da74022d466700b Mon Sep 17 00:00:00 2001 From: Jordan Liu Date: Fri, 5 Apr 2019 14:39:41 -0700 Subject: [PATCH] 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 --- src/com/android/settings/RadioInfo.java | 130 ++++++++++++++---------- 1 file changed, 77 insertions(+), 53 deletions(-) diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java index 32e209ea3c4..099b55d732b 100644 --- a/src/com/android/settings/RadioInfo.java +++ b/src/com/android/settings/RadioInfo.java @@ -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 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); } }