12d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu/* 22d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * Copyright (C) 2012 The Android Open Source Project 32d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * 42d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * Licensed under the Apache License, Version 2.0 (the "License"); 52d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * you may not use this file except in compliance with the License. 62d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * You may obtain a copy of the License at 72d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * 82d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * http://www.apache.org/licenses/LICENSE-2.0 92d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * 102d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * Unless required by applicable law or agreed to in writing, software 112d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * distributed under the License is distributed on an "AS IS" BASIS, 122d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * See the License for the specific language governing permissions and 142d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * limitations under the License. 152d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu */ 162d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu 172d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hupackage com.android.ex.camera2.portability; 182d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu 192d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Huimport android.os.Handler; 202d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu 212d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu/** 222d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * A handler for all camera api runtime exceptions. 232d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * The default behavior is to throw the runtime exception. 242d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu */ 252d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hupublic class CameraExceptionHandler { 262d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu private Handler mHandler; 272d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu 282d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu private CameraExceptionCallback mCallback = 292d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu new CameraExceptionCallback() { 302d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu @Override 31318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu public void onCameraError(int errorCode) { 32318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu } 33318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu @Override 34733ca8dfa76ac34d1f9caff8798d01a4a8f44002Senpo Hu public void onCameraException( 35733ca8dfa76ac34d1f9caff8798d01a4a8f44002Senpo Hu RuntimeException e, String commandHistory, int action, int state) { 362d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu throw e; 372d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu } 382d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu @Override 392d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu public void onDispatchThreadException(RuntimeException e) { 402d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu throw e; 412d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu } 422d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu }; 432d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu 442d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu /** 452d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * A callback helps to handle RuntimeException thrown by camera framework. 462d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu */ 472d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu public static interface CameraExceptionCallback { 48318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu public void onCameraError(int errorCode); 49733ca8dfa76ac34d1f9caff8798d01a4a8f44002Senpo Hu public void onCameraException( 50733ca8dfa76ac34d1f9caff8798d01a4a8f44002Senpo Hu RuntimeException e, String commandHistory, int action, int state); 512d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu public void onDispatchThreadException(RuntimeException e); 522d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu } 532d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu 542d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu /** 552d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * Construct a new instance of {@link CameraExceptionHandler} with a custom callback which will 562d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * be executed on a specific {@link Handler}. 572d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * 582d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * @param callback The callback which will be invoked. 592d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * @param handler The handler in which the callback will be invoked in. 602d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu */ 612d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu public CameraExceptionHandler(CameraExceptionCallback callback, Handler handler) { 622d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu mHandler = handler; 632d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu mCallback = callback; 642d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu } 652d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu 662d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu /** 672d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * Construct a new instance of {@link CameraExceptionHandler} with a default callback which will 682d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * be executed on a specific {@link Handler}. 692d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * 702d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * @param handler The handler in which the default callback will be invoked in. 712d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu */ 722d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu public CameraExceptionHandler(Handler handler) { 732d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu mHandler = handler; 742d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu } 752d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu 762d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu /** 77318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu * Invoke @{link CameraExceptionCallback} when an error is reported by Android camera framework. 78318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu * 79318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu * @param errorCode An integer to represent the error code. 80318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu * @see android.hardware.Camera#setErrorCallback(android.hardware.Camera.ErrorCallback) 81318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu */ 82318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu public void onCameraError(final int errorCode) { 83318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu mHandler.post(new Runnable() { 84318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu @Override 85318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu public void run() { 86318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu mCallback.onCameraError(errorCode); 87318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu } 88318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu }); 89318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu } 90318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu 91318eeb225f4567a8c2a6fe14baa06e8923ebe622Senpo Hu /** 922d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * Invoke @{link CameraExceptionCallback} when a runtime exception is thrown by Android camera 932d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * framework. 942d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * 952d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * @param ex The runtime exception object. 962d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu */ 97733ca8dfa76ac34d1f9caff8798d01a4a8f44002Senpo Hu public void onCameraException( 98733ca8dfa76ac34d1f9caff8798d01a4a8f44002Senpo Hu final RuntimeException ex, final String commandHistory, 99733ca8dfa76ac34d1f9caff8798d01a4a8f44002Senpo Hu final int action, final int state) { 1002d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu mHandler.post(new Runnable() { 1012d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu @Override 1022d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu public void run() { 103733ca8dfa76ac34d1f9caff8798d01a4a8f44002Senpo Hu mCallback.onCameraException(ex, commandHistory, action, state); 1042d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu } 1052d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu }); 1062d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu } 1072d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu 1082d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu /** 1092d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * Invoke @{link CameraExceptionCallback} when a runtime exception is thrown by 1102d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * @{link DispatchThread}. 1112d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * 1122d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu * @param ex The runtime exception object. 1132d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu */ 1142d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu public void onDispatchThreadException(final RuntimeException ex) { 1152d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu mHandler.post(new Runnable() { 1162d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu @Override 1172d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu public void run() { 1182d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu mCallback.onDispatchThreadException(ex); 1192d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu } 1202d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu }); 1212d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu } 1222d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu} 1232d01b8e2b5ad30ce3c442799cad4c3d26607fc6fSenpo Hu 124