1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.camera.one.v1;
18 
19 import android.graphics.Rect;
20 import android.hardware.Camera;
21 
22 import com.android.camera.one.OneCamera;
23 import com.android.camera.one.OneCamera.Facing;
24 import com.android.camera.one.OneCameraCharacteristics;
25 import com.android.camera.ui.focus.LensRangeCalculator;
26 import com.android.camera.ui.motion.LinearScale;
27 import com.android.camera.util.ApiHelper;
28 import com.android.camera.util.Size;
29 
30 import java.util.ArrayList;
31 import java.util.List;
32 
33 /**
34  * Describes a OneCamera device which is on top of camera1 API.
35  */
36 public class OneCameraCharacteristicsImpl implements OneCameraCharacteristics {
37     private final Camera.CameraInfo mCameraInfo;
38     private final Camera.Parameters mCameraParameters;
39 
40     /** The supported picture sizes. */
41     private final ArrayList<Size> mSupportedPictureSizes = new ArrayList<Size>();
42 
43     /** The supported preview sizes. */
44     private final ArrayList<Size> mSupportedPreviewSizes = new ArrayList<Size>();
45 
OneCameraCharacteristicsImpl( Camera.CameraInfo cameraInfo, Camera.Parameters cameraParameters)46     public OneCameraCharacteristicsImpl(
47             Camera.CameraInfo cameraInfo, Camera.Parameters cameraParameters) {
48         mCameraInfo = cameraInfo;
49         mCameraParameters = cameraParameters;
50 
51         List<Camera.Size> supportedPictureSizes = cameraParameters.getSupportedPictureSizes();
52         if (supportedPictureSizes != null) {
53             for (Camera.Size pictureSize : supportedPictureSizes) {
54                 mSupportedPictureSizes.add(new Size(pictureSize));
55             }
56         }
57 
58         List<Camera.Size> supportedPreviewSizes = cameraParameters.getSupportedPreviewSizes();
59         if (supportedPreviewSizes != null) {
60             for (Camera.Size previewSize : supportedPreviewSizes) {
61                 mSupportedPreviewSizes.add(new Size(previewSize));
62             }
63         }
64     }
65 
66     @Override
getSupportedPictureSizes(int imageFormat)67     public List<Size> getSupportedPictureSizes(int imageFormat) {
68         return mSupportedPictureSizes;
69     }
70 
71     @Override
getSupportedPreviewSizes()72     public List<Size> getSupportedPreviewSizes() {
73         return mSupportedPreviewSizes;
74     }
75 
76     @Override
getSensorOrientation()77     public int getSensorOrientation() {
78         return mCameraInfo.orientation;
79     }
80 
81     @Override
getCameraDirection()82     public OneCamera.Facing getCameraDirection() {
83         int direction = mCameraInfo.facing;
84         if (direction == Camera.CameraInfo.CAMERA_FACING_BACK) {
85             return OneCamera.Facing.BACK;
86         } else {
87             return OneCamera.Facing.FRONT;
88         }
89     }
90 
91     @Override
getSensorInfoActiveArraySize()92     public Rect getSensorInfoActiveArraySize() {
93         throw new RuntimeException("Not implemented yet.");
94     }
95 
96     @Override
getAvailableMaxDigitalZoom()97     public float getAvailableMaxDigitalZoom() {
98         throw new RuntimeException("Not implemented yet.");
99     }
100 
101     @Override
isFlashSupported()102     public boolean isFlashSupported() {
103         return (mCameraParameters.getFlashMode() != null);
104     }
105 
106     @Override
isHdrSceneSupported()107     public boolean isHdrSceneSupported() {
108         return mCameraParameters.getSupportedSceneModes().contains(
109               Camera.Parameters.SCENE_MODE_HDR);
110     }
111 
112     @Override
getSupportedHardwareLevel()113     public SupportedHardwareLevel getSupportedHardwareLevel() {
114         throw new RuntimeException("Not implemented yet.");
115     }
116 
117     @Override
getSupportedFaceDetectModes()118     public List<FaceDetectMode> getSupportedFaceDetectModes() {
119         List<FaceDetectMode> oneModes = new ArrayList<>(1);
120         oneModes.add(FaceDetectMode.NONE);
121         return oneModes;
122     }
123 
124     @Override
getLensFocusRange()125     public LinearScale getLensFocusRange() {
126         // Diopter range is not supported on legacy camera devices.
127         return LensRangeCalculator.getNoOp();
128     }
129 
130     @Override
getAvailableFocalLengths()131     public List<Float> getAvailableFocalLengths() {
132         List<Float> list = new ArrayList<>(1);
133         list.add(mCameraParameters.getFocalLength());
134         return list;
135     }
136 
137     @Override
isExposureCompensationSupported()138     public boolean isExposureCompensationSupported() {
139         // Turn off exposure compensation for Nexus 6 on L (API level 21)
140         // because the bug in framework b/19219128.
141         if (ApiHelper.IS_NEXUS_6 && ApiHelper.isLollipop()) {
142             return false;
143         }
144         return mCameraParameters.getMinExposureCompensation() != 0 ||
145                 mCameraParameters.getMaxExposureCompensation() != 0;
146     }
147 
148     @Override
getMinExposureCompensation()149     public int getMinExposureCompensation() {
150         if (!isExposureCompensationSupported()) {
151             return -1;
152         }
153         return mCameraParameters.getMinExposureCompensation();
154     }
155 
156     @Override
getMaxExposureCompensation()157     public int getMaxExposureCompensation() {
158         if (!isExposureCompensationSupported()) {
159             return -1;
160         }
161         return mCameraParameters.getMaxExposureCompensation();
162     }
163 
164     @Override
getExposureCompensationStep()165     public float getExposureCompensationStep() {
166         if (!isExposureCompensationSupported()) {
167             return -1.0f;
168         }
169         return mCameraParameters.getExposureCompensationStep();
170     }
171 
172     @Override
isAutoFocusSupported()173     public boolean isAutoFocusSupported() {
174         // Custom AF is only supported on the back camera for legacy devices.
175         return getCameraDirection() == Facing.BACK;
176     }
177 
178     @Override
isContinuousPictureAutoFocusSupported()179     public boolean isContinuousPictureAutoFocusSupported() {
180         return getCameraDirection() == Facing.BACK;
181     }
182 
183     @Override
isAutoExposureSupported()184     public boolean isAutoExposureSupported() {
185         // Custom AE is only supported on the back camera for legacy devices.
186         return getCameraDirection() == Facing.BACK;
187     }
188 }
189