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:
@@ -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" />
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
@@ -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));
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user