[Settings] Present EID in About phone page

Present EID within about phone page.

Bug: 260540995
Test: local

Change-Id: If5f512c1da6b4b3b1adc1d13dbe11226b7ecad41
This commit is contained in:
Bonian Chen
2022-12-20 11:55:08 +00:00
parent cf9fd9941d
commit dda58d5255
6 changed files with 395 additions and 1 deletions

View File

@@ -0,0 +1,151 @@
/*
* Copyright (C) 2022 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.deviceinfo.simstatus;
import android.content.Context;
import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyManager;
import android.telephony.UiccCardInfo;
import android.telephony.euicc.EuiccManager;
import android.text.TextUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.concurrent.Phaser;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.IntStream;
/**
* A class for query EID.
*/
public class EidStatus {
private static final String TAG = "EidStatus";
private final SlotSimStatus mSlotSimStatus;
private final Phaser mBlocker = new Phaser(1);
private final AtomicReference<String> mEid = new AtomicReference<String>();
/**
* Construct of class.
* @param slotSimStatus SlotSimStatus
* @param context Context
*/
public EidStatus(SlotSimStatus slotSimStatus, Context context) {
this(slotSimStatus, context, null);
}
/**
* Construct of class.
* @param slotSimStatus SlotSimStatus
* @param context Context
* @param executor executor for offload to thread
*/
public EidStatus(SlotSimStatus slotSimStatus, Context context, Executor executor) {
mSlotSimStatus = slotSimStatus;
if (executor == null) {
getEidOperation(context);
} else {
executor.execute(() -> getEidOperation(context));
}
}
/**
* Get the EID
* @return EID string
*/
public String getEid() {
mBlocker.awaitAdvance(0);
return mEid.get();
}
protected TelephonyManager getTelephonyManager(Context context) {
return context.getSystemService(TelephonyManager.class);
}
protected EuiccManager getEuiccManager(Context context) {
return context.getSystemService(EuiccManager.class);
}
protected String getDefaultEid(EuiccManager euiccMgr) {
if ((euiccMgr == null) || (!euiccMgr.isEnabled())) {
return null;
}
return euiccMgr.getEid();
}
protected void getEidOperation(Context context) {
EuiccManager euiccMgr = getEuiccManager(context);
String eid = getEidPerSlot(context, euiccMgr);
if (eid == null) {
eid = getDefaultEid(euiccMgr);
}
mEid.set(eid);
mBlocker.arrive();
}
protected String getEidPerSlot(Context context, EuiccManager euiccMgr) {
if (mSlotSimStatus.size() <= SimStatusDialogController.MAX_PHONE_COUNT_SINGLE_SIM) {
return null;
}
TelephonyManager telMgr = getTelephonyManager(context);
if (telMgr == null) {
return null;
}
List<UiccCardInfo> uiccCardInfoList = telMgr.getUiccCardsInfo();
if (uiccCardInfoList == null) {
return null;
}
// Collects all card ID from all eSIM(s) reported from SubscsriptionManager
final int [] cardIdList = IntStream.range(0, mSlotSimStatus.size())
.mapToObj(slotIdx -> mSlotSimStatus.getSubscriptionInfo(slotIdx))
.filter(Objects::nonNull)
.filter(SubscriptionInfo::isEmbedded)
.mapToInt(SubscriptionInfo::getCardId)
.sorted()
.distinct()
.toArray();
if (cardIdList.length == 0) {
return null;
}
/**
* Find EID from first slot which contains an eSIM and with card ID listed within
* the eSIM card ID provided by SubscsriptionManager.
*/
return uiccCardInfoList.stream()
.filter(UiccCardInfo::isEuicc)
.filter(cardInfo -> {
int cardId = cardInfo.getCardId();
return Arrays.binarySearch(cardIdList, cardId) >= 0;
})
.map(cardInfo -> {
String eid = cardInfo.getEid();
if (TextUtils.isEmpty(eid)) {
eid = euiccMgr.createForCardId(cardInfo.getCardId()).getEid();
}
return eid;
})
.findFirst()
.orElse(null);
}
}