From d7451d16ffb0dbd7c763f22759534ffa4c1a8eb9 Mon Sep 17 00:00:00 2001 From: Junyu Lai Date: Mon, 10 Jan 2022 10:39:00 +0000 Subject: [PATCH] [MS48.2] Remove NetworkStatsHistory from CycleAdaptor While the ChartData changes the types of stored data. Modify CycleAdaptor accordlingly for the compatibility. Test: atest clockwork-settings-robotests make RunSettingsRoboTests -j40 make RunSettingsLibRoboTests ROBOTEST_FILTER=DataUsageControllerTest make RunSettingsLibRoboTests ROBOTEST_FILTER=NetworkCycleChartDataLoaderTest make RunSettingsLibRoboTests ROBOTEST_FILTER=NetworkCycleDataForUidLoaderTest make RunSettingsLibRoboTests ROBOTEST_FILTER=NetworkCycleDataLoaderTest make RunSettingsLibRoboTests ROBOTEST_FILTER=DataUsageUtilsTest Bug: 204830222 Ignore-AOSP-First: Related API conflict, need master first. (cherry-picked from ag/16686514) Change-Id: Ia778d680d5354fb67476db0763dfab017284dc4a Merged-In: Ia778d680d5354fb67476db0763dfab017284dc4a --- Android.bp | 1 + .../settings/datausage/CycleAdapter.java | 72 ++++++++++++++----- 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/Android.bp b/Android.bp index bb9db22e8da..610e7e80fbe 100644 --- a/Android.bp +++ b/Android.bp @@ -64,6 +64,7 @@ android_library { "androidx.lifecycle_lifecycle-extensions", "guava", "jsr305", + "net-utils-framework-common", "settings-contextual-card-protos-lite", "settings-log-bridge-protos-lite", "contextualcards", diff --git a/src/com/android/settings/datausage/CycleAdapter.java b/src/com/android/settings/datausage/CycleAdapter.java index 74d27be7e67..1292d001435 100644 --- a/src/com/android/settings/datausage/CycleAdapter.java +++ b/src/com/android/settings/datausage/CycleAdapter.java @@ -13,14 +13,17 @@ */ package com.android.settings.datausage; +import android.annotation.NonNull; +import android.app.usage.NetworkStats; import android.content.Context; import android.net.NetworkPolicy; import android.net.NetworkPolicyManager; -import android.net.NetworkStatsHistory; import android.text.format.DateUtils; import android.util.Pair; +import android.util.Range; import android.widget.AdapterView; +import com.android.net.module.util.NetworkStatsUtils; import com.android.settings.Utils; import com.android.settingslib.net.ChartData; import com.android.settingslib.net.NetworkCycleData; @@ -62,9 +65,43 @@ public class CycleAdapter extends SettingsSpinnerAdapter return 0; } + protected static long getTotalBytesForTimeRange(List stats, + Range range) { + long bytes = 0L; + for (NetworkStats.Bucket bucket : stats) { + final Range bucketSpan = new Range<>( + bucket.getStartTimeStamp(), bucket.getEndTimeStamp()); + // Only record bytes that overlapped with the given time range. For partially + // overlapped bucket, record rational bytes assuming the traffic is uniform + // distributed within the bucket. + try { + final Range overlapped = range.intersect(bucketSpan); + final long totalOfBucket = bucket.getRxBytes() + bucket.getTxBytes(); + bytes += NetworkStatsUtils.multiplySafeByRational(totalOfBucket, + overlapped.getUpper() - overlapped.getLower(), + bucketSpan.getUpper() - bucketSpan.getLower()); + } catch (IllegalArgumentException e) { + // Range disjoint, ignore. + continue; + } + } + return bytes; + } + + @NonNull + private Range getTimeRangeOf(@NonNull List stats) { + long start = Long.MAX_VALUE; + long end = Long.MIN_VALUE; + for (NetworkStats.Bucket bucket : stats) { + start = Math.min(start, bucket.getStartTimeStamp()); + end = Math.max(end, bucket.getEndTimeStamp()); + } + return new Range(start, end); + } + /** * Rebuild list based on {@link NetworkPolicy} and available - * {@link NetworkStatsHistory} data. Always selects the newest item, + * {@link List} data. Always selects the newest item, * updating the inspection range on chartData. */ @Deprecated @@ -75,19 +112,20 @@ public class CycleAdapter extends SettingsSpinnerAdapter clear(); final Context context = getContext(); - NetworkStatsHistory.Entry entry = null; - long historyStart = Long.MAX_VALUE; - long historyEnd = Long.MIN_VALUE; - if (chartData != null) { - historyStart = chartData.network.getStart(); - historyEnd = chartData.network.getEnd(); + long historyStart; + long historyEnd; + try { + final Range historyTimeRange = getTimeRangeOf(chartData.network); + historyStart = historyTimeRange.getLower(); + historyEnd = historyTimeRange.getUpper(); + } catch (IllegalArgumentException e) { + // Empty history. + final long now = System.currentTimeMillis(); + historyStart = now; + historyEnd = now + 1; } - final long now = System.currentTimeMillis(); - if (historyStart == Long.MAX_VALUE) historyStart = now; - if (historyEnd == Long.MIN_VALUE) historyEnd = now + 1; - boolean hasCycles = false; if (policy != null) { final Iterator> it = NetworkPolicyManager @@ -99,8 +137,9 @@ public class CycleAdapter extends SettingsSpinnerAdapter final boolean includeCycle; if (chartData != null) { - entry = chartData.network.getValues(cycleStart, cycleEnd, entry); - includeCycle = (entry.rxBytes + entry.txBytes) > 0; + final long bytesInCycle = getTotalBytesForTimeRange(chartData.network, + new Range<>(cycleStart, cycleEnd)); + includeCycle = bytesInCycle > 0; } else { includeCycle = true; } @@ -120,8 +159,9 @@ public class CycleAdapter extends SettingsSpinnerAdapter final boolean includeCycle; if (chartData != null) { - entry = chartData.network.getValues(cycleStart, cycleEnd, entry); - includeCycle = (entry.rxBytes + entry.txBytes) > 0; + final long bytesInCycle = getTotalBytesForTimeRange(chartData.network, + new Range<>(cycleStart, cycleEnd)); + includeCycle = bytesInCycle > 0; } else { includeCycle = true; }