/* * Copyright (C) 2018 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.phone; import android.telephony.CellIdentity; import android.telephony.CellIdentityCdma; import android.telephony.CellIdentityGsm; import android.telephony.CellIdentityLte; import android.telephony.CellIdentityWcdma; import android.telephony.CellInfo; import android.telephony.CellInfoCdma; import android.telephony.CellInfoGsm; import android.telephony.CellInfoLte; import android.telephony.CellInfoWcdma; import android.text.BidiFormatter; import android.text.TextDirectionHeuristics; import android.text.TextUtils; import android.util.Log; import com.android.internal.telephony.OperatorInfo; import java.util.Collections; import java.util.List; /** * Add static Utility functions to get information from the CellInfo object. * TODO: Modify {@link CellInfo} for simplify those functions */ public final class CellInfoUtil { private static final String TAG = "NetworkSelectSetting"; private CellInfoUtil() { } /** * Wrap a CellIdentity into a CellInfo. */ public static CellInfo wrapCellInfoWithCellIdentity(CellIdentity cellIdentity) { if (cellIdentity instanceof CellIdentityLte) { CellInfoLte cellInfo = new CellInfoLte(); cellInfo.setCellIdentity((CellIdentityLte) cellIdentity); return cellInfo; } else if (cellIdentity instanceof CellIdentityCdma) { CellInfoCdma cellInfo = new CellInfoCdma(); cellInfo.setCellIdentity((CellIdentityCdma) cellIdentity); return cellInfo; } else if (cellIdentity instanceof CellIdentityWcdma) { CellInfoWcdma cellInfo = new CellInfoWcdma(); cellInfo.setCellIdentity((CellIdentityWcdma) cellIdentity); return cellInfo; } else if (cellIdentity instanceof CellIdentityGsm) { CellInfoGsm cellInfo = new CellInfoGsm(); cellInfo.setCellIdentity((CellIdentityGsm) cellIdentity); return cellInfo; } else { Log.e(TAG, "Invalid CellInfo type"); return null; } } /** * Returns the title of the network obtained in the manual search. * * @param cellInfo contains the information of the network. * @return Long Name if not null/empty, otherwise Short Name if not null/empty, * else MCCMNC string. */ public static String getNetworkTitle(CellInfo cellInfo) { OperatorInfo oi = getOperatorInfoFromCellInfo(cellInfo); if (!TextUtils.isEmpty(oi.getOperatorAlphaLong())) { return oi.getOperatorAlphaLong(); } else if (!TextUtils.isEmpty(oi.getOperatorAlphaShort())) { return oi.getOperatorAlphaShort(); } else { BidiFormatter bidiFormatter = BidiFormatter.getInstance(); return bidiFormatter.unicodeWrap(oi.getOperatorNumeric(), TextDirectionHeuristics.LTR); } } /** * Wrap a cell info into an operator info. */ public static OperatorInfo getOperatorInfoFromCellInfo(CellInfo cellInfo) { OperatorInfo oi; if (cellInfo instanceof CellInfoLte) { CellInfoLte lte = (CellInfoLte) cellInfo; oi = new OperatorInfo( (String) lte.getCellIdentity().getOperatorAlphaLong(), (String) lte.getCellIdentity().getOperatorAlphaShort(), lte.getCellIdentity().getMobileNetworkOperator()); } else if (cellInfo instanceof CellInfoWcdma) { CellInfoWcdma wcdma = (CellInfoWcdma) cellInfo; oi = new OperatorInfo( (String) wcdma.getCellIdentity().getOperatorAlphaLong(), (String) wcdma.getCellIdentity().getOperatorAlphaShort(), wcdma.getCellIdentity().getMobileNetworkOperator()); } else if (cellInfo instanceof CellInfoGsm) { CellInfoGsm gsm = (CellInfoGsm) cellInfo; oi = new OperatorInfo( (String) gsm.getCellIdentity().getOperatorAlphaLong(), (String) gsm.getCellIdentity().getOperatorAlphaShort(), gsm.getCellIdentity().getMobileNetworkOperator()); } else if (cellInfo instanceof CellInfoCdma) { CellInfoCdma cdma = (CellInfoCdma) cellInfo; oi = new OperatorInfo( (String) cdma.getCellIdentity().getOperatorAlphaLong(), (String) cdma.getCellIdentity().getOperatorAlphaShort(), "" /* operator numeric */); } else { Log.e(TAG, "Invalid CellInfo type"); oi = new OperatorInfo("", "", ""); } return oi; } /** * Creates a CellInfo object from OperatorInfo. GsmCellInfo is used here only because * operatorInfo does not contain technology type while CellInfo is an abstract object that * requires to specify technology type. It doesn't matter which CellInfo type to use here, since * we only want to wrap the operator info and PLMN to a CellInfo object. */ public static CellInfo convertOperatorInfoToCellInfo(OperatorInfo operatorInfo) { String operatorNumeric = operatorInfo.getOperatorNumeric(); String mcc = null; String mnc = null; if (operatorNumeric != null && operatorNumeric.matches("^[0-9]{5,6}$")) { mcc = operatorNumeric.substring(0, 3); mnc = operatorNumeric.substring(3); } CellIdentityGsm cig = new CellIdentityGsm( Integer.MAX_VALUE /* lac */, Integer.MAX_VALUE /* cid */, Integer.MAX_VALUE /* arfcn */, Integer.MAX_VALUE /* bsic */, mcc, mnc, operatorInfo.getOperatorAlphaLong(), operatorInfo.getOperatorAlphaShort(), Collections.emptyList()); CellInfoGsm ci = new CellInfoGsm(); ci.setCellIdentity(cig); return ci; } /** Checks whether the network operator is forbidden. */ public static boolean isForbidden(CellInfo cellInfo, List forbiddenPlmns) { String plmn = CellInfoUtil.getOperatorInfoFromCellInfo(cellInfo).getOperatorNumeric(); return forbiddenPlmns != null && forbiddenPlmns.contains(plmn); } }