Allow specifying ANGLE in manifest via meta-data

This CL allows the application's manifest to specify whether
to use ANGLE or native drivers for GLES via meta-data.

To enable, place the following within <application> and it
will be detected by the platform:

    <meta-data
        android:name:"com.android.angle.GLES_MODE"
        android:value:"angle" />

The manifest can also specify "native" to opt-out of
ANGLE, but native will be the default for Q release.

This method is in service of the tech preview of
ANGLE for Android. For Q release, we should move this
to the Android API.

Test: Manual, verified manifest can specify angle/native/foo
Change-Id: Iedc081a3700e05b8c391016704d0c9d623a4e76d
(cherry picked from commit e1cff35269c19020de5bf15028f0c4051ee508c5)
diff --git a/libs/graphicsenv/GraphicsEnv.cpp b/libs/graphicsenv/GraphicsEnv.cpp
index 282b468..2a7d76e 100644
--- a/libs/graphicsenv/GraphicsEnv.cpp
+++ b/libs/graphicsenv/GraphicsEnv.cpp
@@ -57,7 +57,7 @@
 }
 
 void GraphicsEnv::setAngleInfo(const std::string path, const std::string appName,
-                               bool developerOptIn) {
+                               const std::string appPref, bool developerOptIn) {
     if (!mAnglePath.empty()) {
         ALOGV("ignoring attempt to change ANGLE path from '%s' to '%s'", mAnglePath.c_str(),
               path.c_str());
@@ -74,6 +74,14 @@
         mAngleAppName = appName;
     }
 
+    if (!mAngleAppPref.empty()) {
+        ALOGV("ignoring attempt to change ANGLE application opt-in from '%s' to '%s'",
+              mAngleAppPref.c_str(), appPref.c_str());
+    } else {
+        ALOGV("setting ANGLE application opt-in to '%s'", appPref.c_str());
+        mAngleAppPref = appPref;
+    }
+
     mAngleDeveloperOptIn = developerOptIn;
 }
 
@@ -100,6 +108,11 @@
     return mAngleDeveloperOptIn;
 }
 
+const char* GraphicsEnv::getAngleAppPref() {
+    if (mAngleAppPref.empty()) return nullptr;
+    return mAngleAppPref.c_str();
+}
+
 const std::string GraphicsEnv::getLayerPaths(){
     return mLayerPaths;
 }
@@ -165,4 +178,7 @@
 bool android_getAngleDeveloperOptIn() {
     return android::GraphicsEnv::getInstance().getAngleDeveloperOptIn();
 }
+const char* android_getAngleAppPref() {
+    return android::GraphicsEnv::getInstance().getAngleAppPref();
+}
 }
diff --git a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h
index 58d4582..00e8fc0 100644
--- a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h
+++ b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h
@@ -42,9 +42,11 @@
     // (libraries must be stored uncompressed and page aligned); such elements
     // in the search path must have a '!' after the zip filename, e.g.
     //     /system/app/ANGLEPrebuilt/ANGLEPrebuilt.apk!/lib/arm64-v8a
-    void setAngleInfo(const std::string path, const std::string appName, const bool optIn);
+    void setAngleInfo(const std::string path, const std::string appName, const std::string appPref,
+                      bool devOptIn);
     android_namespace_t* getAngleNamespace();
     const char* getAngleAppName();
+    const char* getAngleAppPref();
     bool getAngleDeveloperOptIn();
 
     void setLayerPaths(NativeLoaderNamespace* appNamespace, const std::string layerPaths);
@@ -60,6 +62,7 @@
     std::string mDriverPath;
     std::string mAnglePath;
     std::string mAngleAppName;
+    std::string mAngleAppPref;
     bool mAngleDeveloperOptIn;
     std::string mDebugLayers;
     std::string mLayerPaths;
@@ -85,6 +88,7 @@
 android_namespace_t* android_getDriverNamespace();
 android_namespace_t* android_getAngleNamespace();
 const char* android_getAngleAppName();
+const char* android_getAngleAppPref();
 bool android_getAngleDeveloperOptIn();
 }
 
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp
index f5e0ad9..90721b8 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -486,12 +486,15 @@
 
     android_namespace_t* ns = android_getAngleNamespace();
     const char* app_name = android_getAngleAppName();
+    const char* app_pref = android_getAngleAppPref();
     bool developer_opt_in = android_getAngleDeveloperOptIn();
 
     if (ns) {
         // If we got a namespce for ANGLE, check any other conditions
         // before loading from it.
-        if (developer_opt_in) {
+        // TODO: Call opt-in logic rather than use pref directly
+        //       app_pref will be "angle", "native", or "dontcare"
+        if ((developer_opt_in || !strcmp(app_pref, "angle"))) {
             so = load_angle_from_namespace(kind, ns);
         }
     }