From b94e6b9e4e3a909a8194356d64acbdbb61cf4000 Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Fri, 14 Feb 2020 16:32:13 -0800 Subject: [PATCH] Add prerelease driver to graphics driver preference dashboard. To facilitate better development, add prerelease driver choice to graphics driver preferences dashboard. This patch also makes sure that when game driver or developer driver is not shipped, the choice doesn't show up. Minor: Add tests. Bug: b/148626177 Test: make RunSettingsRoboTests ROBOTEST_FILTER=GraphicsDriver Change-Id: Iad398cd663300086d3f4802ffab34531e11dfb17 --- res/values/strings.xml | 5 +-- ...GraphicsDriverAppPreferenceController.java | 32 +++++++++++++++++-- ...hicsDriverAppPreferenceControllerTest.java | 30 ++++++++++++++--- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 83e730af664..f04aef289e6 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10951,8 +10951,8 @@ Default Game Driver - - Prerelease Driver + + Developer Driver System Graphics Driver @@ -10963,6 +10963,7 @@ @string/graphics_driver_app_preference_default + @string/graphics_driver_app_preference_prerelease_driver @string/graphics_driver_app_preference_game_driver @string/graphics_driver_app_preference_system diff --git a/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java index c1376a81c59..2013b459f92 100644 --- a/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java +++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java @@ -26,7 +26,9 @@ import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.Handler; import android.os.Looper; +import android.os.SystemProperties; import android.provider.Settings; +import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import androidx.preference.ListPreference; @@ -58,15 +60,19 @@ public class GraphicsDriverAppPreferenceController extends BasePreferenceControl GraphicsDriverContentObserver.OnGraphicsDriverContentChangedListener, LifecycleObserver, OnStart, OnStop { + private static final String PROPERTY_GFX_DRIVER_GAME = "ro.gfx.driver.0"; + private static final String PROPERTY_GFX_DRIVER_PRERELEASE = "ro.gfx.driver.1"; + private final Context mContext; private final ContentResolver mContentResolver; - private final CharSequence[] mEntryList; private final String mPreferenceTitle; private final String mPreferenceDefault; private final String mPreferenceGameDriver; private final String mPreferencePrereleaseDriver; private final String mPreferenceSystem; @VisibleForTesting + CharSequence[] mEntryList; + @VisibleForTesting GraphicsDriverContentObserver mGraphicsDriverContentObserver; private final List mAppInfos; @@ -85,7 +91,6 @@ public class GraphicsDriverAppPreferenceController extends BasePreferenceControl new GraphicsDriverContentObserver(new Handler(Looper.getMainLooper()), this); final Resources resources = context.getResources(); - mEntryList = resources.getStringArray(R.array.graphics_driver_app_preference_values); mPreferenceTitle = resources.getString(R.string.graphics_driver_app_preference_title); mPreferenceDefault = resources.getString(R.string.graphics_driver_app_preference_default); mPreferenceGameDriver = @@ -93,6 +98,7 @@ public class GraphicsDriverAppPreferenceController extends BasePreferenceControl mPreferencePrereleaseDriver = resources.getString(R.string.graphics_driver_app_preference_prerelease_driver); mPreferenceSystem = resources.getString(R.string.graphics_driver_app_preference_system); + mEntryList = constructEntryList(); // TODO: Move this task to background if there's potential ANR/Jank. // Update the UI when all the app infos are ready. @@ -189,6 +195,28 @@ public class GraphicsDriverAppPreferenceController extends BasePreferenceControl updateState(mPreferenceGroup); } + /** + * Constructs and returns a list of graphics driver choices. + */ + public CharSequence[] constructEntryList() { + final String prereleaseDriverPackageName = + SystemProperties.get(PROPERTY_GFX_DRIVER_PRERELEASE); + final String gameDriverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER_GAME); + + List entryList = new ArrayList<>(); + entryList.add(mPreferenceDefault); + if (!TextUtils.isEmpty(prereleaseDriverPackageName)) { + entryList.add(mPreferencePrereleaseDriver); + } + if (!TextUtils.isEmpty(gameDriverPackageName)) { + entryList.add(mPreferenceGameDriver); + } + entryList.add(mPreferenceSystem); + CharSequence[] filteredEntryList = new CharSequence[entryList.size()]; + filteredEntryList = entryList.toArray(filteredEntryList); + return filteredEntryList; + } + // AppInfo class to achieve loading the application label only once class AppInfo { AppInfo(PackageManager packageManager, ApplicationInfo applicationInfo) { diff --git a/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceControllerTest.java index 522dc8aab3b..372daf0cc95 100644 --- a/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceControllerTest.java @@ -56,8 +56,9 @@ import java.util.Arrays; public class GraphicsDriverAppPreferenceControllerTest { private static final int DEFAULT = 0; - private static final int GAME_DRIVER = 1; - private static final int SYSTEM = 2; + private static final int PRERELEASE_DRIVER = 1; + private static final int GAME_DRIVER = 2; + private static final int SYSTEM = 3; private static final String TEST_APP_NAME = "testApp"; private static final String TEST_PKG_NAME = "testPkg"; @@ -116,7 +117,7 @@ public class GraphicsDriverAppPreferenceControllerTest { } @Test - public void getAvailability_gameDriverOff_conditionallyUnavailable() { + public void getAvailability_graphicsDriverOff_conditionallyUnavailable() { loadDefaultConfig(); Settings.Global.putInt(mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_OFF); @@ -163,7 +164,7 @@ public class GraphicsDriverAppPreferenceControllerTest { } @Test - public void updateState_gameDriverOff_notVisible() { + public void updateState_graphicsDriverOff_notVisible() { Settings.Global.putInt(mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_OFF); loadDefaultConfig(); @@ -213,6 +214,8 @@ public class GraphicsDriverAppPreferenceControllerTest { assertThat(preference.getDialogTitle()).isEqualTo(mDialogTitle); assertThat(preference.getEntries()).isEqualTo(mValueList); assertThat(preference.getEntryValues()).isEqualTo(mValueList); + assertThat(preference.getEntry()).isEqualTo(mValueList[PRERELEASE_DRIVER]); + assertThat(preference.getValue()).isEqualTo(mValueList[PRERELEASE_DRIVER]); assertThat(preference.getSummary()).isEqualTo(mPreferencePrereleaseDriver); } @@ -248,6 +251,23 @@ public class GraphicsDriverAppPreferenceControllerTest { .isEqualTo(""); } + @Test + public void onPreferenceChange_selectPRERELEASE_DRIVER_shouldUpdateAttrAndSettingsGlobal() { + loadDefaultConfig(); + final ListPreference preference = + mController.createListPreference(mContext, TEST_PKG_NAME, TEST_APP_NAME); + mController.onPreferenceChange(preference, mValueList[PRERELEASE_DRIVER]); + + assertThat(preference.getEntry()).isEqualTo(mValueList[PRERELEASE_DRIVER]); + assertThat(preference.getValue()).isEqualTo(mValueList[PRERELEASE_DRIVER]); + assertThat(preference.getSummary()).isEqualTo(mValueList[PRERELEASE_DRIVER]); + assertThat(Settings.Global.getString(mResolver, + Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS)) + .isEqualTo(TEST_PKG_NAME); + assertThat(Settings.Global.getString(mResolver, Settings.Global.GAME_DRIVER_OPT_OUT_APPS)) + .isEqualTo(""); + } + @Test public void onPreferenceChange_selectGAME_DRIVER_shouldUpdateAttributesAndSettingsGlobal() { loadDefaultConfig(); @@ -306,6 +326,8 @@ public class GraphicsDriverAppPreferenceControllerTest { Settings.Global.putString(mResolver, Settings.Global.GAME_DRIVER_OPT_OUT_APPS, optOut); mController = new GraphicsDriverAppPreferenceController(mContext, "testKey"); + mController.mEntryList = mContext.getResources().getStringArray( + R.array.graphics_driver_app_preference_values); mGroup = spy(new PreferenceCategory(mContext)); final PreferenceManager preferenceManager = new PreferenceManager(mContext); when(mGroup.getContext()).thenReturn(mContext);