auto import from //branches/cupcake/...@127101
diff --git a/services/java/com/android/server/GadgetService.java b/services/java/com/android/server/GadgetService.java
new file mode 100644
index 0000000..4e49253
--- /dev/null
+++ b/services/java/com/android/server/GadgetService.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2007 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;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.gadget.GadgetManager;
+import android.gadget.GadgetInfo;
+
+import com.android.internal.gadget.IGadgetService;
+
+class GadgetService extends IGadgetService.Stub
+{
+    private static final String TAG = "GadgetService";
+
+    Context mContext;
+
+    GadgetService(Context context) {
+        mContext = context;
+    }
+
+    public int allocateGadgetId(String hostPackage) {
+        return 42;
+    }
+
+    public void deleteGadgetId(int gadgetId) {
+    }
+
+    public void bindGadgetId(int gadgetId, ComponentName provider) {
+        sendEnabled(provider);
+    }
+
+    void sendEnabled(ComponentName provider) {
+        Intent intent = new Intent(GadgetManager.GADGET_ENABLE_ACTION);
+        intent.setComponent(provider);
+        mContext.sendBroadcast(intent);
+    }
+
+    public GadgetInfo getGadgetInfo(int gadgetId) {
+        GadgetInfo info = new GadgetInfo();
+        info.provider = new ComponentName("com.android.gadgethost",
+                "com.android.gadgethost.TestGadgetProvider");
+        info.minWidth = 0;
+        info.minHeight = 0;
+        info.updatePeriodMillis = 60 * 1000; // 60s
+        return info;
+    }
+}
+
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index baf57bc..7f7a52e 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -290,7 +290,7 @@
                 Log.i(TAG, "Starting Audio Service");
                 ServiceManager.addService(Context.AUDIO_SERVICE, new AudioService(context));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Volume Service", e);
+                Log.e(TAG, "Failure starting Audio Service", e);
             }
 
             try {
@@ -300,6 +300,13 @@
             } catch (Throwable e) {
                 Log.e(TAG, "Failure starting HeadsetObserver", e);
             }
+
+            try {
+                Log.i(TAG, "Starting Gadget Service");
+                ServiceManager.addService(Context.GADGET_SERVICE, new GadgetService(context));
+            } catch (Throwable e) {
+                Log.e(TAG, "Failure starting Gadget Service", e);
+            }
         }
 
         // make sure the ADB_ENABLED setting value matches the secure property value
diff --git a/services/java/com/android/server/WifiWatchdogService.java b/services/java/com/android/server/WifiWatchdogService.java
index 9578c2e..fe97b93 100644
--- a/services/java/com/android/server/WifiWatchdogService.java
+++ b/services/java/com/android/server/WifiWatchdogService.java
@@ -23,6 +23,7 @@
 import android.content.IntentFilter;
 import android.database.ContentObserver;
 import android.net.NetworkInfo;
+import android.net.DhcpInfo;
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
@@ -30,7 +31,6 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.os.SystemProperties;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Config;
@@ -241,6 +241,15 @@
         return Settings.Secure.getInt(mContentResolver,
             Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS, 1000);
     }
+
+    /**
+     * @see android.provider.Settings.Secure#WIFI_WATCHDOG_WATCH_LIST
+     * @return the comma-separated list of SSIDs
+     */
+    private String getWatchList() {
+        return Settings.Secure.getString(mContentResolver,
+                Settings.Secure.WIFI_WATCHDOG_WATCH_LIST);
+    }
     
     /**
      * Registers to receive the necessary Wi-Fi broadcasts.
@@ -304,8 +313,13 @@
      * 
      * @return The DNS of the current AP.
      */
-    private static String getDns() {
-        return SystemProperties.get(SYSTEMPROPERTY_KEY_DNS);
+    private int getDns() {
+        DhcpInfo addressInfo = mWifiManager.getDhcpInfo();
+        if (addressInfo != null) {
+            return addressInfo.dns1;
+        } else {
+            return -1;
+        }
     }
     
     /**
@@ -315,18 +329,19 @@
      * @return Whether the DNS is reachable
      */
     private boolean checkDnsConnectivity() {
-        String dns = getDns();
-        if (V) {
-            myLogV("checkDnsConnectivity: Checking " + dns + " for connectivity");
-        }
-        
-        if (TextUtils.isEmpty(dns)) {
+        int dns = getDns();
+        if (dns == -1) {
             if (V) {
                 myLogV("checkDnsConnectivity: Invalid DNS, returning false");
             }
             return false;
         }
         
+        if (V) {
+            myLogV("checkDnsConnectivity: Checking 0x" +
+                    Integer.toHexString(Integer.reverseBytes(dns)) + " for connectivity");
+        }
+
         int numInitialIgnoredPings = getInitialIgnoredPingCount();
         int numPings = getPingCount();
         int pingDelay = getPingDelayMs();
@@ -403,13 +418,13 @@
     }
 
     private boolean backgroundCheckDnsConnectivity() {
-        String dns = getDns();
+        int dns = getDns();
         if (false && V) {
             myLogV("backgroundCheckDnsConnectivity: Background checking " + dns +
                     " for connectivity");
         }
         
-        if (TextUtils.isEmpty(dns)) {
+        if (dns == -1) {
             if (V) {
                 myLogV("backgroundCheckDnsConnectivity: DNS is empty, returning false");
             }
@@ -557,7 +572,14 @@
                 return false;
             }
         }
-        
+
+        if (!isOnWatchList(ssid)) {
+            if (V) {
+                Log.v(TAG, "  SSID not on watch list, returning false");
+            }
+            return false;
+        }
+
         // The watchdog only monitors networks with multiple APs
         if (!hasRequiredNumberOfAps(ssid)) {
             return false;
@@ -565,6 +587,24 @@
 
         return true;
     }
+
+    private boolean isOnWatchList(String ssid) {
+        String watchList;
+
+        if (ssid == null || (watchList = getWatchList()) == null) {
+            return false;
+        }
+
+        String[] list = watchList.split(" *, *");
+
+        for (String name : list) {
+            if (ssid.equals(name)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
     
     /**
      * Checks if the current scan results have multiple access points with an SSID.
@@ -1180,7 +1220,7 @@
         /** Used to generate IDs */
         private static Random sRandom = new Random();
         
-        static boolean isDnsReachable(String dns, int timeout) {
+        static boolean isDnsReachable(int dns, int timeout) {
             try {
                 DatagramSocket socket = new DatagramSocket();
                 
@@ -1191,7 +1231,13 @@
                 fillQuery(buf);
                 
                 // Send the DNS query
-                InetAddress dnsAddress = InetAddress.getByName(dns);
+                byte parts[] = new byte[4];
+                parts[0] = (byte)(dns & 0xff);
+                parts[1] = (byte)((dns >> 8) & 0xff);
+                parts[2] = (byte)((dns >> 16) & 0xff);
+                parts[3] = (byte)((dns >> 24) & 0xff);
+
+                InetAddress dnsAddress = InetAddress.getByAddress(parts);
                 DatagramPacket packet = new DatagramPacket(buf,
                         buf.length, dnsAddress, DNS_PORT);
                 socket.send(packet);