• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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.data.model
18 
19 import android.content.Intent
20 import android.telephony.TelephonyManager.EXTRA_DATA_SPN
21 import android.telephony.TelephonyManager.EXTRA_PLMN
22 import android.telephony.TelephonyManager.EXTRA_SHOW_PLMN
23 import android.telephony.TelephonyManager.EXTRA_SHOW_SPN
24 import android.telephony.TelephonyManager.EXTRA_SPN
25 import com.android.systemui.Flags.statusBarSwitchToSpnFromDataSpn
26 import com.android.systemui.log.table.Diffable
27 import com.android.systemui.log.table.TableRowLogger
28 
29 /**
30  * Encapsulates the data needed to show a network name for a mobile network. The data is parsed from
31  * the intent sent by [android.telephony.TelephonyManager.ACTION_SERVICE_PROVIDERS_UPDATED].
32  */
33 sealed interface NetworkNameModel : Diffable<NetworkNameModel> {
34     val name: String
35 
36     /** The default name is read from [com.android.internal.R.string.lockscreen_carrier_default] */
37     data class Default(override val name: String) : NetworkNameModel {
logDiffsnull38         override fun logDiffs(prevVal: NetworkNameModel, row: TableRowLogger) {
39             if (prevVal !is Default || prevVal.name != name) {
40                 row.logChange(COL_NETWORK_NAME, "Default($name)")
41             }
42         }
43 
logFullnull44         override fun logFull(row: TableRowLogger) {
45             row.logChange(COL_NETWORK_NAME, "Default($name)")
46         }
47     }
48 
49     /**
50      * This name has been derived from telephony intents. see
51      * [android.telephony.TelephonyManager.ACTION_SERVICE_PROVIDERS_UPDATED]
52      */
53     data class IntentDerived(override val name: String) : NetworkNameModel {
logDiffsnull54         override fun logDiffs(prevVal: NetworkNameModel, row: TableRowLogger) {
55             if (prevVal !is IntentDerived || prevVal.name != name) {
56                 row.logChange(COL_NETWORK_NAME, "IntentDerived($name)")
57             }
58         }
59 
logFullnull60         override fun logFull(row: TableRowLogger) {
61             row.logChange(COL_NETWORK_NAME, "IntentDerived($name)")
62         }
63     }
64 
65     /** This name has been derived from SubscriptionModel. see [SubscriptionModel] */
66     data class SubscriptionDerived(override val name: String) : NetworkNameModel {
logDiffsnull67         override fun logDiffs(prevVal: NetworkNameModel, row: TableRowLogger) {
68             if (prevVal !is SubscriptionDerived || prevVal.name != name) {
69                 row.logChange(COL_NETWORK_NAME, "SubscriptionDerived($name)")
70             }
71         }
72 
logFullnull73         override fun logFull(row: TableRowLogger) {
74             row.logChange(COL_NETWORK_NAME, "SubscriptionDerived($name)")
75         }
76     }
77 
78     /**
79      * This name has been derived from the sim via
80      * [android.telephony.TelephonyManager.getSimOperatorName].
81      */
82     data class SimDerived(override val name: String) : NetworkNameModel {
logDiffsnull83         override fun logDiffs(prevVal: NetworkNameModel, row: TableRowLogger) {
84             if (prevVal !is SimDerived || prevVal.name != name) {
85                 row.logChange(COL_NETWORK_NAME, "SimDerived($name)")
86             }
87         }
88 
logFullnull89         override fun logFull(row: TableRowLogger) {
90             row.logChange(COL_NETWORK_NAME, "SimDerived($name)")
91         }
92     }
93 
94     companion object {
95         const val COL_NETWORK_NAME = "networkName"
96     }
97 }
98 
toNetworkNameModelnull99 fun Intent.toNetworkNameModel(separator: String): NetworkNameModel? {
100     val showSpn = getBooleanExtra(EXTRA_SHOW_SPN, false)
101     val spn =
102         if (statusBarSwitchToSpnFromDataSpn()) {
103             // Context: b/358669494. Use DATA_SPN if it exists, since that allows carriers to
104             // customize the display name. Otherwise, fall back to the SPN
105             val dataSpn = getStringExtra(EXTRA_DATA_SPN)
106             if (dataSpn.isNullOrEmpty()) {
107                 getStringExtra(EXTRA_SPN)
108             } else {
109                 dataSpn
110             }
111         } else {
112             getStringExtra(EXTRA_DATA_SPN)
113         }
114 
115     val showPlmn = getBooleanExtra(EXTRA_SHOW_PLMN, false)
116     val plmn = getStringExtra(EXTRA_PLMN)
117 
118     val str = StringBuilder()
119     if (showPlmn && plmn != null) {
120         str.append(plmn)
121     }
122     if (showSpn && spn != null) {
123         if (str.isNotEmpty()) {
124             str.append(separator)
125         }
126         str.append(spn)
127     }
128 
129     return if (str.isNotEmpty()) NetworkNameModel.IntentDerived(str.toString()) else null
130 }
131