Merge "Fix Sending PAC Broadcast before downloaded" into klp-dev
diff --git a/services/java/com/android/server/connectivity/PacManager.java b/services/java/com/android/server/connectivity/PacManager.java
index 53e1dc2..1cb2fe3 100644
--- a/services/java/com/android/server/connectivity/PacManager.java
+++ b/services/java/com/android/server/connectivity/PacManager.java
@@ -86,6 +86,9 @@
     private int mCurrentDelay;
     private int mLastPort;
 
+    private boolean mHasSentBroadcast;
+    private boolean mHasDownloaded;
+
     /**
      * Used for locking when setting mProxyService and all references to mPacUrl or mCurrentPac.
      */
@@ -110,6 +113,8 @@
                         setCurrentProxyScript(file);
                     }
                 }
+                mHasDownloaded = true;
+                sendProxyIfNeeded();
                 longSchedule();
             } else {
                 reschedule();
@@ -155,6 +160,8 @@
                 mPacUrl = proxy.getPacFileUrl();
             }
             mCurrentDelay = DELAY_1;
+            mHasSentBroadcast = false;
+            mHasDownloaded = false;
             getAlarmManager().cancel(mPacRefreshIntent);
             bind();
             return true;
@@ -311,10 +318,14 @@
                         callbackService.getProxyPort(new IProxyPortListener.Stub() {
                             @Override
                             public void setProxyPort(int port) throws RemoteException {
+                                if (mLastPort != -1) {
+                                    // Always need to send if port changed
+                                    mHasSentBroadcast = false;
+                                }
                                 mLastPort = port;
                                 if (port != -1) {
                                     Log.d(TAG, "Local proxy is bound on " + port);
-                                    sendPacBroadcast(new ProxyProperties(mPacUrl, port));
+                                    sendProxyIfNeeded();
                                 } else {
                                     Log.e(TAG, "Received invalid port from Local Proxy,"
                                             + " PAC will not be operational");
@@ -341,6 +352,7 @@
             mProxyConnection = null;
         }
         mProxyService = null;
+        mLastPort = -1;
     }
 
     private void sendPacBroadcast(ProxyProperties proxy) {
@@ -355,4 +367,14 @@
             Binder.restoreCallingIdentity(ident);
         }
     }
+
+    private synchronized void sendProxyIfNeeded() {
+        if (!mHasDownloaded || (mLastPort == -1)) {
+            return;
+        }
+        if (!mHasSentBroadcast) {
+            sendPacBroadcast(new ProxyProperties(mPacUrl, mLastPort));
+            mHasSentBroadcast = true;
+        }
+    }
 }