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