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 */
16package android.hardware.camera2.impl;
17
18import android.hardware.camera2.CameraCaptureSession;
19import android.hardware.camera2.CameraDevice;
20import android.hardware.camera2.CaptureFailure;
21import android.hardware.camera2.CaptureRequest;
22import android.hardware.camera2.CaptureResult;
23import android.hardware.camera2.TotalCaptureResult;
24import android.hardware.camera2.dispatch.Dispatchable;
25import android.hardware.camera2.dispatch.MethodNameInvoker;
26import android.view.Surface;
27
28import static com.android.internal.util.Preconditions.*;
29
30/**
31 * Proxy out invocations to the camera2 API callbacks into a {@link Dispatchable}.
32 *
33 * <p>Since abstract classes do not support Java's dynamic {@code Proxy}, we have to
34 * to use our own proxy mechanism.</p>
35 */
36public class CallbackProxies {
37
38    // TODO: replace with codegen
39
40    public static class DeviceStateCallbackProxy extends CameraDeviceImpl.StateCallbackKK {
41        private final MethodNameInvoker<CameraDeviceImpl.StateCallbackKK> mProxy;
42
43        public DeviceStateCallbackProxy(
44                Dispatchable<CameraDeviceImpl.StateCallbackKK> dispatchTarget) {
45            dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
46            mProxy = new MethodNameInvoker<>(dispatchTarget, CameraDeviceImpl.StateCallbackKK.class);
47        }
48
49        @Override
50        public void onOpened(CameraDevice camera) {
51            mProxy.invoke("onOpened", camera);
52        }
53
54        @Override
55        public void onDisconnected(CameraDevice camera) {
56            mProxy.invoke("onDisconnected", camera);
57        }
58
59        @Override
60        public void onError(CameraDevice camera, int error) {
61            mProxy.invoke("onError", camera, error);
62        }
63
64        @Override
65        public void onUnconfigured(CameraDevice camera) {
66            mProxy.invoke("onUnconfigured", camera);
67        }
68
69        @Override
70        public void onActive(CameraDevice camera) {
71            mProxy.invoke("onActive", camera);
72        }
73
74        @Override
75        public void onBusy(CameraDevice camera) {
76            mProxy.invoke("onBusy", camera);
77        }
78
79        @Override
80        public void onClosed(CameraDevice camera) {
81            mProxy.invoke("onClosed", camera);
82        }
83
84        @Override
85        public void onIdle(CameraDevice camera) {
86            mProxy.invoke("onIdle", camera);
87        }
88    }
89
90    @SuppressWarnings("deprecation")
91    public static class DeviceCaptureCallbackProxy implements CameraDeviceImpl.CaptureCallback {
92        private final MethodNameInvoker<CameraDeviceImpl.CaptureCallback> mProxy;
93
94        public DeviceCaptureCallbackProxy(
95                Dispatchable<CameraDeviceImpl.CaptureCallback> dispatchTarget) {
96            dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
97            mProxy = new MethodNameInvoker<>(dispatchTarget, CameraDeviceImpl.CaptureCallback.class);
98        }
99
100        @Override
101        public void onCaptureStarted(CameraDevice camera,
102                CaptureRequest request, long timestamp, long frameNumber) {
103            mProxy.invoke("onCaptureStarted", camera, request, timestamp, frameNumber);
104        }
105
106        @Override
107        public void onCapturePartial(CameraDevice camera,
108                CaptureRequest request, CaptureResult result) {
109            mProxy.invoke("onCapturePartial", camera, request, result);
110        }
111
112        @Override
113        public void onCaptureProgressed(CameraDevice camera,
114                CaptureRequest request, CaptureResult partialResult) {
115            mProxy.invoke("onCaptureProgressed", camera, request, partialResult);
116        }
117
118        @Override
119        public void onCaptureCompleted(CameraDevice camera,
120                CaptureRequest request, TotalCaptureResult result) {
121            mProxy.invoke("onCaptureCompleted", camera, request, result);
122        }
123
124        @Override
125        public void onCaptureFailed(CameraDevice camera,
126                CaptureRequest request, CaptureFailure failure) {
127            mProxy.invoke("onCaptureFailed", camera, request, failure);
128        }
129
130        @Override
131        public void onCaptureSequenceCompleted(CameraDevice camera,
132                int sequenceId, long frameNumber) {
133            mProxy.invoke("onCaptureSequenceCompleted", camera, sequenceId, frameNumber);
134        }
135
136        @Override
137        public void onCaptureSequenceAborted(CameraDevice camera,
138                int sequenceId) {
139            mProxy.invoke("onCaptureSequenceAborted", camera, sequenceId);
140        }
141
142        @Override
143        public void onCaptureBufferLost(CameraDevice camera,
144                CaptureRequest request, Surface target, long frameNumber) {
145            mProxy.invoke("onCaptureBufferLost", camera, request, target, frameNumber);
146        }
147
148    }
149
150    public static class SessionStateCallbackProxy
151            extends CameraCaptureSession.StateCallback {
152        private final MethodNameInvoker<CameraCaptureSession.StateCallback> mProxy;
153
154        public SessionStateCallbackProxy(
155                Dispatchable<CameraCaptureSession.StateCallback> dispatchTarget) {
156            dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
157            mProxy = new MethodNameInvoker<>(dispatchTarget,
158                    CameraCaptureSession.StateCallback.class);
159        }
160
161        @Override
162        public void onConfigured(CameraCaptureSession session) {
163            mProxy.invoke("onConfigured", session);
164        }
165
166
167        @Override
168        public void onConfigureFailed(CameraCaptureSession session) {
169            mProxy.invoke("onConfigureFailed", session);
170        }
171
172        @Override
173        public void onReady(CameraCaptureSession session) {
174            mProxy.invoke("onReady", session);
175        }
176
177        @Override
178        public void onActive(CameraCaptureSession session) {
179            mProxy.invoke("onActive", session);
180        }
181
182        @Override
183        public void onCaptureQueueEmpty(CameraCaptureSession session) {
184            mProxy.invoke("onCaptureQueueEmpty", session);
185        }
186
187        @Override
188        public void onClosed(CameraCaptureSession session) {
189            mProxy.invoke("onClosed", session);
190        }
191
192        @Override
193        public void onSurfacePrepared(CameraCaptureSession session, Surface surface) {
194            mProxy.invoke("onSurfacePrepared", session, surface);
195        }
196
197    }
198
199    private CallbackProxies() {
200        throw new AssertionError();
201    }
202}
203