This is a case where two Fi SIM are within device. Try to aggregate them when they got same group UUID. Bug: 194761536 Test: local Change-Id: I669e65dba6b5508f8cde88695f45eb459cd29474
177 lines
6.2 KiB
Java
177 lines
6.2 KiB
Java
/*
|
|
* 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.settings.network;
|
|
|
|
import android.content.Context;
|
|
import android.telephony.SubscriptionManager;
|
|
import android.util.Log;
|
|
|
|
import com.android.settings.network.SubscriptionUtil;
|
|
import com.android.settings.network.helper.SelectableSubscriptions;
|
|
import com.android.settings.network.helper.SubscriptionAnnotation;
|
|
import com.android.settings.network.helper.SubscriptionGrouping;
|
|
import com.android.settings.network.telephony.MobileNetworkUtils;
|
|
import com.android.settingslib.utils.ThreadUtils;
|
|
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.concurrent.Future;
|
|
import java.util.function.Consumer;
|
|
import java.util.stream.Collectors;
|
|
|
|
/**
|
|
* This one keeps the information required by MobileNetworkSummaryController.
|
|
*/
|
|
public class MobileNetworkSummaryStatus {
|
|
private static final String LOG_TAG = "MobileNetworkSummaryStatus";
|
|
|
|
private Future<Map<Integer, CharSequence>> mUniqueNameMapping;
|
|
private Map<Integer, CharSequence> mUniqueNameMappingCache;
|
|
|
|
private Future<Boolean> mIsEuiccConfiguable;
|
|
private Boolean mIsEuiccConfiguableCache;
|
|
|
|
private Future<Boolean> mIsPsimDisableSupported;
|
|
private Boolean mIsPsimDisableSupportedCache;
|
|
|
|
private List<SubscriptionAnnotation> mSubscriptionList;
|
|
|
|
private boolean mDisableReEntranceUpdate;
|
|
|
|
// Constructor
|
|
public MobileNetworkSummaryStatus() {}
|
|
|
|
/**
|
|
* Update the status
|
|
* @param context
|
|
* @param andThen Consumer which always performed by the end of #update()
|
|
* and avoid from repeated queries.
|
|
*/
|
|
public void update(Context context, Consumer<MobileNetworkSummaryStatus> andThen) {
|
|
if (mDisableReEntranceUpdate) {
|
|
Log.d(LOG_TAG, "network summary query ignored");
|
|
if (andThen != null) {
|
|
andThen.accept(this);
|
|
}
|
|
return;
|
|
}
|
|
mDisableReEntranceUpdate = true;
|
|
Log.d(LOG_TAG, "network summary query");
|
|
|
|
// Query Euicc in background
|
|
mIsEuiccConfiguable = (Future<Boolean>)
|
|
ThreadUtils.postOnBackgroundThread(() -> isEuiccConfiguable(context));
|
|
|
|
// Query display name in background
|
|
mUniqueNameMapping = (Future<Map<Integer, CharSequence>>)
|
|
ThreadUtils.postOnBackgroundThread(() -> getUniqueNameForDisplay(context));
|
|
|
|
// Query support status of pSIM disable feature
|
|
mIsPsimDisableSupported = (Future<Boolean>) ThreadUtils.postOnBackgroundThread(()
|
|
-> isPhysicalSimDisableSupported(context));
|
|
|
|
// Query subscription
|
|
mSubscriptionList = getSubscriptions(context);
|
|
|
|
if (andThen != null) {
|
|
andThen.accept(this);
|
|
}
|
|
mDisableReEntranceUpdate = false;
|
|
}
|
|
|
|
/**
|
|
* Get the subscription information
|
|
* @return a list of SubscriptionAnnotation
|
|
*/
|
|
public List<SubscriptionAnnotation> getSubscriptionList() {
|
|
return mSubscriptionList;
|
|
}
|
|
|
|
/**
|
|
* Get unique display name for a specific subscription
|
|
* @param subscriptionId subscription ID
|
|
* @return display name for that subscription
|
|
*/
|
|
public CharSequence getDisplayName(int subscriptionId) {
|
|
if (mUniqueNameMapping != null) {
|
|
try {
|
|
mUniqueNameMappingCache = mUniqueNameMapping.get();
|
|
} catch (Exception exception) {
|
|
Log.w(LOG_TAG, "Fail to get display names", exception);
|
|
}
|
|
mUniqueNameMapping = null;
|
|
}
|
|
if (mUniqueNameMappingCache == null) {
|
|
return null;
|
|
}
|
|
return mUniqueNameMappingCache.get(subscriptionId);
|
|
}
|
|
|
|
// Check if Euicc is currently available
|
|
public boolean isEuiccConfigSupport() {
|
|
if (mIsEuiccConfiguable != null) {
|
|
try {
|
|
mIsEuiccConfiguableCache = mIsEuiccConfiguable.get();
|
|
} catch (Exception exception) {
|
|
Log.w(LOG_TAG, "Fail to get euicc config status", exception);
|
|
}
|
|
mIsEuiccConfiguable = null;
|
|
}
|
|
return (mIsEuiccConfiguableCache == null) ?
|
|
false : mIsEuiccConfiguableCache.booleanValue();
|
|
}
|
|
|
|
// Check if disable physical SIM is supported
|
|
public boolean isPhysicalSimDisableSupport() {
|
|
if (mIsPsimDisableSupported != null) {
|
|
try {
|
|
mIsPsimDisableSupportedCache = mIsPsimDisableSupported.get();
|
|
} catch (Exception exception) {
|
|
Log.w(LOG_TAG, "Fail to get pSIM disable support", exception);
|
|
}
|
|
mIsPsimDisableSupported = null;
|
|
}
|
|
return (mIsPsimDisableSupportedCache == null) ?
|
|
false : mIsPsimDisableSupportedCache.booleanValue();
|
|
}
|
|
|
|
private List<SubscriptionAnnotation> getSubscriptions(Context context) {
|
|
return (new SelectableSubscriptions(context, true))
|
|
|
|
// To maintain the consistency with SubscriptionUtil#getAvailableSubscriptions().
|
|
.addFinisher(new SubscriptionGrouping())
|
|
|
|
.call()
|
|
.stream()
|
|
.filter(SubscriptionAnnotation::isDisplayAllowed)
|
|
.collect(Collectors.toList());
|
|
}
|
|
|
|
private Map<Integer, CharSequence> getUniqueNameForDisplay(Context context) {
|
|
return SubscriptionUtil.getUniqueSubscriptionDisplayNames(context);
|
|
}
|
|
|
|
private boolean isPhysicalSimDisableSupported(Context context) {
|
|
SubscriptionManager subMgr = context.getSystemService(SubscriptionManager.class);
|
|
return SubscriptionUtil.showToggleForPhysicalSim(subMgr);
|
|
}
|
|
|
|
private boolean isEuiccConfiguable(Context context) {
|
|
return MobileNetworkUtils.showEuiccSettingsDetecting(context);
|
|
}
|
|
}
|