prevent IO on main thread

When starting up discovery, prior code fetches IP address for manually-
added printers. For named printers this results in IO on main thread,
causing an exception. This change captures IP address during capability scan.

Test: Manually add a DNS-resolvable printer and restart printing
Change-Id: I0f87de92a847ce41381a94aa5d5a7bbf8ecb4165
Signed-off-by: Glade Diviney <mopriadevteam@gmail.com>
diff --git a/src/com/android/bips/LocalDiscoverySession.java b/src/com/android/bips/LocalDiscoverySession.java
index fa41ad0..cd982a4 100644
--- a/src/com/android/bips/LocalDiscoverySession.java
+++ b/src/com/android/bips/LocalDiscoverySession.java
@@ -296,13 +296,10 @@
      * @return {@code true} iff the printer should be suppressed
      */
     private boolean isHandledByOtherService(LocalPrinter printer) {
-        ArrayList<String> printerServices;
-        try {
-            printerServices = mPrintersOfOtherService.get(printer.getAddress());
-        } catch (UnknownHostException e) {
-            Log.e(TAG, "Cannot resolve address for " + printer, e);
-            return false;
-        }
+        InetAddress address = printer.getAddress();
+        if (address == null) return false;
+
+        ArrayList<String> printerServices = mPrintersOfOtherService.get(printer.getAddress());
 
         if (printerServices != null) {
             int numServices = printerServices.size();
diff --git a/src/com/android/bips/LocalPrinter.java b/src/com/android/bips/LocalPrinter.java
index efd622b..96a75e7 100644
--- a/src/com/android/bips/LocalPrinter.java
+++ b/src/com/android/bips/LocalPrinter.java
@@ -55,13 +55,12 @@
         mPrinterId = discoveredPrinter.getId(printService);
     }
 
-    /**
-     * @return The address of the printer or {@code null} if the printer is not reachable
-     *
-     * @throws UnknownHostException if the address could not be resolved
-     */
-    public InetAddress getAddress() throws UnknownHostException {
-        return InetAddress.getByName(mDiscoveredPrinter.path.getHost());
+    /** Return the address of the printer or {@code null} if not known */
+    public InetAddress getAddress() {
+        if (mCapabilities != null) {
+            return mCapabilities.inetAddress;
+        }
+        return null;
     }
 
     /** Return true if this printer should be aged out */
diff --git a/src/com/android/bips/ipp/GetCapabilitiesTask.java b/src/com/android/bips/ipp/GetCapabilitiesTask.java
index 5554ba6..f37442e 100644
--- a/src/com/android/bips/ipp/GetCapabilitiesTask.java
+++ b/src/com/android/bips/ipp/GetCapabilitiesTask.java
@@ -25,8 +25,10 @@
 import com.android.bips.jni.LocalPrinterCapabilities;
 
 import java.io.IOException;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.Socket;
+import java.net.UnknownHostException;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
@@ -63,6 +65,12 @@
         long start = System.currentTimeMillis();
 
         LocalPrinterCapabilities printerCaps = new LocalPrinterCapabilities();
+        try {
+            printerCaps.inetAddress = InetAddress.getByName(mUri.getHost());
+        } catch (UnknownHostException e) {
+            return null;
+        }
+
         boolean online = isDeviceOnline(mUri);
         if (DEBUG) {
             Log.d(TAG, "isDeviceOnline uri=" + mUri + " online=" + online +
diff --git a/src/com/android/bips/jni/LocalPrinterCapabilities.java b/src/com/android/bips/jni/LocalPrinterCapabilities.java
index d5bca7a..4b9671e 100644
--- a/src/com/android/bips/jni/LocalPrinterCapabilities.java
+++ b/src/com/android/bips/jni/LocalPrinterCapabilities.java
@@ -25,6 +25,7 @@
 import com.android.bips.BuiltInPrintService;
 import com.android.bips.R;
 
+import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -48,6 +49,8 @@
     public int[] supportedMediaTypes;
     public int[] supportedMediaSizes;
 
+    public InetAddress inetAddress;
+
     /** Bears the underlying native C structure (printer_capabilities_t) or null if not present */
     public byte[] nativeData;
 
@@ -118,6 +121,7 @@
                 " mediaDefault=" + mediaDefault +
                 " supportedMediaTypes=" + Arrays.toString(supportedMediaTypes) +
                 " supportedMediaSizes=" + Arrays.toString(supportedMediaSizes) +
+                " inetAddress=" + inetAddress +
                 "}";
     }
 }
\ No newline at end of file