10879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga/*
20879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Copyright (C) 2012 The Android Open Source Project
30879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga *
40879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Licensed under the Apache License, Version 2.0 (the "License");
50879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * you may not use this file except in compliance with the License.
60879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * You may obtain a copy of the License at
70879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga *
80879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga *      http://www.apache.org/licenses/LICENSE-2.0
90879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga *
100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Unless required by applicable law or agreed to in writing, software
110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * distributed under the License is distributed on an "AS IS" BASIS,
120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * See the License for the specific language governing permissions and
140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * limitations under the License.
150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */
160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagapackage android.net.wifi.p2p;
170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagaimport java.util.Collection;
19d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brownimport java.util.Map;
200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagaimport android.os.Parcel;
220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagaimport android.os.Parcelable;
230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagaimport android.util.LruCache;
240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga/**
270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * A class representing a Wi-Fi P2p group list
280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga *
290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * {@see WifiP2pManager}
300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @hide
310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */
320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagapublic class WifiP2pGroupList implements Parcelable {
330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    private static final int CREDENTIAL_MAX_NUM             =   32;
350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
36d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown    private final LruCache<Integer, WifiP2pGroup> mGroups;
37d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown    private final GroupDeleteListener mListener;
38d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown
390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    private boolean isClearCalled = false;
400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public interface GroupDeleteListener {
420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        public void onDeleteGroup(int netId);
430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
45ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
46ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public WifiP2pGroupList() {
47d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown        this(null, null);
480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
50ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
51ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public WifiP2pGroupList(WifiP2pGroupList source, GroupDeleteListener listener) {
520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        mListener = listener;
530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        mGroups = new LruCache<Integer, WifiP2pGroup>(CREDENTIAL_MAX_NUM) {
540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            @Override
550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            protected void entryRemoved(boolean evicted, Integer netId,
560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                    WifiP2pGroup oldValue, WifiP2pGroup newValue) {
570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                if (mListener != null && !isClearCalled) {
580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                    mListener.onDeleteGroup(oldValue.getNetworkId());
590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                }
600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        };
62d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown
63d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown        if (source != null) {
64d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown            for (Map.Entry<Integer, WifiP2pGroup> item : source.mGroups.snapshot().entrySet()) {
65d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown                mGroups.put(item.getKey(), item.getValue());
66d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown            }
67d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown        }
680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Return the list of p2p group.
720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @return the list of p2p group.
740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public Collection<WifiP2pGroup> getGroupList() {
760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return mGroups.snapshot().values();
770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Add the specified group to this group list.
810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param group
83ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde     * @hide
840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
85ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public void add(WifiP2pGroup group) {
860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        mGroups.put(group.getNetworkId(), group);
870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Remove the group with the specified network id from this group list.
910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param netId
93ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde     * @hide
940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
95ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public void remove(int netId) {
960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        mGroups.remove(netId);
970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Remove the group with the specified device address from this group list.
1010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
1020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param deviceAddress
1030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
1040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    void remove(String deviceAddress) {
1050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        remove(getNetworkId(deviceAddress));
1060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1080879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1090879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Clear the group.
110ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde     * @hide
1110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
112ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public boolean clear() {
1130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        if (mGroups.size() == 0) return false;
1140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        isClearCalled = true;
1150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        mGroups.evictAll();
1160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        isClearCalled = false;
1170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return true;
1180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Return the network id of the group owner profile with the specified p2p device
1220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * address.
1230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * If more than one persistent group of the same address is present in the list,
1240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * return the first one.
1250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
1260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param deviceAddress p2p device address.
1270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @return the network id. if not found, return -1.
128ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde     * @hide
1290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
130ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public int getNetworkId(String deviceAddress) {
1310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        if (deviceAddress == null) return -1;
1320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
1340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        for (WifiP2pGroup grp: groups) {
1350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            if (deviceAddress.equalsIgnoreCase(grp.getOwner().deviceAddress)) {
1360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                // update cache ordered.
1370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                mGroups.get(grp.getNetworkId());
1380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                return grp.getNetworkId();
1390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
1400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
1410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return -1;
1420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Return the network id of the group with the specified p2p device address
1460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * and the ssid.
1470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
1480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param deviceAddress p2p device address.
1490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param ssid ssid.
1500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @return the network id. if not found, return -1.
151ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde     * @hide
1520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
153ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public int getNetworkId(String deviceAddress, String ssid) {
1540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        if (deviceAddress == null || ssid == null) {
1550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            return -1;
1560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
1570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
1590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        for (WifiP2pGroup grp: groups) {
1600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            if (deviceAddress.equalsIgnoreCase(grp.getOwner().deviceAddress) &&
1610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                    ssid.equals(grp.getNetworkName())) {
1620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                // update cache ordered.
1630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                mGroups.get(grp.getNetworkId());
1640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                return grp.getNetworkId();
1650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
1660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
1670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return -1;
1690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Return the group owner address of the group with the specified network id
1730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
1740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param netId network id.
1750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @return the address. if not found, return null.
176ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde     * @hide
1770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
178ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public String getOwnerAddr(int netId) {
1790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        WifiP2pGroup grp = mGroups.get(netId);
1800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        if (grp != null) {
1810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            return grp.getOwner().deviceAddress;
1820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
1830879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return null;
1840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1850879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Return true if this group list contains the specified network id.
1880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * This function does NOT update LRU information.
1890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * It means the internal queue is NOT reordered.
1900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
1910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param netId network id.
1920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @return true if the specified network id is present in this group list.
193ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde     * @hide
1940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
195ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public boolean contains(int netId) {
1960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
1970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        for (WifiP2pGroup grp: groups) {
1980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            if (netId == grp.getNetworkId()) {
1990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                return true;
2000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
2010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
2020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return false;
2030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
2040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public String toString() {
2060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        StringBuffer sbuf = new StringBuffer();
2070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2080879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
2090879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        for (WifiP2pGroup grp: groups) {
2100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            sbuf.append(grp).append("\n");
2110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
2120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return sbuf.toString();
2130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
2140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /** Implement the Parcelable interface */
2160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public int describeContents() {
2170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return 0;
2180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
2190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /** Implement the Parcelable interface */
2210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public void writeToParcel(Parcel dest, int flags) {
2220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
2230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        dest.writeInt(groups.size());
2240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        for(WifiP2pGroup group : groups) {
2250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            dest.writeParcelable(group, flags);
2260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
2270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
2280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /** Implement the Parcelable interface */
2300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public static final Creator<WifiP2pGroupList> CREATOR =
2310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        new Creator<WifiP2pGroupList>() {
2320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            public WifiP2pGroupList createFromParcel(Parcel in) {
2330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                WifiP2pGroupList grpList = new WifiP2pGroupList();
2340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                int deviceCount = in.readInt();
2360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                for (int i = 0; i < deviceCount; i++) {
2370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                    grpList.add((WifiP2pGroup)in.readParcelable(null));
2380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                }
2390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                return grpList;
2400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
2410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            public WifiP2pGroupList[] newArray(int size) {
2430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                return new WifiP2pGroupList[size];
2440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
2450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        };
2460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga}
247