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