ApiHelper.java revision 064c30b6c89c4282487290ea11e7d3fd1ef68c64
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.gallery3d.common;
18
19import android.app.Activity;
20import android.app.admin.DevicePolicyManager;
21import android.content.ComponentName;
22import android.hardware.Camera;
23import android.hardware.Camera.FaceDetectionListener;
24import android.os.Build;
25import android.provider.MediaStore.MediaColumns;
26import android.view.View;
27
28import java.lang.reflect.Field;
29
30public class ApiHelper {
31    public static interface VERSION_CODES {
32        // These value are copied from Build.VERSION_CODES
33        public static final int GINGERBREAD_MR1 = 10;
34        public static final int HONEYCOMB = 11;
35        public static final int HONEYCOMB_MR1 = 12;
36        public static final int HONEYCOMB_MR2 = 13;
37        public static final int ICE_CREAM_SANDWICH = 14;
38        public static final int ICE_CREAM_SANDWICH_MR1 = 15;
39        public static final int JELLY_BEAN = 16;
40    }
41
42    public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE =
43            hasField(View.class, "SYSTEM_UI_FLAG_LAYOUT_STABLE");
44
45    public static final boolean HAS_VIEW_SYSTEM_UI_FLAG_HIDE_NAVIGATION =
46            hasField(View.class, "SYSTEM_UI_FLAG_HIDE_NAVIGATION");
47
48    public static final boolean HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT =
49            hasField(MediaColumns.class, "WIDTH");
50
51    public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_REGION_DECODER =
52            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
53
54    public static final boolean HAS_REUSING_BITMAP_IN_BITMAP_FACTORY =
55            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
56
57    public static final boolean HAS_SET_BEAM_PUSH_URIS =
58            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
59
60    public static final boolean HAS_SET_DEFALT_BUFFER_SIZE = hasMethod(
61            "android.graphics.SurfaceTexture", "setDefaultBufferSize",
62            int.class, int.class);
63
64    public static final boolean HAS_RELEASE_SURFACE_TEXTURE = hasMethod(
65            "android.graphics.SurfaceTexture", "release");
66
67    public static final boolean HAS_MTP =
68            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1;
69
70    public static final boolean HAS_AUTO_FOCUS_MOVE_CALLBACK =
71            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
72
73    public static final boolean HAS_ACTIVITY_INVALIDATE_OPTIONS_MENU =
74            hasMethod(Activity.class, "invalidateOptionsMenu");
75
76    public static final boolean HAS_REMOTE_VIEWS_SERVICE =
77            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
78
79    public static final boolean HAS_INTENT_EXTRA_LOCAL_ONLY =
80            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
81
82    public static final boolean HAS_SET_SYSTEM_UI_VISIBILITY =
83            hasMethod(View.class, "setSystemUiVisibility", int.class);
84
85    public static final boolean HAS_FACE_DETECTION =
86            hasClass(Camera.class, "android.hardware.Camera$FaceDetectionListener") &&
87            hasMethod(Camera.class, "setFaceDetectionListener", FaceDetectionListener.class) &&
88            hasMethod(Camera.class, "startFaceDetection") &&
89            hasMethod(Camera.class, "stopFaceDetection") &&
90            hasMethod(Camera.Parameters.class, "getMaxNumDetectedFaces");
91
92    public static final boolean HAS_GET_CAMERA_DISABLED =
93            hasMethod(DevicePolicyManager.class, "getCameraDisabled", ComponentName.class);
94
95    public static final boolean HAS_MEDIA_ACTION_SOUND =
96            Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN;
97
98    public static final boolean HAS_PANORAMA =
99            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
100
101    public static final boolean HAS_TIME_LAPSE_RECORDING =
102            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
103
104    public static final boolean HAS_CAMCORDER_ZOOM =
105            Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH;
106
107    public static int getIntFieldIfExists(Class<?> klass, String fieldName,
108            Class<?> obj, int defaultVal) {
109        try {
110            Field f = klass.getDeclaredField(fieldName);
111            return f.getInt(obj);
112        } catch (Exception e) {
113            return defaultVal;
114        }
115    }
116
117    public static final boolean HAS_SET_ICON_ATTRIBUTE =
118            Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB;
119
120    private static boolean hasField(Class<?> klass, String fieldName) {
121        try {
122            klass.getDeclaredField(fieldName);
123            return true;
124        } catch (NoSuchFieldException e) {
125            return false;
126        }
127    }
128
129    private static boolean hasMethod(String className, String methodName,
130            Class<?>... parameterTypes) {
131        try {
132            Class<?> klass = Class.forName(className);
133            klass.getDeclaredMethod(methodName, parameterTypes);
134            return true;
135        } catch (Throwable th) {
136            return false;
137        }
138    }
139
140    private static boolean hasMethod(
141            Class<?> klass, String methodName, Class<?> ... paramTypes) {
142        try {
143            klass.getDeclaredMethod(methodName, paramTypes);
144            return true;
145        } catch (NoSuchMethodException e) {
146            return false;
147        }
148    }
149
150    private static boolean hasClass(Class<?> klass, String className) {
151        Class<?>[] klasses = klass.getClasses();
152        for (int i = 0; i < klasses.length; ++i) {
153            if (klasses[i].getName().equals(className)) {
154                return true;
155            }
156        }
157        return false;
158    }
159
160}
161