Update ANGLE Developer Options

Update ANGLE developer options to allow selecting the OpenGL driver
(default, ANGLE, native) for each app as well as forcing ANGLE for all
apps.

The settings are also being moved from within the Android settings (here)
to the ANGLE APK, so they can be updated more quickly/easily.

Bug: 118384925
Test: Verify the default/ANGLE/native values are saved and applied and
used by the loader.

Change-Id: Ide449704dd703657bd316231987a07becf8699c9
This commit is contained in:
Tim Van Patten
2018-11-09 17:09:44 -07:00
parent 34668b6494
commit 50f700f1d6
5 changed files with 6 additions and 263 deletions

View File

@@ -424,9 +424,6 @@
android:summary="%s"
android:title="@string/simulate_color_space" />
<Preference android:key="angle_enabled_app"
android:title="@string/angle_enabled_app" />
<Preference android:key="updated_gfx_driver_dev_opt_in_app"
android:summary="@string/updated_gfx_driver_dev_opt_in_app_summary"
android:title="@string/updated_gfx_driver_dev_opt_in_app" />

View File

@@ -1,119 +0,0 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.development;
import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes
.REQUEST_CODE_ANGLE_ENABLED_APP;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.provider.Settings;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
public class AngleEnabledAppPreferenceController extends DeveloperOptionsPreferenceController
implements PreferenceControllerMixin, OnActivityResultListener {
private static final String ANGLE_ENABLED_APP_KEY = "angle_enabled_app";
private final DevelopmentSettingsDashboardFragment mFragment;
private final PackageManager mPackageManager;
public AngleEnabledAppPreferenceController(Context context,
DevelopmentSettingsDashboardFragment fragment) {
super(context);
mFragment = fragment;
mPackageManager = mContext.getPackageManager();
}
@Override
public String getPreferenceKey() {
return ANGLE_ENABLED_APP_KEY;
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (ANGLE_ENABLED_APP_KEY.equals(preference.getKey())) {
// pass it on to settings
final Intent intent = getActivityStartIntent();
mFragment.startActivityForResult(intent, REQUEST_CODE_ANGLE_ENABLED_APP);
return true;
}
return false;
}
@Override
public void updateState(Preference preference) {
updatePreferenceSummary();
}
@Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != REQUEST_CODE_ANGLE_ENABLED_APP || resultCode != Activity.RESULT_OK) {
return false;
}
Settings.Global.putString(mContext.getContentResolver(), Settings.Global.ANGLE_ENABLED_APP,
data.getAction());
updatePreferenceSummary();
return true;
}
@Override
protected void onDeveloperOptionsSwitchDisabled() {
super.onDeveloperOptionsSwitchDisabled();
mPreference.setSummary(mContext.getResources().getString(
R.string.angle_enabled_app_not_set));
}
@VisibleForTesting
Intent getActivityStartIntent() {
Intent intent = new Intent(mContext, AppPicker.class);
intent.putExtra(AppPicker.EXTRA_NON_SYSTEM, true /* value */);
return intent;
}
private void updatePreferenceSummary() {
final String angleEnabledApp = Settings.Global.getString(
mContext.getContentResolver(), Settings.Global.ANGLE_ENABLED_APP);
if (angleEnabledApp != null && angleEnabledApp.length() > 0) {
mPreference.setSummary(mContext.getResources().getString(
R.string.angle_enabled_app_set,
getAppLabel(angleEnabledApp)));
} else {
mPreference.setSummary(mContext.getResources().getString(
R.string.angle_enabled_app_not_set));
}
}
private String getAppLabel(String angleEnabledApp) {
try {
final ApplicationInfo ai = mPackageManager.getApplicationInfo(angleEnabledApp,
PackageManager.GET_DISABLED_COMPONENTS);
final CharSequence lab = mPackageManager.getApplicationLabel(ai);
return lab != null ? lab.toString() : angleEnabledApp;
} catch (PackageManager.NameNotFoundException e) {
return angleEnabledApp;
}
}
}

View File

