Snap for 10453563 from 7aa49b99213f1c50d3cd97837cf72b35280fdef4 to mainline-os-statsd-release
Change-Id: I6da90b5466ba08e6a0ed837197522a6147eee151
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7eb3721
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.iml
+*.idea
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6633d14..891e36f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -41,6 +41,8 @@
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<!-- Allows accessing the messages on ICC -->
<uses-permission android:name="android.permission.ACCESS_MESSAGES_ON_ICC" />
+ <!-- Needed to query user associated with a subscription. -->
+ <uses-permission android:name="android.permission.MANAGE_SUBSCRIPTION_USER_ASSOCIATION"/>
<application android:process="com.android.phone"
android:allowClearUserData="false"
@@ -124,6 +126,13 @@
android:singleUser="true"
android:multiprocess="false" />
+ <provider android:name="SatelliteProvider"
+ android:authorities="satellite"
+ android:exported="false"
+ android:singleUser="true"
+ android:multiprocess="false"
+ android:writePermission="android.permission.MODIFY_PHONE_STATE" />
+
<service
android:name=".TelephonyBackupAgent$DeferredSmsMmsRestoreService"
android:exported="false" />
diff --git a/assets/latest_carrier_id/carrier_list.pb b/assets/latest_carrier_id/carrier_list.pb
index 7c46449..b1b0112 100644
--- a/assets/latest_carrier_id/carrier_list.pb
+++ b/assets/latest_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/latest_carrier_id/carrier_list.textpb b/assets/latest_carrier_id/carrier_list.textpb
index 5b521f2..63173d9 100644
--- a/assets/latest_carrier_id/carrier_list.textpb
+++ b/assets/latest_carrier_id/carrier_list.textpb
Binary files differ
diff --git a/assets/sdk28_carrier_id/carrier_list.pb b/assets/sdk28_carrier_id/carrier_list.pb
index ff06545..57258ac 100644
--- a/assets/sdk28_carrier_id/carrier_list.pb
+++ b/assets/sdk28_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/sdk28_carrier_id/carrier_list.textpb b/assets/sdk28_carrier_id/carrier_list.textpb
index 881a66a..eba7e44 100644
--- a/assets/sdk28_carrier_id/carrier_list.textpb
+++ b/assets/sdk28_carrier_id/carrier_list.textpb
Binary files differ
diff --git a/assets/sdk29_carrier_id/carrier_list.pb b/assets/sdk29_carrier_id/carrier_list.pb
index fd32451..83663df 100644
--- a/assets/sdk29_carrier_id/carrier_list.pb
+++ b/assets/sdk29_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/sdk29_carrier_id/carrier_list.textpb b/assets/sdk29_carrier_id/carrier_list.textpb
index 4a2a263..d45c3cf 100644
--- a/assets/sdk29_carrier_id/carrier_list.textpb
+++ b/assets/sdk29_carrier_id/carrier_list.textpb
Binary files differ
diff --git a/assets/sdk30_carrier_id/carrier_list.pb b/assets/sdk30_carrier_id/carrier_list.pb
index be5d8f5..5881668 100644
--- a/assets/sdk30_carrier_id/carrier_list.pb
+++ b/assets/sdk30_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/sdk30_carrier_id/carrier_list.textpb b/assets/sdk30_carrier_id/carrier_list.textpb
index ef71379..f8e185c 100644
--- a/assets/sdk30_carrier_id/carrier_list.textpb
+++ b/assets/sdk30_carrier_id/carrier_list.textpb
Binary files differ
diff --git a/assets/sdk31_carrier_id/carrier_list.pb b/assets/sdk31_carrier_id/carrier_list.pb
index 11e2628..ece4a3c 100644
--- a/assets/sdk31_carrier_id/carrier_list.pb
+++ b/assets/sdk31_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/sdk31_carrier_id/carrier_list.textpb b/assets/sdk31_carrier_id/carrier_list.textpb
index fe1806f..359ebef 100644
--- a/assets/sdk31_carrier_id/carrier_list.textpb
+++ b/assets/sdk31_carrier_id/carrier_list.textpb
Binary files differ
diff --git a/assets/sdk33_carrier_id/carrier_list.pb b/assets/sdk33_carrier_id/carrier_list.pb
new file mode 100644
index 0000000..f537693
--- /dev/null
+++ b/assets/sdk33_carrier_id/carrier_list.pb
Binary files differ
diff --git a/assets/sdk33_carrier_id/carrier_list.textpb b/assets/sdk33_carrier_id/carrier_list.textpb
new file mode 100644
index 0000000..bfb6359
--- /dev/null
+++ b/assets/sdk33_carrier_id/carrier_list.textpb
@@ -0,0 +1,11913 @@
+carrier_id {
+ canonical_id: 1
+ carrier_name: "T-Mobile - US"
+ carrier_attribute {
+ mccmnc_tuple: "310026"
+ mccmnc_tuple: "310160"
+ mccmnc_tuple: "310200"
+ mccmnc_tuple: "310210"
+ mccmnc_tuple: "310220"
+ mccmnc_tuple: "310230"
+ mccmnc_tuple: "310240"
+ mccmnc_tuple: "310250"
+ mccmnc_tuple: "310260"
+ mccmnc_tuple: "31026"
+ mccmnc_tuple: "310270"
+ mccmnc_tuple: "310300"
+ mccmnc_tuple: "310310"
+ mccmnc_tuple: "310490"
+ mccmnc_tuple: "310530"
+ mccmnc_tuple: "310640"
+ mccmnc_tuple: "310660"
+ mccmnc_tuple: "310800"
+ mccmnc_tuple: "311490"
+ mccmnc_tuple: "311660"
+ mccmnc_tuple: "311882"
+ mccmnc_tuple: "312250"
+ }
+}
+carrier_id {
+ canonical_id: 2
+ carrier_name: "EE"
+ carrier_attribute {
+ mccmnc_tuple: "23430"
+ imsi_prefix_xpattern: "2343041"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "23430"
+ gid1: "ee"
+ gid1: "eeff"
+ }
+}
+carrier_id {
+ canonical_id: 3
+ carrier_name: "Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "26201"
+ mccmnc_tuple: "26206"
+ gid1: "01"
+ gid1: "02"
+ gid1: "03"
+ gid1: "04"
+ gid1: "99"
+ gid1: "4B"
+ gid1: "4b"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "26201"
+ mccmnc_tuple: "26206"
+ spn: "Telekom.de"
+ spn: "T-Campus"
+ spn: "T-Mobile D"
+ spn: "Business"
+ spn: "Privat"
+ }
+}
+carrier_id {
+ canonical_id: 4
+ carrier_name: "Magenta Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "23203"
+ gid1: "01"
+ gid1: "31"
+ gid1: "32"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "23207"
+ imsi_prefix_xpattern: "999999"
+ }
+}
+carrier_id {
+ canonical_id: 5
+ carrier_name: "T-Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "20416"
+ gid1: "FF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20416"
+ spn: "T-Mobile NL"
+ }
+}
+carrier_id {
+ canonical_id: 6
+ carrier_name: "T-Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "23001"
+ spn: "T-Mobile CZ"
+ spn: "KAKTUS"
+ spn: "Mobil CZ"
+ spn: "RWE Mobil"
+ spn: "innogy"
+ spn: "PREmobil"
+ }
+}
+carrier_id {
+ canonical_id: 7
+ carrier_name: "T-Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "26002"
+ gid1: "11"
+ gid1: "12"
+ gid1: "16"
+ gid1: "17"
+ gid1: "21"
+ gid1: "22"
+ gid1: "23"
+ gid1: "24"
+ gid1: "26"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "26002"
+ spn: "T-Mobile.pl"
+ spn: "T-Mobile.pl Q"
+ spn: "heyah"
+ spn: "tu biedronka"
+ }
+}
+carrier_id {
+ canonical_id: 8
+ carrier_name: "Magyar Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "21630"
+ spn: "Telekom HU"
+ spn: "T-Mobile H"
+ }
+}
+carrier_id {
+ canonical_id: 9
+ carrier_name: "Hrvatski Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "21901"
+ mccmnc_tuple: "21920"
+ spn: "HT-Campus"
+ spn: "HT HR"
+ spn: "R&D Network"
+ spn: "T-Mobile HR"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21901"
+ mccmnc_tuple: "21920"
+ gid1: "01"
+ gid1: "02"
+ gid1: "03"
+ gid1: "99"
+ gid1: "FF"
+ }
+}
+carrier_id {
+ canonical_id: 11
+ carrier_name: "Slovak Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "23102"
+ spn: "Telekom SK"
+ spn: "Juro.sk"
+ }
+}
+carrier_id {
+ canonical_id: 12
+ carrier_name: "T-Mobile - UA"
+ carrier_attribute {
+ mccmnc_tuple: "25502"
+ }
+}
+carrier_id {
+ canonical_id: 13
+ carrier_name: "Mkedonski Telecom AD Skopje"
+ carrier_attribute {
+ mccmnc_tuple: "29401"
+ spn: "T-Mobile MK"
+ spn: "Telekom.mk"
+ spn: "Telekom MK"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "29401"
+ gid1: "FF"
+ }
+}
+carrier_id {
+ canonical_id: 14
+ carrier_name: "A1"
+ carrier_attribute {
+ mccmnc_tuple: "23201"
+ mccmnc_tuple: "23202"
+ mccmnc_tuple: "23209"
+ mccmnc_tuple: "23211"
+ mccmnc_tuple: "23212"
+ spn: ""
+ }
+}
+carrier_id {
+ canonical_id: 15
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "50503"
+ }
+}
+carrier_id {
+ canonical_id: 16
+ carrier_name: "Swisscom"
+ carrier_attribute {
+ mccmnc_tuple: "22801"
+ spn: "Swisscom"
+ }
+}
+carrier_id {
+ canonical_id: 18
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "20205"
+ spn: "vodafone GR"
+ spn: "CU"
+ spn: "CU-X"
+ }
+}
+carrier_id {
+ canonical_id: 19
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "27201"
+ spn: "vodafone IE"
+ spn: "Vodafone IE"
+ }
+}
+carrier_id {
+ canonical_id: 20
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ imsi_prefix_xpattern: "204040"
+ imsi_prefix_xpattern: "204041"
+ imsi_prefix_xpattern: "204042"
+ imsi_prefix_xpattern: "204044"
+ imsi_prefix_xpattern: "204045"
+ imsi_prefix_xpattern: "204047"
+ imsi_prefix_xpattern: "204048"
+ imsi_prefix_xpattern: "204049"
+ spn: ""
+ spn: "vodafone NL"
+ spn: "Vodafone"
+ }
+}
+carrier_id {
+ canonical_id: 21
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "53001"
+ spn: "vodafone NZ"
+ }
+}
+carrier_id {
+ canonical_id: 22
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "26801"
+ spn: ""
+ spn: "vodafone P"
+ spn: "Vodafone"
+ }
+}
+carrier_id {
+ canonical_id: 23
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "22601"
+ spn: "Vodafone RO"
+ }
+}
+carrier_id {
+ canonical_id: 24
+ carrier_name: "Vodacom"
+ carrier_attribute {
+ mccmnc_tuple: "65501"
+ }
+}
+carrier_id {
+ canonical_id: 25
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "26202"
+ imsi_prefix_xpattern: "262020"
+ imsi_prefix_xpattern: "2620211"
+ imsi_prefix_xpattern: "2620212"
+ imsi_prefix_xpattern: "2620213"
+ imsi_prefix_xpattern: "2620214"
+ imsi_prefix_xpattern: "2620215"
+ imsi_prefix_xpattern: "2620216"
+ imsi_prefix_xpattern: "2620217"
+ imsi_prefix_xpattern: "2620218"
+ imsi_prefix_xpattern: "26202190"
+ imsi_prefix_xpattern: "262021910"
+ imsi_prefix_xpattern: "262021911"
+ imsi_prefix_xpattern: "262021912"
+ imsi_prefix_xpattern: "2620219130"
+ imsi_prefix_xpattern: "2620219131"
+ imsi_prefix_xpattern: "2620219132"
+ imsi_prefix_xpattern: "2620219133"
+ imsi_prefix_xpattern: "2620219134"
+ imsi_prefix_xpattern: "2620219141"
+ imsi_prefix_xpattern: "2620219142"
+ imsi_prefix_xpattern: "2620219143"
+ imsi_prefix_xpattern: "2620219144"
+ imsi_prefix_xpattern: "2620219149"
+ imsi_prefix_xpattern: "262021915"
+ imsi_prefix_xpattern: "262021916"
+ imsi_prefix_xpattern: "262021917"
+ imsi_prefix_xpattern: "262021918"
+ imsi_prefix_xpattern: "262021919"
+ imsi_prefix_xpattern: "26202192"
+ imsi_prefix_xpattern: "26202193"
+ imsi_prefix_xpattern: "26202194"
+ imsi_prefix_xpattern: "26202195"
+ imsi_prefix_xpattern: "26202196"
+ imsi_prefix_xpattern: "26202197"
+ imsi_prefix_xpattern: "26202198"
+ imsi_prefix_xpattern: "26202199"
+ imsi_prefix_xpattern: "262022"
+ imsi_prefix_xpattern: "262023"
+ imsi_prefix_xpattern: "262024"
+ imsi_prefix_xpattern: "262025"
+ imsi_prefix_xpattern: "262026"
+ imsi_prefix_xpattern: "262027"
+ imsi_prefix_xpattern: "262028"
+ imsi_prefix_xpattern: "262029"
+ spn: ""
+ spn: "Vodafone"
+ spn: "Vodafone.de"
+ spn: "vodafone.de"
+ }
+}
+carrier_id {
+ canonical_id: 26
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "21401"
+ spn: ""
+ spn: "vodafone"
+ spn: "vodafone ES"
+ spn: "Vodafone"
+ spn: "Personal"
+ spn: "Profesional"
+ }
+}
+carrier_id {
+ canonical_id: 27
+ carrier_name: "SFR"
+ carrier_attribute {
+ mccmnc_tuple: "20809"
+ mccmnc_tuple: "20810"
+ mccmnc_tuple: "20811"
+ mccmnc_tuple: "20813"
+ }
+}
+carrier_id {
+ canonical_id: 28
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "23415"
+ mccmnc_tuple: "23491"
+ spn: ""
+ spn: "Vodafone"
+ spn: "vodafone UK"
+ }
+}
+carrier_id {
+ canonical_id: 29
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "22210"
+ spn: ""
+ spn: "vodafone IT"
+ spn: "Vodafone"
+ }
+}
+carrier_id {
+ canonical_id: 30
+ carrier_name: "Optus"
+ carrier_attribute {
+ mccmnc_tuple: "50502"
+ mccmnc_tuple: "50590"
+ }
+}
+carrier_id {
+ canonical_id: 31
+ carrier_name: "Singtel"
+ carrier_attribute {
+ mccmnc_tuple: "52501"
+ mccmnc_tuple: "52502"
+ }
+}
+carrier_id {
+ canonical_id: 32
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "20800"
+ mccmnc_tuple: "20801"
+ mccmnc_tuple: "20802"
+ spn: "Orange F"
+ }
+}
+carrier_id {
+ canonical_id: 33
+ carrier_name: "TIM"
+ carrier_attribute {
+ mccmnc_tuple: "22201"
+ }
+}
+carrier_id {
+ canonical_id: 34
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "21405"
+ mccmnc_tuple: "21407"
+ }
+}
+carrier_id {
+ canonical_id: 450
+ carrier_name: "Mobiland"
+ carrier_attribute {
+ mccmnc_tuple: "21303"
+ }
+}
+carrier_id {
+ canonical_id: 451
+ carrier_name: "Etisalat"
+ carrier_attribute {
+ mccmnc_tuple: "42402"
+ }
+}
+carrier_id {
+ canonical_id: 452
+ carrier_name: "AWCC"
+ carrier_attribute {
+ mccmnc_tuple: "41201"
+ }
+}
+carrier_id {
+ canonical_id: 453
+ carrier_name: "Roshan"
+ carrier_attribute {
+ mccmnc_tuple: "41220"
+ }
+}
+carrier_id {
+ canonical_id: 454
+ carrier_name: "New1"
+ carrier_attribute {
+ mccmnc_tuple: "41230"
+ }
+}
+carrier_id {
+ canonical_id: 455
+ carrier_name: "Areeba Afghanistan"
+ carrier_attribute {
+ mccmnc_tuple: "41240"
+ }
+}
+carrier_id {
+ canonical_id: 456
+ carrier_name: "Afghan Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "41288"
+ }
+}
+carrier_id {
+ canonical_id: 457
+ carrier_name: "APUA PCS"
+ carrier_attribute {
+ mccmnc_tuple: "344030"
+ }
+}
+carrier_id {
+ canonical_id: 491
+ carrier_name: "Advanced Communications Technologies Pty. Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "50524"
+ }
+}
+carrier_id {
+ canonical_id: 492
+ carrier_name: "Localstar Holding Pty. Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "50588"
+ }
+}
+carrier_id {
+ canonical_id: 493
+ carrier_name: "Setar GSM"
+ carrier_attribute {
+ mccmnc_tuple: "36301"
+ }
+}
+carrier_id {
+ canonical_id: 495
+ carrier_name: "Bakcell Limited Liabil ity Company"
+ carrier_attribute {
+ mccmnc_tuple: "40002"
+ }
+}
+carrier_id {
+ canonical_id: 529
+ carrier_name: "Claro BR"
+ carrier_attribute {
+ mccmnc_tuple: "72405"
+ mccmnc_tuple: "72438"
+ }
+}
+carrier_id {
+ canonical_id: 530
+ carrier_name: "Vivo"
+ carrier_attribute {
+ mccmnc_tuple: "72406"
+ mccmnc_tuple: "72410"
+ mccmnc_tuple: "72411"
+ mccmnc_tuple: "72423"
+ }
+}
+carrier_id {
+ canonical_id: 532
+ carrier_name: "Maxitel MG"
+ carrier_attribute {
+ mccmnc_tuple: "72408"
+ }
+}
+carrier_id {
+ canonical_id: 533
+ carrier_name: "Telepar Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72409"
+ }
+}
+carrier_id {
+ canonical_id: 536
+ carrier_name: "Americel"
+ carrier_attribute {
+ mccmnc_tuple: "72412"
+ }
+}
+carrier_id {
+ canonical_id: 537
+ carrier_name: "Telesp Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72413"
+ }
+}
+carrier_id {
+ canonical_id: 538
+ carrier_name: "Maxitel BA"
+ carrier_attribute {
+ mccmnc_tuple: "72414"
+ }
+}
+carrier_id {
+ canonical_id: 539
+ carrier_name: "Sercomtel"
+ carrier_attribute {
+ mccmnc_tuple: "72415"
+ }
+}
+carrier_id {
+ canonical_id: 540
+ carrier_name: "Brasil Telecom GSM"
+ carrier_attribute {
+ mccmnc_tuple: "72416"
+ }
+}
+carrier_id {
+ canonical_id: 541
+ carrier_name: "Ceterp Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72417"
+ }
+}
+carrier_id {
+ canonical_id: 542
+ carrier_name: "Datora"
+ carrier_attribute {
+ mccmnc_tuple: "72418"
+ }
+}
+carrier_id {
+ canonical_id: 543
+ carrier_name: "Telemig Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72419"
+ }
+}
+carrier_id {
+ canonical_id: 544
+ carrier_name: "Telerj Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72421"
+ }
+}
+carrier_id {
+ canonical_id: 546
+ carrier_name: "Telebrasilia Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72425"
+ }
+}
+carrier_id {
+ canonical_id: 547
+ carrier_name: "Telegoias Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72427"
+ }
+}
+carrier_id {
+ canonical_id: 548
+ carrier_name: "Telemat Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72429"
+ }
+}
+carrier_id {
+ canonical_id: 562
+ carrier_name: "Teleamapa Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72457"
+ }
+}
+carrier_id {
+ canonical_id: 563
+ carrier_name: "Telaima Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72459"
+ }
+}
+carrier_id {
+ canonical_id: 564
+ carrier_name: "Bhutan Telecom Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "40211"
+ }
+}
+carrier_id {
+ canonical_id: 566
+ carrier_name: "Mascom Wireless (Pty) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "65201"
+ }
+}
+carrier_id {
+ canonical_id: 567
+ carrier_name: "Orange Botswana (Pty) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "65202"
+ }
+}
+carrier_id {
+ canonical_id: 568
+ carrier_name: "A1 BY"
+ carrier_attribute {
+ mccmnc_tuple: "25701"
+ }
+}
+carrier_id {
+ canonical_id: 569
+ carrier_name: "MTS"
+ carrier_attribute {
+ mccmnc_tuple: "25702"
+ }
+}
+carrier_id {
+ canonical_id: 570
+ carrier_name: "Belize Telecommunications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "70267"
+ }
+}
+carrier_id {
+ canonical_id: 571
+ carrier_name: "International Telecommunications Ltd. (INTELCO)"
+ carrier_attribute {
+ mccmnc_tuple: "70268"
+ }
+}
+carrier_id {
+ canonical_id: 572
+ carrier_name: "Clearnet"
+ carrier_attribute {
+ mccmnc_tuple: "30236"
+ }
+}
+carrier_id {
+ canonical_id: 574
+ carrier_name: "Ice Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "30262"
+ }
+}
+carrier_id {
+ canonical_id: 575
+ carrier_name: "Aliant Mobility"
+ carrier_attribute {
+ mccmnc_tuple: "30263"
+ }
+}
+carrier_id {
+ canonical_id: 576
+ carrier_name: "Bell Mobility"
+ carrier_attribute {
+ mccmnc_tuple: "30264"
+ mccmnc_tuple: "302610"
+ mccmnc_tuple: "302630"
+ mccmnc_tuple: "302640"
+ }
+}
+carrier_id {
+ canonical_id: 577
+ carrier_name: "Tbay Mobility"
+ carrier_attribute {
+ mccmnc_tuple: "302656"
+ }
+}
+carrier_id {
+ canonical_id: 578
+ carrier_name: "MTS Mobility"
+ carrier_attribute {
+ mccmnc_tuple: "302660"
+ mccmnc_tuple: "302370"
+ gid1: "2c"
+ gid1: "4d"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "302660"
+ spn: "MTS"
+ }
+}
+carrier_id {
+ canonical_id: 579
+ carrier_name: "CityTel Mobility"
+ carrier_attribute {
+ mccmnc_tuple: "30267"
+ }
+}
+carrier_id {
+ canonical_id: 580
+ carrier_name: "Sask Tel Mobility"
+ carrier_attribute {
+ mccmnc_tuple: "30268"
+ mccmnc_tuple: "302654"
+ mccmnc_tuple: "302680"
+ mccmnc_tuple: "302780"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ gid1: "5a"
+ }
+}
+carrier_id {
+ canonical_id: 581
+ carrier_name: "Globalstar"
+ carrier_attribute {
+ mccmnc_tuple: "30271"
+ }
+}
+carrier_id {
+ canonical_id: 624
+ carrier_name: "Colombia Móvil S.A."
+ carrier_attribute {
+ mccmnc_tuple: "732103"
+ mccmnc_tuple: "732111"
+ }
+}
+carrier_id {
+ canonical_id: 625
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "732123"
+ }
+}
+carrier_id {
+ canonical_id: 626
+ carrier_name: "WOM"
+ carrier_attribute {
+ mccmnc_tuple: "732130"
+ mccmnc_tuple: "732360"
+ }
+}
+carrier_id {
+ canonical_id: 627
+ carrier_name: "KOLBI ICE"
+ carrier_attribute {
+ mccmnc_tuple: "71201"
+ mccmnc_tuple: "71202"
+ }
+}
+carrier_id {
+ canonical_id: 655
+ carrier_name: "Barablu Mobile Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "23807"
+ }
+}
+carrier_id {
+ canonical_id: 656
+ carrier_name: "Telia"
+ carrier_attribute {
+ mccmnc_tuple: "23820"
+ mccmnc_tuple: "23830"
+ }
+}
+carrier_id {
+ canonical_id: 657
+ carrier_name: "Tele2"
+ carrier_attribute {
+ mccmnc_tuple: "23877"
+ }
+}
+carrier_id {
+ canonical_id: 658
+ carrier_name: "Altice Dominicana"
+ carrier_attribute {
+ mccmnc_tuple: "37001"
+ }
+}
+carrier_id {
+ canonical_id: 667
+ carrier_name: "Telia"
+ carrier_attribute {
+ mccmnc_tuple: "24801"
+ }
+}
+carrier_id {
+ canonical_id: 668
+ carrier_name: "Elisa"
+ carrier_attribute {
+ mccmnc_tuple: "24802"
+ }
+}
+carrier_id {
+ canonical_id: 669
+ carrier_name: "Tele2"
+ carrier_attribute {
+ mccmnc_tuple: "24803"
+ }
+}
+carrier_id {
+ canonical_id: 670
+ carrier_name: "OY Top Connect"
+ carrier_attribute {
+ mccmnc_tuple: "24804"
+ }
+}
+carrier_id {
+ canonical_id: 671
+ carrier_name: "AS Bravocom Mobiil"
+ carrier_attribute {
+ mccmnc_tuple: "24805"
+ }
+}
+carrier_id {
+ canonical_id: 672
+ carrier_name: "OY ViaTel"
+ carrier_attribute {
+ mccmnc_tuple: "24806"
+ }
+}
+carrier_id {
+ canonical_id: 673
+ carrier_name: "Televõrgu AS"
+ carrier_attribute {
+ mccmnc_tuple: "24807"
+ }
+}
+carrier_id {
+ canonical_id: 674
+ carrier_name: "Siseministeerium (Ministry of Interior)"
+ carrier_attribute {
+ mccmnc_tuple: "24871"
+ }
+}
+carrier_id {
+ canonical_id: 675
+ carrier_name: "Orange Egypt"
+ carrier_attribute {
+ mccmnc_tuple: "60201"
+ }
+}
+carrier_id {
+ canonical_id: 676
+ carrier_name: "Vodafone Egypt"
+ carrier_attribute {
+ mccmnc_tuple: "60202"
+ spn: "vodafone"
+ }
+}
+carrier_id {
+ canonical_id: 678
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ spn: "Orange"
+ }
+}
+carrier_id {
+ canonical_id: 679
+ carrier_name: "Yoigo"
+ carrier_attribute {
+ mccmnc_tuple: "21404"
+ spn: "Yoigo"
+ spn: "Pepephone"
+ spn: "MASMOVIL"
+ spn: "LLAMAYA"
+ spn: "Guuk"
+ spn: "Cablemovil"
+ spn: "Sweno"
+ spn: "Lebara"
+ spn: "Lycamobile"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21404"
+ imsi_prefix_xpattern: "2140423"
+ spn: "EUSKALTEL"
+ spn: "RACC"
+ spn: "mobilR"
+ spn: "Virgin telco"
+ spn: "telecable"
+ }
+}
+carrier_id {
+ canonical_id: 681
+ carrier_name: "ETH MTN"
+ carrier_attribute {
+ mccmnc_tuple: "63601"
+ }
+}
+carrier_id {
+ canonical_id: 682
+ carrier_name: "Finnet Networks Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "24404"
+ }
+}
+carrier_id {
+ canonical_id: 717
+ carrier_name: "Virgin"
+ carrier_attribute {
+ mccmnc_tuple: "23430"
+ mccmnc_tuple: "23433"
+ mccmnc_tuple: "23438"
+ gid1: "2800000000000000"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20601"
+ gid1: "2800000000000000"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20620"
+ gid1: "2800000000000000"
+ }
+}
+carrier_id {
+ canonical_id: 718
+ carrier_name: "EE"
+ carrier_attribute {
+ mccmnc_tuple: "23431"
+ mccmnc_tuple: "23432"
+ mccmnc_tuple: "23430"
+ mccmnc_tuple: "23433"
+ mccmnc_tuple: "23486"
+ }
+}
+carrier_id {
+ canonical_id: 720
+ carrier_name: "Cable and Wireless Guensey Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "23455"
+ }
+}
+carrier_id {
+ canonical_id: 733
+ carrier_name: "Gibtelecom GSM"
+ carrier_attribute {
+ mccmnc_tuple: "26601"
+ }
+}
+carrier_id {
+ canonical_id: 734
+ carrier_name: "Cloud9 Mobile Communications"
+ carrier_attribute {
+ mccmnc_tuple: "26609"
+ }
+}
+carrier_id {
+ canonical_id: 735
+ carrier_name: "Tele Greenland"
+ carrier_attribute {
+ mccmnc_tuple: "29001"
+ }
+}
+carrier_id {
+ canonical_id: 736
+ carrier_name: "Gamcel"
+ carrier_attribute {
+ mccmnc_tuple: "60701"
+ }
+}
+carrier_id {
+ canonical_id: 737
+ carrier_name: "Africell"
+ carrier_attribute {
+ mccmnc_tuple: "60702"
+ }
+}
+carrier_id {
+ canonical_id: 738
+ carrier_name: "Comium Services Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "60703"
+ }
+}
+carrier_id {
+ canonical_id: 739
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "61101"
+ }
+}
+carrier_id {
+ canonical_id: 740
+ carrier_name: "Sotelgui"
+ carrier_attribute {
+ mccmnc_tuple: "61102"
+ }
+}
+carrier_id {
+ canonical_id: 741
+ carrier_name: "Cellcom Guinée SA"
+ carrier_attribute {
+ mccmnc_tuple: "61105"
+ }
+}
+carrier_id {
+ canonical_id: 742
+ carrier_name: "Orange Caraïbe Mobiles"
+ carrier_attribute {
+ mccmnc_tuple: "34001"
+ }
+}
+carrier_id {
+ canonical_id: 743
+ carrier_name: "Outremer Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "34002"
+ }
+}
+carrier_id {
+ canonical_id: 744
+ carrier_name: "Saint Martin et Saint Barthelemy Telcell Sarl"
+ carrier_attribute {
+ mccmnc_tuple: "34003"
+ }
+}
+carrier_id {
+ canonical_id: 745
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "34020"
+ }
+}
+carrier_id {
+ canonical_id: 746
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "62701"
+ }
+}
+carrier_id {
+ canonical_id: 747
+ carrier_name: "COSMOTE"
+ carrier_attribute {
+ mccmnc_tuple: "20201"
+ gid1: "FFFF"
+ gid1: "FF"
+ }
+}
+carrier_id {
+ canonical_id: 749
+ carrier_name: "Info Quest S.A."
+ carrier_attribute {
+ mccmnc_tuple: "20209"
+ }
+}
+carrier_id {
+ canonical_id: 759
+ carrier_name: "3G Radio System/HKCSL3G"
+ carrier_attribute {
+ mccmnc_tuple: "45402"
+ }
+}
+carrier_id {
+ canonical_id: 760
+ carrier_name: "3HK/SUPREME"
+ carrier_attribute {
+ mccmnc_tuple: "45403"
+ }
+}
+carrier_id {
+ canonical_id: 761
+ carrier_name: "SmarTone HK"
+ carrier_attribute {
+ mccmnc_tuple: "45406"
+ mccmnc_tuple: "45417"
+ mccmnc_tuple: "45415"
+ }
+}
+carrier_id {
+ canonical_id: 762
+ carrier_name: "MVNO/China Unicom International Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "45407"
+ }
+}
+carrier_id {
+ canonical_id: 763
+ carrier_name: "MVNO/Trident"
+ carrier_attribute {
+ mccmnc_tuple: "45408"
+ }
+}
+carrier_id {
+ canonical_id: 764
+ carrier_name: "MVNO/China Motion Telecom (HK) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "45409"
+ }
+}
+carrier_id {
+ canonical_id: 765
+ carrier_name: "GSM1800New World PCS Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "45410"
+ }
+}
+carrier_id {
+ canonical_id: 766
+ carrier_name: "MVNO/CHKTL"
+ carrier_attribute {
+ mccmnc_tuple: "45411"
+ }
+}
+carrier_id {
+ canonical_id: 767
+ carrier_name: "中國移動香港 China Mobile HK"
+ carrier_attribute {
+ mccmnc_tuple: "45412"
+ mccmnc_tuple: "45413"
+ }
+}
+carrier_id {
+ canonical_id: 769
+ carrier_name: "PCCW"
+ carrier_attribute {
+ mccmnc_tuple: "45416"
+ }
+}
+carrier_id {
+ canonical_id: 770
+ carrier_name: "GSM7800/Hong Kong CSL Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "45418"
+ }
+}
+carrier_id {
+ canonical_id: 772
+ carrier_name: "Public Mobile Networks/Reserved"
+ carrier_attribute {
+ mccmnc_tuple: "45420"
+ mccmnc_tuple: "45421"
+ mccmnc_tuple: "45422"
+ mccmnc_tuple: "45423"
+ mccmnc_tuple: "45424"
+ mccmnc_tuple: "45425"
+ mccmnc_tuple: "45426"
+ mccmnc_tuple: "45427"
+ mccmnc_tuple: "45428"
+ mccmnc_tuple: "45429"
+ mccmnc_tuple: "45430"
+ mccmnc_tuple: "45431"
+ mccmnc_tuple: "45432"
+ mccmnc_tuple: "45433"
+ mccmnc_tuple: "45434"
+ mccmnc_tuple: "45435"
+ mccmnc_tuple: "45436"
+ mccmnc_tuple: "45437"
+ mccmnc_tuple: "45438"
+ mccmnc_tuple: "45439"
+ }
+}
+carrier_id {
+ canonical_id: 773
+ carrier_name: "Claro HN"
+ carrier_attribute {
+ mccmnc_tuple: "708001"
+ mccmnc_tuple: "70801"
+ }
+}
+carrier_id {
+ canonical_id: 787
+ carrier_name: "Telkomsel"
+ carrier_attribute {
+ mccmnc_tuple: "51010"
+ }
+}
+carrier_id {
+ canonical_id: 788
+ carrier_name: "XL/AXIS"
+ carrier_attribute {
+ mccmnc_tuple: "51008"
+ mccmnc_tuple: "51011"
+ }
+}
+carrier_id {
+ canonical_id: 789
+ carrier_name: "Indosat - M3"
+ carrier_attribute {
+ mccmnc_tuple: "51021"
+ }
+}
+carrier_id {
+ canonical_id: 792
+ carrier_name: "3"
+ carrier_attribute {
+ mccmnc_tuple: "27202"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "27211"
+ imsi_prefix_xpattern: "272110200677368"
+ }
+}
+carrier_id {
+ canonical_id: 793
+ carrier_name: "Meteor Mobile Communications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "27203"
+ }
+}
+carrier_id {
+ canonical_id: 794
+ carrier_name: "Eircom"
+ carrier_attribute {
+ mccmnc_tuple: "27207"
+ }
+}
+carrier_id {
+ canonical_id: 795
+ carrier_name: "Clever Communications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "27209"
+ }
+}
+carrier_id {
+ canonical_id: 796
+ carrier_name: "Partner Communications Co. Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "42501"
+ mccmnc_tuple: "42510"
+ }
+}
+carrier_id {
+ canonical_id: 797
+ carrier_name: "Cellcom Israel Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "42502"
+ }
+}
+carrier_id {
+ canonical_id: 798
+ carrier_name: "Pelephone Communications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "42503"
+ }
+}
+carrier_id {
+ canonical_id: 802
+ carrier_name: "Vi"
+ carrier_attribute {
+ mccmnc_tuple: "40404"
+ mccmnc_tuple: "40407"
+ mccmnc_tuple: "40412"
+ mccmnc_tuple: "40414"
+ mccmnc_tuple: "40419"
+ mccmnc_tuple: "40422"
+ mccmnc_tuple: "40424"
+ mccmnc_tuple: "40444"
+ mccmnc_tuple: "40456"
+ mccmnc_tuple: "40478"
+ mccmnc_tuple: "40482"
+ mccmnc_tuple: "40487"
+ mccmnc_tuple: "40489"
+ mccmnc_tuple: "40570"
+ mccmnc_tuple: "40545"
+ mccmnc_tuple: "405799"
+ mccmnc_tuple: "405845"
+ mccmnc_tuple: "405846"
+ mccmnc_tuple: "405847"
+ mccmnc_tuple: "405848"
+ mccmnc_tuple: "405849"
+ mccmnc_tuple: "405850"
+ mccmnc_tuple: "405851"
+ mccmnc_tuple: "405852"
+ mccmnc_tuple: "405853"
+ mccmnc_tuple: "405908"
+ mccmnc_tuple: "405909"
+ mccmnc_tuple: "405910"
+ mccmnc_tuple: "405911"
+ }
+}
+carrier_id {
+ canonical_id: 849
+ carrier_name: "Orange Jordan"
+ carrier_attribute {
+ mccmnc_tuple: "41677"
+ mccmnc_tuple: "416770"
+ }
+}
+carrier_id {
+ canonical_id: 850
+ carrier_name: "NTT DOCOMO"
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ gid1: "00FFFF"
+ gid1: "01FFFF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ preferred_apn: "spmode.ne.jp"
+ preferred_apn: "mopera.net"
+ }
+}
+carrier_id {
+ canonical_id: 865
+ carrier_name: "Safaricom"
+ carrier_attribute {
+ mccmnc_tuple: "63902"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "63902"
+ spn: "Safaricom"
+ }
+}
+carrier_id {
+ canonical_id: 866
+ carrier_name: "Airtel Kenya"
+ carrier_attribute {
+ mccmnc_tuple: "63903"
+ }
+}
+carrier_id {
+ canonical_id: 867
+ carrier_name: "Beeline"
+ carrier_attribute {
+ mccmnc_tuple: "43701"
+ }
+}
+carrier_id {
+ canonical_id: 868
+ carrier_name: "Mobitel (Cam GSM)"
+ carrier_attribute {
+ mccmnc_tuple: "45601"
+ }
+}
+carrier_id {
+ canonical_id: 869
+ carrier_name: "Smart"
+ carrier_attribute {
+ mccmnc_tuple: "45602"
+ mccmnc_tuple: "45605"
+ mccmnc_tuple: "45606"
+ }
+}
+carrier_id {
+ canonical_id: 870
+ carrier_name: "S Telecom (CDMA) (reserved)"
+ carrier_attribute {
+ mccmnc_tuple: "45603"
+ }
+}
+carrier_id {
+ canonical_id: 871
+ carrier_name: "Camshin (Shinawatra)"
+ carrier_attribute {
+ mccmnc_tuple: "45618"
+ }
+}
+carrier_id {
+ canonical_id: 872
+ carrier_name: "HURI - SNPT"
+ carrier_attribute {
+ mccmnc_tuple: "65401"
+ }
+}
+carrier_id {
+ canonical_id: 892
+ carrier_name: "Telia"
+ carrier_attribute {
+ mccmnc_tuple: "24601"
+ }
+}
+carrier_id {
+ canonical_id: 893
+ carrier_name: "BITĖ"
+ carrier_attribute {
+ mccmnc_tuple: "24602"
+ }
+}
+carrier_id {
+ canonical_id: 894
+ carrier_name: "Tele2"
+ carrier_attribute {
+ mccmnc_tuple: "24603"
+ }
+}
+carrier_id {
+ canonical_id: 895
+ carrier_name: "P&T Luxembourg"
+ carrier_attribute {
+ mccmnc_tuple: "27001"
+ }
+}
+carrier_id {
+ canonical_id: 896
+ carrier_name: "Tango"
+ carrier_attribute {
+ mccmnc_tuple: "27077"
+ }
+}
+carrier_id {
+ canonical_id: 897
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "27099"
+ }
+}
+carrier_id {
+ canonical_id: 898
+ carrier_name: "LMT"
+ carrier_attribute {
+ mccmnc_tuple: "24701"
+ }
+}
+carrier_id {
+ canonical_id: 899
+ carrier_name: "Tele2/ZZ"
+ carrier_attribute {
+ mccmnc_tuple: "24702"
+ }
+}
+carrier_id {
+ canonical_id: 900
+ carrier_name: "Telekom Baltija"
+ carrier_attribute {
+ mccmnc_tuple: "24703"
+ }
+}
+carrier_id {
+ canonical_id: 901
+ carrier_name: "Beta Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "24704"
+ }
+}
+carrier_id {
+ canonical_id: 902
+ carrier_name: "Méditélécom"
+ carrier_attribute {
+ mccmnc_tuple: "60400"
+ }
+}
+carrier_id {
+ canonical_id: 903
+ carrier_name: "Maroc"
+ carrier_attribute {
+ mccmnc_tuple: "60401"
+ }
+}
+carrier_id {
+ canonical_id: 904
+ carrier_name: "Orange Moldova GSM"
+ carrier_attribute {
+ mccmnc_tuple: "25901"
+ }
+}
+carrier_id {
+ canonical_id: 905
+ carrier_name: "Moldcell GSM"
+ carrier_attribute {
+ mccmnc_tuple: "25902"
+ }
+}
+carrier_id {
+ canonical_id: 906
+ carrier_name: "Eventis Mobile GSM"
+ carrier_attribute {
+ mccmnc_tuple: "25904"
+ }
+}
+carrier_id {
+ canonical_id: 941
+ carrier_name: "Mobile Telecommunications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "64901"
+ }
+}
+carrier_id {
+ canonical_id: 942
+ carrier_name: "Powercom Pty Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "64903"
+ }
+}
+carrier_id {
+ canonical_id: 943
+ carrier_name: "OPT Mobilis"
+ carrier_attribute {
+ mccmnc_tuple: "54601"
+ }
+}
+carrier_id {
+ canonical_id: 945
+ carrier_name: "Airtel Niger"
+ carrier_attribute {
+ mccmnc_tuple: "61402"
+ }
+}
+carrier_id {
+ canonical_id: 958
+ carrier_name: "Telenor"
+ carrier_attribute {
+ mccmnc_tuple: "24201"
+ mccmnc_tuple: "24212"
+ }
+}
+carrier_id {
+ canonical_id: 959
+ carrier_name: "Telia"
+ carrier_attribute {
+ mccmnc_tuple: "24202"
+ }
+}
+carrier_id {
+ canonical_id: 960
+ carrier_name: "Teletopia Mobile Communications AS"
+ carrier_attribute {
+ mccmnc_tuple: "24203"
+ }
+}
+carrier_id {
+ canonical_id: 961
+ carrier_name: "Tele2 Norge AS"
+ carrier_attribute {
+ mccmnc_tuple: "24204"
+ }
+}
+carrier_id {
+ canonical_id: 962
+ carrier_name: "Nepal Telecommunications"
+ carrier_attribute {
+ mccmnc_tuple: "42901"
+ mccmnc_tuple: "42903"
+ }
+}
+carrier_id {
+ canonical_id: 963
+ carrier_name: "Reserved for AMPS MIN based IMSI's"
+ carrier_attribute {
+ mccmnc_tuple: "53000"
+ }
+}
+carrier_id {
+ canonical_id: 965
+ carrier_name: "Teleom New Zealand CDMA Network"
+ carrier_attribute {
+ mccmnc_tuple: "53002"
+ }
+}
+carrier_id {
+ canonical_id: 966
+ carrier_name: "Woosh Wireless - CDMA Network"
+ carrier_attribute {
+ mccmnc_tuple: "53003"
+ }
+}
+carrier_id {
+ canonical_id: 968
+ carrier_name: "Spark"
+ carrier_attribute {
+ mccmnc_tuple: "53005"
+ }
+}
+carrier_id {
+ canonical_id: 969
+ carrier_name: "2degrees"
+ carrier_attribute {
+ mccmnc_tuple: "53024"
+ }
+}
+carrier_id {
+ canonical_id: 970
+ carrier_name: "Omantel"
+ carrier_attribute {
+ mccmnc_tuple: "42202"
+ mccmnc_tuple: "42204"
+ }
+}
+carrier_id {
+ canonical_id: 971
+ carrier_name: "Ooredoo"
+ carrier_attribute {
+ mccmnc_tuple: "42203"
+ }
+}
+carrier_id {
+ canonical_id: 973
+ carrier_name: "Cable & Wireless Panama S.A."
+ carrier_attribute {
+ mccmnc_tuple: "71401"
+ }
+}
+carrier_id {
+ canonical_id: 974
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "71402"
+ mccmnc_tuple: "714020"
+ }
+}
+carrier_id {
+ canonical_id: 1008
+ carrier_name: "Société Réunionnaise du Radiotéléphone"
+ carrier_attribute {
+ mccmnc_tuple: "64710"
+ }
+}
+carrier_id {
+ canonical_id: 1010
+ carrier_name: "Telekom Romania"
+ carrier_attribute {
+ mccmnc_tuple: "22603"
+ mccmnc_tuple: "22606"
+ spn: "TELEKOM.RO"
+ spn: "COSMOTE"
+ spn: "frog"
+ spn: "MTV Mobile"
+ }
+}
+carrier_id {
+ canonical_id: 1011
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "22610"
+ }
+}
+carrier_id {
+ canonical_id: 1012
+ carrier_name: "Yettel"
+ carrier_attribute {
+ mccmnc_tuple: "22001"
+ mccmnc_tuple: "22002"
+ }
+}
+carrier_id {
+ canonical_id: 1013
+ carrier_name: "Telekom Srbija a.d."
+ carrier_attribute {
+ mccmnc_tuple: "22003"
+ }
+}
+carrier_id {
+ canonical_id: 1014
+ carrier_name: "Vip mobile d.o.o."
+ carrier_attribute {
+ mccmnc_tuple: "22005"
+ }
+}
+carrier_id {
+ canonical_id: 1016
+ carrier_name: "MegaFon"
+ carrier_attribute {
+ mccmnc_tuple: "25002"
+ }
+}
+carrier_id {
+ canonical_id: 1018
+ carrier_name: "Sibchallenge"
+ carrier_attribute {
+ mccmnc_tuple: "25004"
+ }
+}
+carrier_id {
+ canonical_id: 1020
+ carrier_name: "BM Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "25007"
+ }
+}
+carrier_id {
+ canonical_id: 1021
+ carrier_name: "Don Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "25010"
+ }
+}
+carrier_id {
+ canonical_id: 1022
+ carrier_name: "Orensot"
+ carrier_attribute {
+ mccmnc_tuple: "25011"
+ }
+}
+carrier_id {
+ canonical_id: 1024
+ carrier_name: "Kuban GSM"
+ carrier_attribute {
+ mccmnc_tuple: "25013"
+ }
+}
+carrier_id {
+ canonical_id: 1025
+ carrier_name: "New Telephone Company"
+ carrier_attribute {
+ mccmnc_tuple: "25016"
+ }
+}
+carrier_id {
+ canonical_id: 1027
+ carrier_name: "Volgograd Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "25019"
+ }
+}
+carrier_id {
+ canonical_id: 1028
+ carrier_name: "Tele2"
+ carrier_attribute {
+ mccmnc_tuple: "25003"
+ mccmnc_tuple: "25005"
+ mccmnc_tuple: "25012"
+ mccmnc_tuple: "25017"
+ mccmnc_tuple: "25020"
+ mccmnc_tuple: "25039"
+ }
+}
+carrier_id {
+ canonical_id: 1029
+ carrier_name: "Extel"
+ carrier_attribute {
+ mccmnc_tuple: "25028"
+ }
+}
+carrier_id {
+ canonical_id: 1031
+ carrier_name: "Stuvtelesot"
+ carrier_attribute {
+ mccmnc_tuple: "25044"
+ }
+}
+carrier_id {
+ canonical_id: 1074
+ carrier_name: "Comium (Sierra Leone) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "61904"
+ }
+}
+carrier_id {
+ canonical_id: 1075
+ carrier_name: "Lintel (Sierra Leone) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "61905"
+ }
+}
+carrier_id {
+ canonical_id: 1076
+ carrier_name: "Mobitel"
+ carrier_attribute {
+ mccmnc_tuple: "61925"
+ }
+}
+carrier_id {
+ canonical_id: 1077
+ carrier_name: "Datatel (SL) Ltd GSM"
+ carrier_attribute {
+ mccmnc_tuple: "61940"
+ }
+}
+carrier_id {
+ canonical_id: 1082
+ carrier_name: "Golis Telecommunications Company"
+ carrier_attribute {
+ mccmnc_tuple: "63730"
+ }
+}
+carrier_id {
+ canonical_id: 1083
+ carrier_name: "Telesur"
+ carrier_attribute {
+ mccmnc_tuple: "74602"
+ }
+}
+carrier_id {
+ canonical_id: 1084
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "74603"
+ }
+}
+carrier_id {
+ canonical_id: 1085
+ carrier_name: "Intelsur"
+ carrier_attribute {
+ mccmnc_tuple: "74604"
+ }
+}
+carrier_id {
+ canonical_id: 1086
+ carrier_name: "Companhia Santomese de Telecomunicaçôes"
+ carrier_attribute {
+ mccmnc_tuple: "62601"
+ }
+}
+carrier_id {
+ canonical_id: 1087
+ carrier_name: "Digicel, S.A. de C.V."
+ carrier_attribute {
+ mccmnc_tuple: "70602"
+ }
+}
+carrier_id {
+ canonical_id: 1088
+ carrier_name: "Syriatel"
+ carrier_attribute {
+ mccmnc_tuple: "41701"
+ }
+}
+carrier_id {
+ canonical_id: 1089
+ carrier_name: "Spacetel Syria"
+ carrier_attribute {
+ mccmnc_tuple: "41702"
+ }
+}
+carrier_id {
+ canonical_id: 1090
+ carrier_name: "Syrian Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "41709"
+ }
+}
+carrier_id {
+ canonical_id: 1091
+ carrier_name: "Swazi MTN"
+ carrier_attribute {
+ mccmnc_tuple: "65310"
+ }
+}
+carrier_id {
+ canonical_id: 1092
+ carrier_name: "IslandCom Communications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "376352"
+ }
+}
+carrier_id {
+ canonical_id: 1093
+ carrier_name: "Airtel Chad"
+ carrier_attribute {
+ mccmnc_tuple: "62201"
+ }
+}
+carrier_id {
+ canonical_id: 1094
+ carrier_name: "Tchad Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "62202"
+ }
+}
+carrier_id {
+ canonical_id: 1095
+ carrier_name: "Togo Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "61501"
+ }
+}
+carrier_id {
+ canonical_id: 1096
+ carrier_name: "CAT CDMA"
+ carrier_attribute {
+ mccmnc_tuple: "52000"
+ mccmnc_tuple: "52002"
+ }
+}
+carrier_id {
+ canonical_id: 1097
+ carrier_name: "AIS GSM"
+ carrier_attribute {
+ mccmnc_tuple: "52001"
+ }
+}
+carrier_id {
+ canonical_id: 1098
+ carrier_name: "AIS"
+ carrier_attribute {
+ mccmnc_tuple: "52003"
+ }
+}
+carrier_id {
+ canonical_id: 1136
+ carrier_name: "Iridium Satellite, LLC (GMSS)"
+ carrier_attribute {
+ mccmnc_tuple: "90103"
+ }
+}
+carrier_id {
+ canonical_id: 1137
+ carrier_name: "Globalstar"
+ carrier_attribute {
+ mccmnc_tuple: "90104"
+ }
+}
+carrier_id {
+ canonical_id: 1138
+ carrier_name: "Thuraya RMSS Network"
+ carrier_attribute {
+ mccmnc_tuple: "90105"
+ }
+}
+carrier_id {
+ canonical_id: 1139
+ carrier_name: "Thuraya Satellite Telecommunications Company"
+ carrier_attribute {
+ mccmnc_tuple: "90106"
+ }
+}
+carrier_id {
+ canonical_id: 1166
+ carrier_name: "Consolidated Telcom"
+ carrier_attribute {
+ mccmnc_tuple: "310060"
+ }
+}
+carrier_id {
+ canonical_id: 1168
+ carrier_name: "Corr Wireless Communications LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310080"
+ }
+}
+carrier_id {
+ canonical_id: 1170
+ carrier_name: "New Mexico RSA 4 East Ltd. Partnership"
+ carrier_attribute {
+ mccmnc_tuple: "310100"
+ }
+}
+carrier_id {
+ canonical_id: 1183
+ carrier_name: "High Plains Midwest LLC, dba Wetlink Communications"
+ carrier_attribute {
+ mccmnc_tuple: "310340"
+ }
+}
+carrier_id {
+ canonical_id: 1184
+ carrier_name: "Mohave Cellular L.P."
+ carrier_attribute {
+ mccmnc_tuple: "310350"
+ }
+}
+carrier_id {
+ canonical_id: 1185
+ carrier_name: "Cellular Network Partnership dba Pioneer Cellular"
+ carrier_attribute {
+ mccmnc_tuple: "310360"
+ }
+}
+carrier_id {
+ canonical_id: 1186
+ carrier_name: "Guamcell Cellular and Paging"
+ carrier_attribute {
+ mccmnc_tuple: "310370"
+ }
+}
+carrier_id {
+ canonical_id: 1187
+ carrier_name: "AT&T"
+ carrier_attribute {
+ mccmnc_tuple: "310030"
+ mccmnc_tuple: "310070"
+ mccmnc_tuple: "310170"
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310380"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310560"
+ mccmnc_tuple: "310680"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ }
+}
+carrier_id {
+ canonical_id: 1188
+ carrier_name: "TX-11 Acquistion LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310390"
+ }
+}
+carrier_id {
+ canonical_id: 1189
+ carrier_name: "Wave Runner LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310400"
+ mccmnc_tuple: "311250"
+ }
+}
+carrier_id {
+ canonical_id: 1190
+ carrier_name: "Cincinnati Bell Wireless LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310420"
+ }
+}
+carrier_id {
+ canonical_id: 1191
+ carrier_name: "Alaska Digitel LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310430"
+ }
+}
+carrier_id {
+ canonical_id: 1192
+ carrier_name: "Numerex Corp."
+ carrier_attribute {
+ mccmnc_tuple: "310440"
+ }
+}
+carrier_id {
+ canonical_id: 1193
+ carrier_name: "North East Cellular Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310450"
+ }
+}
+carrier_id {
+ canonical_id: 1194
+ carrier_name: "TMP Corporation"
+ carrier_attribute {
+ mccmnc_tuple: "310460"
+ }
+}
+carrier_id {
+ canonical_id: 1195
+ carrier_name: "Choice Phone LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310480"
+ mccmnc_tuple: "311120"
+ }
+}
+carrier_id {
+ canonical_id: 1196
+ carrier_name: "Public Service Cellular, Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310500"
+ }
+}
+carrier_id {
+ canonical_id: 1197
+ carrier_name: "Airtel Wireless LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310510"
+ }
+}
+carrier_id {
+ canonical_id: 1198
+ carrier_name: "VeriSign"
+ carrier_attribute {
+ mccmnc_tuple: "310520"
+ }
+}
+carrier_id {
+ canonical_id: 1199
+ carrier_name: "Oklahoma Western Telephone Company"
+ carrier_attribute {
+ mccmnc_tuple: "310540"
+ }
+}
+carrier_id {
+ canonical_id: 1234
+ carrier_name: "UBET Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310960"
+ }
+}
+carrier_id {
+ canonical_id: 1235
+ carrier_name: "Globalstar USA"
+ carrier_attribute {
+ mccmnc_tuple: "310970"
+ }
+}
+carrier_id {
+ canonical_id: 1236
+ carrier_name: "Mid-Tex Cellular Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "311000"
+ }
+}
+carrier_id {
+ canonical_id: 1237
+ carrier_name: "Chariton Valley Communications Corp., Inc."
+ carrier_attribute {
+ mccmnc_tuple: "311010"
+ }
+}
+carrier_id {
+ canonical_id: 1238
+ carrier_name: "Missouri RSA No. 5 Partnership"
+ carrier_attribute {
+ mccmnc_tuple: "311020"
+ }
+}
+carrier_id {
+ canonical_id: 1239
+ carrier_name: "Indigo Wireless, Inc."
+ carrier_attribute {
+ mccmnc_tuple: "311030"
+ }
+}
+carrier_id {
+ canonical_id: 1240
+ carrier_name: "Commet Wireless, LLC"
+ carrier_attribute {
+ mccmnc_tuple: "311040"
+ }
+}
+carrier_id {
+ canonical_id: 1241
+ carrier_name: "Thumb Cellular Limited Partnership"
+ carrier_attribute {
+ mccmnc_tuple: "311050"
+ }
+}
+carrier_id {
+ canonical_id: 1242
+ carrier_name: "Space Data Corporation"
+ carrier_attribute {
+ mccmnc_tuple: "311060"
+ }
+}
+carrier_id {
+ canonical_id: 1243
+ carrier_name: "Easterbrooke Cellular Corporation"
+ carrier_attribute {
+ mccmnc_tuple: "311070"
+ }
+}
+carrier_id {
+ canonical_id: 1244
+ carrier_name: "Pine Telephone Company dba Pine Cellular"
+ carrier_attribute {
+ mccmnc_tuple: "311080"
+ }
+}
+carrier_id {
+ canonical_id: 1245
+ carrier_name: "Siouxland PCS"
+ carrier_attribute {
+ mccmnc_tuple: "311090"
+ }
+}
+carrier_id {
+ canonical_id: 1246
+ carrier_name: "Alltel Communications Inc."
+ carrier_attribute {
+ mccmnc_tuple: "311110"
+ mccmnc_tuple: "311271"
+ mccmnc_tuple: "311272"
+ mccmnc_tuple: "311273"
+ mccmnc_tuple: "311274"
+ mccmnc_tuple: "311275"
+ mccmnc_tuple: "311276"
+ mccmnc_tuple: "311277"
+ mccmnc_tuple: "311278"
+ mccmnc_tuple: "311279"
+ }
+}
+carrier_id {
+ canonical_id: 1247
+ carrier_name: "MBO Wireless Inc./Cross Telephone Company"
+ carrier_attribute {
+ mccmnc_tuple: "311140"
+ }
+}
+carrier_id {
+ canonical_id: 1248
+ carrier_name: "Wilkes Cellular Inc."
+ carrier_attribute {
+ mccmnc_tuple: "311150"
+ }
+}
+carrier_id {
+ canonical_id: 1261
+ carrier_name: "Commnet Wireless LLC"
+ carrier_attribute {
+ mccmnc_tuple: "311320"
+ }
+}
+carrier_id {
+ canonical_id: 1262
+ carrier_name: "Bag Tussel Wireless LLC"
+ carrier_attribute {
+ mccmnc_tuple: "311330"
+ }
+}
+carrier_id {
+ canonical_id: 1263
+ carrier_name: "Illinois Valley Cellular"
+ carrier_attribute {
+ mccmnc_tuple: "311340"
+ }
+}
+carrier_id {
+ canonical_id: 1264
+ carrier_name: "Torrestar Networks Inc"
+ carrier_attribute {
+ mccmnc_tuple: "311350"
+ }
+}
+carrier_id {
+ canonical_id: 1265
+ carrier_name: "Stelera Wireless LLC"
+ carrier_attribute {
+ mccmnc_tuple: "311360"
+ }
+}
+carrier_id {
+ canonical_id: 1299
+ carrier_name: "Mobifone"
+ carrier_attribute {
+ mccmnc_tuple: "45201"
+ }
+}
+carrier_id {
+ canonical_id: 1300
+ carrier_name: "Vinaphone"
+ carrier_attribute {
+ mccmnc_tuple: "45202"
+ }
+}
+carrier_id {
+ canonical_id: 1301
+ carrier_name: "SMILE"
+ carrier_attribute {
+ mccmnc_tuple: "54101"
+ }
+}
+carrier_id {
+ canonical_id: 1302
+ carrier_name: "Telecom Samoa Cellular Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "54901"
+ }
+}
+carrier_id {
+ canonical_id: 1307
+ carrier_name: "Sentech (Pty) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "65506"
+ }
+}
+carrier_id {
+ canonical_id: 1308
+ carrier_name: "Cell C (Pty) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "65507"
+ }
+}
+carrier_id {
+ canonical_id: 1309
+ carrier_name: "MTN"
+ carrier_attribute {
+ mccmnc_tuple: "65510"
+ mccmnc_tuple: "65512"
+ }
+}
+carrier_id {
+ canonical_id: 1310
+ carrier_name: "SAPS Gauteng"
+ carrier_attribute {
+ mccmnc_tuple: "65511"
+ }
+}
+carrier_id {
+ canonical_id: 1311
+ carrier_name: "Cape Town Metropolitan Council"
+ carrier_attribute {
+ mccmnc_tuple: "65521"
+ }
+}
+carrier_id {
+ canonical_id: 1312
+ carrier_name: "Bokamoso Consortium"
+ carrier_attribute {
+ mccmnc_tuple: "65530"
+ }
+}
+carrier_id {
+ canonical_id: 1313
+ carrier_name: "Karabo Telecoms (Pty) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "65531"
+ }
+}
+carrier_id {
+ canonical_id: 1314
+ carrier_name: "Ilizwi Telecommunications"
+ carrier_attribute {
+ mccmnc_tuple: "65532"
+ }
+}
+carrier_id {
+ canonical_id: 1315
+ carrier_name: "Thinta Thinta Telecommunications"
+ carrier_attribute {
+ mccmnc_tuple: "65533"
+ }
+}
+carrier_id {
+ canonical_id: 1316
+ carrier_name: "Bokone Telecoms"
+ carrier_attribute {
+ mccmnc_tuple: "65534"
+ }
+}
+carrier_id {
+ canonical_id: 1317
+ carrier_name: "Kingdom Communications"
+ carrier_attribute {
+ mccmnc_tuple: "65535"
+ }
+}
+carrier_id {
+ canonical_id: 1318
+ carrier_name: "Amatole Telecommunication Services"
+ carrier_attribute {
+ mccmnc_tuple: "65536"
+ }
+}
+carrier_id {
+ canonical_id: 1319
+ carrier_name: "Airtel Zambia"
+ carrier_attribute {
+ mccmnc_tuple: "64501"
+ }
+}
+carrier_id {
+ canonical_id: 1320
+ carrier_name: "Telecel Zambia Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "64502"
+ }
+}
+carrier_id {
+ canonical_id: 1321
+ carrier_name: "Zamtel"
+ carrier_attribute {
+ mccmnc_tuple: "64503"
+ }
+}
+carrier_id {
+ canonical_id: 1322
+ carrier_name: "Net One"
+ carrier_attribute {
+ mccmnc_tuple: "64801"
+ }
+}
+carrier_id {
+ canonical_id: 1325
+ carrier_name: "Cable & Wireless (Antigua)"
+ carrier_attribute {
+ mccmnc_tuple: "344920"
+ }
+}
+carrier_id {
+ canonical_id: 1326
+ carrier_name: "AT&T Wireless (Antigua)"
+ carrier_attribute {
+ mccmnc_tuple: "344930"
+ }
+}
+carrier_id {
+ canonical_id: 1327
+ carrier_name: "Weblinks Limited"
+ carrier_attribute {
+ mccmnc_tuple: "365010"
+ }
+}
+carrier_id {
+ canonical_id: 1328
+ carrier_name: "One Telecommunications"
+ carrier_attribute {
+ mccmnc_tuple: "27601"
+ gid1: "01"
+ }
+}
+carrier_id {
+ canonical_id: 1329
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "27602"
+ spn: "VODAFONE AL"
+ }
+}
+carrier_id {
+ canonical_id: 1330
+ carrier_name: "Eagle Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "27603"
+ }
+}
+carrier_id {
+ canonical_id: 1331
+ carrier_name: "TELCELL GSM"
+ carrier_attribute {
+ mccmnc_tuple: "36251"
+ }
+}
+carrier_id {
+ canonical_id: 1332
+ carrier_name: "CT GSM"
+ carrier_attribute {
+ mccmnc_tuple: "36269"
+ }
+}
+carrier_id {
+ canonical_id: 1333
+ carrier_name: "SETEL GSM"
+ carrier_attribute {
+ mccmnc_tuple: "36291"
+ }
+}
+carrier_id {
+ canonical_id: 1334
+ carrier_name: "Unitel"
+ carrier_attribute {
+ mccmnc_tuple: "63102"
+ }
+}
+carrier_id {
+ canonical_id: 1336
+ carrier_name: "Nextel Argentina srl"
+ carrier_attribute {
+ mccmnc_tuple: "722020"
+ }
+}
+carrier_id {
+ canonical_id: 1337
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "72207"
+ }
+}
+carrier_id {
+ canonical_id: 1338
+ carrier_name: "Claro AR"
+ carrier_attribute {
+ mccmnc_tuple: "722310"
+ mccmnc_tuple: "72231"
+ }
+}
+carrier_id {
+ canonical_id: 1339
+ carrier_name: "Compañía de Telefonos del Interior Norte S.A."
+ carrier_attribute {
+ mccmnc_tuple: "722320"
+ }
+}
+carrier_id {
+ canonical_id: 1340
+ carrier_name: "Compañía de Telefonos del Interior S.A."
+ carrier_attribute {
+ mccmnc_tuple: "722330"
+ }
+}
+carrier_id {
+ canonical_id: 1341
+ carrier_name: "Telecom Personal S.A."
+ carrier_attribute {
+ mccmnc_tuple: "722340"
+ mccmnc_tuple: "72234"
+ mccmnc_tuple: "722341"
+ }
+}
+carrier_id {
+ canonical_id: 1343
+ carrier_name: "Telefonica Austria"
+ carrier_attribute {
+ mccmnc_tuple: "23208"
+ }
+}
+carrier_id {
+ canonical_id: 1344
+ carrier_name: "Drei"
+ carrier_attribute {
+ mccmnc_tuple: "23205"
+ mccmnc_tuple: "23210"
+ }
+}
+carrier_id {
+ canonical_id: 1345
+ carrier_name: "Telstra"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ mccmnc_tuple: "50571"
+ mccmnc_tuple: "50572"
+ }
+}
+carrier_id {
+ canonical_id: 1346
+ carrier_name: "Department of Defence"
+ carrier_attribute {
+ mccmnc_tuple: "50504"
+ }
+}
+carrier_id {
+ canonical_id: 1347
+ carrier_name: "The Ozitel Network Pty. Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "50505"
+ }
+}
+carrier_id {
+ canonical_id: 1348
+ carrier_name: "Hutchison 3G Australia Pty. Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "50506"
+ }
+}
+carrier_id {
+ canonical_id: 1349
+ carrier_name: "One.Tel GSM 1800 Pty. Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "50508"
+ mccmnc_tuple: "50599"
+ }
+}
+carrier_id {
+ canonical_id: 1350
+ carrier_name: "Airnet Commercial Australia Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "50509"
+ }
+}
+carrier_id {
+ canonical_id: 1351
+ carrier_name: "Hutchison Telecommunications (Australia) Pty. Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "50512"
+ }
+}
+carrier_id {
+ canonical_id: 1352
+ carrier_name: "AAPT Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "50514"
+ }
+}
+carrier_id {
+ canonical_id: 1354
+ carrier_name: "Azercell Limited Liability Joint Venture"
+ carrier_attribute {
+ mccmnc_tuple: "40001"
+ }
+}
+carrier_id {
+ canonical_id: 1355
+ carrier_name: "Catel JV"
+ carrier_attribute {
+ mccmnc_tuple: "40003"
+ }
+}
+carrier_id {
+ canonical_id: 1356
+ carrier_name: "Azerphone LLC"
+ carrier_attribute {
+ mccmnc_tuple: "40004"
+ }
+}
+carrier_id {
+ canonical_id: 1357
+ carrier_name: "Eronet Mobile Communications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "21803"
+ }
+}
+carrier_id {
+ canonical_id: 1358
+ carrier_name: "MOBI'S (Mobilina Srpske)"
+ carrier_attribute {
+ mccmnc_tuple: "21805"
+ }
+}
+carrier_id {
+ canonical_id: 1359
+ carrier_name: "GSMBIH"
+ carrier_attribute {
+ mccmnc_tuple: "21890"
+ }
+}
+carrier_id {
+ canonical_id: 1360
+ carrier_name: "Cable & Wireless (Barbados) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "342600"
+ }
+}
+carrier_id {
+ canonical_id: 1361
+ carrier_name: "Sunbeach Communications"
+ carrier_attribute {
+ mccmnc_tuple: "342820"
+ }
+}
+carrier_id {
+ canonical_id: 1362
+ carrier_name: "GramenPhone"
+ carrier_attribute {
+ mccmnc_tuple: "47001"
+ }
+}
+carrier_id {
+ canonical_id: 1363
+ carrier_name: "Aktel"
+ carrier_attribute {
+ mccmnc_tuple: "47002"
+ }
+}
+carrier_id {
+ canonical_id: 1364
+ carrier_name: "Mobile 2000"
+ carrier_attribute {
+ mccmnc_tuple: "47003"
+ }
+}
+carrier_id {
+ canonical_id: 1365
+ carrier_name: "Proximus"
+ carrier_attribute {
+ mccmnc_tuple: "20601"
+ }
+}
+carrier_id {
+ canonical_id: 1366
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "20610"
+ }
+}
+carrier_id {
+ canonical_id: 1367
+ carrier_name: "BASE"
+ carrier_attribute {
+ mccmnc_tuple: "20620"
+ }
+}
+carrier_id {
+ canonical_id: 1368
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "61302"
+ }
+}
+carrier_id {
+ canonical_id: 1369
+ carrier_name: "Telecel"
+ carrier_attribute {
+ mccmnc_tuple: "61303"
+ }
+}
+carrier_id {
+ canonical_id: 1370
+ carrier_name: "A1"
+ carrier_attribute {
+ mccmnc_tuple: "28401"
+ }
+}
+carrier_id {
+ canonical_id: 1371
+ carrier_name: "Yettel"
+ carrier_attribute {
+ mccmnc_tuple: "28405"
+ }
+}
+carrier_id {
+ canonical_id: 1372
+ carrier_name: "Batelco"
+ carrier_attribute {
+ mccmnc_tuple: "42601"
+ mccmnc_tuple: "42605"
+ }
+}
+carrier_id {
+ canonical_id: 1373
+ carrier_name: "Spacetel Burundi"
+ carrier_attribute {
+ mccmnc_tuple: "64201"
+ }
+}
+carrier_id {
+ canonical_id: 1374
+ carrier_name: "Safaris"
+ carrier_attribute {
+ mccmnc_tuple: "64202"
+ }
+}
+carrier_id {
+ canonical_id: 1375
+ carrier_name: "Telecel Burundi Company"
+ carrier_attribute {
+ mccmnc_tuple: "64203"
+ }
+}
+carrier_id {
+ canonical_id: 1376
+ carrier_name: "Libercom"
+ carrier_attribute {
+ mccmnc_tuple: "61601"
+ }
+}
+carrier_id {
+ canonical_id: 1377
+ carrier_name: "Telecel"
+ carrier_attribute {
+ mccmnc_tuple: "61602"
+ }
+}
+carrier_id {
+ canonical_id: 1378
+ carrier_name: "Spacetel Benin"
+ carrier_attribute {
+ mccmnc_tuple: "61603"
+ }
+}
+carrier_id {
+ canonical_id: 1379
+ carrier_name: "DST Com"
+ carrier_attribute {
+ mccmnc_tuple: "52811"
+ }
+}
+carrier_id {
+ canonical_id: 1380
+ carrier_name: "Nuevatel S.A."
+ carrier_attribute {
+ mccmnc_tuple: "73601"
+ }
+}
+carrier_id {
+ canonical_id: 1381
+ carrier_name: "ENTEL S.A."
+ carrier_attribute {
+ mccmnc_tuple: "73602"
+ }
+}
+carrier_id {
+ canonical_id: 1382
+ carrier_name: "Telecel S.A."
+ carrier_attribute {
+ mccmnc_tuple: "73603"
+ }
+}
+carrier_id {
+ canonical_id: 1383
+ carrier_name: "Nextel"
+ carrier_attribute {
+ mccmnc_tuple: "72400"
+ mccmnc_tuple: "72439"
+ }
+}
+carrier_id {
+ canonical_id: 1384
+ carrier_name: "CRT Cellular"
+ carrier_attribute {
+ mccmnc_tuple: "72401"
+ }
+}
+carrier_id {
+ canonical_id: 1385
+ carrier_name: "TIM"
+ carrier_attribute {
+ mccmnc_tuple: "72402"
+ mccmnc_tuple: "72403"
+ mccmnc_tuple: "72404"
+ mccmnc_tuple: "72454"
+ }
+}
+carrier_id {
+ canonical_id: 1388
+ carrier_name: "Sercontel Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72407"
+ }
+}
+carrier_id {
+ canonical_id: 1389
+ carrier_name: "Oi"
+ carrier_attribute {
+ mccmnc_tuple: "72430"
+ mccmnc_tuple: "72431"
+ mccmnc_tuple: "72424"
+ }
+}
+carrier_id {
+ canonical_id: 1390
+ carrier_name: "Algar Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "72432"
+ mccmnc_tuple: "72433"
+ mccmnc_tuple: "72434"
+ }
+}
+carrier_id {
+ canonical_id: 1391
+ carrier_name: "Telebahia Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72435"
+ }
+}
+carrier_id {
+ canonical_id: 1392
+ carrier_name: "Telergipe Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72437"
+ }
+}
+carrier_id {
+ canonical_id: 1394
+ carrier_name: "Telpe Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72441"
+ }
+}
+carrier_id {
+ canonical_id: 1395
+ carrier_name: "Telepisa Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72443"
+ }
+}
+carrier_id {
+ canonical_id: 1396
+ carrier_name: "Telpa Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72445"
+ }
+}
+carrier_id {
+ canonical_id: 1397
+ carrier_name: "Telern Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72447"
+ }
+}
+carrier_id {
+ canonical_id: 1398
+ carrier_name: "Teleceara Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72448"
+ }
+}
+carrier_id {
+ canonical_id: 1399
+ carrier_name: "Telma Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72451"
+ }
+}
+carrier_id {
+ canonical_id: 1400
+ carrier_name: "Telepara Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72453"
+ }
+}
+carrier_id {
+ canonical_id: 1401
+ carrier_name: "Teleamazon Cel"
+ carrier_attribute {
+ mccmnc_tuple: "72455"
+ }
+}
+carrier_id {
+ canonical_id: 1402
+ carrier_name: "B-Mobile of Bhutan Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "40217"
+ }
+}
+carrier_id {
+ canonical_id: 1403
+ carrier_name: "Rogers"
+ carrier_attribute {
+ mccmnc_tuple: "302720"
+ mccmnc_tuple: "30272"
+ }
+}
+carrier_id {
+ canonical_id: 1404
+ carrier_name: "TELUS Mobility"
+ carrier_attribute {
+ mccmnc_tuple: "302220"
+ mccmnc_tuple: "302221"
+ mccmnc_tuple: "30222"
+ mccmnc_tuple: "30286"
+ gid1: "5455"
+ }
+}
+carrier_id {
+ canonical_id: 1405
+ carrier_name: "Vodacom Congo RDC sprl"
+ carrier_attribute {
+ mccmnc_tuple: "63001"
+ }
+}
+carrier_id {
+ canonical_id: 1406
+ carrier_name: "Supercell Sprl"
+ carrier_attribute {
+ mccmnc_tuple: "63005"
+ }
+}
+carrier_id {
+ canonical_id: 1407
+ carrier_name: "Orange RDC"
+ carrier_attribute {
+ mccmnc_tuple: "63086"
+ }
+}
+carrier_id {
+ canonical_id: 1408
+ carrier_name: "Centrafrique Telecom Plus (CTP)"
+ carrier_attribute {
+ mccmnc_tuple: "62301"
+ }
+}
+carrier_id {
+ canonical_id: 1409
+ carrier_name: "Telecel Centrafrique (TC)"
+ carrier_attribute {
+ mccmnc_tuple: "62302"
+ }
+}
+carrier_id {
+ canonical_id: 1410
+ carrier_name: "Orange Centrafricaine"
+ carrier_attribute {
+ mccmnc_tuple: "62303"
+ }
+}
+carrier_id {
+ canonical_id: 1411
+ carrier_name: "Airtel Congo"
+ carrier_attribute {
+ mccmnc_tuple: "62901"
+ }
+}
+carrier_id {
+ canonical_id: 1412
+ carrier_name: "Libertis Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "62910"
+ }
+}
+carrier_id {
+ canonical_id: 1413
+ carrier_name: "Sunrise"
+ carrier_attribute {
+ mccmnc_tuple: "22802"
+ mccmnc_tuple: "22812"
+ }
+}
+carrier_id {
+ canonical_id: 1414
+ carrier_name: "Salt"
+ carrier_attribute {
+ mccmnc_tuple: "22803"
+ }
+}
+carrier_id {
+ canonical_id: 1415
+ carrier_name: "Comfone AG"
+ carrier_attribute {
+ mccmnc_tuple: "22805"
+ }
+}
+carrier_id {
+ canonical_id: 1416
+ carrier_name: "SBB AG"
+ carrier_attribute {
+ mccmnc_tuple: "22806"
+ }
+}
+carrier_id {
+ canonical_id: 1417
+ carrier_name: "IN&Phone SA"
+ carrier_attribute {
+ mccmnc_tuple: "22807"
+ }
+}
+carrier_id {
+ canonical_id: 1418
+ carrier_name: "Tele2 Telecommunications AG"
+ carrier_attribute {
+ mccmnc_tuple: "22808"
+ }
+}
+carrier_id {
+ canonical_id: 1419
+ carrier_name: "Bebbicell AG"
+ carrier_attribute {
+ mccmnc_tuple: "22851"
+ }
+}
+carrier_id {
+ canonical_id: 1420
+ carrier_name: "Atlantique Cellulaire"
+ carrier_attribute {
+ mccmnc_tuple: "61202"
+ }
+}
+carrier_id {
+ canonical_id: 1421
+ carrier_name: "Orange Côte d'Ivoire"
+ carrier_attribute {
+ mccmnc_tuple: "61203"
+ }
+}
+carrier_id {
+ canonical_id: 1422
+ carrier_name: "Comium Côte d'Ivoire"
+ carrier_attribute {
+ mccmnc_tuple: "61204"
+ }
+}
+carrier_id {
+ canonical_id: 1423
+ carrier_name: "Loteny Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "61205"
+ }
+}
+carrier_id {
+ canonical_id: 1424
+ carrier_name: "Oricel Côte d'Ivoire"
+ carrier_attribute {
+ mccmnc_tuple: "61206"
+ }
+}
+carrier_id {
+ canonical_id: 1425
+ carrier_name: "Aircomm Côte d'Ivoire"
+ carrier_attribute {
+ mccmnc_tuple: "61207"
+ }
+}
+carrier_id {
+ canonical_id: 1426
+ carrier_name: "Telecom Cook"
+ carrier_attribute {
+ mccmnc_tuple: "54801"
+ }
+}
+carrier_id {
+ canonical_id: 1427
+ carrier_name: "Entel"
+ carrier_attribute {
+ mccmnc_tuple: "73001"
+ mccmnc_tuple: "73010"
+ mccmnc_tuple: "73026"
+ }
+}
+carrier_id {
+ canonical_id: 1428
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "73002"
+ mccmnc_tuple: "73007"
+ }
+}
+carrier_id {
+ canonical_id: 1429
+ carrier_name: "Claro CL"
+ carrier_attribute {
+ mccmnc_tuple: "73003"
+ }
+}
+carrier_id {
+ canonical_id: 1430
+ carrier_name: "WOM"
+ carrier_attribute {
+ mccmnc_tuple: "73004"
+ mccmnc_tuple: "73009"
+ }
+}
+carrier_id {
+ canonical_id: 1431
+ carrier_name: "Multikom S.A."
+ carrier_attribute {
+ mccmnc_tuple: "73005"
+ }
+}
+carrier_id {
+ canonical_id: 1433
+ carrier_name: "Mobile Telephone Networks Cameroon"
+ carrier_attribute {
+ mccmnc_tuple: "62401"
+ }
+}
+carrier_id {
+ canonical_id: 1434
+ carrier_name: "Orange Cameroun"
+ carrier_attribute {
+ mccmnc_tuple: "62402"
+ }
+}
+carrier_id {
+ canonical_id: 1435
+ carrier_name: "China Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "46000"
+ mccmnc_tuple: "46002"
+ mccmnc_tuple: "46004"
+ mccmnc_tuple: "46007"
+ mccmnc_tuple: "46008"
+ }
+}
+carrier_id {
+ canonical_id: 1436
+ carrier_name: "China Unicom"
+ carrier_attribute {
+ mccmnc_tuple: "46001"
+ mccmnc_tuple: "46006"
+ mccmnc_tuple: "46009"
+ }
+}
+carrier_id {
+ canonical_id: 1438
+ carrier_name: "Colombia Telecomunicaciones S.A. - Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "732001"
+ }
+}
+carrier_id {
+ canonical_id: 1439
+ carrier_name: "Edatel S.A."
+ carrier_attribute {
+ mccmnc_tuple: "732002"
+ }
+}
+carrier_id {
+ canonical_id: 1440
+ carrier_name: "Emtelsa"
+ carrier_attribute {
+ mccmnc_tuple: "732020"
+ }
+}
+carrier_id {
+ canonical_id: 1441
+ carrier_name: "Emcali"
+ carrier_attribute {
+ mccmnc_tuple: "732099"
+ }
+}
+carrier_id {
+ canonical_id: 1442
+ carrier_name: "Claro CO"
+ carrier_attribute {
+ mccmnc_tuple: "732101"
+ }
+}
+carrier_id {
+ canonical_id: 1443
+ carrier_name: "Bellsouth Colombia S.A."
+ carrier_attribute {
+ mccmnc_tuple: "732102"
+ }
+}
+carrier_id {
+ canonical_id: 1444
+ carrier_name: "ETECSA"
+ carrier_attribute {
+ mccmnc_tuple: "36801"
+ }
+}
+carrier_id {
+ canonical_id: 1445
+ carrier_name: "Cabo Verde Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "62501"
+ }
+}
+carrier_id {
+ canonical_id: 1446
+ carrier_name: "T+Telecomunicaçôes"
+ carrier_attribute {
+ mccmnc_tuple: "62502"
+ }
+}
+carrier_id {
+ canonical_id: 1447
+ carrier_name: "CYTA"
+ carrier_attribute {
+ mccmnc_tuple: "28001"
+ }
+}
+carrier_id {
+ canonical_id: 1448
+ carrier_name: "epic"
+ carrier_attribute {
+ mccmnc_tuple: "28010"
+ }
+}
+carrier_id {
+ canonical_id: 1449
+ carrier_name: "O2"
+ carrier_attribute {
+ mccmnc_tuple: "23002"
+ }
+}
+carrier_id {
+ canonical_id: 1450
+ carrier_name: "Mobilkom a.s."
+ carrier_attribute {
+ mccmnc_tuple: "23004"
+ }
+}
+carrier_id {
+ canonical_id: 1451
+ carrier_name: "Sprava Zeleznicni Dopravni Cesty"
+ carrier_attribute {
+ mccmnc_tuple: "23098"
+ }
+}
+carrier_id {
+ canonical_id: 1452
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "23003"
+ spn: "Vodafone CZ"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "23099"
+ imsi_prefix_xpattern: "x"
+ }
+}
+carrier_id {
+ canonical_id: 1453
+ carrier_name: "Telefonica"
+ carrier_attribute {
+ mccmnc_tuple: "26203"
+ mccmnc_tuple: "26205"
+ mccmnc_tuple: "26277"
+ }
+}
+carrier_id {
+ canonical_id: 1454
+ carrier_name: "o2"
+ carrier_attribute {
+ mccmnc_tuple: "26207"
+ mccmnc_tuple: "26208"
+ }
+}
+carrier_id {
+ canonical_id: 1455
+ carrier_name: "Arcor AG & Co."
+ carrier_attribute {
+ mccmnc_tuple: "26210"
+ }
+}
+carrier_id {
+ canonical_id: 1456
+ carrier_name: "O2 (Germany) GmbH & Co. OHG"
+ carrier_attribute {
+ mccmnc_tuple: "26211"
+ }
+}
+carrier_id {
+ canonical_id: 1457
+ carrier_name: "Dolphin Telecom (Deutschland) GmbH"
+ carrier_attribute {
+ mccmnc_tuple: "26212"
+ }
+}
+carrier_id {
+ canonical_id: 1458
+ carrier_name: "Mobilcom Multimedia GmbH"
+ carrier_attribute {
+ mccmnc_tuple: "26213"
+ }
+}
+carrier_id {
+ canonical_id: 1459
+ carrier_name: "Group 3G UMTS GmbH (Quam)"
+ carrier_attribute {
+ mccmnc_tuple: "26214"
+ }
+}
+carrier_id {
+ canonical_id: 1460
+ carrier_name: "Airdata AG"
+ carrier_attribute {
+ mccmnc_tuple: "26215"
+ }
+}
+carrier_id {
+ canonical_id: 1461
+ carrier_name: "Siemens AG, ICMNPGUSTA"
+ carrier_attribute {
+ mccmnc_tuple: "26276"
+ }
+}
+carrier_id {
+ canonical_id: 1462
+ carrier_name: "Evatis"
+ carrier_attribute {
+ mccmnc_tuple: "63801"
+ }
+}
+carrier_id {
+ canonical_id: 1463
+ carrier_name: "TDC Mobil"
+ carrier_attribute {
+ mccmnc_tuple: "23801"
+ mccmnc_tuple: "23810"
+ }
+}
+carrier_id {
+ canonical_id: 1464
+ carrier_name: "Telenor"
+ carrier_attribute {
+ mccmnc_tuple: "23802"
+ mccmnc_tuple: "23866"
+ }
+}
+carrier_id {
+ canonical_id: 1465
+ carrier_name: "MIGway A/S"
+ carrier_attribute {
+ mccmnc_tuple: "23803"
+ }
+}
+carrier_id {
+ canonical_id: 1466
+ carrier_name: "3"
+ carrier_attribute {
+ mccmnc_tuple: "23806"
+ }
+}
+carrier_id {
+ canonical_id: 1467
+ carrier_name: "Claro RD"
+ carrier_attribute {
+ mccmnc_tuple: "37002"
+ mccmnc_tuple: "370020"
+ }
+}
+carrier_id {
+ canonical_id: 1468
+ carrier_name: "Tricom S.A."
+ carrier_attribute {
+ mccmnc_tuple: "37003"
+ }
+}
+carrier_id {
+ canonical_id: 1469
+ carrier_name: "CentennialDominicana"
+ carrier_attribute {
+ mccmnc_tuple: "37004"
+ }
+}
+carrier_id {
+ canonical_id: 1470
+ carrier_name: "Algérie Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "60301"
+ }
+}
+carrier_id {
+ canonical_id: 1471
+ carrier_name: "Orascom Telecom Algérie"
+ carrier_attribute {
+ mccmnc_tuple: "60302"
+ }
+}
+carrier_id {
+ canonical_id: 1472
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "74000"
+ }
+}
+carrier_id {
+ canonical_id: 1473
+ carrier_name: "Claro EC"
+ carrier_attribute {
+ mccmnc_tuple: "74001"
+ mccmnc_tuple: "740010"
+ }
+}
+carrier_id {
+ canonical_id: 1474
+ carrier_name: "Telecsa S.A."
+ carrier_attribute {
+ mccmnc_tuple: "74002"
+ }
+}
+carrier_id {
+ canonical_id: 1475
+ carrier_name: "Elisa"
+ carrier_attribute {
+ mccmnc_tuple: "24405"
+ mccmnc_tuple: "24421"
+ }
+}
+carrier_id {
+ canonical_id: 1476
+ carrier_name: "Finnet Group"
+ carrier_attribute {
+ mccmnc_tuple: "24409"
+ }
+}
+carrier_id {
+ canonical_id: 1477
+ carrier_name: "Alands Mobiltelefon AB"
+ carrier_attribute {
+ mccmnc_tuple: "24414"
+ }
+}
+carrier_id {
+ canonical_id: 1478
+ carrier_name: "Oy Finland Tele2 AB"
+ carrier_attribute {
+ mccmnc_tuple: "24416"
+ }
+}
+carrier_id {
+ canonical_id: 1480
+ carrier_name: "Telia"
+ carrier_attribute {
+ mccmnc_tuple: "24491"
+ }
+}
+carrier_id {
+ canonical_id: 1481
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "54201"
+ }
+}
+carrier_id {
+ canonical_id: 1482
+ carrier_name: "FSM Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "55001"
+ }
+}
+carrier_id {
+ canonical_id: 1483
+ carrier_name: "Faroese Telecom - GSM"
+ carrier_attribute {
+ mccmnc_tuple: "28801"
+ }
+}
+carrier_id {
+ canonical_id: 1484
+ carrier_name: "Kall GSM"
+ carrier_attribute {
+ mccmnc_tuple: "28802"
+ }
+}
+carrier_id {
+ canonical_id: 1486
+ carrier_name: "Globalstar Europe"
+ carrier_attribute {
+ mccmnc_tuple: "20805"
+ mccmnc_tuple: "20806"
+ mccmnc_tuple: "20807"
+ }
+}
+carrier_id {
+ canonical_id: 1487
+ carrier_name: "Bouygues Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "20820"
+ mccmnc_tuple: "20821"
+ mccmnc_tuple: "20888"
+ }
+}
+carrier_id {
+ canonical_id: 1488
+ carrier_name: "Libertis S.A."
+ carrier_attribute {
+ mccmnc_tuple: "62801"
+ }
+}
+carrier_id {
+ canonical_id: 1489
+ carrier_name: "Telecel Gabon S.A."
+ carrier_attribute {
+ mccmnc_tuple: "62802"
+ }
+}
+carrier_id {
+ canonical_id: 1490
+ carrier_name: "Airtel Gabon"
+ carrier_attribute {
+ mccmnc_tuple: "62803"
+ }
+}
+carrier_id {
+ canonical_id: 1491
+ carrier_name: "Mapesbury Communications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "23401"
+ }
+}
+carrier_id {
+ canonical_id: 1492
+ carrier_name: "O2"
+ carrier_attribute {
+ mccmnc_tuple: "23410"
+ }
+}
+carrier_id {
+ canonical_id: 1493
+ carrier_name: "Jersey Telenet Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "23403"
+ }
+}
+carrier_id {
+ canonical_id: 1494
+ carrier_name: "FMS Solutions Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "23404"
+ }
+}
+carrier_id {
+ canonical_id: 1495
+ carrier_name: "Colt Mobile Telecommunications Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "23405"
+ }
+}
+carrier_id {
+ canonical_id: 1496
+ carrier_name: "Internet One Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "23406"
+ }
+}
+carrier_id {
+ canonical_id: 1497
+ carrier_name: "Cable and Wireless plc"
+ carrier_attribute {
+ mccmnc_tuple: "23407"
+ }
+}
+carrier_id {
+ canonical_id: 1498
+ carrier_name: "Wire9 Telecom plc"
+ carrier_attribute {
+ mccmnc_tuple: "23409"
+ mccmnc_tuple: "23418"
+ }
+}
+carrier_id {
+ canonical_id: 1500
+ carrier_name: "Ntework Rail Infrastructure Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "23412"
+ mccmnc_tuple: "23413"
+ }
+}
+carrier_id {
+ canonical_id: 1501
+ carrier_name: "Hay Systems Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "23414"
+ }
+}
+carrier_id {
+ canonical_id: 1502
+ carrier_name: "Opal Telecom Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "23416"
+ }
+}
+carrier_id {
+ canonical_id: 1503
+ carrier_name: "Flextel Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "23417"
+ }
+}
+carrier_id {
+ canonical_id: 1504
+ carrier_name: "Teleware plc"
+ carrier_attribute {
+ mccmnc_tuple: "23419"
+ }
+}
+carrier_id {
+ canonical_id: 1505
+ carrier_name: "Three Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "23420"
+ mccmnc_tuple: "23494"
+ mccmnc_tuple: "23594"
+ }
+}
+carrier_id {
+ canonical_id: 1506
+ carrier_name: "Jersey Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "23450"
+ }
+}
+carrier_id {
+ canonical_id: 1507
+ carrier_name: "Manx Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "23458"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "23410"
+ gid1: "519"
+ }
+}
+carrier_id {
+ canonical_id: 1508
+ carrier_name: "Inquam Telecom (Holdings) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "23475"
+ }
+}
+carrier_id {
+ canonical_id: 1509
+ carrier_name: "British Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "23400"
+ mccmnc_tuple: "23476"
+ }
+}
+carrier_id {
+ canonical_id: 1510
+ carrier_name: "Airwave mmO2 Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "23478"
+ }
+}
+carrier_id {
+ canonical_id: 1511
+ carrier_name: "Geocell Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "28201"
+ }
+}
+carrier_id {
+ canonical_id: 1512
+ carrier_name: "Magti GSM Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "28202"
+ }
+}
+carrier_id {
+ canonical_id: 1513
+ carrier_name: "Iberiatel Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "28203"
+ }
+}
+carrier_id {
+ canonical_id: 1514
+ carrier_name: "Mobitel Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "28204"
+ }
+}
+carrier_id {
+ canonical_id: 1515
+ carrier_name: "MTN"
+ carrier_attribute {
+ mccmnc_tuple: "62001"
+ }
+}
+carrier_id {
+ canonical_id: 1516
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "62002"
+ spn: "Vodafone GH"
+ }
+}
+carrier_id {
+ canonical_id: 1518
+ carrier_name: "Kasapa Telecom Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "62004"
+ }
+}
+carrier_id {
+ canonical_id: 1519
+ carrier_name: "Telestet"
+ carrier_attribute {
+ mccmnc_tuple: "20210"
+ }
+}
+carrier_id {
+ canonical_id: 1520
+ carrier_name: "Claro GT"
+ carrier_attribute {
+ mccmnc_tuple: "70401"
+ }
+}
+carrier_id {
+ canonical_id: 1521
+ carrier_name: "Comunicaciones Celulares S.A."
+ carrier_attribute {
+ mccmnc_tuple: "70402"
+ }
+}
+carrier_id {
+ canonical_id: 1522
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "70403"
+ mccmnc_tuple: "704030"
+ }
+}
+carrier_id {
+ canonical_id: 1523
+ carrier_name: "Guinétel S.A."
+ carrier_attribute {
+ mccmnc_tuple: "63201"
+ }
+}
+carrier_id {
+ canonical_id: 1524
+ carrier_name: "Spacetel Guiné-Bissau S.A."
+ carrier_attribute {
+ mccmnc_tuple: "63202"
+ }
+}
+carrier_id {
+ canonical_id: 1525
+ carrier_name: "Cel*Star (Guyana) Inc."
+ carrier_attribute {
+ mccmnc_tuple: "73801"
+ }
+}
+carrier_id {
+ canonical_id: 1526
+ carrier_name: "1O1O / csl / Club Sim"
+ carrier_attribute {
+ mccmnc_tuple: "45400"
+ mccmnc_tuple: "45419"
+ }
+}
+carrier_id {
+ canonical_id: 1527
+ carrier_name: "MVNO/CITIC"
+ carrier_attribute {
+ mccmnc_tuple: "45401"
+ }
+}
+carrier_id {
+ canonical_id: 1528
+ carrier_name: "Celtel"
+ carrier_attribute {
+ mccmnc_tuple: "708002"
+ mccmnc_tuple: "70802"
+ mccmnc_tuple: "708020"
+ }
+}
+carrier_id {
+ canonical_id: 1529
+ carrier_name: "Telemach"
+ carrier_attribute {
+ mccmnc_tuple: "21902"
+ }
+}
+carrier_id {
+ canonical_id: 1530
+ carrier_name: "A1/Tomato"
+ carrier_attribute {
+ mccmnc_tuple: "21910"
+ }
+}
+carrier_id {
+ canonical_id: 1531
+ carrier_name: "Comcel"
+ carrier_attribute {
+ mccmnc_tuple: "37201"
+ }
+}
+carrier_id {
+ canonical_id: 1532
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "37202"
+ }
+}
+carrier_id {
+ canonical_id: 1533
+ carrier_name: "Rectel"
+ carrier_attribute {
+ mccmnc_tuple: "37203"
+ }
+}
+carrier_id {
+ canonical_id: 1534
+ carrier_name: "Yettel"
+ carrier_attribute {
+ mccmnc_tuple: "21601"
+ }
+}
+carrier_id {
+ canonical_id: 1535
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "21670"
+ spn: ""
+ spn: "vodafone HU"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21670"
+ imsi_prefix_xpattern: "21670xx2"
+ }
+}
+carrier_id {
+ canonical_id: 1536
+ carrier_name: "PSN"
+ carrier_attribute {
+ mccmnc_tuple: "51000"
+ }
+}
+carrier_id {
+ canonical_id: 1537
+ carrier_name: "Indosat"
+ carrier_attribute {
+ mccmnc_tuple: "51001"
+ }
+}
+carrier_id {
+ canonical_id: 1543
+ carrier_name: "Reliance"
+ carrier_attribute {
+ mccmnc_tuple: "40409"
+ mccmnc_tuple: "40418"
+ mccmnc_tuple: "40436"
+ mccmnc_tuple: "40450"
+ mccmnc_tuple: "40452"
+ mccmnc_tuple: "40467"
+ mccmnc_tuple: "40485"
+ mccmnc_tuple: "40501"
+ mccmnc_tuple: "40503"
+ mccmnc_tuple: "40504"
+ mccmnc_tuple: "40505"
+ mccmnc_tuple: "40506"
+ mccmnc_tuple: "40507"
+ mccmnc_tuple: "40508"
+ mccmnc_tuple: "40509"
+ mccmnc_tuple: "40510"
+ mccmnc_tuple: "40511"
+ mccmnc_tuple: "40512"
+ mccmnc_tuple: "40513"
+ mccmnc_tuple: "40514"
+ mccmnc_tuple: "40515"
+ mccmnc_tuple: "40517"
+ mccmnc_tuple: "40518"
+ mccmnc_tuple: "40519"
+ mccmnc_tuple: "40520"
+ mccmnc_tuple: "40521"
+ mccmnc_tuple: "40522"
+ mccmnc_tuple: "40523"
+ }
+}
+carrier_id {
+ canonical_id: 1545
+ carrier_name: "BPL Mobile Communications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "40421"
+ }
+}
+carrier_id {
+ canonical_id: 1549
+ carrier_name: "Bharat Sanchar Nigam Ltd. (BSNL)"
+ carrier_attribute {
+ mccmnc_tuple: "40434"
+ mccmnc_tuple: "40438"
+ mccmnc_tuple: "40451"
+ mccmnc_tuple: "40453"
+ mccmnc_tuple: "40454"
+ mccmnc_tuple: "40455"
+ mccmnc_tuple: "40457"
+ mccmnc_tuple: "40458"
+ mccmnc_tuple: "40459"
+ mccmnc_tuple: "40462"
+ mccmnc_tuple: "40464"
+ mccmnc_tuple: "40466"
+ mccmnc_tuple: "40471"
+ mccmnc_tuple: "40472"
+ mccmnc_tuple: "40473"
+ mccmnc_tuple: "40474"
+ mccmnc_tuple: "40475"
+ mccmnc_tuple: "40476"
+ mccmnc_tuple: "40477"
+ mccmnc_tuple: "40479"
+ mccmnc_tuple: "40480"
+ mccmnc_tuple: "40481"
+ }
+}
+carrier_id {
+ canonical_id: 1550
+ carrier_name: "RPG Cellular"
+ carrier_attribute {
+ mccmnc_tuple: "40441"
+ }
+}
+carrier_id {
+ canonical_id: 1551
+ carrier_name: "Aircel Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "40442"
+ mccmnc_tuple: "40425"
+ mccmnc_tuple: "40428"
+ mccmnc_tuple: "40429"
+ mccmnc_tuple: "40437"
+ mccmnc_tuple: "40491"
+ mccmnc_tuple: "405800"
+ mccmnc_tuple: "405801"
+ mccmnc_tuple: "405802"
+ mccmnc_tuple: "405803"
+ mccmnc_tuple: "405804"
+ mccmnc_tuple: "405805"
+ mccmnc_tuple: "405806"
+ mccmnc_tuple: "405807"
+ mccmnc_tuple: "405808"
+ mccmnc_tuple: "405809"
+ mccmnc_tuple: "405810"
+ mccmnc_tuple: "405811"
+ mccmnc_tuple: "405812"
+ }
+}
+carrier_id {
+ canonical_id: 1556
+ carrier_name: "Mahanagar Telephone Nigam Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "40468"
+ mccmnc_tuple: "40469"
+ }
+}
+carrier_id {
+ canonical_id: 1559
+ carrier_name: "Reliable Internet Services Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "40483"
+ }
+}
+carrier_id {
+ canonical_id: 1562
+ carrier_name: "IR-MCI (Hamrahe Avval)"
+ carrier_attribute {
+ mccmnc_tuple: "43211"
+ }
+}
+carrier_id {
+ canonical_id: 1563
+ carrier_name: "Telecommunication Kish Co. (KIFZO)"
+ carrier_attribute {
+ mccmnc_tuple: "43214"
+ }
+}
+carrier_id {
+ canonical_id: 1564
+ carrier_name: "MTCE (Espadan)"
+ carrier_attribute {
+ mccmnc_tuple: "43219"
+ }
+}
+carrier_id {
+ canonical_id: 1565
+ carrier_name: "Iceland Telecom Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "27401"
+ }
+}
+carrier_id {
+ canonical_id: 1566
+ carrier_name: "Tal hf"
+ carrier_attribute {
+ mccmnc_tuple: "27402"
+ }
+}
+carrier_id {
+ canonical_id: 1567
+ carrier_name: "Islandssimi GSM ehf"
+ carrier_attribute {
+ mccmnc_tuple: "27403"
+ }
+}
+carrier_id {
+ canonical_id: 1568
+ carrier_name: "IMC Islande ehf"
+ carrier_attribute {
+ mccmnc_tuple: "27404"
+ }
+}
+carrier_id {
+ canonical_id: 1569
+ carrier_name: "IceCell ehf"
+ carrier_attribute {
+ mccmnc_tuple: "27407"
+ }
+}
+carrier_id {
+ canonical_id: 1571
+ carrier_name: "Elsacom"
+ carrier_attribute {
+ mccmnc_tuple: "22202"
+ }
+}
+carrier_id {
+ canonical_id: 1572
+ carrier_name: "IPSE 2000"
+ carrier_attribute {
+ mccmnc_tuple: "22277"
+ }
+}
+carrier_id {
+ canonical_id: 1573
+ carrier_name: "WINDTRE"
+ carrier_attribute {
+ mccmnc_tuple: "22288"
+ }
+}
+carrier_id {
+ canonical_id: 1574
+ carrier_name: "Blu"
+ carrier_attribute {
+ mccmnc_tuple: "22298"
+ }
+}
+carrier_id {
+ canonical_id: 1575
+ carrier_name: "WINDTRE"
+ carrier_attribute {
+ mccmnc_tuple: "22299"
+ }
+}
+carrier_id {
+ canonical_id: 1576
+ carrier_name: "Cable & Wireless Jamaica Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "338020"
+ }
+}
+carrier_id {
+ canonical_id: 1577
+ carrier_name: "Mossel (Jamaica) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "338050"
+ mccmnc_tuple: "33805"
+ }
+}
+carrier_id {
+ canonical_id: 1578
+ carrier_name: "Fastlink"
+ carrier_attribute {
+ mccmnc_tuple: "41601"
+ }
+}
+carrier_id {
+ canonical_id: 1579
+ carrier_name: "Xpress"
+ carrier_attribute {
+ mccmnc_tuple: "41602"
+ }
+}
+carrier_id {
+ canonical_id: 1580
+ carrier_name: "Umniah"
+ carrier_attribute {
+ mccmnc_tuple: "41603"
+ }
+}
+carrier_id {
+ canonical_id: 1581
+ carrier_name: "au"
+ carrier_attribute {
+ mccmnc_tuple: "44050"
+ mccmnc_tuple: "44051"
+ mccmnc_tuple: "44052"
+ mccmnc_tuple: "44054"
+ gid1: "10"
+ }
+}
+carrier_id {
+ canonical_id: 1585
+ carrier_name: "Zain"
+ carrier_attribute {
+ mccmnc_tuple: "41902"
+ }
+}
+carrier_id {
+ canonical_id: 1586
+ carrier_name: "Ooredoo"
+ carrier_attribute {
+ mccmnc_tuple: "41903"
+ }
+}
+carrier_id {
+ canonical_id: 1587
+ carrier_name: "Cable & Wireless (Cayman)"
+ carrier_attribute {
+ mccmnc_tuple: "346140"
+ }
+}
+carrier_id {
+ canonical_id: 1588
+ carrier_name: "Beeline"
+ carrier_attribute {
+ mccmnc_tuple: "40101"
+ }
+}
+carrier_id {
+ canonical_id: 1589
+ carrier_name: "Kcell/activ"
+ carrier_attribute {
+ mccmnc_tuple: "40102"
+ }
+}
+carrier_id {
+ canonical_id: 1590
+ carrier_name: "Lao Telecommunications"
+ carrier_attribute {
+ mccmnc_tuple: "45701"
+ }
+}
+carrier_id {
+ canonical_id: 1591
+ carrier_name: "ETL Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "45702"
+ }
+}
+carrier_id {
+ canonical_id: 1592
+ carrier_name: "Millicom"
+ carrier_attribute {
+ mccmnc_tuple: "45708"
+ }
+}
+carrier_id {
+ canonical_id: 1593
+ carrier_name: "Cellis"
+ carrier_attribute {
+ mccmnc_tuple: "41532"
+ mccmnc_tuple: "41533"
+ mccmnc_tuple: "41534"
+ mccmnc_tuple: "41535"
+ }
+}
+carrier_id {
+ canonical_id: 1594
+ carrier_name: "Libancell"
+ carrier_attribute {
+ mccmnc_tuple: "41536"
+ mccmnc_tuple: "41537"
+ mccmnc_tuple: "41538"
+ mccmnc_tuple: "41539"
+ }
+}
+carrier_id {
+ canonical_id: 1595
+ carrier_name: "Telecom FL AG"
+ carrier_attribute {
+ mccmnc_tuple: "29501"
+ }
+}
+carrier_id {
+ canonical_id: 1596
+ carrier_name: "Viag Europlatform AG"
+ carrier_attribute {
+ mccmnc_tuple: "29502"
+ }
+}
+carrier_id {
+ canonical_id: 1597
+ carrier_name: "Mobilkom (Liechstein) AG"
+ carrier_attribute {
+ mccmnc_tuple: "29505"
+ }
+}
+carrier_id {
+ canonical_id: 1598
+ carrier_name: "Tele2 AG"
+ carrier_attribute {
+ mccmnc_tuple: "29577"
+ }
+}
+carrier_id {
+ canonical_id: 1599
+ carrier_name: "Dialog Sri Lanka"
+ carrier_attribute {
+ mccmnc_tuple: "41302"
+ }
+}
+carrier_id {
+ canonical_id: 1600
+ carrier_name: "Celtel Lanka Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "41303"
+ }
+}
+carrier_id {
+ canonical_id: 1601
+ carrier_name: "Comium Liberia"
+ carrier_attribute {
+ mccmnc_tuple: "61804"
+ }
+}
+carrier_id {
+ canonical_id: 1602
+ carrier_name: "Vodacom Lesotho (pty) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "65101"
+ spn: "Vodacom"
+ }
+}
+carrier_id {
+ canonical_id: 1603
+ carrier_name: "Econet Ezin-cel"
+ carrier_attribute {
+ mccmnc_tuple: "65102"
+ }
+}
+carrier_id {
+ canonical_id: 1604
+ carrier_name: "MTEL d.o.o. Podgorica"
+ carrier_attribute {
+ mccmnc_tuple: "29703"
+ }
+}
+carrier_id {
+ canonical_id: 1605
+ carrier_name: "Airtel Madagascar"
+ carrier_attribute {
+ mccmnc_tuple: "64601"
+ }
+}
+carrier_id {
+ canonical_id: 1606
+ carrier_name: "Orange Madagascar"
+ carrier_attribute {
+ mccmnc_tuple: "64602"
+ }
+}
+carrier_id {
+ canonical_id: 1607
+ carrier_name: "Telecom Malagasy Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "64604"
+ }
+}
+carrier_id {
+ canonical_id: 1608
+ carrier_name: "Cosmofon"
+ carrier_attribute {
+ mccmnc_tuple: "29402"
+ }
+}
+carrier_id {
+ canonical_id: 1609
+ carrier_name: "Nov Operator"
+ carrier_attribute {
+ mccmnc_tuple: "29403"
+ }
+}
+carrier_id {
+ canonical_id: 1610
+ carrier_name: "Malitel"
+ carrier_attribute {
+ mccmnc_tuple: "61001"
+ }
+}
+carrier_id {
+ canonical_id: 1611
+ carrier_name: "Myanmar Post and Telecommunication"
+ carrier_attribute {
+ mccmnc_tuple: "41401"
+ }
+}
+carrier_id {
+ canonical_id: 1612
+ carrier_name: "Mobicom"
+ carrier_attribute {
+ mccmnc_tuple: "42899"
+ }
+}
+carrier_id {
+ canonical_id: 1613
+ carrier_name: "Smartone Mobile Communications (Macao) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "45500"
+ }
+}
+carrier_id {
+ canonical_id: 1614
+ carrier_name: "CTM"
+ carrier_attribute {
+ mccmnc_tuple: "45501"
+ mccmnc_tuple: "45504"
+ }
+}
+carrier_id {
+ canonical_id: 1615
+ carrier_name: "Hutchison Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "45503"
+ }
+}
+carrier_id {
+ canonical_id: 1616
+ carrier_name: "Mattel S.A."
+ carrier_attribute {
+ mccmnc_tuple: "60901"
+ }
+}
+carrier_id {
+ canonical_id: 1617
+ carrier_name: "Chinguitel S.A."
+ carrier_attribute {
+ mccmnc_tuple: "60902"
+ }
+}
+carrier_id {
+ canonical_id: 1618
+ carrier_name: "Mauritel Mobiles"
+ carrier_attribute {
+ mccmnc_tuple: "60910"
+ }
+}
+carrier_id {
+ canonical_id: 1619
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "27801"
+ spn: "vodafone MT"
+ }
+}
+carrier_id {
+ canonical_id: 1620
+ carrier_name: "go mobile"
+ carrier_attribute {
+ mccmnc_tuple: "27821"
+ }
+}
+carrier_id {
+ canonical_id: 1621
+ carrier_name: "Orange Mauritius"
+ carrier_attribute {
+ mccmnc_tuple: "61701"
+ }
+}
+carrier_id {
+ canonical_id: 1622
+ carrier_name: "Mahanagar Telephone (Mauritius) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "61702"
+ }
+}
+carrier_id {
+ canonical_id: 1623
+ carrier_name: "Emtel"
+ carrier_attribute {
+ mccmnc_tuple: "61710"
+ }
+}
+carrier_id {
+ canonical_id: 1624
+ carrier_name: "DhiMobile"
+ carrier_attribute {
+ mccmnc_tuple: "47201"
+ }
+}
+carrier_id {
+ canonical_id: 1625
+ carrier_name: "Telekom Network Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "65001"
+ }
+}
+carrier_id {
+ canonical_id: 1626
+ carrier_name: "Airtel Malawi"
+ carrier_attribute {
+ mccmnc_tuple: "65010"
+ }
+}
+carrier_id {
+ canonical_id: 1627
+ carrier_name: "Art900"
+ carrier_attribute {
+ mccmnc_tuple: "50200"
+ }
+}
+carrier_id {
+ canonical_id: 1628
+ carrier_name: "Maxis/Hotlink"
+ carrier_attribute {
+ mccmnc_tuple: "50212"
+ }
+}
+carrier_id {
+ canonical_id: 1630
+ carrier_name: "Digi"
+ carrier_attribute {
+ mccmnc_tuple: "50210"
+ mccmnc_tuple: "502143"
+ mccmnc_tuple: "502146"
+ mccmnc_tuple: "50216"
+ }
+}
+carrier_id {
+ canonical_id: 1631
+ carrier_name: "TimeCel"
+ carrier_attribute {
+ mccmnc_tuple: "50217"
+ }
+}
+carrier_id {
+ canonical_id: 1632
+ carrier_name: "U Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "50218"
+ }
+}
+carrier_id {
+ canonical_id: 1633
+ carrier_name: "Celcom"
+ carrier_attribute {
+ mccmnc_tuple: "50213"
+ mccmnc_tuple: "50219"
+ }
+}
+carrier_id {
+ canonical_id: 1634
+ carrier_name: "T.D.M. GSM"
+ carrier_attribute {
+ mccmnc_tuple: "64301"
+ }
+}
+carrier_id {
+ canonical_id: 1635
+ carrier_name: "Vodacom"
+ carrier_attribute {
+ mccmnc_tuple: "64304"
+ spn: "Vodacom"
+ }
+}
+carrier_id {
+ canonical_id: 1636
+ carrier_name: "Sahel.Com"
+ carrier_attribute {
+ mccmnc_tuple: "61401"
+ }
+}
+carrier_id {
+ canonical_id: 1637
+ carrier_name: "Telecel"
+ carrier_attribute {
+ mccmnc_tuple: "61403"
+ }
+}
+carrier_id {
+ canonical_id: 1638
+ carrier_name: "Airtel Nigeria"
+ carrier_attribute {
+ mccmnc_tuple: "62120"
+ }
+}
+carrier_id {
+ canonical_id: 1639
+ carrier_name: "MTN Nigeria Communications"
+ carrier_attribute {
+ mccmnc_tuple: "62130"
+ }
+}
+carrier_id {
+ canonical_id: 1640
+ carrier_name: "Nigeria Telecommunications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "62140"
+ }
+}
+carrier_id {
+ canonical_id: 1641
+ carrier_name: "Claro NI"
+ carrier_attribute {
+ mccmnc_tuple: "71021"
+ }
+}
+carrier_id {
+ canonical_id: 1642
+ carrier_name: "Servicios de Comunicaciones, S.A. (SERCOM)"
+ carrier_attribute {
+ mccmnc_tuple: "71073"
+ mccmnc_tuple: "710730"
+ }
+}
+carrier_id {
+ canonical_id: 1644
+ carrier_name: "KPN Mobiel"
+ carrier_attribute {
+ mccmnc_tuple: "20408"
+ mccmnc_tuple: "20412"
+ }
+}
+carrier_id {
+ canonical_id: 1646
+ carrier_name: "NS Railinfrabeheer B.V."
+ carrier_attribute {
+ mccmnc_tuple: "20421"
+ }
+}
+carrier_id {
+ canonical_id: 1647
+ carrier_name: "Claro PE"
+ carrier_attribute {
+ mccmnc_tuple: "71610"
+ }
+}
+carrier_id {
+ canonical_id: 1648
+ carrier_name: "Tikiphone"
+ carrier_attribute {
+ mccmnc_tuple: "54720"
+ }
+}
+carrier_id {
+ canonical_id: 1649
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "53701"
+ mccmnc_tuple: "53702"
+ }
+}
+carrier_id {
+ canonical_id: 1651
+ carrier_name: "Digicel Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "53703"
+ }
+}
+carrier_id {
+ canonical_id: 1652
+ carrier_name: "Islacom"
+ carrier_attribute {
+ mccmnc_tuple: "51501"
+ }
+}
+carrier_id {
+ canonical_id: 1653
+ carrier_name: "Globe Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "51502"
+ }
+}
+carrier_id {
+ canonical_id: 1654
+ carrier_name: "Smart Communications"
+ carrier_attribute {
+ mccmnc_tuple: "51503"
+ }
+}
+carrier_id {
+ canonical_id: 1655
+ carrier_name: "Smart"
+ carrier_attribute {
+ mccmnc_tuple: "51503"
+ imsi_prefix_xpattern: "5150363"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "51505"
+ }
+}
+carrier_id {
+ canonical_id: 1656
+ carrier_name: "Jazz"
+ carrier_attribute {
+ mccmnc_tuple: "41001"
+ mccmnc_tuple: "41007"
+ }
+}
+carrier_id {
+ canonical_id: 1657
+ carrier_name: "PAK Telecom Mobile Ltd. (UFONE)"
+ carrier_attribute {
+ mccmnc_tuple: "41003"
+ }
+}
+carrier_id {
+ canonical_id: 1658
+ carrier_name: "Plus"
+ carrier_attribute {
+ mccmnc_tuple: "26001"
+ }
+}
+carrier_id {
+ canonical_id: 1659
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "26003"
+ }
+}
+carrier_id {
+ canonical_id: 1660
+ carrier_name: "Tele2 Polska (Tele2 Polska Sp. Z.o.o.)"
+ carrier_attribute {
+ mccmnc_tuple: "26004"
+ }
+}
+carrier_id {
+ canonical_id: 1661
+ carrier_name: "IDEA (UMTS)/PTK Centertel sp. Z.o.o."
+ carrier_attribute {
+ mccmnc_tuple: "26005"
+ }
+}
+carrier_id {
+ canonical_id: 1662
+ carrier_name: "PLAY"
+ carrier_attribute {
+ mccmnc_tuple: "26006"
+ }
+}
+carrier_id {
+ canonical_id: 1663
+ carrier_name: "Premium internet"
+ carrier_attribute {
+ mccmnc_tuple: "26007"
+ }
+}
+carrier_id {
+ canonical_id: 1664
+ carrier_name: "E-Telko"
+ carrier_attribute {
+ mccmnc_tuple: "26008"
+ }
+}
+carrier_id {
+ canonical_id: 1665
+ carrier_name: "Telekomunikacja Kolejowa (GSM-R)"
+ carrier_attribute {
+ mccmnc_tuple: "26009"
+ }
+}
+carrier_id {
+ canonical_id: 1666
+ carrier_name: "Telefony Opalenickie"
+ carrier_attribute {
+ mccmnc_tuple: "26010"
+ }
+}
+carrier_id {
+ canonical_id: 1667
+ carrier_name: "St. Pierre-et-Miquelon Télécom"
+ carrier_attribute {
+ mccmnc_tuple: "30801"
+ }
+}
+carrier_id {
+ canonical_id: 1668
+ carrier_name: "NOS"
+ carrier_attribute {
+ mccmnc_tuple: "26803"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "26897"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "26898"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "26899"
+ }
+}
+carrier_id {
+ canonical_id: 1669
+ carrier_name: "Oniway - Inforcomunicaçôes, S.A."
+ carrier_attribute {
+ mccmnc_tuple: "26805"
+ }
+}
+carrier_id {
+ canonical_id: 1670
+ carrier_name: "MEO"
+ carrier_attribute {
+ mccmnc_tuple: "26802"
+ mccmnc_tuple: "26806"
+ mccmnc_tuple: "26880"
+ }
+}
+carrier_id {
+ canonical_id: 1671
+ carrier_name: "Palau National Communications Corp. (a.k.a. PNCC)"
+ carrier_attribute {
+ mccmnc_tuple: "55201"
+ }
+}
+carrier_id {
+ canonical_id: 1672
+ carrier_name: "Hola Paraguay S.A."
+ carrier_attribute {
+ mccmnc_tuple: "74401"
+ mccmnc_tuple: "74406"
+ }
+}
+carrier_id {
+ canonical_id: 1673
+ carrier_name: "Claro PY"
+ carrier_attribute {
+ mccmnc_tuple: "74402"
+ }
+}
+carrier_id {
+ canonical_id: 1674
+ carrier_name: "Compañia Privada de Comunicaciones S.A."
+ carrier_attribute {
+ mccmnc_tuple: "74403"
+ }
+}
+carrier_id {
+ canonical_id: 1675
+ carrier_name: "Ooredoo"
+ carrier_attribute {
+ mccmnc_tuple: "42701"
+ }
+}
+carrier_id {
+ canonical_id: 1676
+ carrier_name: "Orange La Réunion"
+ carrier_attribute {
+ mccmnc_tuple: "64700"
+ }
+}
+carrier_id {
+ canonical_id: 1677
+ carrier_name: "Telco OI"
+ carrier_attribute {
+ mccmnc_tuple: "64702"
+ }
+}
+carrier_id {
+ canonical_id: 1678
+ carrier_name: "МТС"
+ carrier_attribute {
+ mccmnc_tuple: "25001"
+ }
+}
+carrier_id {
+ canonical_id: 1679
+ carrier_name: "Printelefone"
+ carrier_attribute {
+ mccmnc_tuple: "25092"
+ }
+}
+carrier_id {
+ canonical_id: 1680
+ carrier_name: "Telecom XXI"
+ carrier_attribute {
+ mccmnc_tuple: "25093"
+ }
+}
+carrier_id {
+ canonical_id: 1681
+ carrier_name: "Билайн"
+ carrier_attribute {
+ mccmnc_tuple: "25099"
+ }
+}
+carrier_id {
+ canonical_id: 1682
+ carrier_name: "MTN Rwandacell"
+ carrier_attribute {
+ mccmnc_tuple: "63510"
+ }
+}
+carrier_id {
+ canonical_id: 1683
+ carrier_name: "STC"
+ carrier_attribute {
+ mccmnc_tuple: "42001"
+ }
+}
+carrier_id {
+ canonical_id: 1684
+ carrier_name: "Mobily"
+ carrier_attribute {
+ mccmnc_tuple: "42003"
+ }
+}
+carrier_id {
+ canonical_id: 1685
+ carrier_name: "Cable & Wireless (Seychelles) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "63301"
+ }
+}
+carrier_id {
+ canonical_id: 1686
+ carrier_name: "Mediatech International Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "63302"
+ }
+}
+carrier_id {
+ canonical_id: 1687
+ carrier_name: "Airtel Seychelles"
+ carrier_attribute {
+ mccmnc_tuple: "63310"
+ }
+}
+carrier_id {
+ canonical_id: 1688
+ carrier_name: "SD Mobitel"
+ carrier_attribute {
+ mccmnc_tuple: "63401"
+ }
+}
+carrier_id {
+ canonical_id: 1689
+ carrier_name: "Areeba-Sudan"
+ carrier_attribute {
+ mccmnc_tuple: "63402"
+ }
+}
+carrier_id {
+ canonical_id: 1690
+ carrier_name: "Telia Sverige AB"
+ carrier_attribute {
+ mccmnc_tuple: "24001"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "24005"
+ spn: "Telia"
+ }
+}
+carrier_id {
+ canonical_id: 1691
+ carrier_name: "3 (Hi3G Access AB)"
+ carrier_attribute {
+ mccmnc_tuple: "24002"
+ }
+}
+carrier_id {
+ canonical_id: 1692
+ carrier_name: "Nordisk Mobiltelefon AS"
+ carrier_attribute {
+ mccmnc_tuple: "24003"
+ }
+}
+carrier_id {
+ canonical_id: 1693
+ carrier_name: "3G Infrastructure Services AB"
+ carrier_attribute {
+ mccmnc_tuple: "24004"
+ }
+}
+carrier_id {
+ canonical_id: 1694
+ carrier_name: "Svenska UMTS-Nät AB"
+ carrier_attribute {
+ mccmnc_tuple: "24005"
+ }
+}
+carrier_id {
+ canonical_id: 1695
+ carrier_name: "Telenor Sverige AB"
+ carrier_attribute {
+ mccmnc_tuple: "24008"
+ }
+}
+carrier_id {
+ canonical_id: 1696
+ carrier_name: "Tele2/Comviq Sverige/Com Hem"
+ carrier_attribute {
+ mccmnc_tuple: "24007"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "24024"
+ spn: "Tele2"
+ }
+}
+carrier_id {
+ canonical_id: 1697
+ carrier_name: "Spring Mobil AB"
+ carrier_attribute {
+ mccmnc_tuple: "24010"
+ }
+}
+carrier_id {
+ canonical_id: 1698
+ carrier_name: "Linholmen Science Park AB"
+ carrier_attribute {
+ mccmnc_tuple: "24011"
+ }
+}
+carrier_id {
+ canonical_id: 1699
+ carrier_name: "Barablu Mobile Scandinavia Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "24012"
+ }
+}
+carrier_id {
+ canonical_id: 1700
+ carrier_name: "Ventelo Sverige AB"
+ carrier_attribute {
+ mccmnc_tuple: "24013"
+ }
+}
+carrier_id {
+ canonical_id: 1701
+ carrier_name: "TDC Mobil A/S"
+ carrier_attribute {
+ mccmnc_tuple: "24014"
+ }
+}
+carrier_id {
+ canonical_id: 1702
+ carrier_name: "Wireless Maingate Nordic AB"
+ carrier_attribute {
+ mccmnc_tuple: "24015"
+ }
+}
+carrier_id {
+ canonical_id: 1703
+ carrier_name: "42IT AB"
+ carrier_attribute {
+ mccmnc_tuple: "24016"
+ }
+}
+carrier_id {
+ canonical_id: 1704
+ carrier_name: "Wireless Maingate Message Services AB"
+ carrier_attribute {
+ mccmnc_tuple: "24020"
+ }
+}
+carrier_id {
+ canonical_id: 1705
+ carrier_name: "Banverket"
+ carrier_attribute {
+ mccmnc_tuple: "24021"
+ }
+}
+carrier_id {
+ canonical_id: 1706
+ carrier_name: "M1"
+ carrier_attribute {
+ mccmnc_tuple: "52503"
+ }
+}
+carrier_id {
+ canonical_id: 1707
+ carrier_name: "StarHub"
+ carrier_attribute {
+ mccmnc_tuple: "52505"
+ }
+}
+carrier_id {
+ canonical_id: 1708
+ carrier_name: "Digital Trunked Radio Network"
+ carrier_attribute {
+ mccmnc_tuple: "52512"
+ }
+}
+carrier_id {
+ canonical_id: 1709
+ carrier_name: "SI Mobil"
+ carrier_attribute {
+ mccmnc_tuple: "29340"
+ }
+}
+carrier_id {
+ canonical_id: 1710
+ carrier_name: "Telekom Slovenije"
+ carrier_attribute {
+ mccmnc_tuple: "29341"
+ }
+}
+carrier_id {
+ canonical_id: 1711
+ carrier_name: "T-2 d.o.o."
+ carrier_attribute {
+ mccmnc_tuple: "29364"
+ }
+}
+carrier_id {
+ canonical_id: 1712
+ carrier_name: "Tusmobil d.o.o."
+ carrier_attribute {
+ mccmnc_tuple: "29370"
+ }
+}
+carrier_id {
+ canonical_id: 1713
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "23101"
+ spn: "Orange"
+ }
+}
+carrier_id {
+ canonical_id: 1714
+ carrier_name: "Eurotel, UMTS"
+ carrier_attribute {
+ mccmnc_tuple: "23104"
+ }
+}
+carrier_id {
+ canonical_id: 1715
+ carrier_name: "Orange, UMTS"
+ carrier_attribute {
+ mccmnc_tuple: "23105"
+ }
+}
+carrier_id {
+ canonical_id: 1716
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "61901"
+ }
+}
+carrier_id {
+ canonical_id: 1717
+ carrier_name: "Millicom"
+ carrier_attribute {
+ mccmnc_tuple: "61902"
+ }
+}
+carrier_id {
+ canonical_id: 1718
+ carrier_name: "Africell"
+ carrier_attribute {
+ mccmnc_tuple: "61903"
+ }
+}
+carrier_id {
+ canonical_id: 1719
+ carrier_name: "Dtatel (SL) Ltd CDMA"
+ carrier_attribute {
+ mccmnc_tuple: "61950"
+ }
+}
+carrier_id {
+ canonical_id: 1720
+ carrier_name: "SMT - San Marino Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "29201"
+ }
+}
+carrier_id {
+ canonical_id: 1721
+ carrier_name: "Orange Senegal"
+ carrier_attribute {
+ mccmnc_tuple: "60801"
+ }
+}
+carrier_id {
+ canonical_id: 1722
+ carrier_name: "Sentel GSM"
+ carrier_attribute {
+ mccmnc_tuple: "60802"
+ }
+}
+carrier_id {
+ canonical_id: 1723
+ carrier_name: "ACT Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "52015"
+ }
+}
+carrier_id {
+ canonical_id: 1724
+ carrier_name: "JC Somoncom"
+ carrier_attribute {
+ mccmnc_tuple: "43601"
+ }
+}
+carrier_id {
+ canonical_id: 1725
+ carrier_name: "CJSC Indigo Tajikistan"
+ carrier_attribute {
+ mccmnc_tuple: "43602"
+ }
+}
+carrier_id {
+ canonical_id: 1726
+ carrier_name: "TT mobile"
+ carrier_attribute {
+ mccmnc_tuple: "43603"
+ }
+}
+carrier_id {
+ canonical_id: 1727
+ carrier_name: "Josa Babilon-T"
+ carrier_attribute {
+ mccmnc_tuple: "43604"
+ }
+}
+carrier_id {
+ canonical_id: 1728
+ carrier_name: "CTJTHSC Tajik-tel"
+ carrier_attribute {
+ mccmnc_tuple: "43605"
+ }
+}
+carrier_id {
+ canonical_id: 1729
+ carrier_name: "Barash Communication Technologies (BCTI)"
+ carrier_attribute {
+ mccmnc_tuple: "43801"
+ }
+}
+carrier_id {
+ canonical_id: 1730
+ carrier_name: "TM-Cell"
+ carrier_attribute {
+ mccmnc_tuple: "43802"
+ }
+}
+carrier_id {
+ canonical_id: 1731
+ carrier_name: "Tunisie Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "60502"
+ }
+}
+carrier_id {
+ canonical_id: 1732
+ carrier_name: "Ooredoo Tunisia"
+ carrier_attribute {
+ mccmnc_tuple: "60503"
+ }
+}
+carrier_id {
+ canonical_id: 1733
+ carrier_name: "Tonga Communications Corporation"
+ carrier_attribute {
+ mccmnc_tuple: "53901"
+ }
+}
+carrier_id {
+ canonical_id: 1734
+ carrier_name: "Shoreline Communication"
+ carrier_attribute {
+ mccmnc_tuple: "53943"
+ }
+}
+carrier_id {
+ canonical_id: 1735
+ carrier_name: "Paycell | Turkcell"
+ carrier_attribute {
+ mccmnc_tuple: "28601"
+ }
+}
+carrier_id {
+ canonical_id: 1736
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "28602"
+ }
+}
+carrier_id {
+ canonical_id: 1737
+ carrier_name: "Türk Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "28603"
+ mccmnc_tuple: "28604"
+ }
+}
+carrier_id {
+ canonical_id: 1739
+ carrier_name: "TSTT Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "37412"
+ mccmnc_tuple: "374122"
+ mccmnc_tuple: "374123"
+ mccmnc_tuple: "374124"
+ mccmnc_tuple: "374125"
+ mccmnc_tuple: "374126"
+ mccmnc_tuple: "374127"
+ mccmnc_tuple: "374128"
+ mccmnc_tuple: "374129"
+ }
+}
+carrier_id {
+ canonical_id: 1740
+ carrier_name: "Digicel Trinidad and Tobago Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "374130"
+ mccmnc_tuple: "37413"
+ }
+}
+carrier_id {
+ canonical_id: 1741
+ carrier_name: "LaqTel Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "374140"
+ }
+}
+carrier_id {
+ canonical_id: 1742
+ carrier_name: "TIGO"
+ carrier_attribute {
+ mccmnc_tuple: "64002"
+ }
+}
+carrier_id {
+ canonical_id: 1743
+ carrier_name: "Zantel"
+ carrier_attribute {
+ mccmnc_tuple: "64003"
+ }
+}
+carrier_id {
+ canonical_id: 1744
+ carrier_name: "Vodacom (T) Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "64004"
+ spn: "VodaCom Tanzania"
+ }
+}
+carrier_id {
+ canonical_id: 1745
+ carrier_name: "Airtel"
+ carrier_attribute {
+ mccmnc_tuple: "64005"
+ }
+}
+carrier_id {
+ canonical_id: 1746
+ carrier_name: "Ukrainian Mobile Communication, UMC"
+ carrier_attribute {
+ mccmnc_tuple: "25501"
+ }
+}
+carrier_id {
+ canonical_id: 1747
+ carrier_name: "Kyivstar GSM"
+ carrier_attribute {
+ mccmnc_tuple: "25503"
+ }
+}
+carrier_id {
+ canonical_id: 1748
+ carrier_name: "International Telecommunications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "25504"
+ }
+}
+carrier_id {
+ canonical_id: 1749
+ carrier_name: "Golden Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "25505"
+ }
+}
+carrier_id {
+ canonical_id: 1750
+ carrier_name: "Astelit"
+ carrier_attribute {
+ mccmnc_tuple: "25506"
+ }
+}
+carrier_id {
+ canonical_id: 1751
+ carrier_name: "Ukrtelecom"
+ carrier_attribute {
+ mccmnc_tuple: "25507"
+ }
+}
+carrier_id {
+ canonical_id: 1752
+ carrier_name: "CJSC - Telesystems of Ukraine"
+ carrier_attribute {
+ mccmnc_tuple: "25521"
+ }
+}
+carrier_id {
+ canonical_id: 1753
+ carrier_name: "Airtel Uganda"
+ carrier_attribute {
+ mccmnc_tuple: "64101"
+ mccmnc_tuple: "64122"
+ }
+}
+carrier_id {
+ canonical_id: 1754
+ carrier_name: "MTN Uganda Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "64110"
+ }
+}
+carrier_id {
+ canonical_id: 1755
+ carrier_name: "Uganda Telecom Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "64111"
+ }
+}
+carrier_id {
+ canonical_id: 1756
+ carrier_name: "House of Integrated Technology and Systems Uganda Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "64114"
+ }
+}
+carrier_id {
+ canonical_id: 1758
+ carrier_name: "ICO Global Communications"
+ carrier_attribute {
+ mccmnc_tuple: "90101"
+ }
+}
+carrier_id {
+ canonical_id: 1759
+ carrier_name: "Sense Communications International AS"
+ carrier_attribute {
+ mccmnc_tuple: "90102"
+ }
+}
+carrier_id {
+ canonical_id: 1760
+ carrier_name: "Ellipso"
+ carrier_attribute {
+ mccmnc_tuple: "90107"
+ }
+}
+carrier_id {
+ canonical_id: 1761
+ carrier_name: "Tele1 Europe"
+ carrier_attribute {
+ mccmnc_tuple: "90109"
+ }
+}
+carrier_id {
+ canonical_id: 1762
+ carrier_name: "Asia Cellular Satellite (AceS)"
+ carrier_attribute {
+ mccmnc_tuple: "90110"
+ }
+}
+carrier_id {
+ canonical_id: 1763
+ carrier_name: "Inmarsat Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "90111"
+ }
+}
+carrier_id {
+ canonical_id: 1764
+ carrier_name: "Maritime Communications Partner AS (MCP network)"
+ carrier_attribute {
+ mccmnc_tuple: "90112"
+ }
+}
+carrier_id {
+ canonical_id: 1765
+ carrier_name: "Global Networks, Inc."
+ carrier_attribute {
+ mccmnc_tuple: "90113"
+ }
+}
+carrier_id {
+ canonical_id: 1766
+ carrier_name: "Telenor GSM - services in aircraft"
+ carrier_attribute {
+ mccmnc_tuple: "90114"
+ }
+}
+carrier_id {
+ canonical_id: 1767
+ carrier_name: "SITA GSM services in aircraft (On Air)"
+ carrier_attribute {
+ mccmnc_tuple: "90115"
+ }
+}
+carrier_id {
+ canonical_id: 1768
+ carrier_name: "Jasper Systems, Inc."
+ carrier_attribute {
+ mccmnc_tuple: "90116"
+ }
+}
+carrier_id {
+ canonical_id: 1769
+ carrier_name: "Jersey Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "90117"
+ }
+}
+carrier_id {
+ canonical_id: 1770
+ carrier_name: "AT&T Mobility (Wireless Maritime Services)"
+ carrier_attribute {
+ mccmnc_tuple: "90118"
+ }
+}
+carrier_id {
+ canonical_id: 1771
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "90119"
+ }
+}
+carrier_id {
+ canonical_id: 1772
+ carrier_name: "Intermatica"
+ carrier_attribute {
+ mccmnc_tuple: "90120"
+ }
+}
+carrier_id {
+ canonical_id: 1773
+ carrier_name: "Seanet Maritime Communications"
+ carrier_attribute {
+ mccmnc_tuple: "90121"
+ }
+}
+carrier_id {
+ canonical_id: 1774
+ carrier_name: "Denver Consultants Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "90122"
+ }
+}
+carrier_id {
+ canonical_id: 1775
+ carrier_name: "Telecommunications for Disaster Relief (TDR) (OCHA)"
+ carrier_attribute {
+ mccmnc_tuple: "90188"
+ }
+}
+carrier_id {
+ canonical_id: 1776
+ carrier_name: "MCI"
+ carrier_attribute {
+ mccmnc_tuple: "310010"
+ }
+}
+carrier_id {
+ canonical_id: 1778
+ carrier_name: "Mobile Tel Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310013"
+ }
+}
+carrier_id {
+ canonical_id: 1779
+ carrier_name: "Cricket Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310150"
+ }
+}
+carrier_id {
+ canonical_id: 1780
+ carrier_name: "North Sight Communications Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310017"
+ }
+}
+carrier_id {
+ canonical_id: 1781
+ carrier_name: "Union Telephone Company"
+ carrier_attribute {
+ mccmnc_tuple: "310020"
+ }
+}
+carrier_id {
+ canonical_id: 1783
+ carrier_name: "Nevada Wireless LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310034"
+ }
+}
+carrier_id {
+ canonical_id: 1784
+ carrier_name: "MTA Communications dba MTA Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310040"
+ }
+}
+carrier_id {
+ canonical_id: 1785
+ carrier_name: "ACS Wireless Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310050"
+ }
+}
+carrier_id {
+ canonical_id: 1787
+ carrier_name: "Pacific Telecom Inc"
+ carrier_attribute {
+ mccmnc_tuple: "310110"
+ }
+}
+carrier_id {
+ canonical_id: 1788
+ carrier_name: "Sprint"
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ mccmnc_tuple: "312530"
+ }
+}
+carrier_id {
+ canonical_id: 1789
+ carrier_name: "Carolina West Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310130"
+ }
+}
+carrier_id {
+ canonical_id: 1790
+ carrier_name: "GTA Wireless LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310140"
+ }
+}
+carrier_id {
+ canonical_id: 1792
+ carrier_name: "West Central Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310180"
+ }
+}
+carrier_id {
+ canonical_id: 1793
+ carrier_name: "Alaska Wireless Communications LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310190"
+ }
+}
+carrier_id {
+ canonical_id: 1795
+ carrier_name: "Nep Cellcorp Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310290"
+ }
+}
+carrier_id {
+ canonical_id: 1796
+ carrier_name: "Smith Bagley Inc, dba Cellular One"
+ carrier_attribute {
+ mccmnc_tuple: "310320"
+ }
+}
+carrier_id {
+ canonical_id: 1797
+ carrier_name: "AN Subsidiary LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310330"
+ }
+}
+carrier_id {
+ canonical_id: 1798
+ carrier_name: "Wireless Solutions International"
+ carrier_attribute {
+ mccmnc_tuple: "310550"
+ }
+}
+carrier_id {
+ canonical_id: 1800
+ carrier_name: "MTPCS LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310570"
+ }
+}
+carrier_id {
+ canonical_id: 1802
+ carrier_name: "cellcom"
+ carrier_attribute {
+ mccmnc_tuple: "310600"
+ gid1: "BA00040000000000"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "311480"
+ gid1: "BA00040000000000"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "311850"
+ gid1: "BA00040000000000"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "311840"
+ gid1: "c1000000"
+ }
+}
+carrier_id {
+ canonical_id: 1803
+ carrier_name: "Elkhart Telephone Co. Inc. dba Epic Touch Co."
+ carrier_attribute {
+ mccmnc_tuple: "310610"
+ }
+}
+carrier_id {
+ canonical_id: 1804
+ carrier_name: "Coleman County Telecommunications Inc. (Trans Texas PCS)"
+ carrier_attribute {
+ mccmnc_tuple: "310620"
+ }
+}
+carrier_id {
+ canonical_id: 1806
+ carrier_name: "Jasper Wireless Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310650"
+ }
+}
+carrier_id {
+ canonical_id: 1807
+ carrier_name: "AT&T Mobility Vanguard Services"
+ carrier_attribute {
+ mccmnc_tuple: "310670"
+ }
+}
+carrier_id {
+ canonical_id: 1808
+ carrier_name: "Limitless Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "310690"
+ }
+}
+carrier_id {
+ canonical_id: 1809
+ carrier_name: "Cross Valiant Cellular Partnership"
+ carrier_attribute {
+ mccmnc_tuple: "310700"
+ }
+}
+carrier_id {
+ canonical_id: 1810
+ carrier_name: "Arctic Slopo Telephone Association Cooperative"
+ carrier_attribute {
+ mccmnc_tuple: "310710"
+ }
+}
+carrier_id {
+ canonical_id: 1811
+ carrier_name: "Wireless Solutions International Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310720"
+ }
+}
+carrier_id {
+ canonical_id: 1812
+ carrier_name: "Sea Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "310730"
+ }
+}
+carrier_id {
+ canonical_id: 1813
+ carrier_name: "East Kentucky Network LLC dba Appalachian Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310750"
+ }
+}
+carrier_id {
+ canonical_id: 1814
+ carrier_name: "Panhandle Telecommunications Systems Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310760"
+ }
+}
+carrier_id {
+ canonical_id: 1815
+ carrier_name: "Iowa Wireless Services LLC dba I Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310770"
+ }
+}
+carrier_id {
+ canonical_id: 1816
+ carrier_name: "Connect Net Inc"
+ carrier_attribute {
+ mccmnc_tuple: "310780"
+ }
+}
+carrier_id {
+ canonical_id: 1817
+ carrier_name: "PinPoint Communications Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310790"
+ }
+}
+carrier_id {
+ canonical_id: 1818
+ carrier_name: "Brazos Cellular Communications Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "310810"
+ }
+}
+carrier_id {
+ canonical_id: 1819
+ carrier_name: "South Canaan Cellular Communications Co. LP"
+ carrier_attribute {
+ mccmnc_tuple: "310820"
+ }
+}
+carrier_id {
+ canonical_id: 1820
+ carrier_name: "Caprock Cellular Ltd. Partnership"
+ carrier_attribute {
+ mccmnc_tuple: "310830"
+ }
+}
+carrier_id {
+ canonical_id: 1821
+ carrier_name: "Edge Mobile LLC"
+ carrier_attribute {
+ mccmnc_tuple: "310840"
+ }
+}
+carrier_id {
+ canonical_id: 1822
+ carrier_name: "Aeris Communications, Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310850"
+ }
+}
+carrier_id {
+ canonical_id: 1823
+ carrier_name: "TX RSA 15B2, LP dba Five Star Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310860"
+ }
+}
+carrier_id {
+ canonical_id: 1824
+ carrier_name: "Kaplan Telephone Company Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310870"
+ }
+}
+carrier_id {
+ canonical_id: 1825
+ carrier_name: "Advantage Cellular Systems, Inc."
+ carrier_attribute {
+ mccmnc_tuple: "310880"
+ }
+}
+carrier_id {
+ canonical_id: 1827
+ carrier_name: "Mid-Rivers"
+ carrier_attribute {
+ mccmnc_tuple: "310900"
+ }
+}
+carrier_id {
+ canonical_id: 1828
+ carrier_name: "Southern IL RSA Partnership dba First Cellular of Southern Illinois"
+ carrier_attribute {
+ mccmnc_tuple: "310910"
+ }
+}
+carrier_id {
+ canonical_id: 1829
+ carrier_name: "James Valley"
+ carrier_attribute {
+ mccmnc_tuple: "310920"
+ }
+}
+carrier_id {
+ canonical_id: 1830
+ carrier_name: "Copper Valley Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310930"
+ mccmnc_tuple: "312380"
+ }
+}
+carrier_id {
+ canonical_id: 1831
+ carrier_name: "PetroCom LLC"
+ carrier_attribute {
+ mccmnc_tuple: "311170"
+ }
+}
+carrier_id {
+ canonical_id: 1833
+ carrier_name: "Cellular Properties Inc."
+ carrier_attribute {
+ mccmnc_tuple: "311190"
+ }
+}
+carrier_id {
+ canonical_id: 1834
+ carrier_name: "ARINC"
+ carrier_attribute {
+ mccmnc_tuple: "311200"
+ }
+}
+carrier_id {
+ canonical_id: 1835
+ carrier_name: "Farmers Cellular Telephone"
+ carrier_attribute {
+ mccmnc_tuple: "311210"
+ }
+}
+carrier_id {
+ canonical_id: 1836
+ carrier_name: "C Spire"
+ carrier_attribute {
+ mccmnc_tuple: "311230"
+ mccmnc_tuple: "310023"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ spn: "C Spire"
+ }
+}
+carrier_id {
+ canonical_id: 1837
+ carrier_name: "Cordova Wireless Communications Inc"
+ carrier_attribute {
+ mccmnc_tuple: "311240"
+ }
+}
+carrier_id {
+ canonical_id: 1838
+ carrier_name: "SLO Cellular Inc. dba CellularOne of San Luis Obispo"
+ carrier_attribute {
+ mccmnc_tuple: "311260"
+ }
+}
+carrier_id {
+ canonical_id: 1839
+ carrier_name: "Verizon Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ gid1: "BAE0000000000000"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310012"
+ mccmnc_tuple: "310590"
+ mccmnc_tuple: "310591"
+ mccmnc_tuple: "310592"
+ mccmnc_tuple: "310593"
+ mccmnc_tuple: "310594"
+ mccmnc_tuple: "310595"
+ mccmnc_tuple: "310596"
+ mccmnc_tuple: "310597"
+ mccmnc_tuple: "310598"
+ mccmnc_tuple: "310599"
+ mccmnc_tuple: "310890"
+ mccmnc_tuple: "311270"
+ mccmnc_tuple: "311280"
+ mccmnc_tuple: "311281"
+ mccmnc_tuple: "311282"
+ mccmnc_tuple: "311283"
+ mccmnc_tuple: "311284"
+ mccmnc_tuple: "311285"
+ mccmnc_tuple: "311286"
+ mccmnc_tuple: "311287"
+ mccmnc_tuple: "311288"
+ mccmnc_tuple: "311289"
+ mccmnc_tuple: "311480"
+ mccmnc_tuple: "311481"
+ mccmnc_tuple: "311482"
+ mccmnc_tuple: "311483"
+ mccmnc_tuple: "311484"
+ mccmnc_tuple: "311485"
+ mccmnc_tuple: "311486"
+ mccmnc_tuple: "311487"
+ mccmnc_tuple: "311488"
+ mccmnc_tuple: "311489"
+ }
+}
+carrier_id {
+ canonical_id: 1840
+ carrier_name: "Pinpoint Wireless Inc."
+ carrier_attribute {
+ mccmnc_tuple: "311290"
+ }
+}
+carrier_id {
+ canonical_id: 1841
+ carrier_name: "Rutal Cellular Corporation"
+ carrier_attribute {
+ mccmnc_tuple: "311300"
+ }
+}
+carrier_id {
+ canonical_id: 1842
+ carrier_name: "Leaco Rural Telephone Company Inc"
+ carrier_attribute {
+ mccmnc_tuple: "311310"
+ }
+}
+carrier_id {
+ canonical_id: 1843
+ carrier_name: "GCI Communications Corp."
+ carrier_attribute {
+ mccmnc_tuple: "311370"
+ }
+}
+carrier_id {
+ canonical_id: 1844
+ carrier_name: "GreenFly LLC"
+ carrier_attribute {
+ mccmnc_tuple: "311380"
+ }
+}
+carrier_id {
+ canonical_id: 1845
+ carrier_name: "Midwest Wireless Holdings LLC"
+ carrier_attribute {
+ mccmnc_tuple: "311390"
+ }
+}
+carrier_id {
+ canonical_id: 1846
+ carrier_name: "Iowa RSA No.2 Ltd Partnership"
+ carrier_attribute {
+ mccmnc_tuple: "311410"
+ }
+}
+carrier_id {
+ canonical_id: 1847
+ carrier_name: "northwestcell"
+ carrier_attribute {
+ mccmnc_tuple: "311420"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "311480"
+ gid1: "BA00150000000000"
+ }
+}
+carrier_id {
+ canonical_id: 1848
+ carrier_name: "Chat Mobility"
+ carrier_attribute {
+ mccmnc_tuple: "311430"
+ mccmnc_tuple: "312160"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "311480"
+ gid1: "BA00130000000000"
+ }
+}
+carrier_id {
+ canonical_id: 1849
+ carrier_name: "Bluegrass Cellular LLC"
+ carrier_attribute {
+ mccmnc_tuple: "311440"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "311480"
+ gid1: "BA00010000000000"
+ }
+}
+carrier_id {
+ canonical_id: 1850
+ carrier_name: "PTCI"
+ carrier_attribute {
+ mccmnc_tuple: "311450"
+ }
+}
+carrier_id {
+ canonical_id: 1851
+ carrier_name: "Fisher Wireless Services Inc"
+ carrier_attribute {
+ mccmnc_tuple: "311460"
+ }
+}
+carrier_id {
+ canonical_id: 1852
+ carrier_name: "Vitelcom Cellular Inc dba Innovative Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "311470"
+ }
+}
+carrier_id {
+ canonical_id: 1853
+ carrier_name: "Virgin Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ mccmnc_tuple: "312530"
+ gid1: "000003"
+ }
+}
+carrier_id {
+ canonical_id: 1854
+ carrier_name: "CTC Telecom Inc"
+ carrier_attribute {
+ mccmnc_tuple: "311500"
+ }
+}
+carrier_id {
+ canonical_id: 1855
+ carrier_name: "Benton-Lian Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "311510"
+ }
+}
+carrier_id {
+ canonical_id: 1856
+ carrier_name: "Crossroads Wireless Inc"
+ carrier_attribute {
+ mccmnc_tuple: "311520"
+ }
+}
+carrier_id {
+ canonical_id: 1857
+ carrier_name: "Wireless Communications Venture"
+ carrier_attribute {
+ mccmnc_tuple: "311530"
+ }
+}
+carrier_id {
+ canonical_id: 1858
+ carrier_name: "Keystone Wireless Inc"
+ carrier_attribute {
+ mccmnc_tuple: "311540"
+ }
+}
+carrier_id {
+ canonical_id: 1859
+ carrier_name: "Commnet Midwest LLC"
+ carrier_attribute {
+ mccmnc_tuple: "311550"
+ }
+}
+carrier_id {
+ canonical_id: 1860
+ carrier_name: "Nextel Communications Inc."
+ carrier_attribute {
+ mccmnc_tuple: "316010"
+ }
+}
+carrier_id {
+ canonical_id: 1861
+ carrier_name: "Southern Communications Services Inc."
+ carrier_attribute {
+ mccmnc_tuple: "316011"
+ }
+}
+carrier_id {
+ canonical_id: 1862
+ carrier_name: "Ancel"
+ carrier_attribute {
+ mccmnc_tuple: "74800"
+ mccmnc_tuple: "74801"
+ mccmnc_tuple: "74803"
+ }
+}
+carrier_id {
+ canonical_id: 1863
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "74807"
+ }
+}
+carrier_id {
+ canonical_id: 1864
+ carrier_name: "Claro UY"
+ carrier_attribute {
+ mccmnc_tuple: "74810"
+ }
+}
+carrier_id {
+ canonical_id: 1865
+ carrier_name: "Buztel"
+ carrier_attribute {
+ mccmnc_tuple: "43401"
+ }
+}
+carrier_id {
+ canonical_id: 1866
+ carrier_name: "Uzmacom"
+ carrier_attribute {
+ mccmnc_tuple: "43402"
+ }
+}
+carrier_id {
+ canonical_id: 1867
+ carrier_name: "Daewoo Unitel"
+ carrier_attribute {
+ mccmnc_tuple: "43404"
+ }
+}
+carrier_id {
+ canonical_id: 1868
+ carrier_name: "Coscom"
+ carrier_attribute {
+ mccmnc_tuple: "43405"
+ }
+}
+carrier_id {
+ canonical_id: 1869
+ carrier_name: "Uzdunrobita"
+ carrier_attribute {
+ mccmnc_tuple: "43407"
+ }
+}
+carrier_id {
+ canonical_id: 1870
+ carrier_name: "Infonet"
+ carrier_attribute {
+ mccmnc_tuple: "73401"
+ }
+}
+carrier_id {
+ canonical_id: 1871
+ carrier_name: "Corporación Digitel"
+ carrier_attribute {
+ mccmnc_tuple: "73402"
+ }
+}
+carrier_id {
+ canonical_id: 1872
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "73403"
+ }
+}
+carrier_id {
+ canonical_id: 1873
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "73404"
+ }
+}
+carrier_id {
+ canonical_id: 1874
+ carrier_name: "Telecomunicaciones Movilnet, C.A."
+ carrier_attribute {
+ mccmnc_tuple: "73406"
+ }
+}
+carrier_id {
+ canonical_id: 1875
+ carrier_name: "Caribbean Cellular Telephone, Boatphone Ltd."
+ carrier_attribute {
+ mccmnc_tuple: "348570"
+ }
+}
+carrier_id {
+ canonical_id: 1876
+ carrier_name: "GoMobile SamoaTel Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "54927"
+ }
+}
+carrier_id {
+ canonical_id: 1877
+ carrier_name: "SabaFon"
+ carrier_attribute {
+ mccmnc_tuple: "42101"
+ }
+}
+carrier_id {
+ canonical_id: 1878
+ carrier_name: "Spacetel Yemen"
+ carrier_attribute {
+ mccmnc_tuple: "42102"
+ }
+}
+carrier_id {
+ canonical_id: 1879
+ carrier_name: "Telecel"
+ carrier_attribute {
+ mccmnc_tuple: "64803"
+ }
+}
+carrier_id {
+ canonical_id: 1880
+ carrier_name: "Econet"
+ carrier_attribute {
+ mccmnc_tuple: "64804"
+ }
+}
+carrier_id {
+ canonical_id: 1881
+ carrier_name: "遠傳電信 Far EasTone Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "46601"
+ mccmnc_tuple: "46602"
+ mccmnc_tuple: "46603"
+ }
+}
+carrier_id {
+ canonical_id: 1882
+ carrier_name: "亞太電信 Asia Pacific Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "46605"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "46601"
+ imsi_prefix_xpattern: "4660116090"
+ imsi_prefix_xpattern: "4660116091"
+ }
+}
+carrier_id {
+ canonical_id: 1883
+ carrier_name: "Tuntex Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "46606"
+ }
+}
+carrier_id {
+ canonical_id: 1884
+ carrier_name: "中華電信_Chunghwa Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "46611"
+ mccmnc_tuple: "46692"
+ }
+}
+carrier_id {
+ canonical_id: 1886
+ carrier_name: "台灣之星 T Star"
+ carrier_attribute {
+ mccmnc_tuple: "46689"
+ }
+}
+carrier_id {
+ canonical_id: 1887
+ carrier_name: "MobiTai Communications"
+ carrier_attribute {
+ mccmnc_tuple: "46693"
+ }
+}
+carrier_id {
+ canonical_id: 1888
+ carrier_name: "台灣大哥大 Taiwan Mobile Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "46697"
+ }
+}
+carrier_id {
+ canonical_id: 1889
+ carrier_name: "TransAsia Telecoms"
+ carrier_attribute {
+ mccmnc_tuple: "46699"
+ }
+}
+carrier_id {
+ canonical_id: 1890
+ carrier_name: "KT"
+ carrier_attribute {
+ mccmnc_tuple: "45002"
+ mccmnc_tuple: "45004"
+ mccmnc_tuple: "45008"
+ }
+}
+carrier_id {
+ canonical_id: 1891
+ carrier_name: "SK Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "45005"
+ }
+}
+carrier_id {
+ canonical_id: 1892
+ carrier_name: "LG U+"
+ carrier_attribute {
+ mccmnc_tuple: "45006"
+ mccmnc_tuple: "450006"
+ }
+}
+carrier_id {
+ canonical_id: 1893
+ carrier_name: "nTelos"
+ carrier_attribute {
+ mccmnc_tuple: "310470"
+ }
+}
+carrier_id {
+ canonical_id: 1894
+ carrier_name: "SoftBank"
+ carrier_attribute {
+ mccmnc_tuple: "44020"
+ }
+}
+carrier_id {
+ canonical_id: 1895
+ carrier_name: "Freedom Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "302490"
+ }
+}
+carrier_id {
+ canonical_id: 1896
+ carrier_name: "dtac"
+ carrier_attribute {
+ mccmnc_tuple: "52018"
+ }
+}
+carrier_id {
+ canonical_id: 1897
+ carrier_name: "dtac "
+ carrier_attribute {
+ mccmnc_tuple: "52005"
+ }
+}
+carrier_id {
+ canonical_id: 1898
+ carrier_name: "True Move"
+ carrier_attribute {
+ mccmnc_tuple: "52099"
+ }
+}
+carrier_id {
+ canonical_id: 1899
+ carrier_name: "Viettel Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "45204"
+ }
+}
+carrier_id {
+ canonical_id: 1900
+ carrier_name: "OneCall"
+ carrier_attribute {
+ mccmnc_tuple: "24205"
+ }
+}
+carrier_id {
+ canonical_id: 1901
+ carrier_name: "Android Emulator"
+ carrier_attribute {
+ mccmnc_tuple: "310995"
+ }
+}
+carrier_id {
+ canonical_id: 1902
+ carrier_name: "Access Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "27204"
+ }
+}
+carrier_id {
+ canonical_id: 1903
+ carrier_name: "3"
+ carrier_attribute {
+ mccmnc_tuple: "27205"
+ }
+}
+carrier_id {
+ canonical_id: 1904
+ carrier_name: "DNA"
+ carrier_attribute {
+ mccmnc_tuple: "24403"
+ mccmnc_tuple: "24412"
+ mccmnc_tuple: "24413"
+ }
+}
+carrier_id {
+ canonical_id: 1905
+ carrier_name: "Nokia Test Network"
+ carrier_attribute {
+ mccmnc_tuple: "24407"
+ }
+}
+carrier_id {
+ canonical_id: 1906
+ carrier_name: "Unknown"
+ carrier_attribute {
+ mccmnc_tuple: "24408"
+ }
+}
+carrier_id {
+ canonical_id: 1907
+ carrier_name: "TDC"
+ carrier_attribute {
+ mccmnc_tuple: "24410"
+ }
+}
+carrier_id {
+ canonical_id: 1908
+ carrier_name: "Scnl Truphone"
+ carrier_attribute {
+ mccmnc_tuple: "24429"
+ }
+}
+carrier_id {
+ canonical_id: 1909
+ carrier_name: "Euskaltel"
+ carrier_attribute {
+ mccmnc_tuple: "21406"
+ mccmnc_tuple: "21408"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ imsi_prefix_xpattern: "2140359"
+ }
+}
+carrier_id {
+ canonical_id: 1910
+ carrier_name: "COX"
+ carrier_attribute {
+ mccmnc_tuple: "311480"
+ spn: "Cox Mobile"
+ gid1: "BA01570000000000"
+ gid2: "B100000000000000"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "311600"
+ }
+}
+carrier_id {
+ canonical_id: 1911
+ carrier_name: "Test Network, Used by GSM test equipment"
+ carrier_attribute {
+ mccmnc_tuple: "00101"
+ }
+}
+carrier_id {
+ canonical_id: 1912
+ carrier_name: "AT&T MX"
+ carrier_attribute {
+ mccmnc_tuple: "33401"
+ mccmnc_tuple: "334090"
+ mccmnc_tuple: "33409"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "22201"
+ spn: "IUSACELL"
+ spn: "UNEFON"
+ }
+}
+carrier_id {
+ canonical_id: 1913
+ carrier_name: "Telcel"
+ carrier_attribute {
+ mccmnc_tuple: "334020"
+ mccmnc_tuple: "33402"
+ }
+}
+carrier_id {
+ canonical_id: 1914
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "334030"
+ mccmnc_tuple: "33403"
+ }
+}
+carrier_id {
+ canonical_id: 1915
+ carrier_name: "AT&T MX"
+ carrier_attribute {
+ mccmnc_tuple: "334040"
+ mccmnc_tuple: "334050"
+ mccmnc_tuple: "334070"
+ mccmnc_tuple: "334080"
+ }
+}
+carrier_id {
+ canonical_id: 1916
+ carrier_name: "Dauphin Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "34080"
+ }
+}
+carrier_id {
+ canonical_id: 1917
+ carrier_name: "eMobile"
+ carrier_attribute {
+ mccmnc_tuple: "44000"
+ }
+}
+carrier_id {
+ canonical_id: 1918
+ carrier_name: "Hondutel"
+ carrier_attribute {
+ mccmnc_tuple: "70830"
+ }
+}
+carrier_id {
+ canonical_id: 1919
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "70840"
+ }
+}
+carrier_id {
+ canonical_id: 1920
+ carrier_name: "Alfa"
+ carrier_attribute {
+ mccmnc_tuple: "41501"
+ }
+}
+carrier_id {
+ canonical_id: 1921
+ carrier_name: "MTC Touch"
+ carrier_attribute {
+ mccmnc_tuple: "41503"
+ }
+}
+carrier_id {
+ canonical_id: 1922
+ carrier_name: "Ogero Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "41505"
+ }
+}
+carrier_id {
+ canonical_id: 1923
+ carrier_name: "Ncell"
+ carrier_attribute {
+ mccmnc_tuple: "42902"
+ }
+}
+carrier_id {
+ canonical_id: 1924
+ carrier_name: "Smart Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "42904"
+ }
+}
+carrier_id {
+ canonical_id: 1925
+ carrier_name: "Claro PA"
+ carrier_attribute {
+ mccmnc_tuple: "71403"
+ }
+}
+carrier_id {
+ canonical_id: 1926
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "71404"
+ mccmnc_tuple: "714040"
+ }
+}
+carrier_id {
+ canonical_id: 1927
+ carrier_name: "Telecel"
+ carrier_attribute {
+ mccmnc_tuple: "74404"
+ }
+}
+carrier_id {
+ canonical_id: 1928
+ carrier_name: "Personal"
+ carrier_attribute {
+ mccmnc_tuple: "74405"
+ }
+}
+carrier_id {
+ canonical_id: 1929
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "71606"
+ }
+}
+carrier_id {
+ canonical_id: 1930
+ carrier_name: "Entel"
+ carrier_attribute {
+ mccmnc_tuple: "71617"
+ }
+}
+carrier_id {
+ canonical_id: 1931
+ carrier_name: "Sri Lanka Telecom Mobitel"
+ carrier_attribute {
+ mccmnc_tuple: "41301"
+ }
+}
+carrier_id {
+ canonical_id: 1932
+ carrier_name: "Airtel Lanka"
+ carrier_attribute {
+ mccmnc_tuple: "41305"
+ }
+}
+carrier_id {
+ canonical_id: 1933
+ carrier_name: "Hutchison Telecommunications Lanka"
+ carrier_attribute {
+ mccmnc_tuple: "41308"
+ }
+}
+carrier_id {
+ canonical_id: 1934
+ carrier_name: "Sasatel Tanzania"
+ carrier_attribute {
+ mccmnc_tuple: "64006"
+ }
+}
+carrier_id {
+ canonical_id: 1935
+ carrier_name: "Life Tanzania"
+ carrier_attribute {
+ mccmnc_tuple: "64007"
+ }
+}
+carrier_id {
+ canonical_id: 1936
+ carrier_name: "Orange Tunisie"
+ carrier_attribute {
+ mccmnc_tuple: "60501"
+ }
+}
+carrier_id {
+ canonical_id: 1937
+ carrier_name: "ArmenTel"
+ carrier_attribute {
+ mccmnc_tuple: "28301"
+ }
+}
+carrier_id {
+ canonical_id: 1938
+ carrier_name: "Karabakh Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "28304"
+ }
+}
+carrier_id {
+ canonical_id: 1939
+ carrier_name: "K Telecom CJSC"
+ carrier_attribute {
+ mccmnc_tuple: "28305"
+ }
+}
+carrier_id {
+ canonical_id: 1940
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "28310"
+ }
+}
+carrier_id {
+ canonical_id: 1941
+ carrier_name: "Bahamas Telecommunications"
+ carrier_attribute {
+ mccmnc_tuple: "364390"
+ }
+}
+carrier_id {
+ canonical_id: 1942
+ carrier_name: "Open Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "33000"
+ }
+}
+carrier_id {
+ canonical_id: 1943
+ carrier_name: "Orange Niger"
+ carrier_attribute {
+ mccmnc_tuple: "61404"
+ }
+}
+carrier_id {
+ canonical_id: 1944
+ carrier_name: "Bell Benin Communications"
+ carrier_attribute {
+ mccmnc_tuple: "61604"
+ }
+}
+carrier_id {
+ canonical_id: 1945
+ carrier_name: "Glo Communications Benin"
+ carrier_attribute {
+ mccmnc_tuple: "61605"
+ }
+}
+carrier_id {
+ canonical_id: 1946
+ carrier_name: "Onatal (Telmob)"
+ carrier_attribute {
+ mccmnc_tuple: "61301"
+ }
+}
+carrier_id {
+ canonical_id: 1947
+ carrier_name: "Moov Togo"
+ carrier_attribute {
+ mccmnc_tuple: "61503"
+ }
+}
+carrier_id {
+ canonical_id: 1948
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "63203"
+ }
+}
+carrier_id {
+ canonical_id: 1949
+ carrier_name: "MetroPCS"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ mccmnc_tuple: "310800"
+ mccmnc_tuple: "310660"
+ mccmnc_tuple: "310640"
+ mccmnc_tuple: "310530"
+ mccmnc_tuple: "310490"
+ mccmnc_tuple: "310310"
+ mccmnc_tuple: "310300"
+ mccmnc_tuple: "310270"
+ mccmnc_tuple: "310250"
+ mccmnc_tuple: "310240"
+ mccmnc_tuple: "310230"
+ mccmnc_tuple: "310220"
+ mccmnc_tuple: "310210"
+ mccmnc_tuple: "310200"
+ mccmnc_tuple: "310160"
+ mccmnc_tuple: "311490"
+ mccmnc_tuple: "311660"
+ mccmnc_tuple: "311882"
+ mccmnc_tuple: "312250"
+ gid1: "6D38"
+ }
+}
+carrier_id {
+ canonical_id: 1950
+ carrier_name: "life:)"
+ carrier_attribute {
+ mccmnc_tuple: "25704"
+ }
+}
+carrier_id {
+ canonical_id: 1951
+ carrier_name: "Boost Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "311870"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ mccmnc_tuple: "312530"
+ gid1: "000002"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310240"
+ gid1: "0000b0"
+ gid1: "6230"
+ }
+}
+carrier_id {
+ canonical_id: 1952
+ carrier_name: "U.S. Cellular"
+ carrier_attribute {
+ mccmnc_tuple: "311580"
+ mccmnc_tuple: "311581"
+ mccmnc_tuple: "311582"
+ mccmnc_tuple: "311583"
+ mccmnc_tuple: "311584"
+ mccmnc_tuple: "311585"
+ mccmnc_tuple: "311586"
+ mccmnc_tuple: "311587"
+ mccmnc_tuple: "311588"
+ mccmnc_tuple: "311589"
+ mccmnc_tuple: "311220"
+ mccmnc_tuple: "311221"
+ mccmnc_tuple: "311222"
+ mccmnc_tuple: "311223"
+ mccmnc_tuple: "311224"
+ mccmnc_tuple: "311225"
+ mccmnc_tuple: "311226"
+ mccmnc_tuple: "311227"
+ mccmnc_tuple: "311228"
+ mccmnc_tuple: "311229"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ spn: "U.S. Cellular"
+ }
+}
+carrier_id {
+ canonical_id: 1953
+ carrier_name: "Claro CR"
+ carrier_attribute {
+ mccmnc_tuple: "71203"
+ }
+}
+carrier_id {
+ canonical_id: 1954
+ carrier_name: "Claro SV"
+ carrier_attribute {
+ mccmnc_tuple: "70601"
+ }
+}
+carrier_id {
+ canonical_id: 1955
+ carrier_name: "Claro PR"
+ carrier_attribute {
+ mccmnc_tuple: "330110"
+ mccmnc_tuple: "33011"
+ }
+}
+carrier_id {
+ canonical_id: 1956
+ carrier_name: "Telenor Sweden (not used)"
+ carrier_attribute {
+ mccmnc_tuple: "24009"
+ }
+}
+carrier_id {
+ canonical_id: 1957
+ carrier_name: "Bluesky"
+ carrier_attribute {
+ mccmnc_tuple: "54411"
+ }
+}
+carrier_id {
+ canonical_id: 1958
+ carrier_name: "Free"
+ carrier_attribute {
+ mccmnc_tuple: "20815"
+ }
+}
+carrier_id {
+ canonical_id: 1959
+ carrier_name: "Digi.Mobil"
+ carrier_attribute {
+ mccmnc_tuple: "22605"
+ }
+}
+carrier_id {
+ canonical_id: 1960
+ carrier_name: "Hutchison 2G"
+ carrier_attribute {
+ mccmnc_tuple: "45404"
+ mccmnc_tuple: "45405"
+ }
+}
+carrier_id {
+ canonical_id: 1961
+ carrier_name: "Airtel"
+ carrier_attribute {
+ mccmnc_tuple: "40402"
+ mccmnc_tuple: "40403"
+ mccmnc_tuple: "40410"
+ mccmnc_tuple: "40416"
+ mccmnc_tuple: "40431"
+ mccmnc_tuple: "40440"
+ mccmnc_tuple: "40445"
+ mccmnc_tuple: "40449"
+ mccmnc_tuple: "40470"
+ mccmnc_tuple: "40490"
+ mccmnc_tuple: "40492"
+ mccmnc_tuple: "40493"
+ mccmnc_tuple: "40494"
+ mccmnc_tuple: "40495"
+ mccmnc_tuple: "40496"
+ mccmnc_tuple: "40497"
+ mccmnc_tuple: "40498"
+ mccmnc_tuple: "40551"
+ mccmnc_tuple: "40552"
+ mccmnc_tuple: "40553"
+ mccmnc_tuple: "40554"
+ mccmnc_tuple: "40555"
+ mccmnc_tuple: "40556"
+ }
+}
+carrier_id {
+ canonical_id: 1962
+ carrier_name: "Fido"
+ carrier_attribute {
+ mccmnc_tuple: "302370"
+ gid1: "DD"
+ }
+}
+carrier_id {
+ canonical_id: 1963
+ carrier_name: "Vi"
+ carrier_attribute {
+ mccmnc_tuple: "40401"
+ mccmnc_tuple: "40405"
+ mccmnc_tuple: "40411"
+ mccmnc_tuple: "40413"
+ mccmnc_tuple: "40415"
+ mccmnc_tuple: "40420"
+ mccmnc_tuple: "40427"
+ mccmnc_tuple: "40430"
+ mccmnc_tuple: "40443"
+ mccmnc_tuple: "40446"
+ mccmnc_tuple: "40460"
+ mccmnc_tuple: "40484"
+ mccmnc_tuple: "40486"
+ mccmnc_tuple: "40488"
+ mccmnc_tuple: "40566"
+ mccmnc_tuple: "40567"
+ mccmnc_tuple: "405750"
+ mccmnc_tuple: "405751"
+ mccmnc_tuple: "405752"
+ mccmnc_tuple: "405753"
+ mccmnc_tuple: "405754"
+ mccmnc_tuple: "405755"
+ mccmnc_tuple: "405756"
+ spn: "Vodafone IN"
+ }
+}
+carrier_id {
+ canonical_id: 1965
+ carrier_name: "Telkom"
+ carrier_attribute {
+ mccmnc_tuple: "65502"
+ }
+}
+carrier_id {
+ canonical_id: 1966
+ carrier_name: "3"
+ carrier_attribute {
+ mccmnc_tuple: "51089"
+ }
+}
+carrier_id {
+ canonical_id: 1967
+ carrier_name: "Irancell"
+ carrier_attribute {
+ mccmnc_tuple: "43235"
+ }
+}
+carrier_id {
+ canonical_id: 1968
+ carrier_name: "Etisalat"
+ carrier_attribute {
+ mccmnc_tuple: "60203"
+ }
+}
+carrier_id {
+ canonical_id: 1969
+ carrier_name: "Asiacell"
+ carrier_attribute {
+ mccmnc_tuple: "41805"
+ }
+}
+carrier_id {
+ canonical_id: 1970
+ carrier_name: "du"
+ carrier_attribute {
+ mccmnc_tuple: "42403"
+ }
+}
+carrier_id {
+ canonical_id: 1971
+ carrier_name: "Zain Iraq"
+ carrier_attribute {
+ mccmnc_tuple: "41820"
+ mccmnc_tuple: "41830"
+ }
+}
+carrier_id {
+ canonical_id: 1972
+ carrier_name: "Zain Saudi Arabia"
+ carrier_attribute {
+ mccmnc_tuple: "42004"
+ }
+}
+carrier_id {
+ canonical_id: 1973
+ carrier_name: "Libyana"
+ carrier_attribute {
+ mccmnc_tuple: "60600"
+ }
+}
+carrier_id {
+ canonical_id: 1974
+ carrier_name: "Jazztel"
+ carrier_attribute {
+ mccmnc_tuple: "21421"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ spn: "JAZZTEL"
+ spn: "Jazztel"
+ }
+}
+carrier_id {
+ canonical_id: 1975
+ carrier_name: "Telenor"
+ carrier_attribute {
+ mccmnc_tuple: "41006"
+ }
+}
+carrier_id {
+ canonical_id: 1976
+ carrier_name: "ONO"
+ carrier_attribute {
+ mccmnc_tuple: "21418"
+ }
+}
+carrier_id {
+ canonical_id: 1977
+ carrier_name: "Ooredoo"
+ carrier_attribute {
+ mccmnc_tuple: "60303"
+ }
+}
+carrier_id {
+ canonical_id: 1978
+ carrier_name: "Smartfren"
+ carrier_attribute {
+ mccmnc_tuple: "51009"
+ mccmnc_tuple: "51028"
+ }
+}
+carrier_id {
+ canonical_id: 1979
+ carrier_name: "9Pay"
+ carrier_attribute {
+ mccmnc_tuple: "62160"
+ }
+}
+carrier_id {
+ canonical_id: 1980
+ carrier_name: "Zong"
+ carrier_attribute {
+ mccmnc_tuple: "41004"
+ }
+}
+carrier_id {
+ canonical_id: 1982
+ carrier_name: "TATA DOCOMO"
+ carrier_attribute {
+ mccmnc_tuple: "405025"
+ mccmnc_tuple: "405026"
+ mccmnc_tuple: "405027"
+ mccmnc_tuple: "405028"
+ mccmnc_tuple: "405029"
+ mccmnc_tuple: "405030"
+ mccmnc_tuple: "405031"
+ mccmnc_tuple: "405032"
+ mccmnc_tuple: "405033"
+ mccmnc_tuple: "405034"
+ mccmnc_tuple: "405035"
+ mccmnc_tuple: "405036"
+ mccmnc_tuple: "405037"
+ mccmnc_tuple: "405038"
+ mccmnc_tuple: "405039"
+ mccmnc_tuple: "405040"
+ mccmnc_tuple: "405041"
+ mccmnc_tuple: "405042"
+ mccmnc_tuple: "405043"
+ mccmnc_tuple: "405044"
+ mccmnc_tuple: "405045"
+ mccmnc_tuple: "405046"
+ mccmnc_tuple: "405047"
+ }
+}
+carrier_id {
+ canonical_id: 1983
+ carrier_name: "Korek"
+ carrier_attribute {
+ mccmnc_tuple: "41840"
+ }
+}
+carrier_id {
+ canonical_id: 1984
+ carrier_name: "Virgin"
+ carrier_attribute {
+ mccmnc_tuple: "20823"
+ }
+}
+carrier_id {
+ canonical_id: 1985
+ carrier_name: "inwi"
+ carrier_attribute {
+ mccmnc_tuple: "60402"
+ }
+}
+carrier_id {
+ canonical_id: 1986
+ carrier_name: "Tele2/Altel"
+ carrier_attribute {
+ mccmnc_tuple: "40107"
+ mccmnc_tuple: "40177"
+ }
+}
+carrier_id {
+ canonical_id: 1987
+ carrier_name: "Rightel"
+ carrier_attribute {
+ mccmnc_tuple: "43220"
+ }
+}
+carrier_id {
+ canonical_id: 1988
+ carrier_name: "O2"
+ carrier_attribute {
+ mccmnc_tuple: "23106"
+ }
+}
+carrier_id {
+ canonical_id: 1989
+ carrier_name: "Google Fi"
+ carrier_attribute {
+ mccmnc_tuple: "23420"
+ gid1: "0306"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "45403"
+ gid1: "0206"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "23210"
+ gid1: "0306"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ spn: "Fi Network"
+ spn: "nova"
+ spn: "Google Fi"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ gid1: "A00184"
+ gid1: "A00184FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ privilege_access_rule: "4C36AF4A5BDAD97C1F3D8B283416D244496C2AC5EAFE8226079EF6F676FD1859"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "312530"
+ gid1: "A00184"
+ gid1: "A00184FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ imsi_prefix_xpattern: "31026097"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "4276"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310240"
+ gid1: "4276"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "311580"
+ imsi_prefix_xpattern: "3115801"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "312580"
+ gid1: "0001"
+ }
+}
+carrier_id {
+ canonical_id: 1990
+ carrier_name: "Golan Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "42508"
+ }
+}
+carrier_id {
+ canonical_id: 1991
+ carrier_name: "Hot Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "42507"
+ mccmnc_tuple: "42577"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ spn: "HOT mobile"
+ }
+}
+carrier_id {
+ canonical_id: 1992
+ carrier_name: "STC"
+ carrier_attribute {
+ mccmnc_tuple: "41904"
+ }
+}
+carrier_id {
+ canonical_id: 1994
+ carrier_name: "Vietnamobile"
+ carrier_attribute {
+ mccmnc_tuple: "45205"
+ }
+}
+carrier_id {
+ canonical_id: 1996
+ carrier_name: "Ooredoo Myanmar"
+ carrier_attribute {
+ mccmnc_tuple: "41405"
+ }
+}
+carrier_id {
+ canonical_id: 1997
+ carrier_name: "TrueMove H 4G LTE"
+ carrier_attribute {
+ mccmnc_tuple: "52004"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "52000"
+ gid1: "01"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "52000"
+ gid1: "01FF"
+ }
+}
+carrier_id {
+ canonical_id: 1998
+ carrier_name: "Tigo"
+ carrier_attribute {
+ mccmnc_tuple: "70603"
+ }
+}
+carrier_id {
+ canonical_id: 1999
+ carrier_name: "VIVACOM"
+ carrier_attribute {
+ mccmnc_tuple: "28403"
+ }
+}
+carrier_id {
+ canonical_id: 2001
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "42702"
+ spn: "Vodafone Qatar"
+ }
+}
+carrier_id {
+ canonical_id: 2002
+ carrier_name: "Uninor"
+ carrier_attribute {
+ mccmnc_tuple: "405813"
+ mccmnc_tuple: "405814"
+ mccmnc_tuple: "405815"
+ mccmnc_tuple: "405816"
+ mccmnc_tuple: "405817"
+ mccmnc_tuple: "405818"
+ mccmnc_tuple: "405819"
+ mccmnc_tuple: "405820"
+ mccmnc_tuple: "405821"
+ mccmnc_tuple: "405822"
+ mccmnc_tuple: "405844"
+ mccmnc_tuple: "405875"
+ mccmnc_tuple: "405876"
+ mccmnc_tuple: "405877"
+ mccmnc_tuple: "405878"
+ mccmnc_tuple: "405879"
+ mccmnc_tuple: "405880"
+ mccmnc_tuple: "405925"
+ mccmnc_tuple: "405926"
+ mccmnc_tuple: "405927"
+ mccmnc_tuple: "405928"
+ mccmnc_tuple: "405929"
+ }
+}
+carrier_id {
+ canonical_id: 2003
+ carrier_name: "Liberty"
+ carrier_attribute {
+ mccmnc_tuple: "71204"
+ }
+}
+carrier_id {
+ canonical_id: 2004
+ carrier_name: "Airtel BD"
+ carrier_attribute {
+ mccmnc_tuple: "47007"
+ }
+}
+carrier_id {
+ canonical_id: 2005
+ carrier_name: "EURO INFORMATION TELECOM"
+ carrier_attribute {
+ mccmnc_tuple: "20601"
+ gid1: "4E524A31"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20801"
+ gid1: "4E524A31"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20826"
+ gid1: "4E524A31"
+ }
+}
+carrier_id {
+ canonical_id: 2006
+ carrier_name: "Madar"
+ carrier_attribute {
+ mccmnc_tuple: "60601"
+ }
+}
+carrier_id {
+ canonical_id: 2007
+ carrier_name: "Telenor Myanmar"
+ carrier_attribute {
+ mccmnc_tuple: "41406"
+ }
+}
+carrier_id {
+ canonical_id: 2008
+ carrier_name: "Videotron"
+ carrier_attribute {
+ mccmnc_tuple: "302500"
+ mccmnc_tuple: "302510"
+ mccmnc_tuple: "302520"
+ }
+}
+carrier_id {
+ canonical_id: 2009
+ carrier_name: "Movistar"
+ carrier_attribute {
+ mccmnc_tuple: "70604"
+ mccmnc_tuple: "706040"
+ }
+}
+carrier_id {
+ canonical_id: 2010
+ carrier_name: "Movistar (Telefonía Celular de Nicaragua)"
+ carrier_attribute {
+ mccmnc_tuple: "71030"
+ mccmnc_tuple: "710300"
+ }
+}
+carrier_id {
+ canonical_id: 2011
+ carrier_name: "Inland Cellular"
+ carrier_attribute {
+ mccmnc_tuple: "310580"
+ }
+}
+carrier_id {
+ canonical_id: 2014
+ carrier_name: "Zain Bahrain"
+ carrier_attribute {
+ mccmnc_tuple: "42602"
+ }
+}
+carrier_id {
+ canonical_id: 2015
+ carrier_name: "stc BH"
+ carrier_attribute {
+ mccmnc_tuple: "42604"
+ }
+}
+carrier_id {
+ canonical_id: 2017
+ carrier_name: "Yes 5G"
+ carrier_attribute {
+ mccmnc_tuple: "502152"
+ }
+}
+carrier_id {
+ canonical_id: 2018
+ carrier_name: "Reliance Jio"
+ carrier_attribute {
+ mccmnc_tuple: "405840"
+ mccmnc_tuple: "405854"
+ mccmnc_tuple: "405855"
+ mccmnc_tuple: "405856"
+ mccmnc_tuple: "405857"
+ mccmnc_tuple: "405858"
+ mccmnc_tuple: "405859"
+ mccmnc_tuple: "405860"
+ mccmnc_tuple: "405861"
+ mccmnc_tuple: "405862"
+ mccmnc_tuple: "405863"
+ mccmnc_tuple: "405864"
+ mccmnc_tuple: "405865"
+ mccmnc_tuple: "405866"
+ mccmnc_tuple: "405867"
+ mccmnc_tuple: "405868"
+ mccmnc_tuple: "405869"
+ mccmnc_tuple: "405870"
+ mccmnc_tuple: "405871"
+ mccmnc_tuple: "405872"
+ mccmnc_tuple: "405873"
+ mccmnc_tuple: "405874"
+ }
+}
+carrier_id {
+ canonical_id: 2020
+ carrier_name: "Koodo Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "302220"
+ mccmnc_tuple: "302221"
+ mccmnc_tuple: "30222"
+ mccmnc_tuple: "30286"
+ gid1: "4B4F"
+ }
+}
+carrier_id {
+ canonical_id: 2021
+ carrier_name: "Virgin Mobile Canada"
+ carrier_attribute {
+ mccmnc_tuple: "30264"
+ mccmnc_tuple: "302610"
+ mccmnc_tuple: "302630"
+ mccmnc_tuple: "302640"
+ gid1: "3e"
+ }
+}
+carrier_id {
+ canonical_id: 2022
+ carrier_name: "TracFone"
+ carrier_attribute {
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "DDFF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310240"
+ mccmnc_tuple: "310260"
+ mccmnc_tuple: "311180"
+ mccmnc_tuple: "330110"
+ gid1: "DEFF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "534D"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "4D4B"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310590"
+ mccmnc_tuple: "310591"
+ mccmnc_tuple: "310592"
+ mccmnc_tuple: "310593"
+ mccmnc_tuple: "310594"
+ mccmnc_tuple: "310595"
+ mccmnc_tuple: "310596"
+ mccmnc_tuple: "310597"
+ mccmnc_tuple: "310598"
+ mccmnc_tuple: "310599"
+ mccmnc_tuple: "311480"
+ gid1: "BA01270000000000"
+ }
+}
+carrier_id {
+ canonical_id: 2023
+ carrier_name: "Consumer Cellular"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "2AC9"
+ }
+}
+carrier_id {
+ canonical_id: 2024
+ carrier_name: "Locus Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ gid1: "49FF"
+ }
+}
+carrier_id {
+ canonical_id: 2025
+ carrier_name: "Telrite/Pure Talk"
+ carrier_attribute {
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "62FF"
+ }
+}
+carrier_id {
+ canonical_id: 2026
+ carrier_name: "Red Pocket"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "4201"
+ }
+}
+carrier_id {
+ canonical_id: 2027
+ carrier_name: "Airvoice"
+ carrier_attribute {
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "44FF"
+ }
+}
+carrier_id {
+ canonical_id: 2028
+ carrier_name: "Ztar"
+ carrier_attribute {
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "4102"
+ }
+}
+carrier_id {
+ canonical_id: 2029
+ carrier_name: "Defense Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "310410"
+ gid1: "60FF"
+ }
+}
+carrier_id {
+ canonical_id: 2030
+ carrier_name: "AGMS"
+ carrier_attribute {
+ mccmnc_tuple: "310380"
+ gid1: "50FF"
+ }
+}
+carrier_id {
+ canonical_id: 2031
+ carrier_name: "Kore"
+ carrier_attribute {
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "69FF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "4B4F"
+ }
+}
+carrier_id {
+ canonical_id: 2032
+ carrier_name: "Xfinity Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "310590"
+ mccmnc_tuple: "310599"
+ mccmnc_tuple: "311480"
+ mccmnc_tuple: "311481"
+ mccmnc_tuple: "311482"
+ mccmnc_tuple: "311483"
+ mccmnc_tuple: "311484"
+ mccmnc_tuple: "311485"
+ mccmnc_tuple: "311486"
+ mccmnc_tuple: "311487"
+ mccmnc_tuple: "311488"
+ mccmnc_tuple: "311489"
+ gid1: "BA01450000000000"
+ }
+}
+carrier_id {
+ canonical_id: 2033
+ carrier_name: "Ooredoo"
+ carrier_attribute {
+ mccmnc_tuple: "47202"
+ }
+}
+carrier_id {
+ canonical_id: 2034
+ carrier_name: "Orange Mali"
+ carrier_attribute {
+ mccmnc_tuple: "61002"
+ }
+}
+carrier_id {
+ canonical_id: 2035
+ carrier_name: "Celcom"
+ carrier_attribute {
+ mccmnc_tuple: "61807"
+ }
+}
+carrier_id {
+ canonical_id: 2036
+ carrier_name: "Tigo"
+ carrier_attribute {
+ mccmnc_tuple: "63089"
+ }
+}
+carrier_id {
+ canonical_id: 2037
+ carrier_name: "Bite"
+ carrier_attribute {
+ mccmnc_tuple: "24705"
+ }
+}
+carrier_id {
+ canonical_id: 2038
+ carrier_name: "unifi mobile"
+ carrier_attribute {
+ mccmnc_tuple: "50211"
+ mccmnc_tuple: "502153"
+ }
+}
+carrier_id {
+ canonical_id: 2052
+ carrier_name: "Virgin"
+ carrier_attribute {
+ mccmnc_tuple: "42005"
+ }
+}
+carrier_id {
+ canonical_id: 2053
+ carrier_name: "PC mobile"
+ carrier_attribute {
+ mccmnc_tuple: "30264"
+ mccmnc_tuple: "302610"
+ mccmnc_tuple: "302630"
+ mccmnc_tuple: "302640"
+ gid1: "40"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "302220"
+ mccmnc_tuple: "302221"
+ gid1: "5043"
+ }
+}
+carrier_id {
+ canonical_id: 2054
+ carrier_name: "Solo Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "30264"
+ mccmnc_tuple: "302610"
+ mccmnc_tuple: "302630"
+ mccmnc_tuple: "302640"
+ gid1: "3f"
+ }
+}
+carrier_id {
+ canonical_id: 2055
+ carrier_name: "Chatr Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "302320"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "302720"
+ imsi_prefix_xpattern: "302720x94"
+ imsi_prefix_xpattern: "302720x84"
+ imsi_prefix_xpattern: "302720x83"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "302720"
+ gid1: "d2"
+ }
+}
+carrier_id {
+ canonical_id: 2056
+ carrier_name: "Ztar Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "302720"
+ imsi_prefix_xpattern: "302720x98"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "302720"
+ gid1: "d4"
+ }
+}
+carrier_id {
+ canonical_id: 2057
+ carrier_name: "Cityfone"
+ carrier_attribute {
+ mccmnc_tuple: "302720"
+ imsi_prefix_xpattern: "302720x97"
+ gid1: "cc"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "302720"
+ spn: "CITYFONE"
+ }
+}
+carrier_id {
+ canonical_id: 2060
+ carrier_name: "Amaysim (MVNE2)"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "6133"
+ }
+}
+carrier_id {
+ canonical_id: 2062
+ carrier_name: "Bright Spot (Leto)"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "4C45"
+ }
+}
+carrier_id {
+ canonical_id: 2064
+ carrier_name: "GoSmart"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "4753"
+ }
+}
+carrier_id {
+ canonical_id: 2065
+ carrier_name: "IDT"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "AB"
+ }
+}
+carrier_id {
+ canonical_id: 2066
+ carrier_name: "Kajeet (Arterra)"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "6136"
+ }
+}
+carrier_id {
+ canonical_id: 2067
+ carrier_name: "Lyca Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "6C79"
+ }
+}
+carrier_id {
+ canonical_id: 2068
+ carrier_name: "M2M"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "3201"
+ }
+}
+carrier_id {
+ canonical_id: 2069
+ carrier_name: "MVNE2/AMDOCS"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "6132"
+ }
+}
+carrier_id {
+ canonical_id: 2070
+ carrier_name: "Nest"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "4E45"
+ }
+}
+carrier_id {
+ canonical_id: 2071
+ carrier_name: "Plintron"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "7031"
+ }
+}
+carrier_id {
+ canonical_id: 2073
+ carrier_name: "PWG/Cintex"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "4358"
+ }
+}
+carrier_id {
+ canonical_id: 2074
+ carrier_name: "Ready Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "8234"
+ }
+}
+carrier_id {
+ canonical_id: 2075
+ carrier_name: "Republic Wireless (MVNE2)"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "6134"
+ }
+}
+carrier_id {
+ canonical_id: 2076
+ carrier_name: "Roam Mobility"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "726D"
+ gid1: "524D"
+ }
+}
+carrier_id {
+ canonical_id: 2077
+ carrier_name: "Rock Island"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "6137"
+ }
+}
+carrier_id {
+ canonical_id: 2079
+ carrier_name: "Solavei"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "7376"
+ }
+}
+carrier_id {
+ canonical_id: 2080
+ carrier_name: "Ting"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "6135"
+ }
+}
+carrier_id {
+ canonical_id: 2081
+ carrier_name: "Twilio M2M"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "7477"
+ }
+}
+carrier_id {
+ canonical_id: 2083
+ carrier_name: "Ultra/Univision"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "354D"
+ gid1: "364D"
+ gid1: "4153"
+ gid1: "554D"
+ }
+}
+carrier_id {
+ canonical_id: 2086
+ carrier_name: "Vodafone US"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "2801"
+ }
+}
+carrier_id {
+ canonical_id: 2087
+ carrier_name: "Wyless"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "574D"
+ }
+}
+carrier_id {
+ canonical_id: 2088
+ carrier_name: "Crnogorski Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "29702"
+ spn: "Telekom.me"
+ }
+}
+carrier_id {
+ canonical_id: 2089
+ carrier_name: "Public Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "302220"
+ mccmnc_tuple: "302221"
+ gid1: "4D4F"
+ }
+}
+carrier_id {
+ canonical_id: 2090
+ carrier_name: "Tbaytel"
+ carrier_attribute {
+ mccmnc_tuple: "302720"
+ imsi_prefix_xpattern: "302720x92"
+ gid1: "ba"
+ }
+}
+carrier_id {
+ canonical_id: 2091
+ carrier_name: "Bonbon"
+ carrier_attribute {
+ mccmnc_tuple: "21901"
+ mccmnc_tuple: "21920"
+ spn: "bonbon"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21901"
+ mccmnc_tuple: "21920"
+ gid1: "10"
+ gid1: "11"
+ gid1: "12"
+ }
+}
+carrier_id {
+ canonical_id: 2092
+ carrier_name: "congstar"
+ carrier_attribute {
+ mccmnc_tuple: "26201"
+ mccmnc_tuple: "26206"
+ spn: "congstar"
+ spn: "congstar.de"
+ gid1: "44"
+ }
+}
+carrier_id {
+ canonical_id: 2093
+ carrier_name: "Tesco"
+ carrier_attribute {
+ mccmnc_tuple: "23410"
+ gid1: "0A"
+ gid1: "0AFFFF"
+ gid1: "0AFFFFFFFFFF544553434F202020202020202020"
+ }
+}
+carrier_id {
+ canonical_id: 2094
+ carrier_name: "tele.ring"
+ carrier_attribute {
+ mccmnc_tuple: "23207"
+ gid1: "07"
+ gid1: "FF"
+ gid1: "30"
+ }
+}
+carrier_id {
+ canonical_id: 2095
+ carrier_name: "Ben"
+ carrier_attribute {
+ mccmnc_tuple: "20416"
+ gid1: "5F"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20416"
+ spn: "Ben NL"
+ }
+}
+carrier_id {
+ canonical_id: 2100
+ carrier_name: "Y!mobile"
+ carrier_attribute {
+ mccmnc_tuple: "44020"
+ gid1: "01ffff"
+ gid1: "16ffff"
+ }
+}
+carrier_id {
+ canonical_id: 2101
+ carrier_name: "BT"
+ carrier_attribute {
+ mccmnc_tuple: "23430"
+ gid1: "c3"
+ gid1: "c3ff"
+ }
+}
+carrier_id {
+ canonical_id: 2102
+ carrier_name: "BT Business"
+ carrier_attribute {
+ mccmnc_tuple: "23430"
+ gid1: "b3"
+ gid1: "b3ff"
+ }
+}
+carrier_id {
+ canonical_id: 2103
+ carrier_name: "BT One Phone"
+ carrier_attribute {
+ mccmnc_tuple: "23430"
+ mccmnc_tuple: "23408"
+ gid1: "b2"
+ gid1: "b2ff"
+ }
+}
+carrier_id {
+ canonical_id: 2105
+ carrier_name: "Skinny"
+ carrier_attribute {
+ mccmnc_tuple: "53005"
+ spn: "Skinny"
+ }
+}
+carrier_id {
+ canonical_id: 2106
+ carrier_name: "IIJmio"
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ preferred_apn: "iijmio.jp"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "44051"
+ preferred_apn: "iijmio.jp"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20601"
+ spn: "IIJ"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "44003"
+ }
+}
+carrier_id {
+ canonical_id: 2107
+ carrier_name: "ONE"
+ carrier_attribute {
+ mccmnc_tuple: "29701"
+ }
+}
+carrier_id {
+ canonical_id: 2108
+ carrier_name: "AirtelTigo"
+ carrier_attribute {
+ mccmnc_tuple: "62003"
+ mccmnc_tuple: "62006"
+ }
+}
+carrier_id {
+ canonical_id: 2109
+ carrier_name: "Rakuten Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ preferred_apn: "rmobile.co"
+ preferred_apn: "rmobile.jp"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "44051"
+ preferred_apn: "a.rmobile.jp"
+ }
+}
+carrier_id {
+ canonical_id: 2110
+ carrier_name: "UQ mobile"
+ carrier_attribute {
+ mccmnc_tuple: "44050"
+ mccmnc_tuple: "44051"
+ mccmnc_tuple: "44054"
+ gid1: "20"
+ }
+}
+carrier_id {
+ canonical_id: 2111
+ carrier_name: "Euskaltel"
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ mccmnc_tuple: "21408"
+ spn: "EUSKALTEL"
+ }
+}
+carrier_id {
+ canonical_id: 2112
+ carrier_name: "Telecable"
+ carrier_attribute {
+ mccmnc_tuple: "21416"
+ spn: "telecable"
+ spn: "Telecable"
+ spn: "TeleCable"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21405"
+ imsi_prefix_xpattern: "214050111"
+ spn: "telecable"
+ spn: "Telecable"
+ spn: "TeleCable"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21406"
+ imsi_prefix_xpattern: "2140613"
+ spn: "telecable"
+ spn: "Telecable"
+ spn: "TeleCable"
+ }
+}
+carrier_id {
+ canonical_id: 2113
+ carrier_name: "mobilR"
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ mccmnc_tuple: "21408"
+ mccmnc_tuple: "21417"
+ spn: "mobilR"
+ spn: "mobil R"
+ spn: "Mobil R"
+ }
+}
+carrier_id {
+ canonical_id: 2114
+ carrier_name: "EWE"
+ carrier_attribute {
+ mccmnc_tuple: "26202"
+ spn: "ewe.de"
+ }
+}
+carrier_id {
+ canonical_id: 2115
+ carrier_name: "Glo"
+ carrier_attribute {
+ mccmnc_tuple: "62150"
+ }
+}
+carrier_id {
+ canonical_id: 2116
+ carrier_name: "Ratel"
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ preferred_apn: "ratel.com"
+ }
+}
+carrier_id {
+ canonical_id: 2117
+ carrier_name: "TalkTalk"
+ carrier_attribute {
+ mccmnc_tuple: "23410"
+ gid1: "537"
+ }
+}
+carrier_id {
+ canonical_id: 2118
+ carrier_name: "giffgaff"
+ carrier_attribute {
+ mccmnc_tuple: "23410"
+ gid1: "508"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "23410"
+ spn: "giffgaff"
+ }
+}
+carrier_id {
+ canonical_id: 2119
+ carrier_name: "FirstNet"
+ carrier_attribute {
+ mccmnc_tuple: "313100"
+ mccmnc_tuple: "313110"
+ mccmnc_tuple: "313120"
+ mccmnc_tuple: "313130"
+ mccmnc_tuple: "313140"
+ }
+}
+carrier_id {
+ canonical_id: 2120
+ carrier_name: "FirstNet (Lab)"
+ carrier_attribute {
+ mccmnc_tuple: "312670"
+ }
+}
+carrier_id {
+ canonical_id: 2121
+ carrier_name: "mineo"
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ preferred_apn: "mineo-d.jp"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "44051"
+ preferred_apn: "mineo.jp"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "44020"
+ preferred_apn: "mineo-s.jp"
+ }
+}
+carrier_id {
+ canonical_id: 2122
+ carrier_name: "Lucky Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "30264"
+ mccmnc_tuple: "302610"
+ mccmnc_tuple: "302630"
+ mccmnc_tuple: "302640"
+ gid1: "42"
+ }
+}
+carrier_id {
+ canonical_id: 2123
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "54002"
+ }
+}
+carrier_id {
+ canonical_id: 2124
+ carrier_name: "Iliad"
+ carrier_attribute {
+ mccmnc_tuple: "22250"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20815"
+ gid1: "F003"
+ }
+}
+carrier_id {
+ canonical_id: 2125
+ carrier_name: "Simyo"
+ carrier_attribute {
+ mccmnc_tuple: "21419"
+ spn: "simyo"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ spn: "simyo"
+ }
+}
+carrier_id {
+ canonical_id: 2126
+ carrier_name: "Spectrum Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "311480"
+ gid1: "BA01490000000000"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "313450"
+ }
+}
+carrier_id {
+ canonical_id: 2127
+ carrier_name: "Free RE"
+ carrier_attribute {
+ mccmnc_tuple: "64703"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20815"
+ gid1: "F2330002"
+ }
+}
+carrier_id {
+ canonical_id: 2128
+ carrier_name: "Sprint Wholesale"
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ gid1: "A00022FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00209FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00250FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00207FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00105FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00263FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00271FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00151FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00058FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00301FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00143FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00247FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00274FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00042FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00092FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00312FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "A00034FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ }
+}
+carrier_id {
+ canonical_id: 2129
+ carrier_name: "ALDI mobile"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "ALDImobile"
+ }
+}
+carrier_id {
+ canonical_id: 2130
+ carrier_name: "ALIV BS"
+ carrier_attribute {
+ mccmnc_tuple: "20809"
+ imsi_prefix_xpattern: "208090021"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "36449"
+ }
+}
+carrier_id {
+ canonical_id: 2131
+ carrier_name: "Altecom"
+ carrier_attribute {
+ mccmnc_tuple: "21402"
+ }
+}
+carrier_id {
+ canonical_id: 2132
+ carrier_name: "Bics"
+ carrier_attribute {
+ mccmnc_tuple: "20628"
+ mccmnc_tuple: "90158"
+ }
+}
+carrier_id {
+ canonical_id: 2133
+ carrier_name: "Carrefour"
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ imsi_prefix_xpattern: "2140352"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20801"
+ gid1: "33"
+ }
+}
+carrier_id {
+ canonical_id: 2134
+ carrier_name: "com4"
+ carrier_attribute {
+ mccmnc_tuple: "24209"
+ }
+}
+carrier_id {
+ canonical_id: 2135
+ carrier_name: "Coriolis"
+ carrier_attribute {
+ mccmnc_tuple: "20801"
+ imsi_prefix_xpattern: "208011511"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20809"
+ imsi_prefix_xpattern: "208090036"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20827"
+ spn: "Coriolis"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20810"
+ mccmnc_tuple: "64710"
+ gid1: "12"
+ }
+}
+carrier_id {
+ canonical_id: 2136
+ carrier_name: "Fibracat"
+ carrier_attribute {
+ mccmnc_tuple: "21402"
+ spn: "fibracat"
+ }
+}
+carrier_id {
+ canonical_id: 2137
+ carrier_name: "Gamma"
+ carrier_attribute {
+ mccmnc_tuple: "23439"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "24007"
+ imsi_prefix_xpattern: "240075610"
+ }
+}
+carrier_id {
+ canonical_id: 2138
+ carrier_name: "Jump"
+ carrier_attribute {
+ mccmnc_tuple: "23410"
+ mccmnc_tuple: "23439"
+ mccmnc_tuple: "24007"
+ spn: "jump"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ spn: "Jump"
+ }
+}
+carrier_id {
+ canonical_id: 2139
+ carrier_name: "Sky"
+ carrier_attribute {
+ mccmnc_tuple: "23457"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "24007"
+ gid1: "0c"
+ }
+}
+carrier_id {
+ canonical_id: 2140
+ carrier_name: "Smarty"
+ carrier_attribute {
+ mccmnc_tuple: "23420"
+ gid1: "0309"
+ }
+}
+carrier_id {
+ canonical_id: 2141
+ carrier_name: "Superdrug"
+ carrier_attribute {
+ mccmnc_tuple: "23420"
+ gid1: "0310"
+ }
+}
+carrier_id {
+ canonical_id: 2142
+ carrier_name: "Tinkoff"
+ carrier_attribute {
+ mccmnc_tuple: "25062"
+ }
+}
+carrier_id {
+ canonical_id: 2143
+ carrier_name: "Truphone"
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ mccmnc_tuple: "20408"
+ mccmnc_tuple: "20433"
+ mccmnc_tuple: "20809"
+ mccmnc_tuple: "20812"
+ mccmnc_tuple: "21427"
+ mccmnc_tuple: "23425"
+ mccmnc_tuple: "26033"
+ mccmnc_tuple: "26242"
+ mccmnc_tuple: "310300"
+ mccmnc_tuple: "310690"
+ mccmnc_tuple: "45400"
+ mccmnc_tuple: "45408"
+ mccmnc_tuple: "50538"
+ gid1: "547275554b3030656e"
+ }
+}
+carrier_id {
+ canonical_id: 2144
+ carrier_name: "Unleashed"
+ carrier_attribute {
+ mccmnc_tuple: "20630"
+ }
+}
+carrier_id {
+ canonical_id: 2145
+ carrier_name: "Virgin"
+ carrier_attribute {
+ mccmnc_tuple: "50502"
+ imsi_prefix_xpattern: "505029"
+ }
+}
+carrier_id {
+ canonical_id: 2146
+ carrier_name: "Visible"
+ carrier_attribute {
+ mccmnc_tuple: "311480"
+ gid1: "bae1000000000000"
+ gid2: "1A00000000000000"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "311480"
+ gid1: "bae2000000000000"
+ gid2: "1C00000000000000"
+ }
+}
+carrier_id {
+ canonical_id: 2147
+ carrier_name: "Vodafone Lab"
+ carrier_attribute {
+ mccmnc_tuple: "26209"
+ }
+}
+carrier_id {
+ canonical_id: 2148
+ carrier_name: "BIGLOBE"
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ preferred_apn: "biglobe.jp"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "44051"
+ mccmnc_tuple: "44054"
+ gid1: "24"
+ }
+}
+carrier_id {
+ canonical_id: 2149
+ carrier_name: "Voiceworks NL"
+ carrier_attribute {
+ mccmnc_tuple: "20403"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20408"
+ imsi_prefix_xpattern: "204080950"
+ }
+}
+carrier_id {
+ canonical_id: 2150
+ carrier_name: "Telenet"
+ carrier_attribute {
+ mccmnc_tuple: "20605"
+ }
+}
+carrier_id {
+ canonical_id: 2151
+ carrier_name: "Legos"
+ carrier_attribute {
+ mccmnc_tuple: "20817"
+ }
+}
+carrier_id {
+ canonical_id: 2152
+ carrier_name: "Lycamobile"
+ carrier_attribute {
+ mccmnc_tuple: "23426"
+ spn: "Lycamobile"
+ }
+}
+carrier_id {
+ canonical_id: 2153
+ carrier_name: "Unité"
+ carrier_attribute {
+ mccmnc_tuple: "25905"
+ }
+}
+carrier_id {
+ canonical_id: 2154
+ carrier_name: "Tesco"
+ carrier_attribute {
+ mccmnc_tuple: "27211"
+ gid1: "0A"
+ }
+}
+carrier_id {
+ canonical_id: 2155
+ carrier_name: "Nova"
+ carrier_attribute {
+ mccmnc_tuple: "27411"
+ }
+}
+carrier_id {
+ canonical_id: 2156
+ carrier_name: "PrimeTel"
+ carrier_attribute {
+ mccmnc_tuple: "28020"
+ }
+}
+carrier_id {
+ canonical_id: 2157
+ carrier_name: "IT&E OverSeas"
+ carrier_attribute {
+ mccmnc_tuple: "310032"
+ spn: "CdmaNai"
+ }
+}
+carrier_id {
+ canonical_id: 2158
+ carrier_name: "North Dakota Network Company"
+ carrier_attribute {
+ mccmnc_tuple: "311610"
+ spn: "srtcomm"
+ }
+}
+carrier_id {
+ canonical_id: 2159
+ carrier_name: "United Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "311650"
+ spn: "unitedwireless"
+ }
+}
+carrier_id {
+ canonical_id: 2160
+ carrier_name: "Pine Belt"
+ carrier_attribute {
+ mccmnc_tuple: "311670"
+ spn: "pinebelt"
+ }
+}
+carrier_id {
+ canonical_id: 2161
+ carrier_name: "Missouri RSA No 5 Partnership"
+ carrier_attribute {
+ mccmnc_tuple: "311920"
+ spn: "CdmaNai"
+ }
+}
+carrier_id {
+ canonical_id: 2162
+ carrier_name: "Custer"
+ carrier_attribute {
+ mccmnc_tuple: "312040"
+ spn: "custer"
+ }
+}
+carrier_id {
+ canonical_id: 2163
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "36302"
+ mccmnc_tuple: "363020"
+ }
+}
+carrier_id {
+ canonical_id: 2165
+ carrier_name: "TashiCell"
+ carrier_attribute {
+ mccmnc_tuple: "40277"
+ }
+}
+carrier_id {
+ canonical_id: 2166
+ carrier_name: "SanaTel"
+ carrier_attribute {
+ mccmnc_tuple: "41808"
+ }
+}
+carrier_id {
+ canonical_id: 2167
+ carrier_name: "Omnnea"
+ carrier_attribute {
+ mccmnc_tuple: "41892"
+ }
+}
+carrier_id {
+ canonical_id: 2168
+ carrier_name: "HiTS-UNITEL"
+ carrier_attribute {
+ mccmnc_tuple: "42104"
+ }
+}
+carrier_id {
+ canonical_id: 2169
+ carrier_name: "Alon Cellular Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "42514"
+ }
+}
+carrier_id {
+ canonical_id: 2170
+ carrier_name: "Home Cellular"
+ carrier_attribute {
+ mccmnc_tuple: "42515"
+ }
+}
+carrier_id {
+ canonical_id: 2171
+ carrier_name: "Rami Levy"
+ carrier_attribute {
+ mccmnc_tuple: "42516"
+ }
+}
+carrier_id {
+ canonical_id: 2172
+ carrier_name: "Skytel"
+ carrier_attribute {
+ mccmnc_tuple: "42891"
+ }
+}
+carrier_id {
+ canonical_id: 2173
+ carrier_name: "G.Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "42898"
+ }
+}
+carrier_id {
+ canonical_id: 2174
+ carrier_name: "Tcell"
+ carrier_attribute {
+ mccmnc_tuple: "43612"
+ }
+}
+carrier_id {
+ canonical_id: 2175
+ carrier_name: "AkTel LLC"
+ carrier_attribute {
+ mccmnc_tuple: "43703"
+ }
+}
+carrier_id {
+ canonical_id: 2176
+ carrier_name: "MegaCom"
+ carrier_attribute {
+ mccmnc_tuple: "43705"
+ }
+}
+carrier_id {
+ canonical_id: 2177
+ carrier_name: "O!"
+ carrier_attribute {
+ mccmnc_tuple: "43709"
+ }
+}
+carrier_id {
+ canonical_id: 2178
+ carrier_name: "Gmobile"
+ carrier_attribute {
+ mccmnc_tuple: "45207"
+ }
+}
+carrier_id {
+ canonical_id: 2179
+ carrier_name: "Viettel Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "45208"
+ }
+}
+carrier_id {
+ canonical_id: 2180
+ carrier_name: "qb"
+ carrier_attribute {
+ mccmnc_tuple: "45604"
+ }
+}
+carrier_id {
+ canonical_id: 2181
+ carrier_name: "Metfone"
+ carrier_attribute {
+ mccmnc_tuple: "45608"
+ }
+}
+carrier_id {
+ canonical_id: 2182
+ carrier_name: "Telkomcel"
+ carrier_attribute {
+ mccmnc_tuple: "51401"
+ }
+}
+carrier_id {
+ canonical_id: 2183
+ carrier_name: "Timor Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "51402"
+ }
+}
+carrier_id {
+ canonical_id: 2184
+ carrier_name: "Redinternet"
+ carrier_attribute {
+ mccmnc_tuple: "51518"
+ }
+}
+carrier_id {
+ canonical_id: 2185
+ carrier_name: "BREEZE"
+ carrier_attribute {
+ mccmnc_tuple: "54001"
+ }
+}
+carrier_id {
+ canonical_id: 2186
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "54202"
+ }
+}
+carrier_id {
+ canonical_id: 2187
+ carrier_name: "Kiribati Frigate"
+ carrier_attribute {
+ mccmnc_tuple: "54509"
+ }
+}
+carrier_id {
+ canonical_id: 2188
+ carrier_name: "Palau Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "55280"
+ }
+}
+carrier_id {
+ canonical_id: 2189
+ carrier_name: "Al-Jeel"
+ carrier_attribute {
+ mccmnc_tuple: "60602"
+ }
+}
+carrier_id {
+ canonical_id: 2190
+ carrier_name: "Hatef"
+ carrier_attribute {
+ mccmnc_tuple: "60606"
+ }
+}
+carrier_id {
+ canonical_id: 2191
+ carrier_name: "QCell"
+ carrier_attribute {
+ mccmnc_tuple: "60704"
+ }
+}
+carrier_id {
+ canonical_id: 2192
+ carrier_name: "Expresso"
+ carrier_attribute {
+ mccmnc_tuple: "60803"
+ }
+}
+carrier_id {
+ canonical_id: 2193
+ carrier_name: "Intercel"
+ carrier_attribute {
+ mccmnc_tuple: "61103"
+ }
+}
+carrier_id {
+ canonical_id: 2194
+ carrier_name: "Lonestar"
+ carrier_attribute {
+ mccmnc_tuple: "61801"
+ }
+}
+carrier_id {
+ canonical_id: 2195
+ carrier_name: "Libercell"
+ carrier_attribute {
+ mccmnc_tuple: "61802"
+ }
+}
+carrier_id {
+ canonical_id: 2196
+ carrier_name: "LIBTELCO"
+ carrier_attribute {
+ mccmnc_tuple: "61820"
+ }
+}
+carrier_id {
+ canonical_id: 2197
+ carrier_name: "Salam"
+ carrier_attribute {
+ mccmnc_tuple: "62204"
+ }
+}
+carrier_id {
+ canonical_id: 2198
+ carrier_name: "Nationlink"
+ carrier_attribute {
+ mccmnc_tuple: "62304"
+ }
+}
+carrier_id {
+ canonical_id: 2199
+ carrier_name: "Hits-GE"
+ carrier_attribute {
+ mccmnc_tuple: "62703"
+ }
+}
+carrier_id {
+ canonical_id: 2200
+ carrier_name: "Azur"
+ carrier_attribute {
+ mccmnc_tuple: "62804"
+ }
+}
+carrier_id {
+ canonical_id: 2201
+ carrier_name: "MOVICEL"
+ carrier_attribute {
+ mccmnc_tuple: "63104"
+ }
+}
+carrier_id {
+ canonical_id: 2202
+ carrier_name: "Sudani"
+ carrier_attribute {
+ mccmnc_tuple: "63407"
+ }
+}
+carrier_id {
+ canonical_id: 2203
+ carrier_name: "Airtel Rwanda"
+ carrier_attribute {
+ mccmnc_tuple: "63513"
+ mccmnc_tuple: "63514"
+ }
+}
+carrier_id {
+ canonical_id: 2205
+ carrier_name: "Telesom"
+ carrier_attribute {
+ mccmnc_tuple: "63701"
+ }
+}
+carrier_id {
+ canonical_id: 2206
+ carrier_name: "Nationlink"
+ carrier_attribute {
+ mccmnc_tuple: "63710"
+ }
+}
+carrier_id {
+ canonical_id: 2207
+ carrier_name: "Somtel"
+ carrier_attribute {
+ mccmnc_tuple: "63771"
+ }
+}
+carrier_id {
+ canonical_id: 2208
+ carrier_name: "Telcom"
+ carrier_attribute {
+ mccmnc_tuple: "63782"
+ }
+}
+carrier_id {
+ canonical_id: 2209
+ carrier_name: "Yu"
+ carrier_attribute {
+ mccmnc_tuple: "63905"
+ }
+}
+carrier_id {
+ canonical_id: 2210
+ carrier_name: "Telkom"
+ carrier_attribute {
+ mccmnc_tuple: "63907"
+ }
+}
+carrier_id {
+ canonical_id: 2211
+ carrier_name: "Lumitel/Viettel"
+ carrier_attribute {
+ mccmnc_tuple: "64208"
+ }
+}
+carrier_id {
+ canonical_id: 2212
+ carrier_name: "Leo"
+ carrier_attribute {
+ mccmnc_tuple: "64282"
+ }
+}
+carrier_id {
+ canonical_id: 2213
+ carrier_name: "Movitel"
+ carrier_attribute {
+ mccmnc_tuple: "64303"
+ }
+}
+carrier_id {
+ canonical_id: 2214
+ carrier_name: "switch"
+ carrier_attribute {
+ mccmnc_tuple: "64902"
+ }
+}
+carrier_id {
+ canonical_id: 2216
+ carrier_name: "VTR Banda Ancha SA"
+ carrier_attribute {
+ mccmnc_tuple: "73008"
+ }
+}
+carrier_id {
+ canonical_id: 2217
+ carrier_name: "GT&T Cellink Plus"
+ carrier_attribute {
+ mccmnc_tuple: "73802"
+ mccmnc_tuple: "738002"
+ }
+}
+carrier_id {
+ canonical_id: 2218
+ carrier_name: "ETB 4G"
+ carrier_attribute {
+ mccmnc_tuple: "732187"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "732103"
+ spn: "ETB MOVI"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "732111"
+ spn: "ETB MOVIL"
+ }
+}
+carrier_id {
+ canonical_id: 2219
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "54105"
+ }
+}
+carrier_id {
+ canonical_id: 2220
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "53988"
+ }
+}
+carrier_id {
+ canonical_id: 2221
+ carrier_name: "Etisalat"
+ carrier_attribute {
+ mccmnc_tuple: "41250"
+ }
+}
+carrier_id {
+ canonical_id: 2222
+ carrier_name: "Globacom"
+ carrier_attribute {
+ mccmnc_tuple: "62007"
+ }
+}
+carrier_id {
+ canonical_id: 2223
+ carrier_name: "Grenada:Lime"
+ carrier_attribute {
+ mccmnc_tuple: "352110"
+ }
+}
+carrier_id {
+ canonical_id: 2224
+ carrier_name: "Cable & Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "33818"
+ mccmnc_tuple: "338180"
+ }
+}
+carrier_id {
+ canonical_id: 2225
+ carrier_name: "MTN/Areeba"
+ carrier_attribute {
+ mccmnc_tuple: "61104"
+ }
+}
+carrier_id {
+ canonical_id: 2227
+ carrier_name: "Tigo/Milicom/Tchad Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "62203"
+ }
+}
+carrier_id {
+ canonical_id: 2229
+ carrier_name: "Rebtel"
+ carrier_attribute {
+ mccmnc_tuple: "26044"
+ }
+}
+carrier_id {
+ canonical_id: 2230
+ carrier_name: "bulsatcom"
+ carrier_attribute {
+ mccmnc_tuple: "28411"
+ }
+}
+carrier_id {
+ canonical_id: 2231
+ carrier_name: "MAX TELECOM"
+ carrier_attribute {
+ mccmnc_tuple: "28413"
+ }
+}
+carrier_id {
+ canonical_id: 2232
+ carrier_name: "BICS"
+ carrier_attribute {
+ mccmnc_tuple: "29509"
+ spn: "BICS"
+ }
+}
+carrier_id {
+ canonical_id: 2233
+ carrier_name: "EMnify"
+ carrier_attribute {
+ mccmnc_tuple: "29509"
+ }
+}
+carrier_id {
+ canonical_id: 2234
+ carrier_name: "Itisaluna"
+ carrier_attribute {
+ mccmnc_tuple: "41862"
+ }
+}
+carrier_id {
+ canonical_id: 2235
+ carrier_name: "Perfectum Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "43406"
+ }
+}
+carrier_id {
+ canonical_id: 2236
+ carrier_name: "SEATEL"
+ carrier_attribute {
+ mccmnc_tuple: "45611"
+ }
+}
+carrier_id {
+ canonical_id: 2237
+ carrier_name: "China Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "46003"
+ mccmnc_tuple: "46011"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ spn: "中国电信"
+ }
+}
+carrier_id {
+ canonical_id: 2238
+ carrier_name: "Sunsurf"
+ carrier_attribute {
+ mccmnc_tuple: "52504"
+ }
+}
+carrier_id {
+ canonical_id: 2239
+ carrier_name: "AIL"
+ carrier_attribute {
+ mccmnc_tuple: "54100"
+ }
+}
+carrier_id {
+ canonical_id: 2240
+ carrier_name: "Kiribati - TSKL"
+ carrier_attribute {
+ mccmnc_tuple: "54501"
+ }
+}
+carrier_id {
+ canonical_id: 2241
+ carrier_name: "Guinetel"
+ carrier_attribute {
+ mccmnc_tuple: "63207"
+ }
+}
+carrier_id {
+ canonical_id: 2242
+ carrier_name: "Privet"
+ carrier_attribute {
+ mccmnc_tuple: "63409"
+ }
+}
+carrier_id {
+ canonical_id: 2243
+ carrier_name: "Rwandatel"
+ carrier_attribute {
+ mccmnc_tuple: "63512"
+ }
+}
+carrier_id {
+ canonical_id: 2244
+ carrier_name: "Somafone"
+ carrier_attribute {
+ mccmnc_tuple: "63704"
+ }
+}
+carrier_id {
+ canonical_id: 2245
+ carrier_name: "Hormuud"
+ carrier_attribute {
+ mccmnc_tuple: "63725"
+ }
+}
+carrier_id {
+ canonical_id: 2246
+ carrier_name: "Unitel"
+ carrier_attribute {
+ mccmnc_tuple: "63757"
+ }
+}
+carrier_id {
+ canonical_id: 2247
+ carrier_name: "Eritel"
+ carrier_attribute {
+ mccmnc_tuple: "65701"
+ }
+}
+carrier_id {
+ canonical_id: 2248
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "70804"
+ mccmnc_tuple: "708040"
+ }
+}
+carrier_id {
+ canonical_id: 2249
+ carrier_name: "Tuenti"
+ carrier_attribute {
+ mccmnc_tuple: "72201"
+ gid1: "02"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "722010"
+ spn: "Tuenti"
+ gid1: "01"
+ }
+}
+carrier_id {
+ canonical_id: 2250
+ carrier_name: "Argentina:Nuestro"
+ carrier_attribute {
+ mccmnc_tuple: "72236"
+ }
+}
+carrier_id {
+ canonical_id: 2251
+ carrier_name: "Sberbank-Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "250050"
+ }
+}
+carrier_id {
+ canonical_id: 2252
+ carrier_name: "EastLink"
+ carrier_attribute {
+ mccmnc_tuple: "302270"
+ }
+}
+carrier_id {
+ canonical_id: 2253
+ carrier_name: "ALU Test-SIM"
+ carrier_attribute {
+ mccmnc_tuple: "310028"
+ }
+}
+carrier_id {
+ canonical_id: 2254
+ carrier_name: "etex"
+ carrier_attribute {
+ mccmnc_tuple: "310035"
+ spn: "etex"
+ }
+}
+carrier_id {
+ canonical_id: 2255
+ carrier_name: "NexTech Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "311100"
+ }
+}
+carrier_id {
+ canonical_id: 2256
+ carrier_name: "TelAlaska Cellular"
+ carrier_attribute {
+ mccmnc_tuple: "311740"
+ }
+}
+carrier_id {
+ canonical_id: 2257
+ carrier_name: "Cleartalk"
+ carrier_attribute {
+ mccmnc_tuple: "311750"
+ }
+}
+carrier_id {
+ canonical_id: 2258
+ carrier_name: "MobileNation"
+ carrier_attribute {
+ mccmnc_tuple: "311910"
+ }
+}
+carrier_id {
+ canonical_id: 2259
+ carrier_name: "Syringa"
+ carrier_attribute {
+ mccmnc_tuple: "311930"
+ }
+}
+carrier_id {
+ canonical_id: 2260
+ carrier_name: "NexTech Ota"
+ carrier_attribute {
+ mccmnc_tuple: "312420"
+ }
+}
+carrier_id {
+ canonical_id: 2261
+ carrier_name: "Blue Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "312570"
+ }
+}
+carrier_id {
+ canonical_id: 2262
+ carrier_name: "Open Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "330000"
+ spn: "openmobile"
+ }
+}
+carrier_id {
+ canonical_id: 2263
+ carrier_name: "Claro"
+ carrier_attribute {
+ mccmnc_tuple: "338070"
+ }
+}
+carrier_id {
+ canonical_id: 2264
+ carrier_name: "Videocon"
+ carrier_attribute {
+ mccmnc_tuple: "405823"
+ mccmnc_tuple: "405824"
+ mccmnc_tuple: "405825"
+ mccmnc_tuple: "405826"
+ mccmnc_tuple: "405827"
+ mccmnc_tuple: "405828"
+ mccmnc_tuple: "405829"
+ mccmnc_tuple: "405830"
+ mccmnc_tuple: "405832"
+ mccmnc_tuple: "405833"
+ mccmnc_tuple: "405834"
+ mccmnc_tuple: "405835"
+ mccmnc_tuple: "405836"
+ mccmnc_tuple: "405837"
+ mccmnc_tuple: "405838"
+ mccmnc_tuple: "405841"
+ mccmnc_tuple: "405842"
+ mccmnc_tuple: "405843"
+ mccmnc_tuple: "405932"
+ }
+}
+carrier_id {
+ canonical_id: 2265
+ carrier_name: "STEL"
+ carrier_attribute {
+ mccmnc_tuple: "405881"
+ mccmnc_tuple: "405882"
+ mccmnc_tuple: "405883"
+ mccmnc_tuple: "405884"
+ mccmnc_tuple: "405885"
+ mccmnc_tuple: "405886"
+ }
+}
+carrier_id {
+ canonical_id: 2266
+ carrier_name: "Cheers"
+ carrier_attribute {
+ mccmnc_tuple: "405912"
+ mccmnc_tuple: "405913"
+ mccmnc_tuple: "405914"
+ mccmnc_tuple: "405915"
+ mccmnc_tuple: "405916"
+ mccmnc_tuple: "405917"
+ mccmnc_tuple: "405918"
+ mccmnc_tuple: "405919"
+ mccmnc_tuple: "405920"
+ mccmnc_tuple: "405921"
+ mccmnc_tuple: "405922"
+ mccmnc_tuple: "405923"
+ mccmnc_tuple: "405930"
+ }
+}
+carrier_id {
+ canonical_id: 2267
+ carrier_name: "Tuyo"
+ carrier_attribute {
+ mccmnc_tuple: "712019"
+ mccmnc_tuple: "712190"
+ }
+}
+carrier_id {
+ canonical_id: 2268
+ carrier_name: "Viettel"
+ carrier_attribute {
+ mccmnc_tuple: "51403"
+ }
+}
+carrier_id {
+ canonical_id: 2270
+ carrier_name: "Telenet"
+ carrier_attribute {
+ mccmnc_tuple: "20601"
+ imsi_prefix_xpattern: "20601889"
+ }
+}
+carrier_id {
+ canonical_id: 2271
+ carrier_name: "Transatel"
+ carrier_attribute {
+ mccmnc_tuple: "20610"
+ spn: "BE-Transatel"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20610"
+ gid1: "BB00"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "22803"
+ spn: "CH-Transatel"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "22803"
+ gid1: "BB00"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "27077"
+ gid1: "BB00"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "27077"
+ spn: "LU-Transatel"
+ }
+}
+carrier_id {
+ canonical_id: 2272
+ carrier_name: "Auchan"
+ carrier_attribute {
+ mccmnc_tuple: "20810"
+ spn: "A MOBILE"
+ }
+}
+carrier_id {
+ canonical_id: 2273
+ carrier_name: "Reglo"
+ carrier_attribute {
+ mccmnc_tuple: "20810"
+ spn: "LeclercMobile"
+ spn: "RegloMobile"
+ }
+}
+carrier_id {
+ canonical_id: 2274
+ carrier_name: "La Poste"
+ carrier_attribute {
+ mccmnc_tuple: "20810"
+ gid1: "4C"
+ }
+}
+carrier_id {
+ canonical_id: 2275
+ carrier_name: "Darty"
+ carrier_attribute {
+ mccmnc_tuple: "20810"
+ gid1: "44"
+ }
+}
+carrier_id {
+ canonical_id: 2276
+ carrier_name: "Keyyo"
+ carrier_attribute {
+ mccmnc_tuple: "20810"
+ spn: "Keyyo Mobile"
+ }
+}
+carrier_id {
+ canonical_id: 2277
+ carrier_name: "Zero forfait"
+ carrier_attribute {
+ mccmnc_tuple: "20810"
+ spn: "ZERO FORFAIT"
+ }
+}
+carrier_id {
+ canonical_id: 2278
+ carrier_name: "R"
+ carrier_attribute {
+ mccmnc_tuple: "21406"
+ imsi_prefix_xpattern: "2140612"
+ }
+}
+carrier_id {
+ canonical_id: 2279
+ carrier_name: "eroskimovil"
+ carrier_attribute {
+ mccmnc_tuple: "21406"
+ imsi_prefix_xpattern: "2140606"
+ }
+}
+carrier_id {
+ canonical_id: 2282
+ carrier_name: "Noverca"
+ carrier_attribute {
+ mccmnc_tuple: "22201"
+ spn: "Noverca"
+ }
+}
+carrier_id {
+ canonical_id: 2283
+ carrier_name: "LIFE"
+ carrier_attribute {
+ mccmnc_tuple: "23433"
+ spn: "LIFE"
+ }
+}
+carrier_id {
+ canonical_id: 2284
+ carrier_name: "Telmore"
+ carrier_attribute {
+ mccmnc_tuple: "23801"
+ spn: "TELMORE"
+ }
+}
+carrier_id {
+ canonical_id: 2285
+ carrier_name: "Call Me"
+ carrier_attribute {
+ mccmnc_tuple: "23820"
+ spn: "Call me"
+ }
+}
+carrier_id {
+ canonical_id: 2286
+ carrier_name: "DLG Tele"
+ carrier_attribute {
+ mccmnc_tuple: "23820"
+ spn: "DLG Tele"
+ }
+}
+carrier_id {
+ canonical_id: 2287
+ carrier_name: "Halebop"
+ carrier_attribute {
+ mccmnc_tuple: "24001"
+ spn: "halebop"
+ }
+}
+carrier_id {
+ canonical_id: 2288
+ carrier_name: "GSC"
+ carrier_attribute {
+ mccmnc_tuple: "311590"
+ spn: "gsc"
+ }
+}
+carrier_id {
+ canonical_id: 2289
+ carrier_name: "Cable & Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "348170"
+ }
+}
+carrier_id {
+ canonical_id: 2290
+ carrier_name: "Cable & Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "366110"
+ }
+}
+carrier_id {
+ canonical_id: 2291
+ carrier_name: "Cable & Wireless West Indies Ltd (Turks & Caicos)"
+ carrier_attribute {
+ mccmnc_tuple: "376350"
+ }
+}
+carrier_id {
+ canonical_id: 2292
+ carrier_name: "Cable & Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "354860"
+ }
+}
+carrier_id {
+ canonical_id: 2293
+ carrier_name: "Cable & Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "358110"
+ }
+}
+carrier_id {
+ canonical_id: 2294
+ carrier_name: "Cable & Wireless (St. Vincent & the Grenadines) Ltd"
+ carrier_attribute {
+ mccmnc_tuple: "360110"
+ }
+}
+carrier_id {
+ canonical_id: 2295
+ carrier_name: "Cable & Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "365840"
+ }
+}
+carrier_id {
+ canonical_id: 2297
+ carrier_name: "Happy"
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ spn: "Happy"
+ }
+}
+carrier_id {
+ canonical_id: 2298
+ carrier_name: "RACC"
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ spn: "RACC"
+ }
+}
+carrier_id {
+ canonical_id: 2299
+ carrier_name: "CABLE movil"
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ spn: "CABLE movil"
+ }
+}
+carrier_id {
+ canonical_id: 2301
+ carrier_name: "Ibercom"
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ spn: "Ibercom"
+ }
+}
+carrier_id {
+ canonical_id: 2303
+ carrier_name: "PosteMobile"
+ carrier_attribute {
+ mccmnc_tuple: "22210"
+ spn: "PosteMobile"
+ }
+}
+carrier_id {
+ canonical_id: 2304
+ carrier_name: "ERG"
+ carrier_attribute {
+ mccmnc_tuple: "22210"
+ spn: "ERG"
+ }
+}
+carrier_id {
+ canonical_id: 2308
+ carrier_name: "Sainsbury's"
+ carrier_attribute {
+ mccmnc_tuple: "23415"
+ spn: "Sainsbury's"
+ }
+}
+carrier_id {
+ canonical_id: 2309
+ carrier_name: "Lebara"
+ carrier_attribute {
+ mccmnc_tuple: "23415"
+ spn: "Lebara"
+ }
+}
+carrier_id {
+ canonical_id: 2310
+ carrier_name: "Debitel"
+ carrier_attribute {
+ mccmnc_tuple: "26201"
+ spn: "debitel"
+ }
+}
+carrier_id {
+ canonical_id: 2315
+ carrier_name: "Norvado"
+ carrier_attribute {
+ mccmnc_tuple: "311500"
+ spn: "Norvado Wireless"
+ spn: "Norvado Wireless RPA"
+ spn: "Norvado Wireless RPT"
+ spn: "Norvado Wireless RPO"
+ }
+}
+carrier_id {
+ canonical_id: 2316
+ carrier_name: "Mosaic Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "311500"
+ spn: "Mosaic RPA"
+ spn: "Mosaic Mobile"
+ spn: "Mosaic RPT"
+ spn: "Mosaic RPO"
+ }
+}
+carrier_id {
+ canonical_id: 2317
+ carrier_name: "Nemont"
+ carrier_attribute {
+ mccmnc_tuple: "311350"
+ spn: "nemont"
+ }
+}
+carrier_id {
+ canonical_id: 2318
+ carrier_name: "Bravado wireless"
+ carrier_attribute {
+ mccmnc_tuple: "311140"
+ spn: "sprocket"
+ }
+}
+carrier_id {
+ canonical_id: 2319
+ carrier_name: "Element Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "311070"
+ spn: "elementmobile"
+ }
+}
+carrier_id {
+ canonical_id: 2320
+ carrier_name: "strata"
+ carrier_attribute {
+ mccmnc_tuple: "310960"
+ spn: "strata"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "312290"
+ }
+}
+carrier_id {
+ canonical_id: 2321
+ carrier_name: "southcentral"
+ carrier_attribute {
+ mccmnc_tuple: "310960"
+ spn: "southcentral"
+ }
+}
+carrier_id {
+ canonical_id: 2322
+ carrier_name: "snakeriver"
+ carrier_attribute {
+ mccmnc_tuple: "310960"
+ spn: "snakeriver"
+ }
+}
+carrier_id {
+ canonical_id: 2323
+ carrier_name: "silverstar"
+ carrier_attribute {
+ mccmnc_tuple: "310960"
+ spn: "silverstar"
+ }
+}
+carrier_id {
+ canonical_id: 2324
+ carrier_name: "NNTC Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310960"
+ spn: "nntcwire"
+ }
+}
+carrier_id {
+ canonical_id: 2325
+ carrier_name: "Clear Sky Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310820"
+ spn: "nepa"
+ }
+}
+carrier_id {
+ canonical_id: 2326
+ carrier_name: "EMnify"
+ carrier_attribute {
+ mccmnc_tuple: "53703"
+ mccmnc_tuple: "29505"
+ spn: "EMnify"
+ }
+}
+carrier_id {
+ canonical_id: 2327
+ carrier_name: "Telemach"
+ carrier_attribute {
+ mccmnc_tuple: "29370"
+ imsi_prefix_xpattern: "29370029"
+ }
+}
+carrier_id {
+ canonical_id: 2328
+ carrier_name: "Fonic Prepaid"
+ carrier_attribute {
+ mccmnc_tuple: "26207"
+ imsi_prefix_xpattern: "26207520"
+ }
+}
+carrier_id {
+ canonical_id: 2330
+ carrier_name: "Tchibo"
+ carrier_attribute {
+ mccmnc_tuple: "26207"
+ imsi_prefix_xpattern: "26207500"
+ }
+}
+carrier_id {
+ canonical_id: 2331
+ carrier_name: "Djuice"
+ carrier_attribute {
+ mccmnc_tuple: "25503"
+ spn: "djuice"
+ }
+}
+carrier_id {
+ canonical_id: 2332
+ carrier_name: "Send"
+ carrier_attribute {
+ mccmnc_tuple: "24801"
+ imsi_prefix_xpattern: "248010x2"
+ imsi_prefix_xpattern: "248010x3"
+ }
+}
+carrier_id {
+ canonical_id: 2333
+ carrier_name: "Ventelo"
+ carrier_attribute {
+ mccmnc_tuple: "24201"
+ imsi_prefix_xpattern: "24201700"
+ }
+}
+carrier_id {
+ canonical_id: 2334
+ carrier_name: "Chess"
+ carrier_attribute {
+ mccmnc_tuple: "24202"
+ imsi_prefix_xpattern: "2420256"
+ }
+}
+carrier_id {
+ canonical_id: 2335
+ carrier_name: "Virgin"
+ carrier_attribute {
+ mccmnc_tuple: "65507"
+ imsi_prefix_xpattern: "6550710"
+ }
+}
+carrier_id {
+ canonical_id: 2337
+ carrier_name: "Movil exito"
+ carrier_attribute {
+ mccmnc_tuple: "732103"
+ mccmnc_tuple: "732111"
+ spn: "movil exito"
+ }
+}
+carrier_id {
+ canonical_id: 2338
+ carrier_name: "UNE"
+ carrier_attribute {
+ mccmnc_tuple: "732103"
+ mccmnc_tuple: "732111"
+ spn: "UNE"
+ }
+}
+carrier_id {
+ canonical_id: 2339
+ carrier_name: "Virgin Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "732123"
+ spn: "Virgin Mobile"
+ }
+}
+carrier_id {
+ canonical_id: 2340
+ carrier_name: "Google CBRS"
+ carrier_attribute {
+ mccmnc_tuple: "312580"
+ }
+}
+carrier_id {
+ canonical_id: 2345
+ carrier_name: "Mobitel"
+ carrier_attribute {
+ mccmnc_tuple: "41845"
+ }
+}
+carrier_id {
+ canonical_id: 2346
+ carrier_name: "Unitel"
+ carrier_attribute {
+ mccmnc_tuple: "45703"
+ }
+}
+carrier_id {
+ canonical_id: 2347
+ carrier_name: "Unitel"
+ carrier_attribute {
+ mccmnc_tuple: "42888"
+ }
+}
+carrier_id {
+ canonical_id: 2348
+ carrier_name: "Libya Phone"
+ carrier_attribute {
+ mccmnc_tuple: "60603"
+ }
+}
+carrier_id {
+ canonical_id: 2349
+ carrier_name: "YemenMobile"
+ carrier_attribute {
+ mccmnc_tuple: "42103"
+ mccmnc_tuple: "42111"
+ mccmnc_tuple: "42122"
+ }
+}
+carrier_id {
+ canonical_id: 2350
+ carrier_name: "B-Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "52802"
+ }
+}
+carrier_id {
+ canonical_id: 2351
+ carrier_name: "AGMS"
+ carrier_attribute {
+ mccmnc_tuple: "20465"
+ }
+}
+carrier_id {
+ canonical_id: 2352
+ carrier_name: "MTCE"
+ carrier_attribute {
+ mccmnc_tuple: "43270"
+ }
+}
+carrier_id {
+ canonical_id: 2353
+ carrier_name: "SK Telink"
+ carrier_attribute {
+ mccmnc_tuple: "45011"
+ }
+}
+carrier_id {
+ canonical_id: 2354
+ carrier_name: "Smart"
+ carrier_attribute {
+ mccmnc_tuple: "70299"
+ }
+}
+carrier_id {
+ canonical_id: 2355
+ carrier_name: "Smart Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "64207"
+ }
+}
+carrier_id {
+ canonical_id: 2356
+ carrier_name: "Digicel"
+ carrier_attribute {
+ mccmnc_tuple: "34877"
+ mccmnc_tuple: "348770"
+ }
+}
+carrier_id {
+ canonical_id: 2357
+ carrier_name: "Tuenti"
+ carrier_attribute {
+ mccmnc_tuple: "21405"
+ spn: "Tuenti"
+ }
+}
+carrier_id {
+ canonical_id: 2358
+ carrier_name: "Farzanegan Pars"
+ carrier_attribute {
+ mccmnc_tuple: "43293"
+ }
+}
+carrier_id {
+ canonical_id: 2359
+ carrier_name: "Bitel"
+ carrier_attribute {
+ mccmnc_tuple: "71615"
+ }
+}
+carrier_id {
+ canonical_id: 2360
+ carrier_name: "Telefonica"
+ carrier_attribute {
+ mccmnc_tuple: "26203"
+ gid1: "010301FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "010901FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ }
+}
+carrier_id {
+ canonical_id: 2361
+ carrier_name: "o2"
+ carrier_attribute {
+ mccmnc_tuple: "26207"
+ gid1: "010301FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ gid1: "010901FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ }
+}
+carrier_id {
+ canonical_id: 2362
+ carrier_name: "Vodacom"
+ carrier_attribute {
+ mccmnc_tuple: "64004"
+ }
+}
+carrier_id {
+ canonical_id: 2363
+ carrier_name: "Crnogorski Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "29702"
+ }
+}
+carrier_id {
+ canonical_id: 2364
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "53001"
+ }
+}
+carrier_id {
+ canonical_id: 2365
+ carrier_name: "Hrvatski Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "21901"
+ mccmnc_tuple: "21920"
+ }
+}
+carrier_id {
+ canonical_id: 2366
+ carrier_name: "Swisscom"
+ carrier_attribute {
+ mccmnc_tuple: "22801"
+ }
+}
+carrier_id {
+ canonical_id: 2367
+ carrier_name: "T-Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "26002"
+ }
+}
+carrier_id {
+ canonical_id: 2368
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "27801"
+ }
+}
+carrier_id {
+ canonical_id: 2369
+ carrier_name: "Orange"
+ carrier_attribute {
+ mccmnc_tuple: "21403"
+ }
+}
+carrier_id {
+ canonical_id: 2378
+ carrier_name: "Vi"
+ carrier_attribute {
+ mccmnc_tuple: "40401"
+ mccmnc_tuple: "40405"
+ mccmnc_tuple: "40411"
+ mccmnc_tuple: "40413"
+ mccmnc_tuple: "40415"
+ mccmnc_tuple: "40420"
+ mccmnc_tuple: "40427"
+ mccmnc_tuple: "40430"
+ mccmnc_tuple: "40443"
+ mccmnc_tuple: "40446"
+ mccmnc_tuple: "40460"
+ mccmnc_tuple: "40484"
+ mccmnc_tuple: "40486"
+ mccmnc_tuple: "40488"
+ mccmnc_tuple: "40566"
+ mccmnc_tuple: "40567"
+ mccmnc_tuple: "405750"
+ mccmnc_tuple: "405751"
+ mccmnc_tuple: "405752"
+ mccmnc_tuple: "405753"
+ mccmnc_tuple: "405754"
+ mccmnc_tuple: "405755"
+ mccmnc_tuple: "405756"
+ }
+}
+carrier_id {
+ canonical_id: 2380
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "60202"
+ }
+}
+carrier_id {
+ canonical_id: 2381
+ carrier_name: "Vodacom"
+ carrier_attribute {
+ mccmnc_tuple: "64304"
+ }
+}
+carrier_id {
+ canonical_id: 2383
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "62002"
+ }
+}
+carrier_id {
+ canonical_id: 2385
+ carrier_name: "Slovak Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "23102"
+ }
+}
+carrier_id {
+ canonical_id: 2386
+ carrier_name: "T-Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "20416"
+ }
+}
+carrier_id {
+ canonical_id: 2387
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "27201"
+ }
+}
+carrier_id {
+ canonical_id: 2391
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "22601"
+ }
+}
+carrier_id {
+ canonical_id: 2392
+ carrier_name: "VCL"
+ carrier_attribute {
+ mccmnc_tuple: "65101"
+ }
+}
+carrier_id {
+ canonical_id: 2393
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "42702"
+ }
+}
+carrier_id {
+ canonical_id: 2394
+ carrier_name: "T-Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "23001"
+ }
+}
+carrier_id {
+ canonical_id: 2395
+ carrier_name: "Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "26201"
+ mccmnc_tuple: "26206"
+ }
+}
+carrier_id {
+ canonical_id: 2396
+ carrier_name: "Mkedonski Telecom AD Skopje"
+ carrier_attribute {
+ mccmnc_tuple: "29401"
+ }
+}
+carrier_id {
+ canonical_id: 2397
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "26202"
+ }
+}
+carrier_id {
+ canonical_id: 2398
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "23003"
+ }
+}
+carrier_id {
+ canonical_id: 2399
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "20205"
+ }
+}
+carrier_id {
+ canonical_id: 2401
+ carrier_name: "Magyar Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "21630"
+ }
+}
+carrier_id {
+ canonical_id: 2403
+ carrier_name: "Lycamobile"
+ carrier_attribute {
+ mccmnc_tuple: "26009"
+ spn: "Lycamobile"
+ }
+}
+carrier_id {
+ canonical_id: 2404
+ carrier_name: "Lycamobile"
+ carrier_attribute {
+ mccmnc_tuple: "23208"
+ spn: "Lycamobile"
+ }
+}
+carrier_id {
+ canonical_id: 2405
+ carrier_name: "Lycamobile"
+ carrier_attribute {
+ mccmnc_tuple: "24012"
+ spn: "Lycamobile"
+ }
+}
+carrier_id {
+ canonical_id: 2406
+ carrier_name: "Rabo Mobiel Int."
+ carrier_attribute {
+ mccmnc_tuple: "20408"
+ spn: "Rabo Mobiel"
+ }
+}
+carrier_id {
+ canonical_id: 2407
+ carrier_name: "OCN MOBILE ONE"
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ preferred_apn: "lte-d.ocn.ne.jp"
+ preferred_apn: "lte.ocn.ne.jp"
+ preferred_apn: "ocn.ne.jp"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "44013"
+ }
+}
+carrier_id {
+ canonical_id: 2408
+ carrier_name: "Vmax Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "46609"
+ }
+}
+carrier_id {
+ canonical_id: 2409
+ carrier_name: "Dishnet Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "40448"
+ }
+}
+carrier_id {
+ canonical_id: 2411
+ carrier_name: "Wireless City Planning"
+ carrier_attribute {
+ mccmnc_tuple: "44100"
+ }
+}
+carrier_id {
+ canonical_id: 2412
+ carrier_name: "ACeS"
+ carrier_attribute {
+ mccmnc_tuple: "52020"
+ }
+}
+carrier_id {
+ canonical_id: 2413
+ carrier_name: "TOT"
+ carrier_attribute {
+ mccmnc_tuple: "52047"
+ }
+}
+carrier_id {
+ canonical_id: 2414
+ carrier_name: "Airtel Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "302290"
+ }
+}
+carrier_id {
+ canonical_id: 2415
+ carrier_name: "Fonyou Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "21420"
+ }
+}
+carrier_id {
+ canonical_id: 2416
+ carrier_name: "Fastweb SpA"
+ carrier_attribute {
+ mccmnc_tuple: "22208"
+ }
+}
+carrier_id {
+ canonical_id: 2417
+ carrier_name: "FIZZ"
+ carrier_attribute {
+ mccmnc_tuple: "302500"
+ gid1: "55"
+ }
+}
+carrier_id {
+ canonical_id: 2418
+ carrier_name: "TalkMobile"
+ carrier_attribute {
+ mccmnc_tuple: "23415"
+ spn: ""
+ spn: "Talkmobile"
+ gid1: "C1"
+ }
+}
+carrier_id {
+ canonical_id: 2419
+ carrier_name: "EE Business"
+ carrier_attribute {
+ mccmnc_tuple: "23433"
+ gid1: "ec"
+ gid1: "ecff"
+ }
+}
+carrier_id {
+ canonical_id: 2420
+ carrier_name: "ION Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "21434"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21405"
+ imsi_prefix_xpattern: "214050104"
+ }
+}
+carrier_id {
+ canonical_id: 2421
+ carrier_name: "Testing US"
+ carrier_attribute {
+ mccmnc_tuple: "310014"
+ mccmnc_tuple: "311400"
+ }
+}
+carrier_id {
+ canonical_id: 2422
+ carrier_name: "MTX"
+ carrier_attribute {
+ mccmnc_tuple: "27002"
+ }
+}
+carrier_id {
+ canonical_id: 2423
+ carrier_name: "Plintron IT"
+ carrier_attribute {
+ mccmnc_tuple: "22254"
+ spn: "Plintron"
+ }
+}
+carrier_id {
+ canonical_id: 2424
+ carrier_name: "Plintron AT"
+ carrier_attribute {
+ mccmnc_tuple: "23222"
+ spn: "Plintron"
+ }
+}
+carrier_id {
+ canonical_id: 2425
+ carrier_name: "iD Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "23420"
+ gid1: "0305"
+ }
+}
+carrier_id {
+ canonical_id: 2427
+ carrier_name: "京东通信"
+ carrier_attribute {
+ mccmnc_tuple: "46000"
+ spn: "京东通信"
+ }
+}
+carrier_id {
+ canonical_id: 2428
+ carrier_name: "Telin"
+ carrier_attribute {
+ mccmnc_tuple: "45400"
+ imsi_prefix_xpattern: "454006081"
+ }
+}
+carrier_id {
+ canonical_id: 2429
+ carrier_name: "Rakuten Mobile(MNO)"
+ carrier_attribute {
+ mccmnc_tuple: "44011"
+ }
+}
+carrier_id {
+ canonical_id: 2430
+ carrier_name: "Syma Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "20801"
+ spn: "SYMA"
+ }
+}
+carrier_id {
+ canonical_id: 2432
+ carrier_name: "nuromobile"
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ preferred_apn: "so-net.jp"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "44051"
+ preferred_apn: "so-net.jp"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "44020"
+ preferred_apn: "so-net.jp"
+ }
+}
+carrier_id {
+ canonical_id: 2433
+ carrier_name: "Assurance Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ mccmnc_tuple: "311490"
+ mccmnc_tuple: "312530"
+ gid1: "000006"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310240"
+ mccmnc_tuple: "311490"
+ mccmnc_tuple: "311660"
+ mccmnc_tuple: "311882"
+ mccmnc_tuple: "312250"
+ gid1: "1A53"
+ }
+}
+carrier_id {
+ canonical_id: 2434
+ carrier_name: "giga_sg"
+ carrier_attribute {
+ mccmnc_tuple: "52505"
+ spn: "giga"
+ }
+}
+carrier_id {
+ canonical_id: 2435
+ carrier_name: "Xplornet"
+ carrier_attribute {
+ mccmnc_tuple: "302130"
+ mccmnc_tuple: "302131"
+ }
+}
+carrier_id {
+ canonical_id: 2436
+ carrier_name: "izi"
+ carrier_attribute {
+ mccmnc_tuple: "40101"
+ imsi_prefix_xpattern: "40101568"
+ }
+}
+carrier_id {
+ canonical_id: 2437
+ carrier_name: "Wind Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "37005"
+ }
+}
+carrier_id {
+ canonical_id: 2438
+ carrier_name: "Daily Telecom Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "22210"
+ spn: "Daily Telecom"
+ }
+}
+carrier_id {
+ canonical_id: 2439
+ carrier_name: "VERY"
+ carrier_attribute {
+ mccmnc_tuple: "22288"
+ mccmnc_tuple: "22299"
+ gid1: "0000000099"
+ }
+}
+carrier_id {
+ canonical_id: 2442
+ carrier_name: "Digi Spain"
+ carrier_attribute {
+ mccmnc_tuple: "21422"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21405"
+ mccmnc_tuple: "22605"
+ gid1: "44474553"
+ }
+}
+carrier_id {
+ canonical_id: 2443
+ carrier_name: "Digi Italy"
+ carrier_attribute {
+ mccmnc_tuple: "22236"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "21405"
+ mccmnc_tuple: "22605"
+ gid1: "44474954"
+ }
+}
+carrier_id {
+ canonical_id: 2444
+ carrier_name: "Next Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "25047"
+ }
+}
+carrier_id {
+ canonical_id: 2445
+ carrier_name: "rain"
+ carrier_attribute {
+ mccmnc_tuple: "65538"
+ mccmnc_tuple: "65519"
+ mccmnc_tuple: "65573"
+ mccmnc_tuple: "65574"
+ }
+}
+carrier_id {
+ canonical_id: 2446
+ carrier_name: "Sberbank"
+ carrier_attribute {
+ mccmnc_tuple: "25050"
+ }
+}
+carrier_id {
+ canonical_id: 2447
+ carrier_name: "IDC"
+ carrier_attribute {
+ mccmnc_tuple: "25915"
+ spn: "IDC"
+ }
+}
+carrier_id {
+ canonical_id: 2448
+ carrier_name: "VTB Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "25026"
+ }
+}
+carrier_id {
+ canonical_id: 2449
+ carrier_name: "Spectrum+"
+ carrier_attribute {
+ mccmnc_tuple: "314020"
+ }
+}
+carrier_id {
+ canonical_id: 2450
+ carrier_name: "SUN Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "45400"
+ gid1: "01030000FFFFFFFF"
+ }
+}
+carrier_id {
+ canonical_id: 2451
+ carrier_name: "Tune Talk"
+ carrier_attribute {
+ mccmnc_tuple: "50219"
+ imsi_prefix_xpattern: "5021955"
+ }
+}
+carrier_id {
+ canonical_id: 2452
+ carrier_name: "WEB CoopVoce"
+ carrier_attribute {
+ mccmnc_tuple: "22253"
+ }
+}
+carrier_id {
+ canonical_id: 2453
+ carrier_name: "Connect"
+ carrier_attribute {
+ mccmnc_tuple: "41515"
+ }
+}
+carrier_id {
+ canonical_id: 2454
+ carrier_name: "Annatel"
+ carrier_attribute {
+ mccmnc_tuple: "42526"
+ }
+}
+carrier_id {
+ canonical_id: 2455
+ carrier_name: "homobile_it"
+ carrier_attribute {
+ mccmnc_tuple: "22210"
+ spn: "ho."
+ }
+}
+carrier_id {
+ canonical_id: 2457
+ carrier_name: "Nordic Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "23004"
+ imsi_prefix_xpattern: "230040"
+ }
+}
+carrier_id {
+ canonical_id: 2458
+ carrier_name: "Yota Nicaragua"
+ carrier_attribute {
+ mccmnc_tuple: "71070"
+ }
+}
+carrier_id {
+ canonical_id: 2459
+ carrier_name: "GigSky"
+ carrier_attribute {
+ mccmnc_tuple: "312870"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "22201"
+ spn: "GigSky"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310380"
+ imsi_prefix_xpattern: "3103805"
+ spn: "GigSky"
+ gid1: "6F"
+ gid1: "6E"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "23801"
+ imsi_prefix_xpattern: "23801395"
+ spn: "GigSky"
+ gid1: "6F"
+ gid1: "6E"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "24007"
+ imsi_prefix_xpattern: "240075614"
+ spn: "GigSky"
+ gid1: "6F"
+ gid1: "6E"
+ }
+}
+carrier_id {
+ canonical_id: 2460
+ carrier_name: "Shaw Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "302490"
+ imsi_prefix_xpattern: "3024904"
+ gid1: "53"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "302490"
+ imsi_prefix_xpattern: "3024905"
+ gid1: "53"
+ }
+}
+carrier_id {
+ canonical_id: 2461
+ carrier_name: "Voiceworks DE"
+ carrier_attribute {
+ mccmnc_tuple: "26220"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "26203"
+ imsi_prefix_xpattern: "26203483"
+ }
+}
+carrier_id {
+ canonical_id: 2463
+ carrier_name: "SevenNet Layers"
+ carrier_attribute {
+ mccmnc_tuple: "41877"
+ }
+}
+carrier_id {
+ canonical_id: 2464
+ carrier_name: "Mobi"
+ carrier_attribute {
+ mccmnc_tuple: "313460"
+ }
+}
+carrier_id {
+ canonical_id: 2467
+ carrier_name: "Emergency Services Network"
+ carrier_attribute {
+ mccmnc_tuple: "23471"
+ }
+}
+carrier_id {
+ canonical_id: 2468
+ carrier_name: "Tele2"
+ carrier_attribute {
+ mccmnc_tuple: "20416"
+ gid1: "8F"
+ gid1: "4E4C"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20416"
+ spn: "Tele2 NL"
+ }
+}
+carrier_id {
+ canonical_id: 2469
+ carrier_name: "ALTAN - Internal Use"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ }
+}
+carrier_id {
+ canonical_id: 2470
+ carrier_name: "ALTAN - IENTC"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "IENTC"
+ }
+}
+carrier_id {
+ canonical_id: 2471
+ carrier_name: "ALTAN - NeWWW"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "NeWWW"
+ }
+}
+carrier_id {
+ canonical_id: 2472
+ carrier_name: "Travelfy"
+ carrier_attribute {
+ mccmnc_tuple: "52505"
+ imsi_prefix_xpattern: "5250530996"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "23410"
+ imsi_prefix_xpattern: "2341040991"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "732123"
+ imsi_prefix_xpattern: "7321232010"
+ }
+}
+carrier_id {
+ canonical_id: 2473
+ carrier_name: "MEGACABLE"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "Mega4.5 G"
+ }
+}
+carrier_id {
+ canonical_id: 2474
+ carrier_name: "NETWEY"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "NETWEY"
+ }
+}
+carrier_id {
+ canonical_id: 2475
+ carrier_name: "RETEMEX"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "RETEMEX"
+ }
+}
+carrier_id {
+ canonical_id: 2476
+ carrier_name: "WALMART"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "BAIT"
+ }
+}
+carrier_id {
+ canonical_id: 2477
+ carrier_name: "IUSACOMM"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "IUSATEL"
+ }
+}
+carrier_id {
+ canonical_id: 2478
+ carrier_name: "CFE"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "CFE TEIPT"
+ }
+}
+carrier_id {
+ canonical_id: 2479
+ carrier_name: "INTEN"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "INTEN"
+ }
+}
+carrier_id {
+ canonical_id: 2480
+ carrier_name: "DIVERACY"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "NEMI"
+ }
+}
+carrier_id {
+ canonical_id: 2481
+ carrier_name: "DIRI"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "DIRI"
+ }
+}
+carrier_id {
+ canonical_id: 2482
+ carrier_name: "TOPOS"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "TURBORED"
+ }
+}
+carrier_id {
+ canonical_id: 2483
+ carrier_name: "GURUWEB"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "Gurucomm"
+ }
+}
+carrier_id {
+ canonical_id: 2484
+ carrier_name: "UBIX"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "Ubix"
+ }
+}
+carrier_id {
+ canonical_id: 2485
+ carrier_name: "ROCKETEL"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "PagaPhone"
+ }
+}
+carrier_id {
+ canonical_id: 2486
+ carrier_name: "Redpotencia"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "Redpotencia"
+ }
+}
+carrier_id {
+ canonical_id: 2487
+ carrier_name: "ADDINTELI"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "CHAMO-MOVIL"
+ spn: "BYPLUS"
+ }
+}
+carrier_id {
+ canonical_id: 2488
+ carrier_name: "IZZI"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "izzi"
+ }
+}
+carrier_id {
+ canonical_id: 2489
+ carrier_name: "ADM"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "MISTRAL"
+ }
+}
+carrier_id {
+ canonical_id: 2490
+ carrier_name: "ADS"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "MEXFON"
+ }
+}
+carrier_id {
+ canonical_id: 2491
+ carrier_name: "YONDER"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "YO"
+ }
+}
+carrier_id {
+ canonical_id: 2492
+ carrier_name: "Arlonet"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "Arlonet"
+ }
+}
+carrier_id {
+ canonical_id: 2493
+ carrier_name: "TRIDEX"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "VALOR"
+ }
+}
+carrier_id {
+ canonical_id: 2494
+ carrier_name: "WiMO"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "WiMO"
+ }
+}
+carrier_id {
+ canonical_id: 2495
+ carrier_name: "OUI"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "OUI"
+ }
+}
+carrier_id {
+ canonical_id: 2496
+ carrier_name: "FREEDOMPOP"
+ carrier_attribute {
+ mccmnc_tuple: "334140"
+ spn: "FreedomPop"
+ }
+}
+carrier_id {
+ canonical_id: 2497
+ carrier_name: "Vodafone GDSP"
+ carrier_attribute {
+ mccmnc_tuple: "90128"
+ }
+}
+carrier_id {
+ canonical_id: 2498
+ carrier_name: "Optimum"
+ carrier_attribute {
+ mccmnc_tuple: "313390"
+ }
+}
+carrier_id {
+ canonical_id: 2499
+ carrier_name: "Belong"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "Belong"
+ }
+}
+carrier_id {
+ canonical_id: 2500
+ carrier_name: "Telechoice"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "TeleChoice"
+ }
+}
+carrier_id {
+ canonical_id: 2501
+ carrier_name: "Woolworths"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "Woolworths"
+ }
+}
+carrier_id {
+ canonical_id: 2502
+ carrier_name: "NuMobile"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "nu mobile"
+ }
+}
+carrier_id {
+ canonical_id: 2503
+ carrier_name: "Boost"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "BOOST"
+ }
+}
+carrier_id {
+ canonical_id: 2504
+ carrier_name: "Liberty Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "313790"
+ }
+}
+carrier_id {
+ canonical_id: 2505
+ carrier_name: "OptimERA Wireless"
+ carrier_attribute {
+ mccmnc_tuple: "313380"
+ spn: "OptimERA"
+ }
+}
+carrier_id {
+ canonical_id: 2506
+ carrier_name: "Alestra Servicios Moviles"
+ carrier_attribute {
+ mccmnc_tuple: "334130"
+ }
+}
+carrier_id {
+ canonical_id: 2507
+ carrier_name: "UPC"
+ carrier_attribute {
+ mccmnc_tuple: "22853"
+ gid1: "75636831FFFFFFFFFF"
+ }
+}
+carrier_id {
+ canonical_id: 2508
+ carrier_name: "Virgin Media Ireland"
+ carrier_attribute {
+ mccmnc_tuple: "27215"
+ gid1: "75696531FFFFFFFFFF"
+ gid2: "75696532FFFFFFFFFF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20601"
+ imsi_prefix_xpattern: "206018016"
+ }
+}
+carrier_id {
+ canonical_id: 2509
+ carrier_name: "Evolve"
+ carrier_attribute {
+ mccmnc_tuple: "310990"
+ }
+}
+carrier_id {
+ canonical_id: 2510
+ carrier_name: "Melita"
+ carrier_attribute {
+ mccmnc_tuple: "27877"
+ }
+}
+carrier_id {
+ canonical_id: 2511
+ carrier_name: "Kena"
+ carrier_attribute {
+ mccmnc_tuple: "22207"
+ }
+}
+carrier_id {
+ canonical_id: 2512
+ carrier_name: "Goodspeed"
+ carrier_attribute {
+ mccmnc_tuple: "24042"
+ gid1: "C5"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "23203"
+ gid1: "C5"
+ }
+}
+carrier_id {
+ canonical_id: 2514
+ carrier_name: "povo"
+ carrier_attribute {
+ mccmnc_tuple: "44051"
+ mccmnc_tuple: "44054"
+ gid1: "26"
+ }
+}
+carrier_id {
+ canonical_id: 2515
+ carrier_name: "J:COM MOBILE"
+ carrier_attribute {
+ mccmnc_tuple: "44051"
+ mccmnc_tuple: "44054"
+ gid1: "22"
+ }
+}
+carrier_id {
+ canonical_id: 2516
+ carrier_name: "HMD Connect Pro"
+ carrier_attribute {
+ mccmnc_tuple: "22201"
+ spn: "hmd connect"
+ }
+}
+carrier_id {
+ canonical_id: 2517
+ carrier_name: "Dish"
+ carrier_attribute {
+ mccmnc_tuple: "313340"
+ gid1: "6530"
+ }
+}
+carrier_id {
+ canonical_id: 2518
+ carrier_name: "Boost Mobile - MNO"
+ carrier_attribute {
+ mccmnc_tuple: "313340"
+ gid1: "6332"
+ }
+}
+carrier_id {
+ canonical_id: 2519
+ carrier_name: "Boost Mobile - MVNO1"
+ carrier_attribute {
+ mccmnc_tuple: "310240"
+ gid1: "6432"
+ }
+}
+carrier_id {
+ canonical_id: 2520
+ carrier_name: "Republic - MNO"
+ carrier_attribute {
+ mccmnc_tuple: "313340"
+ gid1: "6630"
+ }
+}
+carrier_id {
+ canonical_id: 2521
+ carrier_name: "Ting - MNO"
+ carrier_attribute {
+ mccmnc_tuple: "313340"
+ gid1: "7330"
+ }
+}
+carrier_id {
+ canonical_id: 2522
+ carrier_name: "Republic - MVNO1"
+ carrier_attribute {
+ mccmnc_tuple: "310240"
+ gid1: "6436"
+ }
+}
+carrier_id {
+ canonical_id: 2523
+ carrier_name: "Ting - MVNO1"
+ carrier_attribute {
+ mccmnc_tuple: "310240"
+ gid1: "6430"
+ }
+}
+carrier_id {
+ canonical_id: 2524
+ carrier_name: "Erate"
+ carrier_attribute {
+ mccmnc_tuple: "24215"
+ gid1: "0e"
+ }
+}
+carrier_id {
+ canonical_id: 2525
+ carrier_name: "Boost Mobile - MVNO2"
+ carrier_attribute {
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "311180"
+ gid1: "3432"
+ }
+}
+carrier_id {
+ canonical_id: 2526
+ carrier_name: "Ting - MVNO2"
+ carrier_attribute {
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "311180"
+ gid1: "3430"
+ }
+}
+carrier_id {
+ canonical_id: 2527
+ carrier_name: "Republic - MVNO2"
+ carrier_attribute {
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "311180"
+ gid1: "3436"
+ }
+}
+carrier_id {
+ canonical_id: 2528
+ carrier_name: "Project Genesis - MNO"
+ carrier_attribute {
+ mccmnc_tuple: "313340"
+ gid1: "6538"
+ }
+}
+carrier_id {
+ canonical_id: 2529
+ carrier_name: "DOCOMO MVNO"
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ }
+}
+carrier_id {
+ canonical_id: 2530
+ carrier_name: "Simpel"
+ carrier_attribute {
+ mccmnc_tuple: "20416"
+ gid1: "2F"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "20416"
+ spn: "Simpel"
+ }
+}
+carrier_id {
+ canonical_id: 2531
+ carrier_name: "TANGO"
+ carrier_attribute {
+ mccmnc_tuple: "23453"
+ mccmnc_tuple: "313770"
+ }
+}
+carrier_id {
+ canonical_id: 2532
+ carrier_name: "Xfinity MSO"
+ carrier_attribute {
+ mccmnc_tuple: "314200"
+ }
+}
+carrier_id {
+ canonical_id: 2533
+ carrier_name: "ASTCA"
+ carrier_attribute {
+ mccmnc_tuple: "311780"
+ }
+}
+carrier_id {
+ canonical_id: 2534
+ carrier_name: "Boost Infinite - MVNO"
+ carrier_attribute {
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "311180"
+ gid1: "3434"
+ }
+}
+carrier_id {
+ canonical_id: 2535
+ carrier_name: "OptiTel"
+ carrier_attribute {
+ mccmnc_tuple: "50552"
+ }
+}
+carrier_id {
+ canonical_id: 2536
+ carrier_name: "1&1"
+ carrier_attribute {
+ mccmnc_tuple: "26223"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "26207"
+ gid1: "118004"
+ gid1: "118006"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "26207"
+ imsi_prefix_xpattern: "26207414x"
+ gid1: "250109"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "26203"
+ imsi_prefix_xpattern: "26203293x"
+ imsi_prefix_xpattern: "26203330x"
+ }
+}
+carrier_id {
+ canonical_id: 2537
+ carrier_name: "CBRS"
+ carrier_attribute {
+ mccmnc_tuple: "315010"
+ }
+}
+carrier_id {
+ canonical_id: 2538
+ carrier_name: "Universal DISH - MVNO2"
+ carrier_attribute {
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "311180"
+ gid1: "3438"
+ }
+}
+carrier_id {
+ canonical_id: 2539
+ carrier_name: "Project Genesis - MVNO2"
+ carrier_attribute {
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "311180"
+ gid1: "3440"
+ }
+}
+carrier_id {
+ canonical_id: 2540
+ carrier_name: "mate."
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "mate."
+ }
+}
+carrier_id {
+ canonical_id: 2541
+ carrier_name: "Exetel"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "Exetel"
+ }
+}
+carrier_id {
+ canonical_id: 2542
+ carrier_name: "Konec"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "Konec"
+ }
+}
+carrier_id {
+ canonical_id: 2543
+ carrier_name: "More"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "More"
+ }
+}
+carrier_id {
+ canonical_id: 2544
+ carrier_name: "TANGERINE"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "TANGERINE"
+ }
+}
+carrier_id {
+ canonical_id: 2545
+ carrier_name: "Your provider"
+ carrier_attribute {
+ mccmnc_tuple: "50501"
+ spn: "Your provider"
+ }
+}
+carrier_id {
+ canonical_id: 2546
+ carrier_name: "Wizzee"
+ carrier_attribute {
+ mccmnc_tuple: "34020"
+ imsi_prefix_xpattern: "3402002"
+ }
+}
+carrier_id {
+ canonical_id: 2547
+ carrier_name: "Telet"
+ carrier_attribute {
+ mccmnc_tuple: "23488"
+ mccmnc_tuple: "23588"
+ spn: "Telet"
+ }
+}
+carrier_id {
+ canonical_id: 2548
+ carrier_name: "Ice Norway"
+ carrier_attribute {
+ mccmnc_tuple: "24214"
+ }
+}
+carrier_id {
+ canonical_id: 2549
+ carrier_name: "Lycamobile"
+ carrier_attribute {
+ mccmnc_tuple: "50519"
+ spn: "Lycamobile"
+ }
+}
+carrier_id {
+ canonical_id: 2550
+ carrier_name: "Vodafone"
+ carrier_attribute {
+ mccmnc_tuple: "54715"
+ spn: "Vodafone PF"
+ }
+}
+carrier_id {
+ canonical_id: 2551
+ carrier_name: "Magenta Telekom"
+ carrier_attribute {
+ mccmnc_tuple: "23203"
+ mccmnc_tuple: "23207"
+ }
+}
+carrier_id {
+ canonical_id: 2552
+ carrier_name: "Mytel"
+ carrier_attribute {
+ mccmnc_tuple: "41409"
+ }
+}
+carrier_id {
+ canonical_id: 2553
+ carrier_name: "4ka SK"
+ carrier_attribute {
+ mccmnc_tuple: "23103"
+ }
+}
+carrier_id {
+ canonical_id: 2554
+ carrier_name: "Cellhire"
+ carrier_attribute {
+ mccmnc_tuple: "20834"
+ spn: "eSIMsmart"
+ spn: "O-Events"
+ }
+}
+carrier_id {
+ canonical_id: 2555
+ carrier_name: "Vimla"
+ carrier_attribute {
+ mccmnc_tuple: "24006"
+ }
+}
+carrier_id {
+ canonical_id: 2556
+ carrier_name: "Xfinity Mobile 2.0"
+ carrier_attribute {
+ mccmnc_tuple: "310590"
+ mccmnc_tuple: "310591"
+ mccmnc_tuple: "310599"
+ mccmnc_tuple: "311480"
+ mccmnc_tuple: "311481"
+ mccmnc_tuple: "311482"
+ mccmnc_tuple: "311483"
+ mccmnc_tuple: "311484"
+ mccmnc_tuple: "311485"
+ mccmnc_tuple: "311486"
+ mccmnc_tuple: "311487"
+ mccmnc_tuple: "311488"
+ mccmnc_tuple: "311489"
+ gid1: "BA01640000000000"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "314240"
+ }
+}
+carrier_id {
+ canonical_id: 2557
+ carrier_name: "fraenk"
+ carrier_attribute {
+ mccmnc_tuple: "26201"
+ mccmnc_tuple: "26206"
+ spn: "fraenk"
+ gid1: "44"
+ }
+}
+carrier_id {
+ canonical_id: 2558
+ carrier_name: "Wintel"
+ carrier_attribute {
+ mccmnc_tuple: "45209"
+ }
+}
+carrier_id {
+ canonical_id: 2559
+ carrier_name: "MONACO TELECOM"
+ carrier_attribute {
+ mccmnc_tuple: "212010"
+ }
+}
+carrier_id {
+ canonical_id: 2560
+ carrier_name: "U+264A"
+ carrier_attribute {
+ mccmnc_tuple: "23210"
+ gid1: "040D"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "23210"
+ gid1: "040E"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "302760"
+ gid1: "F1"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310240"
+ gid1: "4280"
+ }
+}
+carrier_id {
+ canonical_id: 2561
+ carrier_name: "Lebara"
+ carrier_attribute {
+ mccmnc_tuple: "20838"
+ spn: "Lebara"
+ }
+}
+carrier_id {
+ canonical_id: 2562
+ carrier_name: "Lebara"
+ carrier_attribute {
+ mccmnc_tuple: "26214"
+ spn: "Lebara"
+ }
+}
+carrier_id {
+ canonical_id: 2563
+ carrier_name: "Lebara"
+ carrier_attribute {
+ mccmnc_tuple: "20417"
+ spn: "Lebara"
+ }
+}
+carrier_id {
+ canonical_id: 2564
+ carrier_name: "Lebara"
+ carrier_attribute {
+ mccmnc_tuple: "23487"
+ spn: "Lebara"
+ }
+}
+carrier_id {
+ canonical_id: 2565
+ carrier_name: "Best Telecom"
+ carrier_attribute {
+ mccmnc_tuple: "45707"
+ imsi_prefix_xpattern: "457070001"
+ spn: "Best Mobile"
+ }
+}
+carrier_id {
+ canonical_id: 2566
+ carrier_name: "Zeop_RE"
+ carrier_attribute {
+ mccmnc_tuple: "64704"
+ }
+}
+carrier_id {
+ canonical_id: 2567
+ carrier_name: "SSi Mobile"
+ carrier_attribute {
+ mccmnc_tuple: "302480"
+ imsi_prefix_xpattern: "302480017"
+ spn: "SSi Mobile"
+ gid1: "FF"
+ }
+}
+carrier_id {
+ canonical_id: 2568
+ carrier_name: "Eeyou Mobility"
+ carrier_attribute {
+ mccmnc_tuple: "302480"
+ imsi_prefix_xpattern: "3024800002"
+ spn: "Eeyou Mobility"
+ gid1: "FF"
+ }
+}
+carrier_id {
+ canonical_id: 2569
+ carrier_name: "Safaricom Telecommunications Ethiopia"
+ carrier_attribute {
+ mccmnc_tuple: "63602"
+ }
+}
+carrier_id {
+ canonical_id: 10000
+ carrier_name: "Tracfone-ATT"
+ carrier_attribute {
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "311180"
+ gid1: "DDFF"
+ gid1: "DEFF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310950"
+ gid1: "DDFF"
+ }
+ parent_canonical_id: 2022
+}
+carrier_id {
+ canonical_id: 10001
+ carrier_name: "Tracfone-TMO"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "DDFF"
+ gid1: "DEFF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310240"
+ gid1: "DEFF"
+ }
+ parent_canonical_id: 2022
+}
+carrier_id {
+ canonical_id: 10002
+ carrier_name: "o2prepaid_gb"
+ carrier_attribute {
+ mccmnc_tuple: "23410"
+ gid1: "61"
+ gid1: "67"
+ gid1: "85"
+ gid1: "99"
+ }
+ parent_canonical_id: 1492
+}
+carrier_id {
+ canonical_id: 10003
+ carrier_name: "o2prepaid_de"
+ carrier_attribute {
+ mccmnc_tuple: "26207"
+ imsi_prefix_xpattern: "2620749"
+ }
+ parent_canonical_id: 1454
+}
+carrier_id {
+ canonical_id: 10004
+ carrier_name: "sprintprepaid_us"
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ gid1: "000004"
+ }
+ parent_canonical_id: 1788
+}
+carrier_id {
+ canonical_id: 10005
+ carrier_name: "pcmobile_prepaid_bell"
+ carrier_attribute {
+ mccmnc_tuple: "30264"
+ mccmnc_tuple: "302610"
+ mccmnc_tuple: "302630"
+ mccmnc_tuple: "302640"
+ gid1: "40"
+ }
+ parent_canonical_id: 2053
+}
+carrier_id {
+ canonical_id: 10006
+ carrier_name: "pcmobile_postpaid_telus"
+ carrier_attribute {
+ mccmnc_tuple: "302220"
+ mccmnc_tuple: "302221"
+ gid1: "5043"
+ }
+ parent_canonical_id: 2053
+}
+carrier_id {
+ canonical_id: 10008
+ carrier_name: "Tracfone-VZW"
+ carrier_attribute {
+ mccmnc_tuple: "310590"
+ mccmnc_tuple: "310591"
+ mccmnc_tuple: "310592"
+ mccmnc_tuple: "310593"
+ mccmnc_tuple: "310594"
+ mccmnc_tuple: "310595"
+ mccmnc_tuple: "310596"
+ mccmnc_tuple: "310597"
+ mccmnc_tuple: "310598"
+ mccmnc_tuple: "310599"
+ mccmnc_tuple: "311480"
+ gid1: "BA01270000000000"
+ }
+ parent_canonical_id: 2022
+}
+carrier_id {
+ canonical_id: 10009
+ carrier_name: "C Spire-US"
+ carrier_attribute {
+ mccmnc_tuple: "311230"
+ mccmnc_tuple: "310023"
+ }
+ parent_canonical_id: 1836
+}
+carrier_id {
+ canonical_id: 10010
+ carrier_name: "C Spire-NL"
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ spn: "C Spire"
+ }
+ parent_canonical_id: 1836
+}
+carrier_id {
+ canonical_id: 10011
+ carrier_name: "Red Pocket-TMO"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "4201"
+ }
+ parent_canonical_id: 2026
+}
+carrier_id {
+ canonical_id: 10012
+ carrier_name: "Red Pocket-ATT"
+ carrier_attribute {
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "4201"
+ }
+ parent_canonical_id: 2026
+}
+carrier_id {
+ canonical_id: 10013
+ carrier_name: "FirstNet Pacific"
+ carrier_attribute {
+ mccmnc_tuple: "313110"
+ mccmnc_tuple: "313120"
+ }
+ parent_canonical_id: 2119
+}
+carrier_id {
+ canonical_id: 10014
+ carrier_name: "Google Fi-TMO"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ imsi_prefix_xpattern: "31026097"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "4276"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310240"
+ gid1: "4276"
+ }
+ parent_canonical_id: 1989
+}
+carrier_id {
+ canonical_id: 10015
+ carrier_name: "Google Fi-Sprint"
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ spn: "Fi Network"
+ spn: "nova"
+ spn: "Google Fi"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ gid1: "A00184"
+ gid1: "A00184FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ }
+ carrier_attribute {
+ mccmnc_tuple: "310120"
+ privilege_access_rule: "4C36AF4A5BDAD97C1F3D8B283416D244496C2AC5EAFE8226079EF6F676FD1859"
+ }
+ parent_canonical_id: 1989
+}
+carrier_id {
+ canonical_id: 10016
+ carrier_name: "Google Fi-USCellular"
+ carrier_attribute {
+ mccmnc_tuple: "311580"
+ imsi_prefix_xpattern: "3115801"
+ }
+ parent_canonical_id: 1989
+}
+carrier_id {
+ canonical_id: 10017
+ carrier_name: "Google Fi-3UK"
+ carrier_attribute {
+ mccmnc_tuple: "23420"
+ gid1: "0306"
+ }
+ parent_canonical_id: 1989
+}
+carrier_id {
+ canonical_id: 10018
+ carrier_name: "Google Fi-3HK"
+ carrier_attribute {
+ mccmnc_tuple: "45403"
+ gid1: "0206"
+ }
+ parent_canonical_id: 1989
+}
+carrier_id {
+ canonical_id: 10019
+ carrier_name: "Google Fi-3AT"
+ carrier_attribute {
+ mccmnc_tuple: "23210"
+ gid1: "0306"
+ }
+ parent_canonical_id: 1989
+}
+carrier_id {
+ canonical_id: 10020
+ carrier_name: "CTC Telecom Inc"
+ carrier_attribute {
+ mccmnc_tuple: "20404"
+ mccmnc_tuple: "45403"
+ mccmnc_tuple: "45431"
+ iccid_prefix: "898603"
+ iccid_prefix: "898611"
+ }
+ parent_canonical_id: 1854
+}
+carrier_id {
+ canonical_id: 10021
+ carrier_name: "AT&T 5G"
+ carrier_attribute {
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "53FF"
+ }
+ parent_canonical_id: 1187
+}
+carrier_id {
+ canonical_id: 10022
+ carrier_name: "Consumer Cellular ATT"
+ carrier_attribute {
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "2AC9"
+ }
+ parent_canonical_id: 2023
+}
+carrier_id {
+ canonical_id: 10023
+ carrier_name: "Consumer Cellular TMO"
+ carrier_attribute {
+ mccmnc_tuple: "310260"
+ gid1: "2AC9"
+ }
+ parent_canonical_id: 2023
+}
+carrier_id {
+ canonical_id: 10024
+ carrier_name: "Cellcom Core"
+ carrier_attribute {
+ mccmnc_tuple: "311840"
+ gid1: "c1000000"
+ }
+ parent_canonical_id: 1802
+}
+carrier_id {
+ canonical_id: 10025
+ carrier_name: "Rogers 5G"
+ carrier_attribute {
+ mccmnc_tuple: "302720"
+ gid1: "A4"
+ }
+ parent_canonical_id: 1403
+}
+carrier_id {
+ canonical_id: 10026
+ carrier_name: "DOCOMO ahamo"
+ carrier_attribute {
+ mccmnc_tuple: "44010"
+ gid1: "01FFFF"
+ }
+ parent_canonical_id: 850
+}
+carrier_id {
+ canonical_id: 10027
+ carrier_name: "LINEMO"
+ carrier_attribute {
+ mccmnc_tuple: "44020"
+ gid1: "48FFFF"
+ }
+ parent_canonical_id: 1894
+}
+carrier_id {
+ canonical_id: 10028
+ carrier_name: "AT&T 5G SA"
+ carrier_attribute {
+ mccmnc_tuple: "310280"
+ mccmnc_tuple: "310410"
+ mccmnc_tuple: "310950"
+ mccmnc_tuple: "311180"
+ gid1: "52FF"
+ }
+ parent_canonical_id: 1187
+}
+carrier_id {
+ canonical_id: 10029
+ carrier_name: "Cricket 5G"
+ carrier_attribute {
+ mccmnc_tuple: "310150"
+ gid1: "53FF"
+ }
+ parent_canonical_id: 1779
+}
+carrier_id {
+ canonical_id: 10030
+ carrier_name: "TANGO-US"
+ carrier_attribute {
+ mccmnc_tuple: "313770"
+ }
+ parent_canonical_id: 2531
+}
+carrier_id {
+ canonical_id: 10031
+ carrier_name: "TANGO-UK"
+ carrier_attribute {
+ mccmnc_tuple: "23453"
+ }
+ parent_canonical_id: 2531
+}
+carrier_id {
+ canonical_id: 10032
+ carrier_name: "U+264A-3AT Operational"
+ carrier_attribute {
+ mccmnc_tuple: "23210"
+ gid1: "040D"
+ }
+ parent_canonical_id: 2560
+}
+carrier_id {
+ canonical_id: 10033
+ carrier_name: "U+264A-3AT Provisioning"
+ carrier_attribute {
+ mccmnc_tuple: "23210"
+ gid1: "040E"
+ }
+ parent_canonical_id: 2560
+}
+carrier_id {
+ canonical_id: 10034
+ carrier_name: "U+264A-Telus"
+ carrier_attribute {
+ mccmnc_tuple: "302760"
+ gid1: "F1"
+ }
+ parent_canonical_id: 2560
+}
+carrier_id {
+ canonical_id: 10035
+ carrier_name: "U+264A-TMO"
+ carrier_attribute {
+ mccmnc_tuple: "310240"
+ gid1: "4280"
+ }
+ parent_canonical_id: 2560
+}
+version: 100663322
diff --git a/src/com/android/providers/telephony/CarrierIdProvider.java b/src/com/android/providers/telephony/CarrierIdProvider.java
index 9b6c2c0..c06c115 100644
--- a/src/com/android/providers/telephony/CarrierIdProvider.java
+++ b/src/com/android/providers/telephony/CarrierIdProvider.java
@@ -51,6 +51,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -433,8 +434,9 @@
CarrierIdProto.CarrierAttribute attr, int index) {
if (index > CARRIER_ATTR_END_IDX) {
ContentValues carrier = new ContentValues(cv);
- if (!cvs.contains(carrier))
- cvs.add(carrier);
+ if (!cvs.contains(carrier)) {
+ cvs.add(carrier);
+ }
return;
}
boolean found = false;
@@ -457,7 +459,7 @@
break;
case GID1_INDEX:
for (String str : attr.gid1) {
- cv.put(CarrierId.All.GID1, str.toLowerCase());
+ cv.put(CarrierId.All.GID1, str.toLowerCase(Locale.ROOT));
convertCarrierAttrToContentValues(cv, cvs, attr, index + 1);
cv.remove(CarrierId.All.GID1);
found = true;
@@ -465,7 +467,7 @@
break;
case GID2_INDEX:
for (String str : attr.gid2) {
- cv.put(CarrierId.All.GID2, str.toLowerCase());
+ cv.put(CarrierId.All.GID2, str.toLowerCase(Locale.ROOT));
convertCarrierAttrToContentValues(cv, cvs, attr, index + 1);
cv.remove(CarrierId.All.GID2);
found = true;
@@ -481,7 +483,7 @@
break;
case SPN_INDEX:
for (String str : attr.spn) {
- cv.put(CarrierId.All.SPN, str.toLowerCase());
+ cv.put(CarrierId.All.SPN, str.toLowerCase(Locale.ROOT));
convertCarrierAttrToContentValues(cv, cvs, attr, index + 1);
cv.remove(CarrierId.All.SPN);
found = true;
diff --git a/src/com/android/providers/telephony/MmsPartsCleanup.java b/src/com/android/providers/telephony/MmsPartsCleanup.java
new file mode 100644
index 0000000..8de1006
--- /dev/null
+++ b/src/com/android/providers/telephony/MmsPartsCleanup.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+
+package com.android.providers.telephony;
+
+import static java.util.Arrays.stream;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.os.Bundle;
+import android.os.FileUtils;
+import android.provider.Telephony;
+import android.util.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/** Tools to find and delete unreferenced MMS parts from the parts directory. */
+public class MmsPartsCleanup {
+ private static final String TAG = "MmsPartsCleanup";
+
+ static final String PART_FILE_COUNT = "part_file_count";
+ static final String PART_TABLE_ENTRY_COUNT = "part_table_entry_count";
+ static final String DELETED_COUNT = "deleted_count";
+
+ /**
+ * @param context
+ * @param doDelete if true, delete the unreferenced MMS part files found in the data dir.
+ * if false, compute the number of unreferenced part files and return the
+ * results, but don't actually delete the files
+ * @param bundle an existing bundle where int values will be added:
+ * PART_FILE_COUNT - an int count of MMS attachment files in the parts
+ * directory
+ * PART_TABLE_ENTRY_COUNT - an int count of MMS attachments referenced
+ * by existing MMS messages
+ * DELETED_COUNT - the number of non-referenced MMS part files delete (or would
+ * be deleted if doDelete is true)
+ */
+ public static void cleanupDanglingParts(Context context, boolean doDelete, Bundle bundle) {
+ Set<String> danglingFilePathsToDelete = getDanglingMmsParts(context, bundle);
+ danglingFilePathsToDelete.forEach(path -> {
+ File partFile = new File(path);
+ if (partFile.exists()) {
+ if (doDelete) {
+ Log.d(TAG, "Deleting dangling MMS part: " + partFile.getAbsolutePath());
+ partFile.delete();
+ } else {
+ Log.d(TAG,
+ "Would have deleted dangling MMS part: "
+ + partFile.getAbsolutePath());
+ }
+ } else {
+ Log.wtf(TAG,
+ "Part file path does not exist: "
+ + partFile.getAbsolutePath());
+ }
+ });
+ bundle.putInt(DELETED_COUNT, danglingFilePathsToDelete.size());
+ }
+
+ /**
+ * @param context
+ * @return a set of file path names for every MMS attachment file found in the data directory
+ */
+ @NonNull
+ private static Set<String> getAllMmsPartsInPartsDir(Context context) {
+ Set<String> allMmsAttachments = new HashSet<>();
+ try {
+ String partsDirPath = context.getDir(MmsProvider.PARTS_DIR_NAME, 0)
+ .getCanonicalPath();
+ Log.d(TAG, "getDanglingMmsParts: " + partsDirPath);
+ File partsDir = new File(partsDirPath);
+ allMmsAttachments = Arrays.stream(FileUtils.listFilesOrEmpty(partsDir)).map(p ->
+ {
+ try {
+ return p.getCanonicalPath();
+ } catch (IOException e) {
+ Log.d(TAG, "getDanglingMmsParts: couldn't get path for " + p);
+ }
+ return null;
+ }).filter(path -> path != null).collect(Collectors.toSet());
+ } catch (IOException e) {
+ Log.e(TAG, "getDanglingMmsParts: failed " + e, e);
+ allMmsAttachments.clear();
+ }
+ return allMmsAttachments;
+ }
+
+ /**
+ * @param partFilePaths the incoming set contains the file paths of all MMS attachments in the
+ * data directory. This function modifies this set by removing any path
+ * that is referenced from an MMS part in the parts table. In other words,
+ * when this function returns, partFilePaths contains only the unreferenced
+ * file paths
+ * @param context
+ * @return the number of MMS parts that are referenced and still attached to an MMS message
+ */
+ @NonNull
+ private static int removeReferencedPartsFromSet(Set<String> partFilePaths, Context context) {
+ if (partFilePaths.isEmpty()) {
+ return 0;
+ }
+ SQLiteDatabase db = MmsSmsDatabaseHelper.getInstanceForCe(context).getReadableDatabase();
+ int referencedPartCount = 0;
+ try (Cursor partRows =
+ db.query(
+ MmsProvider.TABLE_PART,
+ new String[] {Telephony.Mms.Part._DATA},
+ Telephony.Mms.Part._DATA + " IS NOT NULL AND "
+ + Telephony.Mms.Part._DATA + " <> ''",
+ null,
+ null,
+ null,
+ null)) {
+ if (partRows != null) {
+ while (partRows.moveToNext()) {
+ String path = partRows.getString(0);
+ if (path != null) {
+ if (partFilePaths.remove(path)) {
+ ++referencedPartCount;
+ }
+ }
+ }
+ }
+ }
+ return referencedPartCount;
+ }
+
+ /**
+ * @param context
+ * @param bundle an existing bundle that is modified to contain two possible key/values:
+ * PART_FILE_COUNT - an int count of MMS attachment files in the parts directory
+ * PART_TABLE_ENTRY_COUNT - an int count of MMS attachments referenced by existing
+ * MMS messages
+ * @return a set of file path names for MMS attachments that live in the data directory, but
+ * aren't referenced by any existing MMS message
+ */
+ @NonNull
+ private static Set<String> getDanglingMmsParts(Context context, Bundle bundle) {
+ Set<String> allExistingMmsAttachments = getAllMmsPartsInPartsDir(context);
+ bundle.putInt(PART_FILE_COUNT, allExistingMmsAttachments.size());
+ bundle.putInt(PART_TABLE_ENTRY_COUNT,
+ removeReferencedPartsFromSet(allExistingMmsAttachments, context));
+
+ return allExistingMmsAttachments;
+ }
+}
diff --git a/src/com/android/providers/telephony/MmsProvider.java b/src/com/android/providers/telephony/MmsProvider.java
index 5ddd6ac..28c9074 100644
--- a/src/com/android/providers/telephony/MmsProvider.java
+++ b/src/com/android/providers/telephony/MmsProvider.java
@@ -18,13 +18,17 @@
import android.annotation.NonNull;
import android.app.AppOpsManager;
+import android.content.BroadcastReceiver;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.UriMatcher;
import android.database.Cursor;
+import android.database.DatabaseUtils;
+import android.database.MatrixCursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
@@ -33,22 +37,28 @@
import android.os.Binder;
import android.os.ParcelFileDescriptor;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.BaseColumns;
import android.provider.Telephony;
import android.provider.Telephony.CanonicalAddressesColumns;
import android.provider.Telephony.Mms;
import android.provider.Telephony.Mms.Addr;
-import android.provider.Telephony.Mms.Inbox;
import android.provider.Telephony.Mms.Part;
import android.provider.Telephony.Mms.Rate;
import android.provider.Telephony.MmsSms;
import android.provider.Telephony.Threads;
import android.system.ErrnoException;
import android.system.Os;
+import android.telephony.SmsManager;
+import android.telephony.SubscriptionManager;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.TelephonyPermissions;
+import com.android.internal.telephony.util.TelephonyUtils;
+
import com.google.android.mms.pdu.PduHeaders;
import com.google.android.mms.util.DownloadDrmHelper;
@@ -72,14 +82,36 @@
// The name of parts directory. The full dir is "app_parts".
static final String PARTS_DIR_NAME = "parts";
+ private ProviderUtilWrapper providerUtilWrapper = new ProviderUtilWrapper();
+
+ @VisibleForTesting
+ public void setProviderUtilWrapper(ProviderUtilWrapper providerUtilWrapper) {
+ this.providerUtilWrapper = providerUtilWrapper;
+ }
+
@Override
public boolean onCreate() {
setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
mOpenHelper = MmsSmsDatabaseHelper.getInstanceForCe(getContext());
TelephonyBackupAgent.DeferredSmsMmsRestoreService.startIfFilesExist(getContext());
+
+ // Creating intent broadcast receiver for user actions like Intent.ACTION_USER_REMOVED,
+ // where we would need to remove MMS related to removed user.
+ IntentFilter userIntentFilter = new IntentFilter(Intent.ACTION_USER_REMOVED);
+ getContext().registerReceiver(mUserIntentReceiver, userIntentFilter,
+ Context.RECEIVER_NOT_EXPORTED);
+
return true;
}
+ // wrapper class to allow easier mocking of the static ProviderUtil in tests
+ @VisibleForTesting
+ public static class ProviderUtilWrapper {
+ public boolean isAccessRestricted(Context context, String packageName, int uid) {
+ return ProviderUtil.isAccessRestricted(context, packageName, uid);
+ }
+ }
+
/**
* Return the proper view of "pdu" table for the current access status.
*
@@ -93,14 +125,17 @@
@Override
public Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
+ final int callerUid = Binder.getCallingUid();
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
// First check if a restricted view of the "pdu" table should be used based on the
// caller's identity. Only system, phone or the default sms app can have full access
// of mms data. For other apps, we present a restricted view which only contains sent
// or received messages, without wap pushes.
final boolean accessRestricted = ProviderUtil.isAccessRestricted(
- getContext(), getCallingPackage(), Binder.getCallingUid());
+ getContext(), getCallingPackage(), callerUid);
// If access is restricted, we don't allow subqueries in the query.
+ Log.v(TAG, "accessRestricted=" + accessRestricted);
if (accessRestricted) {
SqlQueryChecker.checkQueryParametersForSubqueries(projection, selection, sortOrder);
}
@@ -231,6 +266,21 @@
return null;
}
+ String selectionBySubIds;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ // Filter MMS based on subId.
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+ callerUserHandle);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return new MatrixCursor((projection == null) ? (new String[] {}) : projection);
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
String finalSortOrder = null;
if (TextUtils.isEmpty(sortOrder)) {
if (qb.getTables().equals(pduTable)) {
@@ -312,10 +362,20 @@
@Override
public Uri insert(Uri uri, ContentValues values) {
final int callerUid = Binder.getCallingUid();
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
final String callerPkg = getCallingPackage();
int msgBox = Mms.MESSAGE_BOX_ALL;
boolean notify = true;
+ boolean forceNoNotify = values.containsKey(TelephonyBackupAgent.NOTIFY)
+ && !values.getAsBoolean(TelephonyBackupAgent.NOTIFY);
+ values.remove(TelephonyBackupAgent.NOTIFY);
+ // check isAccessRestricted to prevent third parties from setting NOTIFY = false maliciously
+ if (forceNoNotify && !providerUtilWrapper.isAccessRestricted(
+ getContext(), getCallingPackage(), callerUid)) {
+ notify = false;
+ }
+
int match = sURLMatcher.match(uri);
if (LOCAL_LOGV) {
Log.v(TAG, "Insert uri=" + uri + ", match=" + match);
@@ -372,7 +432,26 @@
Uri caseSpecificUri = null;
long rowId;
+ int subId;
+ if (values.containsKey(Telephony.Sms.SUBSCRIPTION_ID)) {
+ subId = values.getAsInteger(Telephony.Sms.SUBSCRIPTION_ID);
+ } else {
+ // TODO (b/256992531): Currently, one sim card is set as default sms subId in work
+ // profile. Default sms subId should be updated based on user pref.
+ subId = SmsManager.getDefaultSmsSubscriptionId();
+ if (SubscriptionManager.isValidSubscriptionId(subId)) {
+ values.put(Telephony.Sms.SUBSCRIPTION_ID, subId);
+ }
+ }
+
if (table.equals(TABLE_PDU)) {
+ if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(), subId,
+ callerUserHandle)) {
+ TelephonyUtils.showSwitchToManagedProfileDialogIfAppropriate(getContext(), subId,
+ callerUid, callerPkg);
+ return null;
+ }
+
boolean addDate = !values.containsKey(Mms.DATE);
boolean addMsgBox = !values.containsKey(Mms.MESSAGE_BOX);
@@ -564,6 +643,7 @@
cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, values.getAsString("text"));
cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, rowId);
cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 2);
+ cv.put(MmsSms.WordsTable.SUBSCRIPTION_ID, subId);
db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv);
}
@@ -578,6 +658,7 @@
+ "/PART_" + System.currentTimeMillis();
finalValues = new ContentValues(1);
finalValues.put("_data", path);
+ finalValues.put("sub_id", subId);
File partFile = new File(path);
if (!partFile.exists()) {
@@ -630,6 +711,7 @@
@Override
public int delete(Uri uri, String selection,
String[] selectionArgs) {
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
int match = sURLMatcher.match(uri);
if (LOCAL_LOGV) {
Log.v(TAG, "Delete uri=" + uri + ", match=" + match);
@@ -687,6 +769,21 @@
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int deletedRows = 0;
+ final long token = Binder.clearCallingIdentity();
+ String selectionBySubIds;
+ try {
+ // Filter SMS based on subId.
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+ callerUserHandle);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return 0.
+ return 0;
+ }
+ finalSelection = DatabaseUtils.concatenateWhere(finalSelection, selectionBySubIds);
+
if (TABLE_PDU.equals(table)) {
deletedRows = deleteMessages(getContext(), db, finalSelection,
selectionArgs, uri);
@@ -791,6 +888,7 @@
return 0;
}
final int callerUid = Binder.getCallingUid();
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
final String callerPkg = getCallingPackage();
int match = sURLMatcher.match(uri);
if (LOCAL_LOGV) {
@@ -828,15 +926,16 @@
uri.getPathSegments().get(1);
try {
+ File canonicalFile = new File(path).getCanonicalFile();
String partsDirPath = getContext().getDir(PARTS_DIR_NAME, 0).getCanonicalPath();
- if (!new File(path).getCanonicalPath().startsWith(partsDirPath)) {
+ if (!canonicalFile.getPath().startsWith(partsDirPath + '/')) {
EventLog.writeEvent(0x534e4554, "240685104",
- Binder.getCallingUid(), (TAG + " update: path " + path +
+ callerUid, (TAG + " update: path " + path +
" does not start with " + partsDirPath));
return 0;
}
// Reset the file permission back to read for everyone but me.
- Os.chmod(path, 0644);
+ Os.chmod(canonicalFile.getPath(), 0644);
if (LOCAL_LOGV) {
Log.d(TAG, "MmsProvider.update chmod is successful for path: " + path);
}
@@ -851,6 +950,21 @@
}
String extraSelection = null;
+ final long token = Binder.clearCallingIdentity();
+ String selectionBySubIds;
+ try {
+ // Filter MMS based on subId.
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+ callerUserHandle);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return 0.
+ return 0;
+ }
+ extraSelection = DatabaseUtils.concatenateWhere(extraSelection, selectionBySubIds);
+
ContentValues finalValues;
if (table.equals(TABLE_PDU)) {
// Filter keys that we don't support yet.
@@ -1070,7 +1184,8 @@
sURLMatcher.addURI("mms", "resetFilePerm/*", MMS_PART_RESET_FILE_PERMISSION);
}
- private SQLiteOpenHelper mOpenHelper;
+ @VisibleForTesting
+ public SQLiteOpenHelper mOpenHelper;
private static String concatSelections(String selection1, String selection2) {
if (TextUtils.isEmpty(selection1)) {
@@ -1081,4 +1196,49 @@
return selection1 + " AND " + selection2;
}
}
+
+ private BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ switch (intent.getAction()) {
+ case Intent.ACTION_USER_REMOVED:
+ UserHandle userToBeRemoved = intent.getParcelableExtra(Intent.EXTRA_USER,
+ UserHandle.class);
+ UserManager userManager = context.getSystemService(UserManager.class);
+ if ((userToBeRemoved == null) || (userManager == null) ||
+ (!userManager.isManagedProfile(userToBeRemoved.getIdentifier()))) {
+ // Do not delete MMS if removed profile is not managed profile.
+ return;
+ }
+ Log.d(TAG, "Received ACTION_USER_REMOVED for managed profile - Deleting MMS.");
+
+ // Deleting MMS related to managed profile.
+ Uri uri = Telephony.Mms.CONTENT_URI;
+ SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+
+ final long token = Binder.clearCallingIdentity();
+ String selectionBySubIds;
+ try {
+ // Filter MMS based on subId.
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+ userToBeRemoved);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return.
+ return;
+ }
+
+ int deletedRows = deleteMessages(getContext(), db, selectionBySubIds,
+ null, uri);
+ if (deletedRows > 0) {
+ // Don't update threads unless something changed.
+ MmsSmsDatabaseHelper.updateThreads(db, selectionBySubIds, null);
+ notifyChange(uri, null);
+ }
+ break;
+ }
+ }
+ };
}
diff --git a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
index 73ffa3b..4bc1642 100644
--- a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
+++ b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
@@ -31,6 +31,7 @@
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
+import android.os.FileUtils;
import android.os.storage.StorageManager;
import android.preference.PreferenceManager;
import android.provider.BaseColumns;
@@ -44,11 +45,13 @@
import android.provider.Telephony.Sms;
import android.provider.Telephony.Sms.Intents;
import android.provider.Telephony.Threads;
+import android.telephony.AnomalyReporter;
import android.telephony.SubscriptionManager;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.TelephonyStatsLog;
import com.google.android.mms.pdu.EncodedStringValue;
import com.google.android.mms.pdu.PduHeaders;
@@ -60,6 +63,7 @@
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -81,6 +85,14 @@
*/
public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
private static final String TAG = "MmsSmsDatabaseHelper";
+ private static final int SECURITY_EXCEPTION = TelephonyStatsLog
+ .MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED__FAILURE_CODE__FAILURE_SECURITY_EXCEPTION;
+ private static final int FAILURE_UNKNOWN = TelephonyStatsLog
+ .MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED__FAILURE_CODE__FAILURE_UNKNOWN;
+ private static final int SQL_EXCEPTION = TelephonyStatsLog
+ .MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED__FAILURE_CODE__FAILURE_SQL_EXCEPTION;
+ private static final int IO_EXCEPTION = TelephonyStatsLog
+ .MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED__FAILURE_CODE__FAILURE_IO_EXCEPTION;
private static final String SMS_UPDATE_THREAD_READ_BODY =
" UPDATE threads SET read = " +
@@ -252,7 +264,7 @@
private static boolean sFakeLowStorageTest = false; // for testing only
static final String DATABASE_NAME = "mmssms.db";
- static final int DATABASE_VERSION = 67;
+ static final int DATABASE_VERSION = 68;
private static final int IDLE_CONNECTION_TIMEOUT_MS = 30000;
private final Context mContext;
@@ -264,6 +276,9 @@
// cache for INITIAL_CREATE_DONE shared pref so access to it can be avoided when possible
private static AtomicBoolean sInitialCreateDone = new AtomicBoolean(false);
+ private static final UUID CREATE_CALLED_MULTIPLE_TIMES_UUID = UUID.fromString(
+ "6ead002e-c001-4c05-9bca-67d7c4e29782");
+
/**
* The primary purpose of this DatabaseErrorHandler is to broadcast an intent on corruption and
* print a Log.wtf so database corruption can be caught earlier.
@@ -332,7 +347,7 @@
*/
/* package */ static synchronized MmsSmsDatabaseHelper getInstanceForCe(Context context) {
if (sCeInstance == null) {
- if (StorageManager.isFileEncryptedNativeOrEmulated()) {
+ if (StorageManager.isFileEncrypted()) {
Context ceContext = ProviderUtil.getCredentialEncryptedContext(context);
sCeInstance = new MmsSmsDatabaseHelper(ceContext, getDbErrorHandler(ceContext));
} else {
@@ -523,6 +538,21 @@
return rows;
}
+ private void clearMmsParts() {
+ try {
+ String partsDirPath = mContext.getDir(MmsProvider.PARTS_DIR_NAME, 0)
+ .getCanonicalPath();
+ localLog("clearMmsParts: removing all attachments from: " + partsDirPath);
+ File partsDir = new File(partsDirPath);
+ if (!FileUtils.deleteContents(partsDir)) {
+ localLogWtf("clearMmsParts: couldn't delete all attachments");
+ }
+ }
+ catch (IOException e){
+ Log.e(TAG, "clearMmsParts: failed " + e, e);
+ }
+ }
+
@Override
public void onCreate(SQLiteDatabase db) {
localLog("onCreate: Creating all SMS-MMS tables.");
@@ -535,8 +565,10 @@
createWordsTables(db);
createIndices(db);
+ clearMmsParts(); // leave no dangling MMS attachments when rebuilding the DB
+
// if FBE is not supported, or if this onCreate is for CE partition database
- if (!StorageManager.isFileEncryptedNativeOrEmulated()
+ if (!StorageManager.isFileEncrypted()
|| (mContext != null && mContext.isCredentialProtectedStorage())) {
localLog("onCreate: broadcasting ACTION_SMS_MMS_DB_CREATED");
// Broadcast ACTION_SMS_MMS_DB_CREATED
@@ -546,7 +578,9 @@
if (isInitialCreateDone()) {
// this onCreate is called after onCreate was called once initially. The db file
// disappeared mysteriously?
- localLogWtf("onCreate: was already called once earlier");
+ AnomalyReporter.reportAnomaly(CREATE_CALLED_MULTIPLE_TIMES_UUID,
+ "MmsSmsDatabaseHelper: onCreate() was already "
+ + "called once earlier");
intent.putExtra(Intents.EXTRA_IS_INITIAL_CREATE, false);
} else {
setInitialCreateDone();
@@ -608,6 +642,7 @@
cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, body);
cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, id);
cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 1);
+ cv.put(MmsSms.WordsTable.SUBSCRIPTION_ID, -1);
db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv);
}
}
@@ -641,6 +676,7 @@
cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, body);
cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, id);
cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 1);
+ cv.put(MmsSms.WordsTable.SUBSCRIPTION_ID, -1);
db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv);
}
}
@@ -653,8 +689,13 @@
}
private void createWordsTables(SQLiteDatabase db) {
+ createWordsTables(db, -1, -1, -1);
+ }
+
+ private void createWordsTables(
+ SQLiteDatabase db, int oldVersion, int currentVersion, int upgradeVersion) {
try {
- db.execSQL("CREATE VIRTUAL TABLE words USING FTS3 (_id INTEGER PRIMARY KEY, index_text TEXT, source_id INTEGER, table_to_use INTEGER);");
+ db.execSQL("CREATE VIRTUAL TABLE words USING FTS3 (_id INTEGER PRIMARY KEY, index_text TEXT, source_id INTEGER, table_to_use INTEGER, sub_id INTEGER);");
// monitor the sms table
// NOTE don't handle inserts using a trigger because it has an unwanted
@@ -670,6 +711,7 @@
populateWordsTable(db);
} catch (Exception ex) {
Log.e(TAG, "got exception creating words table: " + ex.toString());
+ logException(ex, oldVersion, currentVersion, upgradeVersion);
}
}
@@ -681,112 +723,165 @@
}
private void createThreadIdIndex(SQLiteDatabase db) {
+ createThreadIdIndex(db, -1, -1, -1);
+ }
+
+ private void createThreadIdIndex(
+ SQLiteDatabase db, int oldVersion, int currentVersion, int upgradeVersion) {
try {
db.execSQL("CREATE INDEX IF NOT EXISTS typeThreadIdIndex ON sms" +
" (type, thread_id);");
} catch (Exception ex) {
Log.e(TAG, "got exception creating indices: " + ex.toString());
+ logException(ex, oldVersion, currentVersion, upgradeVersion);
}
}
private void createThreadIdDateIndex(SQLiteDatabase db) {
+ createThreadIdDateIndex(db, -1, -1, -1);
+ }
+
+ private void createThreadIdDateIndex(
+ SQLiteDatabase db, int oldVersion, int currentVersion, int upgradeVersion) {
try {
db.execSQL("CREATE INDEX IF NOT EXISTS threadIdDateIndex ON sms" +
" (thread_id, date);");
} catch (Exception ex) {
Log.e(TAG, "got exception creating indices: " + ex.toString());
+ logException(ex, oldVersion, currentVersion, upgradeVersion);
}
}
private void createPartMidIndex(SQLiteDatabase db) {
+ createPartMidIndex(db, -1, -1, -1);
+ }
+
+ private void createPartMidIndex(
+ SQLiteDatabase db, int oldVersion, int currentVersion, int upgradeVersion) {
try {
db.execSQL("CREATE INDEX IF NOT EXISTS partMidIndex ON part (mid)");
} catch (Exception ex) {
Log.e(TAG, "got exception creating indices: " + ex.toString());
+ logException(ex, oldVersion, currentVersion, upgradeVersion);
}
}
private void createAddrMsgIdIndex(SQLiteDatabase db) {
+ createAddrMsgIdIndex(db, -1, -1, -1);
+ }
+
+ private void createAddrMsgIdIndex(
+ SQLiteDatabase db, int oldVersion, int currentVersion, int upgradeVersion) {
try {
db.execSQL("CREATE INDEX IF NOT EXISTS addrMsgIdIndex ON addr (msg_id)");
} catch (Exception ex) {
Log.e(TAG, "got exception creating indices: " + ex.toString());
+ logException(ex, oldVersion, currentVersion, upgradeVersion);
}
}
+
+ @VisibleForTesting
+ public static String CREATE_ADDR_TABLE_STR =
+ "CREATE TABLE " + MmsProvider.TABLE_ADDR + " (" +
+ Addr._ID + " INTEGER PRIMARY KEY," +
+ Addr.MSG_ID + " INTEGER," +
+ Addr.CONTACT_ID + " INTEGER," +
+ Addr.ADDRESS + " TEXT," +
+ Addr.TYPE + " INTEGER," +
+ Addr.CHARSET + " INTEGER," +
+ Addr.SUBSCRIPTION_ID + " INTEGER DEFAULT -1" +
+ ");";
+
+ @VisibleForTesting
+ public static String CREATE_PART_TABLE_STR =
+ "CREATE TABLE " + MmsProvider.TABLE_PART + " (" +
+ Part._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+ Part.MSG_ID + " INTEGER," +
+ Part.SEQ + " INTEGER DEFAULT 0," +
+ Part.CONTENT_TYPE + " TEXT," +
+ Part.NAME + " TEXT," +
+ Part.CHARSET + " INTEGER," +
+ Part.CONTENT_DISPOSITION + " TEXT," +
+ Part.FILENAME + " TEXT," +
+ Part.CONTENT_ID + " TEXT," +
+ Part.CONTENT_LOCATION + " TEXT," +
+ Part.CT_START + " INTEGER," +
+ Part.CT_TYPE + " TEXT," +
+ Part._DATA + " TEXT," +
+ Part.TEXT + " TEXT," +
+ Part.SUBSCRIPTION_ID + " INTEGER DEFAULT -1" +
+ ");";
+
+ public static String CREATE_PDU_TABLE_STR =
+ "CREATE TABLE " + MmsProvider.TABLE_PDU + " (" +
+ Mms._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+ Mms.THREAD_ID + " INTEGER," +
+ Mms.DATE + " INTEGER," +
+ Mms.DATE_SENT + " INTEGER DEFAULT 0," +
+ Mms.MESSAGE_BOX + " INTEGER," +
+ Mms.READ + " INTEGER DEFAULT 0," +
+ Mms.MESSAGE_ID + " TEXT," +
+ Mms.SUBJECT + " TEXT," +
+ Mms.SUBJECT_CHARSET + " INTEGER," +
+ Mms.CONTENT_TYPE + " TEXT," +
+ Mms.CONTENT_LOCATION + " TEXT," +
+ Mms.EXPIRY + " INTEGER," +
+ Mms.MESSAGE_CLASS + " TEXT," +
+ Mms.MESSAGE_TYPE + " INTEGER," +
+ Mms.MMS_VERSION + " INTEGER," +
+ Mms.MESSAGE_SIZE + " INTEGER," +
+ Mms.PRIORITY + " INTEGER," +
+ Mms.READ_REPORT + " INTEGER," +
+ Mms.REPORT_ALLOWED + " INTEGER," +
+ Mms.RESPONSE_STATUS + " INTEGER," +
+ Mms.STATUS + " INTEGER," +
+ Mms.TRANSACTION_ID + " TEXT," +
+ Mms.RETRIEVE_STATUS + " INTEGER," +
+ Mms.RETRIEVE_TEXT + " TEXT," +
+ Mms.RETRIEVE_TEXT_CHARSET + " INTEGER," +
+ Mms.READ_STATUS + " INTEGER," +
+ Mms.CONTENT_CLASS + " INTEGER," +
+ Mms.RESPONSE_TEXT + " TEXT," +
+ Mms.DELIVERY_TIME + " INTEGER," +
+ Mms.DELIVERY_REPORT + " INTEGER," +
+ Mms.LOCKED + " INTEGER DEFAULT 0," +
+ Mms.SUBSCRIPTION_ID + " INTEGER DEFAULT "
+ + SubscriptionManager.INVALID_SUBSCRIPTION_ID + ", " +
+ Mms.SEEN + " INTEGER DEFAULT 0," +
+ Mms.CREATOR + " TEXT," +
+ Mms.TEXT_ONLY + " INTEGER DEFAULT 0);";
+
+ @VisibleForTesting
+ public static String CREATE_RATE_TABLE_STR =
+ "CREATE TABLE " + MmsProvider.TABLE_RATE + " (" +
+ Rate.SENT_TIME + " INTEGER," +
+ Rate.SUBSCRIPTION_ID + " INTEGER DEFAULT -1" +
+ ");";
+
+ @VisibleForTesting
+ public static String CREATE_DRM_TABLE_STR =
+ "CREATE TABLE " + MmsProvider.TABLE_DRM + " (" +
+ BaseColumns._ID + " INTEGER PRIMARY KEY," +
+ "_data TEXT," +
+ "sub_id INTEGER DEFAULT -1" +
+ ");";
+
+
@VisibleForTesting
void createMmsTables(SQLiteDatabase db) {
// N.B.: Whenever the columns here are changed, the columns in
// {@ref MmsSmsProvider} must be changed to match.
- db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PDU + " (" +
- Mms._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
- Mms.THREAD_ID + " INTEGER," +
- Mms.DATE + " INTEGER," +
- Mms.DATE_SENT + " INTEGER DEFAULT 0," +
- Mms.MESSAGE_BOX + " INTEGER," +
- Mms.READ + " INTEGER DEFAULT 0," +
- Mms.MESSAGE_ID + " TEXT," +
- Mms.SUBJECT + " TEXT," +
- Mms.SUBJECT_CHARSET + " INTEGER," +
- Mms.CONTENT_TYPE + " TEXT," +
- Mms.CONTENT_LOCATION + " TEXT," +
- Mms.EXPIRY + " INTEGER," +
- Mms.MESSAGE_CLASS + " TEXT," +
- Mms.MESSAGE_TYPE + " INTEGER," +
- Mms.MMS_VERSION + " INTEGER," +
- Mms.MESSAGE_SIZE + " INTEGER," +
- Mms.PRIORITY + " INTEGER," +
- Mms.READ_REPORT + " INTEGER," +
- Mms.REPORT_ALLOWED + " INTEGER," +
- Mms.RESPONSE_STATUS + " INTEGER," +
- Mms.STATUS + " INTEGER," +
- Mms.TRANSACTION_ID + " TEXT," +
- Mms.RETRIEVE_STATUS + " INTEGER," +
- Mms.RETRIEVE_TEXT + " TEXT," +
- Mms.RETRIEVE_TEXT_CHARSET + " INTEGER," +
- Mms.READ_STATUS + " INTEGER," +
- Mms.CONTENT_CLASS + " INTEGER," +
- Mms.RESPONSE_TEXT + " TEXT," +
- Mms.DELIVERY_TIME + " INTEGER," +
- Mms.DELIVERY_REPORT + " INTEGER," +
- Mms.LOCKED + " INTEGER DEFAULT 0," +
- Mms.SUBSCRIPTION_ID + " INTEGER DEFAULT "
- + SubscriptionManager.INVALID_SUBSCRIPTION_ID + ", " +
- Mms.SEEN + " INTEGER DEFAULT 0," +
- Mms.CREATOR + " TEXT," +
- Mms.TEXT_ONLY + " INTEGER DEFAULT 0" +
- ");");
- db.execSQL("CREATE TABLE " + MmsProvider.TABLE_ADDR + " (" +
- Addr._ID + " INTEGER PRIMARY KEY," +
- Addr.MSG_ID + " INTEGER," +
- Addr.CONTACT_ID + " INTEGER," +
- Addr.ADDRESS + " TEXT," +
- Addr.TYPE + " INTEGER," +
- Addr.CHARSET + " INTEGER);");
+ db.execSQL(CREATE_PDU_TABLE_STR);
- db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PART + " (" +
- Part._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
- Part.MSG_ID + " INTEGER," +
- Part.SEQ + " INTEGER DEFAULT 0," +
- Part.CONTENT_TYPE + " TEXT," +
- Part.NAME + " TEXT," +
- Part.CHARSET + " INTEGER," +
- Part.CONTENT_DISPOSITION + " TEXT," +
- Part.FILENAME + " TEXT," +
- Part.CONTENT_ID + " TEXT," +
- Part.CONTENT_LOCATION + " TEXT," +
- Part.CT_START + " INTEGER," +
- Part.CT_TYPE + " TEXT," +
- Part._DATA + " TEXT," +
- Part.TEXT + " TEXT);");
+ db.execSQL(CREATE_ADDR_TABLE_STR);
- db.execSQL("CREATE TABLE " + MmsProvider.TABLE_RATE + " (" +
- Rate.SENT_TIME + " INTEGER);");
+ db.execSQL(CREATE_PART_TABLE_STR);
- db.execSQL("CREATE TABLE " + MmsProvider.TABLE_DRM + " (" +
- BaseColumns._ID + " INTEGER PRIMARY KEY," +
- "_data TEXT);");
+ db.execSQL(CREATE_RATE_TABLE_STR);
+
+ db.execSQL(CREATE_DRM_TABLE_STR);
// Restricted view of pdu table, only sent/received messages without wap pushes
db.execSQL("CREATE VIEW " + MmsProvider.VIEW_PDU_RESTRICTED + " AS " +
@@ -1015,7 +1110,9 @@
"CREATE TABLE attachments (" +
"sms_id INTEGER," +
"content_url TEXT," +
- "offset INTEGER);";
+ "offset INTEGER," +
+ "sub_id INTEGER DEFAULT -1" +
+ ");";
/**
* This table is used by the SMS dispatcher to hold
@@ -1054,7 +1151,9 @@
db.execSQL("CREATE TABLE sr_pending (" +
"reference_number INTEGER," +
"action TEXT," +
- "data TEXT);");
+ "data TEXT," +
+ "sub_id INTEGER DEFAULT -1" +
+ ");");
// Restricted view of sms table, only sent/received messages
db.execSQL("CREATE VIEW " + SmsProvider.VIEW_SMS_RESTRICTED + " AS " +
@@ -1103,7 +1202,9 @@
*/
db.execSQL("CREATE TABLE canonical_addresses (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
- "address TEXT);");
+ "address TEXT," +
+ Telephony.CanonicalAddressesColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1"
+ + ");");
/**
* This table maps the subject and an ordered set of recipient
@@ -1124,7 +1225,9 @@
Threads.ARCHIVED + " INTEGER DEFAULT 0," +
Threads.TYPE + " INTEGER DEFAULT 0," +
Threads.ERROR + " INTEGER DEFAULT 0," +
- Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0);");
+ Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0," +
+ Threads.SUBSCRIPTION_ID + " INTEGER DEFAULT -1" +
+ ");");
/**
* This table stores the queue of messages to be sent/downloaded.
@@ -1248,6 +1351,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 41);
break;
} finally {
db.endTransaction();
@@ -1264,6 +1368,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 42);
break;
} finally {
db.endTransaction();
@@ -1280,6 +1385,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 43);
break;
} finally {
db.endTransaction();
@@ -1296,6 +1402,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 44);
break;
} finally {
db.endTransaction();
@@ -1312,6 +1419,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 45);
break;
} finally {
db.endTransaction();
@@ -1323,10 +1431,11 @@
}
db.beginTransaction();
try {
- upgradeDatabaseToVersion46(db);
+ upgradeDatabaseToVersion46(db, oldVersion, currentVersion);
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 46);
break;
} finally {
db.endTransaction();
@@ -1343,6 +1452,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 47);
break;
} finally {
db.endTransaction();
@@ -1359,6 +1469,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 48);
break;
} finally {
db.endTransaction();
@@ -1371,10 +1482,11 @@
db.beginTransaction();
try {
- createWordsTables(db);
+ createWordsTables(db, oldVersion, currentVersion, 49);
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 49);
break;
} finally {
db.endTransaction();
@@ -1386,10 +1498,11 @@
}
db.beginTransaction();
try {
- createThreadIdIndex(db);
+ createThreadIdIndex(db, oldVersion, currentVersion, 50);
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 50);
break; // force to destroy all old data;
} finally {
db.endTransaction();
@@ -1406,6 +1519,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 51);
break;
} finally {
db.endTransaction();
@@ -1428,6 +1542,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 53);
break;
} finally {
db.endTransaction();
@@ -1444,6 +1559,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 54);
break;
} finally {
db.endTransaction();
@@ -1460,6 +1576,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 55);
break;
} finally {
db.endTransaction();
@@ -1476,6 +1593,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 56);
break;
} finally {
db.endTransaction();
@@ -1492,6 +1610,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 57);
break;
} finally {
db.endTransaction();
@@ -1508,6 +1627,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 58);
break;
} finally {
db.endTransaction();
@@ -1524,6 +1644,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 59);
break;
} finally {
db.endTransaction();
@@ -1540,6 +1661,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 60);
break;
} finally {
db.endTransaction();
@@ -1556,6 +1678,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 61);
break;
} finally {
db.endTransaction();
@@ -1568,10 +1691,11 @@
db.beginTransaction();
try {
- upgradeDatabaseToVersion62(db);
+ upgradeDatabaseToVersion62(db, oldVersion, currentVersion);
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 62);
break;
} finally {
db.endTransaction();
@@ -1585,10 +1709,11 @@
db.beginTransaction();
try {
// upgrade to 63: just add a happy little index.
- createThreadIdDateIndex(db);
+ createThreadIdDateIndex(db, oldVersion, currentVersion, 63);
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 63);
break;
} finally {
db.endTransaction();
@@ -1605,6 +1730,7 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 64);
break;
} finally {
db.endTransaction();
@@ -1617,10 +1743,11 @@
db.beginTransaction();
try {
- upgradeDatabaseToVersion65(db);
+ upgradeDatabaseToVersion65(db, oldVersion, currentVersion);
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 65);
break;
} finally {
db.endTransaction();
@@ -1633,10 +1760,11 @@
db.beginTransaction();
try {
- upgradeDatabaseToVersion66(db);
+ upgradeDatabaseToVersion66(db, oldVersion, currentVersion);
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 66);
break;
} finally {
db.endTransaction();
@@ -1648,11 +1776,27 @@
}
db.beginTransaction();
try {
- createPartMidIndex(db);
- createAddrMsgIdIndex(db);
+ createPartMidIndex(db, oldVersion, currentVersion, 67);
+ createAddrMsgIdIndex(db, oldVersion, currentVersion, 67);
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(TAG, ex.getMessage(), ex);
+ logException(ex, oldVersion, currentVersion, 67);
+ break; // force to destroy all old data;
+ } finally {
+ db.endTransaction();
+ }
+ // fall through
+ case 67:
+ if (currentVersion <= 67) {
+ return;
+ }
+ db.beginTransaction();
+ try {
+ upgradeDatabaseToVersion68(db, oldVersion, currentVersion);
+ db.setTransactionSuccessful();
+ } catch(Throwable ex) {
+ Log.e(TAG, ex.getMessage(), ex);
break; // force to destroy all old data;
} finally {
db.endTransaction();
@@ -1661,30 +1805,38 @@
}
Log.e(TAG, "Destroying all old data.");
- localLog("onUpgrade: Calling dropAll() and onCreate(). Upgrading database"
+ localLog("onUpgrade: Calling wipeDbOnFailedUpgrade() and onCreate()."
+ + " Upgrading database"
+ " from version " + oldVersion + " to " + currentVersion + "failed.");
- dropAll(db);
+ db = wipeDbOnFailedUpgrade(db);
onCreate(db);
}
- private void dropAll(SQLiteDatabase db) {
- // Clean the database out in order to start over from scratch.
- // We don't need to drop our triggers here because SQLite automatically
- // drops a trigger when its attached database is dropped.
- localLog("****DROPPING ALL SMS-MMS TABLES****");
- db.execSQL("DROP TABLE IF EXISTS canonical_addresses");
- db.execSQL("DROP TABLE IF EXISTS threads");
- db.execSQL("DROP TABLE IF EXISTS " + MmsSmsProvider.TABLE_PENDING_MSG);
- db.execSQL("DROP TABLE IF EXISTS sms");
- db.execSQL("DROP TABLE IF EXISTS raw");
- db.execSQL("DROP TABLE IF EXISTS attachments");
- db.execSQL("DROP TABLE IF EXISTS thread_ids");
- db.execSQL("DROP TABLE IF EXISTS sr_pending");
- db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_PDU + ";");
- db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_ADDR + ";");
- db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_PART + ";");
- db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_RATE + ";");
- db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_DRM + ";");
+ private void logException(
+ Throwable ex, int oldVersion, int currentVersion, int upgradeVersion) {
+ int exception = FAILURE_UNKNOWN;
+ if (ex instanceof SQLiteException) {
+ exception = SQL_EXCEPTION;
+ } else if (ex instanceof IOException) {
+ exception = IO_EXCEPTION;
+ } else if (ex instanceof SecurityException) {
+ exception = SECURITY_EXCEPTION;
+ }
+ TelephonyStatsLog.write(
+ TelephonyStatsLog.MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED,
+ oldVersion,
+ currentVersion,
+ upgradeVersion,
+ exception);
+ }
+
+ public SQLiteDatabase wipeDbOnFailedUpgrade(SQLiteDatabase db) {
+ // Delete the database in order to start over from scratch.
+ File databaseFile = new File(db.getPath());
+ db.close();
+ boolean didDelete = SQLiteDatabase.deleteDatabase(databaseFile);
+ Log.e(TAG, "wipeDbOnFailedUpgrade: didDelete: " + didDelete);
+ return getWritableDatabase();
}
private void upgradeDatabaseToVersion41(SQLiteDatabase db) {
@@ -1733,7 +1885,7 @@
db.execSQL("ALTER TABLE pdu ADD COLUMN " + Mms.LOCKED + " INTEGER DEFAULT 0");
}
- private void upgradeDatabaseToVersion46(SQLiteDatabase db) {
+ private void upgradeDatabaseToVersion46(SQLiteDatabase db, int oldVersion, int currentVersion) {
// add the "text" column for caching inline text (e.g. strings) instead of
// putting them in an external file
db.execSQL("ALTER TABLE part ADD COLUMN " + Part.TEXT + " TEXT");
@@ -1771,6 +1923,7 @@
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
+ logException(e, oldVersion, currentVersion, 46);
}
}
}
@@ -1783,6 +1936,7 @@
(new File(pathToDelete)).delete();
} catch (SecurityException ex) {
Log.e(TAG, "unable to clean up old mms file for " + pathToDelete, ex);
+ logException(ex, oldVersion, currentVersion, 46);
}
}
if (textRows != null) {
@@ -1904,7 +2058,7 @@
}
- private void upgradeDatabaseToVersion62(SQLiteDatabase db) {
+ private void upgradeDatabaseToVersion62(SQLiteDatabase db, int oldVersion, int currentVersion) {
// When a non-FBE device is upgraded to N, all MMS attachment files are moved from
// /data/data to /data/user_de. We need to update the paths stored in the parts table to
// reflect this change.
@@ -1914,6 +2068,7 @@
}
catch (IOException e){
Log.e(TAG, "openFile: check file path failed " + e, e);
+ logException(e, oldVersion, currentVersion, 62);
return;
}
@@ -1938,7 +2093,7 @@
db.execSQL("ALTER TABLE " + SmsProvider.TABLE_RAW +" ADD COLUMN deleted INTEGER DEFAULT 0");
}
- private void upgradeDatabaseToVersion65(SQLiteDatabase db) {
+ private void upgradeDatabaseToVersion65(SQLiteDatabase db, int oldVersion, int currentVersion) {
// aosp and internal code diverged at version 63. Aosp did createThreadIdDateIndex() on
// upgrading to 63, whereas internal (nyc) added column 'deleted'. A device upgrading from
// nyc will have columns deleted and message_body in raw table with version 64, but not
@@ -1948,17 +2103,55 @@
} catch (SQLiteException e) {
Log.w(TAG, "[upgradeDatabaseToVersion65] Exception adding column message_body; " +
"trying createThreadIdDateIndex() instead: " + e);
+ logException(e, oldVersion, currentVersion, 65);
createThreadIdDateIndex(db);
}
}
- private void upgradeDatabaseToVersion66(SQLiteDatabase db) {
+ private void upgradeDatabaseToVersion66(SQLiteDatabase db, int oldVersion, int currentVersion) {
try {
db.execSQL("ALTER TABLE " + SmsProvider.TABLE_RAW
+ " ADD COLUMN display_originating_addr TEXT");
} catch (SQLiteException e) {
Log.e(TAG, "[upgradeDatabaseToVersion66] Exception adding column "
+ "display_originating_addr; " + e);
+ logException(e, oldVersion, currentVersion, 66);
+ }
+ }
+
+ private void upgradeDatabaseToVersion68(SQLiteDatabase db, int oldVersion, int currentVersion) {
+ try {
+ db.execSQL("ALTER TABLE " + MmsSmsProvider.TABLE_THREADS
+ + " ADD COLUMN " + Telephony.ThreadsColumns.SUBSCRIPTION_ID
+ + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ db.execSQL("ALTER TABLE " + MmsProvider.TABLE_PART
+ + " ADD COLUMN " + Part.SUBSCRIPTION_ID
+ + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ db.execSQL("ALTER TABLE " + SmsProvider.TABLE_CANONICAL_ADDRESSES
+ + " ADD COLUMN " + Telephony.CanonicalAddressesColumns.SUBSCRIPTION_ID
+ + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ db.execSQL("ALTER TABLE " + SmsProvider.TABLE_ATTACHMENTS
+ + " ADD COLUMN sub_id"
+ + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ db.execSQL("ALTER TABLE " + MmsProvider.TABLE_ADDR
+ + " ADD COLUMN " + Addr.SUBSCRIPTION_ID
+ + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ db.execSQL("ALTER TABLE " + MmsProvider.TABLE_RATE
+ + " ADD COLUMN " + Rate.SUBSCRIPTION_ID
+ + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ db.execSQL("ALTER TABLE " + MmsProvider.TABLE_DRM
+ + " ADD COLUMN sub_id"
+ + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ db.execSQL("ALTER TABLE " + MmsProvider.TABLE_WORDS
+ + " ADD COLUMN sub_id"
+ + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ db.execSQL("ALTER TABLE " + SmsProvider.TABLE_SR_PENDING
+ + " ADD COLUMN sub_id"
+ + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ } catch (SQLiteException e) {
+ Log.e(TAG, "[upgradeDatabaseToVersion68] Exception adding column "
+ + "sub_id; " + e);
+ logException(e, oldVersion, currentVersion, 68);
}
}
@@ -2148,7 +2341,9 @@
Threads.READ + " INTEGER DEFAULT 1," +
Threads.TYPE + " INTEGER DEFAULT 0," +
Threads.ERROR + " INTEGER DEFAULT 0," +
- Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0);");
+ Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0," +
+ Threads.SUBSCRIPTION_ID + " INTEGER DEFAULT -1"
+ +");");
db.execSQL("INSERT INTO threads_temp SELECT * from threads;");
db.execSQL("DROP TABLE threads;");
@@ -2170,7 +2365,9 @@
// Have to create a new temp canonical_addresses table. Copy all the info from the old
// table. Drop the old table and rename the new table to that of the old.
db.execSQL("CREATE TABLE canonical_addresses_temp (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
- "address TEXT);");
+ "address TEXT," +
+ Telephony.CanonicalAddressesColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1" +
+ ");");
db.execSQL("INSERT INTO canonical_addresses_temp SELECT * from canonical_addresses;");
db.execSQL("DROP TABLE canonical_addresses;");
@@ -2205,7 +2402,9 @@
Part.CT_START + " INTEGER," +
Part.CT_TYPE + " TEXT," +
Part._DATA + " TEXT," +
- Part.TEXT + " TEXT);");
+ Part.TEXT + " TEXT," +
+ Part.SUBSCRIPTION_ID + " INTEGER DEFAULT -1"
+ + ");");
db.execSQL("INSERT INTO part_temp SELECT * from part;");
db.execSQL("DROP TABLE part;");
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
index 8e01bcc..1d45803 100644
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ b/src/com/android/providers/telephony/MmsSmsProvider.java
@@ -23,6 +23,7 @@
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.DatabaseUtils;
+import android.database.MatrixCursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
@@ -40,9 +41,15 @@
import android.provider.Telephony.Sms.Conversations;
import android.provider.Telephony.Threads;
import android.provider.Telephony.ThreadsColumns;
+import android.telephony.SmsManager;
+import android.telephony.SubscriptionManager;
import android.text.TextUtils;
import android.util.Log;
+import com.android.internal.telephony.TelephonyPermissions;
+import com.android.internal.telephony.TelephonyStatsLog;
+import com.android.internal.telephony.util.TelephonyUtils;
+
import com.google.android.mms.pdu.PduHeaders;
import java.io.FileDescriptor;
@@ -50,6 +57,7 @@
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Set;
/**
@@ -78,6 +86,10 @@
new UriMatcher(UriMatcher.NO_MATCH);
private static final String LOG_TAG = "MmsSmsProvider";
private static final boolean DEBUG = false;
+ private static final int MULTIPLE_THREAD_IDS_FOUND = TelephonyStatsLog
+ .MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED__FAILURE_CODE__FAILURE_MULTIPLE_THREAD_IDS_FOUND;
+ private static final int FAILURE_FIND_OR_CREATE_THREAD_ID_SQL = TelephonyStatsLog
+ .MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED__FAILURE_CODE__FAILURE_FIND_OR_CREATE_THREAD_ID_SQL;
private static final String NO_DELETES_INSERTS_OR_UPDATES =
"MmsSmsProvider does not support deletes, inserts, or updates for this URI.";
@@ -306,8 +318,11 @@
private boolean mUseStrictPhoneNumberComparation;
+ // Call() methods and parameters
private static final String METHOD_IS_RESTORING = "is_restoring";
private static final String IS_RESTORING_KEY = "restoring";
+ private static final String METHOD_GARBAGE_COLLECT = "garbage_collect";
+ private static final String DO_DELETE = "delete";
@Override
public boolean onCreate() {
@@ -323,12 +338,15 @@
@Override
public Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
+ final int callerUid = Binder.getCallingUid();
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
+
// First check if restricted views of the "sms" and "pdu" tables should be used based on the
// caller's identity. Only system, phone or the default sms app can have full access
// of sms/mms data. For other apps, we present a restricted view which only contains sent
// or received messages, without wap pushes.
final boolean accessRestricted = ProviderUtil.isAccessRestricted(
- getContext(), getCallingPackage(), Binder.getCallingUid());
+ getContext(), getCallingPackage(), callerUid);
final String pduTable = MmsProvider.getPduTable(accessRestricted);
final String smsTable = SmsProvider.getSmsTable(accessRestricted);
@@ -342,11 +360,28 @@
}
}
+ String selectionBySubIds;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ // Filter MMS/SMS based on subId
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(), callerUserHandle);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor cursor = null;
+ Cursor emptyCursor = new MatrixCursor((projection == null) ?
+ (new String[] {}) : projection);
final int match = URI_MATCHER.match(uri);
switch (match) {
case URI_COMPLETE_CONVERSATIONS:
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return emptyCursor;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
cursor = getCompleteConversations(projection, selection, sortOrder, smsTable,
pduTable);
break;
@@ -355,17 +390,36 @@
if ((simple != null) && simple.equals("true")) {
String threadType = uri.getQueryParameter("thread_type");
if (!TextUtils.isEmpty(threadType)) {
- selection = concatSelections(
- selection, Threads.TYPE + "=" + threadType);
+ try {
+ Integer.parseInt(threadType);
+ selection = concatSelections(
+ selection, Threads.TYPE + "=" + threadType);
+ } catch (NumberFormatException ex) {
+ Log.e(LOG_TAG, "Thread type must be int");
+ // return empty cursor
+ break;
+ }
}
cursor = getSimpleConversations(
projection, selection, selectionArgs, sortOrder);
} else {
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return emptyCursor;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
cursor = getConversations(
projection, selection, sortOrder, smsTable, pduTable);
}
break;
case URI_CONVERSATIONS_MESSAGES:
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return emptyCursor;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
cursor = getConversationMessages(uri.getPathSegments().get(1), projection,
selection, sortOrder, smsTable, pduTable);
break;
@@ -380,6 +434,12 @@
selectionArgs, sortOrder);
break;
case URI_MESSAGES_BY_PHONE:
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return emptyCursor.
+ return emptyCursor;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
cursor = getMessagesByPhoneNumber(
uri.getPathSegments().get(2), projection, selection, sortOrder, smsTable,
pduTable);
@@ -390,6 +450,12 @@
cursor = getThreadId(recipients);
break;
case URI_CANONICAL_ADDRESS: {
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return emptyCursor;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
String extraSelection = "_id=" + uri.getPathSegments().get(1);
String finalSelection = TextUtils.isEmpty(selection)
? extraSelection : extraSelection + " AND " + selection;
@@ -402,6 +468,12 @@
break;
}
case URI_CANONICAL_ADDRESSES:
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return emptyCursor;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
cursor = db.query(TABLE_CANONICAL_ADDRESSES,
CANONICAL_ADDRESSES_COLUMNS_2,
selection,
@@ -485,8 +557,22 @@
String extraSelection = (proto != -1) ?
(PendingMessages.PROTO_TYPE + "=" + proto) : " 0=0 ";
if (!TextUtils.isEmpty(msgId)) {
- extraSelection += " AND " + PendingMessages.MSG_ID + "=" + msgId;
+ try {
+ Long.parseLong(msgId);
+ extraSelection += " AND " + PendingMessages.MSG_ID + "=" + msgId;
+ } catch(NumberFormatException ex) {
+ Log.e(LOG_TAG, "MSG ID must be a Long.");
+ // return empty cursor
+ break;
+ }
}
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return emptyCursor;
+ }
+ // In PendingMessages table, SUBSCRIPTION_ID column name is pending_sub_id.
+ selectionBySubIds = "pending_" + selectionBySubIds;
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
String finalSelection = TextUtils.isEmpty(selection)
? extraSelection : ("(" + extraSelection + ") AND " + selection);
@@ -497,11 +583,23 @@
break;
}
case URI_UNDELIVERED_MSG: {
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return emptyCursor;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
cursor = getUndeliveredMessages(projection, selection,
selectionArgs, sortOrder, smsTable, pduTable);
break;
}
case URI_DRAFT: {
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return emptyCursor;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
cursor = getDraftThread(projection, selection, sortOrder, smsTable, pduTable);
break;
}
@@ -513,11 +611,25 @@
Log.e(LOG_TAG, "Thread ID must be a long.");
break;
}
- cursor = getFirstLockedMessage(projection, "thread_id=" + Long.toString(threadId),
- sortOrder, smsTable, pduTable);
+ selection = DatabaseUtils.concatenateWhere(selection, ("thread_id=" + threadId));
+
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return emptyCursor;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
+ cursor = getFirstLockedMessage(projection, selection, sortOrder,
+ smsTable, pduTable);
break;
}
case URI_FIRST_LOCKED_MESSAGE_ALL: {
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return empty cursor.
+ return emptyCursor;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
cursor = getFirstLockedMessage(
projection, selection, sortOrder, smsTable, pduTable);
break;
@@ -542,7 +654,7 @@
// We lowercase all email addresses, but not addresses that aren't numbers, because
// that would incorrectly turn an address such as "My Vodafone" into "my vodafone"
// and the thread title would be incorrect when displayed in the UI.
- String refinedAddress = isEmail ? address.toLowerCase() : address;
+ String refinedAddress = isEmail ? address.toLowerCase(Locale.ROOT) : address;
String selection = "address=?";
String[] selectionArgs;
@@ -568,15 +680,19 @@
selection, selectionArgs, null, null, null);
if (cursor.getCount() == 0) {
+ // TODO (b/256992531): Currently, one sim card is set as default sms subId in work
+ // profile. Default sms subId should be updated based on user pref.
+ int subId = SmsManager.getDefaultSmsSubscriptionId();
ContentValues contentValues = new ContentValues(1);
contentValues.put(CanonicalAddressesColumns.ADDRESS, refinedAddress);
+ contentValues.put(CanonicalAddressesColumns.SUBSCRIPTION_ID, subId);
db = mOpenHelper.getWritableDatabase();
retVal = db.insert("canonical_addresses",
CanonicalAddressesColumns.ADDRESS, contentValues);
Log.d(LOG_TAG, "getSingleAddressId: insert new canonical_address for " +
- /*address*/ "xxxxxx" + ", _id=" + retVal);
+ /*address*/ "xxxxxx" + ", sub_id=" + subId + ", _id=" + retVal);
return retVal;
}
@@ -657,6 +773,9 @@
long date = System.currentTimeMillis();
values.put(ThreadsColumns.DATE, date - date % 1000);
values.put(ThreadsColumns.RECIPIENT_IDS, recipientIds);
+ // TODO (b/256992531): Currently, one sim card is set as default sms subId in work
+ // profile. Default sms subId should be updated based on user pref.
+ values.put(ThreadsColumns.SUBSCRIPTION_ID, SmsManager.getDefaultSmsSubscriptionId());
if (numberOfRecipients > 1) {
values.put(Threads.TYPE, Threads.BROADCAST_THREAD);
}
@@ -686,6 +805,10 @@
if (addressIds.size() == 0) {
Log.e(LOG_TAG, "getThreadId: NO receipients specified -- NOT creating thread",
new Exception());
+ TelephonyStatsLog.write(
+ TelephonyStatsLog.MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED,
+ TelephonyStatsLog
+ .MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED__FAILURE_CODE__FAILURE_NO_RECIPIENTS);
return null;
} else if (addressIds.size() == 1) {
// optimize for size==1, which should be most of the cases
@@ -724,12 +847,18 @@
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(LOG_TAG, ex.getMessage(), ex);
+ TelephonyStatsLog.write(
+ TelephonyStatsLog.MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED,
+ FAILURE_FIND_OR_CREATE_THREAD_ID_SQL);
} finally {
db.endTransaction();
}
if (cursor != null && cursor.getCount() > 1) {
Log.w(LOG_TAG, "getThreadId: why is cursorCount=" + cursor.getCount());
+ TelephonyStatsLog.write(
+ TelephonyStatsLog.MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED,
+ MULTIPLE_THREAD_IDS_FOUND);
}
return cursor;
}
@@ -1022,7 +1151,6 @@
private Cursor getMessagesByPhoneNumber(
String phoneNumber, String[] projection, String selection,
String sortOrder, String smsTable, String pduTable) {
- String escapedPhoneNumber = DatabaseUtils.sqlEscapeString(phoneNumber);
int minMatch =
getContext().getResources().getInteger(
com.android.internal.R.integer.config_phonenumber_compare_min_match);
@@ -1033,8 +1161,7 @@
String finalSmsSelection =
concatSelections(
selection,
- "(address=" + escapedPhoneNumber + " OR PHONE_NUMBERS_EQUAL(address, " +
- escapedPhoneNumber +
+ "(address=? OR PHONE_NUMBERS_EQUAL(address, ?" +
(mUseStrictPhoneNumberComparation ? ", 1))" : ", 0, " + minMatch + "))"));
SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
@@ -1044,9 +1171,8 @@
mmsQueryBuilder.setTables(
pduTable +
", (SELECT msg_id AS address_msg_id " +
- "FROM addr WHERE (address=" + escapedPhoneNumber +
- " OR PHONE_NUMBERS_EQUAL(addr.address, " +
- escapedPhoneNumber +
+ "FROM addr WHERE (address=?" +
+ " OR PHONE_NUMBERS_EQUAL(addr.address, ?" +
(mUseStrictPhoneNumberComparation ? ", 1))) " : ", 0, " + minMatch + "))) ") +
"AS matching_addresses");
smsQueryBuilder.setTables(smsTable);
@@ -1065,7 +1191,8 @@
String unionQuery = unionQueryBuilder.buildUnionQuery(
new String[] { mmsSubQuery, smsSubQuery }, sortOrder, null);
- return mOpenHelper.getReadableDatabase().rawQuery(unionQuery, EMPTY_STRING_ARRAY);
+ return mOpenHelper.getReadableDatabase().rawQuery(unionQuery,
+ new String[] { phoneNumber, phoneNumber, phoneNumber, phoneNumber });
}
/**
@@ -1233,6 +1360,16 @@
@Override
public int delete(Uri uri, String selection,
String[] selectionArgs) {
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
+ String selectionBySubIds;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ // Filter MMS/SMS based on subId
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(), callerUserHandle);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
Context context = getContext();
int affectedRows = 0;
@@ -1246,10 +1383,23 @@
Log.e(LOG_TAG, "Thread ID must be a long.");
break;
}
+
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return 0.
+ return 0;
+ }
+ selection = DatabaseUtils.concatenateWhere(selectionBySubIds, selection);
+
affectedRows = deleteConversation(uri, selection, selectionArgs);
MmsSmsDatabaseHelper.updateThread(db, threadId);
break;
case URI_CONVERSATIONS:
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return 0.
+ return 0;
+ }
+ selection = DatabaseUtils.concatenateWhere(selectionBySubIds, selection);
+
affectedRows = MmsProvider.deleteMessages(context, db,
selection, selectionArgs, uri)
+ db.delete("sms", selection, selectionArgs);
@@ -1289,13 +1439,41 @@
@Override
public Uri insert(Uri uri, ContentValues values) {
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
+ final int callerUid = Binder.getCallingUid();
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int matchIndex = URI_MATCHER.match(uri);
+ // TODO (b/256992531): Currently, one sim card is set as default sms subId in work
+ // profile. Default sms subId should be updated based on user pref.
+ int defaultSmsSubId = SmsManager.getDefaultSmsSubscriptionId();
if (matchIndex == URI_PENDING_MSG) {
+ int subId;
+ if (values.containsKey(PendingMessages.SUBSCRIPTION_ID)) {
+ subId = values.getAsInteger(PendingMessages.SUBSCRIPTION_ID);
+ } else {
+ subId = defaultSmsSubId;
+ if (SubscriptionManager.isValidSubscriptionId(subId)) {
+ values.put(PendingMessages.SUBSCRIPTION_ID, subId);
+ }
+ }
+
+ if (!TelephonyPermissions
+ .checkSubscriptionAssociatedWithUser(getContext(), subId, callerUserHandle)) {
+ TelephonyUtils.showSwitchToManagedProfileDialogIfAppropriate(getContext(), subId,
+ callerUid, getCallingPackage());
+ return null;
+ }
+
long rowId = db.insert(TABLE_PENDING_MSG, null, values);
return uri.buildUpon().appendPath(Long.toString(rowId)).build();
} else if (matchIndex == URI_CANONICAL_ADDRESS) {
+ if (!values.containsKey(CanonicalAddressesColumns.SUBSCRIPTION_ID)) {
+ if (SubscriptionManager.isValidSubscriptionId(defaultSmsSubId)) {
+ values.put(CanonicalAddressesColumns.SUBSCRIPTION_ID, defaultSmsSubId);
+ }
+ }
+
long rowId = db.insert(TABLE_CANONICAL_ADDRESSES, null, values);
return uri.buildUpon().appendPath(Long.toString(rowId)).build();
}
@@ -1306,21 +1484,52 @@
public int update(Uri uri, ContentValues values,
String selection, String[] selectionArgs) {
final int callerUid = Binder.getCallingUid();
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
final String callerPkg = getCallingPackage();
+
+ String selectionBySubIds;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ // Filter MMS/SMS based on subId.
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(), callerUserHandle);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int affectedRows = 0;
switch(URI_MATCHER.match(uri)) {
case URI_CONVERSATIONS_MESSAGES:
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return 0.
+ return 0;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
String threadIdString = uri.getPathSegments().get(1);
affectedRows = updateConversation(threadIdString, values,
selection, selectionArgs, callerUid, callerPkg);
break;
case URI_PENDING_MSG:
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return 0.
+ return 0;
+ }
+ // In PendingMessages table, SUBSCRIPTION_ID column name is pending_sub_id.
+ selectionBySubIds = "pending_" + selectionBySubIds;
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
affectedRows = db.update(TABLE_PENDING_MSG, values, selection, null);
break;
case URI_CANONICAL_ADDRESS: {
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return 0.
+ return 0;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
String extraSelection = "_id=" + uri.getPathSegments().get(1);
String finalSelection = TextUtils.isEmpty(selection)
? extraSelection : extraSelection + " AND " + selection;
@@ -1330,6 +1539,12 @@
}
case URI_CONVERSATIONS: {
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return 0.
+ return 0;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, selectionBySubIds);
+
final ContentValues finalValues = new ContentValues(1);
if (values.containsKey(Threads.ARCHIVED)) {
// Only allow update archived
@@ -1418,10 +1633,19 @@
@Override
public Bundle call(String method, String arg, Bundle extras) {
+ if (ProviderUtil.isAccessRestricted(
+ getContext(), getCallingPackage(), Binder.getCallingUid())) {
+ return null;
+ }
if (METHOD_IS_RESTORING.equals(method)) {
Bundle result = new Bundle();
result.putBoolean(IS_RESTORING_KEY, TelephonyBackupAgent.getIsRestoring());
return result;
+ } else if (METHOD_GARBAGE_COLLECT.equals(method)) {
+ Bundle result = new Bundle();
+ boolean doDelete = TextUtils.equals(DO_DELETE, arg);
+ MmsPartsCleanup.cleanupDanglingParts(getContext(), doDelete, result);
+ return result;
}
Log.w(LOG_TAG, "Ignored unsupported " + method + " call");
return null;
diff --git a/src/com/android/providers/telephony/ProviderUtil.java b/src/com/android/providers/telephony/ProviderUtil.java
index cd0f351..fe3ba24 100644
--- a/src/com/android/providers/telephony/ProviderUtil.java
+++ b/src/com/android/providers/telephony/ProviderUtil.java
@@ -16,18 +16,32 @@
package com.android.providers.telephony;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
+import android.os.Binder;
import android.os.Process;
+import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.Telephony;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
import android.text.TextUtils;
import android.util.Log;
import com.android.internal.telephony.SmsApplication;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
/**
* Helpers
*/
@@ -126,4 +140,84 @@
}
return context.createDeviceProtectedStorageContext();
}
+
+ /**
+ * Get subscriptions associated with the user in the format of a selection string.
+ * @param context context
+ * @param userHandle caller user handle.
+ * @return subscriptions associated with the user in the format of a selection string
+ * or {@code null} if user is not associated with any subscription.
+ */
+ @Nullable
+ public static String getSelectionBySubIds(Context context, @NonNull UserHandle userHandle) {
+ List<SubscriptionInfo> associatedSubscriptionsList = new ArrayList<>();
+ SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class);
+ if (subManager != null) {
+ // Get list of subscriptions associated with this user.
+ associatedSubscriptionsList = subManager
+ .getSubscriptionInfoListAssociatedWithUser(userHandle);
+ }
+
+ UserManager userManager = context.getSystemService(UserManager.class);
+ if ((userManager != null) && (!userManager.isManagedProfile(userHandle.getIdentifier()))) {
+ // SMS/MMS restored from another device have sub_id=-1.
+ // To query/update/delete those messages, sub_id=-1 should be in the selection string.
+ SubscriptionInfo invalidSubInfo = new SubscriptionInfo.Builder()
+ .setId(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+ .build();
+ associatedSubscriptionsList.add(invalidSubInfo);
+ }
+
+ if (associatedSubscriptionsList.isEmpty()) {
+ return null;
+ }
+
+ // Converts [1,2,3,4,-1] to "'1','2','3','4','-1'" so that it can be appended to
+ // selection string
+ String subIdListStr = associatedSubscriptionsList.stream()
+ .map(subInfo -> ("'" + subInfo.getSubscriptionId() + "'"))
+ .collect(Collectors.joining(","));
+ String selectionBySubId = (Telephony.Sms.SUBSCRIPTION_ID + " IN (" + subIdListStr + ")");
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.d(TAG, "getSelectionBySubIds: " + selectionBySubId);
+ }
+ return selectionBySubId;
+ }
+
+ /**
+ * Get emergency number list in the format of a selection string.
+ * @param context context
+ * @return emergency number list in the format of a selection string
+ * or {@code null} if emergency number list is empty.
+ */
+ @Nullable
+ public static String getSelectionByEmergencyNumbers(@NonNull Context context) {
+ // Get emergency number list to add it to selection string.
+ TelephonyManager tm = context.getSystemService(TelephonyManager.class);
+ Map<Integer, List<EmergencyNumber>> emergencyNumberList = null;
+ try {
+ if (tm != null) {
+ emergencyNumberList = tm.getEmergencyNumberList();
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Cannot get emergency number list: " + e);
+ }
+
+ String selectionByEmergencyNumber = null;
+ if (emergencyNumberList != null && !emergencyNumberList.isEmpty()) {
+ String emergencyNumberListStr = "";
+ for (Map.Entry<Integer, List<EmergencyNumber>> entry : emergencyNumberList.entrySet()) {
+ if (!emergencyNumberListStr.isEmpty() && !entry.getValue().isEmpty()) {
+ emergencyNumberListStr += ',';
+ }
+
+ emergencyNumberListStr += entry.getValue().stream()
+ .map(emergencyNumber -> ("'" + emergencyNumber.getNumber() + "'"))
+ .collect(Collectors.joining(","));
+ }
+ selectionByEmergencyNumber = Telephony.Sms.ADDRESS +
+ " IN (" + emergencyNumberListStr + ")";
+ }
+ return selectionByEmergencyNumber;
+ }
}
diff --git a/src/com/android/providers/telephony/SatelliteDatabaseHelper.java b/src/com/android/providers/telephony/SatelliteDatabaseHelper.java
new file mode 100644
index 0000000..9674b0c
--- /dev/null
+++ b/src/com/android/providers/telephony/SatelliteDatabaseHelper.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2023 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.
+ */
+
+package com.android.providers.telephony;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.provider.Telephony;
+
+public class SatelliteDatabaseHelper extends SQLiteOpenHelper {
+ private static final String TAG = "SatelliteDatabaseHelper";
+ private static final String DATABASE_NAME = "satellite.db";
+ private static final int DATABASE_VERSION = 1;
+
+ /**
+ * SatelliteDatabaseHelper satellite datagrams database helper class.
+ *
+ * @param context of the user.
+ */
+ public SatelliteDatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ setWriteAheadLoggingEnabled(false);
+ }
+
+ public static String getStringForDatagramTableCreation(String tableName) {
+ return "CREATE TABLE " + tableName + "("
+ + Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID
+ + " INTEGER PRIMARY KEY,"
+ + Telephony.SatelliteDatagrams.COLUMN_DATAGRAM + " BLOB DEFAULT ''" +
+ ");";
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ createDatagramsTable(db);
+ }
+
+ public void createDatagramsTable(SQLiteDatabase db) {
+ db.execSQL(getStringForDatagramTableCreation(Telephony.SatelliteDatagrams.TABLE_NAME));
+ }
+
+ public void dropDatagramsTable(SQLiteDatabase db) {
+ db.execSQL("DROP TABLE IF EXISTS " + Telephony.SatelliteDatagrams.TABLE_NAME + ";");
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ // do nothing
+ }
+}
diff --git a/src/com/android/providers/telephony/SatelliteProvider.java b/src/com/android/providers/telephony/SatelliteProvider.java
new file mode 100644
index 0000000..110bc7d
--- /dev/null
+++ b/src/com/android/providers/telephony/SatelliteProvider.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2023 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.
+ */
+
+package com.android.providers.telephony;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.provider.Telephony;
+import android.util.Log;
+
+import java.util.Arrays;
+
+public class SatelliteProvider extends ContentProvider {
+ private static final String TAG = "SatelliteProvider";
+ private static final boolean VDBG = false; // STOPSHIP if true
+
+ private SatelliteDatabaseHelper mDbHelper;
+
+ @Override
+ public boolean onCreate() {
+ Log.d(TAG, "onCreate");
+ mDbHelper = new SatelliteDatabaseHelper(getContext());
+ return true;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ if (VDBG) {
+ Log.d(TAG, "query:"
+ + " uri=" + uri
+ + " values=" + Arrays.toString(projection)
+ + " selection=" + selection
+ + " selectionArgs=" + Arrays.toString(selectionArgs));
+ }
+ SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+ qb.setTables(Telephony.SatelliteDatagrams.TABLE_NAME);
+
+ SQLiteDatabase db = getReadableDatabase();
+ Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
+ return c;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ if (VDBG) {
+ Log.d(TAG, "insert:"
+ + " uri=" + uri
+ + " values=" + values);
+ }
+ long row = getWritableDatabase().insertOrThrow(Telephony.SatelliteDatagrams.TABLE_NAME,
+ null, values);
+ if (row > 0) {
+ Uri newUri = ContentUris.withAppendedId(Telephony.SatelliteDatagrams.CONTENT_URI, row);
+ getContext().getContentResolver().notifyChange(newUri, null);
+ return newUri;
+ }
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ if (VDBG) {
+ Log.d(TAG, "delete:"
+ + " uri=" + uri
+ + " selection={" + selection + "}"
+ + " selection=" + selection
+ + " selectionArgs=" + Arrays.toString(selectionArgs));
+ }
+ final int count = getWritableDatabase().delete(Telephony.SatelliteDatagrams.TABLE_NAME,
+ selection, selectionArgs);
+ Log.d(TAG, " delete.count=" + count);
+ return count;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ /**
+ * These methods can be overridden in a subclass for testing SatelliteProvider using an
+ * in-memory database.
+ */
+ SQLiteDatabase getReadableDatabase() {
+ return mDbHelper.getReadableDatabase();
+ }
+ SQLiteDatabase getWritableDatabase() {
+ return mDbHelper.getWritableDatabase();
+ }
+}
diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
index d378c64..579b59d 100644
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ b/src/com/android/providers/telephony/SmsProvider.java
@@ -18,10 +18,13 @@
import android.annotation.NonNull;
import android.app.AppOpsManager;
+import android.content.BroadcastReceiver;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.DatabaseUtils;
@@ -32,6 +35,7 @@
import android.net.Uri;
import android.os.Binder;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.Contacts;
import android.provider.Telephony;
import android.provider.Telephony.MmsSms;
@@ -44,6 +48,8 @@
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.TelephonyPermissions;
+import com.android.internal.telephony.util.TelephonyUtils;
import java.util.HashMap;
import java.util.List;
@@ -57,7 +63,9 @@
private static final Uri ICC_SUBID_URI = Uri.parse("content://sms/icc_subId");
static final String TABLE_SMS = "sms";
static final String TABLE_RAW = "raw";
- private static final String TABLE_SR_PENDING = "sr_pending";
+ static final String TABLE_ATTACHMENTS = "attachments";
+ static final String TABLE_CANONICAL_ADDRESSES = "canonical_addresses";
+ static final String TABLE_SR_PENDING = "sr_pending";
private static final String TABLE_WORDS = "words";
static final String VIEW_SMS_RESTRICTED = "sms_restricted";
@@ -101,6 +109,13 @@
mDeOpenHelper = MmsSmsDatabaseHelper.getInstanceForDe(getContext());
mCeOpenHelper = MmsSmsDatabaseHelper.getInstanceForCe(getContext());
TelephonyBackupAgent.DeferredSmsMmsRestoreService.startIfFilesExist(getContext());
+
+ // Creating intent broadcast receiver for user actions like Intent.ACTION_USER_REMOVED,
+ // where we would need to remove SMS related to removed user.
+ IntentFilter userIntentFilter = new IntentFilter(Intent.ACTION_USER_REMOVED);
+ getContext().registerReceiver(mUserIntentReceiver, userIntentFilter,
+ Context.RECEIVER_NOT_EXPORTED);
+
return true;
}
@@ -117,12 +132,15 @@
@Override
public Cursor query(Uri url, String[] projectionIn, String selection,
String[] selectionArgs, String sort) {
+ final int callingUid = Binder.getCallingUid();
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
+
// First check if a restricted view of the "sms" table should be used based on the
// caller's identity. Only system, phone or the default sms app can have full access
// of sms data. For other apps, we present a restricted view which only contains sent
// or received messages.
final boolean accessRestricted = ProviderUtil.isAccessRestricted(
- getContext(), getCallingPackage(), Binder.getCallingUid());
+ getContext(), getCallingPackage(), callingUid);
final String smsTable = getSmsTable(accessRestricted);
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
@@ -136,6 +154,9 @@
}
}
+ Cursor emptyCursor = new MatrixCursor((projectionIn == null) ?
+ (new String[] {}) : projectionIn);
+
// Generate the body of the query.
int match = sURLMatcher.match(url);
SQLiteDatabase db = getReadableDatabase(match);
@@ -271,6 +292,13 @@
throw new IllegalArgumentException("Wrong path segements, uri= " + url);
}
}
+
+ if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(),
+ subId, callerUserHandle)) {
+ // If subId is not associated with user, return empty cursor.
+ return emptyCursor;
+ }
+
Cursor ret = getAllMessagesFromIcc(subId);
ret.setNotificationUri(getContext().getContentResolver(),
match == SMS_ALL_ICC ? ICC_URI : ICC_SUBID_URI);
@@ -293,6 +321,13 @@
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Wrong path segements, uri= " + url);
}
+
+ if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(),
+ subId, callerUserHandle)) {
+ // If subId is not associated with user, return empty cursor.
+ return emptyCursor;
+ }
+
Cursor ret = getSingleMessageFromIcc(subId, messageIndex);
ret.setNotificationUri(getContext().getContentResolver(),
match == SMS_ICC ? ICC_URI : ICC_SUBID_URI);
@@ -304,6 +339,43 @@
return null;
}
+ final long token = Binder.clearCallingIdentity();
+ String selectionBySubIds = null;
+ String selectionByEmergencyNumbers = null;
+ try {
+ // Filter SMS based on subId and emergency numbers.
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+ callerUserHandle);
+ if (qb.getTables().equals(smsTable)) {
+ selectionByEmergencyNumbers = ProviderUtil
+ .getSelectionByEmergencyNumbers(getContext());
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+
+ if (qb.getTables().equals(smsTable)) {
+ if (selectionBySubIds == null && selectionByEmergencyNumbers == null) {
+ // No subscriptions associated with user
+ // and no emergency numbers return empty cursor.
+ return emptyCursor;
+ }
+ } else {
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user return empty cursor.
+ return emptyCursor;
+ }
+ }
+
+ String filter = "";
+ if (selectionBySubIds != null && selectionByEmergencyNumbers != null) {
+ filter = (selectionBySubIds + " OR " + selectionByEmergencyNumbers);
+ } else {
+ filter = selectionBySubIds == null ?
+ selectionByEmergencyNumbers : selectionBySubIds;
+ }
+ selection = DatabaseUtils.concatenateWhere(selection, filter);
+
String orderBy = null;
if (!TextUtils.isEmpty(sort)) {
@@ -314,7 +386,6 @@
Cursor ret = qb.query(db, projectionIn, selection, selectionArgs,
null, null, orderBy);
-
// TODO: Since the URLs are a mess, always use content://sms
ret.setNotificationUri(getContext().getContentResolver(),
NOTIFICATION_URI);
@@ -510,12 +581,14 @@
@Override
public int bulkInsert(@NonNull Uri url, @NonNull ContentValues[] values) {
final int callerUid = Binder.getCallingUid();
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
final String callerPkg = getCallingPackage();
long token = Binder.clearCallingIdentity();
try {
int messagesInserted = 0;
for (ContentValues initialValues : values) {
- Uri insertUri = insertInner(url, initialValues, callerUid, callerPkg);
+ Uri insertUri = insertInner(url, initialValues, callerUid, callerPkg,
+ callerUserHandle);
if (insertUri != null) {
messagesInserted++;
}
@@ -535,15 +608,15 @@
@Override
public Uri insert(Uri url, ContentValues initialValues) {
final int callerUid = Binder.getCallingUid();
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
final String callerPkg = getCallingPackage();
long token = Binder.clearCallingIdentity();
try {
- Uri insertUri = insertInner(url, initialValues, callerUid, callerPkg);
+ Uri insertUri = insertInner(url, initialValues, callerUid, callerPkg, callerUserHandle);
- int match = sURLMatcher.match(url);
- // Skip notifyChange() if insertUri is null for SMS_ALL_ICC or SMS_ALL_ICC_SUBID caused
- // by failure of insertMessageToIcc()(e.g. SIM full).
- if (insertUri != null || (match != SMS_ALL_ICC && match != SMS_ALL_ICC_SUBID)) {
+ // Skip notifyChange() if insertUri is null
+ if (insertUri != null) {
+ int match = sURLMatcher.match(url);
// The raw table is used by the telephony layer for storing an sms before sending
// out a notification that an sms has arrived. We don't want to notify the default
// sms app of changes to this table.
@@ -556,7 +629,8 @@
}
}
- private Uri insertInner(Uri url, ContentValues initialValues, int callerUid, String callerPkg) {
+ private Uri insertInner(Uri url, ContentValues initialValues, int callerUid, String callerPkg,
+ UserHandle callerUserHandle) {
ContentValues values;
long rowID;
int type = Sms.MESSAGE_TYPE_ALL;
@@ -629,6 +703,13 @@
}
}
+ if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(), subId,
+ callerUserHandle)) {
+ TelephonyUtils.showSwitchToManagedProfileDialogIfAppropriate(getContext(),
+ subId, callerUid, callerPkg);
+ return null;
+ }
+
if (initialValues == null) {
throw new IllegalArgumentException("ContentValues is null");
}
@@ -724,7 +805,7 @@
CONTACT_QUERY_PROJECTION,
null, null, null);
- if (cursor.moveToFirst()) {
+ if (cursor != null && cursor.moveToFirst()) {
Long id = Long.valueOf(cursor.getLong(PERSON_ID_COLUMN));
values.put(Sms.PERSON, id);
}
@@ -755,6 +836,35 @@
}
}
+ // Insert subId value
+ int subId;
+ if (values.containsKey(Telephony.Sms.SUBSCRIPTION_ID)) {
+ subId = values.getAsInteger(Telephony.Sms.SUBSCRIPTION_ID);
+ } else {
+ // TODO (b/256992531): Currently, one sim card is set as default sms subId in work
+ // profile. Default sms subId should be updated based on user pref.
+ subId = SmsManager.getDefaultSmsSubscriptionId();
+ if (SubscriptionManager.isValidSubscriptionId(subId)) {
+ values.put(Telephony.Sms.SUBSCRIPTION_ID, subId);
+ }
+ }
+
+
+ if (table.equals(TABLE_SMS)) {
+ // Get destination address from values
+ String address = "";
+ if (values.containsKey(Sms.ADDRESS)) {
+ address = values.getAsString(Sms.ADDRESS);
+ }
+
+ if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(), subId,
+ callerUserHandle, address)) {
+ TelephonyUtils.showSwitchToManagedProfileDialogIfAppropriate(getContext(), subId,
+ callerUid, callerPkg);
+ return null;
+ }
+ }
+
rowID = db.insert(table, "body", values);
// Don't use a trigger for updating the words table because of a bug
@@ -769,6 +879,7 @@
cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, values.getAsString("body"));
cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, rowID);
cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 1);
+ cv.put(MmsSms.WordsTable.SUBSCRIPTION_ID, subId);
db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv);
}
if (rowID > 0) {
@@ -848,12 +959,44 @@
@Override
public int delete(Uri url, String where, String[] whereArgs) {
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
+ final int callerUid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+
+ String selectionBySubIds = null;
+ String selectionByEmergencyNumbers = null;
+ try {
+ // Filter SMS based on subId and emergency numbers.
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+ callerUserHandle);
+ selectionByEmergencyNumbers = ProviderUtil
+ .getSelectionByEmergencyNumbers(getContext());
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+
+ String filter = "";
+ if (selectionBySubIds == null && selectionByEmergencyNumbers == null) {
+ // No subscriptions associated with user and no emergency numbers
+ filter = null;
+ } else if (selectionBySubIds != null && selectionByEmergencyNumbers != null) {
+ filter = (selectionBySubIds + " OR " + selectionByEmergencyNumbers);
+ } else {
+ filter = selectionBySubIds == null ?
+ selectionByEmergencyNumbers : selectionBySubIds;
+ }
+
int count;
int match = sURLMatcher.match(url);
SQLiteDatabase db = getWritableDatabase(match);
boolean notifyIfNotDefault = true;
switch (match) {
case SMS_ALL:
+ if (filter == null) {
+ // No subscriptions associated with user and no emergency numbers, return 0.
+ return 0;
+ }
+ where = DatabaseUtils.concatenateWhere(where, filter);
count = db.delete(TABLE_SMS, where, whereArgs);
if (count != 0) {
// Don't update threads unless something changed.
@@ -884,6 +1027,11 @@
// delete the messages from the sms table
where = DatabaseUtils.concatenateWhere("thread_id=" + threadID, where);
+ if (filter == null) {
+ // No subscriptions associated with user and no emergency numbers, return 0.
+ return 0;
+ }
+ where = DatabaseUtils.concatenateWhere(where, filter);
count = db.delete(TABLE_SMS, where, whereArgs);
MmsSmsDatabaseHelper.updateThread(db, threadID);
break;
@@ -907,6 +1055,11 @@
break;
case SMS_STATUS_PENDING:
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return 0.
+ return 0;
+ }
+ where = DatabaseUtils.concatenateWhere(where, selectionBySubIds);
count = db.delete("sr_pending", where, whereArgs);
break;
@@ -924,6 +1077,13 @@
throw new IllegalArgumentException("Wrong path segements, uri= " + url);
}
}
+
+ if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(),
+ subId, callerUserHandle)) {
+ // If subId is not associated with user, return 0.
+ return 0;
+ }
+
deletedCnt = deleteAllMessagesFromIcc(subId);
// Notify changes even failure case since there might be some changes should be
// known.
@@ -954,6 +1114,13 @@
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Wrong path segements, uri= " + url);
}
+
+ if (!TelephonyPermissions.checkSubscriptionAssociatedWithUser(getContext(),
+ subId, callerUserHandle)) {
+ // If subId is not associated with user, return 0.
+ return 0;
+ }
+
success = deleteMessageFromIcc(subId, messageIndex);
// Notify changes even failure case since there might be some changes should be
// known.
@@ -1034,6 +1201,7 @@
@Override
public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
final int callerUid = Binder.getCallingUid();
+ final UserHandle callerUserHandle = Binder.getCallingUserHandle();
final String callerPkg = getCallingPackage();
int count = 0;
String table = TABLE_SMS;
@@ -1103,6 +1271,43 @@
values.remove(Sms.CREATOR);
}
+ final long token = Binder.clearCallingIdentity();
+ String selectionBySubIds = null;
+ String selectionByEmergencyNumbers = null;
+ try {
+ // Filter SMS based on subId and emergency numbers.
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+ callerUserHandle);
+ if (table.equals(TABLE_SMS)) {
+ selectionByEmergencyNumbers = ProviderUtil
+ .getSelectionByEmergencyNumbers(getContext());
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+
+ if (table.equals(TABLE_SMS)) {
+ if (selectionBySubIds == null && selectionByEmergencyNumbers == null) {
+ // No subscriptions associated with user and no emergency numbers, return 0.
+ return 0;
+ }
+ } else {
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return 0.
+ return 0;
+ }
+ }
+
+
+ String filter = "";
+ if (selectionBySubIds != null && selectionByEmergencyNumbers != null) {
+ filter = (selectionBySubIds + " OR " + selectionByEmergencyNumbers);
+ } else {
+ filter = selectionBySubIds == null ?
+ selectionByEmergencyNumbers : selectionBySubIds;
+ }
+ where = DatabaseUtils.concatenateWhere(where, filter);
+
where = DatabaseUtils.concatenateWhere(where, extraWhere);
count = db.update(table, values, where, whereArgs);
@@ -1192,13 +1397,13 @@
sURLMatcher.addURI("sms", "failed/#", SMS_FAILED_ID);
sURLMatcher.addURI("sms", "queued", SMS_QUEUED);
sURLMatcher.addURI("sms", "conversations", SMS_CONVERSATIONS);
- sURLMatcher.addURI("sms", "conversations/*", SMS_CONVERSATIONS_ID);
+ sURLMatcher.addURI("sms", "conversations/#", SMS_CONVERSATIONS_ID);
sURLMatcher.addURI("sms", "raw", SMS_RAW_MESSAGE);
sURLMatcher.addURI("sms", "raw/permanentDelete", SMS_RAW_MESSAGE_PERMANENT_DELETE);
sURLMatcher.addURI("sms", "attachments", SMS_ATTACHMENT);
sURLMatcher.addURI("sms", "attachments/#", SMS_ATTACHMENT_ID);
sURLMatcher.addURI("sms", "threadID", SMS_NEW_THREAD_ID);
- sURLMatcher.addURI("sms", "threadID/*", SMS_QUERY_THREAD_ID);
+ sURLMatcher.addURI("sms", "threadID/#", SMS_QUERY_THREAD_ID);
sURLMatcher.addURI("sms", "status/#", SMS_STATUS_ID);
sURLMatcher.addURI("sms", "sr_pending", SMS_STATUS_PENDING);
sURLMatcher.addURI("sms", "icc", SMS_ALL_ICC);
@@ -1221,4 +1426,49 @@
SQLiteDatabase getWritableDatabase(int match) {
return getDBOpenHelper(match).getWritableDatabase();
}
+
+ private BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ switch (intent.getAction()) {
+ case Intent.ACTION_USER_REMOVED:
+ UserHandle userToBeRemoved = intent.getParcelableExtra(Intent.EXTRA_USER,
+ UserHandle.class);
+ UserManager userManager = context.getSystemService(UserManager.class);
+ if ((userToBeRemoved == null) || (userManager == null) ||
+ (!userManager.isManagedProfile(userToBeRemoved.getIdentifier()))) {
+ // Do not delete SMS if removed profile is not managed profile.
+ return;
+ }
+ Log.d(TAG, "Received ACTION_USER_REMOVED for managed profile - Deleting SMS.");
+
+ // Deleting SMS related to managed profile.
+ Uri uri = Sms.CONTENT_URI;
+ int match = sURLMatcher.match(uri);
+ SQLiteDatabase db = getWritableDatabase(match);
+
+ final long token = Binder.clearCallingIdentity();
+ String selectionBySubIds;
+ try {
+ // Filter SMS based on subId.
+ selectionBySubIds = ProviderUtil.getSelectionBySubIds(getContext(),
+ userToBeRemoved);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ if (selectionBySubIds == null) {
+ // No subscriptions associated with user, return.
+ return;
+ }
+
+ int count = db.delete(TABLE_SMS, selectionBySubIds, null);
+ if (count != 0) {
+ // Don't update threads unless something changed.
+ MmsSmsDatabaseHelper.updateThreads(db, selectionBySubIds, null);
+ notifyChange(true, uri, getCallingPackage());
+ }
+ break;
+ }
+ }
+ };
}
diff --git a/src/com/android/providers/telephony/SqlQueryChecker.java b/src/com/android/providers/telephony/SqlQueryChecker.java
index a98dd25..f9e3c17 100644
--- a/src/com/android/providers/telephony/SqlQueryChecker.java
+++ b/src/com/android/providers/telephony/SqlQueryChecker.java
@@ -16,11 +16,13 @@
package com.android.providers.telephony;
+import android.util.Log;
+
public class SqlQueryChecker {
private static final String SELECT_TOKEN = "select";
static void checkToken(String token) {
- if (SELECT_TOKEN.equals(token.toLowerCase())) {
+ if (SELECT_TOKEN.equalsIgnoreCase(token)) {
throw new IllegalArgumentException("SELECT token not allowed in query");
}
}
@@ -32,14 +34,18 @@
*/
static void checkQueryParametersForSubqueries(String[] projection,
String selection, String sortOrder) {
+ Log.v("MmsProvider", "inside checkQueryParametersForSubqueries");
if (projection != null) {
for (String proj : projection) {
+ Log.v("MmsProvider", "checkQueryParametersForSubqueries checking proj: " + proj);
SQLiteTokenizer.tokenize(proj, SQLiteTokenizer.OPTION_NONE,
SqlQueryChecker::checkToken);
}
}
+ Log.v("MmsProvider", "checkQueryParametersForSubqueries checking sel: " + selection);
SQLiteTokenizer.tokenize(selection, SQLiteTokenizer.OPTION_NONE,
SqlQueryChecker::checkToken);
+ Log.v("MmsProvider", "checkQueryParametersForSubqueries checking sort: " + sortOrder);
SQLiteTokenizer.tokenize(sortOrder, SQLiteTokenizer.OPTION_NONE,
SqlQueryChecker::checkToken);
}
diff --git a/src/com/android/providers/telephony/TelephonyBackupAgent.java b/src/com/android/providers/telephony/TelephonyBackupAgent.java
index 34fed99..5f75117 100644
--- a/src/com/android/providers/telephony/TelephonyBackupAgent.java
+++ b/src/com/android/providers/telephony/TelephonyBackupAgent.java
@@ -31,11 +31,11 @@
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
-import android.database.DatabaseUtils;
import android.net.Uri;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.os.PowerManager;
+import android.os.UserHandle;
import android.preference.PreferenceManager;
import android.provider.BaseColumns;
import android.provider.Telephony;
@@ -288,6 +288,8 @@
private static final String QUOTA_RESET_TIME = "reset_quota_time";
private static final long QUOTA_RESET_INTERVAL = 30 * AlarmManager.INTERVAL_DAY; // 30 days.
+ // Key for explicitly settings whether mms restore should notify or not
+ static final String NOTIFY = "notify";
static {
// Consider restored messages read and seen by default. The actual data can override
@@ -732,6 +734,7 @@
jsonReader.beginArray();
int total = 0;
int numExceptions = 0;
+ final int notifyAfterCount = mMaxMsgPerFile;
while (jsonReader.hasNext()) {
final Mms mms = readMmsFromReader(jsonReader);
if (DEBUG) {
@@ -747,17 +750,32 @@
continue;
}
total++;
+ mms.values.put(NOTIFY, false);
addMmsMessage(mms);
+ // notifying every 1000 messages to follow sms restore pattern
+ if (total % notifyAfterCount == 0) {
+ notifyBulkMmsChange();
+ }
} catch (Exception e) {
Log.e(TAG, "putMmsMessagesToProvider", e);
numExceptions++;
DeferredSmsMmsRestoreService.localLog("putMmsMessagesToProvider: Exception " + e);
}
}
+ // notifying for any remaining messages
+ if (total % notifyAfterCount > 0) {
+ notifyBulkMmsChange();
+ }
Log.d(TAG, "putMmsMessagesToProvider handled " + total + " new messages.");
incremenentSharedPref(false, total, numExceptions);
}
+ private void notifyBulkMmsChange() {
+ mContentResolver.notifyChange(Telephony.MmsSms.CONTENT_URI, null,
+ ContentResolver.NOTIFY_SYNC_TO_NETWORK, UserHandle.USER_ALL);
+ ProviderUtil.notifyIfNotDefaultSmsApp(Telephony.Mms.CONTENT_URI, null, this);
+ }
+
@VisibleForTesting
static final String[] PROJECTION_ID = {BaseColumns._ID};
private static final int ID_IDX = 0;
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index e09fa72..1364afc 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -108,6 +108,8 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Telephony;
+import android.service.carrier.IApnSourceService;
+import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyProtoEnums;
@@ -116,41 +118,42 @@
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
+import android.util.IndentingPrintWriter;
+import android.util.LocalLog;
import android.util.Log;
import android.util.Pair;
import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyStatsLog;
import com.android.internal.util.XmlUtils;
-import android.service.carrier.IApnSourceService;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.ByteArrayOutputStream;
import java.io.File;
+import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
-import java.lang.Integer;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
-import java.util.zip.CheckedInputStream;
import java.util.zip.CRC32;
+import java.util.zip.CheckedInputStream;
public class TelephonyProvider extends ContentProvider
{
@@ -159,7 +162,7 @@
private static final boolean DBG = true;
private static final boolean VDBG = false; // STOPSHIP if true
- private static final int DATABASE_VERSION = 57 << 16;
+ private static final int DATABASE_VERSION = 62 << 16;
private static final int URL_UNKNOWN = 0;
private static final int URL_TELEPHONY = 1;
private static final int URL_CURRENT = 2;
@@ -281,6 +284,8 @@
private boolean mManagedApnEnforced;
+ private final LocalLog mLocalLog = new LocalLog(128);
+
/**
* Mobile country codes where there is a high likelyhood that the MNC has 3 digits
* and need one more prefix zero to set correct mobile network code value.
@@ -443,6 +448,8 @@
SIM_INFO_COLUMNS_TO_BACKUP.put(
Telephony.SimInfo.COLUMN_USAGE_SETTING,
Cursor.FIELD_TYPE_INTEGER);
+ SIM_INFO_COLUMNS_TO_BACKUP.put(
+ Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES, Cursor.FIELD_TYPE_STRING);
}
@VisibleForTesting
@@ -562,6 +569,7 @@
+ Telephony.SimInfo.SUBSCRIPTION_TYPE_LOCAL_SIM + ","
+ Telephony.SimInfo.COLUMN_GROUP_OWNER + " TEXT,"
+ Telephony.SimInfo.COLUMN_DATA_ENABLED_OVERRIDE_RULES + " TEXT,"
+ + Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES + " TEXT,"
+ Telephony.SimInfo.COLUMN_IMSI + " TEXT,"
+ Telephony.SimInfo.COLUMN_UICC_APPLICATIONS_ENABLED + " INTEGER DEFAULT 1,"
+ Telephony.SimInfo.COLUMN_ALLOWED_NETWORK_TYPES + " BIGINT DEFAULT -1,"
@@ -577,7 +585,12 @@
+ Telephony.SimInfo.COLUMN_PHONE_NUMBER_SOURCE_IMS + " TEXT,"
+ Telephony.SimInfo.COLUMN_PORT_INDEX + " INTEGER DEFAULT -1,"
+ Telephony.SimInfo.COLUMN_USAGE_SETTING + " INTEGER DEFAULT "
- + SubscriptionManager.USAGE_SETTING_UNKNOWN
+ + SubscriptionManager.USAGE_SETTING_UNKNOWN + ","
+ + Telephony.SimInfo.COLUMN_TP_MESSAGE_REF +
+ " INTEGER DEFAULT -1,"
+ + Telephony.SimInfo.COLUMN_USER_HANDLE + " INTEGER DEFAULT "
+ + UserHandle.USER_NULL + ","
+ + Telephony.SimInfo.COLUMN_SATELLITE_ENABLED + " INTEGER DEFAULT -1"
+ ");";
}
@@ -1805,6 +1818,94 @@
oldVersion = 57 << 16 | 6;
}
+ if (oldVersion < (58 << 16 | 6)) {
+ try {
+ // Try to update the siminfo table with new columns.
+ db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+ + Telephony.SimInfo.COLUMN_TP_MESSAGE_REF
+ + " INTEGER DEFAULT -1;");
+ } catch (SQLiteException e) {
+ if (DBG) {
+ log("onUpgrade failed to update " + SIMINFO_TABLE
+ + " to add message Reference. ");
+ }
+ }
+ oldVersion = 58 << 16 | 6;
+ }
+
+ if (oldVersion < (59 << 16 | 6)) {
+ try {
+ // Try to update the siminfo table with new columns.
+ db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+ + Telephony.SimInfo.COLUMN_USER_HANDLE
+ + " INTEGER DEFAULT " + UserHandle.USER_NULL +";");
+ } catch (SQLiteException e) {
+ if (DBG) {
+ log("onUpgrade failed to update " + SIMINFO_TABLE
+ + " to add message Reference. ");
+ }
+ }
+ oldVersion = 59 << 16 | 6;
+ }
+ if (oldVersion < (60 << 16 | 6)) {
+ // Update the siminfo table with new column enabled_data_mobile_policies
+ // and set its value to be a copy of data_enabled_override_rules.
+ try {
+ db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+ + Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES
+ + " TEXT;");
+ } catch (SQLiteException e) {
+ if (DBG) {
+ log("onUpgrade failed to insert "
+ +Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES +" to "
+ + SIMINFO_TABLE);
+ }
+ }
+ // Migrate the old Long values over to String
+ String[] proj = {Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
+ Telephony.SimInfo.COLUMN_DATA_ENABLED_OVERRIDE_RULES};
+ try (Cursor c = db.query(SIMINFO_TABLE, proj, null, null, null, null, null)) {
+ while (c.moveToNext()) {
+ fillInEnabledMobileDataPoliciesAtCursor(db, c);
+ }
+ } catch (SQLiteException e) {
+ if (DBG) {
+ log("can't migrate value from COLUMN_DATA_ENABLED_OVERRIDE_RULES to "
+ + "COLUMN_ENABLED_MOBILE_DATA_POLICIES");
+ }
+ }
+ oldVersion = 60 << 16 | 6;
+ }
+
+ if (oldVersion < (61 << 16 | 6)) {
+ try {
+ // If default value of USER_HANDLE column is set to -1, then update it to -10000
+ db.execSQL("UPDATE " + SIMINFO_TABLE + " SET "
+ + Telephony.SimInfo.COLUMN_USER_HANDLE + "=" + UserHandle.USER_NULL
+ + " WHERE " + Telephony.SimInfo.COLUMN_USER_HANDLE + "=-1;");
+ } catch (SQLiteException e) {
+ if (DBG) {
+ log("onUpgrade failed to update " + SIMINFO_TABLE
+ + " to add message Reference. ");
+ }
+ }
+ oldVersion = 61 << 16 | 6;
+ }
+
+ if (oldVersion < (62 << 16 | 6)) {
+ try {
+ // Try to update the siminfo table with new columns.
+ db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+ + Telephony.SimInfo.COLUMN_SATELLITE_ENABLED
+ + " INTEGER DEFAULT -1;");
+ } catch (SQLiteException e) {
+ if (DBG) {
+ log("onUpgrade failed to update " + SIMINFO_TABLE
+ + " to add satellite enabled. ");
+ }
+ }
+ oldVersion = 62 << 16 | 6;
+ }
if (DBG) {
log("dbh.onUpgrade:- db=" + db + " oldV=" + oldVersion + " newV=" + newVersion);
}
@@ -2631,8 +2732,8 @@
if (oldType.equals("") || newType.equals("")) {
newRow.put(TYPE, "");
} else {
- String[] oldTypes = oldType.toLowerCase().split(",");
- String[] newTypes = newType.toLowerCase().split(",");
+ String[] oldTypes = oldType.toLowerCase(Locale.ROOT).split(",");
+ String[] newTypes = newType.toLowerCase(Locale.ROOT).split(",");
if (VDBG) {
log("mergeFieldsAndUpdateDb: Calling separateRowsNeeded() oldType=" +
@@ -3025,13 +3126,6 @@
@Override
public boolean onCreate() {
mOpenHelper = new DatabaseHelper(getContext());
-
- try {
- PhoneFactory.addLocalLog(TAG, 64);
- } catch (IllegalArgumentException e) {
- // ignore
- }
-
boolean isNewBuild = false;
String newBuildId = SystemProperties.get("ro.build.id", null);
SharedPreferences sp = getContext().getSharedPreferences(BUILD_ID_FILE,
@@ -3101,9 +3195,9 @@
}
}
- private static void localLog(String logMsg) {
+ private void localLog(String logMsg) {
Log.d(TAG, logMsg);
- PhoneFactory.localLog(TAG, logMsg);
+ mLocalLog.log(logMsg);
}
private synchronized boolean isManagedApnEnforced() {
@@ -3638,7 +3732,7 @@
PersistableBundle backedUpSimInfoEntry, int backupDataFormatVersion,
String isoCountryCodeFromDb,
List<String> wfcRestoreBlockedCountries) {
- if (DATABASE_VERSION != 57 << 16) {
+ if (DATABASE_VERSION != 62 << 16) {
throw new AssertionError("The database schema has been updated which might make "
+ "the format of #BACKED_UP_SIM_SPECIFIC_SETTINGS_FILE outdated. Make sure to "
+ "1) review whether any of the columns in #SIM_INFO_COLUMNS_TO_BACKUP have "
@@ -3680,6 +3774,12 @@
* Also make sure to add necessary removal of sensitive settings in
* polishContentValues(ContentValues contentValues).
*/
+ if (backupDataFormatVersion >= 60 << 16) {
+ contentValues.put(Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES,
+ backedUpSimInfoEntry.getString(
+ Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES,
+ DEFAULT_STRING_COLUMN_VALUE));
+ }
if (backupDataFormatVersion >= 57 << 16) {
contentValues.put(Telephony.SimInfo.COLUMN_USAGE_SETTING,
backedUpSimInfoEntry.getInt(
@@ -3718,7 +3818,7 @@
DEFAULT_INT_COLUMN_VALUE));
if (isoCountryCodeFromDb != null
&& !wfcRestoreBlockedCountries
- .contains(isoCountryCodeFromDb.toLowerCase())) {
+ .contains(isoCountryCodeFromDb.toLowerCase(Locale.ROOT))) {
// Don't restore COLUMN_WFC_IMS_ENABLED if the sim is from one of the countries that
// requires WFC entitlement.
contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED,
@@ -3820,10 +3920,19 @@
}
@Override
- public synchronized Cursor query(Uri url, String[] projectionIn, String selection,
+ public Cursor query(Uri url, String[] projectionIn, String selection, String[] selectionArgs,
+ String sort) {
+ if (VDBG) log("query: url=" + url + ", projectionIn=" + Arrays.toString(projectionIn)
+ + ", selection=" + selection + "selectionArgs=" + Arrays.toString(selectionArgs)
+ + ", sort=" + sort);
+ int match = s_urlMatcher.match(url);
+ checkPermissionCompat(match, projectionIn);
+
+ return queryInternal(url, projectionIn, selection, selectionArgs, sort);
+ }
+
+ private synchronized Cursor queryInternal(Uri url, String[] projectionIn, String selection,
String[] selectionArgs, String sort) {
- if (VDBG) log("query: url=" + url + ", projectionIn=" + projectionIn + ", selection="
- + selection + "selectionArgs=" + selectionArgs + ", sort=" + sort);
int subId = SubscriptionManager.getDefaultSubscriptionId();
String subIdString;
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
@@ -3833,7 +3942,6 @@
List<String> constraints = new ArrayList<String>();
int match = s_urlMatcher.match(url);
- checkPermissionCompat(match, projectionIn);
switch (match) {
case URL_TELEPHONY_USING_SUBID: {
// The behaves exactly same as URL_SIM_APN_LIST_ID.
@@ -4018,7 +4126,7 @@
qb.appendWhereStandalone(IS_NOT_OWNED_BY_DPC);
}
return getSubscriptionMatchingAPNList(qb, projectionIn, selection, selectionArgs,
- sort, subId);
+ sort, subId);
}
default: {
@@ -4120,11 +4228,12 @@
ret = qb.query(db, null, selection, selectionArgs, null, null, sort);
if (ret == null) {
- loge("query current APN but cursor is null.");
+ loge("subId:" + subId + " query current APN but cursor is null.");
return null;
}
- if (DBG) log("match current APN size: " + ret.getCount());
+ if (DBG) log("subId:" + subId + " mccmnc=" + mccmnc + " carrierId=" + carrierId +
+ ", match current APN size: " + ret.getCount());
String[] columnNames = projectionIn != null ? projectionIn : ret.getColumnNames();
MatrixCursor currentCursor = new MatrixCursor(columnNames);
@@ -4935,6 +5044,12 @@
Telephony.SimInfo.COLUMN_USAGE_SETTING),
usingSubId, subId), null, true, UserHandle.USER_ALL);
}
+ if (values.containsKey(Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES)) {
+ getContext().getContentResolver().notifyChange(getNotifyContentUri(
+ Uri.withAppendedPath(Telephony.SimInfo.CONTENT_URI,
+ Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES),
+ usingSubId, subId), null, true, UserHandle.USER_ALL);
+ }
break;
default:
getContext().getContentResolver().notifyChange(
@@ -5268,7 +5383,7 @@
}
private static int getMvnoTypeIntFromString(String mvnoType) {
- String mvnoTypeString = TextUtils.isEmpty(mvnoType) ? mvnoType : mvnoType.toLowerCase();
+ String mvnoTypeString = TextUtils.isEmpty(mvnoType) ? mvnoType : mvnoType.toLowerCase(Locale.ROOT);
Integer mvnoTypeInt = MVNO_TYPE_STRING_MAP.get(mvnoTypeString);
return mvnoTypeInt == null ? 0 : mvnoTypeInt;
}
@@ -5435,4 +5550,115 @@
new String[]{subId});
}
}
+
+ /**
+ * Migrate the old values{@link Telephony.SimInfo#COLUMN_DATA_ENABLED_OVERRIDE_RULES} over to
+ * String{@link Telephony.SimInfo#COLUMN_ENABLED_MOBILE_DATA_POLICIES}
+ *
+ * @param db The sqlite database to write to
+ * @param c The {@link Telephony.SimInfo#COLUMN_DATA_ENABLED_OVERRIDE_RULES} values in the sim info
+ * table.
+ */
+ public static void fillInEnabledMobileDataPoliciesAtCursor(SQLiteDatabase db, Cursor c) {
+ String overrideRule;
+ String subId;
+ try {
+ overrideRule = c.getString(
+ c.getColumnIndexOrThrow(Telephony.SimInfo.COLUMN_DATA_ENABLED_OVERRIDE_RULES));
+ subId = c.getString(c.getColumnIndexOrThrow(
+ Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "COLUMN_DATA_ENABLED_OVERRIDE_RULES not found.");
+ return;
+ }
+
+ if (overrideRule != null) {
+ ContentValues cv = new ContentValues(1);
+
+ // convert override rule to its corresponding mobile data policy
+ overrideRule = overrideRule.contains("mms") ?
+ String.valueOf(TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED): "";
+ cv.put(Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES, overrideRule);
+ db.update(SIMINFO_TABLE, cv,
+ Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID + "=?",
+ new String[]{subId});
+ }
+ }
+
+ /**
+ * Dump the database table.
+ *
+ * @param tableName Table name.
+ * @param pw Print writer.
+ */
+ private void dumpTable(@NonNull String tableName, @NonNull IndentingPrintWriter pw) {
+ try (Cursor cursor = getReadableDatabase().query(false, tableName, null,
+ null, null, null, null, null, null)) {
+ pw.println(tableName + " table:");
+ pw.increaseIndent();
+ while (cursor != null && cursor.moveToNext()) {
+ List<String> columnStrings = new ArrayList<>();
+ String str = "";
+ for (int i = 0; i < cursor.getColumnCount(); i++) {
+ str = cursor.getColumnName(i) + "=";
+ int type = cursor.getType(i);
+ try {
+ switch (type) {
+ case 0 /*FIELD_TYPE_NULL*/:
+ str += "null";
+ break;
+ case 1 /*FIELD_TYPE_INTEGER*/:
+ str += cursor.getInt(i);
+ break;
+ case 2 /*FIELD_TYPE_FLOAT*/:
+ str += cursor.getFloat(i);
+ break;
+ case 3 /*FIELD_TYPE_STRING*/:
+ String columnValue = cursor.getString(i);
+ // Redact icc_id and card_id
+ if (SIMINFO_TABLE.equals(tableName)
+ && (Telephony.SimInfo.COLUMN_ICC_ID.equals(
+ cursor.getColumnName(i))
+ || Telephony.SimInfo.COLUMN_CARD_ID.equals(
+ cursor.getColumnName(i)))) {
+ columnValue = SubscriptionInfo.getPrintableId(columnValue);
+ }
+ str += columnValue;
+ break;
+ case 4 /*FIELD_TYPE_BLOB*/:
+ str += "[blob]";
+ break;
+ default:
+ str += "unknown";
+ break;
+ }
+ } catch (Exception e) {
+ str += "exception";
+ }
+ columnStrings.add(str);
+ }
+ pw.println(TextUtils.join(", ", columnStrings));
+ }
+ pw.decreaseIndent();
+ } catch (Exception ex) {
+ pw.println("Exception while dumping the table " + tableName + ", ex=" + ex);
+ }
+ }
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter printWriter, String[] args) {
+ IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, " ");
+ pw.println(TAG + ":");
+ pw.increaseIndent();
+ pw.println("Database:");
+ pw.increaseIndent();
+ dumpTable(SIMINFO_TABLE, pw);
+ dumpTable(CARRIERS_TABLE, pw);
+ pw.decreaseIndent();
+ pw.println("Local log:");
+ pw.increaseIndent();
+ mLocalLog.dump(pw);
+ pw.decreaseIndent();
+ pw.decreaseIndent();
+ }
}
diff --git a/tests/Android.bp b/tests/Android.bp
index 7695c03..0945bfa 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -10,6 +10,7 @@
"compatibility-device-util-axt",
"androidx.test.rules",
"truth-prebuilt",
+ "androidx.test.core",
],
libs: [
"android.test.runner",
diff --git a/tests/src/com/android/providers/telephony/MmsProviderTest.java b/tests/src/com/android/providers/telephony/MmsProviderTest.java
new file mode 100644
index 0000000..2e618b0
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/MmsProviderTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+
+package com.android.providers.telephony;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.AppOpsManager;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.provider.Telephony;
+import android.telephony.TelephonyManager;
+import android.test.mock.MockContentResolver;
+import android.util.Log;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+
+public class MmsProviderTest extends TestCase {
+ private static final String TAG = "MmsProviderTest";
+
+ private MockContentResolver mContentResolver;
+ private MmsProviderTestable mMmsProviderTestable;
+
+ private int notifyChangeCount;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ mMmsProviderTestable = new MmsProviderTestable();
+
+ // setup mocks
+ Context context = mock(Context.class);
+ PackageManager packageManager = mock(PackageManager.class);
+ Resources resources = mock(Resources.class);
+ when(context.getSystemService(eq(Context.APP_OPS_SERVICE)))
+ .thenReturn(mock(AppOpsManager.class));
+ when(context.getSystemService(eq(Context.TELEPHONY_SERVICE)))
+ .thenReturn(mock(TelephonyManager.class));
+
+ when(context.checkCallingOrSelfPermission(anyString()))
+ .thenReturn(PackageManager.PERMISSION_GRANTED);
+ when(context.getUserId()).thenReturn(0);
+ when(context.getPackageManager()).thenReturn(packageManager);
+ when(context.getResources()).thenReturn(resources);
+ when(resources.getString(anyInt())).thenReturn("");
+
+ /**
+ * This is used to give the MmsProviderTest a mocked context which takes a
+ * MmsProvider and attaches it to the ContentResolver with telephony authority.
+ * The mocked context also gives WRITE_APN_SETTINGS permissions
+ */
+ mContentResolver = new MockContentResolver() {
+ @Override
+ public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork,
+ int userHandle) {
+ notifyChangeCount++;
+ }
+ };
+ when(context.getContentResolver()).thenReturn(mContentResolver);
+
+ // Add authority="mms" to given mmsProvider
+ ProviderInfo providerInfo = new ProviderInfo();
+ providerInfo.authority = "mms";
+
+ // Add context to given mmsProvider
+ mMmsProviderTestable.attachInfoForTesting(context, providerInfo);
+ Log.d(TAG, "MockContextWithProvider: mmsProvider.getContext(): "
+ + mMmsProviderTestable.getContext());
+
+ // Add given MmsProvider to mResolver with authority="mms" so that
+ // mResolver can send queries to mMmsProvider
+ mContentResolver.addProvider("mms", mMmsProviderTestable);
+ Log.d(TAG, "MockContextWithProvider: Add MmsProvider to mResolver");
+ notifyChangeCount = 0;
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ mMmsProviderTestable.closeDatabase();
+ }
+
+ @Test
+ public void testInsertMms() {
+ final ContentValues values = getTestContentValues();
+
+ Uri expected = Uri.parse("content://mms/1");
+ Uri actual = mContentResolver.insert(Telephony.Mms.CONTENT_URI, values);
+
+ assertEquals(expected, actual);
+ assertEquals(1, notifyChangeCount);
+ }
+
+ @Test
+ public void testInsertMmsWithoutNotify() {
+
+ MmsProvider.ProviderUtilWrapper providerUtilWrapper =
+ mock(MmsProvider.ProviderUtilWrapper.class);
+ when(providerUtilWrapper.isAccessRestricted(
+ any(Context.class), anyString(), anyInt())).thenReturn(false);
+ mMmsProviderTestable.setProviderUtilWrapper(providerUtilWrapper);
+
+ final ContentValues values = getTestContentValues();
+ values.put(TelephonyBackupAgent.NOTIFY, false);
+
+ Uri expected = Uri.parse("content://mms/1");
+ Uri actual = mContentResolver.insert(Telephony.Mms.CONTENT_URI, values);
+
+ assertEquals(expected, actual);
+ assertEquals(0, notifyChangeCount);
+ }
+
+ private ContentValues getTestContentValues() {
+ final ContentValues values = new ContentValues();
+ values.put(Telephony.Mms.READ, 1);
+ values.put(Telephony.Mms.SEEN, 1);
+ values.put(Telephony.Mms.SUBSCRIPTION_ID, 1);
+ values.put(Telephony.Mms.MESSAGE_BOX, Telephony.Mms.MESSAGE_BOX_ALL);
+ values.put(Telephony.Mms.TEXT_ONLY, 1);
+ values.put(Telephony.Mms.THREAD_ID, 1);
+ return values;
+ }
+}
diff --git a/tests/src/com/android/providers/telephony/MmsProviderTestable.java b/tests/src/com/android/providers/telephony/MmsProviderTestable.java
new file mode 100644
index 0000000..cfc0359
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/MmsProviderTestable.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+package com.android.providers.telephony;
+
+import static com.android.providers.telephony.MmsSmsDatabaseHelper.CREATE_ADDR_TABLE_STR;
+import static com.android.providers.telephony.MmsSmsDatabaseHelper.CREATE_DRM_TABLE_STR;
+import static com.android.providers.telephony.MmsSmsDatabaseHelper.CREATE_PART_TABLE_STR;
+import static com.android.providers.telephony.MmsSmsDatabaseHelper.CREATE_PDU_TABLE_STR;
+import static com.android.providers.telephony.MmsSmsDatabaseHelper.CREATE_RATE_TABLE_STR;
+
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.util.Log;
+
+/**
+ * A subclass of MmsProvider used for testing on an in-memory database
+ */
+public class MmsProviderTestable extends MmsProvider {
+ private static final String TAG = "MmsProviderTestable";
+
+ @Override
+ public boolean onCreate() {
+ Log.d(TAG, "onCreate called: mDbHelper = new InMemoryMmsProviderDbHelper()");
+ mOpenHelper = new InMemoryMmsProviderDbHelper();
+ return true;
+ }
+
+ // close mDbHelper database object
+ protected void closeDatabase() {
+ mOpenHelper.close();
+ }
+
+ /**
+ * An in memory DB for MmsProviderTestable to use
+ */
+ public static class InMemoryMmsProviderDbHelper extends SQLiteOpenHelper {
+
+
+ public InMemoryMmsProviderDbHelper() {
+ super(null, // no context is needed for in-memory db
+ null, // db file name is null for in-memory db
+ null, // CursorFactory is null by default
+ 1); // db version is no-op for tests
+ Log.d(TAG, "InMemoryMmsProviderDbHelper creating in-memory database");
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ // Set up the mms tables
+ Log.d(TAG, "InMemoryMmsProviderDbHelper onCreate creating the mms tables");
+ db.execSQL(CREATE_PDU_TABLE_STR);
+ db.execSQL(CREATE_ADDR_TABLE_STR);
+ db.execSQL(CREATE_PART_TABLE_STR);
+ db.execSQL(CREATE_RATE_TABLE_STR);
+ db.execSQL(CREATE_DRM_TABLE_STR);
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ Log.d(TAG, "InMemorySmsProviderDbHelper onUpgrade doing nothing");
+ }
+ }
+}
diff --git a/tests/src/com/android/providers/telephony/ProviderUtilTest.java b/tests/src/com/android/providers/telephony/ProviderUtilTest.java
new file mode 100644
index 0000000..1e3020c
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/ProviderUtilTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+
+package com.android.providers.telephony;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class ProviderUtilTest {
+ private static final String TAG = "ProviderUtilTest";
+
+ private Context mContext;
+ @Mock
+ private SubscriptionManager mSubscriptionManager;
+ @Mock
+ private TelephonyManager mTelephonyManager;
+
+ private Map<Integer, List<EmergencyNumber>> mEmergencyNumberList;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+
+ when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void getSelectionBySubIds_noSubscription() {
+ List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
+ doReturn(subscriptionInfoList).when(mSubscriptionManager)
+ .getSubscriptionInfoListAssociatedWithUser(UserHandle.SYSTEM);
+
+ assertThat(ProviderUtil.getSelectionBySubIds(mContext, UserHandle.SYSTEM))
+ .isEqualTo("sub_id IN ('-1')");
+ }
+
+ @Test
+ public void getSelectionBySubIds_withDefaultSubId() {
+ // As sub_id is not set explicitly, its value will be -1
+ SubscriptionInfo subscriptionInfo1 = new SubscriptionInfo.Builder()
+ .setSimSlotIndex(0)
+ .build();
+ List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
+ subscriptionInfoList.add(subscriptionInfo1);
+
+ doReturn(subscriptionInfoList).when(mSubscriptionManager)
+ .getSubscriptionInfoListAssociatedWithUser(UserHandle.SYSTEM);
+
+ assertThat(ProviderUtil.getSelectionBySubIds(mContext, UserHandle.SYSTEM))
+ .isEqualTo("sub_id IN ('-1','-1')");
+ }
+
+ @Test
+ public void getSelectionBySubIds_withActiveSubscriptions() {
+ SubscriptionInfo subscriptionInfo1 = new SubscriptionInfo.Builder()
+ .setId(1)
+ .setSimSlotIndex(0)
+ .build();
+ List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
+
+ SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo.Builder()
+ .setId(2)
+ .setSimSlotIndex(1)
+ .build();
+
+ subscriptionInfoList.add(subscriptionInfo1);
+ subscriptionInfoList.add(subscriptionInfo2);
+ doReturn(subscriptionInfoList).when(mSubscriptionManager)
+ .getSubscriptionInfoListAssociatedWithUser(UserHandle.SYSTEM);
+
+ assertThat(ProviderUtil.getSelectionBySubIds(mContext, UserHandle.SYSTEM))
+ .isEqualTo("sub_id IN ('1','2','-1')");
+ }
+
+ @Test
+ public void getSelectionByEmergencyNumbers_nullEmergencyNumberList() {
+ doReturn(null).when(mTelephonyManager).getEmergencyNumberList();
+
+ assertThat(ProviderUtil.getSelectionByEmergencyNumbers(mContext))
+ .isEqualTo(null);
+ }
+
+ @Test
+ public void getSelectionByEmergencyNumbers_emptyEmergencyNumberList() {
+ mEmergencyNumberList = Map.of();
+ doReturn(mEmergencyNumberList).when(mTelephonyManager).getEmergencyNumberList();
+
+ assertThat(ProviderUtil.getSelectionByEmergencyNumbers(mContext))
+ .isEqualTo(null);
+ }
+
+ @Test
+ public void getSelectionBySubIds_withEmergencyNumberList() {
+ // Create emergencyNumberList for testing.
+ List<EmergencyNumber> emergencyNumberList1 = new ArrayList<EmergencyNumber>();
+ emergencyNumberList1.add(new EmergencyNumber("911", "us", "000",
+ EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE,null, 0, 0));
+ emergencyNumberList1.add(new EmergencyNumber("112", "us", "000",
+ EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE,null, 0, 0));
+ mEmergencyNumberList = Map.of(-1, emergencyNumberList1);
+ doReturn(mEmergencyNumberList).when(mTelephonyManager).getEmergencyNumberList();
+
+ assertThat(ProviderUtil.getSelectionByEmergencyNumbers(mContext))
+ .isEqualTo("address IN ('911','112')");
+ }
+}
\ No newline at end of file
diff --git a/tests/src/com/android/providers/telephony/SatelliteProviderTest.java b/tests/src/com/android/providers/telephony/SatelliteProviderTest.java
new file mode 100644
index 0000000..21fa38c
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/SatelliteProviderTest.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2023 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.
+ */
+
+package com.android.providers.telephony;
+
+import android.content.ContentValues;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.provider.Telephony;
+import android.test.mock.MockContentResolver;
+import android.test.mock.MockContext;
+import android.text.TextUtils;
+import android.util.Log;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+
+public class SatelliteProviderTest extends TestCase {
+ private static final String TAG = "SatelliteProviderTest";
+
+ private MockContextWithProvider mContext;
+ private MockContentResolver mContentResolver;
+ private SatelliteProviderTestable mSatelliteProviderTestable;
+
+ /**
+ * This is used to give the SatelliteProviderTest a mocked context which takes a
+ * SatelliteProvider and attaches it to the ContentResolver.
+ */
+ private class MockContextWithProvider extends MockContext {
+ private final MockContentResolver mResolver;
+
+ public MockContextWithProvider(SatelliteProvider satelliteProvider) {
+ mResolver = new MockContentResolver();
+
+ ProviderInfo providerInfo = new ProviderInfo();
+ providerInfo.authority = Telephony.SatelliteDatagrams.PROVIDER_NAME;
+
+ // Add context to given satelliteProvider
+ satelliteProvider.attachInfoForTesting(this, providerInfo);
+ Log.d(TAG, "MockContextWithProvider: satelliteProvider.getContext(): "
+ + satelliteProvider.getContext());
+
+ // Add given satelliteProvider to mResolver, so that mResolver can send queries
+ // to the provider.
+ mResolver.addProvider(Telephony.SatelliteDatagrams.PROVIDER_NAME, satelliteProvider);
+ Log.d(TAG, "MockContextWithProvider: Add satelliteProvider to mResolver");
+ }
+
+ @Override
+ public Object getSystemService(String name) {
+ Log.d(TAG, "getSystemService: returning null");
+ return null;
+ }
+
+ @Override
+ public Resources getResources() {
+ Log.d(TAG, "getResources: returning null");
+ return null;
+ }
+
+ @Override
+ public MockContentResolver getContentResolver() {
+ return mResolver;
+ }
+
+ // Gives permission to write to the apn table within the MockContext
+ @Override
+ public int checkCallingOrSelfPermission(String permission) {
+ if (TextUtils.equals(permission, "android.permission.WRITE_APN_SETTINGS")) {
+ Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
+ + ", returning PackageManager.PERMISSION_GRANTED");
+ return PackageManager.PERMISSION_GRANTED;
+ } else {
+ Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
+ + ", returning PackageManager.PERMISSION_DENIED");
+ return PackageManager.PERMISSION_DENIED;
+ }
+ }
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mSatelliteProviderTestable = new SatelliteProviderTestable();
+ mContext = new MockContextWithProvider(mSatelliteProviderTestable);
+ mContentResolver = (MockContentResolver) mContext.getContentResolver();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ mSatelliteProviderTestable.closeDatabase();
+ }
+
+ @Test
+ public void testInsertDatagram() {
+ long testDatagramId = 1;
+ String testDatagram = "testInsertDatagram";
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID,
+ testDatagramId);
+ contentValues.put(Telephony.SatelliteDatagrams.COLUMN_DATAGRAM, testDatagram.getBytes());
+
+ try {
+ mContentResolver.insert(Telephony.SatelliteDatagrams.CONTENT_URI, contentValues);
+ } catch (Exception e){
+ Log.d(TAG, "Error inserting satellite datagram:" + e);
+ }
+
+ String whereClause = (Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID
+ + "=" +testDatagramId);
+ try (Cursor cursor = mContentResolver.query(Telephony.SatelliteDatagrams.CONTENT_URI,
+ null, whereClause, null, null)) {
+ cursor.moveToFirst();
+ byte[] datagram = cursor.getBlob(0);
+ assertEquals(testDatagram, new String(datagram));
+ } catch (Exception e) {
+ Log.d(TAG, "Exception in getting count:" + e);
+ }
+ }
+
+ @Test
+ public void testDeleteDatagram() {
+ long testDatagramId = 10;
+ String testDatagram = "testDeleteDatagram";
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID,
+ testDatagramId);
+ contentValues.put(Telephony.SatelliteDatagrams.COLUMN_DATAGRAM, testDatagram.getBytes());
+
+ try {
+ mContentResolver.insert(Telephony.SatelliteDatagrams.CONTENT_URI, contentValues);
+ } catch (Exception e){
+ Log.d(TAG, "Error inserting satellite datagram:" + e);
+ }
+
+ int numRowsDeleted = -1;
+ String whereClause = (Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID
+ + "=" +testDatagramId);
+ try {
+ numRowsDeleted = mContentResolver.delete(Telephony.SatelliteDatagrams.CONTENT_URI,
+ whereClause, null);
+ } catch (Exception e) {
+ Log.d(TAG, "Error deleting values:" + e);
+ }
+ assertEquals(1, numRowsDeleted);
+
+ try (Cursor cursor = mContentResolver.query(Telephony.SatelliteDatagrams.CONTENT_URI,
+ null, whereClause, null, null)) {
+ assertNotNull(cursor);
+ assertEquals(0, cursor.getCount());
+ } catch (Exception e) {
+ Log.d(TAG, "Exception in getting count:" + e);
+ }
+ }
+}
diff --git a/tests/src/com/android/providers/telephony/SatelliteProviderTestable.java b/tests/src/com/android/providers/telephony/SatelliteProviderTestable.java
new file mode 100644
index 0000000..ba40214
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/SatelliteProviderTestable.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2023 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.
+ */
+
+package com.android.providers.telephony;
+
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.provider.Telephony;
+import android.util.Log;
+
+import static com.android.providers.telephony.SatelliteDatabaseHelper.*;
+
+/**
+ * A subclass of SatelliteProvider used for testing on an in-memory database.
+ */
+public class SatelliteProviderTestable extends SatelliteProvider {
+ private static final String TAG = "SatelliteProviderTestable";
+
+ private InMemorySatelliteProviderDbHelper mDbHelper;
+
+ @Override
+ public boolean onCreate() {
+ Log.d(TAG, "onCreate called: mDbHelper = new InMemorySatelliteProviderDbHelper()");
+ mDbHelper = new InMemorySatelliteProviderDbHelper();
+ return true;
+ }
+
+ // close mDbHelper database object
+ protected void closeDatabase() {
+ mDbHelper.close();
+ }
+
+ @Override
+ SQLiteDatabase getReadableDatabase() {
+ Log.d(TAG, "getReadableDatabase called" + mDbHelper.getReadableDatabase());
+ return mDbHelper.getReadableDatabase();
+ }
+
+ @Override
+ SQLiteDatabase getWritableDatabase() {
+ Log.d(TAG, "getWritableDatabase called" + mDbHelper.getWritableDatabase());
+ return mDbHelper.getWritableDatabase();
+ }
+
+ public static class InMemorySatelliteProviderDbHelper extends SQLiteOpenHelper {
+
+ public InMemorySatelliteProviderDbHelper() {
+ super(null, // no context is needed for in-memory db
+ null, // db file name is null for in-memory db
+ null, // CursorFactory is null by default
+ 1); // db version is no-op for tests
+ Log.d(TAG, "InMemorySatelliteProviderDbHelper creating in-memory database");
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ //set up the Datagram table
+ Log.d(TAG, "InMemorySatelliteProviderDbHelper onCreate creating the "
+ + "datagram table");
+ db.execSQL(getStringForDatagramTableCreation(Telephony.SatelliteDatagrams.TABLE_NAME));
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ Log.d(TAG, "InMemorySatelliteProviderDbHelper onUpgrade doing nothing");
+ return;
+ }
+ }
+ }
diff --git a/tests/src/com/android/providers/telephony/SmsProviderTest.java b/tests/src/com/android/providers/telephony/SmsProviderTest.java
index 6a225af..37bbb29 100644
--- a/tests/src/com/android/providers/telephony/SmsProviderTest.java
+++ b/tests/src/com/android/providers/telephony/SmsProviderTest.java
@@ -17,9 +17,11 @@
package com.android.providers.telephony;
import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.spy;
import android.app.AppOpsManager;
import android.content.ContentResolver;
@@ -33,13 +35,19 @@
import android.net.Uri;
import android.os.Build;
import android.os.Process;
+import android.os.UserHandle;
import android.provider.Telephony;
+import android.telephony.SmsManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.test.mock.MockContentResolver;
import android.test.mock.MockContext;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
+
+import androidx.test.core.app.ApplicationProvider;
import androidx.test.InstrumentationRegistry;
import junit.framework.TestCase;
@@ -49,6 +57,9 @@
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Tests for testing CRUD operations of SmsProvider.
* Uses a MockContentResolver to test insert
@@ -64,11 +75,12 @@
public class SmsProviderTest extends TestCase {
private static final String TAG = "SmsProviderTest";
- @Mock private Context mContext;
+ private Context mContext;
private MockContentResolver mContentResolver;
private SmsProviderTestable mSmsProviderTestable;
@Mock private PackageManager mPackageManager;
@Mock private Resources mMockResources;
+ @Mock private SubscriptionManager mSubscriptionManager;
private int notifyChangeCount;
@@ -92,6 +104,7 @@
super.setUp();
MockitoAnnotations.initMocks(this);
mSmsProviderTestable = new SmsProviderTestable();
+ mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(eq(Context.APP_OPS_SERVICE)))
.thenReturn(mock(AppOpsManager.class));
@@ -137,6 +150,20 @@
mContentResolver.addProvider("sms", mSmsProviderTestable);
Log.d(TAG, "MockContextWithProvider: Add SmsProvider to mResolver");
notifyChangeCount = 0;
+
+ when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+ List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
+ SubscriptionInfo subscriptionInfo1 = new SubscriptionInfo.Builder()
+ .setId(SmsManager.getDefaultSmsSubscriptionId())
+ .setSimSlotIndex(0)
+ .build();
+ subscriptionInfoList.add(subscriptionInfo1);
+ // Return subscriptions associated with SYSTEM user.
+ doReturn(subscriptionInfoList).when(mSubscriptionManager)
+ .getSubscriptionInfoListAssociatedWithUser(UserHandle.SYSTEM);
+ doReturn(true).when(mSubscriptionManager).isSubscriptionAssociatedWithUser(
+ SubscriptionManager.getDefaultSmsSubscriptionId(),
+ UserHandle.of(UserHandle.USER_SYSTEM));
}
@Override
@@ -150,7 +177,6 @@
public void testInsertUri() {
// insert test contentValues
final ContentValues values = new ContentValues();
- values.put(Telephony.Sms.SUBSCRIPTION_ID, 1);
values.put(Telephony.Sms.ADDRESS, "12345");
values.put(Telephony.Sms.BODY, "test");
values.put(Telephony.Sms.DATE, System.currentTimeMillis()); // milliseconds
diff --git a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
index f6a9c7f..bf0f49b 100644
--- a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
@@ -19,7 +19,6 @@
import static org.junit.Assert.assertArrayEquals;
import android.annotation.TargetApi;
-import android.app.backup.BackupDataOutput;
import android.app.backup.FullBackupDataOutput;
import android.content.ContentProvider;
import android.content.ContentResolver;
@@ -43,6 +42,7 @@
import android.util.JsonWriter;
import android.util.SparseArray;
+import com.android.compatibility.common.util.ShellIdentityUtils;
import com.android.internal.telephony.PhoneFactory;
import libcore.io.IoUtils;
@@ -54,13 +54,11 @@
import org.json.JSONObject;
import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -652,13 +650,21 @@
/**
* Test restore mms with the empty json array "[]".
- * @throws Exception
*/
- public void testRestoreMms_NoMms() throws Exception {
+ public void testRestoreMms_NoMms() {
JsonReader jsonReader = new JsonReader(new StringReader(EMPTY_JSON_ARRAY));
FakeMmsProvider mmsProvider = new FakeMmsProvider(null);
mMockContentResolver.addProvider("mms", mmsProvider);
- mTelephonyBackupAgent.putMmsMessagesToProvider(jsonReader);
+ ShellIdentityUtils.invokeMethodWithShellPermissions(
+ mTelephonyBackupAgent, (agent) -> {
+ try {
+ agent.putMmsMessagesToProvider(jsonReader);
+ } catch (IOException e) {
+ fail("Encountered exception: " + e);
+ }
+ return null;
+ }
+ );
assertEquals(0, mmsProvider.getRowsAdded());
}
@@ -670,7 +676,16 @@
JsonReader jsonReader = new JsonReader(new StringReader(addRandomDataToJson(mAllMmsJson)));
FakeMmsProvider mmsProvider = new FakeMmsProvider(mMmsAllContentValues);
mMockContentResolver.addProvider("mms", mmsProvider);
- mTelephonyBackupAgent.putMmsMessagesToProvider(jsonReader);
+ ShellIdentityUtils.invokeMethodWithShellPermissions(
+ mTelephonyBackupAgent, (agent) -> {
+ try {
+ agent.putMmsMessagesToProvider(jsonReader);
+ } catch (IOException e) {
+ fail("Encountered exception: " + e);
+ }
+ return null;
+ }
+ );
assertEquals(18, mmsProvider.getRowsAdded());
assertEquals(mThreadProvider.mIsThreadArchived, mThreadProvider.mUpdateThreadsArchived);
}
@@ -684,7 +699,16 @@
(new StringReader(addRandomDataToJson(mMmsAllAttachmentJson)));
FakeMmsProvider mmsProvider = new FakeMmsProvider(mMmsAllContentValues);
mMockContentResolver.addProvider("mms", mmsProvider);
- mTelephonyBackupAgent.putMmsMessagesToProvider(jsonReader);
+ ShellIdentityUtils.invokeMethodWithShellPermissions(
+ mTelephonyBackupAgent, (agent) -> {
+ try {
+ agent.putMmsMessagesToProvider(jsonReader);
+ } catch (IOException e) {
+ fail("Encountered exception: " + e);
+ }
+ return null;
+ }
+ );
assertEquals(7, mmsProvider.getRowsAdded());
}
@@ -694,7 +718,16 @@
FakeMmsProvider mmsProvider = new FakeMmsProvider(mMmsNullBodyContentValues);
mMockContentResolver.addProvider("mms", mmsProvider);
- mTelephonyBackupAgent.putMmsMessagesToProvider(jsonReader);
+ ShellIdentityUtils.invokeMethodWithShellPermissions(
+ mTelephonyBackupAgent, (agent) -> {
+ try {
+ agent.putMmsMessagesToProvider(jsonReader);
+ } catch (IOException e) {
+ fail("Encountered exception: " + e);
+ }
+ return null;
+ }
+ );
assertEquals(3, mmsProvider.getRowsAdded());
}
@@ -943,6 +976,8 @@
for (String key : modifiedValues.keySet()) {
assertEquals("Key:"+key, modifiedValues.get(key), values.get(key));
}
+ values.remove(TelephonyBackupAgent.NOTIFY); // notify gets removed before final values
+
assertEquals(modifiedValues.size(), values.size());
return retUri;
}
diff --git a/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java b/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
index 9de138c..26a3a46 100644
--- a/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
@@ -19,12 +19,16 @@
import static android.provider.Telephony.Carriers;
import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
+import android.os.UserHandle;
import android.provider.Telephony;
import android.telephony.SubscriptionManager;
import android.text.TextUtils;
@@ -317,6 +321,40 @@
}
@Test
+ public void databaseHelperOnUpgrade_hasMessageReferenceField() {
+ Log.d(TAG, "databaseHelperOnUpgrade_hasMessageReferenceField");
+ // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+ SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+ mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext));
+
+ // the upgraded db must have
+ // Telephony.SimInfo.COLUMN_TP_MESSAGE_REF
+ Cursor cursor = db.query("siminfo", null, null, null, null, null, null);
+ String[] upgradedColumns = cursor.getColumnNames();
+ Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns));
+
+ assertTrue(Arrays.asList(upgradedColumns).contains(
+ Telephony.SimInfo.COLUMN_TP_MESSAGE_REF));
+ }
+
+ @Test
+ public void databaseHelperOnUpgrade_hasEnabledMobileDataPolicies() {
+ Log.d(TAG, "databaseHelperOnUpgrade_hasEnabledMobileDataPolicies");
+ // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+ SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+ mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext));
+
+ // the upgraded db must have
+ // Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES field
+ Cursor cursor = db.query("siminfo", null, null, null, null, null, null);
+ String[] upgradedColumns = cursor.getColumnNames();
+ Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns));
+
+ assertTrue(Arrays.asList(upgradedColumns).contains(
+ Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES));
+ }
+
+ @Test
public void databaseHelperOnUpgrade_hasLingeringNetworkTypeAlwaysOnMtuFields() {
Log.d(TAG, "databaseHelperOnUpgrade_hasLingeringNetworkTypeAlwaysOnMtuFields");
// (5 << 16 | 6) is the first upgrade trigger in onUpgrade
@@ -351,6 +389,93 @@
Telephony.SimInfo.COLUMN_USAGE_SETTING));
}
+ @Test
+ public void databaseHelperOnUpgrade_hasUserHandleField() {
+ Log.d(TAG, "databaseHelperOnUpgrade_hasUserHandleField");
+ // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+ SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+ mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext));
+
+ // the upgraded db must have
+ // Telephony.SimInfo.COLUMN_USER_HANDLE
+ Cursor cursor = db.query("siminfo", null, null, null, null, null, null);
+ String[] upgradedColumns = cursor.getColumnNames();
+ Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns));
+
+ assertTrue(Arrays.asList(upgradedColumns).contains(
+ Telephony.SimInfo.COLUMN_USER_HANDLE));
+ }
+
+ @Test
+ public void databaseHelperOnUpgrade_hasUserHandleField_updateNullUserHandleValue() {
+ Log.d(TAG, "databaseHelperOnUpgrade_hasUserHandleField_updateNullUserHandleValue");
+ // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+ SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+ // UserHandle column is added in version 59 .
+ mHelper.onUpgrade(db, (4 << 16), 59);
+
+ // The upgraded db must have Telephony.SimInfo.COLUMN_USER_HANDLE.
+ Cursor cursor = db.query("siminfo", null, null, null,
+ null, null, null);
+ String[] upgradedColumns = cursor.getColumnNames();
+ Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns));
+ assertTrue(Arrays.asList(upgradedColumns).contains(Telephony.SimInfo.COLUMN_USER_HANDLE));
+
+ // Insert test contentValues into db.
+ final int insertSubId = 11;
+ ContentValues contentValues = new ContentValues();
+ // Set userHandle=-1
+ contentValues.put(Telephony.SimInfo.COLUMN_USER_HANDLE, -1);
+ contentValues.put(Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID, insertSubId);
+ // Populate NON NULL columns.
+ contentValues.put(Telephony.SimInfo.COLUMN_ICC_ID, "123");
+ contentValues.put(Telephony.SimInfo.COLUMN_DISPLAY_NUMBER_FORMAT, 0);
+ contentValues.put(Telephony.SimInfo.COLUMN_CARD_ID, "123");
+ db.insert("siminfo", null, contentValues);
+
+ // Query UserHandle value from db which should be equal to -1.
+ final String[] testProjection = {Telephony.SimInfo.COLUMN_USER_HANDLE};
+ final String selection = Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID + "=?";
+ String[] selectionArgs = { Integer.toString(insertSubId) };
+ cursor = db.query("siminfo", testProjection, selection, selectionArgs,
+ null, null, null);
+ assertNotNull(cursor);
+ assertEquals(1, cursor.getCount());
+ cursor.moveToFirst();
+ int userHandleVal = cursor.getInt(0);
+ assertEquals(-1, userHandleVal);
+
+ // Upgrade db from version 59 to version 61.
+ mHelper.onUpgrade(db, (59 << 16), 61);
+
+ // Query userHandle value from db which should be equal to UserHandle.USER_NULL(-10000)
+ // after db upgrade.
+ cursor = db.query("siminfo", testProjection, selection, selectionArgs,
+ null, null, null);
+ assertNotNull(cursor);
+ assertEquals(1, cursor.getCount());
+ cursor.moveToFirst();
+ userHandleVal = cursor.getInt(0);
+ assertEquals(UserHandle.USER_NULL, userHandleVal);
+ }
+
+ @Test
+ public void databaseHelperOnUpgrade_hasSatelliteEnabledField() {
+ Log.d(TAG, "databaseHelperOnUpgrade_hasSatelliteEnabledField");
+ // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+ SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+ mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext));
+
+ // the upgraded db must have
+ // Telephony.SimInfo.COLUMN_SATELLITE_ENABLED
+ Cursor cursor = db.query("siminfo", null, null, null, null, null, null);
+ String[] upgradedColumns = cursor.getColumnNames();
+ Log.d(TAG, "siminfo columns: " + Arrays.toString(upgradedColumns));
+
+ assertTrue(Arrays.asList(upgradedColumns).contains(
+ Telephony.SimInfo.COLUMN_SATELLITE_ENABLED));
+ }
+
/**
* Helper for an in memory DB used to test the TelephonyProvider#DatabaseHelper.
*
diff --git a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
index b3892be..de4c6c5 100644
--- a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
@@ -48,7 +48,7 @@
import android.test.suitebuilder.annotation.SmallTest;
import android.text.TextUtils;
import android.util.Log;
-
+import com.android.internal.telephony.LocalLog;
import androidx.test.InstrumentationRegistry;
import junit.framework.TestCase;
@@ -64,7 +64,9 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.lang.reflect.Field;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
import java.util.stream.IntStream;
@@ -216,6 +218,8 @@
arbitraryStringVal);
contentValues.put(Telephony.SimInfo.COLUMN_NR_ADVANCED_CALLING_ENABLED, arbitraryIntVal);
contentValues.put(Telephony.SimInfo.COLUMN_USAGE_SETTING, arbitraryIntVal);
+ contentValues.put(Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES,
+ arbitraryStringVal);
if (isoCountryCode != null) {
contentValues.put(Telephony.SimInfo.COLUMN_ISO_COUNTRY_CODE, isoCountryCode);
}
@@ -358,6 +362,12 @@
notifyChangeRestoreCount = 0;
// Required to access SIMINFO table
mTelephonyProviderTestable.fakeCallingUid(Process.PHONE_UID);
+ // Ignore local log during test
+ Field field = PhoneFactory.class.getDeclaredField("sLocalLogs");
+ field.setAccessible(true);
+ HashMap<String, LocalLog> localLogs = new HashMap<>();
+ localLogs.put("TelephonyProvider", new LocalLog(0));
+ field.set(null, localLogs);
}
private void setUpMockContext(boolean isActiveSubId) {
@@ -424,9 +434,9 @@
};
final String selection = Carriers.NUMERIC + "=?";
String[] selectionArgs = { insertNumeric };
- Log.d(TAG, "testInsertCarriers query projection: " + testProjection
+ Log.d(TAG, "testInsertCarriers query projection: " + Arrays.toString(testProjection)
+ "\ntestInsertCarriers selection: " + selection
- + "\ntestInsertCarriers selectionArgs: " + selectionArgs);
+ + "\ntestInsertCarriers selectionArgs: " + Arrays.toString(selectionArgs));
Cursor cursor = mContentResolver.query(Carriers.CONTENT_URI,
testProjection, selection, selectionArgs, null);
@@ -600,9 +610,9 @@
};
final String selection = Carriers.NUMERIC + "=?";
String[] selectionArgs = { insertNumeric };
- Log.d(TAG, "testInsertCarriers query projection: " + testProjection
+ Log.d(TAG, "testInsertCarriers query projection: " + Arrays.toString(testProjection)
+ "\ntestInsertCarriers selection: " + selection
- + "\ntestInsertCarriers selectionArgs: " + selectionArgs);
+ + "\ntestInsertCarriers selectionArgs: " + Arrays.toString(selectionArgs));
Cursor cursor = mContentResolver.query(uri, testProjection, selection, selectionArgs, null);
// verify that inserted values match results of query
@@ -618,7 +628,7 @@
final String selectionToDelete = Carriers.NUMERIC + "=?";
String[] selectionArgsToDelete = { insertNumeric };
Log.d(TAG, "testInsertCarriers deleting selection: " + selectionToDelete
- + "testInsertCarriers selectionArgs: " + selectionArgs);
+ + "testInsertCarriers selectionArgs: " + Arrays.toString(selectionArgs));
int numRowsDeleted = mContentResolver.delete(uri, selectionToDelete, selectionArgsToDelete);
assertEquals(1, numRowsDeleted);
@@ -655,9 +665,9 @@
};
final String selection = Carriers.NUMERIC + "=?";
String[] selectionArgs = { insertNumeric };
- Log.d(TAG, "testInsertCarriers query projection: " + testProjection
+ Log.d(TAG, "testInsertCarriers query projection: " + Arrays.toString(testProjection)
+ "\ntestInsertCarriers selection: " + selection
- + "\ntestInsertCarriers selectionArgs: " + selectionArgs);
+ + "\ntestInsertCarriers selectionArgs: " + Arrays.toString(selectionArgs));
Cursor cursor = mContentResolver.query(Carriers.CONTENT_URI,
testProjection, selection, selectionArgs, null);
@@ -677,7 +687,7 @@
final String selectionToDelete = Carriers.NUMERIC + "=?";
String[] selectionArgsToDelete = { insertNumeric };
Log.d(TAG, "testInsertCarriers deleting selection: " + selectionToDelete
- + "testInsertCarriers selectionArgs: " + selectionArgs);
+ + "testInsertCarriers selectionArgs: " + Arrays.toString(selectionArgs));
int numRowsDeleted = mContentResolver.delete(Carriers.CONTENT_URI,
selectionToDelete, selectionArgsToDelete);
assertEquals(1, numRowsDeleted);
@@ -706,6 +716,8 @@
final String insertCardId = "exampleCardId";
final int insertProfileClass = SubscriptionManager.PROFILE_CLASS_DEFAULT;
final int insertPortIndex = 1;
+ final int insertUserHandle = 0;
+ final int insertSatelliteEnabled = 1;
contentValues.put(SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID, insertSubId);
contentValues.put(SubscriptionManager.DISPLAY_NAME, insertDisplayName);
contentValues.put(SubscriptionManager.CARRIER_NAME, insertCarrierName);
@@ -713,6 +725,8 @@
contentValues.put(SubscriptionManager.CARD_ID, insertCardId);
contentValues.put(SubscriptionManager.PROFILE_CLASS, insertProfileClass);
contentValues.put(SubscriptionManager.PORT_INDEX, insertPortIndex);
+ contentValues.put(SubscriptionManager.USER_HANDLE, insertUserHandle);
+ contentValues.put(SubscriptionManager.SATELLITE_ENABLED, insertSatelliteEnabled);
Log.d(TAG, "testSimTable Inserting contentValues: " + contentValues);
mContentResolver.insert(SimInfo.CONTENT_URI, contentValues);
@@ -725,11 +739,13 @@
SubscriptionManager.CARD_ID,
SubscriptionManager.PROFILE_CLASS,
SubscriptionManager.PORT_INDEX,
+ SubscriptionManager.USER_HANDLE,
+ SubscriptionManager.SATELLITE_ENABLED,
};
final String selection = SubscriptionManager.DISPLAY_NAME + "=?";
String[] selectionArgs = { insertDisplayName };
Log.d(TAG,"\ntestSimTable selection: " + selection
- + "\ntestSimTable selectionArgs: " + selectionArgs.toString());
+ + "\ntestSimTable selectionArgs: " + Arrays.toString(selectionArgs));
Cursor cursor = mContentResolver.query(SimInfo.CONTENT_URI,
testProjection, selection, selectionArgs, null);
@@ -742,16 +758,20 @@
final String resultCardId = cursor.getString(2);
final int resultProfileClass = cursor.getInt(3);
final int resultPortIndex = cursor.getInt(4);
+ final int resultUserHandle = cursor.getInt(5);
+ final int resultSatelliteEnabled = cursor.getInt(6);
assertEquals(insertSubId, resultSubId);
assertEquals(insertCarrierName, resultCarrierName);
assertEquals(insertCardId, resultCardId);
assertEquals(insertPortIndex, resultPortIndex);
+ assertEquals(insertUserHandle, resultUserHandle);
+ assertEquals(insertSatelliteEnabled, resultSatelliteEnabled);
// delete test content
final String selectionToDelete = SubscriptionManager.DISPLAY_NAME + "=?";
String[] selectionArgsToDelete = { insertDisplayName };
Log.d(TAG, "testSimTable deleting selection: " + selectionToDelete
- + "testSimTable selectionArgs: " + selectionArgs);
+ + "testSimTable selectionArgs: " + Arrays.toString(selectionArgs));
int numRowsDeleted = mContentResolver.delete(SimInfo.CONTENT_URI,
selectionToDelete, selectionArgsToDelete);
assertEquals(1, numRowsDeleted);
@@ -804,6 +824,9 @@
ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
getIntValueFromCursor(
cursor, Telephony.SimInfo.COLUMN_NR_ADVANCED_CALLING_ENABLED));
+ assertEquals(ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1,
+ getStringValueFromCursor(cursor,
+ Telephony.SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES));
assertRestoredSubIdIsRemembered();
}
@@ -990,6 +1013,11 @@
return cursor.getInt(columnIndex);
}
+ private String getStringValueFromCursor(Cursor cursor, String columnName) {
+ int columnIndex = cursor.getColumnIndex(columnName);
+ return cursor.getString(columnIndex);
+ }
+
private int parseIdFromInsertedUri(Uri uri) throws NumberFormatException {
return (uri != null) ? Integer.parseInt(uri.getLastPathSegment()) : -1;
}
@@ -1671,7 +1699,6 @@
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals(otherName, cursor.getString(0));
- PhoneFactory.addLocalLog("TelephonyProvider", 1);
}
/**