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