aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlaia Segovia <olaia.segovia@bq.com>2017-03-16 08:40:30 +0100
committerLuca Stefani <luca.stefani.ge1@gmail.com>2019-11-02 19:04:25 +0100
commitf4e2968123b331000a4bfb21661aec4e2b4664cf (patch)
tree1546b881c5ba118c21d28fd6031d2e0b0fb5100e
parent3d25e8b3f777d53da8ad92bd0dc97b1d24747b77 (diff)
downloadlineage-sdk-f4e2968123b331000a4bfb21661aec4e2b4664cf.tar.gz
lineage-sdk-f4e2968123b331000a4bfb21661aec4e2b4664cf.tar.bz2
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
-rw-r--r--sdk/src/java/org/lineageos/internal/phone/SensitivePhoneNumber.java90
-rw-r--r--sdk/src/java/org/lineageos/internal/phone/SensitivePhoneNumbers.java118
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;
+ }
+}