• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * 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 package com.android.settings.wifi.calling
17 
18 import android.content.Context
19 import android.os.Bundle
20 import android.telephony.SubscriptionManager.getDefaultSubscriptionId
21 import android.telephony.SubscriptionManager.isValidSubscriptionId
22 import com.android.settings.R
23 import com.android.settings.flags.Flags
24 import com.android.settings.network.SubscriptionUtil
25 import com.android.settings.network.telephony.wificalling.WifiCallingRepository
26 import com.android.settings.wifi.calling.WifiCallingSettingsForSub.EXTRA_SUB_ID
27 import com.android.settingslib.metadata.PreferenceAvailabilityProvider
28 import com.android.settingslib.metadata.ProvidePreferenceScreen
29 import com.android.settingslib.metadata.preferenceHierarchy
30 import com.android.settingslib.preference.PreferenceScreenCreator
31 import kotlinx.coroutines.flow.Flow
32 import kotlinx.coroutines.flow.asFlow
33 import kotlinx.coroutines.flow.filter
34 import kotlinx.coroutines.flow.first
35 import kotlinx.coroutines.flow.flowOf
36 import kotlinx.coroutines.flow.map
37 import kotlinx.coroutines.flow.merge
38 
39 @ProvidePreferenceScreen(WifiCallingScreen.KEY, parameterized = true, parameterizedMigration = true)
40 class WifiCallingScreen(override val arguments: Bundle) :
41     PreferenceScreenCreator, PreferenceAvailabilityProvider {
42 
43     private val subId = arguments.getInt(EXTRA_SUB_ID, getDefaultSubscriptionId())
44 
45     override val key: String
46         get() = KEY
47 
48     override val title: Int
49         get() = R.string.wifi_calling_settings_title
50 
51     override val summary: Int
52         get() = R.string.wifi_calling_summary
53 
isAvailablenull54     override fun isAvailable(context: Context) = isValidSubscriptionId(subId)
55 
56     override fun isFlagEnabled(context: Context) = Flags.catalystWifiCalling()
57 
58     override fun fragmentClass() = WifiCallingSettingsForSub::class.java
59 
60     override fun hasCompleteHierarchy() = false
61 
62     override fun getPreferenceHierarchy(context: Context) =
63         preferenceHierarchy(context, this) { +WifiCallingMainSwitchPreference(subId) }
64 
65     companion object {
66         const val KEY = "wifi_calling"
67 
68         /**
69          * Provides arguments to generate [WifiCallingScreen].
70          *
71          * This method is used by annotation processor to produce
72          * `PreferenceScreenMetadataParameterizedFactory`).
73          */
74         @JvmStatic
parametersnull75         fun parameters(context: Context): Flow<Bundle> {
76             fun Int.toArguments() = Bundle(1).also { it.putInt(EXTRA_SUB_ID, this) }
77             // handle backward compatibility with default subscription id
78             val defaultSubId = getDefaultSubscriptionId()
79             val flow =
80                 SubscriptionUtil.getSelectableSubscriptionInfoList(context)
81                     .asFlow()
82                     .filter {
83                         val subId = it.subscriptionId
84                         subId != defaultSubId &&
85                             WifiCallingRepository(context, subId).wifiCallingReadyFlow().first()
86                     }
87                     .map { it.subscriptionId.toArguments() }
88             // Bundle.EMPTY is for backward compatibility
89             return when {
90                 isValidSubscriptionId(defaultSubId) -> merge(flowOf(Bundle.EMPTY), flow)
91                 else -> flow
92             }
93         }
94     }
95 }
96