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