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; 408b9de91b3c01664b24deda202acb5db8594db503ztenghui public static final int JELLY_BEAN_MR2 = 18; 413a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin } 427a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 43fb6132b0b3079153fd1d15acf1dc3c6100aa2e00Bobby Georgescu public static final boolean AT_LEAST_16 = Build.VERSION.SDK_INT >= 16; 44fb6132b0b3079153fd1d15acf1dc3c6100aa2e00Bobby Georgescu 452e1771b997ab6966411b2c612562c538ae3e325dPin Ting public static final boolean USE_888_PIXEL_FORMAT = 462e1771b997ab6966411b2c612562c538ae3e325dPin Ting Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 472e1771b997ab6966411b2c612562c538ae3e325dPin Ting 48778ec3597e00cd048224b2c393e2d925bfb27c57Yuli Huang public static final boolean ENABLE_PHOTO_EDITOR = 49778ec3597e00cd048224b2c393e2d925bfb27c57Yuli Huang Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 50778ec3597e00cd048224b2c393e2d925bfb27c57Yuli Huang 517a5e1e771ae58241f3a2be36f23025f282032261Owen Lin public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE = 527a5e1e771ae58241f3a2be36f23025f282032261Owen Lin hasField(View.class, "SYSTEM_UI_FLAG_LAYOUT_STABLE"); 537a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 547a5e1e771ae58241f3a2be36f23025f282032261Owen Lin public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_HIDE_NAVIGATION = 557a5e1e771ae58241f3a2be36f23025f282032261Owen Lin hasField(View.class, "SYSTEM_UI_FLAG_HIDE_NAVIGATION"); 567a5e1e771ae58241f3a2be36f23025f282032261Owen Lin 57b47927b7b43679e7315e6099e0a610760320d18dOwen Lin public static final boolean HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT = 58b47927b7b43679e7315e6099e0a610760320d18dOwen Lin hasField(MediaColumns.class, "WIDTH"); 59b47927b7b43679e7315e6099e0a610760320d18dOwen Lin 6030aa92093126f00b46543ae3b5d1035a3270f240Owen Lin public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_REGION_DECODER = 613a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 6230aa92093126f00b46543ae3b5d1035a3270f240Owen Lin 63df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_FACTORY = 64df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 65df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin 666772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang public static final boolean HAS_SET_BEAM_PUSH_URIS = 676772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 686772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang 696772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang public static final boolean HAS_SET_DEFALT_BUFFER_SIZE = hasMethod( 706772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang "android.graphics.SurfaceTexture", "setDefaultBufferSize", 716772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang int.class, int.class); 726772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang 73840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang public static final boolean HAS_RELEASE_SURFACE_TEXTURE = hasMethod( 74840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang "android.graphics.SurfaceTexture", "release"); 75840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang 76211807ba43ac5a93e94130a1256cc0423fff0e37Wu-cheng Li public static final boolean HAS_SURFACE_TEXTURE = 77211807ba43ac5a93e94130a1256cc0423fff0e37Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 78211807ba43ac5a93e94130a1256cc0423fff0e37Wu-cheng Li 7904ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang public static final boolean HAS_MTP = 8004ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1; 8104ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang 82097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang public static final boolean HAS_AUTO_FOCUS_MOVE_CALLBACK = 83097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 84097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang 85a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin public static final boolean HAS_REMOTE_VIEWS_SERVICE = 86a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 87a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin 88fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin public static final boolean HAS_INTENT_EXTRA_LOCAL_ONLY = 89fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 90fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin 91b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang public static final boolean HAS_SET_SYSTEM_UI_VISIBILITY = 92b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang hasMethod(View.class, "setSystemUiVisibility", int.class); 93b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang 9481aef137fc0d841b992cc7771902458df6272954Owen Lin public static final boolean HAS_FACE_DETECTION; 9581aef137fc0d841b992cc7771902458df6272954Owen Lin static { 9681aef137fc0d841b992cc7771902458df6272954Owen Lin boolean hasFaceDetection = false; 9781aef137fc0d841b992cc7771902458df6272954Owen Lin try { 9881aef137fc0d841b992cc7771902458df6272954Owen Lin Class<?> listenerClass = Class.forName( 9981aef137fc0d841b992cc7771902458df6272954Owen Lin "android.hardware.Camera$FaceDetectionListener"); 10081aef137fc0d841b992cc7771902458df6272954Owen Lin hasFaceDetection = 10181aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.class, "setFaceDetectionListener", listenerClass) && 10281aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.class, "startFaceDetection") && 10381aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.class, "stopFaceDetection") && 10481aef137fc0d841b992cc7771902458df6272954Owen Lin hasMethod(Camera.Parameters.class, "getMaxNumDetectedFaces"); 10581aef137fc0d841b992cc7771902458df6272954Owen Lin } catch (Throwable t) { 10681aef137fc0d841b992cc7771902458df6272954Owen Lin } 10781aef137fc0d841b992cc7771902458df6272954Owen Lin HAS_FACE_DETECTION = hasFaceDetection; 10881aef137fc0d841b992cc7771902458df6272954Owen Lin } 1094bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang 1108880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan public static final boolean HAS_GET_CAMERA_DISABLED = 1118880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan hasMethod(DevicePolicyManager.class, "getCameraDisabled", ComponentName.class); 1128880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan 1131b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong public static final boolean HAS_MEDIA_ACTION_SOUND = 1141b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 1151b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong 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 128abf0ea68634c1d21870c48297ab6898491e0c56fChih-Chung Chang public static final boolean HAS_MOTION_EVENT_TRANSFORM = 129abf0ea68634c1d21870c48297ab6898491e0c56fChih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 130abf0ea68634c1d21870c48297ab6898491e0c56fChih-Chung Chang 131f6b2ec819e28d126f4ccb73d90e899e6fbed969eWu-cheng Li public static final boolean HAS_EFFECTS_RECORDING = false; 13228038df8ccc1422541276974e9cf140fd4b76f1ePin Ting 13362e8403c69f4a82a4023651499a88f15eaa47fa5Wu-cheng Li // "Background" filter does not have "context" input port in jelly bean. 13462e8403c69f4a82a4023651499a88f15eaa47fa5Wu-cheng Li public static final boolean HAS_EFFECTS_RECORDING_CONTEXT_INPUT = 13562e8403c69f4a82a4023651499a88f15eaa47fa5Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1; 13662e8403c69f4a82a4023651499a88f15eaa47fa5Wu-cheng Li 137910935b67775d03def8769884bbac910892b6e24Pin Ting public static final boolean HAS_GET_SUPPORTED_VIDEO_SIZE = 138910935b67775d03def8769884bbac910892b6e24Pin Ting Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 139910935b67775d03def8769884bbac910892b6e24Pin Ting 140840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang public static final boolean HAS_SET_ICON_ATTRIBUTE = 141840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 142840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang 14390df352389eda7c964e6a43a0b752d27f16e02a7Owen Lin public static final boolean HAS_MEDIA_PROVIDER_FILES_TABLE = 14490df352389eda7c964e6a43a0b752d27f16e02a7Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 14590df352389eda7c964e6a43a0b752d27f16e02a7Owen Lin 1464e9b8e44bfe9c15e80ed60ce1b99520ed72ce764Angus Kong public static final boolean HAS_SURFACE_TEXTURE_RECORDING = 1474e9b8e44bfe9c15e80ed60ce1b99520ed72ce764Angus Kong Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 148d84941f0649c751c0cc5fd2f6b233380e878ca26Owen Lin 149d84941f0649c751c0cc5fd2f6b233380e878ca26Owen Lin public static final boolean HAS_ACTION_BAR = 150d84941f0649c751c0cc5fd2f6b233380e878ca26Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 151d84941f0649c751c0cc5fd2f6b233380e878ca26Owen Lin 152d41a508729ee04d0aab00c192c40570353b240d9Wu-cheng Li // Ex: View.setTranslationX. 153d41a508729ee04d0aab00c192c40570353b240d9Wu-cheng Li public static final boolean HAS_VIEW_TRANSFORM_PROPERTIES = 154d41a508729ee04d0aab00c192c40570353b240d9Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 155d41a508729ee04d0aab00c192c40570353b240d9Wu-cheng Li 15646f9d24b8440fe790aa4bdd625dbf231b140df17Wu-cheng Li public static final boolean HAS_CAMERA_HDR = 15746f9d24b8440fe790aa4bdd625dbf231b140df17Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1; 15846f9d24b8440fe790aa4bdd625dbf231b140df17Wu-cheng Li 159a625b6562d3bfc86465778b336c96fb42064be21Owen Lin public static final boolean HAS_OPTIONS_IN_MUTABLE = 160a625b6562d3bfc86465778b336c96fb42064be21Owen Lin Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 161a625b6562d3bfc86465778b336c96fb42064be21Owen Lin 162a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li public static final boolean CAN_START_PREVIEW_IN_JPEG_CALLBACK = 163a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH; 164a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li 16538ff40dbd2103bf189b536a27194091e966d7b50John Reck public static final boolean HAS_VIEW_PROPERTY_ANIMATOR = 16638ff40dbd2103bf189b536a27194091e966d7b50John Reck Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1; 16738ff40dbd2103bf189b536a27194091e966d7b50John Reck 168b75f5defe8ace12b8b563e713f7175863ab5713dJohn Reck public static final boolean HAS_POST_ON_ANIMATION = 169b75f5defe8ace12b8b563e713f7175863ab5713dJohn Reck Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 170b75f5defe8ace12b8b563e713f7175863ab5713dJohn Reck 171fdcec9b0e2583290a9b0e40f628272944d0f2c5fDoris Liu public static final boolean HAS_ANNOUNCE_FOR_ACCESSIBILITY = 172fdcec9b0e2583290a9b0e40f628272944d0f2c5fDoris Liu Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 173fdcec9b0e2583290a9b0e40f628272944d0f2c5fDoris Liu 174b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu public static final boolean HAS_OBJECT_ANIMATION = 175b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 176b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu 1776eb33768a15e2b4cc647bc55474568cf710876dbGeorge Mount public static final boolean HAS_GLES20_REQUIRED = 1786eb33768a15e2b4cc647bc55474568cf710876dbGeorge Mount Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB; 1796eb33768a15e2b4cc647bc55474568cf710876dbGeorge Mount 180edc63ddadb7c256aba3c8452e419268032185adaMichael Kolb public static final boolean HAS_ROTATION_ANIMATION = 181edc63ddadb7c256aba3c8452e419268032185adaMichael Kolb hasField(WindowManager.LayoutParams.class, "rotationAnimation"); 182edc63ddadb7c256aba3c8452e419268032185adaMichael Kolb 18372d611a96c9c0458b3d8a41cd9b9b19a6ca061aeMichael Kolb public static final boolean HAS_ORIENTATION_LOCK = 18472d611a96c9c0458b3d8a41cd9b9b19a6ca061aeMichael Kolb Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2; 18572d611a96c9c0458b3d8a41cd9b9b19a6ca061aeMichael Kolb 186091314b7ea73e774ce96c981bd7007c94ad80e30George Mount public static final boolean HAS_CANCELLATION_SIGNAL = 187091314b7ea73e774ce96c981bd7007c94ad80e30George Mount Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN; 188091314b7ea73e774ce96c981bd7007c94ad80e30George Mount 1898b9de91b3c01664b24deda202acb5db8594db503ztenghui public static final boolean HAS_MEDIA_MUXER = 1908b9de91b3c01664b24deda202acb5db8594db503ztenghui Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2; 1918b9de91b3c01664b24deda202acb5db8594db503ztenghui 1925a6cbd17a335361ae9c71a1356ea8c956f1353fbDoris Liu public static final boolean HAS_DISPLAY_LISTENER = 1935a6cbd17a335361ae9c71a1356ea8c956f1353fbDoris Liu Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1; 1945a6cbd17a335361ae9c71a1356ea8c956f1353fbDoris Liu 195a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li public static int getIntFieldIfExists(Class<?> klass, String fieldName, 196a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li Class<?> obj, int defaultVal) { 197a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li try { 198a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li Field f = klass.getDeclaredField(fieldName); 199a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li return f.getInt(obj); 200a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li } catch (Exception e) { 201a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li return defaultVal; 202a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li } 203a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li } 204a31da5858f1f7c4f3351d5e83cd63724e09f9e19Wu-cheng Li 2057a5e1e771ae58241f3a2be36f23025f282032261Owen Lin private static boolean hasField(Class<?> klass, String fieldName) { 2067a5e1e771ae58241f3a2be36f23025f282032261Owen Lin try { 2077a5e1e771ae58241f3a2be36f23025f282032261Owen Lin klass.getDeclaredField(fieldName); 2087a5e1e771ae58241f3a2be36f23025f282032261Owen Lin return true; 2097a5e1e771ae58241f3a2be36f23025f282032261Owen Lin } catch (NoSuchFieldException e) { 2107a5e1e771ae58241f3a2be36f23025f282032261Owen Lin return false; 2117a5e1e771ae58241f3a2be36f23025f282032261Owen Lin } 2127a5e1e771ae58241f3a2be36f23025f282032261Owen Lin } 2136772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang 2146772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang private static boolean hasMethod(String className, String methodName, 2156772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang Class<?>... parameterTypes) { 2166772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang try { 217b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin Class<?> klass = Class.forName(className); 2186772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang klass.getDeclaredMethod(methodName, parameterTypes); 2196772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang return true; 2206772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang } catch (Throwable th) { 2216772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang return false; 2226772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang } 2236772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang } 224b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin 225b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin private static boolean hasMethod( 226b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin Class<?> klass, String methodName, Class<?> ... paramTypes) { 227b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin try { 228b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin klass.getDeclaredMethod(methodName, paramTypes); 229b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin return true; 230b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin } catch (NoSuchMethodException e) { 231b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin return false; 232b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin } 233b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin } 2347a5e1e771ae58241f3a2be36f23025f282032261Owen Lin} 235