ApiHelper.java revision f479c0db587cb21ea0699e2421f1d0d8e5ada289
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;
40ac765f6db6e450c4e8e38bea9439e080d9151485ztenghui        public static final int JELLY_BEAN_MR2 = 18;
41987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin    }
429199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin
438f69397b9c6acf6da28244a8ccea596546f34f87Bobby Georgescu    public static final boolean AT_LEAST_16 = Build.VERSION.SDK_INT >= 16;
448f69397b9c6acf6da28244a8ccea596546f34f87Bobby Georgescu
45026f5ae50aa45536805c286f03775e1c28c4b983Pin Ting    public static final boolean USE_888_PIXEL_FORMAT =
46026f5ae50aa45536805c286f03775e1c28c4b983Pin Ting            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
47026f5ae50aa45536805c286f03775e1c28c4b983Pin Ting
4851fbbcf9abe7528ee4b8d083fa3b6c2426e69688Yuli Huang    public static final boolean ENABLE_PHOTO_EDITOR =
4951fbbcf9abe7528ee4b8d083fa3b6c2426e69688Yuli Huang            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
5051fbbcf9abe7528ee4b8d083fa3b6c2426e69688Yuli Huang
519199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin    public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE =
529199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin            hasField(View.class, "SYSTEM_UI_FLAG_LAYOUT_STABLE");
539199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin
549199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin    public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_HIDE_NAVIGATION =
559199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin            hasField(View.class, "SYSTEM_UI_FLAG_HIDE_NAVIGATION");
569199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin
570c4c03a9fa2486d8021ad8f36067aa985aa2c85dOwen Lin    public static final boolean HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT =
580c4c03a9fa2486d8021ad8f36067aa985aa2c85dOwen Lin            hasField(MediaColumns.class, "WIDTH");
590c4c03a9fa2486d8021ad8f36067aa985aa2c85dOwen Lin
6076bfd87c90c98a46c06ea67dd895fc8f016f7267Owen Lin    public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_REGION_DECODER =
61987f5330637bb0f812845c6a4ab941d416f9b7bdOwen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
6276bfd87c90c98a46c06ea67dd895fc8f016f7267Owen Lin
635b981d12a290b7bd10d8439ff3a5a9533069b26eOwen Lin    public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_FACTORY =
645b981d12a290b7bd10d8439ff3a5a9533069b26eOwen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
655b981d12a290b7bd10d8439ff3a5a9533069b26eOwen Lin
667c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang    public static final boolean HAS_SET_BEAM_PUSH_URIS =
677c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
687c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang
697c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang    public static final boolean HAS_SET_DEFALT_BUFFER_SIZE = hasMethod(
707c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            "android.graphics.SurfaceTexture", "setDefaultBufferSize",
717c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            int.class, int.class);
727c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang
7300862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang    public static final boolean HAS_RELEASE_SURFACE_TEXTURE = hasMethod(
7400862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang            "android.graphics.SurfaceTexture", "release");
7500862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang
768df785a5c11d728892102f0faefc0d3c719bc207Wu-cheng Li    public static final boolean HAS_SURFACE_TEXTURE =
778df785a5c11d728892102f0faefc0d3c719bc207Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
788df785a5c11d728892102f0faefc0d3c719bc207Wu-cheng Li
79a207d3326346d6da7b713d2be097a42a0401f354Chih-Chung Chang    public static final boolean HAS_MTP =
80a207d3326346d6da7b713d2be097a42a0401f354Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1;
81a207d3326346d6da7b713d2be097a42a0401f354Chih-Chung Chang
829341cc2b9e2939e9915ff62fa9b11e56951947d1Chih-Chung Chang    public static final boolean HAS_AUTO_FOCUS_MOVE_CALLBACK =
839341cc2b9e2939e9915ff62fa9b11e56951947d1Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
849341cc2b9e2939e9915ff62fa9b11e56951947d1Chih-Chung Chang
85362f50ca3adea7a13302e22b07bd9a45a952333bOwen Lin    public static final boolean HAS_REMOTE_VIEWS_SERVICE =
86362f50ca3adea7a13302e22b07bd9a45a952333bOwen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
87362f50ca3adea7a13302e22b07bd9a45a952333bOwen Lin
883969aca03ea7537e793c5c55acec752148151480Owen Lin    public static final boolean HAS_INTENT_EXTRA_LOCAL_ONLY =
893969aca03ea7537e793c5c55acec752148151480Owen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
903969aca03ea7537e793c5c55acec752148151480Owen Lin
915424e3274478fca29eb8bf8a8c92140e85b8925aYuli Huang    public static final boolean HAS_SET_SYSTEM_UI_VISIBILITY =
925424e3274478fca29eb8bf8a8c92140e85b8925aYuli Huang            hasMethod(View.class, "setSystemUiVisibility", int.class);
935424e3274478fca29eb8bf8a8c92140e85b8925aYuli Huang
94bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin    public static final boolean HAS_FACE_DETECTION;
95bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin    static {
96bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin        boolean hasFaceDetection = false;
97bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin        try {
98bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin            Class<?> listenerClass = Class.forName(
99bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin                    "android.hardware.Camera$FaceDetectionListener");
100bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin            hasFaceDetection =
101bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin                    hasMethod(Camera.class, "setFaceDetectionListener", listenerClass) &&
102bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin                    hasMethod(Camera.class, "startFaceDetection") &&
103bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin                    hasMethod(Camera.class, "stopFaceDetection") &&
104bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin                    hasMethod(Camera.Parameters.class, "getMaxNumDetectedFaces");
105bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin        } catch (Throwable t) {
106bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin        }
107bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin        HAS_FACE_DETECTION = hasFaceDetection;
108bc1489c807b97ba590d2baf276fb622ef15d38deOwen Lin    }
1095c1268331bd39f04894786f37e04584ffb4cf6e6Ahbong Chang
110d5b66ad52b8aa7e1ec82dba88a58ae893b58432eHung-ying Tyan    public static final boolean HAS_GET_CAMERA_DISABLED =
111d5b66ad52b8aa7e1ec82dba88a58ae893b58432eHung-ying Tyan            hasMethod(DevicePolicyManager.class, "getCameraDisabled", ComponentName.class);
112d5b66ad52b8aa7e1ec82dba88a58ae893b58432eHung-ying Tyan
113708bfce7f38274073611a32de69e16fe8bf292eaAngus Kong    public static final boolean HAS_MEDIA_ACTION_SOUND =
114708bfce7f38274073611a32de69e16fe8bf292eaAngus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
115708bfce7f38274073611a32de69e16fe8bf292eaAngus Kong
116f67891cb9b5a47a6412cfa88b889b4b76fd22e79Wu-cheng Li    public static final boolean HAS_OLD_PANORAMA =
117f67891cb9b5a47a6412cfa88b889b4b76fd22e79Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
118208a15be34593493c63bb2b99a7fd8db48a93e6eAhbong Chang
1195a0e374ef4a35211d5ae149ac6adb91ce5375911Chih-Chung Chang    public static final boolean HAS_TIME_LAPSE_RECORDING =
1205a0e374ef4a35211d5ae149ac6adb91ce5375911Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
1215a0e374ef4a35211d5ae149ac6adb91ce5375911Chih-Chung Chang
1228538bbdd8bdf14e29f5c7a092ee824c1a675c0c0Angus Kong    public static final boolean HAS_ZOOM_WHEN_RECORDING =
123b593dbcb19db6d8cd1a4eddcaffd1c1073c406a7Angus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
124b593dbcb19db6d8cd1a4eddcaffd1c1073c406a7Angus Kong
1256f9a145d14b9cb1a7406b11a76deb5ec595d3bb9Angus Kong    public static final boolean HAS_CAMERA_FOCUS_AREA =
1266f9a145d14b9cb1a7406b11a76deb5ec595d3bb9Angus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
1276f9a145d14b9cb1a7406b11a76deb5ec595d3bb9Angus Kong
128cd8e78b4e9393317854fc3553ea5fbd03a5557faAngus Kong    public static final boolean HAS_CAMERA_METERING_AREA =
129cd8e78b4e9393317854fc3553ea5fbd03a5557faAngus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
130cd8e78b4e9393317854fc3553ea5fbd03a5557faAngus Kong
131f3b0384acb06f1615c4d3ed2c7c2dff8090fe7b0Pin Ting    public static final boolean HAS_FINE_RESOLUTION_QUALITY_LEVELS =
132f3b0384acb06f1615c4d3ed2c7c2dff8090fe7b0Pin Ting            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
133f3b0384acb06f1615c4d3ed2c7c2dff8090fe7b0Pin Ting
134ebd718780e2439cf30ba124b66c24f5253deedb2Chih-Chung Chang    public static final boolean HAS_MOTION_EVENT_TRANSFORM =
135ebd718780e2439cf30ba124b66c24f5253deedb2Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
136ebd718780e2439cf30ba124b66c24f5253deedb2Chih-Chung Chang
1376be3a50c190eed6e2762b7a6ef05378a26c9339cWu-cheng Li    public static final boolean HAS_EFFECTS_RECORDING = false;
1386da4724e8d21e0e3df809a832c72365528959b27Pin Ting
139c722a7cd2861538f70f2dc988cbcc4ea9362ae98Wu-cheng Li    // "Background" filter does not have "context" input port in jelly bean.
140c722a7cd2861538f70f2dc988cbcc4ea9362ae98Wu-cheng Li    public static final boolean HAS_EFFECTS_RECORDING_CONTEXT_INPUT =
141c722a7cd2861538f70f2dc988cbcc4ea9362ae98Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1;
142c722a7cd2861538f70f2dc988cbcc4ea9362ae98Wu-cheng Li
143ee87994cca9e35444b17ba6c1c129cdc1cd998d4Pin Ting    public static final boolean HAS_GET_SUPPORTED_VIDEO_SIZE =
144ee87994cca9e35444b17ba6c1c129cdc1cd998d4Pin Ting            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
145ee87994cca9e35444b17ba6c1c129cdc1cd998d4Pin Ting
14600862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang    public static final boolean HAS_SET_ICON_ATTRIBUTE =
14700862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
14800862f13a4b7be86ee7fec8eead0bb4e35193cd7Chih-Chung Chang
1496ae93dbed7938eccdb5273dfc6655d65a9546343Owen Lin    public static final boolean HAS_MEDIA_PROVIDER_FILES_TABLE =
1506ae93dbed7938eccdb5273dfc6655d65a9546343Owen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
1516ae93dbed7938eccdb5273dfc6655d65a9546343Owen Lin
152fbf6dbaf20e1508f19468c33021813d078afdb35Angus Kong    public static final boolean HAS_SURFACE_TEXTURE_RECORDING =
153fbf6dbaf20e1508f19468c33021813d078afdb35Angus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
15400e4a6e52dab2f7ef3f6574f20a12d4a39e76124Owen Lin
15500e4a6e52dab2f7ef3f6574f20a12d4a39e76124Owen Lin    public static final boolean HAS_ACTION_BAR =
15600e4a6e52dab2f7ef3f6574f20a12d4a39e76124Owen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
15700e4a6e52dab2f7ef3f6574f20a12d4a39e76124Owen Lin
158622246a1cb249f6b7619067939b10972cdc379c1Wu-cheng Li    // Ex: View.setTranslationX.
159622246a1cb249f6b7619067939b10972cdc379c1Wu-cheng Li    public static final boolean HAS_VIEW_TRANSFORM_PROPERTIES =
160622246a1cb249f6b7619067939b10972cdc379c1Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
161622246a1cb249f6b7619067939b10972cdc379c1Wu-cheng Li
162ea1d1d283f6e75f012fe091608cf0b588866a511Wu-cheng Li    public static final boolean HAS_CAMERA_HDR =
163ea1d1d283f6e75f012fe091608cf0b588866a511Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1;
164ea1d1d283f6e75f012fe091608cf0b588866a511Wu-cheng Li
1650fb7f34668b317895b6be1d2e64d01601fb64c76Owen Lin    public static final boolean HAS_OPTIONS_IN_MUTABLE =
1660fb7f34668b317895b6be1d2e64d01601fb64c76Owen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
1670fb7f34668b317895b6be1d2e64d01601fb64c76Owen Lin
16836d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li    public static final boolean CAN_START_PREVIEW_IN_JPEG_CALLBACK =
16936d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
17036d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li
17196c707bda5a3bebafacba1f813eded88d787c73aJohn Reck    public static final boolean HAS_VIEW_PROPERTY_ANIMATOR =
17296c707bda5a3bebafacba1f813eded88d787c73aJohn Reck            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1;
17396c707bda5a3bebafacba1f813eded88d787c73aJohn Reck
174bf30e7dfdd17b59894014d0c081a59e444f92b39John Reck    public static final boolean HAS_POST_ON_ANIMATION =
175bf30e7dfdd17b59894014d0c081a59e444f92b39John Reck            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
176bf30e7dfdd17b59894014d0c081a59e444f92b39John Reck
17721f52a50d6b325c9cf86bccbbc05441fb2ba4d36Doris Liu    public static final boolean HAS_ANNOUNCE_FOR_ACCESSIBILITY =
17821f52a50d6b325c9cf86bccbbc05441fb2ba4d36Doris Liu            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
17921f52a50d6b325c9cf86bccbbc05441fb2ba4d36Doris Liu
1804523405aae7df882bf579cd0257335e3ba267258Teng-Hui Zhu    public static final boolean HAS_OBJECT_ANIMATION =
1814523405aae7df882bf579cd0257335e3ba267258Teng-Hui Zhu            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
1824523405aae7df882bf579cd0257335e3ba267258Teng-Hui Zhu
18380f7fdb406cb98e3029a214d86973768c9f02470George Mount    public static final boolean HAS_GLES20_REQUIRED =
18480f7fdb406cb98e3029a214d86973768c9f02470George Mount            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
18580f7fdb406cb98e3029a214d86973768c9f02470George Mount
1866afdb1769adddaf94116a7d1cad82740a9455641Michael Kolb    public static final boolean HAS_ROTATION_ANIMATION =
1876afdb1769adddaf94116a7d1cad82740a9455641Michael Kolb            hasField(WindowManager.LayoutParams.class, "rotationAnimation");
1886afdb1769adddaf94116a7d1cad82740a9455641Michael Kolb
189d1e0a6e78d686cdc259a2978e988cdd734ca6a2fMichael Kolb    public static final boolean HAS_ORIENTATION_LOCK =
190d1e0a6e78d686cdc259a2978e988cdd734ca6a2fMichael Kolb            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2;
191d1e0a6e78d686cdc259a2978e988cdd734ca6a2fMichael Kolb
192ae08ffa53ee52fa78fe30d76865a05814d64984cGeorge Mount    public static final boolean HAS_CANCELLATION_SIGNAL =
193ae08ffa53ee52fa78fe30d76865a05814d64984cGeorge Mount            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
194ae08ffa53ee52fa78fe30d76865a05814d64984cGeorge Mount
195ac765f6db6e450c4e8e38bea9439e080d9151485ztenghui    public static final boolean HAS_MEDIA_MUXER =
196ac765f6db6e450c4e8e38bea9439e080d9151485ztenghui                    Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2;
197ac765f6db6e450c4e8e38bea9439e080d9151485ztenghui
198f479c0db587cb21ea0699e2421f1d0d8e5ada289Doris Liu    public static final boolean HAS_DISPLAY_LISTENER =
199f479c0db587cb21ea0699e2421f1d0d8e5ada289Doris Liu            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1;
200f479c0db587cb21ea0699e2421f1d0d8e5ada289Doris Liu
20136d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li    public static int getIntFieldIfExists(Class<?> klass, String fieldName,
20236d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li            Class<?> obj, int defaultVal) {
20336d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li        try {
20436d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li            Field f = klass.getDeclaredField(fieldName);
20536d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li            return f.getInt(obj);
20636d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li        } catch (Exception e) {
20736d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li            return defaultVal;
20836d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li        }
20936d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li    }
21036d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li
2119199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin    private static boolean hasField(Class<?> klass, String fieldName) {
2129199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin        try {
2139199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin            klass.getDeclaredField(fieldName);
2149199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin            return true;
2159199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin        } catch (NoSuchFieldException e) {
2169199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin            return false;
2179199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin        }
2189199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin    }
2197c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang
2207c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang    private static boolean hasMethod(String className, String methodName,
2217c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            Class<?>... parameterTypes) {
2227c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang        try {
223b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin            Class<?> klass = Class.forName(className);
2247c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            klass.getDeclaredMethod(methodName, parameterTypes);
2257c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            return true;
2267c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang        } catch (Throwable th) {
2277c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang            return false;
2287c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang        }
2297c3c93892c21a836ec816d18cb3133bca9ce4275Chih-Chung Chang    }
230b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin
231b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin    private static boolean hasMethod(
232b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin            Class<?> klass, String methodName, Class<?> ... paramTypes) {
233b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin        try {
234b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin            klass.getDeclaredMethod(methodName, paramTypes);
235b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin            return true;
236b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin        } catch (NoSuchMethodException e) {
237b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin            return false;
238b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin        }
239b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin    }
2409199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin}
241