19c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall/*
29c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * Copyright (C) 2014 The Android Open Source Project
39c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall *
49c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * Licensed under the Apache License, Version 2.0 (the "License");
59c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * you may not use this file except in compliance with the License.
69c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * You may obtain a copy of the License at
79c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall *
89c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall *      http://www.apache.org/licenses/LICENSE-2.0
99c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall *
109c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * Unless required by applicable law or agreed to in writing, software
119c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * distributed under the License is distributed on an "AS IS" BASIS,
129c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * See the License for the specific language governing permissions and
149c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall * limitations under the License.
159c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall */
169c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
1712f608f3d2089439a108788a1908941eea4277b9Puneet Lallpackage com.android.camera.one.v2.initialization;
189c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
199c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lallimport com.android.camera.CaptureModuleUtil;
206ba8eeea4758e29318c615e978c63599c30438b4Paul Rohdeimport com.android.camera.one.PreviewSizeSelector;
219c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lallimport com.android.camera.util.Size;
229c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
23d8463954727c9f8b688e69476439830cadb7b45aPuneet Lallimport java.util.ArrayList;
24d8463954727c9f8b688e69476439830cadb7b45aPuneet Lallimport java.util.Collections;
25d8463954727c9f8b688e69476439830cadb7b45aPuneet Lallimport java.util.Comparator;
26d8463954727c9f8b688e69476439830cadb7b45aPuneet Lallimport java.util.List;
27d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall
289c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall/**
29d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall * Picks a preview size. TODO Remove dependency on static CaptureModuleUtil
30d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall * function and write tests.
319c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall */
326ba8eeea4758e29318c615e978c63599c30438b4Paul Rohdeclass Camera2PreviewSizeSelector implements PreviewSizeSelector {
33d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall    private final List<Size> mSupportedPreviewSizes;
349c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
356ba8eeea4758e29318c615e978c63599c30438b4Paul Rohde    public Camera2PreviewSizeSelector(List<Size> supportedPreviewSizes) {
36d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall        mSupportedPreviewSizes = new ArrayList<>(supportedPreviewSizes);
379c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
389c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
396ba8eeea4758e29318c615e978c63599c30438b4Paul Rohde    public Size pickPreviewSize(Size pictureSize) {
409c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        if (pictureSize == null) {
419c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall            // TODO The default should be selected by the caller, and
429c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall            // pictureSize should never be null.
43d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall            pictureSize = getLargestPictureSize();
449c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        }
459c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        float pictureAspectRatio = pictureSize.getWidth() / (float) pictureSize.getHeight();
469c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
476ba8eeea4758e29318c615e978c63599c30438b4Paul Rohde        Size size = CaptureModuleUtil.getOptimalPreviewSize(
48d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall                (Size[]) mSupportedPreviewSizes.toArray(new Size[mSupportedPreviewSizes.size()]),
49d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall                pictureAspectRatio, null);
509c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall        return size;
519c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
529c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall
539c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    /**
549c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     * @return The largest supported picture size.
559c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall     */
56d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall    private Size getLargestPictureSize() {
57d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall        return Collections.max(mSupportedPreviewSizes, new Comparator<Size>() {
58d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall            @Override
59d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall            public int compare(Size size1, Size size2) {
60d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall                int area1 = size1.getWidth() * size1.getHeight();
61d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall                int area2 = size2.getWidth() * size2.getHeight();
62d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall                return Integer.compare(area1, area2);
639c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall            }
64d8463954727c9f8b688e69476439830cadb7b45aPuneet Lall        });
659c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall    }
669c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lall}
67