1 /* <lambda>null2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.settings.datausage 17 18 import android.app.settings.SettingsEnums 19 import android.content.Context 20 import android.os.Bundle 21 import android.telephony.SubscriptionManager 22 import android.widget.Switch 23 import com.android.settings.R 24 import com.android.settings.SettingsActivity 25 import com.android.settings.dashboard.DashboardFragment 26 import com.android.settings.search.BaseSearchIndexProvider 27 import com.android.settings.widget.SettingsMainSwitchBar 28 import com.android.settingslib.search.SearchIndexable 29 30 @SearchIndexable 31 class DataSaverSummary : DashboardFragment() { 32 private lateinit var switchBar: SettingsMainSwitchBar 33 private lateinit var dataSaverBackend: DataSaverBackend 34 35 // Flag used to avoid infinite loop due if user switch it on/off too quick. 36 private var switching = false 37 38 override fun onCreate(bundle: Bundle?) { 39 super.onCreate(bundle) 40 41 if (!requireContext().isDataSaverVisible()) { 42 finishFragment() 43 return 44 } 45 46 dataSaverBackend = DataSaverBackend(requireContext()) 47 } 48 49 override fun onActivityCreated(savedInstanceState: Bundle?) { 50 super.onActivityCreated(savedInstanceState) 51 switchBar = (activity as SettingsActivity).switchBar.apply { 52 setTitle(getString(R.string.data_saver_switch_title)) 53 show() 54 addOnSwitchChangeListener { _: Switch, isChecked: Boolean -> 55 onSwitchChanged(isChecked) 56 } 57 } 58 } 59 60 override fun onResume() { 61 super.onResume() 62 dataSaverBackend.addListener(dataSaverBackendListener) 63 } 64 65 override fun onPause() { 66 super.onPause() 67 dataSaverBackend.remListener(dataSaverBackendListener) 68 } 69 70 private fun onSwitchChanged(isChecked: Boolean) { 71 synchronized(this) { 72 if (!switching) { 73 switching = true 74 dataSaverBackend.isDataSaverEnabled = isChecked 75 } 76 } 77 } 78 79 override fun getPreferenceScreenResId() = R.xml.data_saver 80 override fun getMetricsCategory() = SettingsEnums.DATA_SAVER_SUMMARY 81 override fun getHelpResource() = R.string.help_url_data_saver 82 override fun getLogTag() = TAG 83 84 private val dataSaverBackendListener = object : DataSaverBackend.Listener { 85 override fun onDataSaverChanged(isDataSaving: Boolean) { 86 synchronized(this) { 87 switchBar.isChecked = isDataSaving 88 switching = false 89 } 90 } 91 } 92 93 companion object { 94 private const val TAG = "DataSaverSummary" 95 96 private fun Context.isDataSaverVisible(): Boolean = 97 resources.getBoolean(R.bool.config_show_data_saver) 98 99 @JvmField 100 val SEARCH_INDEX_DATA_PROVIDER = object : BaseSearchIndexProvider(R.xml.data_saver) { 101 override fun isPageSearchEnabled(context: Context): Boolean = 102 context.isDataSaverVisible() && 103 DataUsageUtils.hasMobileData(context) && 104 (DataUsageUtils.getDefaultSubscriptionId(context) != 105 SubscriptionManager.INVALID_SUBSCRIPTION_ID) 106 } 107 } 108 }