WifiP2pGroup.java revision 0879d03f0a5caa108a0a7320442d57629f9ced81
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/** 3055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * A class representing a Wi-Fi P2p group 316f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff * 326f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff * {@see WifiP2pManager} 3355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 3455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncpublic class WifiP2pGroup implements Parcelable { 3555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** The temporary network id. 370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * {@hide} */ 380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public static final int TEMPORARY_NET_ID = -1; 390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** The persistent network id. 410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * If a matching persistent profile is found, use it. 420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Otherwise, create a new persistent profile. 430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * {@hide} */ 440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public static final int PERSISTENT_NET_ID = -2; 450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 4655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** The network name */ 4755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private String mNetworkName; 4855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 4955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** Group owner */ 5055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private WifiP2pDevice mOwner; 5155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 5255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** Device is group owner */ 5355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private boolean mIsGroupOwner; 5455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 5555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** Group clients */ 5655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private List<WifiP2pDevice> mClients = new ArrayList<WifiP2pDevice>(); 5755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 584be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** The passphrase used for WPA2-PSK */ 5955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private String mPassphrase; 6055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 6155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private String mInterface; 6255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** The network id in the wpa_supplicant */ 640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private int mNetId; 650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 6661472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga /** P2P group started string pattern */ 6761472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga private static final Pattern groupStartedPattern = Pattern.compile( 6861472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga "ssid=\"(.+)\" " + 6961472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga "freq=(\\d+) " + 7061472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga "(?:psk=)?([0-9a-fA-F]{64})?" + 7161472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga "(?:passphrase=)?(?:\"(.{8,63})\")? " + 720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga "go_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2})" + 730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga " ?(\\[PERSISTENT\\])?" 7461472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga ); 7561472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga 76651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff public WifiP2pGroup() { 7755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 7855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 7955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** 809cc2718abc0152d79e3e8bf23be94ddd3cc9db87Irfan Sheriff * @param supplicantEvent formats supported include 8155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 8255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * P2P-GROUP-STARTED p2p-wlan0-0 [client|GO] ssid="DIRECT-W8" freq=2437 8355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * [psk=2182b2e50e53f260d04f3c7b25ef33c965a3291b9b36b455a82d77fd82ca15bc| 840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * passphrase="fKG4jMe3"] go_dev_addr=fa:7b:7a:42:02:13 [PERSISTENT] 8555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 8655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * P2P-GROUP-REMOVED p2p-wlan0-0 [client|GO] reason=REQUESTED 8755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 8855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * P2P-INVITATION-RECEIVED sa=fa:7b:7a:42:02:13 go_dev_addr=f8:7b:7a:42:02:13 8955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * bssid=fa:7b:7a:42:82:13 unknown-network 9055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * P2P-INVITATION-RECEIVED sa=b8:f9:34:2a:c7:9d persistent=0 920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * 9355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Note: The events formats can be looked up in the wpa_supplicant code 944be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * @hide 9555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 9655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pGroup(String supplicantEvent) throws IllegalArgumentException { 9755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 9855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync String[] tokens = supplicantEvent.split(" "); 9955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 10055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (tokens.length < 3) { 10155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync throw new IllegalArgumentException("Malformed supplicant event"); 10255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 10355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 10455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (tokens[0].startsWith("P2P-GROUP")) { 10555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mInterface = tokens[1]; 10655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mIsGroupOwner = tokens[2].equals("GO"); 10755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 10861472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga Matcher match = groupStartedPattern.matcher(supplicantEvent); 10961472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga if (!match.find()) { 11061472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga return; 11161472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga } 11255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 11361472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga mNetworkName = match.group(1); 11461472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga //freq and psk are unused right now 11561472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga //int freq = Integer.parseInt(match.group(2)); 11661472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga //String psk = match.group(3); 11761472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga mPassphrase = match.group(4); 11861472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga mOwner = new WifiP2pDevice(match.group(5)); 1190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (match.group(6) != null) { 1200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mNetId = PERSISTENT_NET_ID; 1210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 1220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mNetId = TEMPORARY_NET_ID; 1230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 12455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else if (tokens[0].equals("P2P-INVITATION-RECEIVED")) { 1250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String sa = null; 1260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mNetId = PERSISTENT_NET_ID; 12755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync for (String token : tokens) { 12855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync String[] nameValue = token.split("="); 12955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (nameValue.length != 2) continue; 13055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (nameValue[0].equals("sa")) { 1320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga sa = nameValue[1]; 1330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // set source address into the client list. 1350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pDevice dev = new WifiP2pDevice(); 1360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga dev.deviceAddress = nameValue[1]; 1370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mClients.add(dev); 1380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 1390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 1400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 14155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (nameValue[0].equals("go_dev_addr")) { 14255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mOwner = new WifiP2pDevice(nameValue[1]); 14355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync continue; 14455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 1450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (nameValue[0].equals("persistent")) { 1470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mOwner = new WifiP2pDevice(sa); 1480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mNetId = Integer.parseInt(nameValue[1]); 1490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 1500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 15155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 15255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else { 15355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync throw new IllegalArgumentException("Malformed supplicant event"); 15455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 15555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 15655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1574be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 1584be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void setNetworkName(String networkName) { 1594be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mNetworkName = networkName; 1604be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 1614be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 1624be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** 1634be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * Get the network name (SSID) of the group. Legacy Wi-Fi clients will discover 1644be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * the p2p group using the network name. 1654be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff */ 1664be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public String getNetworkName() { 1674be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff return mNetworkName; 1684be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 1694be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 1704be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 1714be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void setIsGroupOwner(boolean isGo) { 1724be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mIsGroupOwner = isGo; 1734be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 1744be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 1754be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** Check whether this device is the group owner of the created p2p group */ 17655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean isGroupOwner() { 17755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mIsGroupOwner; 17855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 17955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1804be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 1814be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void setOwner(WifiP2pDevice device) { 1824be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mOwner = device; 1834be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 1844be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 1854be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** Get the details of the group owner as a {@link WifiP2pDevice} object */ 18655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pDevice getOwner() { 18755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mOwner; 18855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 18955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1904be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 19155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void addClient(String address) { 19255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addClient(new WifiP2pDevice(address)); 19355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 19455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1954be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 19655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void addClient(WifiP2pDevice device) { 19755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync for (WifiP2pDevice client : mClients) { 19855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (client.equals(device)) return; 19955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 20055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mClients.add(device); 20155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 20255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2034be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 20455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean removeClient(String address) { 20555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mClients.remove(new WifiP2pDevice(address)); 20655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 20755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2084be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 20955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean removeClient(WifiP2pDevice device) { 21055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mClients.remove(device); 21155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 21255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2134be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 21455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean isClientListEmpty() { 21555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mClients.size() == 0; 21655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 21755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 218530040e0b9458994c02f4392765db168128d48daIrfan Sheriff /** @hide Returns {@code true} if the device is part of the group */ 219530040e0b9458994c02f4392765db168128d48daIrfan Sheriff public boolean contains(WifiP2pDevice device) { 220530040e0b9458994c02f4392765db168128d48daIrfan Sheriff if (mOwner.equals(device) || mClients.contains(device)) return true; 221530040e0b9458994c02f4392765db168128d48daIrfan Sheriff return false; 222530040e0b9458994c02f4392765db168128d48daIrfan Sheriff } 223530040e0b9458994c02f4392765db168128d48daIrfan Sheriff 2244be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** Get the list of clients currently part of the p2p group */ 22555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public Collection<WifiP2pDevice> getClientList() { 22655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return Collections.unmodifiableCollection(mClients); 22755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 22855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2294be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 2304be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void setPassphrase(String passphrase) { 2314be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mPassphrase = passphrase; 2324be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 2334be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 2344be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** 2354be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * Get the passphrase of the group. This function will return a valid passphrase only 2364be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * at the group owner. Legacy Wi-Fi clients will need this passphrase alongside 2374be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * network name obtained from {@link #getNetworkName()} to join the group 2384be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff */ 2394be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public String getPassphrase() { 2404be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff return mPassphrase; 2414be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 2424be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 2434be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** @hide */ 2444be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void setInterface(String intf) { 2454be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mInterface = intf; 2464be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 2474be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 2484be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /** Get the interface name on which the group is created */ 24955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public String getInterface() { 25055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return mInterface; 25155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 25255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** @hide */ 2540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public int getNetworkId() { 2550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return mNetId; 2560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 2570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** @hide */ 2590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public void setNetworkId(int netId) { 2600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga this.mNetId = netId; 2610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 2620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 26355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public String toString() { 26455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync StringBuffer sbuf = new StringBuffer(); 2654be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sbuf.append("network: ").append(mNetworkName); 2664be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sbuf.append("\n isGO: ").append(mIsGroupOwner); 2674be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sbuf.append("\n GO: ").append(mOwner); 2684be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff for (WifiP2pDevice client : mClients) { 2694be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sbuf.append("\n Client: ").append(client); 2704be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 2714be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sbuf.append("\n interface: ").append(mInterface); 2720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga sbuf.append("\n networkId: ").append(mNetId); 27355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return sbuf.toString(); 27455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 27555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 276651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff /** Implement the Parcelable interface */ 27755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public int describeContents() { 27855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return 0; 27955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 28055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 281651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff /** copy constructor */ 28255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pGroup(WifiP2pGroup source) { 28355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (source != null) { 284651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mNetworkName = source.getNetworkName(); 285651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mOwner = new WifiP2pDevice(source.getOwner()); 286651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mIsGroupOwner = source.mIsGroupOwner; 287651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff for (WifiP2pDevice d : source.getClientList()) mClients.add(d); 288651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mPassphrase = source.getPassphrase(); 289651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mInterface = source.getInterface(); 2900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mNetId = source.getNetworkId(); 291651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff } 29255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 29355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 294651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff /** Implement the Parcelable interface */ 29555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void writeToParcel(Parcel dest, int flags) { 2964be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeString(mNetworkName); 2974be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeParcelable(mOwner, flags); 2984be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeByte(mIsGroupOwner ? (byte) 1: (byte) 0); 2994be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeInt(mClients.size()); 3004be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff for (WifiP2pDevice client : mClients) { 3014be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeParcelable(client, flags); 3024be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 3034be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeString(mPassphrase); 3044be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff dest.writeString(mInterface); 3050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga dest.writeInt(mNetId); 30655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 30755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 308651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff /** Implement the Parcelable interface */ 30955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static final Creator<WifiP2pGroup> CREATOR = 31055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync new Creator<WifiP2pGroup>() { 31155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pGroup createFromParcel(Parcel in) { 31255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pGroup group = new WifiP2pGroup(); 3134be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.setNetworkName(in.readString()); 3144be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.setOwner((WifiP2pDevice)in.readParcelable(null)); 3154be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.setIsGroupOwner(in.readByte() == (byte)1); 3164be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff int clientCount = in.readInt(); 3174be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff for (int i=0; i<clientCount; i++) { 3184be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.addClient((WifiP2pDevice) in.readParcelable(null)); 3194be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 3204be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.setPassphrase(in.readString()); 3214be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff group.setInterface(in.readString()); 3220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setNetworkId(in.readInt()); 32355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return group; 32455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 32555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 32655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pGroup[] newArray(int size) { 32755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return new WifiP2pGroup[size]; 32855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 32955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync }; 33055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync} 331