diff options
Diffstat (limited to 'services/QualifiedNetworksService/src/com/android/telephony/qns/RestrictManager.java')
-rw-r--r-- | services/QualifiedNetworksService/src/com/android/telephony/qns/RestrictManager.java | 188 |
1 files changed, 125 insertions, 63 deletions
diff --git a/services/QualifiedNetworksService/src/com/android/telephony/qns/RestrictManager.java b/services/QualifiedNetworksService/src/com/android/telephony/qns/RestrictManager.java index c49f674..0837f00 100644 --- a/services/QualifiedNetworksService/src/com/android/telephony/qns/RestrictManager.java +++ b/services/QualifiedNetworksService/src/com/android/telephony/qns/RestrictManager.java @@ -96,9 +96,8 @@ class RestrictManager { private static final int EVENT_IMS_REGISTRATION_STATE_CHANGED = 3004; private static final int EVENT_LOW_RTP_QUALITY_REPORTED = 3006; private static final int EVENT_RELEASE_RESTRICTION = 3008; - private static final int EVENT_REGISTER_LOW_RTP_QUALITY = 3009; - protected static final int EVENT_INITIAL_DATA_CONNECTION_FAIL_RETRY_TIMER_EXPIRED = 3010; - private static final int EVENT_WIFI_RTT_BACKHAUL_CHECK_STATUS = 3011; + protected static final int EVENT_INITIAL_DATA_CONNECTION_FAIL_RETRY_TIMER_EXPIRED = 3009; + private static final int EVENT_WIFI_RTT_BACKHAUL_CHECK_STATUS = 3010; @VisibleForTesting static final int GUARDING_TIMER_HANDOVER_INIT = 30000; @@ -159,7 +158,8 @@ class RestrictManager { @VisibleForTesting QnsRegistrant mRestrictInfoRegistrant; private DataConnectionStatusTracker mDataConnectionStatusTracker; private CellularNetworkStatusTracker mCellularNetworkStatusTracker; - private AlternativeEventListener mAltEventListener; + private QnsCallStatusTracker mQnsCallStatusTracker; + private QnsCallStatusTracker.ActiveCallTracker mActiveCallTracker; private QnsImsManager mQnsImsManager; private WifiBackhaulMonitor mWifiBackhaulMonitor; private int mNetCapability; @@ -215,7 +215,7 @@ class RestrictManager { ar = (QnsAsyncResult) message.obj; int reason = (int) ar.mResult; Log.d(mLogTag, "EVENT_LOW_RTP_QUALITY_REPORTED reason: " + reason); - onLowRtpQualityEvent(); + onLowRtpQualityEvent(reason); break; case EVENT_IMS_REGISTRATION_STATE_CHANGED: @@ -241,13 +241,6 @@ class RestrictManager { } break; - case EVENT_REGISTER_LOW_RTP_QUALITY: - int currTransportType = message.arg1; - if (currTransportType == mTransportType) { - registerLowRtpQualityEvent(); - } - break; - case EVENT_INITIAL_DATA_CONNECTION_FAIL_RETRY_TIMER_EXPIRED: Log.d( mLogTag, @@ -255,7 +248,7 @@ class RestrictManager { + mIsTimerRunningOnDataConnectionFail); if (mIsTimerRunningOnDataConnectionFail) { - currTransportType = message.arg1; + int currTransportType = message.arg1; fallbackToOtherTransportOnDataConnectionFail(currTransportType); } break; @@ -316,6 +309,17 @@ class RestrictManager { } } + class LowRtpQualityRestriction extends Restriction{ + private int mReason; + LowRtpQualityRestriction(int type, int[] releaseEvents, int restrictTime, int reason) { + super(type, releaseEvents, restrictTime); + mReason = reason; + } + int getReason() { + return mReason; + } + } + class Restriction { private final int mRestrictType; final ArrayList<Integer> mReleaseEventList; @@ -444,7 +448,8 @@ class RestrictManager { mHandler = new RestrictManagerHandler(loop); mNetCapability = netCapability; mDataConnectionStatusTracker = dcst; - mAltEventListener = qnsComponents.getAlternativeEventListener(mSlotId); + mQnsCallStatusTracker = qnsComponents.getQnsCallStatusTracker(mSlotId); + mActiveCallTracker = qnsComponents.getQnsCallStatusTracker(mSlotId).getActiveCallTracker(); mDataConnectionStatusTracker.registerDataConnectionStatusChanged( mHandler, EVENT_DATA_CONNECTION_CHANGED); if (mNetCapability == NetworkCapabilities.NET_CAPABILITY_IMS) { @@ -500,7 +505,9 @@ class RestrictManager { mQnsEventDispatcher.unregisterEvent(mHandler); if (mNetCapability == NetworkCapabilities.NET_CAPABILITY_IMS || mNetCapability == NetworkCapabilities.NET_CAPABILITY_EIMS) { - mAltEventListener.unregisterLowRtpQualityEvent(mNetCapability, mHandler); + if (mActiveCallTracker != null) { + mActiveCallTracker.unregisterLowMediaQualityListener(mHandler); + } } if (mNetCapability == NetworkCapabilities.NET_CAPABILITY_IMS) { mQnsImsManager.unregisterImsRegistrationStatusChanged(mHandler); @@ -539,7 +546,7 @@ class RestrictManager { mQnsCarrierConfigManager.getWaitingTimerForPreferredTransportOnPowerOn( transportType); if (waitingTimer != QnsConstants.KEY_DEFAULT_VALUE) { - int preventTransportType = getOtherTransport(transportType); + int preventTransportType = QnsUtils.getOtherTransportType(transportType); Log.d( mLogTag, "prevent " @@ -628,25 +635,53 @@ class RestrictManager { } @VisibleForTesting - void onLowRtpQualityEvent() { + void onLowRtpQualityEvent(@QnsConstants.RtpLowQualityReason int reason) { int lowRtpQualityRestrictTime = mQnsCarrierConfigManager.getHoRestrictedTimeOnLowRTPQuality(mTransportType); if ((mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN || mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) && lowRtpQualityRestrictTime > 0 - && mImsCallType != QnsConstants.CALL_TYPE_IDLE) { - addRestriction( - mTransportType, - RESTRICT_TYPE_RTP_LOW_QUALITY, - sReleaseEventMap.get(RESTRICT_TYPE_RTP_LOW_QUALITY), - lowRtpQualityRestrictTime); - unregisterLowRtpQualityEvent(); - - if (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { - int fallbackReason = mQnsCarrierConfigManager.getQnsIwlanHoRestrictReason(); - if (fallbackReason == QnsConstants.FALLBACK_REASON_RTP_OR_WIFI - || fallbackReason == QnsConstants.FALLBACK_REASON_RTP_ONLY) { - increaseCounterToRestrictIwlanInCall(); + && (mImsCallType == QnsConstants.CALL_TYPE_VOICE + || mImsCallType == QnsConstants.CALL_TYPE_EMERGENCY)) { + if (reason > 0) { + Restriction restriction = + new LowRtpQualityRestriction(RESTRICT_TYPE_RTP_LOW_QUALITY, + sReleaseEventMap.get(RESTRICT_TYPE_RTP_LOW_QUALITY), + lowRtpQualityRestrictTime, + reason); + // If current report has 'no RTP reason' and previous report at previous + // transport type doesn't have 'no RTP reason', let's move back to previous + // transport type. + if ((reason & 1 << QnsConstants.RTP_LOW_QUALITY_REASON_NO_RTP) != 0) { + HashMap<Integer, Restriction> restrictionMap = mRestrictInfos + .get(QnsUtils.getOtherTransportType(mTransportType)) + .getRestrictionMap(); + Restriction restrictionOtherSide = restrictionMap.get( + RESTRICT_TYPE_RTP_LOW_QUALITY); + if (restrictionOtherSide != null + && restrictionOtherSide instanceof LowRtpQualityRestriction) { + int reasonOtherSide = + ((LowRtpQualityRestriction) restrictionOtherSide).getReason(); + if ((reasonOtherSide & 1 << QnsConstants.RTP_LOW_QUALITY_REASON_NO_RTP) + == 0) { + releaseRestriction(QnsUtils.getOtherTransportType(mTransportType), + RESTRICT_TYPE_RTP_LOW_QUALITY, true); + } + } + } + // If both transport have low RTP quality restriction, let ANE do final decision. + addRestriction(mTransportType, restriction, lowRtpQualityRestrictTime); + + if (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { + int fallbackReason = mQnsCarrierConfigManager.getQnsIwlanHoRestrictReason(); + if (fallbackReason == QnsConstants.FALLBACK_REASON_RTP_OR_WIFI + || fallbackReason == QnsConstants.FALLBACK_REASON_RTP_ONLY) { + increaseCounterToRestrictIwlanInCall(); + } + } + } else { + if (hasRestrictionType(mTransportType, RESTRICT_TYPE_RTP_LOW_QUALITY)) { + releaseRestriction(mTransportType, RESTRICT_TYPE_RTP_LOW_QUALITY); } } } @@ -695,7 +730,7 @@ class RestrictManager { checkToCancelInitialPdnConnectionFailFallback(); clearInitialPdnConnectionFailFallbackRestriction(); - checkIfCancelNonPreferredRestriction(getOtherTransport(transportType)); + checkIfCancelNonPreferredRestriction(QnsUtils.getOtherTransportType(transportType)); if (mNetCapability == NetworkCapabilities.NET_CAPABILITY_IMS) { if (mLastEvaluatedTransportType == AccessNetworkConstants.TRANSPORT_TYPE_INVALID || transportType == mLastEvaluatedTransportType) { @@ -794,12 +829,6 @@ class RestrictManager { // Return to the transport type restricted by low RTP. It may be singleRAT case, release // the restriction. releaseRestriction(mTransportType, RESTRICT_TYPE_RTP_LOW_QUALITY); - Log.d(mLogTag, "Unregister & Register Low RTP quality for " + mTransportType); - unregisterLowRtpQualityEvent(); - - Message msg = - mHandler.obtainMessage(EVENT_REGISTER_LOW_RTP_QUALITY, mTransportType, 0, null); - mHandler.sendMessageDelayed(msg, (long) QnsConstants.DEFAULT_MSG_DELAY_TIMER); } } @@ -808,7 +837,7 @@ class RestrictManager { } private void processHandoverGuardingOperation(int transportType) { - int guardingTransport = getOtherTransport(transportType); + int guardingTransport = QnsUtils.getOtherTransportType(transportType); int delayMillis = getGuardingTimeMillis(guardingTransport, mImsCallType); int minimumGuardingTimer = mQnsCarrierConfigManager.getMinimumHandoverGuardingTimer(); if (delayMillis == 0 && minimumGuardingTimer > 0) { @@ -1031,7 +1060,7 @@ class RestrictManager { int transportType, int restrictType, int fallbackTimeMillis) { Log.d(mLogTag, "release ignorable restrictions on WWAN to fallback."); for (int restriction : ignorableRestrictionsOnSingleRat) { - releaseRestriction(getOtherTransport(transportType), restriction, false); + releaseRestriction(QnsUtils.getOtherTransportType(transportType), restriction, false); } addRestriction( transportType, @@ -1050,7 +1079,8 @@ class RestrictManager { } mLastEvaluatedTransportType = transportType; if (mDataConnectionStatusTracker.isActiveState() && mTransportType != transportType) { - startGuarding(GUARDING_TIMER_HANDOVER_INIT, getOtherTransport(transportType)); + startGuarding(GUARDING_TIMER_HANDOVER_INIT, + QnsUtils.getOtherTransportType(transportType)); } } @@ -1082,7 +1112,7 @@ class RestrictManager { } private void updateGuardingTimerConditionOnCallState(int prevCallType, int newCallType) { - int currGuardingTransport = getOtherTransport(mTransportType); + int currGuardingTransport = QnsUtils.getOtherTransportType(mTransportType); if (mRestrictInfos.get(currGuardingTransport) == null) return; HashMap<Integer, Restriction> restrictionMap = @@ -1141,6 +1171,49 @@ class RestrictManager { } } + void addRestriction(int transport, Restriction restrictObj, int timeMillis) { + boolean needNotify = false; + HashMap<Integer, Restriction> restrictionMap = + mRestrictInfos.get(transport).getRestrictionMap(); + Restriction restriction = restrictionMap.get(restrictObj.mRestrictType); + Log.d( + mLogTag, + "addRestriction[" + + QnsConstants.transportTypeToString(transport) + + "] " + + restrictTypeToString(restrictObj.mRestrictType) + + " was restrict:" + + (restriction != null)); + if (restriction == null) { + restriction = restrictObj; + restrictionMap.put(restrictObj.mRestrictType, restriction); + Log.d( + mLogTag, + "addRestriction[" + + QnsConstants.transportTypeToString(transport) + + "] " + + restriction); + needNotify = true; + } else { + if (timeMillis > 0) { + restriction.updateRestrictTime(timeMillis); + removeReleaseRestrictionMessage(restriction); + } + Log.d( + mLogTag, + "updateRestriction[" + + QnsConstants.transportTypeToString(transport) + + "] " + + restriction); + } + if (timeMillis > 0) { + sendReleaseRestrictionMessage(transport, restriction); + } + if (needNotify) { + notifyRestrictInfoChanged(); + } + } + void addRestriction(int transport, int type, int[] releaseEvents, int timeMillis) { boolean needNotify = false; HashMap<Integer, Restriction> restrictionMap = @@ -1261,14 +1334,6 @@ class RestrictManager { mHandler.removeMessages(EVENT_RELEASE_RESTRICTION, restriction); } - protected int getOtherTransport(int transportType) { - if (transportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { - return AccessNetworkConstants.TRANSPORT_TYPE_WWAN; - } else { - return AccessNetworkConstants.TRANSPORT_TYPE_WLAN; - } - } - void registerRestrictInfoChanged(Handler h, int what) { mRestrictInfoRegistrant = new QnsRegistrant(h, what, null); } @@ -1375,17 +1440,13 @@ class RestrictManager { || mImsCallType == QnsConstants.CALL_TYPE_EMERGENCY) && (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN || mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - && mAltEventListener != null) { + && mActiveCallTracker != null) { int hoRestrictTimeOnLowRtpQuality = mQnsCarrierConfigManager.getHoRestrictedTimeOnLowRTPQuality(mTransportType); if (hoRestrictTimeOnLowRtpQuality > 0) { Log.d(mLogTag, "registerLowRtpQualityEvent"); - mAltEventListener.registerLowRtpQualityEvent( - mNetCapability, - mHandler, - EVENT_LOW_RTP_QUALITY_REPORTED, - null, - mQnsCarrierConfigManager.getRTPMetricsData()); + mActiveCallTracker.registerLowMediaQualityListener( + mHandler, EVENT_LOW_RTP_QUALITY_REPORTED, null); } } } @@ -1393,7 +1454,9 @@ class RestrictManager { private void unregisterLowRtpQualityEvent() { if (mNetCapability == NetworkCapabilities.NET_CAPABILITY_IMS || mNetCapability == NetworkCapabilities.NET_CAPABILITY_EIMS) { - mAltEventListener.unregisterLowRtpQualityEvent(mNetCapability, mHandler); + if (mActiveCallTracker != null) { + mActiveCallTracker.unregisterLowMediaQualityListener(mHandler); + } } } @@ -1444,9 +1507,7 @@ class RestrictManager { case NetworkCapabilities.NET_CAPABILITY_MMS: case NetworkCapabilities.NET_CAPABILITY_XCAP: case NetworkCapabilities.NET_CAPABILITY_CBS: - callType = - mAltEventListener.isIdleState() - ? QnsConstants.CALL_TYPE_IDLE + callType = mQnsCallStatusTracker.isCallIdle() ? QnsConstants.CALL_TYPE_IDLE : QnsConstants.CALL_TYPE_VOICE; if (transportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { delayMillis = @@ -1484,14 +1545,15 @@ class RestrictManager { // Transport // Type if (transportType != AccessNetworkConstants.TRANSPORT_TYPE_INVALID - && hasRestrictionType( - getOtherTransport(transportType), RestrictManager.RESTRICT_TYPE_GUARDING)) { + && hasRestrictionType(QnsUtils.getOtherTransportType(transportType), + RestrictManager.RESTRICT_TYPE_GUARDING)) { Log.d( mLogTag, "RESTRICT_TYPE_GUARDING cleared from Guarding for:" + QnsConstants.transportTypeToString(mTransportType)); // addRestriction() will take care to notify the ANE of Restrict Info status - releaseRestriction(getOtherTransport(transportType), RESTRICT_TYPE_GUARDING, true); + releaseRestriction( + QnsUtils.getOtherTransportType(transportType), RESTRICT_TYPE_GUARDING, true); } addRestriction( |