Merge "ANGLE In Use Dialog Box"

This commit is contained in:
Tim Van Patten
2019-02-12 23:48:00 +00:00
committed by Android (Google) Code Review
8 changed files with 134 additions and 29 deletions

View File

@@ -65,6 +65,7 @@ import android.net.Uri;
import android.os.BadParcelableException;
import android.os.Build;
import android.os.Bundle;
import android.os.GraphicsEnvironment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -7708,6 +7709,8 @@ public class Activity extends ContextThemeWrapper
}
}
GraphicsEnvironment.getInstance().showAngleInUseDialogBox(this);
mActivityTransitionState.enterReady(this);
dispatchActivityPostStarted();
}

View File

@@ -16,6 +16,7 @@
package android.os;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
@@ -30,6 +31,7 @@ import android.opengl.EGL14;
import android.provider.Settings;
import android.util.Base64;
import android.util.Log;
import android.widget.Toast;
import com.android.framework.protobuf.InvalidProtocolBufferException;
@@ -222,9 +224,17 @@ public class GraphicsEnvironment {
}
private static List<String> getGlobalSettingsString(Bundle bundle, String globalSetting) {
List<String> valueList = null;
final String settingsValue = bundle.getString(globalSetting);
private static List<String> getGlobalSettingsString(ContentResolver contentResolver,
Bundle bundle,
String globalSetting) {
final List<String> valueList;
final String settingsValue;
if (bundle != null) {
settingsValue = bundle.getString(globalSetting);
} else {
settingsValue = Settings.Global.getString(contentResolver, globalSetting);
}
if (settingsValue != null) {
valueList = new ArrayList<>(Arrays.asList(settingsValue.split(",")));
@@ -246,17 +256,27 @@ public class GraphicsEnvironment {
return -1;
}
private static String getDriverForPkg(Bundle bundle, String packageName) {
final String allUseAngle =
bundle.getString(Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE);
private static String getDriverForPkg(Context context, Bundle bundle, String packageName) {
final String allUseAngle;
if (bundle != null) {
allUseAngle =
bundle.getString(Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE);
} else {
ContentResolver contentResolver = context.getContentResolver();
allUseAngle = Settings.Global.getString(contentResolver,
Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE);
}
if ((allUseAngle != null) && allUseAngle.equals("1")) {
return sDriverMap.get(OpenGlDriverChoice.ANGLE);
}
final List<String> globalSettingsDriverPkgs = getGlobalSettingsString(
bundle, Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS);
final List<String> globalSettingsDriverValues = getGlobalSettingsString(
bundle, Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES);
final ContentResolver contentResolver = context.getContentResolver();
final List<String> globalSettingsDriverPkgs =
getGlobalSettingsString(contentResolver, bundle,
Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS);
final List<String> globalSettingsDriverValues =
getGlobalSettingsString(contentResolver, bundle,
Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES);
// Make sure we have a good package name
if ((packageName == null) || (packageName.isEmpty())) {
@@ -308,7 +328,7 @@ public class GraphicsEnvironment {
* True: Temporary rules file was loaded.
* False: Temporary rules file was *not* loaded.
*/
private boolean setupAngleWithTempRulesFile(Context context,
private static boolean setupAngleWithTempRulesFile(Context context,
String packageName,
String paths,
String devOptIn) {
@@ -372,7 +392,7 @@ public class GraphicsEnvironment {
* True: APK rules file was loaded.
* False: APK rules file was *not* loaded.
*/
private boolean setupAngleRulesApk(String anglePkgName,
private static boolean setupAngleRulesApk(String anglePkgName,
ApplicationInfo angleInfo,
PackageManager pm,
String packageName,
@@ -405,23 +425,32 @@ public class GraphicsEnvironment {
/**
* Pull ANGLE whitelist from GlobalSettings and compare against current package
*/
private boolean checkAngleWhitelist(Bundle bundle, String packageName) {
private static boolean checkAngleWhitelist(Context context, Bundle bundle, String packageName) {
final ContentResolver contentResolver = context.getContentResolver();
final List<String> angleWhitelist =
getGlobalSettingsString(bundle, Settings.Global.GLOBAL_SETTINGS_ANGLE_WHITELIST);
getGlobalSettingsString(contentResolver, bundle,
Settings.Global.GLOBAL_SETTINGS_ANGLE_WHITELIST);
return angleWhitelist.contains(packageName);
}
/**
* Pass ANGLE details down to trigger enable logic
*
* @param context
* @param bundle
* @param packageName
* @return true: ANGLE setup successfully
* false: ANGLE not setup (not on whitelist, ANGLE not present, etc.)
*/
public void setupAngle(Context context, Bundle bundle, PackageManager pm, String packageName) {
public boolean setupAngle(Context context, Bundle bundle, PackageManager pm,
String packageName) {
if (packageName.isEmpty()) {
Log.v(TAG, "No package name available yet, skipping ANGLE setup");
return;
return false;
}
final String devOptIn = getDriverForPkg(bundle, packageName);
final String devOptIn = getDriverForPkg(context, bundle, packageName);
if (DEBUG) {
Log.v(TAG, "ANGLE Developer option for '" + packageName + "' "
+ "set to: '" + devOptIn + "'");
@@ -439,11 +468,11 @@ public class GraphicsEnvironment {
// load a driver, GraphicsEnv::shouldUseAngle() has seen the package name before
// and can confidently answer yes/no based on the previously set developer
// option value.
final boolean whitelisted = checkAngleWhitelist(bundle, packageName);
final boolean whitelisted = checkAngleWhitelist(context, bundle, packageName);
final boolean defaulted = devOptIn.equals(sDriverMap.get(OpenGlDriverChoice.DEFAULT));
final boolean rulesCheck = (whitelisted || !defaulted);
if (!rulesCheck) {
return;
return false;
}
if (whitelisted) {
@@ -456,7 +485,7 @@ public class GraphicsEnvironment {
final String anglePkgName = getAnglePackageName(pm);
if (anglePkgName.isEmpty()) {
Log.e(TAG, "Failed to find ANGLE package.");
return;
return false;
}
final ApplicationInfo angleInfo;
@@ -464,7 +493,7 @@ public class GraphicsEnvironment {
angleInfo = pm.getApplicationInfo(anglePkgName, PackageManager.MATCH_SYSTEM_ONLY);
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "ANGLE package '" + anglePkgName + "' not installed");
return;
return false;
}
final String abi = chooseAbi(angleInfo);
@@ -480,12 +509,62 @@ public class GraphicsEnvironment {
if (setupAngleWithTempRulesFile(context, packageName, paths, devOptIn)) {
// We setup ANGLE with a temp rules file, so we're done here.
return;
return true;
}
if (setupAngleRulesApk(anglePkgName, angleInfo, pm, packageName, paths, devOptIn)) {
// We setup ANGLE with rules from the APK, so we're done here.
return;
return true;
}
return false;
}
/**
* Determine if the "ANGLE In Use" dialog box should be shown.
*/
private boolean shouldShowAngleInUseDialogBox(Context context) {
try {
ContentResolver contentResolver = context.getContentResolver();
final int showDialogBox = Settings.Global.getInt(contentResolver,
Settings.Global.GLOBAL_SETTINGS_SHOW_ANGLE_IN_USE_DIALOG_BOX);
return (showDialogBox == 1);
} catch (Settings.SettingNotFoundException | SecurityException e) {
// Do nothing and move on
}
// No setting, so assume false
return false;
}
/**
* Determine if ANGLE should be used.
*/
private boolean shouldUseAngle(Context context, String packageName) {
// Need to make sure we are evaluating ANGLE usage for the correct circumstances
if (!setupAngle(context, null, context.getPackageManager(), packageName)) {
Log.v(TAG, "Package '" + packageName + "' should use not ANGLE");
return false;
}
final boolean useAngle = getShouldUseAngle(packageName);
Log.v(TAG, "Package '" + packageName + "' should use ANGLE = '" + useAngle + "'");
return useAngle;
}
/**
* Show the ANGLE in Use Dialog Box
* @param context
*/
public void showAngleInUseDialogBox(Context context) {
final String packageName = context.getPackageName();
if (shouldShowAngleInUseDialogBox(context) && shouldUseAngle(context, packageName)) {
final String toastMsg = packageName + " is using ANGLE";
final Toast toast = Toast.makeText(context, toastMsg, Toast.LENGTH_LONG);
toast.show();
}
}
@@ -541,19 +620,19 @@ public class GraphicsEnvironment {
if (gameDriverAllApps != 1) {
// GAME_DRIVER_OPT_OUT_APPS has higher priority than GAME_DRIVER_OPT_IN_APPS
if (getGlobalSettingsString(coreSettings, Settings.Global.GAME_DRIVER_OPT_OUT_APPS)
.contains(packageName)) {
if (getGlobalSettingsString(null, coreSettings,
Settings.Global.GAME_DRIVER_OPT_OUT_APPS).contains(packageName)) {
if (DEBUG) {
Log.w(TAG, packageName + " opts out from Game Driver.");
}
return false;
}
final boolean isOptIn =
getGlobalSettingsString(coreSettings, Settings.Global.GAME_DRIVER_OPT_IN_APPS)
.contains(packageName);
getGlobalSettingsString(null, coreSettings,
Settings.Global.GAME_DRIVER_OPT_IN_APPS).contains(packageName);
if (!isOptIn
&& !getGlobalSettingsString(coreSettings, Settings.Global.GAME_DRIVER_WHITELIST)
.contains(packageName)) {
&& !getGlobalSettingsString(null, coreSettings,
Settings.Global.GAME_DRIVER_WHITELIST).contains(packageName)) {
if (DEBUG) {
Log.w(TAG, packageName + " is not on the whitelist.");
}
@@ -660,4 +739,5 @@ public class GraphicsEnvironment {
long driverVersionCode, String appPackageName);
private static native void setAngleInfo(String path, String appPackage, String devOptIn,
FileDescriptor rulesFd, long rulesOffset, long rulesLength);
private static native boolean getShouldUseAngle(String packageName);
}

View File

@@ -12317,6 +12317,14 @@ public final class Settings {
public static final String GLOBAL_SETTINGS_ANGLE_WHITELIST =
"angle_whitelist";
/**
* Show the "ANGLE In Use" dialog box to the user when ANGLE is the OpenGL driver.
* The value is a boolean (1 or 0).
* @hide
*/
public static final String GLOBAL_SETTINGS_SHOW_ANGLE_IN_USE_DIALOG_BOX =
"show_angle_in_use_dialog_box";
/**
* Game Driver global preference for all Apps.
* 0 = Default

View File

@@ -55,6 +55,11 @@ void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring appNa
devOptInChars.c_str(), rulesFd_native, rulesOffset, rulesLength);
}
bool shouldUseAngle_native(JNIEnv* env, jobject clazz, jstring appName) {
ScopedUtfChars appNameChars(env, appName);
return android::GraphicsEnv::getInstance().shouldUseAngle(appNameChars.c_str());
}
void setLayerPaths_native(JNIEnv* env, jobject clazz, jobject classLoader, jstring layerPaths) {
android::NativeLoaderNamespace* appNamespace = android::FindNativeLoaderNamespaceByClassLoader(
env, classLoader);
@@ -81,6 +86,7 @@ const JNINativeMethod g_methods[] = {
{ "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPath) },
{ "setGpuStats", "(Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;)V", reinterpret_cast<void*>(setGpuStats_native) },
{ "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/io/FileDescriptor;JJ)V", reinterpret_cast<void*>(setAngleInfo_native) },
{ "getShouldUseAngle", "(Ljava/lang/String;)Z", reinterpret_cast<void*>(shouldUseAngle_native) },
{ "setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast<void*>(setLayerPaths_native) },
{ "setDebugLayers", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDebugLayers_native) },
{ "setDebugLayersGLES", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDebugLayersGLES_native) },

View File

@@ -451,6 +451,8 @@ message GlobalSettingsProto {
// Game Driver - List of blacklists, each blacklist is a blacklist for
// a specific Game Driver version
optional SettingProto game_driver_blacklists = 14;
// ANGLE - Show a dialog box when ANGLE is selected for the currently running PKG
optional SettingProto show_angle_in_use_dialog = 15;
}
optional Gpu gpu = 59;

View File

@@ -494,6 +494,7 @@ public class SettingsBackupTest {
Settings.Global.GAME_DRIVER_BLACKLISTS,
Settings.Global.GAME_DRIVER_BLACKLIST,
Settings.Global.GAME_DRIVER_WHITELIST,
Settings.Global.GLOBAL_SETTINGS_SHOW_ANGLE_IN_USE_DIALOG_BOX,
Settings.Global.GPU_DEBUG_LAYER_APP,
Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING,
Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT,

View File

@@ -697,6 +697,9 @@ class SettingsProtoDumpUtil {
dumpSetting(s, p,
Settings.Global.GLOBAL_SETTINGS_ANGLE_WHITELIST,
GlobalSettingsProto.Gpu.ANGLE_WHITELIST);
dumpSetting(s, p,
Settings.Global.GLOBAL_SETTINGS_SHOW_ANGLE_IN_USE_DIALOG_BOX,
GlobalSettingsProto.Gpu.SHOW_ANGLE_IN_USE_DIALOG);
dumpSetting(s, p,
Settings.Global.GPU_DEBUG_LAYER_APP,
GlobalSettingsProto.Gpu.DEBUG_LAYER_APP);

View File

@@ -65,6 +65,8 @@ final class CoreSettingsObserver extends ContentObserver {
Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES, String.class);
sGlobalSettingToTypeMap.put(
Settings.Global.GLOBAL_SETTINGS_ANGLE_WHITELIST, String.class);
sGlobalSettingToTypeMap.put(
Settings.Global.GLOBAL_SETTINGS_SHOW_ANGLE_IN_USE_DIALOG_BOX, String.class);
sGlobalSettingToTypeMap.put(Settings.Global.ENABLE_GPU_DEBUG_LAYERS, int.class);
sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_APP, String.class);
sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYERS, String.class);