1 /*
2  * 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 
17 package com.android.systemui.qs.tiles
18 
19 import android.content.Context
20 import android.content.Intent
21 import android.os.Handler
22 import android.os.Looper
23 import android.provider.Settings
24 import android.view.View
25 import com.android.internal.logging.MetricsLogger
26 import com.android.systemui.R
27 import com.android.systemui.dagger.qualifiers.Background
28 import com.android.systemui.dagger.qualifiers.Main
29 import com.android.systemui.plugins.ActivityStarter
30 import com.android.systemui.plugins.FalsingManager
31 import com.android.systemui.plugins.qs.QSIconView
32 import com.android.systemui.plugins.qs.QSTile
33 import com.android.systemui.plugins.statusbar.StatusBarStateController
34 import com.android.systemui.qs.AlphaControlledSignalTileView
35 import com.android.systemui.qs.QSHost
36 import com.android.systemui.qs.QsEventLogger
37 import com.android.systemui.qs.logging.QSLogger
38 import com.android.systemui.qs.tileimpl.QSTileImpl
39 import com.android.systemui.qs.tiles.dialog.InternetDialogFactory
40 import com.android.systemui.statusbar.connectivity.AccessPointController
41 import com.android.systemui.statusbar.pipeline.shared.ui.binder.InternetTileBinder
42 import com.android.systemui.statusbar.pipeline.shared.ui.model.InternetTileModel
43 import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.InternetTileViewModel
44 import javax.inject.Inject
45 
46 class InternetTileNewImpl
47 @Inject
48 constructor(
49     host: QSHost,
50     uiEventLogger: QsEventLogger,
51     @Background backgroundLooper: Looper,
52     @Main private val mainHandler: Handler,
53     falsingManager: FalsingManager,
54     metricsLogger: MetricsLogger,
55     statusBarStateController: StatusBarStateController,
56     activityStarter: ActivityStarter,
57     qsLogger: QSLogger,
58     viewModel: InternetTileViewModel,
59     private val internetDialogFactory: InternetDialogFactory,
60     private val accessPointController: AccessPointController,
61 ) :
62     QSTileImpl<QSTile.SignalState>(
63         host,
64         uiEventLogger,
65         backgroundLooper,
66         mainHandler,
67         falsingManager,
68         metricsLogger,
69         statusBarStateController,
70         activityStarter,
71         qsLogger
72     ) {
73     private var model: InternetTileModel = viewModel.tileModel.value
74 
75     init {
76         InternetTileBinder.bind(lifecycle, viewModel.tileModel) { newModel ->
77             model = newModel
78             refreshState()
79         }
80     }
81 
82     override fun createTileView(context: Context): QSIconView =
83         AlphaControlledSignalTileView(context)
84 
85     override fun getTileLabel(): CharSequence =
86         mContext.getString(R.string.quick_settings_internet_label)
87 
88     override fun newTileState(): QSTile.SignalState {
89         return QSTile.SignalState().also { it.forceExpandIcon = true }
90     }
91 
92     override fun handleClick(view: View?) {
93         mainHandler.post {
94             internetDialogFactory.create(
95                 aboveStatusBar = true,
96                 accessPointController.canConfigMobileData(),
97                 accessPointController.canConfigWifi(),
98                 view,
99             )
100         }
101     }
102 
103     override fun handleUpdateState(state: QSTile.SignalState, arg: Any?) {
104         state.label = mContext.resources.getString(R.string.quick_settings_internet_label)
105 
106         model.applyTo(state, mContext)
107     }
108 
109     override fun getLongClickIntent(): Intent = WIFI_SETTINGS
110 
111     companion object {
112         private val WIFI_SETTINGS = Intent(Settings.ACTION_WIFI_SETTINGS)
113     }
114 }
115