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