diff options
2 files changed, 104 insertions, 10 deletions
diff --git a/services/QualifiedNetworksService/src/com/android/telephony/qns/RestrictManager.java b/services/QualifiedNetworksService/src/com/android/telephony/qns/RestrictManager.java index 64c3aa7..aefa469 100644 --- a/services/QualifiedNetworksService/src/com/android/telephony/qns/RestrictManager.java +++ b/services/QualifiedNetworksService/src/com/android/telephony/qns/RestrictManager.java @@ -139,6 +139,8 @@ class RestrictManager { private static final int[] ignorableRestrictionsOnSingleRat = new int[] { RESTRICT_TYPE_GUARDING, + //Ignore throttling restriction at single RAT, let FWK control throttling. + RESTRICT_TYPE_THROTTLING, RESTRICT_TYPE_RTP_LOW_QUALITY, RESTRICT_TYPE_RESTRICT_IWLAN_IN_CALL, RESTRICT_TYPE_FALLBACK_TO_WWAN_IMS_REGI_FAIL, @@ -373,6 +375,15 @@ class RestrictManager { } } + boolean isRestrictionExpired(long elapsedRealTime) { + if (mReleaseTime != 0 && (mReleaseTime - elapsedRealTime < 0)) { + Log.d(mLogTag, restrictTypeToString(mRestrictType) + " was expired." + + "release time:" + mReleaseTime + ", now:" + elapsedRealTime); + return true; + } + return false; + } + @Override public String toString() { StringBuilder builder = new StringBuilder(); @@ -397,20 +408,28 @@ class RestrictManager { class RestrictInfo { private int mTransportMode; // AccessNetworkConstants.TRANSPORT_TYPE_WWAN; - private HashMap<Integer, Restriction> mRestrictionMap = new HashMap<>(); + private Map<Integer, Restriction> mRestrictionMap = new ConcurrentHashMap<>(); RestrictInfo(int transportMode) { mTransportMode = transportMode; } - HashMap<Integer, Restriction> getRestrictionMap() { + Map<Integer, Restriction> getRestrictionMap() { return mRestrictionMap; } boolean isRestricted() { + checkUpExpirationTime(); return mRestrictionMap.size() != 0; } + private void checkUpExpirationTime() { + if (mRestrictionMap.size() > 0) { + long now = QnsUtils.getSystemElapsedRealTime(); + mRestrictionMap.entrySet().removeIf(e -> e.getValue().isRestrictionExpired(now)); + } + } + /** * This method returns if the restriction info has given restriction type. * @@ -673,7 +692,7 @@ class RestrictManager { if ((reason & 1 << QnsConstants.RTP_LOW_QUALITY_REASON_NO_RTP) != 0) { releaseRestriction(QnsUtils.getOtherTransportType(mTransportType), RESTRICT_TYPE_GUARDING, true); - HashMap<Integer, Restriction> restrictionMap = mRestrictInfos + Map<Integer, Restriction> restrictionMap = mRestrictInfos .get(QnsUtils.getOtherTransportType(mTransportType)) .getRestrictionMap(); Restriction restrictionOtherSide = restrictionMap.get( @@ -1134,7 +1153,7 @@ class RestrictManager { int currGuardingTransport = QnsUtils.getOtherTransportType(mTransportType); if (mRestrictInfos.get(currGuardingTransport) == null) return; - HashMap<Integer, Restriction> restrictionMap = + Map<Integer, Restriction> restrictionMap = mRestrictInfos.get(currGuardingTransport).getRestrictionMap(); Restriction restriction = restrictionMap.get(RESTRICT_TYPE_GUARDING); @@ -1192,7 +1211,7 @@ class RestrictManager { void addRestriction(int transport, Restriction restrictObj, long timeMillis) { boolean needNotify = false; - HashMap<Integer, Restriction> restrictionMap = + Map<Integer, Restriction> restrictionMap = mRestrictInfos.get(transport).getRestrictionMap(); Restriction restriction = restrictionMap.get(restrictObj.mRestrictType); Log.d( @@ -1236,7 +1255,7 @@ class RestrictManager { void addRestriction(int transport, int type, int[] releaseEvents, long timeMillis) { boolean needNotify = false; - HashMap<Integer, Restriction> restrictionMap = + Map<Integer, Restriction> restrictionMap = mRestrictInfos.get(transport).getRestrictionMap(); Restriction restriction = restrictionMap.get(type); Log.d( @@ -1284,7 +1303,7 @@ class RestrictManager { void releaseRestriction(int transport, int type, boolean skipNotify) { boolean needNotify = false; - HashMap<Integer, Restriction> restrictionMap = + Map<Integer, Restriction> restrictionMap = mRestrictInfos.get(transport).getRestrictionMap(); Restriction restriction = restrictionMap.get(type); Log.d( @@ -1312,7 +1331,7 @@ class RestrictManager { void processReleaseEvent(int transportType, int event) { ArrayList<Integer> releaseList = new ArrayList<>(); - HashMap<Integer, Restriction> restrictMap = + Map<Integer, Restriction> restrictMap = mRestrictInfos.get(transportType).getRestrictionMap(); Log.d( mLogTag, diff --git a/services/QualifiedNetworksService/tests/src/com/android/telephony/qns/RestrictManagerTest.java b/services/QualifiedNetworksService/tests/src/com/android/telephony/qns/RestrictManagerTest.java index ddc193a..b63a950 100644 --- a/services/QualifiedNetworksService/tests/src/com/android/telephony/qns/RestrictManagerTest.java +++ b/services/QualifiedNetworksService/tests/src/com/android/telephony/qns/RestrictManagerTest.java @@ -433,6 +433,79 @@ public class RestrictManagerTest extends QnsTest { } @Test + public void testCheckExpiredTime() { + assertFalse(mRestrictManager.isRestricted(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)); + assertFalse(mRestrictManager.isRestricted(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)); + long now = SystemClock.elapsedRealtime(); + long throttleTime = now + 600000; + mRestrictManager.addRestriction( + AccessNetworkConstants.TRANSPORT_TYPE_WWAN, + RESTRICT_TYPE_RTP_LOW_QUALITY, + sReleaseEventMap.get(RESTRICT_TYPE_RTP_LOW_QUALITY), + DEFAULT_RESTRICT_WITH_LOW_RTP_QUALITY_TIME); + mRestrictManager.notifyThrottling( + true, throttleTime, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); + assertTrue( + mRestrictManager.hasRestrictionType( + AccessNetworkConstants.TRANSPORT_TYPE_WWAN, + RESTRICT_TYPE_RTP_LOW_QUALITY)); + assertTrue( + mRestrictManager.hasRestrictionType( + AccessNetworkConstants.TRANSPORT_TYPE_WWAN, + RESTRICT_TYPE_THROTTLING)); + lenient().when(QnsUtils.getSystemElapsedRealTime()).thenReturn(now + 3000); + assertTrue(mRestrictManager.isRestricted(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)); + + lenient().when(QnsUtils.getSystemElapsedRealTime()).thenReturn(now + 100000); + assertTrue(mRestrictManager.isRestricted(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)); + assertFalse( + mRestrictManager.hasRestrictionType( + AccessNetworkConstants.TRANSPORT_TYPE_WWAN, + RESTRICT_TYPE_RTP_LOW_QUALITY)); + assertTrue( + mRestrictManager.hasRestrictionType( + AccessNetworkConstants.TRANSPORT_TYPE_WWAN, + RESTRICT_TYPE_THROTTLING)); + lenient().when(QnsUtils.getSystemElapsedRealTime()).thenReturn(now + 700000); + assertFalse(mRestrictManager.isRestricted(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)); + assertFalse( + mRestrictManager.hasRestrictionType( + AccessNetworkConstants.TRANSPORT_TYPE_WWAN, + RESTRICT_TYPE_THROTTLING)); + + mRestrictManager.addRestriction( + AccessNetworkConstants.TRANSPORT_TYPE_WLAN, + RESTRICT_TYPE_RESTRICT_IWLAN_IN_CALL, + sReleaseEventMap.get(RESTRICT_TYPE_RESTRICT_IWLAN_IN_CALL), + 0); + mRestrictManager.notifyThrottling( + true, throttleTime, AccessNetworkConstants.TRANSPORT_TYPE_WLAN); + assertTrue( + mRestrictManager.hasRestrictionType( + AccessNetworkConstants.TRANSPORT_TYPE_WLAN, + RESTRICT_TYPE_RESTRICT_IWLAN_IN_CALL)); + assertTrue( + mRestrictManager.hasRestrictionType( + AccessNetworkConstants.TRANSPORT_TYPE_WLAN, + RESTRICT_TYPE_THROTTLING)); + lenient().when(QnsUtils.getSystemElapsedRealTime()).thenReturn(now + 3000); + assertTrue(mRestrictManager.isRestricted(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)); + lenient().when(QnsUtils.getSystemElapsedRealTime()).thenReturn(now + 700000); + assertTrue(mRestrictManager.isRestricted(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)); + assertTrue( + mRestrictManager.hasRestrictionType( + AccessNetworkConstants.TRANSPORT_TYPE_WLAN, + RESTRICT_TYPE_RESTRICT_IWLAN_IN_CALL)); + assertFalse( + mRestrictManager.hasRestrictionType( + AccessNetworkConstants.TRANSPORT_TYPE_WLAN, + RESTRICT_TYPE_THROTTLING)); + mRestrictManager.releaseRestriction( + AccessNetworkConstants.TRANSPORT_TYPE_WLAN, RESTRICT_TYPE_RESTRICT_IWLAN_IN_CALL); + assertFalse(mRestrictManager.isRestricted(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)); + } + + @Test public void testWwanToWlanGuardingOnHandoverStart() { DataConnectionStatusTracker.DataConnectionChangedInfo dcInfo = new DataConnectionStatusTracker.DataConnectionChangedInfo( @@ -1178,8 +1251,8 @@ public class RestrictManagerTest extends QnsTest { DEFAULT_GUARDING_TIME); mRestrictManager.addRestriction( AccessNetworkConstants.TRANSPORT_TYPE_WWAN, - RESTRICT_TYPE_THROTTLING, - sReleaseEventMap.get(RESTRICT_TYPE_THROTTLING), + RESTRICT_TYPE_RESTRICT_IWLAN_CS_CALL, + sReleaseEventMap.get(RESTRICT_TYPE_RESTRICT_IWLAN_CS_CALL), 600000); mRestrictManager.addRestriction( AccessNetworkConstants.TRANSPORT_TYPE_WLAN, @@ -1209,6 +1282,8 @@ public class RestrictManagerTest extends QnsTest { mRestrictManager.notifyThrottling(false, 0, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); mRestrictManager.processReleaseEvent( AccessNetworkConstants.TRANSPORT_TYPE_WLAN, RELEASE_EVENT_DISCONNECT); + mRestrictManager.releaseRestriction( + AccessNetworkConstants.TRANSPORT_TYPE_WWAN, RESTRICT_TYPE_RESTRICT_IWLAN_CS_CALL); assertFalse(mRestrictManager.isRestricted(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)); assertFalse(mRestrictManager.isRestricted(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)); } |