Merge "Import translations. DO NOT MERGE"
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index 9c9719f..06b6ee7 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -43,6 +43,7 @@
 import java.net.InetAddress;
 import java.net.NetworkInterface;
 import java.net.SocketException;
+import java.util.Objects;
 
 
 /**
@@ -113,10 +114,9 @@
     private static final int CMD_STOP = 1;
     private static final int CMD_START = 2;
     private static final int CMD_CONFIRM = 3;
-    private static final int CMD_UPDATE_DHCPV4_RESULTS = 4;
-    private static final int EVENT_PRE_DHCP_ACTION_COMPLETE = 5;
+    private static final int EVENT_PRE_DHCP_ACTION_COMPLETE = 4;
     // Sent by NetlinkTracker to communicate netlink events.
-    private static final int EVENT_NETLINK_LINKPROPERTIES_CHANGED = 6;
+    private static final int EVENT_NETLINK_LINKPROPERTIES_CHANGED = 5;
 
     private static final int MAX_LOG_RECORDS = 1000;
 
@@ -285,6 +285,12 @@
         return delta;
     }
 
+    private boolean linkPropertiesUnchanged(LinkProperties newLp) {
+        synchronized (mLock) {
+            return Objects.equals(newLp, mLinkProperties);
+        }
+    }
+
     private LinkProperties assembleLinkProperties() {
         // [1] Create a new LinkProperties object to populate.
         LinkProperties newLp = new LinkProperties();
@@ -343,6 +349,19 @@
         }
     }
 
+    private void handleIPv4Success(DhcpResults dhcpResults) {
+        mDhcpResults = new DhcpResults(dhcpResults);
+        setLinkProperties(assembleLinkProperties());
+        mCallback.onIPv4ProvisioningSuccess(dhcpResults);
+    }
+
+    private void handleIPv4Failure() {
+        clearIPv4Address();
+        mDhcpResults = null;
+        setLinkProperties(assembleLinkProperties());
+        mCallback.onIPv4ProvisioningFailure();
+    }
+
     class StoppedState extends State {
         @Override
         public void enter() {
@@ -418,9 +437,9 @@
             // handle the result accordingly.
             if (mStaticIpConfig != null) {
                 if (applyStaticIpConfig()) {
-                    sendMessage(CMD_UPDATE_DHCPV4_RESULTS, new DhcpResults(mStaticIpConfig));
+                    handleIPv4Success(new DhcpResults(mStaticIpConfig));
                 } else {
-                    sendMessage(CMD_UPDATE_DHCPV4_RESULTS);
+                    handleIPv4Failure();
                 }
             } else {
                 // Start DHCPv4.
@@ -465,21 +484,6 @@
                     }
                     break;
 
-                case CMD_UPDATE_DHCPV4_RESULTS: {
-                    final DhcpResults dhcpResults = (DhcpResults) msg.obj;
-                    if (dhcpResults != null) {
-                        mDhcpResults = new DhcpResults(dhcpResults);
-                        setLinkProperties(assembleLinkProperties());
-                        mCallback.onIPv4ProvisioningSuccess(dhcpResults);
-                    } else {
-                        clearIPv4Address();
-                        mDhcpResults = null;
-                        setLinkProperties(assembleLinkProperties());
-                        mCallback.onIPv4ProvisioningFailure();
-                    }
-                    break;
-                }
-
                 case EVENT_PRE_DHCP_ACTION_COMPLETE:
                     // It's possible to reach here if, for example, someone
                     // calls completedPreDhcpAction() after provisioning with
@@ -492,6 +496,9 @@
 
                 case EVENT_NETLINK_LINKPROPERTIES_CHANGED: {
                     final LinkProperties newLp = assembleLinkProperties();
+                    if (linkPropertiesUnchanged(newLp)) {
+                        break;
+                    }
                     final ProvisioningChange delta = setLinkProperties(newLp);
 
                     // NOTE: The only receiver of these callbacks currently
@@ -527,15 +534,10 @@
                     final DhcpResults dhcpResults = (DhcpResults) msg.obj;
                     switch (msg.arg1) {
                         case DhcpStateMachine.DHCP_SUCCESS:
-                            mDhcpResults = new DhcpResults(dhcpResults);
-                            setLinkProperties(assembleLinkProperties());
-                            mCallback.onIPv4ProvisioningSuccess(dhcpResults);
+                            handleIPv4Success(dhcpResults);
                             break;
                         case DhcpStateMachine.DHCP_FAILURE:
-                            clearIPv4Address();
-                            mDhcpResults = null;
-                            setLinkProperties(assembleLinkProperties());
-                            mCallback.onIPv4ProvisioningFailure();
+                            handleIPv4Failure();
                             break;
                         default:
                             Log.e(TAG, "Unknown CMD_POST_DHCP_ACTION status:" + msg.arg1);