ApiHelper.java revision edc63ddadb7c256aba3c8452e419268032185ada
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; 25edc63ddadb7c256aba3c8452e419268032185adaMichael Kolbimport android.view.WindowManager; 267a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 271b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kongimport java.lang.reflect.Field; 281b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong 297a5e1e771ae58241f3a2be36f23025f282032261Owen Linpublic class ApiHelper { 303a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static interface VERSION_CODES { 313a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin // These value are copied from Build.VERSION_CODES 323a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int GINGERBREAD_MR1 = 10; 333a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int HONEYCOMB = 11; 343a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int HONEYCOMB_MR1 = 12; 353a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int HONEYCOMB_MR2 = 13; 363a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int ICE_CREAM_SANDWICH = 14; 373a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int ICE_CREAM_SANDWICH_MR1 = 15; 383a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin public static final int JELLY_BEAN = 16; 3946f9d24b8440fe790aa4bdd625dbf231b140df17Wu-cheng Li public static final int JELLY_BEAN_MR1 = 17; 403a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin } 417a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 422e1771b997ab6966411b2c612562c538ae3e325dPin Ting public static final boolean USE_888_PIXEL_FORMAT = 432e1771b997ab6966411b2c612562c538ae3e325dPin Ting Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 442e1771b997ab6966411b2c612562c538ae3e325dPin Ting 45778ec3597e00cd048224b2c393e2d925bfb27c57Yuli Huang public static final boolean ENABLE_PHOTO_EDITOR = 46778ec3597e00cd048224b2c393e2d925bfb27c57Yuli Huang Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 47778ec3597e00cd048224b2c393e2d925bfb27c57Yuli Huang 487a5e1e771ae58241f3a2be36f23025f282032261Owen Lin public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE = 497a5e1e771ae58241f3a2be36f23025f282032261Owen Lin hasField(View.class, "SYSTEM_UI_FLAG_LAYOUT_STABLE"); 507a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 517a5e1e771ae58241f3a2be36f23025f282032261Owen Lin public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_HIDE_NAVIGATION = 527a5e1e771ae58241f3a2be36f23025f282032261Owen Lin hasField(View.class, "SYSTEM_UI_FLAG_HIDE_NAVIGATION"); 537a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 54b47927b7b43679e7315e6099e0a610760320d18dOwen Lin public static final boolean HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT = 55b47927b7b43679e7315e6099e0a610760320d18dOwen Lin hasField(MediaColumns.class, "WIDTH"); 56b47927b7b43679e7315e6099e0a610760320d18dOwen Lin 5730aa92093126f00b46543ae3b5d1035a3270f240Owen Lin public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_REGION_DECODER = 583a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 5930aa92093126f00b46543ae3b5d1035a3270f240Owen Lin 60df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_FACTORY = 61df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 62df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin 636772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang public static final boolean HAS_SET_BEAM_PUSH_URIS = 646772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 656772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang 666772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang public static final boolean HAS_SET_DEFALT_BUFFER_SIZE = hasMethod( 676772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang "android.graphics.SurfaceTexture", "setDefaultBufferSize", 686772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang int.class, int.class); 696772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang 70840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang public static final boolean HAS_RELEASE_SURFACE_TEXTURE = hasMethod( 71840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang "android.graphics.SurfaceTexture", "release"); 72840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang 73211807ba43ac5a93e94130a1256cc0423fff0e37Wu-cheng Li public static final boolean HAS_SURFACE_TEXTURE = 74211807ba43ac5a93e94130a1256cc0423fff0e37Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 75211807ba43ac5a93e94130a1256cc0423fff0e37Wu-cheng Li 7604ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang public static final boolean HAS_MTP = 7704ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1; 7804ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang 79097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang public static final boolean HAS_AUTO_FOCUS_MOVE_CALLBACK = 80097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 81097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang 82a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin public static final boolean HAS_REMOTE_VIEWS_SERVICE = 83a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 84a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin 85fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin public static final boolean HAS_INTENT_EXTRA_LOCAL_ONLY = 86fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 87fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin 88b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang public static final boolean HAS_SET_SYSTEM_UI_VISIBILITY = 89b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang hasMethod(View.class, "setSystemUiVisibility", int.class); 90b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang 9181aef137fc0d841b992cc7771902458df6272954Owen Lin public static final boolean HAS_FACE_DETECTION; 9281aef137fc0d841b992cc7771902458df6272954Owen Lin static { 9381aef137fc0d841b992cc7771902458df6272954Owen Lin boolean hasFaceDetection = false; 9481aef137fc0d841b992cc7771902458df6272954Owen Lin try { 9581aef137fc0d841b992cc7771902458df6272954Owen Lin Class<?> listenerClass = Class.forName( 9681aef137fc0d841b992cc7771902458df6272954Owen Lin "android.hardware.Camera$FaceDetectionListener"); 9781aef137fc0d841b992cc7771902458df6272954Owen Lin hasFaceDetection = 9881aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.class, "setFaceDetectionListener", listenerClass) && 9981aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.class, "startFaceDetection") && 10081aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.class, "stopFaceDetection") && 10181aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.Parameters.class, "getMaxNumDetectedFaces"); 10281aef137fc0d841b992cc7771902458df6272954Owen Lin } catch (Throwable t) { 10381aef137fc0d841b992cc7771902458df6272954Owen Lin } 10481aef137fc0d841b992cc7771902458df6272954Owen Lin HAS_FACE_DETECTION = hasFaceDetection; 10581aef137fc0d841b992cc7771902458df6272954Owen Lin } 1064bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang 1078880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan public static final boolean HAS_GET_CAMERA_DISABLED = 1088880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan hasMethod(DevicePolicyManager.class, "getCameraDisabled", ComponentName.class); 1098880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan 1101b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong public static final boolean HAS_MEDIA_ACTION_SOUND = 1111b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 1121b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong 113e44b08e727a9df677b6969ff921a2392e865e8dcWu-cheng Li public static final boolean HAS_OLD_PANORAMA = 114e44b08e727a9df677b6969ff921a2392e865e8dcWu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 11580bacf0bb7db15ea21029b6ce645ec093562aa7dAhbong Chang 116a895fae285e0a163faa523c6fe6e05e0f379fe16Chih-Chung Chang public static final boolean HAS_TIME_LAPSE_RECORDING = 117a895fae285e0a163faa523c6fe6e05e0f379fe16Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 118a895fae285e0a163faa523c6fe6e05e0f379fe16Chih-Chung Chang 119d498a90641c98ab93c3b063b45274304c0f53b53Angus Kong public static final boolean HAS_ZOOM_WHEN_RECORDING = 120064c30b6c89c4282487290ea11e7d3fd1ef68c64Angus Kong Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 121064c30b6c89c4282487290ea11e7d3fd1ef68c64Angus Kong 1226c64f55edcaddd2a2677f39678830540ccea5a4fAngus Kong public static final boolean HAS_CAMERA_FOCUS_AREA = 1236c64f55edcaddd2a2677f39678830540ccea5a4fAngus Kong Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 1246c64f55edcaddd2a2677f39678830540ccea5a4fAngus Kong 12568cdf08079df14c4f121bc2bff5b65ab204e6a88Angus Kong public static final boolean HAS_CAMERA_METERING_AREA = 12668cdf08079df14c4f121bc2bff5b65ab204e6a88Angus Kong Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 12768cdf08079df14c4f121bc2bff5b65ab204e6a88Angus Kong 1284d063b338503dc81e9b16b89bc171a98b59fe6a9Pin Ting public static final boolean HAS_FINE_RESOLUTION_QUALITY_LEVELS = 1294d063b338503dc81e9b16b89bc171a98b59fe6a9Pin Ting Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 1304d063b338503dc81e9b16b89bc171a98b59fe6a9Pin Ting 131abf0ea68634c1d21870c48297ab6898491e0c56fChih-Chung Chang public static final boolean HAS_MOTION_EVENT_TRANSFORM = 132abf0ea68634c1d21870c48297ab6898491e0c56fChih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 133abf0ea68634c1d21870c48297ab6898491e0c56fChih-Chung Chang 134f6b2ec819e28d126f4ccb73d90e899e6fbed969eWu-cheng Li public static final boolean HAS_EFFECTS_RECORDING = false; 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 16838ff40dbd2103bf189b536a27194091e966d7b50John Reck public static final boolean HAS_VIEW_PROPERTY_ANIMATOR = 16938ff40dbd2103bf189b536a27194091e966d7b50John Reck Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1; 17038ff40dbd2103bf189b536a27194091e966d7b50John Reck 171b75f5defe8ace12b8b563e713f7175863ab5713dJohn Reck public static final boolean HAS_POST_ON_ANIMATION = 172b75f5defe8ace12b8b563e713f7175863ab5713dJohn Reck Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 173b75f5defe8ace12b8b563e713f7175863ab5713dJohn Reck 174fdcec9b0e2583290a9b0e40f628272944d0f2c5fDoris Liu public static final boolean HAS_ANNOUNCE_FOR_ACCESSIBILITY = 175fdcec9b0e2583290a9b0e40f628272944d0f2c5fDoris Liu Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 176fdcec9b0e2583290a9b0e40f628272944d0f2c5fDoris Liu 177b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu public static final boolean HAS_OBJECT_ANIMATION = 178b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 179b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu 1806eb33768a15e2b4cc647bc55474568cf710876dbGeorge Mount public static final boolean HAS_GLES20_REQUIRED = 1816eb33768a15e2b4cc647bc55474568cf710876dbGeorge Mount Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 1826eb33768a15e2b4cc647bc55474568cf710876dbGeorge Mount 183edc63ddadb7c256aba3c8452e419268032185adaMichael Kolb public static final boolean HAS_ROTATION_ANIMATION = 184edc63ddadb7c256aba3c8452e419268032185adaMichael Kolb hasField(WindowManager.LayoutParams.class, "rotationAnimation"); 185edc63ddadb7c256aba3c8452e419268032185adaMichael Kolb 186a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li public static int getIntFieldIfExists(Class<?> klass, String fieldName, 187a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li Class<?> obj, int defaultVal) { 188a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li try { 189a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li Field f = klass.getDeclaredField(fieldName); 190a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li return f.getInt(obj); 191a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li } catch (Exception e) { 192a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li return defaultVal; 193a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li } 194a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li } 195a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li 1967a5e1e771ae58241f3a2be36f23025f282032261Owen Lin private static boolean hasField(Class<?> klass, String fieldName) { 1977a5e1e771ae58241f3a2be36f23025f282032261Owen Lin try { 1987a5e1e771ae58241f3a2be36f23025f282032261Owen Lin klass.getDeclaredField(fieldName); 1997a5e1e771ae58241f3a2be36f23025f282032261Owen Lin return true; 2007a5e1e771ae58241f3a2be36f23025f282032261Owen Lin } catch (NoSuchFieldException e) { 2017a5e1e771ae58241f3a2be36f23025f282032261Owen Lin return false; 2027a5e1e771ae58241f3a2be36f23025f282032261Owen Lin } 2037a5e1e771ae58241f3a2be36f23025f282032261Owen Lin } 2046772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang 2056772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang private static boolean hasMethod(String className, String methodName, 2066772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang Class<?>... parameterTypes) { 2076772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang try { 208b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin Class<?> klass = Class.forName(className); 2096772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang klass.getDeclaredMethod(methodName, parameterTypes); 2106772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang return true; 2116772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang } catch (Throwable th) { 2126772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang return false; 2136772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang } 2146772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang } 215b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin 216b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin private static boolean hasMethod( 217b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin Class<?> klass, String methodName, Class<?> ... paramTypes) { 218b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin try { 219b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin klass.getDeclaredMethod(methodName, paramTypes); 220b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin return true; 221b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin } catch (NoSuchMethodException e) { 222b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin return false; 223b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin } 224b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin } 2257a5e1e771ae58241f3a2be36f23025f282032261Owen Lin} 226