19199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin/* 2b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong * Copyright (C) 2013 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 17b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kongpackage com.android.camera.util; 189199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin 1976bfd87c90c98a46c06ea67dd895fc8f016f7267Owen Linimport android.os.Build; 209199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin 21708bfce7f38274073611a32de69e16fe8bf292eaAngus Kongimport java.lang.reflect.Field; 22708bfce7f38274073611a32de69e16fe8bf292eaAngus Kong 239199c4d69ebc9b9589271d1e62ba80138b1db700Owen Linpublic class ApiHelper { 24fdefc72616d55de5f4e13a3e60fb9561cc8488cbAlan Newberger // Documented value of CPU_ABI on x86 architectures 25fdefc72616d55de5f4e13a3e60fb9561cc8488cbAlan Newberger private static final String X86ABI = "x86"; 26fdefc72616d55de5f4e13a3e60fb9561cc8488cbAlan Newberger 278f69397b9c6acf6da28244a8ccea596546f34f87Bobby Georgescu public static final boolean AT_LEAST_16 = Build.VERSION.SDK_INT >= 16; 28a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware 295df64b0a818d4f85cb14602db725f05b0055c1d9Mangesh Ghiware public static final boolean HAS_APP_GALLERY = 305df64b0a818d4f85cb14602db725f05b0055c1d9Mangesh Ghiware Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1; 31a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware 32a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware public static final boolean HAS_ANNOUNCE_FOR_ACCESSIBILITY = 33638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 349341cc2b9e2939e9915ff62fa9b11e56951947d1Chih-Chung Chang public static final boolean HAS_AUTO_FOCUS_MOVE_CALLBACK = 35638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 36708bfce7f38274073611a32de69e16fe8bf292eaAngus Kong public static final boolean HAS_MEDIA_ACTION_SOUND = 37638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 38a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware public static final boolean HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT = 39a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 40a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware public static final boolean HAS_SET_BEAM_PUSH_URIS = 41a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 42fbf6dbaf20e1508f19468c33021813d078afdb35Angus Kong public static final boolean HAS_SURFACE_TEXTURE_RECORDING = 43638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 44040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu public static final boolean HAS_ROBOTO_MEDIUM_FONT = 4553b3ddbae16c5efbac842e158525720d0b9108cbDoris Liu Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 46a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware 479bf0fd606a624138b8c1123d168f06a24c4d20a3Sascha Haeberling public static final boolean HAS_CAMERA_HDR_PLUS = isKitKatOrHigher(); 48d25eac4c69ccda0a9e91f6af8032b0624554e7acSpike Sprague public static final boolean HDR_PLUS_CAN_USE_ARBITRARY_ASPECT_RATIOS = isKitKatMR2OrHigher(); 49ea1d1d283f6e75f012fe091608cf0b588866a511Wu-cheng Li public static final boolean HAS_CAMERA_HDR = 50638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1; 51a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware public static final boolean HAS_DISPLAY_LISTENER = 52a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1; 536afdb1769adddaf94116a7d1cad82740a9455641Michael Kolb 54d1e0a6e78d686cdc259a2978e988cdd734ca6a2fMichael Kolb public static final boolean HAS_ORIENTATION_LOCK = 55638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; 56a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware public static final boolean HAS_ROTATION_ANIMATION = 57a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; 58638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling 59638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling public static final boolean HAS_HIDEYBARS = isKitKatOrHigher(); 60f479c0db587cb21ea0699e2421f1d0d8e5ada289Doris Liu 61fdefc72616d55de5f4e13a3e60fb9561cc8488cbAlan Newberger // Don't use renderscript for x86 K, L is OK. See b/18435492 62fdefc72616d55de5f4e13a3e60fb9561cc8488cbAlan Newberger public static final boolean HAS_RENDERSCRIPT = 63fdefc72616d55de5f4e13a3e60fb9561cc8488cbAlan Newberger !(Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT && X86ABI.equals(Build.CPU_ABI)); 64fdefc72616d55de5f4e13a3e60fb9561cc8488cbAlan Newberger 652631a15a37b890f4ee720c5a4bbe3e654524deb6Alan Newberger public static final boolean IS_NEXUS_4 = "mako".equalsIgnoreCase(Build.DEVICE); 664c1bffecc94cedf56d188eca40bd65a854746413Sascha Haeberling public static final boolean IS_NEXUS_5 = "LGE".equalsIgnoreCase(Build.MANUFACTURER) 674c1bffecc94cedf56d188eca40bd65a854746413Sascha Haeberling && "hammerhead".equalsIgnoreCase(Build.DEVICE); 684c1bffecc94cedf56d188eca40bd65a854746413Sascha Haeberling public static final boolean IS_NEXUS_6 = "motorola".equalsIgnoreCase(Build.MANUFACTURER) 694c1bffecc94cedf56d188eca40bd65a854746413Sascha Haeberling && "shamu".equalsIgnoreCase(Build.DEVICE); 70838095ae165f8a16bde986a9853c1d835358aea9I-Jong Lin public static final boolean IS_NEXUS_9 = "htc".equalsIgnoreCase(Build.MANUFACTURER) 71838095ae165f8a16bde986a9853c1d835358aea9I-Jong Lin && ("flounder".equalsIgnoreCase(Build.DEVICE) 72838095ae165f8a16bde986a9853c1d835358aea9I-Jong Lin || "flounder_lte".equalsIgnoreCase(Build.DEVICE)); 73454d63f617489281971fb151abfe14730209c047Angus Kong 747c703ced0248d6a368a216e9d7699ab8e9565415Puneet Lall public static final boolean HAS_CAMERA_2_API = isLOrHigher(); 757c703ced0248d6a368a216e9d7699ab8e9565415Puneet Lall 7636d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li public static int getIntFieldIfExists(Class<?> klass, String fieldName, 7736d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li Class<?> obj, int defaultVal) { 7836d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li try { 7936d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li Field f = klass.getDeclaredField(fieldName); 8036d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li return f.getInt(obj); 8136d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li } catch (Exception e) { 8236d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li return defaultVal; 8336d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li } 8436d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li } 8536d16bc95d7ed7d12fc8136ae68a9579b20cf5a1Wu-cheng Li 86638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling public static boolean isKitKatOrHigher() { 87638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling // TODO: Remove CODENAME check as soon as VERSION_CODES.KITKAT is final. 88638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT 89638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling || "KeyLimePie".equals(Build.VERSION.CODENAME); 90b4cadafb8c454aff10b4096a801cc71f8519fe8aOwen Lin } 91fb172acde20561b03b2279673857b8bea71d81e7Alan Newberger 92d25eac4c69ccda0a9e91f6af8032b0624554e7acSpike Sprague public static boolean isKitKatMR2OrHigher() { 93d25eac4c69ccda0a9e91f6af8032b0624554e7acSpike Sprague return isLOrHigher() 94d25eac4c69ccda0a9e91f6af8032b0624554e7acSpike Sprague || (isKitKatOrHigher() && 95d25eac4c69ccda0a9e91f6af8032b0624554e7acSpike Sprague ("4.4.4".equals(Build.VERSION.RELEASE) || "4.4.3".equals(Build.VERSION.RELEASE))); 96d25eac4c69ccda0a9e91f6af8032b0624554e7acSpike Sprague } 97d25eac4c69ccda0a9e91f6af8032b0624554e7acSpike Sprague 98b6c4a314d0a0a185e6d987298ef9b7f4db8a6a2fSenpo Hu public static boolean isLollipop() { 99b6c4a314d0a0a185e6d987298ef9b7f4db8a6a2fSenpo Hu return Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP; 100b6c4a314d0a0a185e6d987298ef9b7f4db8a6a2fSenpo Hu } 101b6c4a314d0a0a185e6d987298ef9b7f4db8a6a2fSenpo Hu 102fb172acde20561b03b2279673857b8bea71d81e7Alan Newberger public static boolean isLOrHigher() { 10343d66a0cac75bbb0adb0933124002e1eb1f439b9Dianne Hackborn return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP 1044dc301a073dab22b9bc12e0b846530d3a80bf8f7I-Jong Lin || "L".equals(Build.VERSION.CODENAME) || "LOLLIPOP".equals(Build.VERSION.CODENAME); 105fb172acde20561b03b2279673857b8bea71d81e7Alan Newberger } 106a8c7362bad737952f671cc6b26f12209c8a514a5Sascha Haeberling 107a8c7362bad737952f671cc6b26f12209c8a514a5Sascha Haeberling public static boolean isLMr1OrHigher() { 108a8c7362bad737952f671cc6b26f12209c8a514a5Sascha Haeberling return Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP; 109a8c7362bad737952f671cc6b26f12209c8a514a5Sascha Haeberling } 1107e39f8b015985fc0e539e14c193286065b5e51d4Pengchong Jin 1117e39f8b015985fc0e539e14c193286065b5e51d4Pengchong Jin public static boolean isLorLMr1() { 1127e39f8b015985fc0e539e14c193286065b5e51d4Pengchong Jin return Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP 1137e39f8b015985fc0e539e14c193286065b5e51d4Pengchong Jin || Build.VERSION.SDK_INT == 22; // Lollipop MR1 1147e39f8b015985fc0e539e14c193286065b5e51d4Pengchong Jin } 115c2d5d078821ca5e8de0c0d03b6603bf7c505c53fAlan Newberger 116c2d5d078821ca5e8de0c0d03b6603bf7c505c53fAlan Newberger public static boolean isMOrHigher() { 117ef0b96ce4571805066c1e0865d41272b066e22e6Dianne Hackborn return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M 118c2d5d078821ca5e8de0c0d03b6603bf7c505c53fAlan Newberger || "MNC".equals(Build.VERSION.CODENAME); 119c2d5d078821ca5e8de0c0d03b6603bf7c505c53fAlan Newberger } 1209199c4d69ebc9b9589271d1e62ba80138b1db700Owen Lin} 121