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
450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    WifiP2pGroupList() {
46d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown        this(null, null);
470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
49d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown    WifiP2pGroupList(WifiP2pGroupList source, GroupDeleteListener listener) {
500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        mListener = listener;
510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        mGroups = new LruCache<Integer, WifiP2pGroup>(CREDENTIAL_MAX_NUM) {
520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            @Override
530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            protected void entryRemoved(boolean evicted, Integer netId,
540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                    WifiP2pGroup oldValue, WifiP2pGroup newValue) {
550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                if (mListener != null && !isClearCalled) {
560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                    mListener.onDeleteGroup(oldValue.getNetworkId());
570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                }
580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        };
60d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown
61d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown        if (source != null) {
62d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown            for (Map.Entry<Integer, WifiP2pGroup> item : source.mGroups.snapshot().entrySet()) {
63d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown                mGroups.put(item.getKey(), item.getValue());
64d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown            }
65d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown        }
660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Return the list of p2p group.
700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @return the list of p2p group.
720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public Collection<WifiP2pGroup> getGroupList() {
740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return mGroups.snapshot().values();
750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Add the specified group to this group list.
790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param group
810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    void add(WifiP2pGroup group) {
830879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        mGroups.put(group.getNetworkId(), group);
840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
850879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Remove the group with the specified network id from this group list.
880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param netId
900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    void remove(int netId) {
920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        mGroups.remove(netId);
930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Remove the group with the specified device address from this group list.
970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param deviceAddress
990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
1000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    void remove(String deviceAddress) {
1010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        remove(getNetworkId(deviceAddress));
1020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Clear the group.
1060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
1070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    boolean clear() {
1080879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        if (mGroups.size() == 0) return false;
1090879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        isClearCalled = true;
1100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        mGroups.evictAll();
1110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        isClearCalled = false;
1120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return true;
1130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Return the network id of the group owner profile with the specified p2p device
1170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * address.
1180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * If more than one persistent group of the same address is present in the list,
1190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * return the first one.
1200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
1210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param deviceAddress p2p device address.
1220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @return the network id. if not found, return -1.
1230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
1240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    int getNetworkId(String deviceAddress) {
1250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        if (deviceAddress == null) return -1;
1260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
1280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        for (WifiP2pGroup grp: groups) {
1290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            if (deviceAddress.equalsIgnoreCase(grp.getOwner().deviceAddress)) {
1300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                // update cache ordered.
1310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                mGroups.get(grp.getNetworkId());
1320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                return grp.getNetworkId();
1330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
1340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
1350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return -1;
1360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Return the network id of the group with the specified p2p device address
1400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * and the ssid.
1410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
1420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param deviceAddress p2p device address.
1430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param ssid ssid.
1440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @return the network id. if not found, return -1.
1450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
1460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    int getNetworkId(String deviceAddress, String ssid) {
1470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        if (deviceAddress == null || ssid == null) {
1480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            return -1;
1490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
1500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
1520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        for (WifiP2pGroup grp: groups) {
1530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            if (deviceAddress.equalsIgnoreCase(grp.getOwner().deviceAddress) &&
1540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                    ssid.equals(grp.getNetworkName())) {
1550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                // update cache ordered.
1560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                mGroups.get(grp.getNetworkId());
1570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                return grp.getNetworkId();
1580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
1590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
1600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return -1;
1620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Return the group owner address of the group with the specified network id
1660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
1670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param netId network id.
1680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @return the address. if not found, return null.
1690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
1700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    String getOwnerAddr(int netId) {
1710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        WifiP2pGroup grp = mGroups.get(netId);
1720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        if (grp != null) {
1730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            return grp.getOwner().deviceAddress;
1740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
1750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return null;
1760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /**
1790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * Return true if this group list contains the specified network id.
1800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * This function does NOT update LRU information.
1810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * It means the internal queue is NOT reordered.
1820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     *
1830879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @param netId network id.
1840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     * @return true if the specified network id is present in this group list.
1850879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga     */
1860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    boolean contains(int netId) {
1870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
1880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        for (WifiP2pGroup grp: groups) {
1890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            if (netId == grp.getNetworkId()) {
1900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                return true;
1910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
1920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
1930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return false;
1940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
1950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public String toString() {
1970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        StringBuffer sbuf = new StringBuffer();
1980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
1990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
2000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        for (WifiP2pGroup grp: groups) {
2010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            sbuf.append(grp).append("\n");
2020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
2030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return sbuf.toString();
2040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
2050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /** Implement the Parcelable interface */
2070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public int describeContents() {
2080879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        return 0;
2090879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
2100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /** Implement the Parcelable interface */
2120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public void writeToParcel(Parcel dest, int flags) {
2130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
2140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        dest.writeInt(groups.size());
2150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        for(WifiP2pGroup group : groups) {
2160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            dest.writeParcelable(group, flags);
2170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        }
2180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    }
2190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    /** Implement the Parcelable interface */
2210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga    public static final Creator<WifiP2pGroupList> CREATOR =
2220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        new Creator<WifiP2pGroupList>() {
2230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            public WifiP2pGroupList createFromParcel(Parcel in) {
2240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                WifiP2pGroupList grpList = new WifiP2pGroupList();
2250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                int deviceCount = in.readInt();
2270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                for (int i = 0; i < deviceCount; i++) {
2280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                    grpList.add((WifiP2pGroup)in.readParcelable(null));
2290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                }
2300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                return grpList;
2310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
2320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga
2330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            public WifiP2pGroupList[] newArray(int size) {
2340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga                return new WifiP2pGroupList[size];
2350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga            }
2360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga        };
2370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga}
238