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