• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }