diff options
author | Olaia Segovia <olaia.segovia@bq.com> | 2017-03-16 08:40:30 +0100 |
---|---|---|
committer | Luca Stefani <luca.stefani.ge1@gmail.com> | 2019-11-02 19:04:25 +0100 |
commit | f4e2968123b331000a4bfb21661aec4e2b4664cf (patch) | |
tree | 1546b881c5ba118c21d28fd6031d2e0b0fb5100e /sdk/src/java/org/lineageos | |
parent | 3d25e8b3f777d53da8ad92bd0dc97b1d24747b77 (diff) | |
download | android_lineage-sdk-f4e2968123b331000a4bfb21661aec4e2b4664cf.tar.gz android_lineage-sdk-f4e2968123b331000a4bfb21661aec4e2b4664cf.tar.bz2 android_lineage-sdk-f4e2968123b331000a4bfb21661aec4e2b4664cf.zip |
sdk: Import SensitivePhoneNumbers
* In order to access the classes in Dialer, we need to expose them
This was extracted from the original implementation in Telecom
Author: Olaia Segovia <olaia.segovia@bq.com>
Date: Thu Mar 16 08:40:30 2017 +0100
(1/2) Make sensitive phone numbers not to be shown in call log history.
Considering sensitive phone numbers to be, hotlines dealing with
violence against women.
In the EU, these numbers do not show up in the phone bill.
In order to avoid these phone numbers to be listed in the Call Log, we
have implemented a new XML file which is parsed with phone numbers
from different countries to be filtered. This file needs to be copied to
device via desired Android.mk file in order to be able to process it.
The comparison is made checking the network MCC the SIM is connected to
in order to consider roaming and multisim scenarios.
Test: CallLogManagerTest.testDontLogCallsToSensitivePhoneNumber PASS
Change-Id: I4a59ff0577942ce56924f1a434ae0a3a38eacc62
Signed-off-by: Olaia Segovia <olaia.segovia@bq.com>
Author: Paul Keith <javelinanddart@gmail.com>
Date: Thu Jun 22 19:40:56 2017 +0200
SensitivePhoneNumbers: Handle lists of MCC codes
* Some countries have multiple MCC codes, so handle it
* In the sensitivePN network field, enter the list of
MCCs like so: https://review.lineageos.org/178233
Change-Id: I34225473404b2be2640ea9ab05691dc985c49fa0
Author: Paul Keith <javelinanddart@gmail.com>
Date: Thu Jul 6 16:12:12 2017 -0500
SensitivePhoneNumbers: Fix number comparison
* Currently, we just compare the strings for equality,
which results in incorrect detection of sensitive nums
a lot of the time, because adding (or removing) the
country code is enough to make the detection fail,
meaning the call to that phone number is logged
* Use Android's PhoneNumberUtils comparison method to
fix this, since it takes these factors into account
Change-Id: I26ac180f8a6552cf87a4bada1d370f0ebb884ee1
Author: Michael W <baddaemon87@gmail.com>
AuthorDate: 2019-09-07 18:34:57 +0200
CallLog: Fix improper call to SensitivePhoneNumbers
* isSensitiveNumber expects a subId to be passed, but with the current
implementation gets a PhoneAccountHandle
* Actually pass the subId and make the call use an int, while on it
* Fall back to the default subId only when we get an
INVALID_SUBSCRIPTION_ID
Change-Id: Id6d64f2c9f76d94d1b4d9851317ea2cc7e07323b
Change-Id: I241c1652105b82d1d15549332cb6e274d7c726ce
Diffstat (limited to 'sdk/src/java/org/lineageos')
-rw-r--r-- | sdk/src/java/org/lineageos/internal/phone/SensitivePhoneNumber.java | 90 | ||||
-rw-r--r-- | sdk/src/java/org/lineageos/internal/phone/SensitivePhoneNumbers.java | 118 |
2 files changed, 208 insertions, 0 deletions
diff --git a/sdk/src/java/org/lineageos/internal/phone/SensitivePhoneNumber.java b/sdk/src/java/org/lineageos/internal/phone/SensitivePhoneNumber.java new file mode 100644 index 00000000..ca27a579 --- /dev/null +++ b/sdk/src/java/org/lineageos/internal/phone/SensitivePhoneNumber.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * Copyright (C) 2017-2019 The LineageOS 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 org.lineageos.internal.phone; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.util.ArrayList; + +public class SensitivePhoneNumber { + private static final String LOG_TAG = "SensitivePhoneNumber"; + private static final String ns = null; + + private String networkNumeric; + private ArrayList<String> phoneNumbers; + + public SensitivePhoneNumber(String networkNumeric, ArrayList<String> phoneNumbers) { + this.networkNumeric = networkNumeric; + this.phoneNumbers = phoneNumbers; + } + + public String getNetworkNumeric() { + return networkNumeric; + } + + public ArrayList<String> getPhoneNumbers() { + return phoneNumbers; + } + + public void setNetworkNumeric(String networkNumeric) { + this.networkNumeric = networkNumeric; + } + + public void setPhoneNumbers(ArrayList<String> phoneNumbers) { + this.phoneNumbers = phoneNumbers; + } + + public void addPhoneNumber(String phoneNumber) { + this.phoneNumbers.add(phoneNumber); + } + + public static SensitivePhoneNumber readSensitivePhoneNumbers (XmlPullParser parser) + throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, ns, "sensitivePN"); + + String numeric = parser.getAttributeValue(null, "network"); + + ArrayList<String> numbers = null; + numbers = readPhoneNumber(parser); + + return new SensitivePhoneNumber(numeric, numbers); + } + + private static ArrayList<String> readPhoneNumber (XmlPullParser parser) + throws XmlPullParserException, IOException { + ArrayList<String> numbers = new ArrayList<>(); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + parser.require(XmlPullParser.START_TAG, ns, "item"); + + String item = ""; + if (parser.next() == XmlPullParser.TEXT) { + item = parser.getText(); + parser.nextTag(); + } + parser.require(XmlPullParser.END_TAG, ns, "item"); + + numbers.add(item); + } + return numbers; + } +} diff --git a/sdk/src/java/org/lineageos/internal/phone/SensitivePhoneNumbers.java b/sdk/src/java/org/lineageos/internal/phone/SensitivePhoneNumbers.java new file mode 100644 index 00000000..b5a00dc5 --- /dev/null +++ b/sdk/src/java/org/lineageos/internal/phone/SensitivePhoneNumbers.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * Copyright (C) 2017-2019 The LineageOS 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 org.lineageos.internal.phone; + +import android.content.Context; +import android.os.Environment; +import android.telephony.PhoneNumberUtils; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.util.Log; +import android.util.Xml; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; + +public class SensitivePhoneNumbers { + private final String LOG_TAG = this.getClass().getSimpleName(); + + public static final String SENSIBLE_PHONENUMBERS_FILE_PATH = "etc/sensitive_pn.xml"; + private static final String ns = null; + + private HashMap<String, ArrayList<String>> mSensitiveNumbersMap = new HashMap<>(); + + public SensitivePhoneNumbers() { + loadSensiblePhoneNumbers(); + } + + private void loadSensiblePhoneNumbers() { + FileReader sensiblePNReader; + + File sensiblePNFile = new File(Environment.getRootDirectory(), + SENSIBLE_PHONENUMBERS_FILE_PATH); + + try { + sensiblePNReader = new FileReader(sensiblePNFile); + } catch (FileNotFoundException e) { + Log.w(LOG_TAG, "Can not open " + sensiblePNFile.getAbsolutePath()); + return; + } + + try { + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(sensiblePNReader); + parser.nextTag(); + + readSensitivePNS(parser); + + sensiblePNReader.close(); + } catch (IOException | XmlPullParserException e) { + Log.w(LOG_TAG, "Exception in spn-conf parser", e); + } + } + + private void readSensitivePNS(XmlPullParser parser) + throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, ns, "sensitivePNS"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + if (!"sensitivePN".equals(name)) { + break; + } + SensitivePhoneNumber sensitivePN = SensitivePhoneNumber + .readSensitivePhoneNumbers(parser); + String[] mccs = sensitivePN.getNetworkNumeric().split(","); + ArrayList<String> sensitive_nums = sensitivePN.getPhoneNumbers(); + for (String mcc : mccs) { + mSensitiveNumbersMap.put(mcc, sensitive_nums); + } + } + } + + public boolean isSensitiveNumber(Context context, String numberToCheck, int subId) { + TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class); + + if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + subId = SubscriptionManager.getDefaultSubscriptionId(); + } + + String networkUsed = telephonyManager.getNetworkOperator(subId); + if (!TextUtils.isEmpty(networkUsed)) { + String networkMCC = networkUsed.substring(0, 3); + if (mSensitiveNumbersMap.containsKey(networkMCC)) { + for (String num : mSensitiveNumbersMap.get(networkMCC)) { + if (PhoneNumberUtils.compare(numberToCheck, num)) { + return true; + } + } + } + } + return false; + } +} |