2021-10-16 14:05:45 -04:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2021-06-14 16:43:04 -04:00
|
|
|
From: Mattias Nilsson <mattias.nilsson@sony.com>
|
|
|
|
Date: Fri, 13 Nov 2020 22:30:08 +0100
|
|
|
|
Subject: [PATCH] Mcc and mnc from xml in RRO may be integers
|
|
|
|
|
|
|
|
Mcc and mnc in an xml from overlays built in current android build
|
|
|
|
system are integers to the contrary of the apns-full-conf.xml
|
|
|
|
where they are strings. The telephony provider uses the same parsing
|
|
|
|
mechanism in both cases which makes the full apn list get
|
|
|
|
correct values whereas the provider misjudge what it should
|
|
|
|
insert in the database when there is an apns.xml in an overlay.
|
|
|
|
|
|
|
|
For the newly built android RROs mnc="01" becomes mnc="1" and no
|
|
|
|
match is found when the sim card is inserted.
|
|
|
|
|
|
|
|
To not risk the large APN list we only change the behavior for the
|
|
|
|
overlay handling.
|
|
|
|
|
|
|
|
Solution is to format the mcc value to have 3 digits and use the
|
|
|
|
carrier id table to get correct mnc. Sim cards missing
|
|
|
|
in the carrier id table need to be added there.
|
|
|
|
|
|
|
|
Test: Manual
|
|
|
|
Test: adb shell content query --uri content://telephony/carriers
|
|
|
|
Bug: 175620622
|
|
|
|
Change-Id: I244ad0f76f360a0635343187e455b54c90ec45b4
|
|
|
|
---
|
|
|
|
.../telephony/TelephonyProvider.java | 35 ++++++++++++-------
|
|
|
|
1 file changed, 23 insertions(+), 12 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
|
2021-06-15 21:04:37 -04:00
|
|
|
index 3cb4abeb..b1b3146d 100644
|
2021-06-14 16:43:04 -04:00
|
|
|
--- a/src/com/android/providers/telephony/TelephonyProvider.java
|
|
|
|
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
|
2021-10-16 14:05:45 -04:00
|
|
|
@@ -128,6 +128,7 @@ import java.io.FileNotFoundException;
|
2021-06-14 16:43:04 -04:00
|
|
|
import java.io.FileReader;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.InputStream;
|
|
|
|
+import java.lang.Integer;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
2021-10-16 14:05:45 -04:00
|
|
|
@@ -752,7 +753,7 @@ public class TelephonyProvider extends ContentProvider
|
2021-06-14 16:43:04 -04:00
|
|
|
try {
|
|
|
|
XmlUtils.beginDocument(parser, "apns");
|
|
|
|
publicversion = Integer.parseInt(parser.getAttributeValue(null, "version"));
|
|
|
|
- loadApns(db, parser);
|
|
|
|
+ loadApns(db, parser, true);
|
|
|
|
} catch (Exception e) {
|
|
|
|
loge("Got exception while loading APN database." + e);
|
|
|
|
} finally {
|
2021-10-16 14:05:45 -04:00
|
|
|
@@ -782,7 +783,7 @@ public class TelephonyProvider extends ContentProvider
|
2021-06-14 16:43:04 -04:00
|
|
|
+ confFile.getAbsolutePath());
|
|
|
|
}
|
|
|
|
|
|
|
|
- loadApns(db, confparser);
|
|
|
|
+ loadApns(db, confparser, false);
|
|
|
|
} catch (FileNotFoundException e) {
|
|
|
|
// It's ok if the file isn't found. It means there isn't a confidential file
|
|
|
|
// Log.e(TAG, "File not found: '" + confFile.getAbsolutePath() + "'");
|
2021-10-16 14:05:45 -04:00
|
|
|
@@ -1665,7 +1666,7 @@ public class TelephonyProvider extends ContentProvider
|
2021-06-14 16:43:04 -04:00
|
|
|
try {
|
|
|
|
XmlUtils.nextElement(parser);
|
|
|
|
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
|
|
|
|
- ContentValues row = getRow(parser);
|
|
|
|
+ ContentValues row = getRow(parser, false);
|
|
|
|
if (row == null) {
|
|
|
|
throw new XmlPullParserException("Expected 'apn' tag", parser, null);
|
|
|
|
}
|
2021-10-16 14:05:45 -04:00
|
|
|
@@ -2072,9 +2073,10 @@ public class TelephonyProvider extends ContentProvider
|
2021-06-14 16:43:04 -04:00
|
|
|
* Gets the next row of apn values.
|
|
|
|
*
|
|
|
|
* @param parser the parser
|
|
|
|
+ * @param isOverlay If the xml file comes from an overlay MCC/MNC are treated as integers
|
|
|
|
* @return the row or null if it's not an apn
|
|
|
|
*/
|
|
|
|
- private ContentValues getRow(XmlPullParser parser) {
|
|
|
|
+ private ContentValues getRow(XmlPullParser parser, boolean isOverlay) {
|
|
|
|
if (!"apn".equals(parser.getName())) {
|
|
|
|
return null;
|
|
|
|
}
|
2021-10-16 14:05:45 -04:00
|
|
|
@@ -2083,11 +2085,21 @@ public class TelephonyProvider extends ContentProvider
|
2021-06-14 16:43:04 -04:00
|
|
|
|
|
|
|
String mcc = parser.getAttributeValue(null, "mcc");
|
|
|
|
String mnc = parser.getAttributeValue(null, "mnc");
|
|
|
|
- String numeric = mcc + mnc;
|
|
|
|
-
|
|
|
|
+ String mccString = mcc;
|
|
|
|
+ String mncString = mnc;
|
|
|
|
+ // Since an mnc can have both two and three digits and it is hard to verify
|
|
|
|
+ // all OEM's Global APN lists we only do this for overlays.
|
|
|
|
+ if (isOverlay) {
|
|
|
|
+ mccString = String.format("%03d", Integer.parseInt(mcc));
|
|
|
|
+ // Looks up a two digit mnc in the carrier id DB
|
|
|
|
+ // if not found a three digit mnc value is chosen
|
|
|
|
+ mncString = getBestStringMnc(mContext, mccString, Integer.parseInt(mnc));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String numeric = mccString + mncString;
|
|
|
|
map.put(NUMERIC, numeric);
|
|
|
|
- map.put(MCC, mcc);
|
|
|
|
- map.put(MNC, mnc);
|
|
|
|
+ map.put(MCC, mccString);
|
|
|
|
+ map.put(MNC, mncString);
|
|
|
|
map.put(NAME, parser.getAttributeValue(null, "carrier"));
|
|
|
|
|
|
|
|
// do not add NULL to the map so that default values can be inserted in db
|
2021-10-16 14:05:45 -04:00
|
|
|
@@ -2156,7 +2168,6 @@ public class TelephonyProvider extends ContentProvider
|
2021-06-14 16:43:04 -04:00
|
|
|
map.put(MVNO_MATCH_DATA, mvno_match_data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
-
|
|
|
|
return map;
|
|
|
|
}
|
|
|
|
|
2021-10-16 14:05:45 -04:00
|
|
|
@@ -2189,15 +2200,15 @@ public class TelephonyProvider extends ContentProvider
|
2021-06-14 16:43:04 -04:00
|
|
|
*
|
|
|
|
* @param db the sqlite database to write to
|
|
|
|
* @param parser the xml parser
|
|
|
|
- *
|
|
|
|
+ * @param isOverlay, if we are parsing an xml in an overlay
|
|
|
|
*/
|
|
|
|
- private void loadApns(SQLiteDatabase db, XmlPullParser parser) {
|
|
|
|
+ private void loadApns(SQLiteDatabase db, XmlPullParser parser, boolean isOverlay) {
|
|
|
|
if (parser != null) {
|
|
|
|
try {
|
|
|
|
db.beginTransaction();
|
|
|
|
XmlUtils.nextElement(parser);
|
|
|
|
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
|
|
|
|
- ContentValues row = getRow(parser);
|
|
|
|
+ ContentValues row = getRow(parser, isOverlay);
|
|
|
|
if (row == null) {
|
|
|
|
throw new XmlPullParserException("Expected 'apn' tag", parser, null);
|
|
|
|
}
|