1 /*
2  * Copyright (C) 2021 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.util;
18 
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.content.IntentFilter;
23 import android.os.PersistableBundle;
24 import android.telephony.CarrierConfigManager;
25 import android.telephony.SubscriptionManager;
26 import android.util.SparseBooleanArray;
27 
28 import com.android.systemui.broadcast.BroadcastDispatcher;
29 import com.android.systemui.dagger.SysUISingleton;
30 
31 import javax.inject.Inject;
32 
33 /**
34  * Tracks the Carrier Config values.
35  */
36 @SysUISingleton
37 public class CarrierConfigTracker extends BroadcastReceiver {
38     private final SparseBooleanArray mCallStrengthConfigs = new SparseBooleanArray();
39     private final SparseBooleanArray mNoCallingConfigs = new SparseBooleanArray();
40     private final SparseBooleanArray mCarrierProvisionsWifiMergedNetworks =
41             new SparseBooleanArray();
42     private final CarrierConfigManager mCarrierConfigManager;
43     private boolean mDefaultCallStrengthConfigLoaded;
44     private boolean mDefaultCallStrengthConfig;
45     private boolean mDefaultNoCallingConfigLoaded;
46     private boolean mDefaultNoCallingConfig;
47     private boolean mDefaultCarrierProvisionsWifiMergedNetworksLoaded;
48     private boolean mDefaultCarrierProvisionsWifiMergedNetworks;
49 
50     @Inject
CarrierConfigTracker(Context context, BroadcastDispatcher broadcastDispatcher)51     public CarrierConfigTracker(Context context, BroadcastDispatcher broadcastDispatcher) {
52         mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
53         broadcastDispatcher.registerReceiver(
54                 this, new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
55     }
56 
57     @Override
onReceive(Context context, Intent intent)58     public void onReceive(Context context, Intent intent) {
59         if (!CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED.equals(intent.getAction())) {
60             return;
61         }
62 
63         final int subId = intent.getIntExtra(
64                 CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX,
65                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
66         if (!SubscriptionManager.isValidSubscriptionId(subId)) {
67             return;
68         }
69 
70         final PersistableBundle config = mCarrierConfigManager.getConfigForSubId(subId);
71         if (config == null) {
72             return;
73         }
74 
75         synchronized (mCallStrengthConfigs) {
76             mCallStrengthConfigs.put(subId, config.getBoolean(
77                     CarrierConfigManager.KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL));
78         }
79         synchronized (mNoCallingConfigs) {
80             mNoCallingConfigs.put(subId, config.getBoolean(
81                     CarrierConfigManager.KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL));
82         }
83         synchronized (mCarrierProvisionsWifiMergedNetworks) {
84             mCarrierProvisionsWifiMergedNetworks.put(subId, config.getBoolean(
85                     CarrierConfigManager.KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL));
86         }
87     }
88 
89     /**
90      * Returns the KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL value for the given subId.
91      */
getCallStrengthConfig(int subId)92     public boolean getCallStrengthConfig(int subId) {
93         synchronized (mCallStrengthConfigs) {
94             if (mCallStrengthConfigs.indexOfKey(subId) >= 0) {
95                 return mCallStrengthConfigs.get(subId);
96             }
97         }
98         if (!mDefaultCallStrengthConfigLoaded) {
99             mDefaultCallStrengthConfig =
100                     CarrierConfigManager.getDefaultConfig().getBoolean(
101                             CarrierConfigManager.KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL);
102             mDefaultCallStrengthConfigLoaded = true;
103         }
104         return mDefaultCallStrengthConfig;
105     }
106 
107     /**
108      * Returns the KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL value for the given subId.
109      */
getNoCallingConfig(int subId)110     public boolean getNoCallingConfig(int subId) {
111         synchronized (mNoCallingConfigs) {
112             if (mNoCallingConfigs.indexOfKey(subId) >= 0) {
113                 return mNoCallingConfigs.get(subId);
114             }
115         }
116         if (!mDefaultNoCallingConfigLoaded) {
117             mDefaultNoCallingConfig =
118                     CarrierConfigManager.getDefaultConfig().getBoolean(
119                             CarrierConfigManager.KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL);
120             mDefaultNoCallingConfigLoaded = true;
121         }
122         return mDefaultNoCallingConfig;
123     }
124 
125     /**
126      * Returns the KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL value for the given subId.
127      */
getCarrierProvisionsWifiMergedNetworksBool(int subId)128     public boolean getCarrierProvisionsWifiMergedNetworksBool(int subId) {
129         synchronized (mCarrierProvisionsWifiMergedNetworks) {
130             if (mCarrierProvisionsWifiMergedNetworks.indexOfKey(subId) >= 0) {
131                 return mCarrierProvisionsWifiMergedNetworks.get(subId);
132             }
133         }
134         if (!mDefaultCarrierProvisionsWifiMergedNetworksLoaded) {
135             mDefaultCarrierProvisionsWifiMergedNetworks =
136                     CarrierConfigManager.getDefaultConfig().getBoolean(
137                             CarrierConfigManager.KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL);
138             mDefaultCarrierProvisionsWifiMergedNetworksLoaded = true;
139         }
140         return mDefaultCarrierProvisionsWifiMergedNetworks;
141     }
142 }
143