From af56a3ea211c0697e27c4883cc80e16d33b7810e Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Tue, 25 Jun 2024 17:03:46 +0800 Subject: [PATCH] Not use SubscriptionInfoEntity in DataUsageList Carrier id will be get in DataUsageListAppsController async. Bug: 348118234 Flag: EXEMPT clean up Test: manual - on DataUsageList Change-Id: I06b361f38d04c5020431cd8c6e359aa3a69942e5 --- .../settings/datausage/DataUsageList.kt | 34 ++++++++----------- .../datausage/DataUsageListAppsController.kt | 7 +++- .../network/NetworkProviderSettings.java | 3 +- .../network/NetworkProviderSettingsTest.java | 4 ++- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/com/android/settings/datausage/DataUsageList.kt b/src/com/android/settings/datausage/DataUsageList.kt index af115d9d370..a2932776669 100644 --- a/src/com/android/settings/datausage/DataUsageList.kt +++ b/src/com/android/settings/datausage/DataUsageList.kt @@ -33,13 +33,10 @@ import com.android.settings.R import com.android.settings.dashboard.DashboardFragment import com.android.settings.datausage.lib.BillingCycleRepository import com.android.settings.datausage.lib.NetworkUsageData -import com.android.settings.network.MobileNetworkRepository import com.android.settings.network.SubscriptionUtil -import com.android.settings.network.telephony.requireSubscriptionManager -import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity +import com.android.settings.network.telephony.SubscriptionRepository import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle import com.android.settingslib.spaprivileged.framework.common.userManager -import com.android.settingslib.utils.ThreadUtils import kotlin.jvm.optionals.getOrNull /** @@ -59,7 +56,6 @@ open class DataUsageList : DashboardFragment() { private lateinit var billingCycleRepository: BillingCycleRepository private var usageAmount: Preference? = null - private var subscriptionInfoEntity: SubscriptionInfoEntity? = null private var dataUsageListAppsController: DataUsageListAppsController? = null private var chartDataUsagePreferenceController: ChartDataUsagePreferenceController? = null private var dataUsageListHeaderController: DataUsageListHeaderController? = null @@ -90,7 +86,6 @@ open class DataUsageList : DashboardFragment() { finish() return } - updateSubscriptionInfoEntity() dataUsageListAppsController = use(DataUsageListAppsController::class.java).apply { init(template) } @@ -132,6 +127,16 @@ open class DataUsageList : DashboardFragment() { viewModel.chartDataFlow.collectLatestWithLifecycle(viewLifecycleOwner) { chartData -> chartDataUsagePreferenceController?.update(chartData) } + finishIfSubscriptionDisabled() + } + + private fun finishIfSubscriptionDisabled() { + if (SubscriptionManager.isUsableSubscriptionId(subId)) { + SubscriptionRepository(requireContext()).isSubscriptionEnabledFlow(subId) + .collectLatestWithLifecycle(viewLifecycleOwner) { isSubscriptionEnabled -> + if (!isSubscriptionEnabled) finish() + } + } } override fun getPreferenceScreenResId() = R.xml.data_usage_list @@ -155,23 +160,12 @@ open class DataUsageList : DashboardFragment() { } } - private fun updateSubscriptionInfoEntity() { - ThreadUtils.postOnBackgroundThread { - subscriptionInfoEntity = - MobileNetworkRepository.getInstance(context).getSubInfoById(subId.toString()) - } - } - /** Update chart sweeps and cycle list to reflect [NetworkPolicy] for current [template]. */ private fun updatePolicy(isModifiable: Boolean) { - val isBillingCycleModifiable = isModifiable && isActiveSubscription() - dataUsageListHeaderController?.setConfigButtonVisible(isBillingCycleModifiable) - chartDataUsagePreferenceController?.setBillingCycleModifiable(isBillingCycleModifiable) + dataUsageListHeaderController?.setConfigButtonVisible(isModifiable) + chartDataUsagePreferenceController?.setBillingCycleModifiable(isModifiable) } - private fun isActiveSubscription(): Boolean = - requireContext().requireSubscriptionManager().getActiveSubscriptionInfo(subId) != null - /** * Updates the chart and detail data when initial loaded or selected cycle changed. */ @@ -187,7 +181,7 @@ open class DataUsageList : DashboardFragment() { /** Updates applications data usage. */ private fun updateApps(usageData: NetworkUsageData) { dataUsageListAppsController?.update( - carrierId = subscriptionInfoEntity?.carrierId, + subId = subId, startTime = usageData.startTime, endTime = usageData.endTime, ) diff --git a/src/com/android/settings/datausage/DataUsageListAppsController.kt b/src/com/android/settings/datausage/DataUsageListAppsController.kt index 93623f479e3..d8bddde4fe2 100644 --- a/src/com/android/settings/datausage/DataUsageListAppsController.kt +++ b/src/com/android/settings/datausage/DataUsageListAppsController.kt @@ -20,6 +20,7 @@ import android.app.ActivityManager import android.content.Context import android.net.NetworkTemplate import android.os.Bundle +import android.telephony.SubscriptionManager import androidx.annotation.OpenForTesting import androidx.annotation.VisibleForTesting import androidx.lifecycle.LifecycleCoroutineScope @@ -32,6 +33,7 @@ import com.android.settings.core.BasePreferenceController import com.android.settings.core.SubSettingLauncher import com.android.settings.datausage.lib.AppDataUsageRepository import com.android.settings.datausage.lib.NetworkUsageData +import com.android.settings.network.telephony.requireSubscriptionManager import com.android.settingslib.AppItem import com.android.settingslib.net.UidDetailProvider import kotlinx.coroutines.Dispatchers @@ -74,8 +76,11 @@ open class DataUsageListAppsController(context: Context, preferenceKey: String) this.cycleData = cycleData } - fun update(carrierId: Int?, startTime: Long, endTime: Long) = lifecycleScope.launch { + fun update(subId: Int, startTime: Long, endTime: Long) = lifecycleScope.launch { val apps = withContext(Dispatchers.Default) { + val carrierId = if (SubscriptionManager.isValidSubscriptionId(subId)) { + mContext.requireSubscriptionManager().getActiveSubscriptionInfo(subId)?.carrierId + } else null repository.getAppPercent(carrierId, startTime, endTime).map { (appItem, percent) -> AppDataUsagePreference(mContext, appItem, percent, uidDetailProvider).apply { setOnPreferenceClickListener { diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java index a4193f8219c..0fcfcb515a1 100644 --- a/src/com/android/settings/network/NetworkProviderSettings.java +++ b/src/com/android/settings/network/NetworkProviderSettings.java @@ -36,6 +36,7 @@ import android.os.PowerManager; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.EventLog; @@ -370,7 +371,7 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment mDataUsagePreference = findPreference(PREF_KEY_DATA_USAGE); mDataUsagePreference.setVisible(DataUsageUtils.hasWifiRadio(getContext())); mDataUsagePreference.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI) - .build(), 0 /*subId*/); + .build(), SubscriptionManager.INVALID_SUBSCRIPTION_ID); mResetInternetPreference = findPreference(PREF_KEY_RESET_INTERNET); if (mResetInternetPreference != null) { mResetInternetPreference.setVisible(false); diff --git a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java index fb29e059ed5..01611788e49 100644 --- a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java +++ b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java @@ -51,6 +51,7 @@ import android.os.Bundle; import android.os.PowerManager; import android.os.UserManager; import android.provider.Settings; +import android.telephony.SubscriptionManager; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; @@ -319,7 +320,8 @@ public class NetworkProviderSettingsTest { mNetworkProviderSettings.onCreate(Bundle.EMPTY); verify(mDataUsagePreference).setVisible(true); - verify(mDataUsagePreference).setTemplate(any(), eq(0) /*subId*/); + verify(mDataUsagePreference) + .setTemplate(any(), eq(SubscriptionManager.INVALID_SUBSCRIPTION_ID)); } @Test