1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.internal.telephony.uicc; 18 19 import android.os.Environment; 20 import android.telephony.Rlog; 21 import android.util.Xml; 22 23 import com.android.internal.util.XmlUtils; 24 25 import org.xmlpull.v1.XmlPullParser; 26 import org.xmlpull.v1.XmlPullParserException; 27 28 import java.io.File; 29 import java.io.FileNotFoundException; 30 import java.io.FileReader; 31 import java.io.IOException; 32 import java.util.HashMap; 33 34 /** 35 * Provide a machanism to override MVNO paramteres under CarrierConfig through a config file. 36 */ 37 public class CarrierTestOverride { 38 static final String LOG_TAG = "CarrierTestOverride"; 39 40 /** 41 * Config file that can be created and adb-pushed by tester/developer 42 * 43 * Sample xml: 44 * <carrierTestOverrides> 45 <carrierTestOverride key="isInTestMode" value="true"/> 46 <carrierTestOverride key="mccmnc" value="310010" /> 47 <carrierTestOverride key="gid1" value="bae0000000000000"/> 48 <carrierTestOverride key="gid2" value="ffffffffffffffff"/> 49 <carrierTestOverride key="imsi" value="310010123456789"/> 50 <carrierTestOverride key="spn" value="Verizon"/> 51 <carrierTestOverride key="pnn" value="Verizon network"/> 52 <carrierTestOverride key="iccid" value="123456789012345678901"/> 53 </carrierTestOverrides> 54 */ 55 static final String DATA_CARRIER_TEST_OVERRIDE_PATH = 56 "/user_de/0/com.android.phone/files/carrier_test_conf.xml"; 57 static final String CARRIER_TEST_XML_HEADER = "carrierTestOverrides"; 58 static final String CARRIER_TEST_XML_SUBHEADER = "carrierTestOverride"; 59 static final String CARRIER_TEST_XML_ITEM_KEY = "key"; 60 static final String CARRIER_TEST_XML_ITEM_VALUE = "value"; 61 static final String CARRIER_TEST_XML_ITEM_KEY_STRING_ISINTESTMODE = "isInTestMode"; 62 static final String CARRIER_TEST_XML_ITEM_KEY_STRING_MCCMNC = "mccmnc"; 63 static final String CARRIER_TEST_XML_ITEM_KEY_STRING_GID1 = "gid1"; 64 static final String CARRIER_TEST_XML_ITEM_KEY_STRING_GID2 = "gid2"; 65 static final String CARRIER_TEST_XML_ITEM_KEY_STRING_IMSI = "imsi"; 66 static final String CARRIER_TEST_XML_ITEM_KEY_STRING_SPN = "spn"; 67 static final String CARRIER_TEST_XML_ITEM_KEY_STRING_PNN = "pnn"; 68 static final String CARRIER_TEST_XML_ITEM_KEY_STRING_ICCID = "iccid"; 69 70 private HashMap<String, String> mCarrierTestParamMap; 71 72 CarrierTestOverride() { 73 mCarrierTestParamMap = new HashMap<String, String>(); 74 loadCarrierTestOverrides(); 75 } 76 77 boolean isInTestMode() { 78 return mCarrierTestParamMap.containsKey(CARRIER_TEST_XML_ITEM_KEY_STRING_ISINTESTMODE) 79 && mCarrierTestParamMap.get(CARRIER_TEST_XML_ITEM_KEY_STRING_ISINTESTMODE) 80 .equals("true"); 81 } 82 83 String getFakeSpn() { 84 try { 85 String spn = mCarrierTestParamMap.get(CARRIER_TEST_XML_ITEM_KEY_STRING_SPN); 86 Rlog.d(LOG_TAG, "reading spn from CarrierTestConfig file: " + spn); 87 return spn; 88 } catch (NullPointerException e) { 89 Rlog.w(LOG_TAG, "No spn in CarrierTestConfig file "); 90 return null; 91 } 92 } 93 94 String getFakeIMSI() { 95 try { 96 String imsi = mCarrierTestParamMap.get(CARRIER_TEST_XML_ITEM_KEY_STRING_IMSI); 97 Rlog.d(LOG_TAG, "reading imsi from CarrierTestConfig file: " + imsi); 98 return imsi; 99 } catch (NullPointerException e) { 100 Rlog.w(LOG_TAG, "No imsi in CarrierTestConfig file "); 101 return null; 102 } 103 } 104 105 String getFakeGid1() { 106 try { 107 String gid1 = mCarrierTestParamMap.get(CARRIER_TEST_XML_ITEM_KEY_STRING_GID1); 108 Rlog.d(LOG_TAG, "reading gid1 from CarrierTestConfig file: " + gid1); 109 return gid1; 110 } catch (NullPointerException e) { 111 Rlog.w(LOG_TAG, "No gid1 in CarrierTestConfig file "); 112 return null; 113 } 114 } 115 116 String getFakeGid2() { 117 try { 118 String gid2 = mCarrierTestParamMap.get(CARRIER_TEST_XML_ITEM_KEY_STRING_GID2); 119 Rlog.d(LOG_TAG, "reading gid2 from CarrierTestConfig file: " + gid2); 120 return gid2; 121 } catch (NullPointerException e) { 122 Rlog.w(LOG_TAG, "No gid2 in CarrierTestConfig file "); 123 return null; 124 } 125 } 126 127 String getFakePnnHomeName() { 128 try { 129 String pnn = mCarrierTestParamMap.get(CARRIER_TEST_XML_ITEM_KEY_STRING_PNN); 130 Rlog.d(LOG_TAG, "reading pnn from CarrierTestConfig file: " + pnn); 131 return pnn; 132 } catch (NullPointerException e) { 133 Rlog.w(LOG_TAG, "No pnn in CarrierTestConfig file "); 134 return null; 135 } 136 } 137 138 String getFakeIccid() { 139 try { 140 String iccid = mCarrierTestParamMap.get(CARRIER_TEST_XML_ITEM_KEY_STRING_ICCID); 141 Rlog.d(LOG_TAG, "reading iccid from CarrierTestConfig file: " + iccid); 142 return iccid; 143 } catch (NullPointerException e) { 144 Rlog.w(LOG_TAG, "No iccid in CarrierTestConfig file "); 145 return null; 146 } 147 } 148 149 String getFakeMccMnc() { 150 try { 151 String mccmnc = mCarrierTestParamMap.get(CARRIER_TEST_XML_ITEM_KEY_STRING_MCCMNC); 152 Rlog.d(LOG_TAG, "reading mccmnc from CarrierTestConfig file: " + mccmnc); 153 return mccmnc; 154 } catch (NullPointerException e) { 155 Rlog.w(LOG_TAG, "No mccmnc in CarrierTestConfig file "); 156 return null; 157 } 158 } 159 160 void override(String mccmnc, String imsi, String iccid, String gid1, String gid2, String pnn, 161 String spn) { 162 mCarrierTestParamMap.put(CARRIER_TEST_XML_ITEM_KEY_STRING_ISINTESTMODE, "true"); 163 mCarrierTestParamMap.put(CARRIER_TEST_XML_ITEM_KEY_STRING_MCCMNC, mccmnc); 164 mCarrierTestParamMap.put(CARRIER_TEST_XML_ITEM_KEY_STRING_IMSI, imsi); 165 mCarrierTestParamMap.put(CARRIER_TEST_XML_ITEM_KEY_STRING_ICCID, iccid); 166 mCarrierTestParamMap.put(CARRIER_TEST_XML_ITEM_KEY_STRING_GID1, gid1); 167 mCarrierTestParamMap.put(CARRIER_TEST_XML_ITEM_KEY_STRING_GID2, gid2); 168 mCarrierTestParamMap.put(CARRIER_TEST_XML_ITEM_KEY_STRING_PNN, pnn); 169 mCarrierTestParamMap.put(CARRIER_TEST_XML_ITEM_KEY_STRING_SPN, spn); 170 } 171 172 private void loadCarrierTestOverrides() { 173 174 FileReader carrierTestConfigReader; 175 176 File carrierTestConfigFile = new File(Environment.getDataDirectory(), 177 DATA_CARRIER_TEST_OVERRIDE_PATH); 178 179 try { 180 carrierTestConfigReader = new FileReader(carrierTestConfigFile); 181 Rlog.d(LOG_TAG, "CarrierTestConfig file Modified Timestamp: " 182 + carrierTestConfigFile.lastModified()); 183 } catch (FileNotFoundException e) { 184 Rlog.w(LOG_TAG, "Can not open " + carrierTestConfigFile.getAbsolutePath()); 185 return; 186 } 187 188 try { 189 XmlPullParser parser = Xml.newPullParser(); 190 parser.setInput(carrierTestConfigReader); 191 192 XmlUtils.beginDocument(parser, CARRIER_TEST_XML_HEADER); 193 194 while (true) { 195 XmlUtils.nextElement(parser); 196 197 String name = parser.getName(); 198 if (!CARRIER_TEST_XML_SUBHEADER.equals(name)) { 199 break; 200 } 201 202 String key = parser.getAttributeValue(null, CARRIER_TEST_XML_ITEM_KEY); 203 String value = parser.getAttributeValue(null, CARRIER_TEST_XML_ITEM_VALUE); 204 205 Rlog.d(LOG_TAG, 206 "extracting key-values from CarrierTestConfig file: " + key + "|" + value); 207 mCarrierTestParamMap.put(key, value); 208 } 209 carrierTestConfigReader.close(); 210 } catch (XmlPullParserException e) { 211 Rlog.w(LOG_TAG, "Exception in carrier_test_conf parser " + e); 212 } catch (IOException e) { 213 Rlog.w(LOG_TAG, "Exception in carrier_test_conf parser " + e); 214 } 215 } 216 } 217