@@ -26,7 +26,11 @@ public interface DevelopmentOptionsActivityRequestCodes {
int REQUEST_MOCK_LOCATION_APP = 2;
int REQUEST_CODE_ANGLE_ENABLED_APP = 3;
int REQUEST_CODE_ANGLE_ALL_USE_ANGLE = 3;
int REQUEST_CODE_UPDATED_GFX_DRIVER_DEV_OPT_IN_APP = 4;
int REQUEST_CODE_ANGLE_DRIVER_PKGS = 4;
int REQUEST_CODE_ANGLE_DRIVER_VALUES = 5;
int REQUEST_CODE_UPDATED_GFX_DRIVER_DEV_OPT_IN_APP = 6;
}

View File

@@ -423,7 +423,6 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
controllers.add(new SelectDebugAppPreferenceController(context, fragment));
controllers.add(new WaitForDebuggerPreferenceController(context));
controllers.add(new EnableGpuDebugLayersPreferenceController(context));
controllers.add(new AngleEnabledAppPreferenceController(context, fragment));
controllers.add(new UpdatedGfxDriverDevOptInPreferenceController(context, fragment));
controllers.add(new VerifyAppsOverUsbPreferenceController(context));
controllers.add(new LogdSizePreferenceController(context));

View File

@@ -1,138 +0,0 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.development;
import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes.REQUEST_CODE_ANGLE_ENABLED_APP;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.provider.Settings;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.util.ReflectionHelpers;
@RunWith(SettingsRobolectricTestRunner.class)
public class AngleEnabledAppPreferenceControllerTest {
@Mock
private Preference mPreference;
@Mock
private PreferenceScreen mPreferenceScreen;
@Mock
private DevelopmentSettingsDashboardFragment mFragment;
@Mock
private PackageManager mPackageManager;
private Context mContext;
private AngleEnabledAppPreferenceController mController;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mController = spy(new AngleEnabledAppPreferenceController(mContext, mFragment));
ReflectionHelpers
.setField(mController, "mPackageManager" /* field name */, mPackageManager);
when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
.thenReturn(mPreference);
mController.displayPreference(mPreferenceScreen);
}
@Test
public void handlePreferenceTreeClick_preferenceClicked_launchActivity() {
final Intent activityStartIntent = new Intent(mContext, AppPicker.class);
final String preferenceKey = mController.getPreferenceKey();
doReturn(activityStartIntent).when(mController).getActivityStartIntent();
when(mPreference.getKey()).thenReturn(preferenceKey);
mController.handlePreferenceTreeClick(mPreference);
verify(mFragment).startActivityForResult(activityStartIntent,
REQUEST_CODE_ANGLE_ENABLED_APP);
}
@Test
public void updateState_foobarAppSelected_shouldUpdateSummaryWithAngleEnabledAppLabel() {
final String angleEnabledApp = "foobar";
final ContentResolver contentResolver = mContext.getContentResolver();
Settings.Global.putString(contentResolver, Settings.Global.ANGLE_ENABLED_APP,
angleEnabledApp);
mController.updateState(mPreference);
verify(mPreference).setSummary(
mContext.getString(R.string.angle_enabled_app_set, angleEnabledApp));
}
@Test
public void updateState_noAppSelected_shouldUpdateSummaryWithNoAppSelected() {
final String angleEnabledApp = null;
final ContentResolver contentResolver = mContext.getContentResolver();
Settings.Global.putString(contentResolver, Settings.Global.ANGLE_ENABLED_APP,
angleEnabledApp);
mController.updateState(mPreference);
verify(mPreference).setSummary(
mContext.getString(R.string.angle_enabled_app_not_set));
}
@Test
public void onActivityResult_foobarAppSelected_shouldUpdateSummaryWithAngleEnabledLabel() {
Intent activityResultIntent = new Intent(mContext, AppPicker.class);
final String appLabel = "foobar";
activityResultIntent.setAction(appLabel);
final boolean result = mController
.onActivityResult(REQUEST_CODE_ANGLE_ENABLED_APP, Activity.RESULT_OK,
activityResultIntent);
assertThat(result).isTrue();
verify(mPreference).setSummary(
mContext.getString(R.string.angle_enabled_app_set, appLabel));
}
@Test
public void onActivityResult_badRequestCode_shouldReturnFalse() {
assertThat(mController.onActivityResult(
-1 /* requestCode */, -1 /* resultCode */, null /* intent */)).isFalse();
}
@Test
public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
mController.onDeveloperOptionsSwitchDisabled();
assertThat(mPreference.isEnabled()).isFalse();
verify(mPreference).setSummary(
mContext.getString(R.string.angle_enabled_app_not_set));
}
}