blob: 2c5f2a8aceb1e1a905a9777b92bcd1d33ffe9a67 [file] [log] [blame]
Cassie22b69172018-03-05 14:28:22 -08001/*
2 * Copyright (C) 2018 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
17package com.android.phone;
18
19import android.telephony.CellIdentity;
20import android.telephony.CellIdentityCdma;
21import android.telephony.CellIdentityGsm;
22import android.telephony.CellIdentityLte;
23import android.telephony.CellIdentityWcdma;
24import android.telephony.CellInfo;
25import android.telephony.CellInfoCdma;
26import android.telephony.CellInfoGsm;
27import android.telephony.CellInfoLte;
28import android.telephony.CellInfoWcdma;
29import android.telephony.TelephonyManager;
30import android.text.BidiFormatter;
31import android.text.TextDirectionHeuristics;
32import android.text.TextUtils;
33import android.util.Log;
34
35import com.android.internal.telephony.OperatorInfo;
36
Cassiee2de67e2018-05-25 11:00:20 -070037import java.util.List;
38
Cassie22b69172018-03-05 14:28:22 -080039/**
40 * Add static Utility functions to get information from the CellInfo object.
41 * TODO: Modify {@link CellInfo} for simplify those functions
42 */
43public final class CellInfoUtil {
44 private static final String TAG = "NetworkSelectSetting";
45
46 private CellInfoUtil() {
47 }
48
49 /**
50 * Get the network type from a CellInfo. Network types include
51 * {@link TelephonyManager#NETWORK_TYPE_LTE}, {@link TelephonyManager#NETWORK_TYPE_UMTS},
52 * {@link TelephonyManager#NETWORK_TYPE_GSM}, {@link TelephonyManager#NETWORK_TYPE_CDMA} and
53 * {@link TelephonyManager#NETWORK_TYPE_UNKNOWN}
54 * @return network types
55 */
56 public static int getNetworkType(CellInfo cellInfo) {
57 if (cellInfo instanceof CellInfoLte) {
58 return TelephonyManager.NETWORK_TYPE_LTE;
59 } else if (cellInfo instanceof CellInfoWcdma) {
60 return TelephonyManager.NETWORK_TYPE_UMTS;
61 } else if (cellInfo instanceof CellInfoGsm) {
62 return TelephonyManager.NETWORK_TYPE_GSM;
63 } else if (cellInfo instanceof CellInfoCdma) {
64 return TelephonyManager.NETWORK_TYPE_CDMA;
65 } else {
66 Log.e(TAG, "Invalid CellInfo type");
67 return TelephonyManager.NETWORK_TYPE_UNKNOWN;
68 }
69 }
70
71 /**
72 * Get signal level as an int from 0..4.
73 * @return Signal strength level
74 */
75 public static int getLevel(CellInfo cellInfo) {
76 if (cellInfo instanceof CellInfoLte) {
77 return ((CellInfoLte) cellInfo).getCellSignalStrength().getLevel();
78 } else if (cellInfo instanceof CellInfoWcdma) {
79 return ((CellInfoWcdma) cellInfo).getCellSignalStrength().getLevel();
80 } else if (cellInfo instanceof CellInfoGsm) {
81 return ((CellInfoGsm) cellInfo).getCellSignalStrength().getLevel();
82 } else if (cellInfo instanceof CellInfoCdma) {
83 return ((CellInfoCdma) cellInfo).getCellSignalStrength().getLevel();
84 } else {
85 Log.e(TAG, "Invalid CellInfo type");
86 return 0;
87 }
88 }
89
90 /**
91 * Wrap a CellIdentity into a CellInfo.
92 */
93 public static CellInfo wrapCellInfoWithCellIdentity(CellIdentity cellIdentity) {
94 if (cellIdentity instanceof CellIdentityLte) {
95 CellInfoLte cellInfo = new CellInfoLte();
96 cellInfo.setCellIdentity((CellIdentityLte) cellIdentity);
97 return cellInfo;
98 } else if (cellIdentity instanceof CellIdentityCdma) {
99 CellInfoCdma cellInfo = new CellInfoCdma();
100 cellInfo.setCellIdentity((CellIdentityCdma) cellIdentity);
101 return cellInfo;
102 } else if (cellIdentity instanceof CellIdentityWcdma) {
103 CellInfoWcdma cellInfo = new CellInfoWcdma();
104 cellInfo.setCellIdentity((CellIdentityWcdma) cellIdentity);
105 return cellInfo;
106 } else if (cellIdentity instanceof CellIdentityGsm) {
107 CellInfoGsm cellInfo = new CellInfoGsm();
108 cellInfo.setCellIdentity((CellIdentityGsm) cellIdentity);
109 return cellInfo;
110 } else {
111 Log.e(TAG, "Invalid CellInfo type");
112 return null;
113 }
114 }
115
116 /**
117 * Returns the title of the network obtained in the manual search.
118 *
119 * @param cellInfo contains the information of the network.
120 * @return Long Name if not null/empty, otherwise Short Name if not null/empty,
121 * else MCCMNC string.
122 */
123 public static String getNetworkTitle(CellInfo cellInfo) {
124 OperatorInfo oi = getOperatorInfoFromCellInfo(cellInfo);
125
126 if (!TextUtils.isEmpty(oi.getOperatorAlphaLong())) {
127 return oi.getOperatorAlphaLong();
128 } else if (!TextUtils.isEmpty(oi.getOperatorAlphaShort())) {
129 return oi.getOperatorAlphaShort();
130 } else {
131 BidiFormatter bidiFormatter = BidiFormatter.getInstance();
132 return bidiFormatter.unicodeWrap(oi.getOperatorNumeric(), TextDirectionHeuristics.LTR);
133 }
134 }
135
136 /**
137 * Wrap a cell info into an operator info.
138 */
139 public static OperatorInfo getOperatorInfoFromCellInfo(CellInfo cellInfo) {
140 OperatorInfo oi;
141 if (cellInfo instanceof CellInfoLte) {
142 CellInfoLte lte = (CellInfoLte) cellInfo;
143 oi = new OperatorInfo(
144 (String) lte.getCellIdentity().getOperatorAlphaLong(),
145 (String) lte.getCellIdentity().getOperatorAlphaShort(),
146 lte.getCellIdentity().getMobileNetworkOperator());
147 } else if (cellInfo instanceof CellInfoWcdma) {
148 CellInfoWcdma wcdma = (CellInfoWcdma) cellInfo;
149 oi = new OperatorInfo(
150 (String) wcdma.getCellIdentity().getOperatorAlphaLong(),
151 (String) wcdma.getCellIdentity().getOperatorAlphaShort(),
152 wcdma.getCellIdentity().getMobileNetworkOperator());
153 } else if (cellInfo instanceof CellInfoGsm) {
154 CellInfoGsm gsm = (CellInfoGsm) cellInfo;
155 oi = new OperatorInfo(
156 (String) gsm.getCellIdentity().getOperatorAlphaLong(),
157 (String) gsm.getCellIdentity().getOperatorAlphaShort(),
158 gsm.getCellIdentity().getMobileNetworkOperator());
159 } else if (cellInfo instanceof CellInfoCdma) {
160 CellInfoCdma cdma = (CellInfoCdma) cellInfo;
161 oi = new OperatorInfo(
162 (String) cdma.getCellIdentity().getOperatorAlphaLong(),
163 (String) cdma.getCellIdentity().getOperatorAlphaShort(),
164 "" /* operator numeric */);
165 } else {
166 Log.e(TAG, "Invalid CellInfo type");
167 oi = new OperatorInfo("", "", "");
168 }
169 return oi;
170 }
Cassiee2de67e2018-05-25 11:00:20 -0700171
172 /** Checks whether the network operator is forbidden. */
173 public static boolean isForbidden(CellInfo cellInfo, List<String> forbiddenPlmns) {
174 String plmn = CellInfoUtil.getOperatorInfoFromCellInfo(cellInfo).getOperatorNumeric();
175 return forbiddenPlmns != null && forbiddenPlmns.contains(plmn);
176 }
Cassie22b69172018-03-05 14:28:22 -0800177}