Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8bf825f4 authored by Irfan Sheriff's avatar Irfan Sheriff
Browse files

Open p2p pre-association service discovery API

This allows applications to filter out the devices by the
services supported for the purpose of establishing a
connection.

so, a game app can connect to devices that support the game,
and a media streaming app can filter and connect only to
the available media display devices

Change-Id: Ia792e292d2ca771beeb4ca3b007a047527c19229
parent d4fecc25
Loading
Loading
Loading
Loading
+86 −0
Original line number Diff line number Diff line
@@ -12254,6 +12254,26 @@ package android.net.http {
}
package android.net.nsd {
  public class DnsSdTxtRecord implements android.os.Parcelable {
    ctor public DnsSdTxtRecord();
    ctor public DnsSdTxtRecord(byte[]);
    ctor public DnsSdTxtRecord(android.net.nsd.DnsSdTxtRecord);
    method public boolean contains(java.lang.String);
    method public int describeContents();
    method public java.lang.String get(java.lang.String);
    method public byte[] getRawData();
    method public int keyCount();
    method public int remove(java.lang.String);
    method public void set(java.lang.String, java.lang.String);
    method public int size();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
  }
}
package android.net.rtp {
  public class AudioCodec {
@@ -12760,15 +12780,26 @@ package android.net.wifi.p2p {
  }
  public class WifiP2pManager {
    method public void addLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void addServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void cancelConnect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void clearLocalServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void clearServiceRequests(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void connect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pConfig, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void createGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void discoverPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void discoverServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public android.net.wifi.p2p.WifiP2pManager.Channel initialize(android.content.Context, android.os.Looper, android.net.wifi.p2p.WifiP2pManager.ChannelListener);
    method public void removeGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void removeLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void removeServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    method public void requestConnectionInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener);
    method public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener);
    method public void requestPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.PeerListListener);
    method public void setDnsSdResponseListeners(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.DnsSdServiceResponseListener, android.net.wifi.p2p.WifiP2pManager.DnsSdTxtRecordListener);
    method public void setServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ServiceResponseListener);
    method public void setUpnpServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.UpnpServiceResponseListener);
    method public void stopPeerDiscovery(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
    field public static final int BUSY = 2; // 0x2
    field public static final int ERROR = 0; // 0x0
    field public static final java.lang.String EXTRA_DISCOVERY_STATE = "discoveryState";
@@ -12804,6 +12835,14 @@ package android.net.wifi.p2p {
    method public abstract void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo);
  }
  public static abstract interface WifiP2pManager.DnsSdServiceResponseListener {
    method public abstract void onDnsSdServiceAvailable(java.lang.String, java.lang.String, android.net.wifi.p2p.WifiP2pDevice);
  }
  public static abstract interface WifiP2pManager.DnsSdTxtRecordListener {
    method public abstract void onDnsSdTxtRecordAvailable(java.lang.String, android.net.nsd.DnsSdTxtRecord, android.net.wifi.p2p.WifiP2pDevice);
  }
  public static abstract interface WifiP2pManager.GroupInfoListener {
    method public abstract void onGroupInfoAvailable(android.net.wifi.p2p.WifiP2pGroup);
  }
