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

Commit 5b5403fa authored by Junyu Lai's avatar Junyu Lai Committed by Gerrit Code Review
Browse files

Merge "[SP21.1] Address comments for API council review about aosp/1172143"

parents a559fb77 97a325e8
Loading
Loading
Loading
Loading
+13 −14
Original line number Diff line number Diff line
@@ -34,8 +34,7 @@ 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.net.netstats.provider.NetworkStatsProvider;
import android.os.AsyncResult;
import android.os.Bundle;
import android.os.Handler;
@@ -260,16 +259,16 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
    }

    /**
     * A class implementing {@link AbstractNetworkStatsProvider} to report VT data usage to system.
     * A class implementing {@link NetworkStatsProvider} to report VT data usage to system.
     */
    // TODO: Directly reports diff in updateVtDataUsage.
    @VisibleForTesting(visibility = PRIVATE)
    public class VtDataUsageProvider extends AbstractNetworkStatsProvider {
    public class VtDataUsageProvider extends NetworkStatsProvider {
        private int mToken = 0;
        private NetworkStats mIfaceSnapshot = new NetworkStats(0L, 0);
        private NetworkStats mUidSnapshot = new NetworkStats(0L, 0);
        @Override
        public void requestStatsUpdate(int token) {
        public void onRequestStatsUpdate(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.
@@ -284,19 +283,19 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {

            final NetworkStats ifaceDiff = mVtDataUsageSnapshot.subtract(mIfaceSnapshot);
            final NetworkStats uidDiff = mVtDataUsageUidSnapshot.subtract(mUidSnapshot);
            mVtDataUsageProviderCb.onStatsUpdated(mToken, ifaceDiff, uidDiff);
            mVtDataUsageProvider.notifyStatsUpdated(mToken, ifaceDiff, uidDiff);
            mIfaceSnapshot = mIfaceSnapshot.add(ifaceDiff);
            mUidSnapshot = mUidSnapshot.add(uidDiff);
            mToken = token;
        }

        @Override
        public void setLimit(String iface, long quotaBytes) {
        public void onSetLimit(String iface, long quotaBytes) {
            // No-op
        }

        @Override
        public void setAlert(long quotaBytes) {
        public void onSetAlert(long quotaBytes) {
            // No-op
        }
    }
@@ -436,7 +435,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {

    private volatile NetworkStats mVtDataUsageSnapshot = null;
    private volatile NetworkStats mVtDataUsageUidSnapshot = null;
    private final NetworkStatsProviderCallback mVtDataUsageProviderCb;
    private final VtDataUsageProvider mVtDataUsageProvider = new VtDataUsageProvider();

    private final AtomicInteger mDefaultDialerUid = new AtomicInteger(NetworkStats.UID_ALL);

@@ -873,8 +872,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        final NetworkStatsManager statsManager =
                (NetworkStatsManager) mPhone.getContext().getSystemService(
                        Context.NETWORK_STATS_SERVICE);
        mVtDataUsageProviderCb = statsManager.registerNetworkStatsProvider(LOG_TAG,
                new VtDataUsageProvider());
        statsManager.registerNetworkStatsProvider(LOG_TAG, mVtDataUsageProvider);

        // Allow the executor to be specified for testing.
        mImsManagerConnector = new FeatureConnector<>(
@@ -1025,9 +1023,10 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        mPhone.getDefaultPhone().getDataEnabledSettings().unregisterForDataEnabledChanged(this);
        mImsManagerConnector.disconnect();

        if (mVtDataUsageProviderCb != null) {
            mVtDataUsageProviderCb.unregister();
        }
        final NetworkStatsManager statsManager =
                (NetworkStatsManager) mPhone.getContext().getSystemService(
                        Context.NETWORK_STATS_SERVICE);
        statsManager.unregisterNetworkStatsProvider(mVtDataUsageProvider);
    }

    @Override
+23 −18
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@ import static android.net.NetworkStats.UID_ALL;

import static com.android.testutils.NetworkStatsUtilsKt.assertNetworkStatsEquals;

import static junit.framework.Assert.assertNotNull;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -46,15 +48,17 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.annotation.Nullable;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.NetworkStats;
import android.net.NetworkStats.Entry;
import android.net.netstats.provider.NetworkStatsProviderCallback;
import android.net.netstats.provider.INetworkStatsProviderCallback;
import android.os.Bundle;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.RemoteException;
import android.telecom.VideoProfile;
import android.telephony.CarrierConfigManager;
import android.telephony.DisconnectCause;
@@ -107,8 +111,7 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest {
    private ImsCall mImsCall;
    private ImsCall mSecondImsCall;
    private Bundle mBundle = new Bundle();
    private final ArgumentCaptor<VtDataUsageProvider> mVtDataUsageProviderCaptor =
            ArgumentCaptor.forClass(VtDataUsageProvider.class);
    @Nullable private VtDataUsageProvider mVtDataUsageProvider;
    @Mock
    private ImsCallSession mImsCallSession;
    @Mock
@@ -120,7 +123,7 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest {
    @Mock
    private ImsPhoneConnection mImsPhoneConnection;
    @Mock
    private NetworkStatsProviderCallback mVtDataUsageProviderCb;
    private INetworkStatsProviderCallback mVtDataUsageProviderCb;

    private void imsCallMocking(final ImsCall imsCall) throws Exception {

@@ -226,9 +229,6 @@ 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.",
@@ -244,8 +244,14 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest {
                "service not allowed in this location",
                ImsReasonInfo.CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION);
        mCTUT.setDataEnabled(true);

        final ArgumentCaptor<VtDataUsageProvider> vtDataUsageProviderCaptor =
                ArgumentCaptor.forClass(VtDataUsageProvider.class);
        verify(mStatsManager).registerNetworkStatsProvider(anyString(),
                mVtDataUsageProviderCaptor.capture());
                vtDataUsageProviderCaptor.capture());
        mVtDataUsageProvider = vtDataUsageProviderCaptor.getValue();
        assertNotNull(mVtDataUsageProvider);
        mVtDataUsageProvider.setProviderCallbackBinder(mVtDataUsageProviderCb);

        logd("ImsPhoneCallTracker initiated");
        processAllMessages();
@@ -1023,10 +1029,8 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest {

    @Test
    @SmallTest
    public void testVtDataUsageProvider() {
        final VtDataUsageProvider provider = mVtDataUsageProviderCaptor.getValue();

        provider.requestStatsUpdate(11);
    public void testVtDataUsageProvider() throws RemoteException {
        mVtDataUsageProvider.onRequestStatsUpdate(11);

        // Verify that requestStatsUpdate triggers onStatsUpdated, where the initial token should
        // be reported with current stats.
@@ -1040,7 +1044,7 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest {

        // Make another request, and verify stats updated accordingly, with previously issued token.
        reset(mVtDataUsageProviderCb);
        provider.requestStatsUpdate(13);
        mVtDataUsageProvider.onRequestStatsUpdate(13);
        assertVtDataUsageUpdated(11, 25, 25);

        // Update accumulated data usage twice. updateVtDataUsage takes accumulated stats from
@@ -1048,22 +1052,23 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest {
        reset(mVtDataUsageProviderCb);
        mCTUT.updateVtDataUsage(call, 70);
        mCTUT.updateVtDataUsage(call, 91);
        verify(mVtDataUsageProviderCb, never()).onStatsUpdated(anyInt(), any(), any());
        verify(mVtDataUsageProviderCb, never()).notifyStatsUpdated(anyInt(), any(), any());

        // Verify that diff stats from last update is reported accordingly.
        provider.requestStatsUpdate(13);
        mVtDataUsageProvider.onRequestStatsUpdate(13);
        // Rounding error occurs so (70-51)/2 + (91-70)/2 = 19 is expected for both direction.
        assertVtDataUsageUpdated(13, 19, 19);
    }

    private void assertVtDataUsageUpdated(int expectedToken, long rxBytes, long txBytes) {
    private void assertVtDataUsageUpdated(int expectedToken, long rxBytes, long txBytes)
            throws RemoteException {
        final ArgumentCaptor<NetworkStats> ifaceStatsCaptor = ArgumentCaptor.forClass(
                NetworkStats.class);
        final ArgumentCaptor<NetworkStats> uidStatsCaptor = ArgumentCaptor.forClass(
                NetworkStats.class);

        verify(mVtDataUsageProviderCb).onStatsUpdated(eq(expectedToken), ifaceStatsCaptor.capture(),
                uidStatsCaptor.capture());
        verify(mVtDataUsageProviderCb).notifyStatsUpdated(eq(expectedToken),
                ifaceStatsCaptor.capture(), uidStatsCaptor.capture());

        // Default dialer's package uid is not set during test, thus the uid stats looks the same
        // as iface stats and the records are always merged into the same entry.