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