Merge "Import translations. DO NOT MERGE" into klp-dev
diff --git a/api/current.txt b/api/current.txt
index ed0d154..81aec5e 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -14109,7 +14109,7 @@
     method public int getUid();
   }
 
-  public deprecated class DhcpInfo implements android.os.Parcelable {
+  public class DhcpInfo implements android.os.Parcelable {
     ctor public DhcpInfo();
     method public int describeContents();
     method public void writeToParcel(android.os.Parcel, int);
@@ -15021,7 +15021,7 @@
     method public boolean enableNetwork(int, boolean);
     method public java.util.List<android.net.wifi.WifiConfiguration> getConfiguredNetworks();
     method public android.net.wifi.WifiInfo getConnectionInfo();
-    method public deprecated android.net.DhcpInfo getDhcpInfo();
+    method public android.net.DhcpInfo getDhcpInfo();
     method public java.util.List<android.net.wifi.ScanResult> getScanResults();
     method public int getWifiState();
     method public boolean isScanAlwaysAvailable();
diff --git a/core/java/android/net/DhcpInfo.java b/core/java/android/net/DhcpInfo.java
index ab4cd9b..3bede5d 100644
--- a/core/java/android/net/DhcpInfo.java
+++ b/core/java/android/net/DhcpInfo.java
@@ -22,7 +22,6 @@
 
 /**
  * A simple object for retrieving the results of a DHCP request.
- * @deprecated - use LinkProperties - To be removed 11/2014
  */
 public class DhcpInfo implements Parcelable {
     public int ipAddress;
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index f005f5f..59b559e 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -2794,7 +2794,7 @@
             }
             mNumDnsEntries = last;
         } catch (Exception e) {
-            if (DBG) loge("exception setting default dns interface: " + e);
+            loge("exception setting default dns interface: " + e);
         }
     }
 
@@ -3779,31 +3779,33 @@
             }
         }
 
