Home | History | Annotate | Download | only in pm
      1 /*
      2  * Copyright (C) 2009 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 android.content.pm;
     18 
     19 import android.os.Parcel;
     20 import android.os.Parcelable;
     21 
     22 /**
     23  * Definition of a single optional hardware or software feature of an Android
     24  * device.
     25  * <p>
     26  * This object is used to represent both features supported by a device and
     27  * features requested by an app. Apps can request that certain features be
     28  * available as a prerequisite to being installed through the
     29  * {@code uses-feature} tag in their manifests.
     30  * <p>
     31  * Starting in {@link android.os.Build.VERSION_CODES#N}, features can have a
     32  * version, which must always be backwards compatible. That is, a device
     33  * claiming to support version 3 of a specific feature must support apps
     34  * requesting version 1 of that feature.
     35  */
     36 public class FeatureInfo implements Parcelable {
     37     /**
     38      * The name of this feature, for example "android.hardware.camera".  If
     39      * this is null, then this is an OpenGL ES version feature as described
     40      * in {@link #reqGlEsVersion}.
     41      */
     42     public String name;
     43 
     44     /**
     45      * If this object represents a feature supported by a device, this is the
     46      * maximum version of this feature supported by the device. The device
     47      * implicitly supports all older versions of this feature.
     48      * <p>
     49      * If this object represents a feature requested by an app, this is the
     50      * minimum version of the feature required by the app.
     51      * <p>
     52      * When a feature version is undefined by a device, it's assumed to be
     53      * version 0.
     54      */
     55     public int version;
     56 
     57     /**
     58      * Default value for {@link #reqGlEsVersion};
     59      */
     60     public static final int GL_ES_VERSION_UNDEFINED = 0;
     61 
     62     /**
     63      * The GLES version used by an application. The upper order 16 bits represent the
     64      * major version and the lower order 16 bits the minor version.  Only valid
     65      * if {@link #name} is null.
     66      */
     67     public int reqGlEsVersion;
     68 
     69     /**
     70      * Set on {@link #flags} if this feature has been required by the application.
     71      */
     72     public static final int FLAG_REQUIRED = 0x0001;
     73 
     74     /**
     75      * Additional flags.  May be zero or more of {@link #FLAG_REQUIRED}.
     76      */
     77     public int flags;
     78 
     79     public FeatureInfo() {
     80     }
     81 
     82     public FeatureInfo(FeatureInfo orig) {
     83         name = orig.name;
     84         version = orig.version;
     85         reqGlEsVersion = orig.reqGlEsVersion;
     86         flags = orig.flags;
     87     }
     88 
     89     @Override
     90     public String toString() {
     91         if (name != null) {
     92             return "FeatureInfo{"
     93                     + Integer.toHexString(System.identityHashCode(this))
     94                     + " " + name + " v=" + version + " fl=0x" + Integer.toHexString(flags) + "}";
     95         } else {
     96             return "FeatureInfo{"
     97                     + Integer.toHexString(System.identityHashCode(this))
     98                     + " glEsVers=" + getGlEsVersion()
     99                     + " fl=0x" + Integer.toHexString(flags) + "}";
    100         }
    101     }
    102 
    103     @Override
    104     public int describeContents() {
    105         return 0;
    106     }
    107 
    108     @Override
    109     public void writeToParcel(Parcel dest, int parcelableFlags) {
    110         dest.writeString(name);
    111         dest.writeInt(version);
    112         dest.writeInt(reqGlEsVersion);
    113         dest.writeInt(flags);
    114     }
    115 
    116     public static final Creator<FeatureInfo> CREATOR = new Creator<FeatureInfo>() {
    117         @Override
    118         public FeatureInfo createFromParcel(Parcel source) {
    119             return new FeatureInfo(source);
    120         }
    121         @Override
    122         public FeatureInfo[] newArray(int size) {
    123             return new FeatureInfo[size];
    124         }
    125     };
    126 
    127     private FeatureInfo(Parcel source) {
    128         name = source.readString();
    129         version = source.readInt();
    130         reqGlEsVersion = source.readInt();
    131         flags = source.readInt();
    132     }
    133 
    134     /**
    135      * This method extracts the major and minor version of reqGLEsVersion attribute
    136      * and returns it as a string. Say reqGlEsVersion value of 0x00010002 is returned
    137      * as 1.2
    138      * @return String representation of the reqGlEsVersion attribute
    139      */
    140     public String getGlEsVersion() {
    141         int major = ((reqGlEsVersion & 0xffff0000) >> 16);
    142         int minor = reqGlEsVersion & 0x0000ffff;
    143         return String.valueOf(major)+"."+String.valueOf(minor);
    144     }
    145 }
    146