Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +153 −1 Original line number Diff line number Diff line Loading @@ -94,6 +94,7 @@ import java.util.Date; import java.util.List; import java.util.TimeZone; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.PatternSyntaxException; /** * {@hide} Loading Loading @@ -444,6 +445,12 @@ public class ServiceStateTracker extends Handler { private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals( CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { updateLteEarfcnLists(); return; } if (!mPhone.isPhoneTypeGsm()) { loge("Ignoring intent " + intent + " received on CDMA phone"); return; Loading Loading @@ -498,6 +505,16 @@ public class ServiceStateTracker extends Handler { private String mRegistrationDeniedReason; private String mCurrentCarrier = null; /* list of LTE EARFCNs (E-UTRA Absolute Radio Frequency Channel Number, * Reference: 3GPP TS 36.104 5.4.3) * inclusive ranges for which the lte rsrp boost is applied */ private ArrayList<Pair<Integer, Integer>> mEarfcnPairListForRsrpBoost = null; private int mLteRsrpBoost = 0; // offset which is reduced from the rsrp threshold // while calculating signal strength level. private final Object mLteRsrpBoostLock = new Object(); private static final int INVALID_LTE_EARFCN = -1; public ServiceStateTracker(GsmCdmaPhone phone, CommandsInterface ci) { mPhone = phone; mCi = ci; Loading Loading @@ -551,6 +568,9 @@ public class ServiceStateTracker extends Handler { filter = new IntentFilter(); filter.addAction(ACTION_RADIO_OFF); context.registerReceiver(mIntentReceiver, filter); filter = new IntentFilter(); filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); context.registerReceiver(mIntentReceiver, filter); mPhone.notifyOtaspChanged(OTASP_UNINITIALIZED); Loading Loading @@ -966,6 +986,25 @@ public class ServiceStateTracker extends Handler { } } private int getLteEarfcn(DataRegStateResult dataRegStateResult) { int lteEarfcn = INVALID_LTE_EARFCN; switch(dataRegStateResult.cellIdentity.cellInfoType) { case CellInfoType.LTE: { if (dataRegStateResult.cellIdentity.cellIdentityLte.size() == 1) { android.hardware.radio.V1_0.CellIdentityLte cellIdentityLte = dataRegStateResult.cellIdentity.cellIdentityLte.get(0); lteEarfcn = cellIdentityLte.earfcn; } break; } default: { break; } } return lteEarfcn; } @Override public void handleMessage(Message msg) { AsyncResult ar; Loading Loading @@ -1785,7 +1824,6 @@ public class ServiceStateTracker extends Handler { int regState = getRegStateFromHalRegState(dataRegStateResult.regState); int dataRegState = regCodeToServiceState(regState); int newDataRat = dataRegStateResult.rat; mNewSS.setDataRegState(dataRegState); mNewSS.setRilDataRadioTechnology(newDataRat); Loading Loading @@ -1834,6 +1872,8 @@ public class ServiceStateTracker extends Handler { + " dataRadioTechnology=" + newDataRat); } } updateServiceStateLteEarfcnBoost(mNewSS, getLteEarfcn(dataRegStateResult)); break; } Loading Loading @@ -4011,6 +4051,97 @@ public class ServiceStateTracker extends Handler { } } /** * Checks if the provided earfcn falls withing the range of earfcns. * * return true if earfcn falls within the provided range; false otherwise. */ private boolean containsEarfcnInEarfcnRange(ArrayList<Pair<Integer, Integer>> earfcnPairList, int earfcn) { if (earfcnPairList != null) { for (Pair<Integer, Integer> earfcnPair : earfcnPairList) { if ((earfcn >= earfcnPair.first) && (earfcn <= earfcnPair.second)) { return true; } } } return false; } /** * Convert the earfcnStringArray to list of pairs. * * Format of the earfcnsList is expected to be {"erafcn1_start-earfcn1_end", * "earfcn2_start-earfcn2_end" ... } */ ArrayList<Pair<Integer, Integer>> convertEarfcnStringArrayToPairList(String[] earfcnsList) { ArrayList<Pair<Integer, Integer>> earfcnPairList = new ArrayList<Pair<Integer, Integer>>(); if (earfcnsList != null) { int earfcnStart; int earfcnEnd; for (int i = 0; i < earfcnsList.length; i++) { try { String[] earfcns = earfcnsList[i].split("-"); if (earfcns.length != 2) { if (VDBG) { log("Invalid earfcn range format"); } return null; } earfcnStart = Integer.parseInt(earfcns[0]); earfcnEnd = Integer.parseInt(earfcns[1]); if (earfcnStart > earfcnEnd) { if (VDBG) { log("Invalid earfcn range format"); } return null; } earfcnPairList.add(new Pair<Integer, Integer>(earfcnStart, earfcnEnd)); } catch (PatternSyntaxException pse) { if (VDBG) { log("Invalid earfcn range format"); } return null; } catch (NumberFormatException nfe) { if (VDBG) { log("Invalid earfcn number format"); } return null; } } } return earfcnPairList; } private void updateLteEarfcnLists() { CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); PersistableBundle b = configManager.getConfigForSubId(mPhone.getSubId()); synchronized (mLteRsrpBoostLock) { mLteRsrpBoost = b.getInt(CarrierConfigManager.KEY_LTE_EARFCNS_RSRP_BOOST_INT, 0); String[] earfcnsStringArrayForRsrpBoost = b.getStringArray( CarrierConfigManager.KEY_BOOSTED_LTE_EARFCNS_STRING_ARRAY); mEarfcnPairListForRsrpBoost = convertEarfcnStringArrayToPairList( earfcnsStringArrayForRsrpBoost); } } private void updateServiceStateLteEarfcnBoost(ServiceState serviceState, int lteEarfcn) { synchronized (mLteRsrpBoostLock) { if ((lteEarfcn != INVALID_LTE_EARFCN) && containsEarfcnInEarfcnRange(mEarfcnPairListForRsrpBoost, lteEarfcn)) { serviceState.setLteEarfcnRsrpBoost(mLteRsrpBoost); } else { serviceState.setLteEarfcnRsrpBoost(0); } } } /** * send signal-strength-changed notification if changed Called both for * solicited and unsolicited signal strength updates Loading @@ -4033,6 +4164,7 @@ public class ServiceStateTracker extends Handler { mSignalStrength = (SignalStrength) ar.result; mSignalStrength.validateInput(); mSignalStrength.setGsm(isGsm); mSignalStrength.setLteRsrpBoost(mSS.getLteEarfcnRsrpBoost()); } else { log("onSignalStrengthResult() Exception from RIL : " + ar.exception); mSignalStrength = new SignalStrength(isGsm); Loading Loading @@ -4228,6 +4360,24 @@ public class ServiceStateTracker extends Handler { } } private void dumpEarfcnPairList(PrintWriter pw) { pw.print(" mEarfcnPairListForRsrpBoost={"); if (mEarfcnPairListForRsrpBoost != null) { int i = mEarfcnPairListForRsrpBoost.size(); for (Pair<Integer, Integer> earfcnPair : mEarfcnPairListForRsrpBoost) { pw.print("("); pw.print(earfcnPair.first); pw.print(","); pw.print(earfcnPair.second); pw.print(")"); if ((--i) != 0) { pw.print(","); } } } pw.println("}"); } private void dumpCellInfoList(PrintWriter pw) { pw.print(" mLastCellInfoList={"); if(mLastCellInfoList != null) { Loading Loading @@ -4316,6 +4466,8 @@ public class ServiceStateTracker extends Handler { pw.println(" mPowerOffDelayNeed=" + mPowerOffDelayNeed); pw.println(" mDeviceShuttingDown=" + mDeviceShuttingDown); pw.println(" mSpnUpdatePending=" + mSpnUpdatePending); pw.println(" mLteRsrpBoost=" + mLteRsrpBoost); dumpEarfcnPairList(pw); pw.println(" Roaming Log:"); IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); Loading Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +153 −1 Original line number Diff line number Diff line Loading @@ -94,6 +94,7 @@ import java.util.Date; import java.util.List; import java.util.TimeZone; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.PatternSyntaxException; /** * {@hide} Loading Loading @@ -444,6 +445,12 @@ public class ServiceStateTracker extends Handler { private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals( CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { updateLteEarfcnLists(); return; } if (!mPhone.isPhoneTypeGsm()) { loge("Ignoring intent " + intent + " received on CDMA phone"); return; Loading Loading @@ -498,6 +505,16 @@ public class ServiceStateTracker extends Handler { private String mRegistrationDeniedReason; private String mCurrentCarrier = null; /* list of LTE EARFCNs (E-UTRA Absolute Radio Frequency Channel Number, * Reference: 3GPP TS 36.104 5.4.3) * inclusive ranges for which the lte rsrp boost is applied */ private ArrayList<Pair<Integer, Integer>> mEarfcnPairListForRsrpBoost = null; private int mLteRsrpBoost = 0; // offset which is reduced from the rsrp threshold // while calculating signal strength level. private final Object mLteRsrpBoostLock = new Object(); private static final int INVALID_LTE_EARFCN = -1; public ServiceStateTracker(GsmCdmaPhone phone, CommandsInterface ci) { mPhone = phone; mCi = ci; Loading Loading @@ -551,6 +568,9 @@ public class ServiceStateTracker extends Handler { filter = new IntentFilter(); filter.addAction(ACTION_RADIO_OFF); context.registerReceiver(mIntentReceiver, filter); filter = new IntentFilter(); filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); context.registerReceiver(mIntentReceiver, filter); mPhone.notifyOtaspChanged(OTASP_UNINITIALIZED); Loading Loading @@ -966,6 +986,25 @@ public class ServiceStateTracker extends Handler { } } private int getLteEarfcn(DataRegStateResult dataRegStateResult) { int lteEarfcn = INVALID_LTE_EARFCN; switch(dataRegStateResult.cellIdentity.cellInfoType) { case CellInfoType.LTE: { if (dataRegStateResult.cellIdentity.cellIdentityLte.size() == 1) { android.hardware.radio.V1_0.CellIdentityLte cellIdentityLte = dataRegStateResult.cellIdentity.cellIdentityLte.get(0); lteEarfcn = cellIdentityLte.earfcn; } break; } default: { break; } } return lteEarfcn; } @Override public void handleMessage(Message msg) { AsyncResult ar; Loading Loading @@ -1785,7 +1824,6 @@ public class ServiceStateTracker extends Handler { int regState = getRegStateFromHalRegState(dataRegStateResult.regState); int dataRegState = regCodeToServiceState(regState); int newDataRat = dataRegStateResult.rat; mNewSS.setDataRegState(dataRegState); mNewSS.setRilDataRadioTechnology(newDataRat); Loading Loading @@ -1834,6 +1872,8 @@ public class ServiceStateTracker extends Handler { + " dataRadioTechnology=" + newDataRat); } } updateServiceStateLteEarfcnBoost(mNewSS, getLteEarfcn(dataRegStateResult)); break; } Loading Loading @@ -4011,6 +4051,97 @@ public class ServiceStateTracker extends Handler { } } /** * Checks if the provided earfcn falls withing the range of earfcns. * * return true if earfcn falls within the provided range; false otherwise. */ private boolean containsEarfcnInEarfcnRange(ArrayList<Pair<Integer, Integer>> earfcnPairList, int earfcn) { if (earfcnPairList != null) { for (Pair<Integer, Integer> earfcnPair : earfcnPairList) { if ((earfcn >= earfcnPair.first) && (earfcn <= earfcnPair.second)) { return true; } } } return false; } /** * Convert the earfcnStringArray to list of pairs. * * Format of the earfcnsList is expected to be {"erafcn1_start-earfcn1_end", * "earfcn2_start-earfcn2_end" ... } */ ArrayList<Pair<Integer, Integer>> convertEarfcnStringArrayToPairList(String[] earfcnsList) { ArrayList<Pair<Integer, Integer>> earfcnPairList = new ArrayList<Pair<Integer, Integer>>(); if (earfcnsList != null) { int earfcnStart; int earfcnEnd; for (int i = 0; i < earfcnsList.length; i++) { try { String[] earfcns = earfcnsList[i].split("-"); if (earfcns.length != 2) { if (VDBG) { log("Invalid earfcn range format"); } return null; } earfcnStart = Integer.parseInt(earfcns[0]); earfcnEnd = Integer.parseInt(earfcns[1]); if (earfcnStart > earfcnEnd) { if (VDBG) { log("Invalid earfcn range format"); } return null; } earfcnPairList.add(new Pair<Integer, Integer>(earfcnStart, earfcnEnd)); } catch (PatternSyntaxException pse) { if (VDBG) { log("Invalid earfcn range format"); } return null; } catch (NumberFormatException nfe) { if (VDBG) { log("Invalid earfcn number format"); } return null; } } } return earfcnPairList; } private void updateLteEarfcnLists() { CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); PersistableBundle b = configManager.getConfigForSubId(mPhone.getSubId()); synchronized (mLteRsrpBoostLock) { mLteRsrpBoost = b.getInt(CarrierConfigManager.KEY_LTE_EARFCNS_RSRP_BOOST_INT, 0); String[] earfcnsStringArrayForRsrpBoost = b.getStringArray( CarrierConfigManager.KEY_BOOSTED_LTE_EARFCNS_STRING_ARRAY); mEarfcnPairListForRsrpBoost = convertEarfcnStringArrayToPairList( earfcnsStringArrayForRsrpBoost); } } private void updateServiceStateLteEarfcnBoost(ServiceState serviceState, int lteEarfcn) { synchronized (mLteRsrpBoostLock) { if ((lteEarfcn != INVALID_LTE_EARFCN) && containsEarfcnInEarfcnRange(mEarfcnPairListForRsrpBoost, lteEarfcn)) { serviceState.setLteEarfcnRsrpBoost(mLteRsrpBoost); } else { serviceState.setLteEarfcnRsrpBoost(0); } } } /** * send signal-strength-changed notification if changed Called both for * solicited and unsolicited signal strength updates Loading @@ -4033,6 +4164,7 @@ public class ServiceStateTracker extends Handler { mSignalStrength = (SignalStrength) ar.result; mSignalStrength.validateInput(); mSignalStrength.setGsm(isGsm); mSignalStrength.setLteRsrpBoost(mSS.getLteEarfcnRsrpBoost()); } else { log("onSignalStrengthResult() Exception from RIL : " + ar.exception); mSignalStrength = new SignalStrength(isGsm); Loading Loading @@ -4228,6 +4360,24 @@ public class ServiceStateTracker extends Handler { } } private void dumpEarfcnPairList(PrintWriter pw) { pw.print(" mEarfcnPairListForRsrpBoost={"); if (mEarfcnPairListForRsrpBoost != null) { int i = mEarfcnPairListForRsrpBoost.size(); for (Pair<Integer, Integer> earfcnPair : mEarfcnPairListForRsrpBoost) { pw.print("("); pw.print(earfcnPair.first); pw.print(","); pw.print(earfcnPair.second); pw.print(")"); if ((--i) != 0) { pw.print(","); } } } pw.println("}"); } private void dumpCellInfoList(PrintWriter pw) { pw.print(" mLastCellInfoList={"); if(mLastCellInfoList != null) { Loading Loading @@ -4316,6 +4466,8 @@ public class ServiceStateTracker extends Handler { pw.println(" mPowerOffDelayNeed=" + mPowerOffDelayNeed); pw.println(" mDeviceShuttingDown=" + mDeviceShuttingDown); pw.println(" mSpnUpdatePending=" + mSpnUpdatePending); pw.println(" mLteRsrpBoost=" + mLteRsrpBoost); dumpEarfcnPairList(pw); pw.println(" Roaming Log:"); IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); Loading