-        public void addUserForwarding(String interfaze, int uid) {
+        public void addUserForwarding(String interfaze, int uid, boolean forwardDns) {
             int uidStart = uid * UserHandle.PER_USER_RANGE;
             int uidEnd = uidStart + UserHandle.PER_USER_RANGE - 1;
-            addUidForwarding(interfaze, uidStart, uidEnd);
+            addUidForwarding(interfaze, uidStart, uidEnd, forwardDns);
         }
 
-        public void clearUserForwarding(String interfaze, int uid) {
+        public void clearUserForwarding(String interfaze, int uid, boolean forwardDns) {
             int uidStart = uid * UserHandle.PER_USER_RANGE;
             int uidEnd = uidStart + UserHandle.PER_USER_RANGE - 1;
-            clearUidForwarding(interfaze, uidStart, uidEnd);
+            clearUidForwarding(interfaze, uidStart, uidEnd, forwardDns);
         }
 
-        public void addUidForwarding(String interfaze, int uidStart, int uidEnd) {
+        public void addUidForwarding(String interfaze, int uidStart, int uidEnd,
+                boolean forwardDns) {
             try {
                 mNetd.setUidRangeRoute(interfaze,uidStart, uidEnd);
-                mNetd.setDnsInterfaceForUidRange(interfaze, uidStart, uidEnd);
+                if (forwardDns) mNetd.setDnsInterfaceForUidRange(interfaze, uidStart, uidEnd);
             } catch (RemoteException e) {
             }
 
         }
 
-        public void clearUidForwarding(String interfaze, int uidStart, int uidEnd) {
+        public void clearUidForwarding(String interfaze, int uidStart, int uidEnd,
+                boolean forwardDns) {
             try {
                 mNetd.clearUidRangeRoute(interfaze, uidStart, uidEnd);
-                mNetd.clearDnsInterfaceForUidRange(uidStart, uidEnd);
+                if (forwardDns) mNetd.clearDnsInterfaceForUidRange(uidStart, uidEnd);
             } catch (RemoteException e) {
             }
 
diff --git a/services/java/com/android/server/am/BroadcastQueue.java b/services/java/com/android/server/am/BroadcastQueue.java
index b2e3ce7..1d6970f 100644
--- a/services/java/com/android/server/am/BroadcastQueue.java
+++ b/services/java/com/android/server/am/BroadcastQueue.java
@@ -470,6 +470,12 @@
                     r.callingPid, r.resolvedType, filter.receiverList.uid);
         }
 
+        if (filter.receiverList.app == null || filter.receiverList.app.crashing) {
+            Slog.w(TAG, "Skipping deliver [" + mQueueName + "] " + r
+                    + " to " + filter.receiverList + ": process crashing");
+            skip = true;
+        }
+
         if (!skip) {
             // If this is not being sent as an ordered broadcast, then we
             // don't want to touch the fields that keep track of the current
@@ -565,8 +571,8 @@
 
                 boolean isDead;
                 synchronized (mService.mPidsSelfLocked) {
-                    isDead = (mService.mPidsSelfLocked.get(
-                            mPendingBroadcast.curApp.pid) == null);
+                    ProcessRecord proc = mService.mPidsSelfLocked.get(mPendingBroadcast.curApp.pid);
+                    isDead = proc == null || proc.crashing;
                 }
                 if (!isDead) {
                     // It's still alive, so keep waiting
@@ -650,7 +656,7 @@
                                 new Intent(r.intent), r.resultCode,
                                 r.resultData, r.resultExtras, false, false, r.userId);
                             // Set this to null so that the reference
-                            // (local and remote) isnt kept in the mBroadcastHistory.
+                            // (local and remote) isn't kept in the mBroadcastHistory.
                             r.resultTo = null;
                         } catch (RemoteException e) {
                             Slog.w(TAG, "Failure ["
@@ -803,10 +809,8 @@
             }
             if (r.curApp != null && r.curApp.crashing) {
                 // If the target process is crashing, just skip it.
-                if (DEBUG_BROADCAST)  Slog.v(TAG,
-                        "Skipping deliver ordered ["
-                        + mQueueName + "] " + r + " to " + r.curApp
-                        + ": process crashing");
+                Slog.w(TAG, "Skipping deliver ordered [" + mQueueName + "] " + r
+                        + " to " + r.curApp + ": process crashing");
                 skip = true;
             }
 
diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java
index 4b62e7d..486e916 100644
--- a/services/java/com/android/server/am/ProcessRecord.java
+++ b/services/java/com/android/server/am/ProcessRecord.java
@@ -98,7 +98,7 @@
     boolean bad;                // True if disabled in the bad process list
     boolean killedByAm;         // True when proc has been killed by activity manager, not for RAM
     boolean procStateChanged;   // Keep track of whether we changed 'setAdj'.
-    String waitingToKill;       // Process is waiting to be killed when in the bg; reason
+    String waitingToKill;       // Process is waiting to be killed when in the bg, and reason
     IBinder forcingToForeground;// Token that is forcing this process to be foreground
     int adjSeq;                 // Sequence id for identifying oom_adj assignment cycles
     int lruSeq;                 // Sequence id for identifying LRU update cycles
diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java
index 45797b2..f5a7039 100644
--- a/services/java/com/android/server/connectivity/Vpn.java
+++ b/services/java/com/android/server/connectivity/Vpn.java
@@ -242,9 +242,11 @@
             try {
                 mCallback.restore();
                 final int size = mVpnUsers.size();
+                final boolean forwardDns = (mConfig.dnsServers != null &&
+                        mConfig.dnsServers.size() != 0);
                 for (int i = 0; i < size; i++) {
                     int user = mVpnUsers.keyAt(i);
-                    mCallback.clearUserForwarding(mInterface, user);
+                    mCallback.clearUserForwarding(mInterface, user, forwardDns);
                     hideNotification(user);
                 }
 
@@ -443,8 +445,12 @@
         if (!isRunningLocked()) {
             throw new IllegalStateException("VPN is not active");
         }
+
+        final boolean forwardDns = (mConfig.dnsServers != null &&
+                mConfig.dnsServers.size() != 0);
+
         // add the user
-        mCallback.addUserForwarding(mInterface, user);
+        mCallback.addUserForwarding(mInterface, user, forwardDns);
         mVpnUsers.put(user, true);
 
         // show the notification
@@ -484,7 +490,9 @@
             if (!isRunningLocked()) {
                 throw new IllegalStateException("VPN is not active");
             }
-            mCallback.clearUserForwarding(mInterface, user);
+            final boolean forwardDns = (mConfig.dnsServers != null &&
+                    mConfig.dnsServers.size() != 0);
+            mCallback.clearUserForwarding(mInterface, user, forwardDns);
             mVpnUsers.delete(user);
             hideNotification(user);
     }
@@ -553,9 +561,11 @@
                     final long token = Binder.clearCallingIdentity();
                     try {
                         final int size = mVpnUsers.size();
+                        final boolean forwardDns = (mConfig.dnsServers != null &&
+                                mConfig.dnsServers.size() != 0);
                         for (int i = 0; i < size; i++) {
                             int user = mVpnUsers.keyAt(i);
-                            mCallback.clearUserForwarding(mInterface, user);
+                            mCallback.clearUserForwarding(mInterface, user, forwardDns);
                             hideNotification(user);
                         }
                         mVpnUsers = null;
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index b7594ee1..7fc8bef 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -988,7 +988,6 @@
      * Return the DHCP-assigned addresses from the last successful DHCP request,
      * if any.
      * @return the DHCP information
-     * @deprecated - use ConnectivityManager.getLinkProperties instead.  TODO - remove 11/2013
      */
     public DhcpInfo getDhcpInfo() {
         try {