@@ -12812,6 +12851,53 @@ package android.net.wifi.p2p {
    method public abstract void onPeersAvailable(android.net.wifi.p2p.WifiP2pDeviceList);
  }
  public static abstract interface WifiP2pManager.ServiceResponseListener {
    method public abstract void onServiceAvailable(int, byte[], android.net.wifi.p2p.WifiP2pDevice);
  }
  public static abstract interface WifiP2pManager.UpnpServiceResponseListener {
    method public abstract void onUpnpServiceAvailable(java.util.List<java.lang.String>, android.net.wifi.p2p.WifiP2pDevice);
  }
}
package android.net.wifi.p2p.nsd {
  public class WifiP2pDnsSdServiceInfo extends android.net.wifi.p2p.nsd.WifiP2pServiceInfo {
    method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo newInstance(java.lang.String, java.lang.String, android.net.nsd.DnsSdTxtRecord);
  }
  public class WifiP2pDnsSdServiceRequest extends android.net.wifi.p2p.nsd.WifiP2pServiceRequest {
    method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance();
    method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(java.lang.String);
    method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(java.lang.String, java.lang.String);
  }
  public class WifiP2pServiceInfo implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int SERVICE_TYPE_ALL = 0; // 0x0
    field public static final int SERVICE_TYPE_BONJOUR = 1; // 0x1
    field public static final int SERVICE_TYPE_UPNP = 2; // 0x2
    field public static final int SERVICE_TYPE_VENDOR_SPECIFIC = 255; // 0xff
  }
  public class WifiP2pServiceRequest implements android.os.Parcelable {
    method public int describeContents();
    method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int, java.lang.String);
    method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int);
    method public void writeToParcel(android.os.Parcel, int);
  }
  public class WifiP2pUpnpServiceInfo extends android.net.wifi.p2p.nsd.WifiP2pServiceInfo {
    method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo newInstance(java.lang.String, java.lang.String, java.util.List<java.lang.String>);
  }
  public class WifiP2pUpnpServiceRequest extends android.net.wifi.p2p.nsd.WifiP2pServiceRequest {
    method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance();
    method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance(java.lang.String);
  }
}
package android.nfc {
+0 −1
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ import java.util.Arrays;
 * The DnsSdTxtRecord object stores the entire TXT data as a single byte array, traversing it
 * as need be to implement its various methods.
 *
 * @hide
 */
public class DnsSdTxtRecord implements Parcelable {
    private static final byte mSeperator = '=';
+91 −70

File changed.

Preview size limit exceeded, changes collapsed.

+31 −25
Original line number Diff line number Diff line
@@ -25,10 +25,15 @@ import java.util.List;
import java.util.Map;

/**
 * A class for Bonjour service information.
 * @hide
 * A class for storing Bonjour service information that is advertised
 * over a Wi-Fi peer-to-peer setup.
 *
 * {@see android.net.wifi.p2p.WifiP2pManager#addLocalService}
 * {@see android.net.wifi.p2p.WifiP2pManager#removeLocalService}
 * {@see WifiP2pServiceInfo}
 * {@see WifiP2pUpnpServiceInfo}
 */
public class WifiP2pBonjourServiceInfo extends WifiP2pServiceInfo {
public class WifiP2pDnsSdServiceInfo extends WifiP2pServiceInfo {

    /**
     * Bonjour version 1.
@@ -67,25 +72,26 @@ public class WifiP2pBonjourServiceInfo extends WifiP2pServiceInfo {
     *
     * @param queryList
     */
    private WifiP2pBonjourServiceInfo(List<String> queryList) {
    private WifiP2pDnsSdServiceInfo(List<String> queryList) {
        super(queryList);
    }

    /**
     * Create Bonjour service information object.
     * Create a Bonjour service information object.
     *
     * @param instanceName instance name.<br>
     *  e.g) "MyPrinter"
     * @param registrationType registration type.<br>
     *  e.g) "_ipp._tcp.local."
     * @param txtRecord text record.
     * @param serviceType service type.<br>
     *  e.g) "_ipp._tcp"
     * @param txtRecord TXT record as defined at
     * http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt
     * @return Bonjour service information object
     */
    public static WifiP2pBonjourServiceInfo newInstance(String instanceName,
            String registrationType, DnsSdTxtRecord txtRecord) {
        if (TextUtils.isEmpty(instanceName) || TextUtils.isEmpty(registrationType)) {
    public static WifiP2pDnsSdServiceInfo newInstance(String instanceName,
            String serviceType, DnsSdTxtRecord txtRecord) {
        if (TextUtils.isEmpty(instanceName) || TextUtils.isEmpty(serviceType)) {
            throw new IllegalArgumentException(
                    "instance name or registration type cannot be empty");
                    "instance name or service type cannot be empty");
        }

        if (txtRecord == null) {
@@ -93,10 +99,10 @@ public class WifiP2pBonjourServiceInfo extends WifiP2pServiceInfo {
        }

        ArrayList<String> queries = new ArrayList<String>();
        queries.add(createPtrServiceQuery(instanceName, registrationType));
        queries.add(createTxtServiceQuery(instanceName, registrationType, txtRecord));
        queries.add(createPtrServiceQuery(instanceName, serviceType));
        queries.add(createTxtServiceQuery(instanceName, serviceType, txtRecord));

        return new WifiP2pBonjourServiceInfo(queries);
        return new WifiP2pDnsSdServiceInfo(queries);
    }

    /**
@@ -104,16 +110,16 @@ public class WifiP2pBonjourServiceInfo extends WifiP2pServiceInfo {
     *
     * @param instanceName instance name.<br>
     *  e.g) "MyPrinter"
     * @param registrationType registration type.<br>
     *  e.g) "_ipp._tcp.local."
     * @param serviceType service type.<br>
     *  e.g) "_ipp._tcp"
     * @return wpa_supplicant service query.
     */
    private static String createPtrServiceQuery(String instanceName,
            String registrationType) {
            String serviceType) {

        StringBuffer sb = new StringBuffer();
        sb.append("bonjour ");
        sb.append(createRequest(registrationType, DNS_TYPE_PTR, VERSION_1));
        sb.append(createRequest(serviceType + ".local.", DNS_TYPE_PTR, VERSION_1));
        sb.append(" ");

        byte[] data = instanceName.getBytes();
@@ -130,20 +136,20 @@ public class WifiP2pBonjourServiceInfo extends WifiP2pServiceInfo {
     *
     * @param instanceName instance name.<br>
     *  e.g) "MyPrinter"
     * @param registrationType registration type.<br>
     *  e.g) "_ipp._tcp.local."
     * @param serviceType service type.<br>
     *  e.g) "_ipp._tcp"
     * @param txtRecord TXT record.<br>
     * @return wpa_supplicant service query.
     */
    public static String createTxtServiceQuery(String instanceName,
            String registrationType,
    private static String createTxtServiceQuery(String instanceName,
            String serviceType,
            DnsSdTxtRecord txtRecord) {


        StringBuffer sb = new StringBuffer();
        sb.append("bonjour ");

        sb.append(createRequest((instanceName + "." + registrationType),
        sb.append(createRequest((instanceName + "." + serviceType + ".local."),
                DNS_TYPE_TXT, VERSION_1));
        sb.append(" ");
        byte[] rawData = txtRecord.getRawData();
@@ -173,7 +179,7 @@ public class WifiP2pBonjourServiceInfo extends WifiP2pServiceInfo {
         * ________________________________________________
         * |   Type (2)           | Version (1) |
         */
        if (dnsType == WifiP2pBonjourServiceInfo.DNS_TYPE_TXT) {
        if (dnsType == WifiP2pDnsSdServiceInfo.DNS_TYPE_TXT) {
            dnsName = dnsName.toLowerCase();
        }
        sb.append(compressDnsName(dnsName));
+107 −0
Original line number Diff line number Diff line
@@ -16,12 +16,17 @@

package android.net.wifi.p2p.nsd;

import android.net.wifi.p2p.WifiP2pManager;

/**
 * A class for a request of bonjour service discovery.
 * @hide
 * A class for creating a Bonjour service discovery request for use with
 * {@link WifiP2pManager#addServiceRequest} and {@link WifiP2pManager#removeServiceRequest}
 *
 * {@see WifiP2pManager}
 * {@see WifiP2pServiceRequest}
 * {@see WifiP2pUpnpServiceRequest}
 */
public class WifiP2pBonjourServiceRequest extends WifiP2pServiceRequest {
public class WifiP2pDnsSdServiceRequest extends WifiP2pServiceRequest {

    /**
     * This constructor is only used in newInstance().
@@ -29,7 +34,7 @@ public class WifiP2pBonjourServiceRequest extends WifiP2pServiceRequest {
     * @param query The part of service specific query.
     * @hide
     */
    private WifiP2pBonjourServiceRequest(String query) {
    private WifiP2pDnsSdServiceRequest(String query) {
        super(WifiP2pServiceInfo.SERVICE_TYPE_BONJOUR, query);
    }

@@ -37,15 +42,15 @@ public class WifiP2pBonjourServiceRequest extends WifiP2pServiceRequest {
     * This constructor is only used in newInstance().
     * @hide
     */
    private WifiP2pBonjourServiceRequest() {
    private WifiP2pDnsSdServiceRequest() {
        super(WifiP2pServiceInfo.SERVICE_TYPE_BONJOUR, null);
    }

    private WifiP2pBonjourServiceRequest(String registrationType, int dnsType, int version) {
        super(WifiP2pServiceInfo.SERVICE_TYPE_BONJOUR, WifiP2pBonjourServiceInfo.createRequest(
                registrationType,
                WifiP2pBonjourServiceInfo.DNS_TYPE_PTR,
                WifiP2pBonjourServiceInfo.VERSION_1));
    private WifiP2pDnsSdServiceRequest(String dnsQuery, int dnsType, int version) {
        super(WifiP2pServiceInfo.SERVICE_TYPE_BONJOUR, WifiP2pDnsSdServiceInfo.createRequest(
                dnsQuery,
                dnsType,
                version));
    }

    /**
@@ -53,50 +58,50 @@ public class WifiP2pBonjourServiceRequest extends WifiP2pServiceRequest {
     *
     * @return service request for Bonjour.
     */
    public static WifiP2pBonjourServiceRequest newInstance() {
        return new WifiP2pBonjourServiceRequest();
    public static WifiP2pDnsSdServiceRequest newInstance() {
        return new WifiP2pDnsSdServiceRequest();
    }

    /**
     * Create a service discovery request to resolve the instance name with the specified
     * registration type.
     * Create a service discovery to search for Bonjour services with the specified
     * service type.
     *
     * @param registrationType registration type. Cannot be null <br>
     * e.g) <br>
     *  "_afpovertcp._tcp.local."(Apple File Sharing over TCP)<br>
     *  "_ipp._tcp.local." (IP Printing over TCP)<br>
     * @return service request for Bonjour.
     * @param serviceType service type. Cannot be null <br>
     *  "_afpovertcp._tcp."(Apple File Sharing over TCP)<br>
     *  "_ipp._tcp" (IP Printing over TCP)<br>
     *  "_http._tcp" (http service)
     * @return service request for DnsSd.
     */
    public static WifiP2pBonjourServiceRequest newInstance(String registrationType) {
        if (registrationType == null) {
            throw new IllegalArgumentException("registration type cannot be null");
    public static WifiP2pDnsSdServiceRequest newInstance(String serviceType) {
        if (serviceType == null) {
            throw new IllegalArgumentException("service type cannot be null");
        }
        return new WifiP2pBonjourServiceRequest(registrationType,
                WifiP2pBonjourServiceInfo.DNS_TYPE_PTR,
                WifiP2pBonjourServiceInfo.VERSION_1);
        return new WifiP2pDnsSdServiceRequest(serviceType + ".local.",
                WifiP2pDnsSdServiceInfo.DNS_TYPE_PTR,
                WifiP2pDnsSdServiceInfo.VERSION_1);
    }

    /**
     * Create a service discovery request to get the TXT data from the specified
     * service.
     * Bonjour service.
     *
     * @param instanceName instance name. Cannot be null. <br>
     *  "MyPrinter"
     * @param registrationType registration type. Cannot be null. <br>
     * @param serviceType service type. Cannot be null. <br>
     * e.g) <br>
     *  "_afpovertcp._tcp.local."(Apple File Sharing over TCP)<br>
     *  "_ipp._tcp.local." (IP Printing over TCP)<br>
     *  "_afpovertcp._tcp"(Apple File Sharing over TCP)<br>
     *  "_ipp._tcp" (IP Printing over TCP)<br>
     * @return service request for Bonjour.
     */
    public static WifiP2pBonjourServiceRequest newInstance(String instanceName,
            String registrationType) {
        if (instanceName == null || registrationType == null) {
    public static WifiP2pDnsSdServiceRequest newInstance(String instanceName,
            String serviceType) {
        if (instanceName == null || serviceType == null) {
            throw new IllegalArgumentException(
                    "instance name or registration type cannot be null");
                    "instance name or service type cannot be null");
        }
        String fullDomainName = instanceName + "." + registrationType;
        return new WifiP2pBonjourServiceRequest(fullDomainName,
                WifiP2pBonjourServiceInfo.DNS_TYPE_TXT,
                WifiP2pBonjourServiceInfo.VERSION_1);
        String fullDomainName = instanceName + "." + serviceType + ".local.";
        return new WifiP2pDnsSdServiceRequest(fullDomainName,
                WifiP2pDnsSdServiceInfo.DNS_TYPE_TXT,
                WifiP2pDnsSdServiceInfo.VERSION_1);
    }
}
Loading