Merge "Store selfIdentityUris provided by IMS service." into nyc-mr1-dev
diff --git a/src/java/com/android/internal/telephony/dataconnection/ApnContext.java b/src/java/com/android/internal/telephony/dataconnection/ApnContext.java
index 12c3945..7865bc4 100644
--- a/src/java/com/android/internal/telephony/dataconnection/ApnContext.java
+++ b/src/java/com/android/internal/telephony/dataconnection/ApnContext.java
@@ -450,9 +450,14 @@
         }
     }
 
-    public boolean hasNoRestrictedRequests() {
+    public boolean hasNoRestrictedRequests(boolean excludeDun) {
         synchronized (mRefCountLock) {
             for (NetworkRequest nr : mNetworkRequests) {
+                if (excludeDun &&
+                        nr.networkCapabilities.hasCapability(
+                        NetworkCapabilities.NET_CAPABILITY_DUN)) {
+                    continue;
+                }
                 if (nr.networkCapabilities.hasCapability(
                         NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) == false) {
                     return false;
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
index c1319a4..c7c6ec0 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
@@ -860,7 +860,7 @@
         // first, if we have no restricted requests, this override can stay FALSE:
         boolean noRestrictedRequests = true;
         for (ApnContext apnContext : mApnContexts.keySet()) {
-            noRestrictedRequests &= apnContext.hasNoRestrictedRequests();
+            noRestrictedRequests &= apnContext.hasNoRestrictedRequests(true /* exclude DUN */);
         }
         if (noRestrictedRequests) {
             return;
@@ -948,6 +948,8 @@
         }
         if (mRestrictedNetworkOverride) {
             result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+            // don't use dun on restriction-overriden networks.
+            result.removeCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
         }
 
         int up = 14;
@@ -2055,7 +2057,8 @@
                 + " mLastFailCause=" + mLastFailCause
                 + " mTag=" + mTag
                 + " mLinkProperties=" + mLinkProperties
-                + " linkCapabilities=" + makeNetworkCapabilities();
+                + " linkCapabilities=" + makeNetworkCapabilities()
+                + " mRestrictedNetworkOverride=" + mRestrictedNetworkOverride;
     }
 
     @Override
diff --git a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
index 25b82ef..11e8cc1 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
@@ -1514,10 +1514,12 @@
         // request for the network.
         // TODO - may want restricted requests to only apply to carrier-limited data access
         //        rather than applying to user limited as well.
+        // Exclude DUN for the purposes of the override until we get finer grained
+        // intention in NetworkRequests
         boolean checkUserDataEnabled =
                 ApnSetting.isMeteredApnType(apnContext.getApnType(), mPhone.getContext(),
                         mPhone.getSubId(), mPhone.getServiceState().getDataRoaming()) &&
-                apnContext.hasNoRestrictedRequests();
+                apnContext.hasNoRestrictedRequests(true /*exclude DUN */);
 
         DataAllowFailReason failureReason = new DataAllowFailReason();