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