1a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin/* 2a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * Copyright (C) 2014 The Android Open Source Project 3a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * 4a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 5a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * you may not use this file except in compliance with the License. 6a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * You may obtain a copy of the License at 7a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * 8a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 9a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * 10a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * Unless required by applicable law or agreed to in writing, software 11a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 12a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * See the License for the specific language governing permissions and 14a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * limitations under the License 15a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin */ 16a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 17a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkinpackage android.hardware.camera2.legacy; 18a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 19a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkinimport android.hardware.Camera; 20a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 21a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkinimport java.util.Collections; 22a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkinimport java.util.Comparator; 23a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkinimport java.util.List; 24a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 25a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkinimport static com.android.internal.util.Preconditions.*; 26a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 27a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin/** 28a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * Comparator for api1 {@link Camera.Size} objects by the area. 29a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * 30a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * <p>This comparator totally orders by rectangle area. Tie-breaks on width.</p> 31a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin */ 32a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin@SuppressWarnings("deprecation") 33a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkinpublic class SizeAreaComparator implements Comparator<Camera.Size> { 34a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin /** 35a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * {@inheritDoc} 36a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin */ 37a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin @Override 38a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin public int compare(Camera.Size size, Camera.Size size2) { 39a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin checkNotNull(size, "size must not be null"); 40a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin checkNotNull(size2, "size2 must not be null"); 41a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 42a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin if (size.equals(size2)) { 43a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin return 0; 44a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 45a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 46a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin long width = size.width; 47a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin long width2 = size2.width; 48a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin long area = width * size.height; 49a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin long area2 = width2 * size2.height; 50a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 51a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin if (area == area2) { 52a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin return (width > width2) ? 1 : -1; 53a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 54a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 55a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin return (area > area2) ? 1 : -1; 56a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 57a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 58a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin /** 59a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * Get the largest api1 {@code Camera.Size} from the list by comparing each size's area 60a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * by each other using {@link SizeAreaComparator}. 61a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * 62a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * @param sizes a non-{@code null} list of non-{@code null} sizes 63a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * @return a non-{@code null} size 64a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * 65a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * @throws NullPointerException if {@code sizes} or any elements in it were {@code null} 66a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin */ 67a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin public static Camera.Size findLargestByArea(List<Camera.Size> sizes) { 68a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin checkNotNull(sizes, "sizes must not be null"); 69a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 70a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin return Collections.max(sizes, new SizeAreaComparator()); 71a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 72a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin} 73