• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.statusbar.pipeline.mobile.ui.view
18 
19 import android.content.Context
20 import android.util.AttributeSet
21 import android.view.LayoutInflater
22 import android.widget.LinearLayout
23 import com.android.systemui.kairos.BuildSpec
24 import com.android.systemui.kairos.ExperimentalKairosApi
25 import com.android.systemui.kairos.KairosNetwork
26 import com.android.systemui.res.R
27 import com.android.systemui.statusbar.StatusBarIconView.STATE_ICON
28 import com.android.systemui.statusbar.phone.StatusBarLocation
29 import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger
30 import com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconBinder
31 import com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconBinderKairos
32 import com.android.systemui.statusbar.pipeline.mobile.ui.binder.ShadeCarrierBinder
33 import com.android.systemui.statusbar.pipeline.mobile.ui.binder.ShadeCarrierBinderKairos
34 import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModel
35 import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModelKairos
36 import com.android.systemui.util.AutoMarqueeTextView
37 import kotlinx.coroutines.CoroutineScope
38 import kotlinx.coroutines.Job
39 import kotlinx.coroutines.launch
40 
41 /**
42  * ViewGroup containing a mobile carrier name and icon in the Shade Header. Can be multiple
43  * instances as children under [ShadeCarrierGroup]
44  */
45 class ModernShadeCarrierGroupMobileView(context: Context, attrs: AttributeSet?) :
46     LinearLayout(context, attrs) {
47 
48     var subId: Int = -1
49 
toStringnull50     override fun toString(): String {
51         return "ModernShadeCarrierGroupMobileView(" +
52             "subId=$subId, " +
53             "viewString=${super.toString()}"
54     }
55 
56     companion object {
57 
58         /**
59          * Inflates a new instance of [ModernShadeCarrierGroupMobileView], binds it to [viewModel],
60          * and returns it.
61          */
62         @JvmStatic
constructAndBindnull63         fun constructAndBind(
64             context: Context,
65             logger: MobileViewLogger,
66             slot: String,
67             viewModel: ShadeCarrierGroupMobileIconViewModel,
68         ): ModernShadeCarrierGroupMobileView {
69             return (LayoutInflater.from(context).inflate(R.layout.shade_carrier_new, null)
70                     as ModernShadeCarrierGroupMobileView)
71                 .also {
72                     it.subId = viewModel.subscriptionId
73 
74                     val iconView = it.requireViewById<ModernStatusBarMobileView>(R.id.mobile_combo)
75                     iconView.initView(slot) {
76                         MobileIconBinder.bind(iconView, viewModel, STATE_ICON, logger)
77                     }
78                     logger.logNewViewBinding(it, viewModel)
79 
80                     val textView = it.requireViewById<AutoMarqueeTextView>(R.id.mobile_carrier_text)
81                     ShadeCarrierBinder.bind(textView, viewModel)
82                 }
83         }
84 
85         /**
86          * Inflates a new instance of [ModernShadeCarrierGroupMobileView], binds it to [viewModel],
87          * and returns it.
88          */
89         @ExperimentalKairosApi
90         @JvmStatic
constructAndBindnull91         fun constructAndBind(
92             context: Context,
93             logger: MobileViewLogger,
94             slot: String,
95             viewModel: BuildSpec<ShadeCarrierGroupMobileIconViewModelKairos>,
96             scope: CoroutineScope,
97             subscriptionId: Int,
98             location: StatusBarLocation,
99             kairosNetwork: KairosNetwork,
100         ): Pair<ModernShadeCarrierGroupMobileView, Job> {
101             val view =
102                 (LayoutInflater.from(context).inflate(R.layout.shade_carrier_new, null)
103                         as ModernShadeCarrierGroupMobileView)
104                     .apply { subId = subscriptionId }
105             return view to
106                 scope.launch {
107                     val iconView =
108                         view.requireViewById<ModernStatusBarMobileView>(R.id.mobile_combo)
109                     iconView.initView(slot) {
110                         val (binding, _) =
111                             MobileIconBinderKairos.bind(
112                                 view = iconView,
113                                 viewModel = viewModel,
114                                 initialVisibilityState = STATE_ICON,
115                                 logger = logger,
116                                 scope = this,
117                                 kairosNetwork = kairosNetwork,
118                             )
119                         binding
120                     }
121                     logger.logNewViewBinding(view, viewModel, location.name)
122 
123                     val textView =
124                         view.requireViewById<AutoMarqueeTextView>(R.id.mobile_carrier_text)
125                     launch { ShadeCarrierBinderKairos.bind(textView, viewModel, kairosNetwork) }
126                 }
127         }
128     }
129 }
130