155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync/* 255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Copyright (C) 2011 The Android Open Source Project 355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Licensed under the Apache License, Version 2.0 (the "License"); 555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * you may not use this file except in compliance with the License. 655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * You may obtain a copy of the License at 755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * http://www.apache.org/licenses/LICENSE-2.0 955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 1055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Unless required by applicable law or agreed to in writing, software 1155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * distributed under the License is distributed on an "AS IS" BASIS, 1255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * See the License for the specific language governing permissions and 1455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * limitations under the License. 1555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 1655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncpackage android.net.wifi.p2p; 1855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.os.Parcelable; 2055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.os.Parcel; 2155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.ArrayList; 2355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.List; 2455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.Collection; 2555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.Collections; 2661472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenagaimport java.util.regex.Pattern; 2761472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenagaimport java.util.regex.Matcher; 2855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync/** 303a67e2515bff73fab57621b1f9966662e83b7881Irfan Sheriff * A class representing a Wi-Fi P2p group. A p2p group consists of a single group 313a67e2515bff73fab57621b1f9966662e83b7881Irfan Sheriff * owner and one or more clients. In the case of a group with only two devices, one 323a67e2515bff73fab57621b1f9966662e83b7881Irfan Sheriff * will be the group owner and the other will be a group client. 336f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff * 346f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff * {@see WifiP2pManager} 3555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 3655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncpublic class WifiP2pGroup implements Parcelable { 3755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** The temporary network id. 390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * {@hide} */ 400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public static final int TEMPORARY_NET_ID = -1; 410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** The persistent network id. 430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * If a matching persistent profile is found, use it. 440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Otherwise, create a new persistent profile. 450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * {@hide} */ 460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public static final int PERSISTENT_NET_ID = -2; 470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 4855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** The network name */ 4955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private String mNetworkName; 5055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 5155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** Group owner */ 5255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private WifiP2pDevice mOwner; 5355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 5455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** Device is group owner */ 5555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private boolean mIsGroupOwner; 5655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 5755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** Group clients */ 5855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private List<WifiP2pDevice> mClients = new ArrayList<WifiP2pDevice>(); 5955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 604be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** The passphrase used for WPA2-PSK */ 6155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private String mPassphrase; 6255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 6355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private String mInterface; 6455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** The network id in the wpa_supplicant */ 660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private int mNetId; 670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 6861472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga /** P2P group started string pattern */ 6961472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga private static final Pattern groupStartedPattern = Pattern.compile( 7061472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga "ssid=\"(.+)\" " + 7161472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga "freq=(\\d+) " + 7261472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga "(?:psk=)?([0-9a-fA-F]{64})?" + 73d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff "(?:passphrase=)?(?:\"(.{0,63})\")? " + 740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga "go_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2})" + 750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga " ?(\\[PERSISTENT\\])?" 7661472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga ); 7761472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga 78651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff public WifiP2pGroup() { 7955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 8055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 8155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** 829cc2718abc0152d79e3e8bf23be94ddd3cc9db87Irfan Sheriff * @param supplicantEvent formats supported include 8355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 8455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * P2P-GROUP-STARTED p2p-wlan0-0 [client|GO] ssid="DIRECT-W8" freq=2437 8555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * [psk=2182b2e50e53f260d04f3c7b25ef33c965a3291b9b36b455a82d77fd82ca15bc| 860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * passphrase="fKG4jMe3"] go_dev_addr=fa:7b:7a:42:02:13 [PERSISTENT] 8755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 8855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * P2P-GROUP-REMOVED p2p-wlan0-0 [client|GO] reason=REQUESTED 8955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 9055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * P2P-INVITATION-RECEIVED sa=fa:7b:7a:42:02:13 go_dev_addr=f8:7b:7a:42:02:13 9155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * bssid=fa:7b:7a:42:82:13 unknown-network 9255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * P2P-INVITATION-RECEIVED sa=b8:f9:34:2a:c7:9d persistent=0 940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * 9555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Note: The events formats can be looked up in the wpa_supplicant code 964be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * @hide 9755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 9855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pGroup(String supplicantEvent) throws IllegalArgumentException { 9955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 10055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync String[] tokens = supplicantEvent.split(" "); 10155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 10255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (tokens.length < 3) { 10355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync throw new IllegalArgumentException("Malformed supplicant event"); 10455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 10555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 10655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (tokens[0].startsWith("P2P-GROUP")) { 10755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mInterface = tokens[1]; 10855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mIsGroupOwner = tokens[2].equals("GO"); 10955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 11061472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga Matcher match = groupStartedPattern.matcher(supplicantEvent); 11161472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga if (!match.find()) { 11261472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga return; 11361472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga } 11455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 11561472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga mNetworkName = match.group(1); 11661472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga //freq and psk are unused right now 11761472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga //int freq = Integer.parseInt(match.group(2)); 11861472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga //String psk = match.group(3); 11961472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga mPassphrase = match.group(4); 12061472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga mOwner = new WifiP2pDevice(match.group(5)); 1210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (match.group(6) != null) { 1220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mNetId = PERSISTENT_NET_ID; 1230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 1240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mNetId = TEMPORARY_NET_ID; 1250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 12655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else if (tokens[0].equals("P2P-INVITATION-RECEIVED")) { 1270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String sa = null; 1280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mNetId = PERSISTENT_NET_ID; 12955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync for (String token : tokens) { 13055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync String[] nameValue = token.split("="); 13155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (nameValue.length != 2) continue; 13255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (nameValue[0].equals("sa")) { 1340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga sa = nameValue[1]; 1350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // set source address into the client list. 1370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pDevice dev = new WifiP2pDevice(); 1380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga dev.deviceAddress = nameValue[1]; 1390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mClients.add(dev); 1400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 1410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 1420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 14355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (nameValue[0].equals("go_dev_addr")) { 14455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mOwner = new WifiP2pDevice(nameValue[1]); 14555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync continue; 14655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 1470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (nameValue[0].equals("persistent")) { 1490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mOwner = new WifiP2pDevice(sa); 1500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mNetId = Integer.parseInt(nameValue[1]); 1510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 1520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 15355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 15455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else { 15555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync throw new IllegalArgumentException("Malformed supplicant event"); 15655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 15755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 15855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1594be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 1604be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void setNetworkName(String networkName) { 1614be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mNetworkName = networkName; 1624be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 1634be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 1644be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** 1654be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * Get the network name (SSID) of the group. Legacy Wi-Fi clients will discover 1664be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * the p2p group using the network name. 1674be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff */ 1684be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public String getNetworkName() { 1694be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff return mNetworkName; 1704be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 1714be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 1724be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 1734be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void setIsGroupOwner(boolean isGo) { 1744be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mIsGroupOwner = isGo; 1754be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 1764be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 1774be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** Check whether this device is the group owner of the created p2p group */ 17855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean isGroupOwner() { 17955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mIsGroupOwner; 18055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 18155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1824be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 1834be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void setOwner(WifiP2pDevice device) { 1844be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mOwner = device; 1854be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 1864be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 1874be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** Get the details of the group owner as a {@link WifiP2pDevice} object */ 18855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pDevice getOwner() { 18955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mOwner; 19055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 19155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1924be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 19355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void addClient(String address) { 19455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addClient(new WifiP2pDevice(address)); 19555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 19655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1974be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 19855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void addClient(WifiP2pDevice device) { 19955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync for (WifiP2pDevice client : mClients) { 20055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (client.equals(device)) return; 20155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 20255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mClients.add(device); 20355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 20455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2054be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 20655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean removeClient(String address) { 20755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mClients.remove(new WifiP2pDevice(address)); 20855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 20955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2104be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 21155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean removeClient(WifiP2pDevice device) { 21255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mClients.remove(device); 21355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 21455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2154be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 21655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean isClientListEmpty() { 21755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mClients.size() == 0; 21855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 21955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 220530040e0b9458994c02f4392765db168128d48daIrfan Sheriff /** @hide Returns {@code true} if the device is part of the group */ 221530040e0b9458994c02f4392765db168128d48daIrfan Sheriff public boolean contains(WifiP2pDevice device) { 222530040e0b9458994c02f4392765db168128d48daIrfan Sheriff if (mOwner.equals(device) || mClients.contains(device)) return true; 223530040e0b9458994c02f4392765db168128d48daIrfan Sheriff return false; 224530040e0b9458994c02f4392765db168128d48daIrfan Sheriff } 225530040e0b9458994c02f4392765db168128d48daIrfan Sheriff 2264be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** Get the list of clients currently part of the p2p group */ 22755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public Collection<WifiP2pDevice> getClientList() { 22855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return Collections.unmodifiableCollection(mClients); 22955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 23055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2314be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 2324be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void setPassphrase(String passphrase) { 2334be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mPassphrase = passphrase; 2344be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 2354be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 2364be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** 2374be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * Get the passphrase of the group. This function will return a valid passphrase only 2384be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * at the group owner. Legacy Wi-Fi clients will need this passphrase alongside 2394be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * network name obtained from {@link #getNetworkName()} to join the group 2404be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff */ 2414be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public String getPassphrase() { 2424be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff return mPassphrase; 2434be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 2444be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 2454be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 2464be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void setInterface(String intf) { 2474be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mInterface = intf; 2484be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 2494be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 2504be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** Get the interface name on which the group is created */ 25155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public String getInterface() { 25255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mInterface; 25355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 25455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** @hide */ 2560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public int getNetworkId() { 2570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return mNetId; 2580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 2590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** @hide */ 2610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public void setNetworkId(int netId) { 2620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga this.mNetId = netId; 2630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 2640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 26555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public String toString() { 26655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync StringBuffer sbuf = new StringBuffer(); 2674be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sbuf.append("network: ").append(mNetworkName); 2684be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sbuf.append("\n isGO: ").append(mIsGroupOwner); 2694be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sbuf.append("\n GO: ").append(mOwner); 2704be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff for (WifiP2pDevice client : mClients) { 2714be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sbuf.append("\n Client: ").append(client); 2724be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 2734be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sbuf.append("\n interface: ").append(mInterface); 2740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga sbuf.append("\n networkId: ").append(mNetId); 27555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return sbuf.toString(); 27655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 27755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 278651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff /** Implement the Parcelable interface */ 27955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public int describeContents() { 28055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return 0; 28155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 28255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 283651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff /** copy constructor */ 28455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pGroup(WifiP2pGroup source) { 28555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (source != null) { 286651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mNetworkName = source.getNetworkName(); 287651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mOwner = new WifiP2pDevice(source.getOwner()); 288651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mIsGroupOwner = source.mIsGroupOwner; 289651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff for (WifiP2pDevice d : source.getClientList()) mClients.add(d); 290651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mPassphrase = source.getPassphrase(); 291651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mInterface = source.getInterface(); 2920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mNetId = source.getNetworkId(); 293651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff } 29455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 29555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 296651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff /** Implement the Parcelable interface */ 29755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void writeToParcel(Parcel dest, int flags) { 2984be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeString(mNetworkName); 2994be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeParcelable(mOwner, flags); 3004be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeByte(mIsGroupOwner ? (byte) 1: (byte) 0); 3014be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeInt(mClients.size()); 3024be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff for (WifiP2pDevice client : mClients) { 3034be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeParcelable(client, flags); 3044be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 3054be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeString(mPassphrase); 3064be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeString(mInterface); 3070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga dest.writeInt(mNetId); 30855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 30955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 310651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff /** Implement the Parcelable interface */ 31155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static final Creator<WifiP2pGroup> CREATOR = 31255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync new Creator<WifiP2pGroup>() { 31355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pGroup createFromParcel(Parcel in) { 31455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pGroup group = new WifiP2pGroup(); 3154be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.setNetworkName(in.readString()); 3164be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.setOwner((WifiP2pDevice)in.readParcelable(null)); 3174be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.setIsGroupOwner(in.readByte() == (byte)1); 3184be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff int clientCount = in.readInt(); 3194be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff for (int i=0; i<clientCount; i++) { 3204be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.addClient((WifiP2pDevice) in.readParcelable(null)); 3214be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 3224be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.setPassphrase(in.readString()); 3234be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.setInterface(in.readString()); 3240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setNetworkId(in.readInt()); 32555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return group; 32655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 32755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 32855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pGroup[] newArray(int size) { 32955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return new WifiP2pGroup[size]; 33055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 33155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync }; 33255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync} 333