1 /* 2 * Copyright (C) 2013 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 17 package com.android.camera.util; 18 19 import android.os.Build; 20 21 import java.lang.reflect.Field; 22 23 public class ApiHelper { 24 // Documented value of CPU_ABI on x86 architectures 25 private static final String X86ABI = "x86"; 26 27 public static final boolean AT_LEAST_16 = Build.VERSION.SDK_INT >= 16; 28 29 public static final boolean AT_LEAST_34 = Build.VERSION.SDK_INT >= 34; 30 31 public static final boolean HAS_APP_GALLERY = 32 Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1; 33 34 public static final boolean HAS_ANNOUNCE_FOR_ACCESSIBILITY = 35 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 36 public static final boolean HAS_AUTO_FOCUS_MOVE_CALLBACK = 37 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 38 public static final boolean HAS_MEDIA_ACTION_SOUND = 39 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 40 public static final boolean HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT = 41 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 42 public static final boolean HAS_SET_BEAM_PUSH_URIS = 43 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 44 public static final boolean HAS_SURFACE_TEXTURE_RECORDING = 45 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 46 public static final boolean HAS_ROBOTO_MEDIUM_FONT = 47 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 48 49 public static final boolean HAS_CAMERA_HDR_PLUS = isKitKatOrHigher(); 50 public static final boolean HDR_PLUS_CAN_USE_ARBITRARY_ASPECT_RATIOS = isKitKatMR2OrHigher(); 51 public static final boolean HAS_CAMERA_HDR = 52 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1; 53 public static final boolean HAS_DISPLAY_LISTENER = 54 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1; 55 56 public static final boolean HAS_ORIENTATION_LOCK = 57 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; 58 public static final boolean HAS_ROTATION_ANIMATION = 59 Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; 60 61 public static final boolean HAS_HIDEYBARS = isKitKatOrHigher(); 62 63 // Don't use renderscript. See b/18435492. 64 public static final boolean HAS_RENDERSCRIPT = false; 65 66 public static final boolean IS_NEXUS_4 = "mako".equalsIgnoreCase(Build.DEVICE); 67 public static final boolean IS_NEXUS_5 = "LGE".equalsIgnoreCase(Build.MANUFACTURER) 68 && "hammerhead".equalsIgnoreCase(Build.DEVICE); 69 public static final boolean IS_NEXUS_6 = "motorola".equalsIgnoreCase(Build.MANUFACTURER) 70 && "shamu".equalsIgnoreCase(Build.DEVICE); 71 public static final boolean IS_NEXUS_9 = "htc".equalsIgnoreCase(Build.MANUFACTURER) 72 && ("flounder".equalsIgnoreCase(Build.DEVICE) 73 || "flounder_lte".equalsIgnoreCase(Build.DEVICE)); 74 75 public static final boolean HAS_CAMERA_2_API = isLOrHigher(); 76 getIntFieldIfExists(Class<?> klass, String fieldName, Class<?> obj, int defaultVal)77 public static int getIntFieldIfExists(Class<?> klass, String fieldName, 78 Class<?> obj, int defaultVal) { 79 try { 80 Field f = klass.getDeclaredField(fieldName); 81 return f.getInt(obj); 82 } catch (Exception e) { 83 return defaultVal; 84 } 85 } 86 isKitKatOrHigher()87 public static boolean isKitKatOrHigher() { 88 // TODO: Remove CODENAME check as soon as VERSION_CODES.KITKAT is final. 89 return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT 90 || "KeyLimePie".equals(Build.VERSION.CODENAME); 91 } 92 isKitKatMR2OrHigher()93 public static boolean isKitKatMR2OrHigher() { 94 return isLOrHigher() 95 || (isKitKatOrHigher() && 96 ("4.4.4".equals(Build.VERSION.RELEASE) || "4.4.3".equals(Build.VERSION.RELEASE))); 97 } 98 isLollipop()99 public static boolean isLollipop() { 100 return Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP; 101 } 102 isLOrHigher()103 public static boolean isLOrHigher() { 104 return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP 105 || "L".equals(Build.VERSION.CODENAME) || "LOLLIPOP".equals(Build.VERSION.CODENAME); 106 } 107 isLMr1OrHigher()108 public static boolean isLMr1OrHigher() { 109 return Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP; 110 } 111 isLorLMr1()112 public static boolean isLorLMr1() { 113 return Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP 114 || Build.VERSION.SDK_INT == 22; // Lollipop MR1 115 } 116 isMOrHigher()117 public static boolean isMOrHigher() { 118 return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M 119 || "MNC".equals(Build.VERSION.CODENAME); 120 } 121 } 122