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 android.util.Size;
20df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
21df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.Collections;
22df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.Comparator;
23df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.List;
24df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
25df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport static com.android.internal.util.Preconditions.*;
26df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
27df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin/**
28df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Comparator for {@link Size} objects by the area.
29df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin *
30df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * <p>This comparator totally orders by rectangle area. Tie-breaks on width.</p>
31df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */
32df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinpublic class SizeAreaComparator implements Comparator<Size> {
33df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    /**
34df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * {@inheritDoc}
35df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     */
36df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    @Override
37df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    public int compare(Size size, Size size2) {
38df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        checkNotNull(size, "size must not be null");
39df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        checkNotNull(size2, "size2 must not be null");
40df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
41df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        if (size.equals(size2)) {
42df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            return 0;
43df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        }
44df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
45df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        long width = size.getWidth();
46df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        long width2 = size2.getWidth();
47df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        long area = width * size.getHeight();
48df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        long area2 = width2 * size2.getHeight();
49df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
50df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        if (area == area2) {
51df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            return (width > width2) ? 1 : -1;
52df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        }
53df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
54df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        return (area > area2) ? 1 : -1;
55df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    }
56df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
57df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    /**
58df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * Get the largest {@code Size} from the list by comparing each size's area
59df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * by each other using {@link SizeAreaComparator}.
60df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     *
61df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @param sizes a non-{@code null} list of non-{@code null} sizes
62df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @return a non-{@code null} size
63df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     *
64df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @throws NullPointerException if {@code sizes} or any elements in it were {@code null}
65df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     */
66df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    public static Size findLargestByArea(List<Size> sizes) {
67df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        checkNotNull(sizes, "sizes must not be null");
68df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
69df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        return Collections.max(sizes, new SizeAreaComparator());
70df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    }
71df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin}