10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2009 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkapackage com.android.internal.telephony.uicc; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.File; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileNotFoundException; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileReader; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.IOException; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.HashMap; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport org.xmlpull.v1.XmlPullParser; 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport org.xmlpull.v1.XmlPullParserException; 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Environment; 29ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Xml; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.XmlUtils; 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class SpnOverride { 3522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville private HashMap<String, String> mCarrierSpnMap; 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 38cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville static final String LOG_TAG = "SpnOverride"; 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final String PARTNER_SPN_OVERRIDE_PATH ="etc/spn-conf.xml"; 401aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu static final String OEM_SPN_OVERRIDE_PATH = "telephony/spn-conf.xml"; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 428e4af4a6c1d5f697b9c548e827e047248c12d788Sanket Padawe SpnOverride () { 4322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCarrierSpnMap = new HashMap<String, String>(); 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville loadSpnOverrides(); 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 478e4af4a6c1d5f697b9c548e827e047248c12d788Sanket Padawe boolean containsCarrier(String carrier) { 4822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCarrierSpnMap.containsKey(carrier); 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 518e4af4a6c1d5f697b9c548e827e047248c12d788Sanket Padawe String getSpn(String carrier) { 5222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCarrierSpnMap.get(carrier); 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void loadSpnOverrides() { 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville FileReader spnReader; 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 581aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu File spnFile = new File(Environment.getRootDirectory(), 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville PARTNER_SPN_OVERRIDE_PATH); 601aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu File oemSpnFile = new File(Environment.getOemDirectory(), 611aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu OEM_SPN_OVERRIDE_PATH); 621aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu 631aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu if (oemSpnFile.exists()) { 641aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu // OEM image exist SPN xml, get the timestamp from OEM & System image for comparison. 651aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu long oemSpnTime = oemSpnFile.lastModified(); 661aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu long sysSpnTime = spnFile.lastModified(); 671aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu Rlog.d(LOG_TAG, "SPN Timestamp: oemTime = " + oemSpnTime + " sysTime = " + sysSpnTime); 681aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu 691aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu // To get the newer version of SPN from OEM image 701aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu if (oemSpnTime > sysSpnTime) { 711aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu Rlog.d(LOG_TAG, "SPN in OEM image is newer than System image"); 721aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu spnFile = oemSpnFile; 731aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu } 741aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu } else { 751aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu // No SPN in OEM image, so load it from system image. 761aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu Rlog.d(LOG_TAG, "No SPN in OEM image = " + oemSpnFile.getPath() + 771aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu " Load SPN from system image"); 781aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu } 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville spnReader = new FileReader(spnFile); 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (FileNotFoundException e) { 831aabb5ca0a162ab510ed0dfcf4c51b4bde7e1b3cLegler Wu Rlog.w(LOG_TAG, "Can not open " + spnFile.getAbsolutePath()); 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville XmlPullParser parser = Xml.newPullParser(); 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville parser.setInput(spnReader); 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville XmlUtils.beginDocument(parser, "spnOverrides"); 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville while (true) { 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville XmlUtils.nextElement(parser); 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String name = parser.getName(); 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!"spnOverride".equals(name)) { 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String numeric = parser.getAttributeValue(null, "numeric"); 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String data = parser.getAttributeValue(null, "spn"); 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCarrierSpnMap.put(numeric, data); 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1066bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville spnReader.close(); 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (XmlPullParserException e) { 108ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "Exception in spn-conf parser " + e); 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (IOException e) { 110ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "Exception in spn-conf parser " + e); 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 115