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