1f61101f6266be243c481d163b95e65d67b8d1669Wink Saville/* 2f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Copyright (C) 2010 The Android Open Source Project 3f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 4f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * you may not use this file except in compliance with the License. 6f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * You may obtain a copy of the License at 7f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 8f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 9f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 10f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Unless required by applicable law or agreed to in writing, software 11f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * See the License for the specific language governing permissions and 14f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * limitations under the License. 15f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 16f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 17f61101f6266be243c481d163b95e65d67b8d1669Wink Savillepackage android.net; 18f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 19f61101f6266be243c481d163b95e65d67b8d1669Wink Savilleimport android.os.Parcelable; 20f61101f6266be243c481d163b95e65d67b8d1669Wink Savilleimport android.os.Parcel; 21f61101f6266be243c481d163b95e65d67b8d1669Wink Savilleimport android.util.Log; 22f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 23f61101f6266be243c481d163b95e65d67b8d1669Wink Savilleimport java.util.Collection; 24f61101f6266be243c481d163b95e65d67b8d1669Wink Savilleimport java.util.HashMap; 25f61101f6266be243c481d163b95e65d67b8d1669Wink Savilleimport java.util.Map; 26f61101f6266be243c481d163b95e65d67b8d1669Wink Savilleimport java.util.Map.Entry; 27f61101f6266be243c481d163b95e65d67b8d1669Wink Savilleimport java.util.Set; 28f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 29f61101f6266be243c481d163b95e65d67b8d1669Wink Saville/** 30f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * A class representing the capabilities of a link 31f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 32f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @hide 33f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 34f61101f6266be243c481d163b95e65d67b8d1669Wink Savillepublic class LinkCapabilities implements Parcelable { 35f61101f6266be243c481d163b95e65d67b8d1669Wink Saville private static final String TAG = "LinkCapabilities"; 36f61101f6266be243c481d163b95e65d67b8d1669Wink Saville private static final boolean DBG = false; 37f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 38f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** The Map of Keys to Values */ 39f61101f6266be243c481d163b95e65d67b8d1669Wink Saville private HashMap<Integer, String> mCapabilities; 40f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 41f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 42f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 43f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * The set of keys defined for a links capabilities. 44f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 45f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Keys starting with RW are read + write, i.e. the application 46f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * can request for a certain requirement corresponding to that key. 47f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Keys starting with RO are read only, i.e. the the application 48f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * can read the value of that key from the socket but cannot request 49f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * a corresponding requirement. 50f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 51f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * TODO: Provide a documentation technique for concisely and precisely 52f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * define the syntax for each value string associated with a key. 53f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 54f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final class Key { 55f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** No constructor */ 56f61101f6266be243c481d163b95e65d67b8d1669Wink Saville private Key() {} 57f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 58f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 59f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * An integer representing the network type. 60f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @see ConnectivityManager 61f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 62f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public final static int RO_NETWORK_TYPE = 1; 63f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 64f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 65f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Desired minimum forward link (download) bandwidth for the 66f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * in kilobits per second (kbps). Values should be strings such 67f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * "50", "100", "1500", etc. 68f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 69f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public final static int RW_DESIRED_FWD_BW = 2; 70f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 71f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 72f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Required minimum forward link (download) bandwidth, in 73f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * per second (kbps), below which the socket cannot function. 74f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Values should be strings such as "50", "100", "1500", etc. 75f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 76f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public final static int RW_REQUIRED_FWD_BW = 3; 77f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 78f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 79f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Available forward link (download) bandwidth for the socket. 80f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * This value is in kilobits per second (kbps). 81f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Values will be strings such as "50", "100", "1500", etc. 82f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 83f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public final static int RO_AVAILABLE_FWD_BW = 4; 84f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 85f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 86f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Desired minimum reverse link (upload) bandwidth for the socket 87f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * in kilobits per second (kbps). 88f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Values should be strings such as "50", "100", "1500", etc. 89f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * <p> 90f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * This key is set via the needs map. 91f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 92f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public final static int RW_DESIRED_REV_BW = 5; 93f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 94f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 95f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Required minimum reverse link (upload) bandwidth, in kilobits 96f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * per second (kbps), below which the socket cannot function. 97f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * If a rate is not specified, the default rate of kbps will be 98f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Values should be strings such as "50", "100", "1500", etc. 99f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 100f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public final static int RW_REQUIRED_REV_BW = 6; 101f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 102f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 103f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Available reverse link (upload) bandwidth for the socket. 104f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * This value is in kilobits per second (kbps). 105f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Values will be strings such as "50", "100", "1500", etc. 106f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 107f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public final static int RO_AVAILABLE_REV_BW = 7; 108f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 109f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 110f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Maximum latency for the socket, in milliseconds, above which 111f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * socket cannot function. 112f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Values should be strings such as "50", "300", "500", etc. 113f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 114f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public final static int RW_MAX_ALLOWED_LATENCY = 8; 115f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 116f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 117f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Interface that the socket is bound to. This can be a virtual 118f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * interface (e.g. VPN or Mobile IP) or a physical interface 119f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * (e.g. wlan0 or rmnet0). 120f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Values will be strings such as "wlan0", "rmnet0" 121f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 122f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public final static int RO_BOUND_INTERFACE = 9; 123f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 124f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 125f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Physical interface that the socket is routed on. 126f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * This can be different from BOUND_INTERFACE in cases such as 127f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * VPN or Mobile IP. The physical interface may change over time 128f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * if seamless mobility is supported. 129f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Values will be strings such as "wlan0", "rmnet0" 130f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 131f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public final static int RO_PHYSICAL_INTERFACE = 10; 132f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 133f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 134f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 135f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Role informs the LinkSocket about the data usage patterns of your 136f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * application. 137f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * <P> 138f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * {@code Role.DEFAULT} is the default role, and is used whenever 139f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * a role isn't set. 140f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 141f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final class Role { 142f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** No constructor */ 143f61101f6266be243c481d163b95e65d67b8d1669Wink Saville private Role() {} 144f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 145f61101f6266be243c481d163b95e65d67b8d1669Wink Saville // examples only, discuss which roles should be defined, and then 146f61101f6266be243c481d163b95e65d67b8d1669Wink Saville // code these to match 147f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 148f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** Default Role */ 1496e80997a9a7b6a15370544edde322cd8833e9524Wink Saville public static final String DEFAULT = "default"; 150f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** Bulk down load */ 151f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final String BULK_DOWNLOAD = "bulk.download"; 152f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** Bulk upload */ 153f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final String BULK_UPLOAD = "bulk.upload"; 154f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 155f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** VoIP Application at 24kbps */ 156f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final String VOIP_24KBPS = "voip.24k"; 157f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** VoIP Application at 32kbps */ 158f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final String VOIP_32KBPS = "voip.32k"; 159f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 160f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** Video Streaming at 480p */ 161f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final String VIDEO_STREAMING_480P = "video.streaming.480p"; 162f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** Video Streaming at 720p */ 163f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final String VIDEO_STREAMING_720I = "video.streaming.720i"; 164f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 165f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** Video Chat Application at 360p */ 166f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final String VIDEO_CHAT_360P = "video.chat.360p"; 167f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** Video Chat Application at 480p */ 168f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final String VIDEO_CHAT_480P = "video.chat.480i"; 169f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 170f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 171f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 172f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Constructor 173f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 174f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public LinkCapabilities() { 175f61101f6266be243c481d163b95e65d67b8d1669Wink Saville mCapabilities = new HashMap<Integer, String>(); 176f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 177f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 178f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 179f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Copy constructor. 180f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 181f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @param source 182f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 183f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public LinkCapabilities(LinkCapabilities source) { 184f61101f6266be243c481d163b95e65d67b8d1669Wink Saville if (source != null) { 185f61101f6266be243c481d163b95e65d67b8d1669Wink Saville mCapabilities = new HashMap<Integer, String>(source.mCapabilities); 186f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } else { 187f61101f6266be243c481d163b95e65d67b8d1669Wink Saville mCapabilities = new HashMap<Integer, String>(); 188f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 189f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 190f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 191f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 192f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Create the {@code LinkCapabilities} with values depending on role type. 193f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @param applicationRole a {@code LinkSocket.Role} 194f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @return the {@code LinkCapabilities} associated with the applicationRole, empty if none 195f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 196f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static LinkCapabilities createNeedsMap(String applicationRole) { 197f61101f6266be243c481d163b95e65d67b8d1669Wink Saville if (DBG) log("createNeededCapabilities(applicationRole) EX"); 198f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return new LinkCapabilities(); 199f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 200f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 201f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 202f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Remove all capabilities 203f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 204f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public void clear() { 205f61101f6266be243c481d163b95e65d67b8d1669Wink Saville mCapabilities.clear(); 206f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 207f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 208f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 209f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Returns whether this map is empty. 210f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 211f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public boolean isEmpty() { 212f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return mCapabilities.isEmpty(); 213f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 214f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 215f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 216f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Returns the number of elements in this map. 217f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 218f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @return the number of elements in this map. 219f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 220f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public int size() { 221f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return mCapabilities.size(); 222f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 223f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 224f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 225f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Given the key return the capability string 226f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 227f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @param key 228f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @return the capability string 229f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 230f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public String get(int key) { 231f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return mCapabilities.get(key); 232f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 233f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 234f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 235f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Store the key/value capability pair 236f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 237f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @param key 238f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @param value 239f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 240f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public void put(int key, String value) { 241f61101f6266be243c481d163b95e65d67b8d1669Wink Saville mCapabilities.put(key, value); 242f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 243f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 244f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 245f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Returns whether this map contains the specified key. 246f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 247f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @param key to search for. 248f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @return {@code true} if this map contains the specified key, 249f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * {@code false} otherwise. 250f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 251f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public boolean containsKey(int key) { 252f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return mCapabilities.containsKey(key); 253f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 254f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 255f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 256f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Returns whether this map contains the specified value. 257f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 258f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @param value to search for. 259f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @return {@code true} if this map contains the specified value, 260f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * {@code false} otherwise. 261f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 262f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public boolean containsValue(String value) { 263f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return mCapabilities.containsValue(value); 264f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 265f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 266f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 267f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Returns a set containing all of the mappings in this map. Each mapping is 268f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * an instance of {@link Map.Entry}. As the set is backed by this map, 269f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * changes in one will be reflected in the other. 270f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * 271f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @return a set of the mappings. 272f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 273f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public Set<Entry<Integer, String>> entrySet() { 274f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return mCapabilities.entrySet(); 275f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 276f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 277f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 278f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @return the set of the keys. 279f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 280f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public Set<Integer> keySet() { 281f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return mCapabilities.keySet(); 282f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 283f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 284f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 285f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @return the set of values 286f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 287f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public Collection<String> values() { 288f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return mCapabilities.values(); 289f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 290f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 291f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 292f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Implement the Parcelable interface 293f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @hide 294f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 295f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public int describeContents() { 296f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return 0; 297f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 298f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 299f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 300f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Convert to string for debugging 301f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 302f61101f6266be243c481d163b95e65d67b8d1669Wink Saville @Override 303f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public String toString() { 304f61101f6266be243c481d163b95e65d67b8d1669Wink Saville StringBuilder sb = new StringBuilder(); 305f61101f6266be243c481d163b95e65d67b8d1669Wink Saville sb.append("{"); 306f61101f6266be243c481d163b95e65d67b8d1669Wink Saville boolean firstTime = true; 307f61101f6266be243c481d163b95e65d67b8d1669Wink Saville for (Entry<Integer, String> entry : mCapabilities.entrySet()) { 308f61101f6266be243c481d163b95e65d67b8d1669Wink Saville if (firstTime) { 309f61101f6266be243c481d163b95e65d67b8d1669Wink Saville firstTime = false; 310f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } else { 311f61101f6266be243c481d163b95e65d67b8d1669Wink Saville sb.append(","); 312f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 313f61101f6266be243c481d163b95e65d67b8d1669Wink Saville sb.append(entry.getKey()); 314f61101f6266be243c481d163b95e65d67b8d1669Wink Saville sb.append(":\""); 315f61101f6266be243c481d163b95e65d67b8d1669Wink Saville sb.append(entry.getValue()); 316f61101f6266be243c481d163b95e65d67b8d1669Wink Saville sb.append("\""); 317f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return mCapabilities.toString(); 318f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 319f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return sb.toString(); 320f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 321f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 322f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 323f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Implement the Parcelable interface. 324f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @hide 325f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 326f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public void writeToParcel(Parcel dest, int flags) { 327f61101f6266be243c481d163b95e65d67b8d1669Wink Saville dest.writeInt(mCapabilities.size()); 328f61101f6266be243c481d163b95e65d67b8d1669Wink Saville for (Entry<Integer, String> entry : mCapabilities.entrySet()) { 329f61101f6266be243c481d163b95e65d67b8d1669Wink Saville dest.writeInt(entry.getKey().intValue()); 330f61101f6266be243c481d163b95e65d67b8d1669Wink Saville dest.writeString(entry.getValue()); 331f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 332f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 333f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 334f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 335f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Implement the Parcelable interface. 336f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @hide 337f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 338f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public static final Creator<LinkCapabilities> CREATOR = 339f61101f6266be243c481d163b95e65d67b8d1669Wink Saville new Creator<LinkCapabilities>() { 340f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public LinkCapabilities createFromParcel(Parcel in) { 341f61101f6266be243c481d163b95e65d67b8d1669Wink Saville LinkCapabilities capabilities = new LinkCapabilities(); 342f61101f6266be243c481d163b95e65d67b8d1669Wink Saville int size = in.readInt(); 343f61101f6266be243c481d163b95e65d67b8d1669Wink Saville while (size-- != 0) { 344f61101f6266be243c481d163b95e65d67b8d1669Wink Saville int key = in.readInt(); 345f61101f6266be243c481d163b95e65d67b8d1669Wink Saville String value = in.readString(); 346f61101f6266be243c481d163b95e65d67b8d1669Wink Saville capabilities.mCapabilities.put(key, value); 347f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 348f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return capabilities; 349f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 350f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 351f61101f6266be243c481d163b95e65d67b8d1669Wink Saville public LinkCapabilities[] newArray(int size) { 352f61101f6266be243c481d163b95e65d67b8d1669Wink Saville return new LinkCapabilities[size]; 353f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 354f61101f6266be243c481d163b95e65d67b8d1669Wink Saville }; 355f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 356f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 357f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Debug logging 358f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 359f61101f6266be243c481d163b95e65d67b8d1669Wink Saville protected static void log(String s) { 360f61101f6266be243c481d163b95e65d67b8d1669Wink Saville Log.d(TAG, s); 361f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 362f61101f6266be243c481d163b95e65d67b8d1669Wink Saville} 363