Enable multi-cast while resolving nsd services

Test: Before taimen never resolved nsd servives. How it resolved nsd
      services reliably when built in print service and print service
      recommendation service used NsdService
Fixes: 75316187

Change-Id: I5976bea0273f605e59dc4ee72dbd766ff79d1d41
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index fc7570f..e87f721 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -21,6 +21,7 @@
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
diff --git a/src/com/android/bips/discovery/MdnsDiscovery.java b/src/com/android/bips/discovery/MdnsDiscovery.java
index c0111a0..d3fd2f1 100644
--- a/src/com/android/bips/discovery/MdnsDiscovery.java
+++ b/src/com/android/bips/discovery/MdnsDiscovery.java
@@ -20,6 +20,7 @@
 import android.net.Uri;
 import android.net.nsd.NsdManager;
 import android.net.nsd.NsdServiceInfo;
+import android.net.wifi.WifiManager;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -60,6 +61,9 @@
     private final List<Resolver> mResolvers = new ArrayList<>();
     private final NsdResolveQueue mNsdResolveQueue;
 
+    /** Lock to keep multi-cast enabled */
+    private WifiManager.MulticastLock mMulticastLock;
+
     public MdnsDiscovery(BuiltInPrintService printService, String scheme) {
         super(printService);
 
@@ -135,6 +139,16 @@
                 // Do nothing
             }
         };
+
+        WifiManager wifiManager = getPrintService().getSystemService(WifiManager.class);
+        if (wifiManager != null) {
+            if (mMulticastLock == null) {
+                mMulticastLock = wifiManager.createMulticastLock(this.getClass().getName());
+            }
+
+            mMulticastLock.acquire();
+        }
+
         NsdManager nsdManager = mNsdResolveQueue.getNsdManager();
         nsdManager.discoverServices(mServiceName, NsdManager.PROTOCOL_DNS_SD, serviceListener);
         mServiceListeners.add(serviceListener);
@@ -153,6 +167,10 @@
             resolver.cancel();
         }
         mResolvers.clear();
+
+        if (mMulticastLock != null) {
+            mMulticastLock.release();
+        }
     }
 
     /**