Files
app_Settings/src/com/android/settings/datausage/DataUsageListViewModel.kt
Chaohui Wang 51fc4bef49 Use single queryDetailsForDevice if possible
To improve performance.

Since queryDetailsForDevice() also aggregated the uids into one,
the apps list in DataUsageList still needs another separated api call.

Fix: 315449973
Test: manual - on DataUsageList page
Test: unit tests
Change-Id: I96c23dd7d0d40ecd183e0fb0f61329db42dae1ab
2023-12-16 02:01:22 +08:00

72 lines
3.0 KiB
Kotlin

/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.datausage
import android.app.Application
import android.net.NetworkTemplate
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.android.settings.datausage.lib.NetworkCycleBucketRepository
import com.android.settings.datausage.lib.NetworkStatsRepository
import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.Bucket
import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.filterTime
import com.android.settings.datausage.lib.NetworkUsageData
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.plus
data class SelectedBuckets(
val selectedCycle: NetworkUsageData,
val buckets: List<Bucket>,
)
class DataUsageListViewModel(application: Application) : AndroidViewModel(application) {
private val scope = viewModelScope + Dispatchers.Default
val templateFlow = MutableStateFlow<NetworkTemplate?>(null)
private val bucketsFlow = templateFlow.filterNotNull().map { template ->
NetworkStatsRepository(getApplication(), template).queryDetailsForDevice()
}.stateIn(scope, SharingStarted.WhileSubscribed(), emptyList())
val cyclesFlow = combine(templateFlow.filterNotNull(), bucketsFlow) { template, buckets ->
NetworkCycleBucketRepository(application, template, buckets).loadCycles()
}.flowOn(Dispatchers.Default)
val selectedCycleFlow = MutableStateFlow<NetworkUsageData?>(null)
private val selectedBucketsFlow =
combine(selectedCycleFlow.filterNotNull(), bucketsFlow) { selectedCycle, buckets ->
SelectedBuckets(
selectedCycle = selectedCycle,
buckets = buckets.filterTime(selectedCycle.startTime, selectedCycle.endTime),
)
}.flowOn(Dispatchers.Default)
val chartDataFlow =
combine(templateFlow.filterNotNull(), selectedBucketsFlow) { template, selectedBuckets ->
NetworkCycleBucketRepository(application, template, selectedBuckets.buckets)
.queryChartData(selectedBuckets.selectedCycle)
}.flowOn(Dispatchers.Default)
}