Have AEP GL feature depend on GLES 3.1 in badging

AAPT dump badging should output the uses-gl-es tag with
a version of 3.1 when android.hardware.opengles.aep is
declared as a feature.

Change-Id: I8affc6dad574c8303c6ba9810ad8e6e205ea9506
diff --git a/tests/UsesFeature2Test/AndroidManifest.xml b/tests/UsesFeature2Test/AndroidManifest.xml
index 724d186..6b6c4da 100644
--- a/tests/UsesFeature2Test/AndroidManifest.xml
+++ b/tests/UsesFeature2Test/AndroidManifest.xml
@@ -30,6 +30,7 @@
     </feature-group>
     <feature-group android:label="@string/gamepad">
         <uses-feature android:name="android.hardware.gamepad" />
+        <uses-feature android:name="android.hardware.opengles.aep" />
     </feature-group>
 
     <application android:label="@string/app_title">
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index ac1ae70..afeb546 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -611,6 +611,8 @@
  * Represents a <feature-group> tag in the AndroidManifest.xml
  */
 struct FeatureGroup {
+    FeatureGroup() : openGLESVersion(-1) {}
+
     /**
      * Human readable label
      */
@@ -620,6 +622,11 @@
      * Explicit features defined in the group
      */
     KeyedVector<String8, bool> features;
+
+    /**
+     * OpenGL ES version required
+     */
+    int openGLESVersion;
 };
 
 static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatures,
@@ -637,6 +644,10 @@
         const KeyedVector<String8, ImpliedFeature>* impliedFeatures = NULL) {
     printf("feature-group: label='%s'\n", grp.label.string());
 
+    if (grp.openGLESVersion > 0) {
+        printf("  uses-gl-es: '0x%x'\n", grp.openGLESVersion);
+    }
+
     const size_t numFeatures = grp.features.size();
     for (size_t i = 0; i < numFeatures; i++) {
         if (!grp.features[i]) {
@@ -688,6 +699,11 @@
     } else if (name == "android.hardware.touchscreen.multitouch.distinct") {
         grp->features.add(String8("android.hardware.touchscreen.multitouch"), true);
         grp->features.add(String8("android.hardware.touchscreen"), true);
+    } else if (name == "android.hardware.opengles.aep") {
+        const int openGLESVersion31 = 0x00030001;
+        if (openGLESVersion31 > grp->openGLESVersion) {
+            grp->openGLESVersion = openGLESVersion31;
+        }
     }
 }
 
@@ -1316,14 +1332,16 @@
                             int vers = getIntegerAttribute(tree,
                                     GL_ES_VERSION_ATTR, &error);
                             if (error == "") {
-                                printf("uses-gl-es:'0x%x'\n", vers);
+                                if (vers > commonFeatures.openGLESVersion) {
+                                    commonFeatures.openGLESVersion = vers;
+                                }
                             }
                         }
                     } else if (tag == "uses-permission") {
                         String8 name = getAttribute(tree, NAME_ATTR, &error);
                         if (name != "" && error == "") {
                             if (name == "android.permission.CAMERA") {
-                                addImpliedFeature(&impliedFeatures, "android.hardware.feature",
+                                addImpliedFeature(&impliedFeatures, "android.hardware.camera",
                                         String8::format("requested %s permission", name.string())
                                         .string());
                             } else if (name == "android.permission.ACCESS_FINE_LOCATION") {
@@ -1639,18 +1657,23 @@
                             }
                         }
                     } else if (withinFeatureGroup && tag == "uses-feature") {
-                        String8 name = getResolvedAttribute(&res, tree, NAME_ATTR, &error);
-                        if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
-                                    error.string());
-                            goto bail;
-                        }
-
-                        int required = getIntegerAttribute(tree, REQUIRED_ATTR, NULL, 1);
                         FeatureGroup& top = featureGroups.editTop();
-                        top.features.add(name, required);
-                        if (required) {
-                            addParentFeatures(&top, name);
+
+                        String8 name = getResolvedAttribute(&res, tree, NAME_ATTR, &error);
+                        if (name != "" && error == "") {
+                            int required = getIntegerAttribute(tree, REQUIRED_ATTR, NULL, 1);
+                            top.features.add(name, required);
+                            if (required) {
+                                addParentFeatures(&top, name);
+                            }
+
+                        } else {
+                            int vers = getIntegerAttribute(tree, GL_ES_VERSION_ATTR, &error);
+                            if (error == "") {
+                                if (vers > top.openGLESVersion) {
+                                    top.openGLESVersion = vers;
+                                }
+                            }
                         }
                     }
                 } else if (depth == 4) {
@@ -1839,12 +1862,17 @@
                 for (size_t i = 0; i < numFeatureGroups; i++) {
                     FeatureGroup& grp = featureGroups.editItemAt(i);
 
+                    if (commonFeatures.openGLESVersion > grp.openGLESVersion) {
+                        grp.openGLESVersion = commonFeatures.openGLESVersion;
+                    }
+
                     // Merge the features defined in the top level (not inside a <feature-group>)
                     // with this feature group.
                     const size_t numCommonFeatures = commonFeatures.features.size();
                     for (size_t j = 0; j < numCommonFeatures; j++) {
                         if (grp.features.indexOfKey(commonFeatures.features.keyAt(j)) < 0) {
-                            grp.features.add(commonFeatures.features.keyAt(j), commonFeatures.features[j]);
+                            grp.features.add(commonFeatures.features.keyAt(j),
+                                    commonFeatures.features[j]);
                         }
                     }