blob: 5f7d74542fff03edfb6ea462de7a9275ad559a91 [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.util;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.util.ArraySet;
import android.util.SparseBooleanArray;
import androidx.annotation.NonNull;
import com.android.internal.telephony.TelephonyIntents;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.policy.CallbackController;
import java.util.Set;
import javax.inject.Inject;
/**
* Tracks CarrierConfigs for each subId, as well as the default configuration. CarrierConfigurations
* do not trigger a device configuration event, so any UI that relies on carrier configurations must
* register with the tracker to get proper updates.
*
* The tracker also listens for `TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED`
*
* @see CarrierConfigChangedListener to listen for updates
*/
@SysUISingleton
public class CarrierConfigTracker
extends BroadcastReceiver
implements CallbackController<CarrierConfigTracker.CarrierConfigChangedListener> {
private final SparseBooleanArray mCallStrengthConfigs = new SparseBooleanArray();
private final SparseBooleanArray mNoCallingConfigs = new SparseBooleanArray();
private final SparseBooleanArray mCarrierProvisionsWifiMergedNetworks =
new SparseBooleanArray();
private final SparseBooleanArray mShowOperatorNameConfigs = new SparseBooleanArray();
private final CarrierConfigManager mCarrierConfigManager;
private final Set<CarrierConfigChangedListener> mListeners = new ArraySet<>();
private final Set<DefaultDataSubscriptionChangedListener> mDataListeners =
new ArraySet<>();
private boolean mDefaultCallStrengthConfigLoaded;
private boolean mDefaultCallStrengthConfig;
private boolean mDefaultNoCallingConfigLoaded;
private boolean mDefaultNoCallingConfig;
private boolean mDefaultCarrierProvisionsWifiMergedNetworksLoaded;
private boolean mDefaultCarrierProvisionsWifiMergedNetworks;
private boolean mDefaultShowOperatorNameConfigLoaded;
private boolean mDefaultShowOperatorNameConfig;
@Inject
public CarrierConfigTracker(
CarrierConfigManager carrierConfigManager,
BroadcastDispatcher broadcastDispatcher) {
mCarrierConfigManager = carrierConfigManager;
IntentFilter filter = new IntentFilter();
filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
filter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
broadcastDispatcher.registerReceiver(this, filter);
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED.equals(action)) {
updateFromNewCarrierConfig(intent);
} else if (TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED.equals(action)) {
updateDefaultDataSubscription(intent);
}
}
private void updateFromNewCarrierConfig(Intent intent) {
final int subId = intent.getIntExtra(
CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX,
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
return;
}
final PersistableBundle config = mCarrierConfigManager.getConfigForSubId(subId);
if (config == null) {
return;
}
synchronized (mCallStrengthConfigs) {
mCallStrengthConfigs.put(subId, config.getBoolean(
CarrierConfigManager.KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL));
}
synchronized (mNoCallingConfigs) {
mNoCallingConfigs.put(subId, config.getBoolean(
CarrierConfigManager.KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL));
}
synchronized (mCarrierProvisionsWifiMergedNetworks) {
mCarrierProvisionsWifiMergedNetworks.put(subId, config.getBoolean(
CarrierConfigManager.KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL));
}
synchronized (mShowOperatorNameConfigs) {
mShowOperatorNameConfigs.put(subId, config.getBoolean(
CarrierConfigManager.KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL));
}
notifyCarrierConfigChanged();
}
private void updateDefaultDataSubscription(Intent intent) {
int subId = intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, -1);
notifyDefaultDataSubscriptionChanged(subId);
}
private void notifyCarrierConfigChanged() {
for (CarrierConfigChangedListener l : mListeners) {
l.onCarrierConfigChanged();
}
}
private void notifyDefaultDataSubscriptionChanged(int subId) {
for (DefaultDataSubscriptionChangedListener l : mDataListeners) {
l.onDefaultSubscriptionChanged(subId);
}
}
/**
* Returns the KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL value for the given subId.
*/
public boolean getCallStrengthConfig(int subId) {
synchronized (mCallStrengthConfigs) {
if (mCallStrengthConfigs.indexOfKey(subId) >= 0) {
return mCallStrengthConfigs.get(subId);
}
}
if (!mDefaultCallStrengthConfigLoaded) {
mDefaultCallStrengthConfig =
CarrierConfigManager.getDefaultConfig().getBoolean(
CarrierConfigManager.KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL);
mDefaultCallStrengthConfigLoaded = true;
}
return mDefaultCallStrengthConfig;
}
/**
* Returns the KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL value for the given subId.
*/
public boolean getNoCallingConfig(int subId) {
synchronized (mNoCallingConfigs) {
if (mNoCallingConfigs.indexOfKey(subId) >= 0) {
return mNoCallingConfigs.get(subId);
}
}
if (!mDefaultNoCallingConfigLoaded) {
mDefaultNoCallingConfig =
CarrierConfigManager.getDefaultConfig().getBoolean(
CarrierConfigManager.KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL);
mDefaultNoCallingConfigLoaded = true;
}
return mDefaultNoCallingConfig;
}
/**
* Returns the KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL value for the given subId.
*/
public boolean getCarrierProvisionsWifiMergedNetworksBool(int subId) {
synchronized (mCarrierProvisionsWifiMergedNetworks) {
if (mCarrierProvisionsWifiMergedNetworks.indexOfKey(subId) >= 0) {
return mCarrierProvisionsWifiMergedNetworks.get(subId);
}
}
if (!mDefaultCarrierProvisionsWifiMergedNetworksLoaded) {
mDefaultCarrierProvisionsWifiMergedNetworks =
CarrierConfigManager.getDefaultConfig().getBoolean(
CarrierConfigManager.KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL);
mDefaultCarrierProvisionsWifiMergedNetworksLoaded = true;
}
return mDefaultCarrierProvisionsWifiMergedNetworks;
}
/**
* Returns the KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL value for the default config
*/
public boolean getShowOperatorNameInStatusBarConfigDefault() {
if (!mDefaultShowOperatorNameConfigLoaded) {
mDefaultShowOperatorNameConfig = CarrierConfigManager.getDefaultConfig().getBoolean(
CarrierConfigManager.KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL);
mDefaultShowOperatorNameConfigLoaded = true;
}
return mDefaultShowOperatorNameConfig;
}
/**
* Returns the KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL value for the given subId, or the
* default value if no override exists
*
* @param subId the subscription id for which to query the config
*/
public boolean getShowOperatorNameInStatusBarConfig(int subId) {
if (mShowOperatorNameConfigs.indexOfKey(subId) >= 0) {
return mShowOperatorNameConfigs.get(subId);
} else {
return getShowOperatorNameInStatusBarConfigDefault();
}
}
@Override
public void addCallback(@NonNull CarrierConfigChangedListener listener) {
mListeners.add(listener);
}
@Override
public void removeCallback(@NonNull CarrierConfigChangedListener listener) {
mListeners.remove(listener);
}
/** */
public void addDefaultDataSubscriptionChangedListener(
@NonNull DefaultDataSubscriptionChangedListener listener) {
mDataListeners.add(listener);
}
/** */
public void removeDataSubscriptionChangedListener(
DefaultDataSubscriptionChangedListener listener) {
mDataListeners.remove(listener);
}
/**
* Called when carrier config changes
*/
public interface CarrierConfigChangedListener {
/** */
void onCarrierConfigChanged();
}
/**
* Called when the default data subscription changes. Listeners may want to query
* subId-dependent configuration values when this event happens
*/
public interface DefaultDataSubscriptionChangedListener {
/**
* @param subId the new default data subscription id per
* {@link SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX}
*/
void onDefaultSubscriptionChanged(int subId);
}
}