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