diff options
author | Robert Greenwalt <rgreenwalt@google.com> | 2013-07-16 12:06:09 -0700 |
---|---|---|
committer | Robert Greenwalt <rgreenwalt@google.com> | 2013-07-17 14:05:33 -0700 |
commit | e182bfe398a132236f723a76522bacd4d6d4c0a4 (patch) | |
tree | 4d47da96206bda3578773e197f4640d8fb759ce1 /services/java | |
parent | c0f5bb70b72c25c0057d2318bbcc8d79553d1e12 (diff) | |
download | frameworks_base-e182bfe398a132236f723a76522bacd4d6d4c0a4.zip frameworks_base-e182bfe398a132236f723a76522bacd4d6d4c0a4.tar.gz frameworks_base-e182bfe398a132236f723a76522bacd4d6d4c0a4.tar.bz2 |
Add gservices updater for carrier provisioning url
bug:9623159
Change-Id: I36697ed341353b7a3dbec5afe20241102e76f6f1
Diffstat (limited to 'services/java')
-rw-r--r-- | services/java/com/android/server/ConnectivityService.java | 126 | ||||
-rw-r--r-- | services/java/com/android/server/updates/CarrierProvisioningUrlsInstallReceiver.java | 24 |
2 files changed, 143 insertions, 7 deletions
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 29c546e..8d58858 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -42,6 +42,7 @@ import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.content.res.Configuration; import android.content.res.Resources; import android.database.ContentObserver; import android.net.CaptivePortalTracker; @@ -97,6 +98,7 @@ import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Slog; import android.util.SparseIntArray; +import android.util.Xml; import com.android.internal.R; import com.android.internal.net.LegacyVpnInfo; @@ -106,6 +108,7 @@ import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.util.IndentingPrintWriter; +import com.android.internal.util.XmlUtils; import com.android.server.am.BatteryStatsService; import com.android.server.connectivity.Nat464Xlat; import com.android.server.connectivity.Tethering; @@ -117,7 +120,13 @@ import com.google.android.collect.Sets; import dalvik.system.DexClassLoader; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.File; import java.io.FileDescriptor; +import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Constructor; @@ -3584,10 +3593,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { } case ConnectivityManager.CMP_RESULT_CODE_REDIRECTED: { log("CheckMp.onComplete: warm sim"); - String url = getProvisioningUrl(); + String url = getMobileProvisioningUrl(); if (TextUtils.isEmpty(url)) { - url = mContext.getResources() - .getString(R.string.mobile_redirected_provisioning_url); + url = getMobileRedirectedProvisioningUrl(); } if (TextUtils.isEmpty(url) == false) { log("CheckMp.onComplete: warm sim (redirected), url=" + url); @@ -3599,7 +3607,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } case ConnectivityManager.CMP_RESULT_CODE_NO_DNS: case ConnectivityManager.CMP_RESULT_CODE_NO_TCP_CONNECTION: { - String url = getProvisioningUrl(); + String url = getMobileProvisioningUrl(); if (TextUtils.isEmpty(url) == false) { log("CheckMp.onComplete: warm sim (no dns/tcp), url=" + url); setNotificationVisible(true, ni, url); @@ -3973,10 +3981,114 @@ public class ConnectivityService extends IConnectivityManager.Stub { log("setNotificationVisible: X visible=" + visible + " ni=" + networkInfo + " url=" + url); } - private String getProvisioningUrl() { - String url = mContext.getResources().getString(R.string.mobile_provisioning_url); - log("getProvisioningUrl: mobile_provisioning_url=" + url); + /** Location to an updatable file listing carrier provisioning urls. + * An example: + * + * <?xml version="1.0" encoding="utf-8"?> + * <provisioningUrls> + * <provisioningUrl mcc="310" mnc="4">http://myserver.com/foo?mdn=%3$s&iccid=%1$s&imei=%2$s</provisioningUrl> + * <redirectedUrl mcc="310" mnc="4">http://www.google.com</redirectedUrl> + * </provisioningUrls> + */ + private static final String PROVISIONING_URL_PATH = + "/data/misc/radio/provisioning_urls.xml"; + private final File mProvisioningUrlFile = new File(PROVISIONING_URL_PATH); + + /** XML tag for root element. */ + private static final String TAG_PROVISIONING_URLS = "provisioningUrls"; + /** XML tag for individual url */ + private static final String TAG_PROVISIONING_URL = "provisioningUrl"; + /** XML tag for redirected url */ + private static final String TAG_REDIRECTED_URL = "redirectedUrl"; + /** XML attribute for mcc */ + private static final String ATTR_MCC = "mcc"; + /** XML attribute for mnc */ + private static final String ATTR_MNC = "mnc"; + + private static final int REDIRECTED_PROVISIONING = 1; + private static final int PROVISIONING = 2; + + private String getProvisioningUrlBaseFromFile(int type) { + FileReader fileReader = null; + XmlPullParser parser = null; + Configuration config = mContext.getResources().getConfiguration(); + String tagType; + + switch (type) { + case PROVISIONING: + tagType = TAG_PROVISIONING_URL; + break; + case REDIRECTED_PROVISIONING: + tagType = TAG_REDIRECTED_URL; + break; + default: + throw new RuntimeException("getProvisioningUrlBaseFromFile: Unexpected parameter " + + type); + } + + try { + fileReader = new FileReader(mProvisioningUrlFile); + parser = Xml.newPullParser(); + parser.setInput(fileReader); + XmlUtils.beginDocument(parser, TAG_PROVISIONING_URLS); + + while (true) { + XmlUtils.nextElement(parser); + + String element = parser.getName(); + if (element == null) break; + if (element.equals(tagType)) { + String mcc = parser.getAttributeValue(null, ATTR_MCC); + try { + if (mcc != null && Integer.parseInt(mcc) == config.mcc) { + String mnc = parser.getAttributeValue(null, ATTR_MNC); + if (mnc != null && Integer.parseInt(mnc) == config.mnc) { + parser.next(); + if (parser.getEventType() == XmlPullParser.TEXT) { + return parser.getText(); + } + } + } + } catch (NumberFormatException e) { + loge("NumberFormatException in getProvisioningUrlBaseFromFile: " + e); + } + } + } + return null; + } catch (FileNotFoundException e) { + loge("Carrier Provisioning Urls file not found"); + } catch (XmlPullParserException e) { + loge("Xml parser exception reading Carrier Provisioning Urls file: " + e); + } catch (IOException e) { + loge("I/O exception reading Carrier Provisioning Urls file: " + e); + } finally { + if (fileReader != null) { + try { + fileReader.close(); + } catch (IOException e) {} + } + } + return null; + } + + private String getMobileRedirectedProvisioningUrl() { + String url = getProvisioningUrlBaseFromFile(REDIRECTED_PROVISIONING); + if (TextUtils.isEmpty(url)) { + url = mContext.getResources().getString(R.string.mobile_redirected_provisioning_url); + } + return url; + } + + public String getMobileProvisioningUrl() { + enforceConnectivityInternalPermission(); + String url = getProvisioningUrlBaseFromFile(PROVISIONING); + if (TextUtils.isEmpty(url)) { + url = mContext.getResources().getString(R.string.mobile_provisioning_url); + log("getProvisioningUrl: mobile_provisioining_url from resource =" + url); + } else { + log("getProvisioningUrl: mobile_provisioning_url from File =" + url); + } // populate the iccid, imei and phone number in the provisioning url. if (!TextUtils.isEmpty(url)) { String phoneNumber = mTelephonyManager.getLine1Number(); diff --git a/services/java/com/android/server/updates/CarrierProvisioningUrlsInstallReceiver.java b/services/java/com/android/server/updates/CarrierProvisioningUrlsInstallReceiver.java new file mode 100644 index 0000000..b53fb65 --- /dev/null +++ b/services/java/com/android/server/updates/CarrierProvisioningUrlsInstallReceiver.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2012 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.server.updates; + +public class CarrierProvisioningUrlsInstallReceiver extends ConfigUpdateInstallReceiver { + + public CarrierProvisioningUrlsInstallReceiver() { + super("/data/misc/radio/", "provisioning_urls.xml", "metadata/", "version"); + } +} |