Merge "[SP18.6] Make offload controller poll interval configurable" am: 10c8c21777 am: 6848610485
Change-Id: Iab4a5f883a8357c23375633c16059b38d74b9e9b
This commit is contained in:
@@ -26,6 +26,8 @@ import static android.net.NetworkStats.UID_TETHERING;
|
||||
import static android.net.netstats.provider.NetworkStatsProvider.QUOTA_UNLIMITED;
|
||||
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
|
||||
|
||||
import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.app.usage.NetworkStatsManager;
|
||||
@@ -77,8 +79,6 @@ public class OffloadController {
|
||||
private static final boolean DBG = false;
|
||||
private static final String ANYIP = "0.0.0.0";
|
||||
private static final ForwardedStats EMPTY_STATS = new ForwardedStats();
|
||||
@VisibleForTesting
|
||||
static final int DEFAULT_PERFORM_POLL_INTERVAL_MS = 5000;
|
||||
|
||||
@VisibleForTesting
|
||||
enum StatsType {
|
||||
@@ -135,11 +135,9 @@ public class OffloadController {
|
||||
private final Dependencies mDeps;
|
||||
|
||||
// TODO: Put more parameters in constructor into dependency object.
|
||||
static class Dependencies {
|
||||
int getPerformPollInterval() {
|
||||
// TODO: Consider make this configurable.
|
||||
return DEFAULT_PERFORM_POLL_INTERVAL_MS;
|
||||
}
|
||||
interface Dependencies {
|
||||
@NonNull
|
||||
TetheringConfiguration getTetherConfig();
|
||||
}
|
||||
|
||||
public OffloadController(Handler h, OffloadHardwareInterface hwi,
|
||||
@@ -453,12 +451,16 @@ public class OffloadController {
|
||||
if (mHandler.hasCallbacks(mScheduledPollingTask)) {
|
||||
mHandler.removeCallbacks(mScheduledPollingTask);
|
||||
}
|
||||
mHandler.postDelayed(mScheduledPollingTask, mDeps.getPerformPollInterval());
|
||||
mHandler.postDelayed(mScheduledPollingTask,
|
||||
mDeps.getTetherConfig().getOffloadPollInterval());
|
||||
}
|
||||
|
||||
private boolean isPollingStatsNeeded() {
|
||||
return started() && mRemainingAlertQuota > 0
|
||||
&& !TextUtils.isEmpty(currentUpstreamInterface());
|
||||
&& !TextUtils.isEmpty(currentUpstreamInterface())
|
||||
&& mDeps.getTetherConfig() != null
|
||||
&& mDeps.getTetherConfig().getOffloadPollInterval()
|
||||
>= DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;
|
||||
}
|
||||
|
||||
private boolean maybeUpdateDataLimit(String iface) {
|
||||
|
||||
@@ -273,7 +273,13 @@ public class Tethering {
|
||||
mHandler = mTetherMasterSM.getHandler();
|
||||
mOffloadController = new OffloadController(mHandler,
|
||||
mDeps.getOffloadHardwareInterface(mHandler, mLog), mContext.getContentResolver(),
|
||||
statsManager, mLog, new OffloadController.Dependencies());
|
||||
statsManager, mLog, new OffloadController.Dependencies() {
|
||||
|
||||
@Override
|
||||
public TetheringConfiguration getTetherConfig() {
|
||||
return mConfig;
|
||||
}
|
||||
});
|
||||
mUpstreamNetworkMonitor = mDeps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog,
|
||||
TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
|
||||
mForwardedDownstreams = new LinkedHashSet<>();
|
||||
|
||||
@@ -26,10 +26,10 @@ import static android.net.NetworkStats.UID_TETHERING;
|
||||
import static android.net.RouteInfo.RTN_UNICAST;
|
||||
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
|
||||
|
||||
import static com.android.networkstack.tethering.OffloadController.DEFAULT_PERFORM_POLL_INTERVAL_MS;
|
||||
import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_IFACE;
|
||||
import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_UID;
|
||||
import static com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats;
|
||||
import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS;
|
||||
import static com.android.testutils.MiscAssertsKt.assertContainsAll;
|
||||
import static com.android.testutils.MiscAssertsKt.assertThrows;
|
||||
import static com.android.testutils.NetworkStatsUtilsKt.assertNetworkStatsEquals;
|
||||
@@ -109,6 +109,7 @@ public class OffloadControllerTest {
|
||||
@Mock private ApplicationInfo mApplicationInfo;
|
||||
@Mock private Context mContext;
|
||||
@Mock private NetworkStatsManager mStatsManager;
|
||||
@Mock private TetheringConfiguration mTetherConfig;
|
||||
// Late init since methods must be called by the thread that created this object.
|
||||
private TestableNetworkStatsProviderCbBinder mTetherStatsProviderCb;
|
||||
private OffloadController.OffloadTetheringStatsProvider mTetherStatsProvider;
|
||||
@@ -120,8 +121,8 @@ public class OffloadControllerTest {
|
||||
private final TestLooper mTestLooper = new TestLooper();
|
||||
private OffloadController.Dependencies mDeps = new OffloadController.Dependencies() {
|
||||
@Override
|
||||
int getPerformPollInterval() {
|
||||
return -1; // Disabled.
|
||||
public TetheringConfiguration getTetherConfig() {
|
||||
return mTetherConfig;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -133,6 +134,7 @@ public class OffloadControllerTest {
|
||||
mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
|
||||
when(mContext.getContentResolver()).thenReturn(mContentResolver);
|
||||
FakeSettingsProvider.clearSettingsProvider();
|
||||
when(mTetherConfig.getOffloadPollInterval()).thenReturn(-1); // Disabled.
|
||||
}
|
||||
|
||||
@After public void tearDown() throws Exception {
|
||||
@@ -153,12 +155,7 @@ public class OffloadControllerTest {
|
||||
}
|
||||
|
||||
private void setOffloadPollInterval(int interval) {
|
||||
mDeps = new OffloadController.Dependencies() {
|
||||
@Override
|
||||
int getPerformPollInterval() {
|
||||
return interval;
|
||||
}
|
||||
};
|
||||
when(mTetherConfig.getOffloadPollInterval()).thenReturn(interval);
|
||||
}
|
||||
|
||||
private void waitForIdle() {
|
||||
@@ -785,7 +782,7 @@ public class OffloadControllerTest {
|
||||
public void testOnSetAlert() throws Exception {
|
||||
setupFunctioningHardwareInterface();
|
||||
enableOffload();
|
||||
setOffloadPollInterval(DEFAULT_PERFORM_POLL_INTERVAL_MS);
|
||||
setOffloadPollInterval(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
|
||||
final OffloadController offload = makeOffloadController();
|
||||
offload.start();
|
||||
|
||||
@@ -807,14 +804,14 @@ public class OffloadControllerTest {
|
||||
when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
|
||||
new ForwardedStats(0, 0));
|
||||
mTetherStatsProvider.onSetAlert(100);
|
||||
mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS);
|
||||
mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
|
||||
waitForIdle();
|
||||
mTetherStatsProviderCb.assertNoCallback();
|
||||
|
||||
// Verify that notifyAlertReached fired when quota is reached.
|
||||
when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(
|
||||
new ForwardedStats(50, 50));
|
||||
mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS);
|
||||
mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
|
||||
waitForIdle();
|
||||
mTetherStatsProviderCb.expectNotifyAlertReached();
|
||||
|
||||
@@ -822,7 +819,7 @@ public class OffloadControllerTest {
|
||||
// any stats since the polling is stopped.
|
||||
reset(mHardware);
|
||||
mTetherStatsProvider.onSetAlert(NetworkStatsProvider.QUOTA_UNLIMITED);
|
||||
mTestLooper.moveTimeForward(DEFAULT_PERFORM_POLL_INTERVAL_MS);
|
||||
mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS);
|
||||
waitForIdle();
|
||||
mTetherStatsProviderCb.assertNoCallback();
|
||||
verify(mHardware, never()).getForwardedStats(any());
|
||||
|
||||
Reference in New Issue
Block a user