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();
+ }
}
/**