ApiHelper.java revision 6afdb1769adddaf94116a7d1cad82740a9455641
19199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin/*
29199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin * Copyright (C) 2012 The Android Open Source Project
39199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin *
49199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
59199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin * you may not use this file except in compliance with the License.
69199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin * You may obtain a copy of the License at
79199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin *
89199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
99199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin *
109199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin * Unless required by applicable law or agreed to in writing, software
119199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
129199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin * See the License for the specific language governing permissions and
149199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin * limitations under the License.
159199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin */
169199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin
179199c4d69ebc9b9589271d1e62ba80138b1db700Owen Linpackage com.android.gallery3d.common;
189199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin
19d5b66ad52b8aa7e1ec82dba88a58ae893b58432eHung-ying Tyanimport android.app.admin.DevicePolicyManager;
20d5b66ad52b8aa7e1ec82dba88a58ae893b58432eHung-ying Tyanimport android.content.ComponentName;
215c1268331bd39f04894786f37e04584ffb4cf6e6Ahbong Changimport android.hardware.Camera;
2276bfd87c90c98a46c06ea67dd895fc8f016f7267Owen Linimport android.os.Build;
230c4c03a9fa2486d8021ad8f36067aa985aa2c85dOwen Linimport android.provider.MediaStore.MediaColumns;
249199c4d69ebc9b9589271d1e62ba80138b1db700Owen Linimport android.view.View;
256afdb1769adddaf94116a7d1cad82740a9455641Michael Kolbimport android.view.WindowManager;
269199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin
27708bfce7f38274073611a32de69e16fe8bf292eaAngus Kongimport java.lang.reflect.Field;
28708bfce7f38274073611a32de69e16fe8bf292eaAngus Kong
299199c4d69ebc9b9589271d1e62ba80138b1db700Owen Linpublic class ApiHelper {
30987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin    public static interface VERSION_CODES {
31987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin        // These value are copied from Build.VERSION_CODES
32987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin        public static final int GINGERBREAD_MR1 = 10;
33987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin        public static final int HONEYCOMB = 11;
34987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin        public static final int HONEYCOMB_MR1 = 12;
35987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin        public static final int HONEYCOMB_MR2 = 13;
36987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin        public static final int ICE_CREAM_SANDWICH = 14;
37987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin        public static final int ICE_CREAM_SANDWICH_MR1 = 15;
38987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin        public static final int JELLY_BEAN = 16;
39ea1d1d283f6e75f012fe091608cf0b588866a511Wu-cheng Li        public static final int JELLY_BEAN_MR1 = 17;
40987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin    }
419199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin
42026f5ae50aa45536805c286f03775e1c28c4b983Pin Ting    public static final boolean USE_888_PIXEL_FORMAT =
43026f5ae50aa45536805c286f03775e1c28c4b983Pin Ting            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
44026f5ae50aa45536805c286f03775e1c28c4b983Pin Ting
4551fbbcf9abe7528ee4b8d083fa3b6c2426e69688Yuli Huang    public static final boolean ENABLE_PHOTO_EDITOR =
4651fbbcf9abe7528ee4b8d083fa3b6c2426e69688Yuli Huang            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
4751fbbcf9abe7528ee4b8d083fa3b6c2426e69688Yuli Huang
489199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin    public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE =
499199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin            hasField(View.class, "SYSTEM_UI_FLAG_LAYOUT_STABLE");
509199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin
519199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin    public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_HIDE_NAVIGATION =
529199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin            hasField(View.class, "SYSTEM_UI_FLAG_HIDE_NAVIGATION");
539199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin
540c4c03a9fa2486d8021ad8f36067aa985aa2c85dOwen Lin    public static final boolean HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT =
550c4c03a9fa2486d8021ad8f36067aa985aa2c85dOwen Lin            hasField(MediaColumns.class, "WIDTH");
560c4c03a9fa2486d8021ad8f36067aa985aa2c85dOwen Lin
5776bfd87c90c98a46c06ea67dd895fc8f016f7267Owen Lin    public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_REGION_DECODER =
58987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
5976bfd87c90c98a46c06ea67dd895fc8f016f7267Owen Lin
605b981d12a290b7bd10d8439ff3a5a9533069b26eOwen Lin    public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_FACTORY =
615b981d12a290b7bd10d8439ff3a5a9533069b26eOwen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
625b981d12a290b7bd10d8439ff3a5a9533069b26eOwen Lin
637c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang    public static final boolean HAS_SET_BEAM_PUSH_URIS =
647c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
657c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang
667c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang    public static final boolean HAS_SET_DEFALT_BUFFER_SIZE = hasMethod(
677c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            "android.graphics.SurfaceTexture", "setDefaultBufferSize",
687c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            int.class, int.class);
697c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang
7000862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang    public static final boolean HAS_RELEASE_SURFACE_TEXTURE = hasMethod(
7100862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang            "android.graphics.SurfaceTexture", "release");
7200862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang
738df785a5c11d728892102f0faefc0d3c719bc207Wu-cheng Li    public static final boolean HAS_SURFACE_TEXTURE =
748df785a5c11d728892102f0faefc0d3c719bc207Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
758df785a5c11d728892102f0faefc0d3c719bc207Wu-cheng Li
76a207d3326346d6da7b713d2be097a42a0401f354Chih-Chung Chang    public static final boolean HAS_MTP =
77a207d3326346d6da7b713d2be097a42a0401f354Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1;
78a207d3326346d6da7b713d2be097a42a0401f354Chih-Chung Chang
799341cc2b9e2939e9915ff62fa9b11e56951947d1Chih-Chung Chang    public static final boolean HAS_AUTO_FOCUS_MOVE_CALLBACK =
809341cc2b9e2939e9915ff62fa9b11e56951947d1Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
819341cc2b9e2939e9915ff62fa9b11e56951947d1Chih-Chung Chang
82362f50ca3adea7a13302e22b07bd9a45a952333bOwen Lin    public static final boolean HAS_REMOTE_VIEWS_SERVICE =
83362f50ca3adea7a13302e22b07bd9a45a952333bOwen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
84362f50ca3adea7a13302e22b07bd9a45a952333bOwen Lin
853969aca03ea7537e793c5c55acec752148151480Owen Lin    public static final boolean HAS_INTENT_EXTRA_LOCAL_ONLY =
863969aca03ea7537e793c5c55acec752148151480Owen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
873969aca03ea7537e793c5c55acec752148151480Owen Lin
885424e3274478fca29eb8bf8a8c92140e85b8925aYuli Huang    public static final boolean HAS_SET_SYSTEM_UI_VISIBILITY =
895424e3274478fca29eb8bf8a8c92140e85b8925aYuli Huang            hasMethod(View.class, "setSystemUiVisibility", int.class);
905424e3274478fca29eb8bf8a8c92140e85b8925aYuli Huang
91bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin    public static final boolean HAS_FACE_DETECTION;
92bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin    static {
93bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin        boolean hasFaceDetection = false;
94bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin        try {
95bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin            Class<?> listenerClass = Class.forName(
96bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin                    "android.hardware.Camera$FaceDetectionListener");
97bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin            hasFaceDetection =
98bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin                    hasMethod(Camera.class, "setFaceDetectionListener", listenerClass) &&
99bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin                    hasMethod(Camera.class, "startFaceDetection") &&
100bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin                    hasMethod(Camera.class, "stopFaceDetection") &&
101bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin                    hasMethod(Camera.Parameters.class, "getMaxNumDetectedFaces");
102bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin        } catch (Throwable t) {
103bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin        }
104bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin        HAS_FACE_DETECTION = hasFaceDetection;
105bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin    }
1065c1268331bd39f04894786f37e04584ffb4cf6e6Ahbong Chang
107d5b66ad52b8aa7e1ec82dba88a58ae893b58432eHung-ying Tyan    public static final boolean HAS_GET_CAMERA_DISABLED =
108d5b66ad52b8aa7e1ec82dba88a58ae893b58432eHung-ying Tyan            hasMethod(DevicePolicyManager.class, "getCameraDisabled", ComponentName.class);
109d5b66ad52b8aa7e1ec82dba88a58ae893b58432eHung-ying Tyan
110708bfce7f38274073611a32de69e16fe8bf292eaAngus Kong    public static final boolean HAS_MEDIA_ACTION_SOUND =
111708bfce7f38274073611a32de69e16fe8bf292eaAngus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
112708bfce7f38274073611a32de69e16fe8bf292eaAngus Kong
113f67891cb9b5a47a6412cfa88b889b4b76fd22e79Wu-cheng Li    public static final boolean HAS_OLD_PANORAMA =
114f67891cb9b5a47a6412cfa88b889b4b76fd22e79Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
115208a15be34593493c63bb2b99a7fd8db48a93e6eAhbong Chang
1165a0e374ef4a35211d5ae149ac6adb91ce5375911Chih-Chung Chang    public static final boolean HAS_TIME_LAPSE_RECORDING =
1175a0e374ef4a35211d5ae149ac6adb91ce5375911Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
1185a0e374ef4a35211d5ae149ac6adb91ce5375911Chih-Chung Chang
1198538bbdd8bdf14e29f5c7a092ee824c1a675c0c0Angus Kong    public static final boolean HAS_ZOOM_WHEN_RECORDING =
120b593dbcb19db6d8cd1a4eddcaffd1c1073c406a7Angus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
121b593dbcb19db6d8cd1a4eddcaffd1c1073c406a7Angus Kong
1226f9a145d14b9cb1a7406b11a76deb5ec595d3bb9Angus Kong    public static final boolean HAS_CAMERA_FOCUS_AREA =
1236f9a145d14b9cb1a7406b11a76deb5ec595d3bb9Angus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
1246f9a145d14b9cb1a7406b11a76deb5ec595d3bb9Angus Kong
125cd8e78b4e9393317854fc3553ea5fbd03a5557faAngus Kong    public static final boolean HAS_CAMERA_METERING_AREA =
126cd8e78b4e9393317854fc3553ea5fbd03a5557faAngus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
127cd8e78b4e9393317854fc3553ea5fbd03a5557faAngus Kong
128f3b0384acb06f1615c4d3ed2c7c2dff8090fe7b0Pin Ting    public static final boolean HAS_FINE_RESOLUTION_QUALITY_LEVELS =
129f3b0384acb06f1615c4d3ed2c7c2dff8090fe7b0Pin Ting            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
130f3b0384acb06f1615c4d3ed2c7c2dff8090fe7b0Pin Ting
131ebd718780e2439cf30ba124b66c24f5253deedb2Chih-Chung Chang    public static final boolean HAS_MOTION_EVENT_TRANSFORM =
132ebd718780e2439cf30ba124b66c24f5253deedb2Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
133ebd718780e2439cf30ba124b66c24f5253deedb2Chih-Chung Chang
1346be3a50c190eed6e2762b7a6ef05378a26c9339cWu-cheng Li    public static final boolean HAS_EFFECTS_RECORDING = false;
1356da4724e8d21e0e3df809a832c72365528959b27Pin Ting
136c722a7cd2861538f70f2dc988cbcc4ea9362ae98Wu-cheng Li    // "Background" filter does not have "context" input port in jelly bean.
137c722a7cd2861538f70f2dc988cbcc4ea9362ae98Wu-cheng Li    public static final boolean HAS_EFFECTS_RECORDING_CONTEXT_INPUT =
138c722a7cd2861538f70f2dc988cbcc4ea9362ae98Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1;
139c722a7cd2861538f70f2dc988cbcc4ea9362ae98Wu-cheng Li
140ee87994cca9e35444b17ba6c1c129cdc1cd998d4Pin Ting    public static final boolean HAS_GET_SUPPORTED_VIDEO_SIZE =
141ee87994cca9e35444b17ba6c1c129cdc1cd998d4Pin Ting            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
142ee87994cca9e35444b17ba6c1c129cdc1cd998d4Pin Ting
14300862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang    public static final boolean HAS_SET_ICON_ATTRIBUTE =
14400862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
14500862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang
1466ae93dbed7938eccdb5273dfc6655d65a9546343Owen Lin    public static final boolean HAS_MEDIA_PROVIDER_FILES_TABLE =
1476ae93dbed7938eccdb5273dfc6655d65a9546343Owen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
1486ae93dbed7938eccdb5273dfc6655d65a9546343Owen Lin
149fbf6dbaf20e1508f19468c33021813d078afdb35Angus Kong    public static final boolean HAS_SURFACE_TEXTURE_RECORDING =
150fbf6dbaf20e1508f19468c33021813d078afdb35Angus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
15100e4a6e52dab2f7ef3f6574f20a12d4a39e76124Owen Lin
15200e4a6e52dab2f7ef3f6574f20a12d4a39e76124Owen Lin    public static final boolean HAS_ACTION_BAR =
15300e4a6e52dab2f7ef3f6574f20a12d4a39e76124Owen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
15400e4a6e52dab2f7ef3f6574f20a12d4a39e76124Owen Lin
155622246a1cb249f6b7619067939b10972cdc379c1Wu-cheng Li    // Ex: View.setTranslationX.
156622246a1cb249f6b7619067939b10972cdc379c1Wu-cheng Li    public static final boolean HAS_VIEW_TRANSFORM_PROPERTIES =
157622246a1cb249f6b7619067939b10972cdc379c1Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
158622246a1cb249f6b7619067939b10972cdc379c1Wu-cheng Li
159ea1d1d283f6e75f012fe091608cf0b588866a511Wu-cheng Li    public static final boolean HAS_CAMERA_HDR =
160ea1d1d283f6e75f012fe091608cf0b588866a511Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1;
161ea1d1d283f6e75f012fe091608cf0b588866a511Wu-cheng Li
1620fb7f34668b317895b6be1d2e64d01601fb64c76Owen Lin    public static final boolean HAS_OPTIONS_IN_MUTABLE =
1630fb7f34668b317895b6be1d2e64d01601fb64c76Owen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
1640fb7f34668b317895b6be1d2e64d01601fb64c76Owen Lin
16536d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li    public static final boolean CAN_START_PREVIEW_IN_JPEG_CALLBACK =
16636d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
16736d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li
16896c707bda5a3bebafacba1f813eded88d787c73aJohn Reck    public static final boolean HAS_VIEW_PROPERTY_ANIMATOR =
16996c707bda5a3bebafacba1f813eded88d787c73aJohn Reck            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1;
17096c707bda5a3bebafacba1f813eded88d787c73aJohn Reck
171bf30e7dfdd17b59894014d0c081a59e444f92b39John Reck    public static final boolean HAS_POST_ON_ANIMATION =
172bf30e7dfdd17b59894014d0c081a59e444f92b39John Reck            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
173bf30e7dfdd17b59894014d0c081a59e444f92b39John Reck
17421f52a50d6b325c9cf86bccbbc05441fb2ba4d36Doris Liu    public static final boolean HAS_ANNOUNCE_FOR_ACCESSIBILITY =
17521f52a50d6b325c9cf86bccbbc05441fb2ba4d36Doris Liu            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
17621f52a50d6b325c9cf86bccbbc05441fb2ba4d36Doris Liu
1774523405aae7df882bf579cd0257335e3ba267258Teng-Hui Zhu    public static final boolean HAS_OBJECT_ANIMATION =
1784523405aae7df882bf579cd0257335e3ba267258Teng-Hui Zhu            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
1794523405aae7df882bf579cd0257335e3ba267258Teng-Hui Zhu
18080f7fdb406cb98e3029a214d86973768c9f02470George Mount    public static final boolean HAS_GLES20_REQUIRED =
18180f7fdb406cb98e3029a214d86973768c9f02470George Mount            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
18280f7fdb406cb98e3029a214d86973768c9f02470George Mount
1836afdb1769adddaf94116a7d1cad82740a9455641Michael Kolb    public static final boolean HAS_ROTATION_ANIMATION =
1846afdb1769adddaf94116a7d1cad82740a9455641Michael Kolb            hasField(WindowManager.LayoutParams.class, "rotationAnimation");
1856afdb1769adddaf94116a7d1cad82740a9455641Michael Kolb
18636d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li    public static int getIntFieldIfExists(Class<?> klass, String fieldName,
18736d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li            Class<?> obj, int defaultVal) {
18836d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li        try {
18936d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li            Field f = klass.getDeclaredField(fieldName);
19036d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li            return f.getInt(obj);
19136d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li        } catch (Exception e) {
19236d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li            return defaultVal;
19336d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li        }
19436d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li    }
19536d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li
1969199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin    private static boolean hasField(Class<?> klass, String fieldName) {
1979199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin        try {
1989199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin            klass.getDeclaredField(fieldName);
1999199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin            return true;
2009199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin        } catch (NoSuchFieldException e) {
2019199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin            return false;
2029199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin        }
2039199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin    }
2047c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang
2057c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang    private static boolean hasMethod(String className, String methodName,
2067c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            Class<?>... parameterTypes) {
2077c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang        try {
208b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin            Class<?> klass = Class.forName(className);
2097c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            klass.getDeclaredMethod(methodName, parameterTypes);
2107c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            return true;
2117c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang        } catch (Throwable th) {
2127c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            return false;
2137c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang        }
2147c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang    }
215b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin
216b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin    private static boolean hasMethod(
217b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin            Class<?> klass, String methodName, Class<?> ... paramTypes) {
218b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin        try {
219b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin            klass.getDeclaredMethod(methodName, paramTypes);
220b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin            return true;
221b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin        } catch (NoSuchMethodException e) {
222b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin            return false;
223b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin        }
224b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin    }
2259199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin}
226