NsdManager.java revision 6c07ba8183edc593527335238a2c6083392df7bc
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 193ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriffimport android.annotation.SdkConstant; 203ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriffimport android.annotation.SdkConstant.SdkConstantType; 217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.content.Context; 227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Binder; 237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.IBinder; 247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Handler; 257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Looper; 267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Message; 277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.RemoteException; 287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Messenger; 2992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriffimport android.text.TextUtils; 307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.util.Log; 317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport com.android.internal.util.AsyncChannel; 337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport com.android.internal.util.Protocol; 347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff/** 3692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * The Network Service Discovery Manager class provides the API to discover services 3792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * on a network. As an example, if device A and device B are connected over a Wi-Fi 3892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * network, a game registered on device A can be discovered by a game on device 3992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * B. Another example use case is an application discovering printers on the network. 4092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 4192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * <p> The API currently supports DNS based service discovery and discovery is currently 4292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * limited to a local network over Multicast DNS. In future, it will be extended to 4392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * support wide area discovery and other service discovery mechanisms. 4492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * DNS service discovery is described at http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt 457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * <p> The API is asynchronous and responses to requests from an application are on listener 4792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * callbacks provided by the application. The application must invoke {@link #initialize} before 4892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * doing any other operation. 4992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 5092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * <p> There are three main operations the API supports - registration, discovery and resolution. 5192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * <pre> 5292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Application start 5392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | 5492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | <---------------------------------------------- 5592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * initialize() | 5692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | 5792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | Wait until channel connects | 5892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | before doing any operation | 5992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | 6092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * onChannelConnected() __________ | 6192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | 6292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | 6392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | onServiceRegistered() | | 6492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Register any local services / | | 6592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * to be advertised with \ | | If application needs to 6692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * registerService() onFailure() | | do any further operations 6792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | again, it needs to 6892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | initialize() connection 6992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * discoverServices() | | to framework again 7092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | 7192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Maintain a list to track | | 7292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * discovered services | | 7392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | 7492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * |---------> |-> onChannelDisconnected() 7592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | 7692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | onServiceFound() | 7792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | 7892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | add service to list | 7992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | 8092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * |<---------- | 8192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | 8292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * |---------> | 8392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | 8492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | onServiceLost() | 8592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | 8692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | remove service from list | 8792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | | 8892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * |<---------- | 8992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | 9092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | 9192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | Connect to a service | 9292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | from list ? | 9392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | 9492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * resolveService() | 9592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | 9692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * onServiceResolved() | 9792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | 9892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Establish connection to service | 9992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * with the host and port information | 10092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | | 10192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * | ___________| 10292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * deinitialize() 10392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * when done with all operations 10492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * or before quit 10592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 10692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * </pre> 10792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * An application that needs to advertise itself over a network for other applications to 10892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * discover it can do so with a call to {@link #registerService}. If Example is a http based 10992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * application that can provide HTML data to peer services, it can register a name "Example" 11092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * with service type "_http._tcp". A successful registration is notified with a callback to 11192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * {@link DnsSdRegisterListener#onServiceRegistered} and a failure to register is notified 11292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * over {@link DnsSdRegisterListener#onFailure} 11392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 11492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * <p> A peer application looking for http services can initiate a discovery for "_http._tcp" 11592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * with a call to {@link #discoverServices}. A service found is notified with a callback 11692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * to {@link DnsSdDiscoveryListener#onServiceFound} and a service lost is notified on 11792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * {@link DnsSdDiscoveryListener#onServiceLost}. 11892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 11992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * <p> Once the peer application discovers the "Example" http srevice, and needs to receive data 12092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * from the "Example" application, it can initiate a resolve with {@link #resolveService} to 12192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * resolve the host and port details for the purpose of establishing a connection. A successful 12292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * resolve is notified on {@link DnsSdResolveListener#onServiceResolved} and a failure is notified 12392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * on {@link DnsSdResolveListener#onFailure}. 1247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 12592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Applications can reserve for a service type at 12692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * http://www.iana.org/form/ports-service. Existing services can be found at 12792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml 1287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 1297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Get an instance of this class by calling {@link android.content.Context#getSystemService(String) 1307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Context.getSystemService(Context.NSD_SERVICE)}. 1317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 13292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * {@see DnsSdServiceInfo} 1337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 1347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffpublic class NsdManager { 1357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private static final String TAG = "NsdManager"; 1367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff INsdManager mService; 1377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1383ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff /** 1393ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * Broadcast intent action to indicate whether network service discovery is 1403ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * enabled or disabled. An extra {@link #EXTRA_NSD_STATE} provides the state 1413ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * information as int. 1423ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * 1433ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * @see #EXTRA_NSD_STATE 1443ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff */ 1453ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1466c07ba8183edc593527335238a2c6083392df7bcIrfan Sheriff public static final String ACTION_NSD_STATE_CHANGED = 1473ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff "android.net.nsd.STATE_CHANGED"; 1483ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff 1493ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff /** 1503ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * The lookup key for an int that indicates whether network service discovery is enabled 1513ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * or disabled. Retrieve it with {@link android.content.Intent#getIntExtra(String,int)}. 1523ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * 1533ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * @see #NSD_STATE_DISABLED 1543ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * @see #NSD_STATE_ENABLED 1553ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff */ 1563ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff public static final String EXTRA_NSD_STATE = "nsd_state"; 1573ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff 1583ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff /** 1593ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * Network service discovery is disabled 1603ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * 1613ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * @see #NSD_STATE_CHANGED_ACTION 1623ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff */ 1633ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff public static final int NSD_STATE_DISABLED = 1; 1643ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff 1653ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff /** 1663ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * Network service discovery is enabled 1673ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * 1683ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff * @see #NSD_STATE_CHANGED_ACTION 1693ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff */ 1703ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff public static final int NSD_STATE_ENABLED = 2; 1713ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff 1727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private static final int BASE = Protocol.BASE_NSD_MANAGER; 1737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int DISCOVER_SERVICES = BASE + 1; 1767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int DISCOVER_SERVICES_STARTED = BASE + 2; 1787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int DISCOVER_SERVICES_FAILED = BASE + 3; 1807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int SERVICE_FOUND = BASE + 4; 1827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int SERVICE_LOST = BASE + 5; 1847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int STOP_DISCOVERY = BASE + 6; 1877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int STOP_DISCOVERY_FAILED = BASE + 7; 1897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int STOP_DISCOVERY_SUCCEEDED = BASE + 8; 1917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int REGISTER_SERVICE = BASE + 9; 1947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int REGISTER_SERVICE_FAILED = BASE + 10; 1967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 1977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int REGISTER_SERVICE_SUCCEEDED = BASE + 11; 1987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 20092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int UNREGISTER_SERVICE = BASE + 12; 2017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 20292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int UNREGISTER_SERVICE_FAILED = BASE + 13; 2037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 20492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int UNREGISTER_SERVICE_SUCCEEDED = BASE + 14; 2057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 20792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int UPDATE_SERVICE = BASE + 15; 2087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 20992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int UPDATE_SERVICE_FAILED = BASE + 16; 2107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** @hide */ 21192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int UPDATE_SERVICE_SUCCEEDED = BASE + 17; 2127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 213817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff /** @hide */ 21492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int RESOLVE_SERVICE = BASE + 18; 215817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff /** @hide */ 21692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int RESOLVE_SERVICE_FAILED = BASE + 19; 217817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff /** @hide */ 21892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int RESOLVE_SERVICE_SUCCEEDED = BASE + 20; 219817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff 22092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** @hide */ 22192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int STOP_RESOLVE = BASE + 21; 22292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** @hide */ 22392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int STOP_RESOLVE_FAILED = BASE + 22; 22492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** @hide */ 22592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public static final int STOP_RESOLVE_SUCCEEDED = BASE + 23; 226817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff 2273ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff /** @hide */ 2283ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff public static final int ENABLE = BASE + 24; 2293ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff /** @hide */ 2303ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff public static final int DISABLE = BASE + 25; 2313ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff 2323ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff 2337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 2347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Create a new Nsd instance. Applications use 2357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve 2367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * {@link android.content.Context#NSD_SERVICE Context.NSD_SERVICE}. 2377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @param service the Binder interface 2387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @hide - hide this because it takes in a parameter of type INsdManager, which 2397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * is a system private class. 2407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 2417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public NsdManager(INsdManager service) { 2427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mService = service; 2437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 24692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Passed with onFailure() calls. 2477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Indicates that the operation failed due to an internal error. 2487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 2497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int ERROR = 0; 2507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 25292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Passed with onFailure() calls. 25392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Indicates that the operation failed because service discovery 25492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * is unsupported on the device. 2557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 2567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int UNSUPPORTED = 1; 2577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 25992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Passed with onFailure() calls. 26092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Indicates that the operation failed because the framework is 26192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * busy and unable to service the request. 2627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 2637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final int BUSY = 2; 2647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 265817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff /** 26692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Passed with onFailure() calls. 267817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff * Indicates that the operation failed because it is already active. 268817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff */ 269817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff public static final int ALREADY_ACTIVE = 3; 270817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff 271817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff /** 27292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Passed with onFailure() calls. 273817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff * Indicates that the operation failed because maximum limit on 274817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff * service registrations has reached. 275817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff */ 276817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff public static final int MAX_REGS_REACHED = 4; 277817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff 2787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Interface for callback invocation when framework channel is connected or lost */ 2797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface ChannelListener { 28092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** 28192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * The channel to the framework is connected. 28292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Application can initiate calls into the framework using the channel instance passed. 28392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff */ 2847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onChannelConnected(Channel c); 2857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 2867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * The channel to the framework has been disconnected. 2877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Application could try re-initializing using {@link #initialize} 2887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 2897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onChannelDisconnected(); 2907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 29292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** Generic interface for callback invocation for a success or failure */ 2937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface ActionListener { 2947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onFailure(int errorCode); 2967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onSuccess(); 2987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 30092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** Interface for callback invocation for service discovery */ 3017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface DnsSdDiscoveryListener { 3027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onFailure(int errorCode); 3047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 30592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public void onStarted(String serviceType); 3067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onServiceFound(DnsSdServiceInfo serviceInfo); 3087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onServiceLost(DnsSdServiceInfo serviceInfo); 3107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 31392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** Interface for callback invocation for service registration */ 3147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface DnsSdRegisterListener { 3157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onFailure(int errorCode); 3177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onServiceRegistered(int registeredId, DnsSdServiceInfo serviceInfo); 3197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 32192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** @hide */ 3227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface DnsSdUpdateRegistrationListener { 3237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onFailure(int errorCode); 3257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onServiceUpdated(int registeredId, DnsSdTxtRecord txtRecord); 3277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 32992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** Interface for callback invocation for service resolution */ 3307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public interface DnsSdResolveListener { 3317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onFailure(int errorCode); 3337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void onServiceResolved(DnsSdServiceInfo serviceInfo); 3357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 3387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * A channel that connects the application to the NetworkService framework. 3397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Most service operations require a Channel as an argument. An instance of Channel is obtained 3407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * by doing a call on {@link #initialize} 3417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 3427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static class Channel { 3437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff Channel(Looper looper, ChannelListener l) { 3447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mAsyncChannel = new AsyncChannel(); 3457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mHandler = new ServiceHandler(looper); 3467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mChannelListener = l; 3477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private ChannelListener mChannelListener; 3497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private DnsSdDiscoveryListener mDnsSdDiscoveryListener; 3507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private ActionListener mDnsSdStopDiscoveryListener; 3517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private DnsSdRegisterListener mDnsSdRegisterListener; 35292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff private ActionListener mDnsSdUnregisterListener; 3537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private DnsSdUpdateRegistrationListener mDnsSdUpdateListener; 3547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private DnsSdResolveListener mDnsSdResolveListener; 355817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff private ActionListener mDnsSdStopResolveListener; 3567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3573ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff private AsyncChannel mAsyncChannel; 3583ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff private ServiceHandler mHandler; 3597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff class ServiceHandler extends Handler { 3607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff ServiceHandler(Looper looper) { 3617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff super(looper); 3627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff @Override 3657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void handleMessage(Message message) { 3667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff switch (message.what) { 3677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 3687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); 3697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 3707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: 3717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mChannelListener != null) { 3727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mChannelListener.onChannelConnected(Channel.this); 3737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 3757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 3767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mChannelListener != null) { 3777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mChannelListener.onChannelDisconnected(); 3787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mChannelListener = null; 3797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 3817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case DISCOVER_SERVICES_STARTED: 3827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdDiscoveryListener != null) { 3837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdDiscoveryListener.onStarted((String) message.obj); 3847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 3867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case DISCOVER_SERVICES_FAILED: 3877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdDiscoveryListener != null) { 3887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdDiscoveryListener.onFailure(message.arg1); 3897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 3917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case SERVICE_FOUND: 3927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdDiscoveryListener != null) { 3937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdDiscoveryListener.onServiceFound( 3947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (DnsSdServiceInfo) message.obj); 3957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 3977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case SERVICE_LOST: 3987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdDiscoveryListener != null) { 3997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdDiscoveryListener.onServiceLost( 4007d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (DnsSdServiceInfo) message.obj); 4017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 4037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case STOP_DISCOVERY_FAILED: 4047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdStopDiscoveryListener != null) { 4057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdStopDiscoveryListener.onFailure(message.arg1); 4067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 4087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case STOP_DISCOVERY_SUCCEEDED: 4097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdStopDiscoveryListener != null) { 4107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdStopDiscoveryListener.onSuccess(); 4117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 4137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case REGISTER_SERVICE_FAILED: 4147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdRegisterListener != null) { 4157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdRegisterListener.onFailure(message.arg1); 4167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 4187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case REGISTER_SERVICE_SUCCEEDED: 4197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdRegisterListener != null) { 4207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdRegisterListener.onServiceRegistered(message.arg1, 4217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (DnsSdServiceInfo) message.obj); 4227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 42492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff case UNREGISTER_SERVICE_FAILED: 42592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff if (mDnsSdUnregisterListener != null) { 42692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff mDnsSdUnregisterListener.onFailure(message.arg1); 42792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff } 42892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff break; 42992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff case UNREGISTER_SERVICE_SUCCEEDED: 43092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff if (mDnsSdUnregisterListener != null) { 43192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff mDnsSdUnregisterListener.onSuccess(); 43292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff } 43392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff break; 43492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff case UPDATE_SERVICE_FAILED: 4357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdUpdateListener != null) { 4367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdUpdateListener.onFailure(message.arg1); 4377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 4397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case UPDATE_SERVICE_SUCCEEDED: 4407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdUpdateListener != null) { 4417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdUpdateListener.onServiceUpdated(message.arg1, 4427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (DnsSdTxtRecord) message.obj); 4437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 4457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case RESOLVE_SERVICE_FAILED: 4467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdResolveListener != null) { 4477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdResolveListener.onFailure(message.arg1); 4487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 4507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff case RESOLVE_SERVICE_SUCCEEDED: 4517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mDnsSdResolveListener != null) { 4527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mDnsSdResolveListener.onServiceResolved( 4537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (DnsSdServiceInfo) message.obj); 4547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 456817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff case STOP_RESOLVE_FAILED: 457817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff if (mDnsSdStopResolveListener!= null) { 458817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff mDnsSdStopResolveListener.onFailure(message.arg1); 459817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff } 460817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff break; 461817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff case STOP_RESOLVE_SUCCEEDED: 462817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff if (mDnsSdStopResolveListener != null) { 463817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff mDnsSdStopResolveListener.onSuccess(); 464817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff } 465817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff break; 4667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff default: 4677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff Log.d(TAG, "Ignored " + message); 4687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 4697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 47492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff private static void checkChannel(Channel c) { 47592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); 47692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff } 47792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff 4787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 4797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Registers the application with the service discovery framework. This function 4807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * must be the first to be called before any other operations are performed. No service 4817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * discovery operations must be performed until the ChannelListener callback notifies 4827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * that the channel is connected 4837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 4847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @param srcContext is the context of the source 4857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @param srcLooper is the Looper on which the callbacks are receivied 48692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param listener for callback at loss of framework communication. Cannot be null. 4877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 4887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void initialize(Context srcContext, Looper srcLooper, ChannelListener listener) { 4897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff Messenger messenger = getMessenger(); 4907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (messenger == null) throw new RuntimeException("Failed to initialize"); 4917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (listener == null) throw new IllegalArgumentException("ChannelListener cannot be null"); 4927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 4937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff Channel c = new Channel(srcLooper, listener); 4947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.connect(srcContext, c.mHandler, messenger); 4957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 4967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 4977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 49892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Disconnects application from service discovery framework. No further operations 49992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * will succeed until a {@link #initialize} is called again. 50092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 50192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param c channel initialized with {@link #initialize} 5027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 50392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public void deinitialize(Channel c) { 50492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff checkChannel(c); 50592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff c.mAsyncChannel.disconnect(); 5067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 5077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 5087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 50992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Register a service to be discovered by other services. 51092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 51192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * <p> The function call immediately returns after sending a request to register service 51292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * to the framework. The application is notified of a success to initiate 51392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * discovery through the callback {@link DnsSdRegisterListener#onServiceRegistered} or a failure 51492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * through {@link DnsSdRegisterListener#onFailure}. 51592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 51692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param c is the channel created at {@link #initialize} 51792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param serviceType The service type being advertised. 51892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param port on which the service is listenering for incoming connections 51992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param listener for success or failure callback. Can be null. 5207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 52192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public void registerService(Channel c, String serviceName, String serviceType, int port, 52292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff DnsSdRegisterListener listener) { 52392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff checkChannel(c); 52492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff if (TextUtils.isEmpty(serviceName) || TextUtils.isEmpty(serviceType)) { 52592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff throw new IllegalArgumentException("Service name or type cannot be empty"); 52692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff } 52792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff if (port <= 0) { 52892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff throw new IllegalArgumentException("Invalid port number"); 52992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff } 53092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff DnsSdServiceInfo serviceInfo = new DnsSdServiceInfo(serviceName, serviceType, null); 53192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff serviceInfo.setPort(port); 53292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff c.mDnsSdRegisterListener = listener; 53392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff c.mAsyncChannel.sendMessage(REGISTER_SERVICE, serviceInfo); 5347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 5357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 536817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff /** 53792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Unregister a service registered through {@link #registerService} 53892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param c is the channel created at {@link #initialize} 53992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param registeredId is obtained at {@link DnsSdRegisterListener#onServiceRegistered} 54092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param listener provides callbacks for success or failure. Can be null. 541817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff */ 54292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public void unregisterService(Channel c, int registeredId, ActionListener listener) { 54392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff checkChannel(c); 54492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff c.mDnsSdUnregisterListener = listener; 54592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff c.mAsyncChannel.sendMessage(UNREGISTER_SERVICE, registeredId); 5467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 5477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 54892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** @hide */ 5497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void updateService(Channel c, int registeredId, DnsSdTxtRecord txtRecord) { 55092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff checkChannel(c); 5517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.sendMessage(UPDATE_SERVICE, registeredId, 0, txtRecord); 5527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 5537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 55492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** 55592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Initiate service discovery to browse for instances of a service type. Service discovery 55692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * consumes network bandwidth and will continue until the application calls 55792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * {@link #stopServiceDiscovery}. 55892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 55992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * <p> The function call immediately returns after sending a request to start service 56092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * discovery to the framework. The application is notified of a success to initiate 56192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * discovery through the callback {@link DnsSdDiscoveryListener#onStarted} or a failure 56292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * through {@link DnsSdDiscoveryListener#onFailure}. 56392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 56492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * <p> Upon successful start, application is notified when a service is found with 56592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * {@link DnsSdDiscoveryListener#onServiceFound} or when a service is lost with 56692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * {@link DnsSdDiscoveryListener#onServiceLost}. 56792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 56892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * <p> Upon failure to start, service discovery is not active and application does 56992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * not need to invoke {@link #stopServiceDiscovery} 57092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 57192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param c is the channel created at {@link #initialize} 57292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param serviceType The service type being discovered. Examples include "_http._tcp" for 57392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * http services or "_ipp._tcp" for printers 57492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param listener provides callbacks when service is found or lost. Cannot be null. 57592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff */ 57692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public void discoverServices(Channel c, String serviceType, DnsSdDiscoveryListener listener) { 57792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff checkChannel(c); 57892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff if (listener == null) { 57992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff throw new IllegalStateException("Discovery listener needs to be set first"); 58092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff } 58192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff if (TextUtils.isEmpty(serviceType)) { 58292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff throw new IllegalStateException("Service type cannot be empty"); 58392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff } 5847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff DnsSdServiceInfo s = new DnsSdServiceInfo(); 5857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff s.setServiceType(serviceType); 58692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff c.mDnsSdDiscoveryListener = listener; 5877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.sendMessage(DISCOVER_SERVICES, s); 5887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 5897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 59092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** 59192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Stop service discovery initiated with {@link #discoverServices}. An active service 59292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * discovery is notified to the application with {@link DnsSdDiscoveryListener#onStarted} 59392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * and it stays active until the application invokes a stop service discovery. 59492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 59592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * <p> Upon failure to start service discovery notified through 59692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * {@link DnsSdDiscoveryListener#onFailure} service discovery is not active and 59792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * application does not need to stop it. 59892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 59992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param c is the channel created at {@link #initialize} 60092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param listener notifies success or failure. Can be null. 60192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff */ 60292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public void stopServiceDiscovery(Channel c, ActionListener listener) { 60392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff checkChannel(c); 60492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff c.mDnsSdStopDiscoveryListener = listener; 6057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.sendMessage(STOP_DISCOVERY); 6067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 6077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 60892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** 60992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * Resolve a discovered service. An application can resolve a service right before 61092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * establishing a connection to fetch the IP and port details on which to setup 61192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * the connection. 61292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * 61392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param c is the channel created at {@link #initialize} 61492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param serviceName of the the service 61592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param serviceType of the service 61692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff * @param listener to receive callback upon success or failure. Cannot be null. 61792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff */ 61892784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff public void resolveService(Channel c, String serviceName, String serviceType, 61992784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff DnsSdResolveListener listener) { 62092784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff checkChannel(c); 62192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff if (TextUtils.isEmpty(serviceName) || TextUtils.isEmpty(serviceType)) { 62292784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff throw new IllegalArgumentException("Service name or type cannot be empty"); 62392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff } 62492784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff if (listener == null) throw new 62592784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff IllegalStateException("Resolve listener cannot be null"); 62692784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff c.mDnsSdResolveListener = listener; 62792784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff DnsSdServiceInfo serviceInfo = new DnsSdServiceInfo(serviceName, serviceType, null); 6287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff c.mAsyncChannel.sendMessage(RESOLVE_SERVICE, serviceInfo); 6297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 6307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 63192784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff /** @hide */ 632817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff public void stopServiceResolve(Channel c) { 63392784670c48759c0db604ddb95c05a7b9bdebed8Irfan Sheriff checkChannel(c); 634817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff if (c.mDnsSdResolveListener == null) throw new 635817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff IllegalStateException("Resolve listener needs to be set first"); 636817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff c.mAsyncChannel.sendMessage(STOP_RESOLVE); 637817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff } 638817388e056a5d1d0e7cd7de2c6b0c9c80617bc5fIrfan Sheriff 6393ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff /** Internal use only @hide */ 6403ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff public void setEnabled(boolean enabled) { 6413ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff try { 6423ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff mService.setEnabled(enabled); 6433ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff } catch (RemoteException e) { } 6443ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff } 6453ef889bf561e59561ff2c6c4b2ffb586b9c5af5cIrfan Sheriff 6467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 6477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Get a reference to NetworkService handler. This is used to establish 6487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * an AsyncChannel communication with the service 6497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 6507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @return Messenger pointing to the NetworkService handler 6517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 6527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private Messenger getMessenger() { 6537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff try { 6547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return mService.getMessenger(); 6557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } catch (RemoteException e) { 6567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return null; 6577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 6587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 6597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff} 660