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: I7630e74a9361093d8cbe72fa72c14aaaab9fcc17
This commit is contained in:
@@ -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);
|
||||
@@ -545,7 +547,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);
|
||||
@@ -602,6 +604,7 @@ public class RadioInfo extends Activity {
|
||||
cbrsDataSwitch.setOnCheckedChangeListener(mCbrsDataSwitchChangeListener);
|
||||
}
|
||||
|
||||
unregisterPhoneStateListener();
|
||||
registerPhoneStateListener();
|
||||
|
||||
mConnectivityManager.registerNetworkCallback(
|
||||
@@ -666,7 +669,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);
|
||||
}
|
||||
@@ -709,8 +712,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
|
||||
@@ -728,7 +755,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");
|
||||
}
|
||||
|
||||
@@ -948,7 +975,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()));
|
||||
}
|
||||
|
||||
@@ -1038,12 +1065,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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1052,16 +1079,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);
|
||||
}
|
||||
@@ -1138,7 +1165,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() {
|
||||
@@ -1210,8 +1237,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;
|
||||
}
|
||||
@@ -1225,8 +1251,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;
|
||||
}
|
||||
@@ -1241,8 +1266,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;
|
||||
}
|
||||
@@ -1250,11 +1274,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) :
|
||||
@@ -1311,7 +1335,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() {
|
||||
@@ -1343,7 +1367,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 {
|
||||
@@ -1362,14 +1386,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;
|
||||
}
|
||||
@@ -1382,9 +1406,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;
|
||||
}
|
||||
@@ -1397,9 +1421,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;
|
||||
}
|
||||
@@ -1454,7 +1478,7 @@ public class RadioInfo extends Activity {
|
||||
}
|
||||
|
||||
private void updateImsProvisionedState() {
|
||||
if (!ImsManager.isImsSupportedOnDevice(phone.getContext())) {
|
||||
if (!ImsManager.isImsSupportedOnDevice(mPhone.getContext())) {
|
||||
return;
|
||||
}
|
||||
log("updateImsProvisionedState isImsVolteProvisioned()=" + isImsVolteProvisioned());
|
||||
@@ -1464,31 +1488,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();
|
||||
}
|
||||
};
|
||||
@@ -1515,7 +1539,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));
|
||||
}
|
||||
};
|
||||
@@ -1560,14 +1584,40 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
public void onNothingSelected(AdapterView parent) {
|
||||
}
|
||||
};
|
||||
|
||||
AdapterView.OnItemSelectedListener mSelectPhoneIndexHandler =
|
||||
new AdapterView.OnItemSelectedListener() {
|
||||
|
||||
public void onItemSelected(AdapterView parent, View v, int pos, long id) {
|
||||
if (pos >= 0 && pos <= mPhoneIndexLabels.length - 1) {
|
||||
// the array position is equal to the phone index
|
||||
int phoneIndex = pos;
|
||||
Phone[] phones = PhoneFactory.getPhones();
|
||||
if (phones == null || phones.length <= phoneIndex) {
|
||||
return;
|
||||
}
|
||||
// getSubId says it takes a slotIndex, but it actually takes a phone index
|
||||
int[] subIds = SubscriptionManager.getSubId(phoneIndex);
|
||||
if (subIds == null || subIds.length < 1) {
|
||||
return;
|
||||
}
|
||||
mSelectedPhoneIndex = phoneIndex;
|
||||
|
||||
updatePhoneIndex(phoneIndex, subIds[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user