16c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin/*
26c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * Copyright (C) 2014 The Android Open Source Project
36c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin *
46c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
56c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * you may not use this file except in compliance with the License.
66c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * You may obtain a copy of the License at
76c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin *
86c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
96c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin *
106c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * Unless required by applicable law or agreed to in writing, software
116c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
126c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * See the License for the specific language governing permissions and
146c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * limitations under the License.
156c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin */
160b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinpackage android.hardware.camera2.impl;
170b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
180b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.hardware.camera2.CameraCaptureSession;
190b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.hardware.camera2.CameraDevice;
200b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.hardware.camera2.CaptureFailure;
210b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.hardware.camera2.CaptureRequest;
220b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.hardware.camera2.CaptureResult;
230b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.hardware.camera2.TotalCaptureResult;
240b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.hardware.camera2.dispatch.Dispatchable;
250b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.hardware.camera2.dispatch.MethodNameInvoker;
26ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvalaimport android.view.Surface;
270b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
280b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport static com.android.internal.util.Preconditions.*;
290b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
300b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin/**
31fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala * Proxy out invocations to the camera2 API callbacks into a {@link Dispatchable}.
320b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin *
330b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * <p>Since abstract classes do not support Java's dynamic {@code Proxy}, we have to
340b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * to use our own proxy mechanism.</p>
350b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin */
36fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvalapublic class CallbackProxies {
370b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
380b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    // TODO: replace with codegen
390b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
40fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala    public static class DeviceStateCallbackProxy extends CameraDeviceImpl.StateCallbackKK {
41fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala        private final MethodNameInvoker<CameraDeviceImpl.StateCallbackKK> mProxy;
420b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
43fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala        public DeviceStateCallbackProxy(
44fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala                Dispatchable<CameraDeviceImpl.StateCallbackKK> dispatchTarget) {
450b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
46fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala            mProxy = new MethodNameInvoker<>(dispatchTarget, CameraDeviceImpl.StateCallbackKK.class);
470b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
480b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
490b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
500b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onOpened(CameraDevice camera) {
510b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onOpened", camera);
520b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
530b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
540b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
550b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onDisconnected(CameraDevice camera) {
560b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onDisconnected", camera);
570b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
580b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
590b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
600b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onError(CameraDevice camera, int error) {
610b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onError", camera, error);
620b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
630b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
640b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
650b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onUnconfigured(CameraDevice camera) {
660b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onUnconfigured", camera);
670b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
680b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
690b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
700b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onActive(CameraDevice camera) {
710b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onActive", camera);
720b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
730b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
740b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
750b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onBusy(CameraDevice camera) {
760b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onBusy", camera);
770b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
780b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
790b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
800b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onClosed(CameraDevice camera) {
810b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onClosed", camera);
820b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
830b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
840b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
850b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onIdle(CameraDevice camera) {
860b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onIdle", camera);
870b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
880b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    }
890b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
900b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    @SuppressWarnings("deprecation")
91fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala    public static class DeviceCaptureCallbackProxy extends CameraDeviceImpl.CaptureCallback {
92fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala        private final MethodNameInvoker<CameraDeviceImpl.CaptureCallback> mProxy;
930b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
94fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala        public DeviceCaptureCallbackProxy(
95fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala                Dispatchable<CameraDeviceImpl.CaptureCallback> dispatchTarget) {
960b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
97fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala            mProxy = new MethodNameInvoker<>(dispatchTarget, CameraDeviceImpl.CaptureCallback.class);
980b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
990b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1000b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1010b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onCaptureStarted(CameraDevice camera,
102e8df3093f53fa992f89e019b2fc87ff4fac0f335Eino-Ville Talvala                CaptureRequest request, long timestamp, long frameNumber) {
103e8df3093f53fa992f89e019b2fc87ff4fac0f335Eino-Ville Talvala            mProxy.invoke("onCaptureStarted", camera, request, timestamp, frameNumber);
1040b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1050b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1060b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1070b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onCapturePartial(CameraDevice camera,
1080b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin                CaptureRequest request, CaptureResult result) {
1090b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onCapturePartial", camera, request, result);
1100b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1110b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1120b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1130b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onCaptureProgressed(CameraDevice camera,
1140b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin                CaptureRequest request, CaptureResult partialResult) {
1150b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onCaptureProgressed", camera, request, partialResult);
1160b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1170b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1180b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1190b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onCaptureCompleted(CameraDevice camera,
1200b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin                CaptureRequest request, TotalCaptureResult result) {
1210b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onCaptureCompleted", camera, request, result);
1220b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1230b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1240b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1250b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onCaptureFailed(CameraDevice camera,
1260b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin                CaptureRequest request, CaptureFailure failure) {
1270b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onCaptureFailed", camera, request, failure);
1280b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1290b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1300b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1310b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onCaptureSequenceCompleted(CameraDevice camera,
1320b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin                int sequenceId, long frameNumber) {
1330b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onCaptureSequenceCompleted", camera, sequenceId, frameNumber);
1340b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1350b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1360b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1370b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onCaptureSequenceAborted(CameraDevice camera,
1380b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin                int sequenceId) {
1390b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onCaptureSequenceAborted", camera, sequenceId);
1400b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1410b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    }
1420b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
143fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala    public static class SessionStateCallbackProxy
144fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala            extends CameraCaptureSession.StateCallback {
145fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala        private final MethodNameInvoker<CameraCaptureSession.StateCallback> mProxy;
1460b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
147fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala        public SessionStateCallbackProxy(
148fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala                Dispatchable<CameraCaptureSession.StateCallback> dispatchTarget) {
1490b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
1500b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy = new MethodNameInvoker<>(dispatchTarget,
151fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala                    CameraCaptureSession.StateCallback.class);
1520b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1530b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1540b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1550b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onConfigured(CameraCaptureSession session) {
1560b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onConfigured", session);
1570b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1580b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1590b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1600b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1610b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onConfigureFailed(CameraCaptureSession session) {
1620b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onConfigureFailed", session);
1630b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1640b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1650b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1660b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onReady(CameraCaptureSession session) {
1670b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onReady", session);
1680b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1690b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1700b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1710b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onActive(CameraCaptureSession session) {
1720b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onActive", session);
1730b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
1740b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
1750b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        @Override
1760b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        public void onClosed(CameraCaptureSession session) {
1770b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin            mProxy.invoke("onClosed", session);
1780b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        }
179ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala
180ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala        @Override
181ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala        public void onSurfacePrepared(CameraCaptureSession session, Surface surface) {
182ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala            mProxy.invoke("onSurfacePrepared", session, surface);
183ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala        }
184ad916f7fd3fbb202f2993fea04b0bdad3dcd6de6Eino-Ville Talvala
1850b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    }
1860b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin
187fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala    private CallbackProxies() {
1880b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin        throw new AssertionError();
1890b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin    }
1900b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin}
191