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

Commit 107cca7a authored by Chaohui Wang's avatar Chaohui Wang
Browse files

Fix data usage when policy has no cycle

Fallback to four weeks, as the same as no policy.

Fix: 336108815
Test: manual - on DataUsageList
Test: unit test
Change-Id: I63140a13ea3f3ee790cc911432fbdfd6247f7318
parent c63f06d4
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -18,11 +18,10 @@ package com.android.settings.datausage.lib

import android.content.Context
import android.net.NetworkTemplate
import android.text.format.DateUtils
import android.util.Range
import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.asFourWeeks
import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.bucketRange
import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.getCycles
import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.reverseBucketRange
import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.Bucket
import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.aggregate
import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.filterTime
@@ -39,16 +38,11 @@ class NetworkCycleBucketRepository(
        getCycles().map { aggregateUsage(it) }.filter { it.usage > 0 }

    private fun getCycles(): List<Range<Long>> =
        networkCycleDataRepository.getPolicy()?.getCycles() ?: queryCyclesAsFourWeeks()
        networkCycleDataRepository.getPolicy()?.getCycles().orEmpty()
            .ifEmpty { queryCyclesAsFourWeeks() }

    private fun queryCyclesAsFourWeeks(): List<Range<Long>> {
        val timeRange = buckets.aggregate()?.timeRange ?: return emptyList()
        return reverseBucketRange(
            startTime = timeRange.lower,
            endTime = timeRange.upper,
            step = DateUtils.WEEK_IN_MILLIS * 4,
        )
    }
    private fun queryCyclesAsFourWeeks(): List<Range<Long>> =
        buckets.aggregate()?.timeRange.asFourWeeks()

    fun queryChartData(usageData: NetworkUsageData) = NetworkCycleChartData(
        total = usageData,
+12 −10
Original line number Diff line number Diff line
@@ -42,16 +42,10 @@ class NetworkCycleDataRepository(
    fun loadFirstCycle(): NetworkUsageData? = getCycles().firstOrNull()?.let { queryUsage(it) }

    override fun getCycles(): List<Range<Long>> =
        getPolicy()?.getCycles() ?: queryCyclesAsFourWeeks()
        getPolicy()?.getCycles().orEmpty().ifEmpty { queryCyclesAsFourWeeks() }

    private fun queryCyclesAsFourWeeks(): List<Range<Long>> {
        val timeRange = networkStatsRepository.getTimeRange() ?: return emptyList()
        return reverseBucketRange(
            startTime = timeRange.lower,
            endTime = timeRange.upper,
            step = DateUtils.WEEK_IN_MILLIS * 4,
        )
    }
    private fun queryCyclesAsFourWeeks(): List<Range<Long>> =
        networkStatsRepository.getTimeRange().asFourWeeks()

    override fun getPolicy(): NetworkPolicy? =
        with(NetworkPolicyEditor(policyManager)) {
@@ -59,7 +53,6 @@ class NetworkCycleDataRepository(
            getPolicy(networkTemplate)
        }


    override fun queryUsage(range: Range<Long>) = NetworkUsageData(
        startTime = range.lower,
        endTime = range.upper,
@@ -71,6 +64,15 @@ class NetworkCycleDataRepository(
            Range(it.lower.toInstant().toEpochMilli(), it.upper.toInstant().toEpochMilli())
        }.toList()

        fun Range<Long>?.asFourWeeks(): List<Range<Long>> {
            val timeRange = this ?: return emptyList()
            return reverseBucketRange(
                startTime = timeRange.lower,
                endTime = timeRange.upper,
                step = DateUtils.WEEK_IN_MILLIS * 4,
            )
        }

        fun bucketRange(startTime: Long, endTime: Long, step: Long): List<Range<Long>> =
            (startTime..endTime step step).zipWithNext(::Range)

+43 −15
Original line number Diff line number Diff line
@@ -42,6 +42,13 @@ class NetworkCycleBucketRepositoryTest {

    private val mockNetworkCycleDataRepository = mock<NetworkCycleDataRepository>()

    private fun createRepository(buckets: List<Bucket>) = NetworkCycleBucketRepository(
        context = context,
        networkTemplate = template,
        buckets = buckets,
        networkCycleDataRepository = mockNetworkCycleDataRepository,
    )

    @Test
    fun loadCycles_byPolicy() {
        val policy = mock<NetworkPolicy> {
@@ -52,9 +59,7 @@ class NetworkCycleBucketRepositoryTest {
        mockNetworkCycleDataRepository.stub {
            on { getPolicy() } doReturn policy
        }
        val repository = NetworkCycleBucketRepository(
            context = context,
            networkTemplate = template,
        val repository = createRepository(
            buckets = listOf(
                Bucket(
                    uid = 0,
@@ -62,8 +67,7 @@ class NetworkCycleBucketRepositoryTest {
                    startTimeStamp = CYCLE1_START_TIME,
                    endTimeStamp = CYCLE1_END_TIME,
                )
            ),
            networkCycleDataRepository = mockNetworkCycleDataRepository,
            )
        )

        val cycles = repository.loadCycles()
@@ -78,13 +82,14 @@ class NetworkCycleBucketRepositoryTest {
    }

    @Test
    fun loadCycles_asFourWeeks() {
    fun loadCycles_policyHasNoCycle_asFourWeeks() {
        val policy = mock<NetworkPolicy> {
            on { cycleIterator() } doReturn emptyList<Range<ZonedDateTime>>().iterator()
        }
        mockNetworkCycleDataRepository.stub {
            on { getPolicy() } doReturn null
            on { getPolicy() } doReturn policy
        }
        val repository = NetworkCycleBucketRepository(
            context = context,
            networkTemplate = template,
        val repository = createRepository(
            buckets = listOf(
                Bucket(
                    uid = 0,
@@ -92,8 +97,34 @@ class NetworkCycleBucketRepositoryTest {
                    startTimeStamp = CYCLE2_START_TIME,
                    endTimeStamp = CYCLE2_END_TIME,
                )
            )
        )

        val cycles = repository.loadCycles()

        assertThat(cycles).containsExactly(
            NetworkUsageData(
                startTime = CYCLE2_END_TIME - DateUtils.WEEK_IN_MILLIS * 4,
                endTime = CYCLE2_END_TIME,
                usage = CYCLE2_BYTES,
            ),
            networkCycleDataRepository = mockNetworkCycleDataRepository,
        )
    }

    @Test
    fun loadCycles_noPolicy_asFourWeeks() {
        mockNetworkCycleDataRepository.stub {
            on { getPolicy() } doReturn null
        }
        val repository = createRepository(
            buckets = listOf(
                Bucket(
                    uid = 0,
                    bytes = CYCLE2_BYTES,
                    startTimeStamp = CYCLE2_START_TIME,
                    endTimeStamp = CYCLE2_END_TIME,
                )
            )
        )

        val cycles = repository.loadCycles()
@@ -114,9 +145,7 @@ class NetworkCycleBucketRepositoryTest {
            endTime = CYCLE4_END_TIME,
            usage = CYCLE3_BYTES + CYCLE4_BYTES,
        )
        val repository = NetworkCycleBucketRepository(
            context = context,
            networkTemplate = template,
        val repository = createRepository(
            buckets = listOf(
                Bucket(
                    uid = 0,
@@ -131,7 +160,6 @@ class NetworkCycleBucketRepositoryTest {
                    endTimeStamp = CYCLE4_END_TIME,
                ),
            ),
            networkCycleDataRepository = mockNetworkCycleDataRepository,
        )

        val summary = repository.queryChartData(cycle)
+23 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.testutils.zonedDateTime
import com.google.common.truth.Truth.assertThat
import java.time.ZonedDateTime
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
@@ -77,7 +78,28 @@ class NetworkCycleDataRepositoryTest {
    }

    @Test
    fun loadFirstCycle_asFourWeeks() = runTest {
    fun loadFirstCycle_policyHasNoCycle_asFourWeeks() = runTest {
        val policy = mock<NetworkPolicy> {
            on { cycleIterator() } doReturn emptyList<Range<ZonedDateTime>>().iterator()
        }
        doReturn(policy).whenever(repository).getPolicy()
        mockNetworkStatsRepository.stub {
            on { getTimeRange() } doReturn Range(CYCLE2_START_TIME, CYCLE2_END_TIME)
        }

        val firstCycle = repository.loadFirstCycle()

        assertThat(firstCycle).isEqualTo(
            NetworkUsageData(
                startTime = CYCLE2_END_TIME - DateUtils.WEEK_IN_MILLIS * 4,
                endTime = CYCLE2_END_TIME,
                usage = CYCLE2_BYTES,
            ),
        )
    }

    @Test
    fun loadFirstCycle_noPolicy_asFourWeeks() = runTest {
        doReturn(null).whenever(repository).getPolicy()
        mockNetworkStatsRepository.stub {
            on { getTimeRange() } doReturn Range(CYCLE2_START_TIME, CYCLE2_END_TIME)