10b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin/* 20b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * Copyright (C) 2014 The Android Open Source Project 30b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * 40b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 50b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * you may not use this file except in compliance with the License. 60b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * You may obtain a copy of the License at 70b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * 80b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 90b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * 100b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * Unless required by applicable law or agreed to in writing, software 110b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 120b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * See the License for the specific language governing permissions and 140b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin * limitations under the License. 150b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin */ 160b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinpackage android.hardware.camera2.dispatch; 170b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 180b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.hardware.camera2.utils.UncheckedThrow; 190b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport android.util.Log; 200b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 210b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport java.lang.reflect.InvocationTargetException; 220b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport java.lang.reflect.Method; 230b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 240b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinimport static com.android.internal.util.Preconditions.*; 250b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 260b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 270b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkinpublic class InvokeDispatcher<T> implements Dispatchable<T> { 280b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 290b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin private static final String TAG = "InvocationSink"; 300b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin private final T mTarget; 310b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 320b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin public InvokeDispatcher(T target) { 330b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin mTarget = checkNotNull(target, "target must not be null"); 340b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin } 350b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 360b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin @Override 370b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin public Object dispatch(Method method, Object[] args) { 380b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin try { 390b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin return method.invoke(mTarget, args); 400b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin } catch (InvocationTargetException e) { 410b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin Throwable t = e.getTargetException(); 420b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin // Potential UB. Hopefully 't' is a runtime exception. 430b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin UncheckedThrow.throwAnyException(t); 440b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin } catch (IllegalAccessException e) { 450b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin // Impossible 460b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin Log.wtf(TAG, "IllegalAccessException while invoking " + method, e); 470b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin } catch (IllegalArgumentException e) { 480b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin // Impossible 490b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin Log.wtf(TAG, "IllegalArgumentException while invoking " + method, e); 500b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin } 510b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin 520b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin // unreachable 530b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin return null; 540b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin } 550b27d3453d5e257594792e9177c5fedb1bc6f9e9Igor Murashkin} 56