ApiHelper.java revision 62e8403c69f4a82a4023651499a88f15eaa47fa5
17a5e1e771ae58241f3a2be36f23025f282032261Owen Lin/* 27a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * Copyright (C) 2012 The Android Open Source Project 37a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * 47a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 57a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * you may not use this file except in compliance with the License. 67a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * You may obtain a copy of the License at 77a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * 87a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 97a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * 107a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * Unless required by applicable law or agreed to in writing, software 117a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 127a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * See the License for the specific language governing permissions and 147a5e1e771ae58241f3a2be36f23025f282032261Owen Lin * limitations under the License. 157a5e1e771ae58241f3a2be36f23025f282032261Owen Lin */ 167a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 177a5e1e771ae58241f3a2be36f23025f282032261Owen Linpackage com.android.gallery3d.common; 187a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 198880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyanimport android.app.admin.DevicePolicyManager; 208880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyanimport android.content.ComponentName; 214bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Changimport android.hardware.Camera; 2230aa92093126f00b46543ae3b5d1035a3270f240Owen Linimport android.os.Build; 23b47927b7b43679e7315e6099e0a610760320d18dOwen Linimport android.provider.MediaStore.MediaColumns; 247a5e1e771ae58241f3a2be36f23025f282032261Owen Linimport android.view.View; 257a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 261b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kongimport java.lang.reflect.Field; 271b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong 287a5e1e771ae58241f3a2be36f23025f282032261Owen Linpublic class ApiHelper { 293a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static interface VERSION_CODES { 303a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin // These value are copied from Build.VERSION_CODES 313a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int GINGERBREAD_MR1 = 10; 323a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int HONEYCOMB = 11; 333a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int HONEYCOMB_MR1 = 12; 343a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int HONEYCOMB_MR2 = 13; 353a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int ICE_CREAM_SANDWICH = 14; 363a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int ICE_CREAM_SANDWICH_MR1 = 15; 373a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int JELLY_BEAN = 16; 3846f9d24b8440fe790aa4bdd625dbf231b140df17Wu-cheng Li public static final int JELLY_BEAN_MR1 = 17; 393a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin } 407a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 412e1771b997ab6966411b2c612562c538ae3e325dPin Ting public static final boolean USE_888_PIXEL_FORMAT = 422e1771b997ab6966411b2c612562c538ae3e325dPin Ting Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 432e1771b997ab6966411b2c612562c538ae3e325dPin Ting 44778ec3597e00cd048224b2c393e2d925bfb27c57Yuli Huang public static final boolean ENABLE_PHOTO_EDITOR = 45778ec3597e00cd048224b2c393e2d925bfb27c57Yuli Huang Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 46778ec3597e00cd048224b2c393e2d925bfb27c57Yuli Huang 477a5e1e771ae58241f3a2be36f23025f282032261Owen Lin public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE = 487a5e1e771ae58241f3a2be36f23025f282032261Owen Lin hasField(View.class, "SYSTEM_UI_FLAG_LAYOUT_STABLE"); 497a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 507a5e1e771ae58241f3a2be36f23025f282032261Owen Lin public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_HIDE_NAVIGATION = 517a5e1e771ae58241f3a2be36f23025f282032261Owen Lin hasField(View.class, "SYSTEM_UI_FLAG_HIDE_NAVIGATION"); 527a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 53b47927b7b43679e7315e6099e0a610760320d18dOwen Lin public static final boolean HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT = 54b47927b7b43679e7315e6099e0a610760320d18dOwen Lin hasField(MediaColumns.class, "WIDTH"); 55b47927b7b43679e7315e6099e0a610760320d18dOwen Lin 5630aa92093126f00b46543ae3b5d1035a3270f240Owen Lin public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_REGION_DECODER = 573a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 5830aa92093126f00b46543ae3b5d1035a3270f240Owen Lin 59df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_FACTORY = 60df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 61df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin 626772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang public static final boolean HAS_SET_BEAM_PUSH_URIS = 636772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 646772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang 656772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang public static final boolean HAS_SET_DEFALT_BUFFER_SIZE = hasMethod( 666772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang "android.graphics.SurfaceTexture", "setDefaultBufferSize", 676772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang int.class, int.class); 686772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang 69840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang public static final boolean HAS_RELEASE_SURFACE_TEXTURE = hasMethod( 70840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang "android.graphics.SurfaceTexture", "release"); 71840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang 72211807ba43ac5a93e94130a1256cc0423fff0e37Wu-cheng Li public static final boolean HAS_SURFACE_TEXTURE = 73211807ba43ac5a93e94130a1256cc0423fff0e37Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 74211807ba43ac5a93e94130a1256cc0423fff0e37Wu-cheng Li 7504ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang public static final boolean HAS_MTP = 7604ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1; 7704ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang 78097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang public static final boolean HAS_AUTO_FOCUS_MOVE_CALLBACK = 79097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 80097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang 81a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin public static final boolean HAS_REMOTE_VIEWS_SERVICE = 82a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 83a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin 84fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin public static final boolean HAS_INTENT_EXTRA_LOCAL_ONLY = 85fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 86fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin 87b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang public static final boolean HAS_SET_SYSTEM_UI_VISIBILITY = 88b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang hasMethod(View.class, "setSystemUiVisibility", int.class); 89b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang 9081aef137fc0d841b992cc7771902458df6272954Owen Lin public static final boolean HAS_FACE_DETECTION; 9181aef137fc0d841b992cc7771902458df6272954Owen Lin static { 9281aef137fc0d841b992cc7771902458df6272954Owen Lin boolean hasFaceDetection = false; 9381aef137fc0d841b992cc7771902458df6272954Owen Lin try { 9481aef137fc0d841b992cc7771902458df6272954Owen Lin Class<?> listenerClass = Class.forName( 9581aef137fc0d841b992cc7771902458df6272954Owen Lin "android.hardware.Camera$FaceDetectionListener"); 9681aef137fc0d841b992cc7771902458df6272954Owen Lin hasFaceDetection = 9781aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.class, "setFaceDetectionListener", listenerClass) && 9881aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.class, "startFaceDetection") && 9981aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.class, "stopFaceDetection") && 10081aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.Parameters.class, "getMaxNumDetectedFaces"); 10181aef137fc0d841b992cc7771902458df6272954Owen Lin } catch (Throwable t) { 10281aef137fc0d841b992cc7771902458df6272954Owen Lin } 10381aef137fc0d841b992cc7771902458df6272954Owen Lin HAS_FACE_DETECTION = hasFaceDetection; 10481aef137fc0d841b992cc7771902458df6272954Owen Lin } 1054bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang 1068880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan public static final boolean HAS_GET_CAMERA_DISABLED = 1078880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan hasMethod(DevicePolicyManager.class, "getCameraDisabled", ComponentName.class); 1088880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan 1091b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong public static final boolean HAS_MEDIA_ACTION_SOUND = 1101b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 1111b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong 112e44b08e727a9df677b6969ff921a2392e865e8dcWu-cheng Li public static final boolean HAS_OLD_PANORAMA = 113e44b08e727a9df677b6969ff921a2392e865e8dcWu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 11480bacf0bb7db15ea21029b6ce645ec093562aa7dAhbong Chang 115a895fae285e0a163faa523c6fe6e05e0f379fe16Chih-Chung Chang public static final boolean HAS_TIME_LAPSE_RECORDING = 116a895fae285e0a163faa523c6fe6e05e0f379fe16Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 117a895fae285e0a163faa523c6fe6e05e0f379fe16Chih-Chung Chang 118d498a90641c98ab93c3b063b45274304c0f53b53Angus Kong public static final boolean HAS_ZOOM_WHEN_RECORDING = 119064c30b6c89c4282487290ea11e7d3fd1ef68c64Angus Kong Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 120064c30b6c89c4282487290ea11e7d3fd1ef68c64Angus Kong 1216c64f55edcaddd2a2677f39678830540ccea5a4fAngus Kong public static final boolean HAS_CAMERA_FOCUS_AREA = 1226c64f55edcaddd2a2677f39678830540ccea5a4fAngus Kong Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 1236c64f55edcaddd2a2677f39678830540ccea5a4fAngus Kong 12468cdf08079df14c4f121bc2bff5b65ab204e6a88Angus Kong public static final boolean HAS_CAMERA_METERING_AREA = 12568cdf08079df14c4f121bc2bff5b65ab204e6a88Angus Kong Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 12668cdf08079df14c4f121bc2bff5b65ab204e6a88Angus Kong 1274d063b338503dc81e9b16b89bc171a98b59fe6a9Pin Ting public static final boolean HAS_FINE_RESOLUTION_QUALITY_LEVELS = 1284d063b338503dc81e9b16b89bc171a98b59fe6a9Pin Ting Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 1294d063b338503dc81e9b16b89bc171a98b59fe6a9Pin Ting 130abf0ea68634c1d21870c48297ab6898491e0c56fChih-Chung Chang public static final boolean HAS_MOTION_EVENT_TRANSFORM = 131abf0ea68634c1d21870c48297ab6898491e0c56fChih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 132abf0ea68634c1d21870c48297ab6898491e0c56fChih-Chung Chang 13303f6fce66de39b3578ac036557c1ec1aed729f61Pin Ting public static final boolean HAS_EFFECTS_RECORDING = 13403f6fce66de39b3578ac036557c1ec1aed729f61Pin Ting Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 13528038df8ccc1422541276974e9cf140fd4b76f1ePin Ting 13662e8403c69f4a82a4023651499a88f15eaa47fa5Wu-cheng Li // "Background" filter does not have "context" input port in jelly bean. 13762e8403c69f4a82a4023651499a88f15eaa47fa5Wu-cheng Li public static final boolean HAS_EFFECTS_RECORDING_CONTEXT_INPUT = 13862e8403c69f4a82a4023651499a88f15eaa47fa5Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1; 13962e8403c69f4a82a4023651499a88f15eaa47fa5Wu-cheng Li 140910935b67775d03def8769884bbac910892b6e24Pin Ting public static final boolean HAS_GET_SUPPORTED_VIDEO_SIZE = 141910935b67775d03def8769884bbac910892b6e24Pin Ting Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 142910935b67775d03def8769884bbac910892b6e24Pin Ting 143840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang public static final boolean HAS_SET_ICON_ATTRIBUTE = 144840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 145840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang 14690df352389eda7c964e6a43a0b752d27f16e02a7Owen Lin public static final boolean HAS_MEDIA_PROVIDER_FILES_TABLE = 14790df352389eda7c964e6a43a0b752d27f16e02a7Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 14890df352389eda7c964e6a43a0b752d27f16e02a7Owen Lin 1494e9b8e44bfe9c15e80ed60ce1b99520ed72ce764Angus Kong public static final boolean HAS_SURFACE_TEXTURE_RECORDING = 1504e9b8e44bfe9c15e80ed60ce1b99520ed72ce764Angus Kong Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 151d84941f0649c751c0cc5fd2f6b233380e878ca26Owen Lin 152d84941f0649c751c0cc5fd2f6b233380e878ca26Owen Lin public static final boolean HAS_ACTION_BAR = 153d84941f0649c751c0cc5fd2f6b233380e878ca26Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 154d84941f0649c751c0cc5fd2f6b233380e878ca26Owen Lin 155d41a508729ee04d0aab00c192c40570353b240d9Wu-cheng Li // Ex: View.setTranslationX. 156d41a508729ee04d0aab00c192c40570353b240d9Wu-cheng Li public static final boolean HAS_VIEW_TRANSFORM_PROPERTIES = 157d41a508729ee04d0aab00c192c40570353b240d9Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 158d41a508729ee04d0aab00c192c40570353b240d9Wu-cheng Li 15946f9d24b8440fe790aa4bdd625dbf231b140df17Wu-cheng Li public static final boolean HAS_CAMERA_HDR = 16046f9d24b8440fe790aa4bdd625dbf231b140df17Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1; 16146f9d24b8440fe790aa4bdd625dbf231b140df17Wu-cheng Li 162a625b6562d3bfc86465778b336c96fb42064be21Owen Lin public static final boolean HAS_OPTIONS_IN_MUTABLE = 163a625b6562d3bfc86465778b336c96fb42064be21Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 164a625b6562d3bfc86465778b336c96fb42064be21Owen Lin 165a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li public static final boolean CAN_START_PREVIEW_IN_JPEG_CALLBACK = 166a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 167a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li 1683f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu public static final boolean HAS_MEDIA_MUXER = 16915ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 1703f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 171a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li public static int getIntFieldIfExists(Class<?> klass, String fieldName, 172a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li Class<?> obj, int defaultVal) { 173a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li try { 174a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li Field f = klass.getDeclaredField(fieldName); 175a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li return f.getInt(obj); 176a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li } catch (Exception e) { 177a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li return defaultVal; 178a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li } 179a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li } 180a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li 1817a5e1e771ae58241f3a2be36f23025f282032261Owen Lin private static boolean hasField(Class<?> klass, String fieldName) { 1827a5e1e771ae58241f3a2be36f23025f282032261Owen Lin try { 1837a5e1e771ae58241f3a2be36f23025f282032261Owen Lin klass.getDeclaredField(fieldName); 1847a5e1e771ae58241f3a2be36f23025f282032261Owen Lin return true; 1857a5e1e771ae58241f3a2be36f23025f282032261Owen Lin } catch (NoSuchFieldException e) { 1867a5e1e771ae58241f3a2be36f23025f282032261Owen Lin return false; 1877a5e1e771ae58241f3a2be36f23025f282032261Owen Lin } 1887a5e1e771ae58241f3a2be36f23025f282032261Owen Lin } 1896772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang 1906772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang private static boolean hasMethod(String className, String methodName, 1916772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang Class<?>... parameterTypes) { 1926772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang try { 193b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin Class<?> klass = Class.forName(className); 1946772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang klass.getDeclaredMethod(methodName, parameterTypes); 1956772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang return true; 1966772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang } catch (Throwable th) { 1976772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang return false; 1986772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang } 1996772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang } 200b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin 201b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin private static boolean hasMethod( 202b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin Class<?> klass, String methodName, Class<?> ... paramTypes) { 203b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin try { 204b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin klass.getDeclaredMethod(methodName, paramTypes); 205b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin return true; 206b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin } catch (NoSuchMethodException e) { 207b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin return false; 208b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin } 209b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin } 2107a5e1e771ae58241f3a2be36f23025f282032261Owen Lin} 211