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