1df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin/*
2df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Copyright (C) 2014 The Android Open Source Project
3df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin *
4df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * you may not use this file except in compliance with the License.
6df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * You may obtain a copy of the License at
7df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin *
8df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin *
10df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Unless required by applicable law or agreed to in writing, software
11df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * See the License for the specific language governing permissions and
14df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * limitations under the License.
15df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */
16df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
17df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinpackage android.hardware.camera2.utils;
18df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
19df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.List;
20df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
21df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin/**
22df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Various assortment of list utilities.
23df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin *
24df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * <p>Using a {@code null} list is supported and will almost always return the default value
25df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * (e.g. {@code false}, or {@code null}).</p>
26df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */
27df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinpublic class ListUtils {
28df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
29df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    /** Return {@code} true if the {@code list} contains the {@code needle}. */
30df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    public static <T> boolean listContains(List<T> list, T needle) {
31df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        if (list == null) {
32df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            return false;
33df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        } else {
34df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            return list.contains(needle);
35df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        }
36df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    }
37df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
38df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    /**
39df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * Return {@code true} if the {@code list} is only a single element equal to
40df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * {@code single}.
41df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     */
42df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    public static <T> boolean listElementsEqualTo(List<T> list, T single) {
43df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        if (list == null) {
44df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            return false;
45df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        }
46df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
47df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        return (list.size() == 1 && list.contains(single));
48df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    }
49df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
50df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    /**
51df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * Return a human-readable representation of a list (non-recursively).
52df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     */
53df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    public static <T> String listToString(List<T> list) {
54df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        if (list == null) {
55df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            return null;
56df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        }
57df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
58df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        StringBuilder sb = new StringBuilder();
59df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        sb.append('[');
60df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
61df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        int size = list.size();
62df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        int i = 0;
63df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        for (T elem : list) {
64df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            sb.append(elem);
65df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
66df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            if (i != size - 1) {
67df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                sb.append(',');
68df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            }
69df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            i++;
70df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        }
71df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        sb.append(']');
72df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
73df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        return sb.toString();
74df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    }
75df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
76df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    /**
77df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * Return the first item from {@code choices} that is contained in the {@code list}.
78df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     *
79df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * <p>Choices with an index closer to 0 get higher priority. If none of the {@code choices}
80df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * are in the {@code list}, then {@code null} is returned.
81df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     *
82df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @param list a list of objects which may or may not contain one or more of the choices
83df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @param choices an array of objects which should be used to select an item from
84df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     *
85df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @return the first item from {@code choices} contained in {@code list}, otherwise {@code null}
86df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     */
87df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    public static <T> T listSelectFirstFrom(List<T> list, T[] choices) {
88df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        if (list == null) {
89df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            return null;
90df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        }
91df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
92df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        for (T choice : choices) {
93df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            if (list.contains(choice)) {
94df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                return choice;
95df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            }
96df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        }
97df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
98df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        return null;
99df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    }
100df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
101df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    private ListUtils() {
102df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        throw new AssertionError();
103df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    }
104df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin}
105