Loading src/java/com/android/internal/telephony/dataconnection/DcTracker.java +55 −29 Original line number Diff line number Diff line Loading @@ -4023,14 +4023,7 @@ public class DcTracker extends Handler { private void reevaluateUnmeteredConnections() { log("reevaluateUnmeteredConnections"); int rat = mPhone.getDisplayInfoController().getTelephonyDisplayInfo().getNetworkType(); int override = mPhone.getDisplayInfoController().getTelephonyDisplayInfo() .getOverrideNetworkType(); boolean nrPlanUnmetered = isNetworkTypeUnmetered(NETWORK_TYPE_NR) && (rat == NETWORK_TYPE_NR || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE); if ((nrPlanUnmetered || isNrNsaFrequencyRangeUnmetered() || isNrSaFrequencyRangeUnmetered()) && !mPhone.getServiceState().getRoaming() || mRoamingUnmetered) { if (DBG) log("NR is unmetered"); if (isNrUnmetered() && !mPhone.getServiceState().getRoaming() || mRoamingUnmetered) { setDataConnectionUnmetered(true); if (!mWatchdog) { startWatchdogAlarm(); Loading Loading @@ -4084,34 +4077,67 @@ public class DcTracker extends Handler { || plan.getDataLimitBehavior() == SubscriptionPlan.LIMIT_BEHAVIOR_THROTTLED); } private boolean isNrNsaFrequencyRangeUnmetered() { private boolean isNrUnmetered() { int rat = mPhone.getDisplayInfoController().getTelephonyDisplayInfo().getNetworkType(); int override = mPhone.getDisplayInfoController().getTelephonyDisplayInfo() .getOverrideNetworkType(); if (mNrNsaMmwaveUnmetered || mNrNsaSub6Unmetered) { return (mNrNsaMmwaveUnmetered && override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE) || (mNrNsaSub6Unmetered && override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA); } else { return mNrNsaAllUnmetered && (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA); if (isNetworkTypeUnmetered(NETWORK_TYPE_NR)) { if (mNrNsaMmwaveUnmetered) { if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE) { if (DBG) log("NR unmetered for mmwave only via SubscriptionPlans"); return true; } return false; } else if (mNrNsaSub6Unmetered) { if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA) { if (DBG) log("NR unmetered for sub6 only via SubscriptionPlans"); return true; } return false; } if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA || rat == NETWORK_TYPE_NR) { if (DBG) log("NR unmetered for all frequencies via SubscriptionPlans"); return true; } return false; } private boolean isNrSaFrequencyRangeUnmetered() { if (ServiceState.rilRadioTechnologyToNetworkType(getDataRat()) != NETWORK_TYPE_NR) { if (mNrNsaAllUnmetered) { if (mNrNsaMmwaveUnmetered) { if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE) { if (DBG) log("NR NSA unmetered for mmwave only via carrier configs"); return true; } return false; } else if (mNrNsaSub6Unmetered) { if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA) { if (DBG) log("NR NSA unmetered for sub6 only via carrier configs"); return true; } if (mNrSaMmwaveUnmetered || mNrSaSub6Unmetered) { int frequencyRange = mPhone.getServiceState().getNrFrequencyRange(); boolean mmwave = frequencyRange == ServiceState.FREQUENCY_RANGE_MMWAVE; // frequency range LOW, MID, or HIGH boolean sub6 = frequencyRange != ServiceState.FREQUENCY_RANGE_UNKNOWN && !mmwave; return mNrSaMmwaveUnmetered && mmwave || mNrSaSub6Unmetered && sub6; } else { return mNrSaAllUnmetered; return false; } if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA) { if (DBG) log("NR NSA unmetered for all frequencies via carrier configs"); return true; } return false; } if (mNrSaAllUnmetered) { // TODO: add logic for mNrSaMmwaveUnmetered and mNrSaSub6Unmetered once it's defined // in TelephonyDisplayInfo if (rat == NETWORK_TYPE_NR) { if (DBG) log("NR SA unmetered for all frequencies via carrier configs"); return true; } return false; } return false; } protected void log(String s) { Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +51 −1 Original line number Diff line number Diff line Loading @@ -1813,7 +1813,55 @@ public class DcTrackerTest extends TelephonyTest { } @Test public void testIsFrequencyRangeUnmetered() throws Exception { public void testIsNrUnmeteredSubscriptionPlans() throws Exception { initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL}); int id = setUpDataConnection(); setUpSubscriptionPlans(false); setUpWatchdogTimer(); doReturn(new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_LTE, TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA)) .when(mDisplayInfoController).getTelephonyDisplayInfo(); doReturn(1).when(mPhone).getSubId(); // NetCapability should be metered when connected to 5G with no unmetered plan or frequency mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TELEPHONY_DISPLAY_INFO_CHANGED)); waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler()); verify(mDataConnection, times(1)).onMeterednessChanged(false); // Set SubscriptionPlans unmetered setUpSubscriptionPlans(true); // NetCapability should switch to unmetered with an unmetered plan mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TELEPHONY_DISPLAY_INFO_CHANGED)); waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler()); verify(mDataConnection, times(1)).onMeterednessChanged(true); // Set MMWAVE frequency to unmetered mBundle.putBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL, true); Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, mPhone.getPhoneId()); intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, mPhone.getSubId()); mContext.sendBroadcast(intent); waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler()); // NetCapability should switch to metered without fr=MMWAVE mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TELEPHONY_DISPLAY_INFO_CHANGED)); waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler()); verify(mDataConnection, times(2)).onMeterednessChanged(false); // NetCapability should switch to unmetered with fr=MMWAVE doReturn(new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_LTE, TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE)) .when(mDisplayInfoController).getTelephonyDisplayInfo(); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TELEPHONY_DISPLAY_INFO_CHANGED)); waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler()); verify(mDataConnection, times(2)).onMeterednessChanged(true); resetDataConnection(id); } @Test public void testIsNrUnmeteredCarrierConfigs() throws Exception { initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL}); int id = setUpDataConnection(); setUpSubscriptionPlans(false); Loading @@ -1829,6 +1877,7 @@ public class DcTrackerTest extends TelephonyTest { verify(mDataConnection, times(1)).onMeterednessChanged(false); // Set MMWAVE frequency to unmetered mBundle.putBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_BOOL, true); mBundle.putBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL, true); Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, mPhone.getPhoneId()); Loading @@ -1854,6 +1903,7 @@ public class DcTrackerTest extends TelephonyTest { // Set SUB6 frequency to unmetered doReturn(2).when(mPhone).getSubId(); mBundle.putBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL, false); mBundle.putBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_SUB6_BOOL, true); intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, mPhone.getPhoneId()); Loading Loading
src/java/com/android/internal/telephony/dataconnection/DcTracker.java +55 −29 Original line number Diff line number Diff line Loading @@ -4023,14 +4023,7 @@ public class DcTracker extends Handler { private void reevaluateUnmeteredConnections() { log("reevaluateUnmeteredConnections"); int rat = mPhone.getDisplayInfoController().getTelephonyDisplayInfo().getNetworkType(); int override = mPhone.getDisplayInfoController().getTelephonyDisplayInfo() .getOverrideNetworkType(); boolean nrPlanUnmetered = isNetworkTypeUnmetered(NETWORK_TYPE_NR) && (rat == NETWORK_TYPE_NR || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE); if ((nrPlanUnmetered || isNrNsaFrequencyRangeUnmetered() || isNrSaFrequencyRangeUnmetered()) && !mPhone.getServiceState().getRoaming() || mRoamingUnmetered) { if (DBG) log("NR is unmetered"); if (isNrUnmetered() && !mPhone.getServiceState().getRoaming() || mRoamingUnmetered) { setDataConnectionUnmetered(true); if (!mWatchdog) { startWatchdogAlarm(); Loading Loading @@ -4084,34 +4077,67 @@ public class DcTracker extends Handler { || plan.getDataLimitBehavior() == SubscriptionPlan.LIMIT_BEHAVIOR_THROTTLED); } private boolean isNrNsaFrequencyRangeUnmetered() { private boolean isNrUnmetered() { int rat = mPhone.getDisplayInfoController().getTelephonyDisplayInfo().getNetworkType(); int override = mPhone.getDisplayInfoController().getTelephonyDisplayInfo() .getOverrideNetworkType(); if (mNrNsaMmwaveUnmetered || mNrNsaSub6Unmetered) { return (mNrNsaMmwaveUnmetered && override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE) || (mNrNsaSub6Unmetered && override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA); } else { return mNrNsaAllUnmetered && (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA); if (isNetworkTypeUnmetered(NETWORK_TYPE_NR)) { if (mNrNsaMmwaveUnmetered) { if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE) { if (DBG) log("NR unmetered for mmwave only via SubscriptionPlans"); return true; } return false; } else if (mNrNsaSub6Unmetered) { if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA) { if (DBG) log("NR unmetered for sub6 only via SubscriptionPlans"); return true; } return false; } if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA || rat == NETWORK_TYPE_NR) { if (DBG) log("NR unmetered for all frequencies via SubscriptionPlans"); return true; } return false; } private boolean isNrSaFrequencyRangeUnmetered() { if (ServiceState.rilRadioTechnologyToNetworkType(getDataRat()) != NETWORK_TYPE_NR) { if (mNrNsaAllUnmetered) { if (mNrNsaMmwaveUnmetered) { if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE) { if (DBG) log("NR NSA unmetered for mmwave only via carrier configs"); return true; } return false; } else if (mNrNsaSub6Unmetered) { if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA) { if (DBG) log("NR NSA unmetered for sub6 only via carrier configs"); return true; } if (mNrSaMmwaveUnmetered || mNrSaSub6Unmetered) { int frequencyRange = mPhone.getServiceState().getNrFrequencyRange(); boolean mmwave = frequencyRange == ServiceState.FREQUENCY_RANGE_MMWAVE; // frequency range LOW, MID, or HIGH boolean sub6 = frequencyRange != ServiceState.FREQUENCY_RANGE_UNKNOWN && !mmwave; return mNrSaMmwaveUnmetered && mmwave || mNrSaSub6Unmetered && sub6; } else { return mNrSaAllUnmetered; return false; } if (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA) { if (DBG) log("NR NSA unmetered for all frequencies via carrier configs"); return true; } return false; } if (mNrSaAllUnmetered) { // TODO: add logic for mNrSaMmwaveUnmetered and mNrSaSub6Unmetered once it's defined // in TelephonyDisplayInfo if (rat == NETWORK_TYPE_NR) { if (DBG) log("NR SA unmetered for all frequencies via carrier configs"); return true; } return false; } return false; } protected void log(String s) { Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +51 −1 Original line number Diff line number Diff line Loading @@ -1813,7 +1813,55 @@ public class DcTrackerTest extends TelephonyTest { } @Test public void testIsFrequencyRangeUnmetered() throws Exception { public void testIsNrUnmeteredSubscriptionPlans() throws Exception { initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL}); int id = setUpDataConnection(); setUpSubscriptionPlans(false); setUpWatchdogTimer(); doReturn(new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_LTE, TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA)) .when(mDisplayInfoController).getTelephonyDisplayInfo(); doReturn(1).when(mPhone).getSubId(); // NetCapability should be metered when connected to 5G with no unmetered plan or frequency mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TELEPHONY_DISPLAY_INFO_CHANGED)); waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler()); verify(mDataConnection, times(1)).onMeterednessChanged(false); // Set SubscriptionPlans unmetered setUpSubscriptionPlans(true); // NetCapability should switch to unmetered with an unmetered plan mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TELEPHONY_DISPLAY_INFO_CHANGED)); waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler()); verify(mDataConnection, times(1)).onMeterednessChanged(true); // Set MMWAVE frequency to unmetered mBundle.putBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL, true); Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, mPhone.getPhoneId()); intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, mPhone.getSubId()); mContext.sendBroadcast(intent); waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler()); // NetCapability should switch to metered without fr=MMWAVE mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TELEPHONY_DISPLAY_INFO_CHANGED)); waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler()); verify(mDataConnection, times(2)).onMeterednessChanged(false); // NetCapability should switch to unmetered with fr=MMWAVE doReturn(new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_LTE, TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE)) .when(mDisplayInfoController).getTelephonyDisplayInfo(); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_TELEPHONY_DISPLAY_INFO_CHANGED)); waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler()); verify(mDataConnection, times(2)).onMeterednessChanged(true); resetDataConnection(id); } @Test public void testIsNrUnmeteredCarrierConfigs() throws Exception { initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL}); int id = setUpDataConnection(); setUpSubscriptionPlans(false); Loading @@ -1829,6 +1877,7 @@ public class DcTrackerTest extends TelephonyTest { verify(mDataConnection, times(1)).onMeterednessChanged(false); // Set MMWAVE frequency to unmetered mBundle.putBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_BOOL, true); mBundle.putBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL, true); Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, mPhone.getPhoneId()); Loading @@ -1854,6 +1903,7 @@ public class DcTrackerTest extends TelephonyTest { // Set SUB6 frequency to unmetered doReturn(2).when(mPhone).getSubId(); mBundle.putBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL, false); mBundle.putBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_SUB6_BOOL, true); intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, mPhone.getPhoneId()); Loading