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
17package android.content.pm;
18
19import android.os.Parcel;
20import 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 */
36public 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