Telephony(MSIM): Fix Cellular Data Preference

While voice call is active, if cellular data preference
updated via updateCellularDataValues(), the cellular data
preference option getting enabled.
To fix this consider the call state while updating
cellular data preference in updateCellularDataValues().

bug:27635796

Change-Id: I5306f021e8bdeecc845d50a3b55b9c07d1b2c837
This commit is contained in:
Sandeep Gutta
2014-12-04 16:42:40 -08:00
committed by Robb Glasser
parent 2cfda2a3bd
commit c4d7823c85

View File

@@ -71,6 +71,10 @@ public class SimSettings extends RestrictedSettingsFragment implements Indexable
private int mNumSlots; private int mNumSlots;
private Context mContext; private Context mContext;
private int mPhoneCount = TelephonyManager.getDefault().getPhoneCount();
private int[] mCallState = new int[mPhoneCount];
private PhoneStateListener[] mPhoneStateListener = new PhoneStateListener[mPhoneCount];
public SimSettings() { public SimSettings() {
super(DISALLOW_CONFIG_SIM); super(DISALLOW_CONFIG_SIM);
} }
@@ -177,7 +181,12 @@ public class SimSettings extends RestrictedSettingsFragment implements Indexable
} else if (sir == null) { } else if (sir == null) {
simPref.setSummary(R.string.sim_selection_required_pref); simPref.setSummary(R.string.sim_selection_required_pref);
} }
simPref.setEnabled(mSelectableSubInfos.size() >= 1);
boolean callStateIdle = isCallStateIdle();
final boolean ecbMode = SystemProperties.getBoolean(
TelephonyProperties.PROPERTY_INECM_MODE, false);
// Enable data preference in msim mode and call state idle
simPref.setEnabled((mSelectableSubInfos.size() >= 1) && callStateIdle && !ecbMode);
} }
private void updateCallValues() { private void updateCallValues() {
@@ -199,10 +208,17 @@ public class SimSettings extends RestrictedSettingsFragment implements Indexable
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
updateSubscriptions();
final TelephonyManager tm = final TelephonyManager tm =
(TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE); (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); if (mSelectableSubInfos.size() > 1) {
updateSubscriptions(); Log.d(TAG, "Register for call state change");
for (int i = 0; i < mPhoneCount; i++) {
int subId = mSelectableSubInfos.get(i).getSubscriptionId();
tm.listen(getPhoneStateListener(i, subId),
PhoneStateListener.LISTEN_CALL_STATE);
}
}
} }
@Override @Override
@@ -210,25 +226,30 @@ public class SimSettings extends RestrictedSettingsFragment implements Indexable
super.onPause(); super.onPause();
mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); for (int i = 0; i < mPhoneCount; i++) {
if (mPhoneStateListener[i] != null) {
tm.listen(mPhoneStateListener[i], PhoneStateListener.LISTEN_NONE);
mPhoneStateListener[i] = null;
}
}
} }
private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() { private PhoneStateListener getPhoneStateListener(int phoneId, int subId) {
// Disable Sim selection for Data when voice call is going on as changing the default data // Disable Sim selection for Data when voice call is going on as changing the default data
// sim causes a modem reset currently and call gets disconnected // sim causes a modem reset currently and call gets disconnected
// ToDo : Add subtext on disabled preference to let user know that default data sim cannot // ToDo : Add subtext on disabled preference to let user know that default data sim cannot
// be changed while call is going on // be changed while call is going on
@Override final int i = phoneId;
public void onCallStateChanged(int state, String incomingNumber) { mPhoneStateListener[phoneId] = new PhoneStateListener(subId) {
if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state); @Override
final Preference pref = findPreference(KEY_CELLULAR_DATA); public void onCallStateChanged(int state, String incomingNumber) {
if (pref != null) { if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
final boolean ecbMode = SystemProperties.getBoolean( mCallState[i] = state;
TelephonyProperties.PROPERTY_INECM_MODE, false); updateCellularDataValues();
pref.setEnabled((state == TelephonyManager.CALL_STATE_IDLE) && !ecbMode);
} }
} };
}; return mPhoneStateListener[phoneId];
}
@Override @Override
public boolean onPreferenceTreeClick(final Preference preference) { public boolean onPreferenceTreeClick(final Preference preference) {
@@ -327,4 +348,15 @@ public class SimSettings extends RestrictedSettingsFragment implements Indexable
return result; return result;
} }
}; };
private boolean isCallStateIdle() {
boolean callStateIdle = true;
for (int i = 0; i < mCallState.length; i++) {
if (TelephonyManager.CALL_STATE_IDLE != mCallState[i]) {
callStateIdle = false;
}
}
Log.d(TAG, "isCallStateIdle " + callStateIdle);
return callStateIdle;
}
} }