NsdManager.java revision 7d024d372431effc87168afdc7cbe387680c4935
17d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff/* 27d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Copyright (C) 2012 The Android Open Source Project 37d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 47d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License"); 57d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * you may not use this file except in compliance with the License. 67d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * You may obtain a copy of the License at 77d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 87d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * http://www.apache.org/licenses/LICENSE-2.0 97d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Unless required by applicable law or agreed to in writing, software 117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS, 127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * See the License for the specific language governing permissions and 147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * limitations under the License. 157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffpackage android.net.nsd; 187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.content.Context; 207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Binder; 217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.IBinder; 227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Handler; 237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Looper; 247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Message; 257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.RemoteException; 267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Messenger; 277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.util.Log; 287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport com.android.internal.util.AsyncChannel; 307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport com.android.internal.util.Protocol; 317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff/** 337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * The Network Service Discovery Manager class provides the API for service 347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * discovery. Service discovery enables applications to discover and connect with services 357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * on a network. Example applications include a game application discovering another instance 367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * of the game application or a printer application discovering other printers on a network. 377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * <p> The API is asynchronous and responses to requests from an application are on listener 397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * callbacks provided by the application. The application needs to do an initialization with 407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * {@link #initialize} before doing any operation. 417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * <p> Android currently supports DNS based service discovery and it is limited to a local 437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * network with the use of multicast DNS. In future, this class will be 447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * extended to support other service discovery mechanisms. 457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Get an instance of this class by calling {@link android.content.Context#getSystemService(String) 477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Context.getSystemService(Context.NSD_SERVICE)}. 487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @hide 497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffpublic class NsdManager { 527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private static final String TAG = "NsdManager"; 537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff INsdManager mService; 547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private static final int BASE = Protocol.BASE_NSD_MANAGER; 567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int DISCOVER_SERVICES = BASE + 1; 597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int DISCOVER_SERVICES_STARTED = BASE + 2; 617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int DISCOVER_SERVICES_FAILED = BASE + 3; 637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int SERVICE_FOUND = BASE + 4; 657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int SERVICE_LOST = BASE + 5; 677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int STOP_DISCOVERY = BASE + 6; 707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int STOP_DISCOVERY_FAILED = BASE + 7; 727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int STOP_DISCOVERY_SUCCEEDED = BASE + 8; 747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int REGISTER_SERVICE = BASE + 9; 777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int REGISTER_SERVICE_FAILED = BASE + 10; 797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int REGISTER_SERVICE_SUCCEEDED = BASE + 11; 817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int UPDATE_SERVICE = BASE + 12; 847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int UPDATE_SERVICE_FAILED = BASE + 13; 867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int UPDATE_SERVICE_SUCCEEDED = BASE + 14; 887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int RESOLVE_SERVICE = BASE + 15; 917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int RESOLVE_SERVICE_FAILED = BASE + 16; 937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int RESOLVE_SERVICE_SUCCEEDED = BASE + 17; 957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Create a new Nsd instance. Applications use 987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve 997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * {@link android.content.Context#NSD_SERVICE Context.NSD_SERVICE}. 1007d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @param service the Binder interface 1017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @hide - hide this because it takes in a parameter of type INsdManager, which 1027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * is a system private class. 1037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 1047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public NsdManager(INsdManager service) { 1057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mService = service; 1067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 1097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Indicates that the operation failed due to an internal error. 1107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 1117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int ERROR = 0; 1127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 1147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Indicates that the operation failed because service discovery is unsupported on the device. 1157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 1167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int UNSUPPORTED = 1; 1177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 1197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Indicates that the operation failed because the framework is busy and 1207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * unable to service the request 1217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 1227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int BUSY = 2; 1237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Interface for callback invocation when framework channel is connected or lost */ 1257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface ChannelListener { 1267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onChannelConnected(Channel c); 1277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 1287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * The channel to the framework has been disconnected. 1297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Application could try re-initializing using {@link #initialize} 1307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 1317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onChannelDisconnected(); 1327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface ActionListener { 1357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onFailure(int errorCode); 1377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onSuccess(); 1397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface DnsSdDiscoveryListener { 1427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onFailure(int errorCode); 1447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onStarted(String registrationType); 1467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onServiceFound(DnsSdServiceInfo serviceInfo); 1487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onServiceLost(DnsSdServiceInfo serviceInfo); 1507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface DnsSdRegisterListener { 1547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onFailure(int errorCode); 1567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onServiceRegistered(int registeredId, DnsSdServiceInfo serviceInfo); 1587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface DnsSdUpdateRegistrationListener { 1617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onFailure(int errorCode); 1637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onServiceUpdated(int registeredId, DnsSdTxtRecord txtRecord); 1657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface DnsSdResolveListener { 1687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onFailure(int errorCode); 1707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onServiceResolved(DnsSdServiceInfo serviceInfo); 1727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 1757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * A channel that connects the application to the NetworkService framework. 1767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Most service operations require a Channel as an argument. An instance of Channel is obtained 1777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * by doing a call on {@link #initialize} 1787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 1797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static class Channel { 1807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff Channel(Looper looper, ChannelListener l) { 1817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mAsyncChannel = new AsyncChannel(); 1827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mHandler = new ServiceHandler(looper); 1837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mChannelListener = l; 1847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private ChannelListener mChannelListener; 1867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private DnsSdDiscoveryListener mDnsSdDiscoveryListener; 1877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private ActionListener mDnsSdStopDiscoveryListener; 1887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private DnsSdRegisterListener mDnsSdRegisterListener; 1897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private DnsSdUpdateRegistrationListener mDnsSdUpdateListener; 1907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private DnsSdResolveListener mDnsSdResolveListener; 1917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff AsyncChannel mAsyncChannel; 1937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff ServiceHandler mHandler; 1947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff class ServiceHandler extends Handler { 1957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff ServiceHandler(Looper looper) { 1967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff super(looper); 1977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff @Override 2007d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void handleMessage(Message message) { 2017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff switch (message.what) { 2027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 2037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); 2047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: 2067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mChannelListener != null) { 2077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mChannelListener.onChannelConnected(Channel.this); 2087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 2117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mChannelListener != null) { 2127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mChannelListener.onChannelDisconnected(); 2137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mChannelListener = null; 2147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case DISCOVER_SERVICES_STARTED: 2177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdDiscoveryListener != null) { 2187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdDiscoveryListener.onStarted((String) message.obj); 2197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case DISCOVER_SERVICES_FAILED: 2227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdDiscoveryListener != null) { 2237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdDiscoveryListener.onFailure(message.arg1); 2247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case SERVICE_FOUND: 2277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdDiscoveryListener != null) { 2287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdDiscoveryListener.onServiceFound( 2297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (DnsSdServiceInfo) message.obj); 2307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case SERVICE_LOST: 2337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdDiscoveryListener != null) { 2347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdDiscoveryListener.onServiceLost( 2357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (DnsSdServiceInfo) message.obj); 2367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case STOP_DISCOVERY_FAILED: 2397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdStopDiscoveryListener != null) { 2407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdStopDiscoveryListener.onFailure(message.arg1); 2417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case STOP_DISCOVERY_SUCCEEDED: 2447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdStopDiscoveryListener != null) { 2457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdStopDiscoveryListener.onSuccess(); 2467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case REGISTER_SERVICE_FAILED: 2497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdRegisterListener != null) { 2507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdRegisterListener.onFailure(message.arg1); 2517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case REGISTER_SERVICE_SUCCEEDED: 2547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdRegisterListener != null) { 2557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdRegisterListener.onServiceRegistered(message.arg1, 2567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (DnsSdServiceInfo) message.obj); 2577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case UPDATE_SERVICE_FAILED: 2607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdUpdateListener != null) { 2617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdUpdateListener.onFailure(message.arg1); 2627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case UPDATE_SERVICE_SUCCEEDED: 2657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdUpdateListener != null) { 2667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdUpdateListener.onServiceUpdated(message.arg1, 2677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (DnsSdTxtRecord) message.obj); 2687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case RESOLVE_SERVICE_FAILED: 2717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdResolveListener != null) { 2727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdResolveListener.onFailure(message.arg1); 2737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case RESOLVE_SERVICE_SUCCEEDED: 2767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdResolveListener != null) { 2777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdResolveListener.onServiceResolved( 2787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (DnsSdServiceInfo) message.obj); 2797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff default: 2827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff Log.d(TAG, "Ignored " + message); 2837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 2907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Registers the application with the service discovery framework. This function 2917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * must be the first to be called before any other operations are performed. No service 2927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * discovery operations must be performed until the ChannelListener callback notifies 2937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * that the channel is connected 2947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 2957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @param srcContext is the context of the source 2967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @param srcLooper is the Looper on which the callbacks are receivied 2977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @param listener for callback at loss of framework communication. 2987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 2997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void initialize(Context srcContext, Looper srcLooper, ChannelListener listener) { 3007d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff Messenger messenger = getMessenger(); 3017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (messenger == null) throw new RuntimeException("Failed to initialize"); 3027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (listener == null) throw new IllegalArgumentException("ChannelListener cannot be null"); 3037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff Channel c = new Channel(srcLooper, listener); 3057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.connect(srcContext, c.mHandler, messenger); 3067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 3097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Set the listener for service discovery. Can be null. 3107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 3117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void setDiscoveryListener(Channel c, DnsSdDiscoveryListener b) { 3127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 3137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mDnsSdDiscoveryListener = b; 3147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 3177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Set the listener for stop service discovery. Can be null. 3187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 3197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void setStopDiscoveryListener(Channel c, ActionListener a) { 3207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 3217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mDnsSdStopDiscoveryListener = a; 3227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 3257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Set the listener for service registration. Can be null. 3267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 3277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void setRegisterListener(Channel c, DnsSdRegisterListener b) { 3287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 3297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mDnsSdRegisterListener = b; 3307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 3337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Set the listener for service registration. Can be null. 3347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 3357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void setUpdateRegistrationListener(Channel c, DnsSdUpdateRegistrationListener b) { 3367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 3377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mDnsSdUpdateListener = b; 3387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 3417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Set the listener for service resolution. Can be null. 3427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 3437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void setResolveListener(Channel c, DnsSdResolveListener b) { 3447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 3457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mDnsSdResolveListener = b; 3467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void registerService(Channel c, DnsSdServiceInfo serviceInfo) { 3497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 3507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (serviceInfo == null) throw new IllegalArgumentException("Null serviceInfo"); 3517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.sendMessage(REGISTER_SERVICE, serviceInfo); 3527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void updateService(Channel c, int registeredId, DnsSdTxtRecord txtRecord) { 3557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 3567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.sendMessage(UPDATE_SERVICE, registeredId, 0, txtRecord); 3577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void discoverServices(Channel c, String serviceType) { 3607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 3617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c.mDnsSdDiscoveryListener == null) throw new 3627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff IllegalStateException("Discovery listener needs to be set first"); 3637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff DnsSdServiceInfo s = new DnsSdServiceInfo(); 3647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff s.setServiceType(serviceType); 3657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.sendMessage(DISCOVER_SERVICES, s); 3667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void stopServiceDiscovery(Channel c) { 3697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 3707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.sendMessage(STOP_DISCOVERY); 3717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void resolveService(Channel c, DnsSdServiceInfo serviceInfo) { 3747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 3757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (serviceInfo == null) throw new IllegalArgumentException("Null serviceInfo"); 3767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (c.mDnsSdResolveListener == null) throw new 3777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff IllegalStateException("Resolve listener needs to be set first"); 3787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.sendMessage(RESOLVE_SERVICE, serviceInfo); 3797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 3827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Get a reference to NetworkService handler. This is used to establish 3837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * an AsyncChannel communication with the service 3847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 3857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @return Messenger pointing to the NetworkService handler 3867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 3877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private Messenger getMessenger() { 3887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff try { 3897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return mService.getMessenger(); 3907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } catch (RemoteException e) { 3917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return null; 3927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff} 395