ApiHelper.java revision 064c30b6c89c4282487290ea11e7d3fd1ef68c64
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
19b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Linimport android.app.Activity;
208880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyanimport android.app.admin.DevicePolicyManager;
218880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyanimport android.content.ComponentName;
224bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Changimport android.hardware.Camera;
234bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Changimport android.hardware.Camera.FaceDetectionListener;
2430aa92093126f00b46543ae3b5d1035a3270f240Owen Linimport android.os.Build;
25b47927b7b43679e7315e6099e0a610760320d18dOwen Linimport android.provider.MediaStore.MediaColumns;
267a5e1e771ae58241f3a2be36f23025f282032261Owen Linimport android.view.View;
277a5e1e771ae58241f3a2be36f23025f282032261Owen Lin
281b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kongimport java.lang.reflect.Field;
291b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong
307a5e1e771ae58241f3a2be36f23025f282032261Owen Linpublic class ApiHelper {
313a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin    public static interface VERSION_CODES {
323a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin        // These value are copied from Build.VERSION_CODES
333a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin        public static final int GINGERBREAD_MR1 = 10;
343a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin        public static final int HONEYCOMB = 11;
353a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin        public static final int HONEYCOMB_MR1 = 12;
363a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin        public static final int HONEYCOMB_MR2 = 13;
373a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin        public static final int ICE_CREAM_SANDWICH = 14;
383a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin        public static final int ICE_CREAM_SANDWICH_MR1 = 15;
393a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin        public static final int JELLY_BEAN = 16;
403a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin    }
417a5e1e771ae58241f3a2be36f23025f282032261Owen Lin
427a5e1e771ae58241f3a2be36f23025f282032261Owen Lin    public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE =
437a5e1e771ae58241f3a2be36f23025f282032261Owen Lin            hasField(View.class, "SYSTEM_UI_FLAG_LAYOUT_STABLE");
447a5e1e771ae58241f3a2be36f23025f282032261Owen Lin
457a5e1e771ae58241f3a2be36f23025f282032261Owen Lin    public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_HIDE_NAVIGATION =
467a5e1e771ae58241f3a2be36f23025f282032261Owen Lin            hasField(View.class, "SYSTEM_UI_FLAG_HIDE_NAVIGATION");
477a5e1e771ae58241f3a2be36f23025f282032261Owen Lin
48b47927b7b43679e7315e6099e0a610760320d18dOwen Lin    public static final boolean HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT =
49b47927b7b43679e7315e6099e0a610760320d18dOwen Lin            hasField(MediaColumns.class, "WIDTH");
50b47927b7b43679e7315e6099e0a610760320d18dOwen Lin
5130aa92093126f00b46543ae3b5d1035a3270f240Owen Lin    public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_REGION_DECODER =
523a45725ad42324cd2db172fb082fe80772d94d3fOwen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
5330aa92093126f00b46543ae3b5d1035a3270f240Owen Lin
54df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin    public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_FACTORY =
55df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
56df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin
576772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang    public static final boolean HAS_SET_BEAM_PUSH_URIS =
586772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
596772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang
606772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang    public static final boolean HAS_SET_DEFALT_BUFFER_SIZE = hasMethod(
616772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang            "android.graphics.SurfaceTexture", "setDefaultBufferSize",
626772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang            int.class, int.class);
636772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang
64840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang    public static final boolean HAS_RELEASE_SURFACE_TEXTURE = hasMethod(
65840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang            "android.graphics.SurfaceTexture", "release");
66840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang
6704ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang    public static final boolean HAS_MTP =
6804ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1;
6904ebde7418493debda790f3eae933b5f6c38e897Chih-Chung Chang
70097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang    public static final boolean HAS_AUTO_FOCUS_MOVE_CALLBACK =
71097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
72097518e3dcbf212a78fa1fe3ad1ddea236401eb5Chih-Chung Chang
73b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    public static final boolean HAS_ACTIVITY_INVALIDATE_OPTIONS_MENU =
74b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin            hasMethod(Activity.class, "invalidateOptionsMenu");
75b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin
76a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin    public static final boolean HAS_REMOTE_VIEWS_SERVICE =
77a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
78a2cb30b688131380cab763a1b4da25f15a9fa45aOwen Lin
79fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin    public static final boolean HAS_INTENT_EXTRA_LOCAL_ONLY =
80fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
81fe9989a9a58d5ef883099ef747625aca0232df35Owen Lin
82b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang    public static final boolean HAS_SET_SYSTEM_UI_VISIBILITY =
83b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang            hasMethod(View.class, "setSystemUiVisibility", int.class);
84b0774a3bfb24d8515fc3ddf152fabf82f0ff67e5Yuli Huang
854bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang    public static final boolean HAS_FACE_DETECTION =
864bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang            hasClass(Camera.class, "android.hardware.Camera$FaceDetectionListener") &&
874bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang            hasMethod(Camera.class, "setFaceDetectionListener", FaceDetectionListener.class) &&
884bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang            hasMethod(Camera.class, "startFaceDetection") &&
894bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang            hasMethod(Camera.class, "stopFaceDetection") &&
904bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang            hasMethod(Camera.Parameters.class, "getMaxNumDetectedFaces");
914bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang
928880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan    public static final boolean HAS_GET_CAMERA_DISABLED =
938880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan            hasMethod(DevicePolicyManager.class, "getCameraDisabled", ComponentName.class);
948880e1f41c568ae56326051ff926448c0edaf6f6Hung-ying Tyan
951b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong    public static final boolean HAS_MEDIA_ACTION_SOUND =
961b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
971b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong
9880bacf0bb7db15ea21029b6ce645ec093562aa7dAhbong Chang    public static final boolean HAS_PANORAMA =
9980bacf0bb7db15ea21029b6ce645ec093562aa7dAhbong Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
10080bacf0bb7db15ea21029b6ce645ec093562aa7dAhbong Chang
101a895fae285e0a163faa523c6fe6e05e0f379fe16Chih-Chung Chang    public static final boolean HAS_TIME_LAPSE_RECORDING =
102a895fae285e0a163faa523c6fe6e05e0f379fe16Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
103a895fae285e0a163faa523c6fe6e05e0f379fe16Chih-Chung Chang
104064c30b6c89c4282487290ea11e7d3fd1ef68c64Angus Kong    public static final boolean HAS_CAMCORDER_ZOOM =
105064c30b6c89c4282487290ea11e7d3fd1ef68c64Angus Kong            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
106064c30b6c89c4282487290ea11e7d3fd1ef68c64Angus Kong
1071b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong    public static int getIntFieldIfExists(Class<?> klass, String fieldName,
1081b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong            Class<?> obj, int defaultVal) {
1091b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong        try {
1101b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong            Field f = klass.getDeclaredField(fieldName);
1111b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong            return f.getInt(obj);
1121b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong        } catch (Exception e) {
1131b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong            return defaultVal;
1141b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong        }
1151b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong    }
1161b10bf568327fa6c6c1ddbfd98cb17524bebfd46Angus Kong
117840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang    public static final boolean HAS_SET_ICON_ATTRIBUTE =
118840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
119840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang
1207a5e1e771ae58241f3a2be36f23025f282032261Owen Lin    private static boolean hasField(Class<?> klass, String fieldName) {
1217a5e1e771ae58241f3a2be36f23025f282032261Owen Lin        try {
1227a5e1e771ae58241f3a2be36f23025f282032261Owen Lin            klass.getDeclaredField(fieldName);
1237a5e1e771ae58241f3a2be36f23025f282032261Owen Lin            return true;
1247a5e1e771ae58241f3a2be36f23025f282032261Owen Lin        } catch (NoSuchFieldException e) {
1257a5e1e771ae58241f3a2be36f23025f282032261Owen Lin            return false;
1267a5e1e771ae58241f3a2be36f23025f282032261Owen Lin        }
1277a5e1e771ae58241f3a2be36f23025f282032261Owen Lin    }
1286772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang
1296772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang    private static boolean hasMethod(String className, String methodName,
1306772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang            Class<?>... parameterTypes) {
1316772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang        try {
132b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin            Class<?> klass = Class.forName(className);
1336772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang            klass.getDeclaredMethod(methodName, parameterTypes);
1346772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang            return true;
1356772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang        } catch (Throwable th) {
1366772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang            return false;
1376772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang        }
1386772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang    }
139b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin
140b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    private static boolean hasMethod(
141b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin            Class<?> klass, String methodName, Class<?> ... paramTypes) {
142b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin        try {
143b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin            klass.getDeclaredMethod(methodName, paramTypes);
144b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin            return true;
145b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin        } catch (NoSuchMethodException e) {
146b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin            return false;
147b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin        }
148b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    }
1494bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang
1504bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang    private static boolean hasClass(Class<?> klass, String className) {
1514bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang        Class<?>[] klasses = klass.getClasses();
1524bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang        for (int i = 0; i < klasses.length; ++i) {
1534bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang            if (klasses[i].getName().equals(className)) {
1544bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang                return true;
1554bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang            }
1564bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang        }
1574bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang        return false;
1584bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang    }
1594bfc86a3d6ce4df7fa3751ef5e06cf622cae0de2Ahbong Chang
1607a5e1e771ae58241f3a2be36f23025f282032261Owen Lin}
161