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