Compare commits
No commits in common. "aosp16" and "aosp15" have entirely different histories.
7 changed files with 0 additions and 272 deletions
|
@ -1,19 +0,0 @@
|
|||
//
|
||||
// SPDX-FileCopyrightText: 2019 The LineageOS Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
|
||||
lineage_sdk_lib_src = "src/java/org/lineageos/lib/"
|
||||
|
||||
java_library {
|
||||
name: "org.lineageos.lib.phone",
|
||||
sdk_version: "current",
|
||||
static_libs: [
|
||||
"libphonenumber",
|
||||
],
|
||||
|
||||
srcs: [
|
||||
lineage_sdk_lib_src + "/phone/*.java",
|
||||
":spn-info",
|
||||
],
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ 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.
|
||||
-->
|
||||
<xs:schema version="2.0"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
|
||||
<xs:element name="sensitivePNS">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="sensitivePN" maxOccurs="unbounded" type="sensitivePN" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:complexType name="sensitivePN">
|
||||
<xs:sequence>
|
||||
<xs:element name="item" maxOccurs="unbounded" type="item" />
|
||||
</xs:sequence>
|
||||
<xs:attribute name="network" type="xs:string" use="required" />
|
||||
</xs:complexType>
|
||||
|
||||
<xs:complexType name="item">
|
||||
<xs:sequence>
|
||||
<xs:element name="number" type="xs:string" />
|
||||
<xs:element name="name" minOccurs="0" type="xs:string" />
|
||||
<xs:element name="categories" minOccurs="0" type="xs:string" />
|
||||
<xs:element name="languages" minOccurs="0" type="xs:string" />
|
||||
<xs:element name="organization" minOccurs="0" type="xs:string" />
|
||||
<xs:element name="website" minOccurs="0" type="xs:anyURI" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
|
@ -1,40 +0,0 @@
|
|||
// Signature format: 2.0
|
||||
package org.lineageos.lib.phone.spn {
|
||||
|
||||
public class Item {
|
||||
ctor public Item();
|
||||
method public String getCategories();
|
||||
method public String getLanguages();
|
||||
method public String getName();
|
||||
method public String getNumber();
|
||||
method public String getOrganization();
|
||||
method public String getWebsite();
|
||||
method public void setCategories(String);
|
||||
method public void setLanguages(String);
|
||||
method public void setName(String);
|
||||
method public void setNumber(String);
|
||||
method public void setOrganization(String);
|
||||
method public void setWebsite(String);
|
||||
}
|
||||
|
||||
public class SensitivePN {
|
||||
ctor public SensitivePN();
|
||||
method public java.util.List<org.lineageos.lib.phone.spn.Item> getItem();
|
||||
method public String getNetwork();
|
||||
method public void setNetwork(String);
|
||||
}
|
||||
|
||||
public class SensitivePNS {
|
||||
ctor public SensitivePNS();
|
||||
method public java.util.List<org.lineageos.lib.phone.spn.SensitivePN> getSensitivePN();
|
||||
}
|
||||
|
||||
public class XmlParser {
|
||||
ctor public XmlParser();
|
||||
method public static org.lineageos.lib.phone.spn.SensitivePNS read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
|
||||
method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
|
||||
method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
// Signature format: 2.0
|
|
@ -1,165 +0,0 @@
|
|||
/*
|
||||
* SPDX-FileCopyrightText: 2017 The Android Open Source Project
|
||||
* SPDX-FileCopyrightText: 2017-2021 The LineageOS Project
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package org.lineageos.lib.phone;
|
||||
|
||||
import android.content.Context;
|
||||
import android.telephony.PhoneNumberUtils;
|
||||
import android.telephony.SubscriptionInfo;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.google.i18n.phonenumbers.NumberParseException;
|
||||
import com.google.i18n.phonenumbers.PhoneNumberUtil;
|
||||
import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
|
||||
import com.google.i18n.phonenumbers.Phonenumber;
|
||||
|
||||
import org.lineageos.lib.phone.spn.Item;
|
||||
import org.lineageos.lib.phone.spn.SensitivePN;
|
||||
import org.lineageos.lib.phone.spn.XmlParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.datatype.DatatypeConfigurationException;
|
||||
|
||||
public class SensitivePhoneNumbers {
|
||||
private final String LOG_TAG = this.getClass().getSimpleName();
|
||||
|
||||
public static final String SENSIBLE_PHONENUMBERS_FILE_PATH = "/product/etc/sensitive_pn.xml";
|
||||
private static final String ns = null;
|
||||
|
||||
private static SensitivePhoneNumbers sInstance = null;
|
||||
private static boolean sNumbersLoaded;
|
||||
|
||||
private HashMap<String, ArrayList<Item>> mSensitiveNumbersMap = new HashMap<>();
|
||||
|
||||
private SensitivePhoneNumbers() { }
|
||||
|
||||
public static SensitivePhoneNumbers getInstance() {
|
||||
if (sInstance == null) {
|
||||
sInstance = new SensitivePhoneNumbers();
|
||||
}
|
||||
return sInstance;
|
||||
}
|
||||
|
||||
private void loadSensiblePhoneNumbers() {
|
||||
if (sNumbersLoaded) {
|
||||
return;
|
||||
}
|
||||
|
||||
File sensiblePNFile = new File(SENSIBLE_PHONENUMBERS_FILE_PATH);
|
||||
FileInputStream sensiblePNInputStream;
|
||||
|
||||
try {
|
||||
sensiblePNInputStream = new FileInputStream(sensiblePNFile);
|
||||
} catch (FileNotFoundException e) {
|
||||
Log.w(LOG_TAG, "Can not open " + sensiblePNFile.getAbsolutePath());
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
for (SensitivePN sensitivePN : new XmlParser().read(sensiblePNInputStream).getSensitivePN()) {
|
||||
String[] mccs = sensitivePN.getNetwork().split(",");
|
||||
for (String mcc : mccs) {
|
||||
mSensitiveNumbersMap.put(mcc, new ArrayList(sensitivePN.getItem()));
|
||||
}
|
||||
}
|
||||
} catch (DatatypeConfigurationException | IOException | XmlPullParserException e) {
|
||||
Log.w(LOG_TAG, "Exception in spn-conf parser", e);
|
||||
}
|
||||
|
||||
sNumbersLoaded = true;
|
||||
}
|
||||
|
||||
public ArrayList<Item> getSensitivePnInfosForMcc(String mcc) {
|
||||
loadSensiblePhoneNumbers();
|
||||
return mSensitiveNumbersMap.getOrDefault(mcc, new ArrayList<Item>());
|
||||
}
|
||||
|
||||
public boolean isSensitiveNumber(Context context, String numberToCheck, int subId) {
|
||||
String nationalNumber = formatNumberToNational(context, numberToCheck);
|
||||
if (TextUtils.isEmpty(nationalNumber)) {
|
||||
return false;
|
||||
}
|
||||
loadSensiblePhoneNumbers();
|
||||
|
||||
SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class);
|
||||
List<SubscriptionInfo> list = subManager.getActiveSubscriptionInfoList();
|
||||
if (list != null) {
|
||||
// Test all subscriptions so an accidential use of a wrong sim also hides the number
|
||||
for (SubscriptionInfo subInfo : list) {
|
||||
String mcc = String.valueOf(subInfo.getMcc());
|
||||
if (isSensitiveNumber(nationalNumber, mcc)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fall back to check with the passed subId
|
||||
TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
|
||||
if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
|
||||
subId = SubscriptionManager.getDefaultSubscriptionId();
|
||||
}
|
||||
telephonyManager = telephonyManager.createForSubscriptionId(subId);
|
||||
String networkUsed = telephonyManager.getNetworkOperator();
|
||||
if (!TextUtils.isEmpty(networkUsed)) {
|
||||
String networkMCC = networkUsed.substring(0, 3);
|
||||
if (isSensitiveNumber(nationalNumber, networkMCC)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Also try the sim's operator
|
||||
if (telephonyManager.getSimState() == TelephonyManager.SIM_STATE_READY) {
|
||||
String simOperator = telephonyManager.getSimOperator();
|
||||
if (!TextUtils.isEmpty(simOperator)) {
|
||||
String networkMCC = simOperator.substring(0, 3);
|
||||
if (isSensitiveNumber(nationalNumber, networkMCC)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean isSensitiveNumber(String numberToCheck, String mcc) {
|
||||
if (mSensitiveNumbersMap.containsKey(mcc)) {
|
||||
for (Item item : mSensitiveNumbersMap.get(mcc)) {
|
||||
if (PhoneNumberUtils.compare(numberToCheck, item.getNumber())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private String formatNumberToNational(Context context, String number) {
|
||||
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
|
||||
String countryIso = context.getResources().getConfiguration().locale.getCountry();
|
||||
|
||||
Phonenumber.PhoneNumber pn = null;
|
||||
try {
|
||||
pn = util.parse(number, countryIso);
|
||||
} catch (NumberParseException e) {
|
||||
}
|
||||
|
||||
if (pn != null) {
|
||||
return util.format(pn, PhoneNumberFormat.NATIONAL);
|
||||
} else {
|
||||
return number;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue