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

Commit 6c2d7717 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

[SP12.1] Add VtDataUsageProvider am: d4ab97fa am: b549d7f9

Change-Id: I732bab6c1982834fdf7a349c23b691c92fc34fe8
parents 944a7fbd b549d7f9
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;
@@ -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) {
@@ -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);

@@ -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<>(
@@ -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
@@ -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();
                }
+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.",