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
This commit is contained in:
Olaia Segovia
2017-03-16 08:40:30 +01:00
committed by Luca Stefani
parent 3d25e8b3f7
commit f4e2968123
2 changed files with 208 additions and 0 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
}