Merge "Fix crash for UiBlockerController"

This commit is contained in:
Raff Tsai
2019-01-15 04:01:38 +00:00
committed by Android (Google) Code Review
3 changed files with 55 additions and 10 deletions

View File

@@ -68,7 +68,8 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
private DashboardTilePlaceholderPreferenceController mPlaceholderPreferenceController; private DashboardTilePlaceholderPreferenceController mPlaceholderPreferenceController;
private boolean mListeningToCategoryChange; private boolean mListeningToCategoryChange;
private SummaryLoader mSummaryLoader; private SummaryLoader mSummaryLoader;
private UiBlockerController mBlockerController; @VisibleForTesting
UiBlockerController mBlockerController;
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
@@ -111,7 +112,8 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
checkUiBlocker(controllers); checkUiBlocker(controllers);
} }
private void checkUiBlocker(List<AbstractPreferenceController> controllers) { @VisibleForTesting
void checkUiBlocker(List<AbstractPreferenceController> controllers) {
final List<String> keys = new ArrayList<>(); final List<String> keys = new ArrayList<>();
controllers controllers
.stream() .stream()
@@ -121,8 +123,10 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
keys.add(controller.getPreferenceKey()); keys.add(controller.getPreferenceKey());
}); });
mBlockerController = new UiBlockerController(keys); if (!keys.isEmpty()) {
mBlockerController.start(()->updatePreferenceVisibility()); mBlockerController = new UiBlockerController(keys);
mBlockerController.start(()->updatePreferenceVisibility(mPreferenceControllers));
}
} }
@Override @Override
@@ -355,21 +359,23 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
activity.reportFullyDrawn(); activity.reportFullyDrawn();
} }
updatePreferenceVisibility(); updatePreferenceVisibility(mPreferenceControllers);
} }
private void updatePreferenceVisibility() { @VisibleForTesting
void updatePreferenceVisibility(
Map<Class, List<AbstractPreferenceController>> preferenceControllers) {
final PreferenceScreen screen = getPreferenceScreen(); final PreferenceScreen screen = getPreferenceScreen();
if (screen == null) { if (screen == null || preferenceControllers == null || mBlockerController == null) {
return; return;
} }
final boolean visible = mBlockerController.isBlockerFinished(); final boolean visible = mBlockerController.isBlockerFinished();
for (List<AbstractPreferenceController> controllerList : for (List<AbstractPreferenceController> controllerList :
mPreferenceControllers.values()) { preferenceControllers.values()) {
for (AbstractPreferenceController controller : controllerList) { for (AbstractPreferenceController controller : controllerList) {
final String key = controller.getPreferenceKey(); final String key = controller.getPreferenceKey();
final Preference preference = screen.findPreference(key); final Preference preference = findPreference(key);
if (preference != null) { if (preference != null) {
preference.setVisible(visible && controller.isAvailable()); preference.setVisible(visible && controller.isAvailable());
} }

View File

@@ -33,7 +33,7 @@ import java.util.concurrent.TimeUnit;
* Control ui blocker data and check whether it is finished * Control ui blocker data and check whether it is finished
* *
* @see BasePreferenceController.UiBlocker * @see BasePreferenceController.UiBlocker
* @see BasePreferenceController.OnUiBlockListener * @see BasePreferenceController.UiBlockListener
*/ */
public class UiBlockerController { public class UiBlockerController {
private static final String TAG = "UiBlockerController"; private static final String TAG = "UiBlockerController";

View File

@@ -38,6 +38,7 @@ import androidx.preference.PreferenceScreen;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.slices.BlockingSlicePrefController;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -55,7 +56,10 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class DashboardFragmentTest { public class DashboardFragmentTest {
@@ -66,6 +70,7 @@ public class DashboardFragmentTest {
private DashboardCategory mDashboardCategory; private DashboardCategory mDashboardCategory;
private Context mContext; private Context mContext;
private TestFragment mTestFragment; private TestFragment mTestFragment;
private List<AbstractPreferenceController> mControllers;
@Before @Before
public void setUp() { public void setUp() {
@@ -83,6 +88,7 @@ public class DashboardFragmentTest {
.thenReturn(mDashboardCategory); .thenReturn(mDashboardCategory);
mTestFragment.onAttach(RuntimeEnvironment.application); mTestFragment.onAttach(RuntimeEnvironment.application);
when(mContext.getPackageName()).thenReturn("TestPackage"); when(mContext.getPackageName()).thenReturn("TestPackage");
mControllers = new ArrayList<>();
} }
@Test @Test
@@ -193,6 +199,39 @@ public class DashboardFragmentTest {
DASHBOARD_CONTAINER, null, 0); DASHBOARD_CONTAINER, null, 0);
} }
@Test
public void updatePreferenceVisibility_prefKeyNull_shouldNotCrash() {
final Map<Class, List<AbstractPreferenceController>> prefControllers = new HashMap<>();
final List<AbstractPreferenceController> controllerList = new ArrayList<>();
controllerList.add(new TestPreferenceController(mContext));
prefControllers.put(TestPreferenceController.class, controllerList);
mTestFragment.mBlockerController = new UiBlockerController(Arrays.asList("pref_key"));
// Should not crash
mTestFragment.updatePreferenceVisibility(prefControllers);
}
@Test
public void checkUiBlocker_noUiBlocker_controllerIsNull() {
mTestFragment.mBlockerController = null;
mControllers.add(new TestPreferenceController(mContext));
mTestFragment.checkUiBlocker(mControllers);
assertThat(mTestFragment.mBlockerController).isNull();
}
@Test
public void checkUiBlocker_hasUiBlocker_controllerNotNull() {
mTestFragment.mBlockerController = null;
mControllers.add(new TestPreferenceController(mContext));
mControllers.add(new BlockingSlicePrefController(mContext, "pref_key"));
mTestFragment.checkUiBlocker(mControllers);
assertThat(mTestFragment.mBlockerController).isNotNull();
}
public static class TestPreferenceController extends AbstractPreferenceController public static class TestPreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin { implements PreferenceControllerMixin {