From d49de61f962f497ac298b5d30e801eadb7567896 Mon Sep 17 00:00:00 2001 From: hughchen Date: Tue, 24 Sep 2019 10:30:49 +0800 Subject: [PATCH] Do not block UI when this page didn't have slice This CL before, if controller have UIBlocker interface will going to blocker condition to make whole page invisible for a certain time until slice is fully loaded. This CL add the check condition that if the controller have UIBlocker inferface but didn't have slice uri will not go to blocker condition. Bug: 141292712 Test: make -j42 RunSettingsRoboTests ROBOTEST_FILTER=DashboardFragmentTest Change-Id: I79daae131654f8fd823a9c8f1be46ad6c7921908 --- .../settings/dashboard/DashboardFragment.java | 19 ++++++++++--------- .../dashboard/DashboardFragmentTest.java | 19 +++++++++++++++++-- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index f2e3d73c8fe..178c5a2be7d 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -63,6 +63,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment private final Map> mPreferenceControllers = new ArrayMap<>(); private final Set mDashboardTilePrefKeys = new ArraySet<>(); + private final List mControllers = new ArrayList<>(); private DashboardFeatureProvider mDashboardFeatureProvider; private DashboardTilePlaceholderPreferenceController mPlaceholderPreferenceController; @@ -79,7 +80,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment R.array.config_suppress_injected_tile_keys)); mDashboardFeatureProvider = FeatureFactory.getFactory(context). getDashboardFeatureProvider(context); - final List controllers = new ArrayList<>(); // Load preference controllers from code final List controllersFromCode = createPreferenceControllers(context); @@ -93,9 +93,9 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment // Add unique controllers to list. if (controllersFromCode != null) { - controllers.addAll(controllersFromCode); + mControllers.addAll(controllersFromCode); } - controllers.addAll(uniqueControllerFromXml); + mControllers.addAll(uniqueControllerFromXml); // And wire up with lifecycle. final Lifecycle lifecycle = getSettingsLifecycle(); @@ -107,12 +107,10 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment mPlaceholderPreferenceController = new DashboardTilePlaceholderPreferenceController(context); - controllers.add(mPlaceholderPreferenceController); - for (AbstractPreferenceController controller : controllers) { + mControllers.add(mPlaceholderPreferenceController); + for (AbstractPreferenceController controller : mControllers) { addPreferenceController(controller); } - - checkUiBlocker(controllers); } @VisibleForTesting @@ -122,8 +120,10 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment .stream() .filter(controller -> controller instanceof BasePreferenceController.UiBlocker) .forEach(controller -> { - ((BasePreferenceController) controller).setUiBlockListener(this); - keys.add(controller.getPreferenceKey()); + if (controller.isAvailable()) { + ((BasePreferenceController) controller).setUiBlockListener(this); + keys.add(controller.getPreferenceKey()); + } }); if (!keys.isEmpty()) { @@ -157,6 +157,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + checkUiBlocker(mControllers); refreshAllPreferences(getLogTag()); } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index 9aae249c79b..188f5668f6a 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -31,6 +31,7 @@ import static org.mockito.Mockito.when; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.pm.ActivityInfo; +import android.net.Uri; import android.os.Bundle; import androidx.preference.Preference; @@ -240,14 +241,28 @@ public class DashboardFragmentTest { } @Test - public void checkUiBlocker_hasUiBlocker_controllerNotNull() { + public void checkUiBlocker_hasUiBlockerAndControllerIsAvailable_controllerNotNull() { + final BlockingSlicePrefController controller = + new BlockingSlicePrefController(mContext, "pref_key"); + controller.setSliceUri(Uri.parse("testUri")); + mTestFragment.mBlockerController = null; + mControllers.add(new TestPreferenceController(mContext)); + mControllers.add(controller); + + mTestFragment.checkUiBlocker(mControllers); + + assertThat(mTestFragment.mBlockerController).isNotNull(); + } + + @Test + public void checkUiBlocker_hasUiBlockerAndControllerIsNotAvailable_controllerIsNull() { mTestFragment.mBlockerController = null; mControllers.add(new TestPreferenceController(mContext)); mControllers.add(new BlockingSlicePrefController(mContext, "pref_key")); mTestFragment.checkUiBlocker(mControllers); - assertThat(mTestFragment.mBlockerController).isNotNull(); + assertThat(mTestFragment.mBlockerController).isNull(); } public static class TestPreferenceController extends AbstractPreferenceController