Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4ab97fa authored by junyulai's avatar junyulai
Browse files

[SP12.1] Add VtDataUsageProvider

This change contains minimum modifications to implement
AbstractNetworkStatsProvider which allows VT to report stats
asynchronously and remove the usage of getVtDataUsage.

Test: atest FrameworksNetTests FrameworksTelephonyTests
Bug: 130855321
Change-Id: I536352e8fb1b1f2a09e465db84916b0e6d463064
Fix: 143923500
parent d7c16538
Loading
Loading
Loading
Loading
+55 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -253,6 +257,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) {
@@ -388,6 +432,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);

@@ -589,6 +634,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<>(
@@ -738,6 +788,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
@@ -4037,7 +4091,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();
                }
+4 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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.
+8 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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 {

@@ -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.",