1 /*
2  * Copyright 2019 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 androidx.camera.integration.antelope
18 
19 import android.hardware.camera2.CameraCaptureSession
20 import android.hardware.camera2.CameraCharacteristics
21 import android.hardware.camera2.CameraDevice
22 import android.hardware.camera2.CaptureRequest
23 import android.media.ImageReader
24 import android.os.Handler
25 import android.os.HandlerThread
26 import android.util.Size
27 import androidx.camera.core.ImageCapture
28 import androidx.camera.core.Preview
29 import androidx.camera.integration.antelope.MainActivity.Companion.FIXED_FOCUS_DISTANCE
30 import androidx.camera.integration.antelope.MainActivity.Companion.INVALID_FOCAL_LENGTH
31 import androidx.camera.integration.antelope.MainActivity.Companion.NO_APERTURE
32 import androidx.camera.integration.antelope.cameracontrollers.Camera2CaptureSessionCallback
33 import androidx.camera.integration.antelope.cameracontrollers.Camera2DeviceStateCallback
34 import androidx.camera.integration.antelope.cameracontrollers.CameraState
35 import androidx.camera.integration.antelope.cameracontrollers.CameraXCaptureSessionCallback
36 import androidx.camera.integration.antelope.cameracontrollers.CameraXDeviceStateCallback
37 import androidx.camera.integration.antelope.cameracontrollers.CameraXPreviewSessionStateCallback
38 
39 /**
40  * CameraParams contains a list of device characteristics for a given camera device.
41  *
42  * These are populated on app startup using initializeCameras in CameraUtils to prevent multiple
43  * calls to the CameraManager.
44  *
45  * In addition, some convenience variables for camera API callbacks, UI surfaces, and ImageReaders
46  * are included to facilitate testing. The calling Activity is responsible to make sure these
47  * convenience variables are coordinated with the active camera device.
48  */
49 class CameraParams {
50     // Intrinsic device characteristics
51     internal var id: String = ""
52     internal var device: CameraDevice? = null
53     internal var isFront: Boolean = false
54     internal var isExternal: Boolean = false
55     internal var hasFlash: Boolean = false
56     internal var hasMulti: Boolean = false
57     internal var hasManualControl: Boolean = false
58     internal var physicalCameras: Set<String> = HashSet<String>()
59     internal var focalLengths: FloatArray = FloatArray(0)
60     internal var apertures: FloatArray = FloatArray(0)
61     internal var smallestFocalLength: Float = INVALID_FOCAL_LENGTH
62     internal var minDeltaFromNormal: Float = INVALID_FOCAL_LENGTH
63     internal var minFocusDistance: Float = FIXED_FOCUS_DISTANCE
64     internal var largestAperture: Float = NO_APERTURE
65     internal var effects: IntArray = IntArray(0)
66     internal var hasSepia: Boolean = false
67     internal var hasMono: Boolean = false
68     internal var hasAF: Boolean = false
69     internal var megapixels: Int = 0
70     internal var isLegacy: Boolean = false
71     internal var cam1AFSupported: Boolean = false
72     internal var characteristics: CameraCharacteristics? = null
73 
74     // Camera1/Camera2 min/max size (sometimes different for some devices)
75     internal var cam1MinSize: Size = Size(0, 0)
76     internal var cam1MaxSize: Size = Size(0, 0)
77     internal var cam2MinSize: Size = Size(0, 0)
78     internal var cam2MaxSize: Size = Size(0, 0)
79 
80     // Current state
81     internal var state = CameraState.UNINITIALIZED
82     internal var isOpen: Boolean = false
83     internal var isPreviewing: Boolean = false
84 
85     // Thread to use for this device
86     internal var backgroundThread: HandlerThread? = null
87     internal var backgroundHandler: Handler? = null
88 
89     // Convenience UI references
90     internal var imageReader: ImageReader? = null
91     internal var previewSurfaceView: AutoFitSurfaceView? = null
92     internal var cameraXPreviewTexture: AutoFitTextureView? = null
93 
94     // Camera 2 API callback references
95     internal var captureRequestBuilder: CaptureRequest.Builder? = null
96 
97     internal var camera2CaptureSession: CameraCaptureSession? = null
98     internal var camera2CaptureSessionCallback: Camera2CaptureSessionCallback? = null
99     internal var camera2DeviceStateCallback: Camera2DeviceStateCallback? = null
100     internal var imageAvailableListener: ImageAvailableListener? = null
101 
102     // Camera X
103     internal var cameraXDeviceStateCallback: CameraXDeviceStateCallback? = null
104     internal var cameraXPreviewSessionStateCallback: CameraXPreviewSessionStateCallback? = null
105     internal var cameraXCaptureSessionCallback: CameraXCaptureSessionCallback? = null
106     internal var cameraXPreviewBuilder: Preview.Builder = Preview.Builder()
107     internal var cameraXCaptureBuilder: ImageCapture.Builder = ImageCapture.Builder()
108 
109     // Custom lifecycle for CameraX API
110     internal var cameraXLifecycle: CustomLifecycle = CustomLifecycle()
111     internal var cameraXImageCaptureUseCase: ImageCapture = ImageCapture.Builder().build()
112 
113     // Testing variables
114     internal var timer: CameraTimer = CameraTimer()
115     internal var autoFocusStuckCounter = 0
116 }
117