Loading src/com/android/settings/dashboard/DashboardFragment.java +39 −24 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment SummaryLoader.SummaryConsumer { private static final String TAG = "DashboardFragment"; private final Map<Class, AbstractPreferenceController> mPreferenceControllers = private final Map<Class, List<AbstractPreferenceController>> mPreferenceControllers = new ArrayMap<>(); private final Set<String> mDashboardTilePrefKeys = new ArraySet<>(); Loading Loading @@ -156,16 +156,19 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment @Override public boolean onPreferenceTreeClick(Preference preference) { Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values(); Collection<List<AbstractPreferenceController>> controllers = mPreferenceControllers.values(); // If preference contains intent, log it before handling. mMetricsFeatureProvider.logDashboardStartIntent( getContext(), preference.getIntent(), getMetricsCategory()); // Give all controllers a chance to handle click. for (AbstractPreferenceController controller : controllers) { for (List<AbstractPreferenceController> controllerList : controllers) { for (AbstractPreferenceController controller : controllerList) { if (controller.handlePreferenceTreeClick(preference)) { return true; } } } return super.onPreferenceTreeClick(preference); } Loading @@ -189,12 +192,23 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment protected abstract int getPreferenceScreenResId(); protected <T extends AbstractPreferenceController> T getPreferenceController(Class<T> clazz) { AbstractPreferenceController controller = mPreferenceControllers.get(clazz); return (T) controller; List<AbstractPreferenceController> controllerList = mPreferenceControllers.get(clazz); if (controllerList != null) { if (controllerList.size() > 1) { Log.w(TAG, "Multiple controllers of Class " + clazz.getSimpleName() + " found, returning first one."); } return (T) controllerList.get(0); } return null; } protected void addPreferenceController(AbstractPreferenceController controller) { mPreferenceControllers.put(controller.getClass(), controller); if (mPreferenceControllers.get(controller.getClass()) == null) { mPreferenceControllers.put(controller.getClass(), new ArrayList<>()); } mPreferenceControllers.get(controller.getClass()).add(controller); } /** Loading Loading @@ -249,19 +263,19 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment } addPreferencesFromResource(resId); final PreferenceScreen screen = getPreferenceScreen(); Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values(); for (AbstractPreferenceController controller : controllers) { controller.displayPreference(screen); } mPreferenceControllers.values().stream().flatMap(Collection::stream).forEach( controller -> controller.displayPreference(screen)); } /** * Update state of each preference managed by PreferenceController. */ protected void updatePreferenceStates() { Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values(); final PreferenceScreen screen = getPreferenceScreen(); for (AbstractPreferenceController controller : controllers) { Collection<List<AbstractPreferenceController>> controllerLists = mPreferenceControllers.values(); for (List<AbstractPreferenceController> controllerList : controllerLists) { for (AbstractPreferenceController controller : controllerList) { if (!controller.isAvailable()) { continue; } Loading @@ -276,6 +290,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment controller.updateState(preference); } } } /** * Refresh all preference items, including both static prefs from xml, and dynamic items from Loading tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +30 −0 Original line number Diff line number Diff line Loading @@ -90,6 +90,19 @@ public class DashboardFragmentTest { assertThat(controller).isSameAs(retrievedController); } @Test public void testPreferenceControllerSetter_shouldAddAndNotReplace() { final TestPreferenceController controller1 = new TestPreferenceController(mContext); mTestFragment.addPreferenceController(controller1); final TestPreferenceController controller2 = new TestPreferenceController(mContext); mTestFragment.addPreferenceController(controller2); final TestPreferenceController retrievedController = mTestFragment.getPreferenceController (TestPreferenceController.class); assertThat(controller1).isSameAs(retrievedController); } @Test public void displayTilesAsPreference_shouldAddTilesWithIntent() { when(mFakeFeatureFactory.dashboardFeatureProvider Loading Loading @@ -145,6 +158,23 @@ public class DashboardFragmentTest { verify(mockController2).getPreferenceKey(); } @Test public void updateState_doesNotSkipControllersOfSameClass() { final AbstractPreferenceController mockController1 = mock(AbstractPreferenceController.class); final AbstractPreferenceController mockController2 = mock(AbstractPreferenceController.class); mTestFragment.addPreferenceController(mockController1); mTestFragment.addPreferenceController(mockController2); when(mockController1.isAvailable()).thenReturn(true); when(mockController2.isAvailable()).thenReturn(true); mTestFragment.updatePreferenceStates(); verify(mockController1).getPreferenceKey(); verify(mockController2).getPreferenceKey(); } @Test public void tintTileIcon_hasMetadata_shouldReturnIconTintableMetadata() { final Tile tile = new Tile(); Loading tests/robotests/src/com/android/settings/security/screenlock/ScreenLockSettingsTest.java +6 −2 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import org.junit.runner.RunWith; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.List; import java.util.Map; @RunWith(SettingsRobolectricTestRunner.class) Loading @@ -55,10 +57,12 @@ public class ScreenLockSettingsTest { @Test public void onOwnerInfoUpdated_shouldUpdateOwnerInfoController() { final Map<Class, AbstractPreferenceController> preferenceControllers = final Map<Class, List<AbstractPreferenceController>> preferenceControllers = ReflectionHelpers.getField(mSettings, "mPreferenceControllers"); final OwnerInfoPreferenceController controller = mock(OwnerInfoPreferenceController.class); preferenceControllers.put(OwnerInfoPreferenceController.class, controller); List<AbstractPreferenceController> controllerList = new ArrayList<>(); controllerList.add(controller); preferenceControllers.put(OwnerInfoPreferenceController.class, controllerList); mSettings.onOwnerInfoUpdated(); Loading Loading
src/com/android/settings/dashboard/DashboardFragment.java +39 −24 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment SummaryLoader.SummaryConsumer { private static final String TAG = "DashboardFragment"; private final Map<Class, AbstractPreferenceController> mPreferenceControllers = private final Map<Class, List<AbstractPreferenceController>> mPreferenceControllers = new ArrayMap<>(); private final Set<String> mDashboardTilePrefKeys = new ArraySet<>(); Loading Loading @@ -156,16 +156,19 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment @Override public boolean onPreferenceTreeClick(Preference preference) { Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values(); Collection<List<AbstractPreferenceController>> controllers = mPreferenceControllers.values(); // If preference contains intent, log it before handling. mMetricsFeatureProvider.logDashboardStartIntent( getContext(), preference.getIntent(), getMetricsCategory()); // Give all controllers a chance to handle click. for (AbstractPreferenceController controller : controllers) { for (List<AbstractPreferenceController> controllerList : controllers) { for (AbstractPreferenceController controller : controllerList) { if (controller.handlePreferenceTreeClick(preference)) { return true; } } } return super.onPreferenceTreeClick(preference); } Loading @@ -189,12 +192,23 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment protected abstract int getPreferenceScreenResId(); protected <T extends AbstractPreferenceController> T getPreferenceController(Class<T> clazz) { AbstractPreferenceController controller = mPreferenceControllers.get(clazz); return (T) controller; List<AbstractPreferenceController> controllerList = mPreferenceControllers.get(clazz); if (controllerList != null) { if (controllerList.size() > 1) { Log.w(TAG, "Multiple controllers of Class " + clazz.getSimpleName() + " found, returning first one."); } return (T) controllerList.get(0); } return null; } protected void addPreferenceController(AbstractPreferenceController controller) { mPreferenceControllers.put(controller.getClass(), controller); if (mPreferenceControllers.get(controller.getClass()) == null) { mPreferenceControllers.put(controller.getClass(), new ArrayList<>()); } mPreferenceControllers.get(controller.getClass()).add(controller); } /** Loading Loading @@ -249,19 +263,19 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment } addPreferencesFromResource(resId); final PreferenceScreen screen = getPreferenceScreen(); Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values(); for (AbstractPreferenceController controller : controllers) { controller.displayPreference(screen); } mPreferenceControllers.values().stream().flatMap(Collection::stream).forEach( controller -> controller.displayPreference(screen)); } /** * Update state of each preference managed by PreferenceController. */ protected void updatePreferenceStates() { Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values(); final PreferenceScreen screen = getPreferenceScreen(); for (AbstractPreferenceController controller : controllers) { Collection<List<AbstractPreferenceController>> controllerLists = mPreferenceControllers.values(); for (List<AbstractPreferenceController> controllerList : controllerLists) { for (AbstractPreferenceController controller : controllerList) { if (!controller.isAvailable()) { continue; } Loading @@ -276,6 +290,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment controller.updateState(preference); } } } /** * Refresh all preference items, including both static prefs from xml, and dynamic items from Loading
tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +30 −0 Original line number Diff line number Diff line Loading @@ -90,6 +90,19 @@ public class DashboardFragmentTest { assertThat(controller).isSameAs(retrievedController); } @Test public void testPreferenceControllerSetter_shouldAddAndNotReplace() { final TestPreferenceController controller1 = new TestPreferenceController(mContext); mTestFragment.addPreferenceController(controller1); final TestPreferenceController controller2 = new TestPreferenceController(mContext); mTestFragment.addPreferenceController(controller2); final TestPreferenceController retrievedController = mTestFragment.getPreferenceController (TestPreferenceController.class); assertThat(controller1).isSameAs(retrievedController); } @Test public void displayTilesAsPreference_shouldAddTilesWithIntent() { when(mFakeFeatureFactory.dashboardFeatureProvider Loading Loading @@ -145,6 +158,23 @@ public class DashboardFragmentTest { verify(mockController2).getPreferenceKey(); } @Test public void updateState_doesNotSkipControllersOfSameClass() { final AbstractPreferenceController mockController1 = mock(AbstractPreferenceController.class); final AbstractPreferenceController mockController2 = mock(AbstractPreferenceController.class); mTestFragment.addPreferenceController(mockController1); mTestFragment.addPreferenceController(mockController2); when(mockController1.isAvailable()).thenReturn(true); when(mockController2.isAvailable()).thenReturn(true); mTestFragment.updatePreferenceStates(); verify(mockController1).getPreferenceKey(); verify(mockController2).getPreferenceKey(); } @Test public void tintTileIcon_hasMetadata_shouldReturnIconTintableMetadata() { final Tile tile = new Tile(); Loading
tests/robotests/src/com/android/settings/security/screenlock/ScreenLockSettingsTest.java +6 −2 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import org.junit.runner.RunWith; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.List; import java.util.Map; @RunWith(SettingsRobolectricTestRunner.class) Loading @@ -55,10 +57,12 @@ public class ScreenLockSettingsTest { @Test public void onOwnerInfoUpdated_shouldUpdateOwnerInfoController() { final Map<Class, AbstractPreferenceController> preferenceControllers = final Map<Class, List<AbstractPreferenceController>> preferenceControllers = ReflectionHelpers.getField(mSettings, "mPreferenceControllers"); final OwnerInfoPreferenceController controller = mock(OwnerInfoPreferenceController.class); preferenceControllers.put(OwnerInfoPreferenceController.class, controller); List<AbstractPreferenceController> controllerList = new ArrayList<>(); controllerList.add(controller); preferenceControllers.put(OwnerInfoPreferenceController.class, controllerList); mSettings.onOwnerInfoUpdated(); Loading