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