1 /* <lambda>null2 * Copyright (C) 2024 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.viewmodel 18 19 import android.graphics.Color 20 import com.android.systemui.kairos.ExperimentalKairosApi 21 import com.android.systemui.kairos.State 22 import com.android.systemui.kairos.combine 23 import com.android.systemui.statusbar.phone.StatusBarLocation 24 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconInteractorKairos 25 import com.android.systemui.statusbar.pipeline.mobile.ui.VerboseMobileViewLogger 26 27 /** 28 * A view model for an individual mobile icon that embeds the notion of a [StatusBarLocation]. This 29 * allows the mobile icon to change some view parameters at different locations 30 * 31 * @param commonImpl for convenience, this class wraps a base interface that can provides all of the 32 * common implementations between locations. See [MobileIconViewModel] 33 * @property location the [StatusBarLocation] of this VM. 34 * @property verboseLogger an optional logger to log extremely verbose view updates. 35 */ 36 @ExperimentalKairosApi 37 abstract class LocationBasedMobileViewModelKairos( 38 val commonImpl: MobileIconViewModelKairosCommon, 39 val location: StatusBarLocation, 40 val verboseLogger: VerboseMobileViewLogger?, 41 ) : MobileIconViewModelKairosCommon by commonImpl { 42 val defaultColor: Int = Color.WHITE 43 44 companion object { 45 fun viewModelForLocation( 46 commonImpl: MobileIconViewModelKairosCommon, 47 interactor: MobileIconInteractorKairos, 48 verboseMobileViewLogger: VerboseMobileViewLogger, 49 location: StatusBarLocation, 50 ): LocationBasedMobileViewModelKairos = 51 when (location) { 52 StatusBarLocation.HOME -> 53 HomeMobileIconViewModelKairos(commonImpl, verboseMobileViewLogger) 54 StatusBarLocation.KEYGUARD -> KeyguardMobileIconViewModelKairos(commonImpl) 55 StatusBarLocation.QS -> QsMobileIconViewModelKairos(commonImpl) 56 StatusBarLocation.SHADE_CARRIER_GROUP -> 57 ShadeCarrierGroupMobileIconViewModelKairos(commonImpl, interactor) 58 } 59 } 60 } 61 62 @ExperimentalKairosApi 63 class HomeMobileIconViewModelKairos( 64 commonImpl: MobileIconViewModelKairosCommon, 65 verboseMobileViewLogger: VerboseMobileViewLogger, 66 ) : 67 MobileIconViewModelKairosCommon, 68 LocationBasedMobileViewModelKairos( 69 commonImpl, 70 location = StatusBarLocation.HOME, 71 verboseMobileViewLogger, 72 ) 73 74 @ExperimentalKairosApi 75 class QsMobileIconViewModelKairos(commonImpl: MobileIconViewModelKairosCommon) : 76 MobileIconViewModelKairosCommon, 77 LocationBasedMobileViewModelKairos( 78 commonImpl, 79 location = StatusBarLocation.QS, 80 // Only do verbose logging for the Home location. 81 verboseLogger = null, 82 ) 83 84 @ExperimentalKairosApi 85 class ShadeCarrierGroupMobileIconViewModelKairos( 86 commonImpl: MobileIconViewModelKairosCommon, 87 private val interactor: MobileIconInteractorKairos, 88 ) : 89 MobileIconViewModelKairosCommon, 90 LocationBasedMobileViewModelKairos( 91 commonImpl, 92 location = StatusBarLocation.SHADE_CARRIER_GROUP, 93 // Only do verbose logging for the Home location. 94 verboseLogger = null, 95 ) { 96 97 private val isSingleCarrier: State<Boolean> 98 get() = interactor.isSingleCarrier 99 100 val carrierName: State<String> 101 get() = interactor.carrierName 102 103 override val isVisible: State<Boolean> = isSingleCarriernull104 combine(super.isVisible, isSingleCarrier) { isVisible, isSingleCarrier -> 105 !isSingleCarrier && isVisible 106 } 107 } 108 109 @ExperimentalKairosApi 110 class KeyguardMobileIconViewModelKairos(commonImpl: MobileIconViewModelKairosCommon) : 111 MobileIconViewModelKairosCommon, 112 LocationBasedMobileViewModelKairos( 113 commonImpl, 114 location = StatusBarLocation.KEYGUARD, 115 // Only do verbose logging for the Home location. 116 verboseLogger = null, 117 ) 118