Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +55 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.internal.telephony.imsphone; import static com.android.internal.telephony.Phone.CS_FALLBACK; import android.annotation.NonNull; import android.app.usage.NetworkStatsManager; import android.compat.annotation.UnsupportedAppUsage; import android.content.BroadcastReceiver; import android.content.Context; Loading @@ -32,6 +33,8 @@ import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.NetworkRequest; import android.net.NetworkStats; import android.net.netstats.provider.AbstractNetworkStatsProvider; import android.net.netstats.provider.NetworkStatsProviderCallback; import android.os.AsyncResult; import android.os.Bundle; import android.os.Handler; Loading @@ -44,6 +47,7 @@ import android.os.SystemClock; import android.preference.PreferenceManager; import android.provider.Settings; import android.sysprop.TelephonyProperties; import android.telecom.Connection.VideoProvider; import android.telecom.TelecomManager; import android.telecom.VideoProfile; import android.telephony.CallQuality; Loading Loading @@ -255,6 +259,46 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { } } // TODO: 1. Directly reports diff in updateVtDataUsage. // 2. Remove unused getVtDataUsage. // 3. Add tests. private class VtDataUsageProvider extends AbstractNetworkStatsProvider { private int mToken = 0; private NetworkStats mIfaceSnapshot = new NetworkStats(0L, 0); private NetworkStats mUidSnapshot = new NetworkStats(0L, 0); @Override public void requestStatsUpdate(int token) { // If there is an ongoing VT call, request the latest VT usage from the modem. The // latest usage will return asynchronously so it won't be counted in this round, but it // will be eventually counted when next requestStatsUpdate is called. if (mState != PhoneConstants.State.IDLE) { for (ImsPhoneConnection conn : mConnections) { final VideoProvider videoProvider = conn.getVideoProvider(); if (videoProvider != null) { videoProvider.onRequestConnectionDataUsage(); } } } final NetworkStats ifaceDiff = mVtDataUsageSnapshot.subtract(mIfaceSnapshot); final NetworkStats uidDiff = mVtDataUsageUidSnapshot.subtract(mUidSnapshot); mVtDataUsageProviderCb.onStatsUpdated(mToken, ifaceDiff, uidDiff); mIfaceSnapshot = mIfaceSnapshot.add(ifaceDiff); mUidSnapshot = mUidSnapshot.add(uidDiff); mToken = token; } @Override public void setLimit(String iface, long quotaBytes) { // No-op } @Override public void setAlert(long quotaBytes) { // No-op } } private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Loading Loading @@ -390,6 +434,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { private volatile NetworkStats mVtDataUsageSnapshot = null; private volatile NetworkStats mVtDataUsageUidSnapshot = null; private final NetworkStatsProviderCallback mVtDataUsageProviderCb; private final AtomicInteger mDefaultDialerUid = new AtomicInteger(NetworkStats.UID_ALL); Loading Loading @@ -823,6 +868,11 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { long currentTime = SystemClock.elapsedRealtime(); mVtDataUsageSnapshot = new NetworkStats(currentTime, 1); mVtDataUsageUidSnapshot = new NetworkStats(currentTime, 1); final NetworkStatsManager statsManager = (NetworkStatsManager) mPhone.getContext().getSystemService( Context.NETWORK_STATS_SERVICE); mVtDataUsageProviderCb = statsManager.registerNetworkStatsProvider(LOG_TAG, new VtDataUsageProvider()); // Allow the executor to be specified for testing. mImsManagerConnector = new FeatureConnector<>( Loading Loading @@ -972,6 +1022,10 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { mPhone.getContext().unregisterReceiver(mReceiver); mPhone.getDefaultPhone().getDataEnabledSettings().unregisterForDataEnabledChanged(this); mImsManagerConnector.disconnect(); if (mVtDataUsageProviderCb != null) { mVtDataUsageProviderCb.unregister(); } } @Override Loading Loading @@ -4299,7 +4353,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { // eventually counted when next getVtDataUsage is called. if (mState != PhoneConstants.State.IDLE) { for (ImsPhoneConnection conn : mConnections) { android.telecom.Connection.VideoProvider videoProvider = conn.getVideoProvider(); VideoProvider videoProvider = conn.getVideoProvider(); if (videoProvider != null) { videoProvider.onRequestConnectionDataUsage(); } Loading tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +4 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import static org.mockito.Mockito.eq; import android.app.ActivityManager; import android.app.IActivityManager; import android.app.usage.NetworkStatsManager; import android.content.ContentResolver; import android.content.Context; import android.content.IIntentSender; Loading Loading @@ -270,6 +271,8 @@ public abstract class TelephonyTest { protected MultiSimSettingController mMultiSimSettingController; @Mock protected IccCard mIccCard; @Mock protected NetworkStatsManager mStatsManager; protected ImsCallProfile mImsCallProfile; protected TelephonyManager mTelephonyManager; Loading Loading @@ -575,6 +578,7 @@ public abstract class TelephonyTest { doAnswer((invocation)->Math.max(mTelephonyManager.getActiveModemCount(), mTelephonyManager.getPhoneCount())) .when(mTelephonyManager).getSupportedModemCount(); doReturn(mStatsManager).when(mContext).getSystemService(eq(Context.NETWORK_STATS_SERVICE)); //Data //Initial state is: userData enabled, provisioned. Loading tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java +8 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static junit.framework.TestCase.fail; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; Loading @@ -40,6 +41,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.netstats.provider.NetworkStatsProviderCallback; import android.os.Bundle; import android.os.Message; import android.os.PersistableBundle; Loading Loading @@ -104,6 +106,8 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest { private ImsConfig mImsConfig; @Mock private ImsPhoneConnection mImsPhoneConnection; @Mock private NetworkStatsProviderCallback mVtDataUsageProviderCb; private void imsCallMocking(final ImsCall imsCall) throws Exception { Loading Loading @@ -209,6 +213,9 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest { doNothing().when(mImsManager).addNotifyStatusChangedCallbackIfAvailable(any()); doReturn(mVtDataUsageProviderCb).when(mStatsManager).registerNetworkStatsProvider( anyString(), any()); mCTUT = new ImsPhoneCallTracker(mImsPhone, Runnable::run); mCTUT.addReasonCodeRemapping(null, "Wifi signal lost.", ImsReasonInfo.CODE_WIFI_LOST); mCTUT.addReasonCodeRemapping(501, "Call answered elsewhere.", Loading Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +55 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.internal.telephony.imsphone; import static com.android.internal.telephony.Phone.CS_FALLBACK; import android.annotation.NonNull; import android.app.usage.NetworkStatsManager; import android.compat.annotation.UnsupportedAppUsage; import android.content.BroadcastReceiver; import android.content.Context; Loading @@ -32,6 +33,8 @@ import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.NetworkRequest; import android.net.NetworkStats; import android.net.netstats.provider.AbstractNetworkStatsProvider; import android.net.netstats.provider.NetworkStatsProviderCallback; import android.os.AsyncResult; import android.os.Bundle; import android.os.Handler; Loading @@ -44,6 +47,7 @@ import android.os.SystemClock; import android.preference.PreferenceManager; import android.provider.Settings; import android.sysprop.TelephonyProperties; import android.telecom.Connection.VideoProvider; import android.telecom.TelecomManager; import android.telecom.VideoProfile; import android.telephony.CallQuality; Loading Loading @@ -255,6 +259,46 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { } } // TODO: 1. Directly reports diff in updateVtDataUsage. // 2. Remove unused getVtDataUsage. // 3. Add tests. private class VtDataUsageProvider extends AbstractNetworkStatsProvider { private int mToken = 0; private NetworkStats mIfaceSnapshot = new NetworkStats(0L, 0); private NetworkStats mUidSnapshot = new NetworkStats(0L, 0); @Override public void requestStatsUpdate(int token) { // If there is an ongoing VT call, request the latest VT usage from the modem. The // latest usage will return asynchronously so it won't be counted in this round, but it // will be eventually counted when next requestStatsUpdate is called. if (mState != PhoneConstants.State.IDLE) { for (ImsPhoneConnection conn : mConnections) { final VideoProvider videoProvider = conn.getVideoProvider(); if (videoProvider != null) { videoProvider.onRequestConnectionDataUsage(); } } } final NetworkStats ifaceDiff = mVtDataUsageSnapshot.subtract(mIfaceSnapshot); final NetworkStats uidDiff = mVtDataUsageUidSnapshot.subtract(mUidSnapshot); mVtDataUsageProviderCb.onStatsUpdated(mToken, ifaceDiff, uidDiff); mIfaceSnapshot = mIfaceSnapshot.add(ifaceDiff); mUidSnapshot = mUidSnapshot.add(uidDiff); mToken = token; } @Override public void setLimit(String iface, long quotaBytes) { // No-op } @Override public void setAlert(long quotaBytes) { // No-op } } private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Loading Loading @@ -390,6 +434,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { private volatile NetworkStats mVtDataUsageSnapshot = null; private volatile NetworkStats mVtDataUsageUidSnapshot = null; private final NetworkStatsProviderCallback mVtDataUsageProviderCb; private final AtomicInteger mDefaultDialerUid = new AtomicInteger(NetworkStats.UID_ALL); Loading Loading @@ -823,6 +868,11 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { long currentTime = SystemClock.elapsedRealtime(); mVtDataUsageSnapshot = new NetworkStats(currentTime, 1); mVtDataUsageUidSnapshot = new NetworkStats(currentTime, 1); final NetworkStatsManager statsManager = (NetworkStatsManager) mPhone.getContext().getSystemService( Context.NETWORK_STATS_SERVICE); mVtDataUsageProviderCb = statsManager.registerNetworkStatsProvider(LOG_TAG, new VtDataUsageProvider()); // Allow the executor to be specified for testing. mImsManagerConnector = new FeatureConnector<>( Loading Loading @@ -972,6 +1022,10 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { mPhone.getContext().unregisterReceiver(mReceiver); mPhone.getDefaultPhone().getDataEnabledSettings().unregisterForDataEnabledChanged(this); mImsManagerConnector.disconnect(); if (mVtDataUsageProviderCb != null) { mVtDataUsageProviderCb.unregister(); } } @Override Loading Loading @@ -4299,7 +4353,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { // eventually counted when next getVtDataUsage is called. if (mState != PhoneConstants.State.IDLE) { for (ImsPhoneConnection conn : mConnections) { android.telecom.Connection.VideoProvider videoProvider = conn.getVideoProvider(); VideoProvider videoProvider = conn.getVideoProvider(); if (videoProvider != null) { videoProvider.onRequestConnectionDataUsage(); } Loading
tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +4 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import static org.mockito.Mockito.eq; import android.app.ActivityManager; import android.app.IActivityManager; import android.app.usage.NetworkStatsManager; import android.content.ContentResolver; import android.content.Context; import android.content.IIntentSender; Loading Loading @@ -270,6 +271,8 @@ public abstract class TelephonyTest { protected MultiSimSettingController mMultiSimSettingController; @Mock protected IccCard mIccCard; @Mock protected NetworkStatsManager mStatsManager; protected ImsCallProfile mImsCallProfile; protected TelephonyManager mTelephonyManager; Loading Loading @@ -575,6 +578,7 @@ public abstract class TelephonyTest { doAnswer((invocation)->Math.max(mTelephonyManager.getActiveModemCount(), mTelephonyManager.getPhoneCount())) .when(mTelephonyManager).getSupportedModemCount(); doReturn(mStatsManager).when(mContext).getSystemService(eq(Context.NETWORK_STATS_SERVICE)); //Data //Initial state is: userData enabled, provisioned. Loading
tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java +8 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static junit.framework.TestCase.fail; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; Loading @@ -40,6 +41,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.netstats.provider.NetworkStatsProviderCallback; import android.os.Bundle; import android.os.Message; import android.os.PersistableBundle; Loading Loading @@ -104,6 +106,8 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest { private ImsConfig mImsConfig; @Mock private ImsPhoneConnection mImsPhoneConnection; @Mock private NetworkStatsProviderCallback mVtDataUsageProviderCb; private void imsCallMocking(final ImsCall imsCall) throws Exception { Loading Loading @@ -209,6 +213,9 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest { doNothing().when(mImsManager).addNotifyStatusChangedCallbackIfAvailable(any()); doReturn(mVtDataUsageProviderCb).when(mStatsManager).registerNetworkStatsProvider( anyString(), any()); mCTUT = new ImsPhoneCallTracker(mImsPhone, Runnable::run); mCTUT.addReasonCodeRemapping(null, "Wifi signal lost.", ImsReasonInfo.CODE_WIFI_LOST); mCTUT.addReasonCodeRemapping(501, "Call answered elsewhere.", Loading