Merge "Fix ConcurrentModificationException in SummaryLoader."

This commit is contained in:
TreeHugger Robot
2017-11-29 19:57:40 +00:00
committed by Android (Google) Code Review
11 changed files with 33 additions and 39 deletions

View File

@@ -477,7 +477,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
final int tintColor = a.getColor(0, mContext.getColor(R.color.fallback_tintColor)); final int tintColor = a.getColor(0, mContext.getColor(R.color.fallback_tintColor));
a.recycle(); a.recycle();
if (category != null) { if (category != null) {
for (Tile tile : category.tiles) { for (Tile tile : category.getTiles()) {
if (tile.isIconTintable) { if (tile.isIconTintable) {
// If this drawable is tintable, tint it to match the color. // If this drawable is tintable, tint it to match the color.
tile.icon.setTint(tintColor); tile.icon.setTint(tintColor);

View File

@@ -268,8 +268,9 @@ public class DashboardData {
&& hiddenSuggestion == 0); && hiddenSuggestion == 0);
if (mCategory != null) { if (mCategory != null) {
for (int j = 0; j < mCategory.tiles.size(); j++) { final List<Tile> tiles = mCategory.getTiles();
final Tile tile = mCategory.tiles.get(j); for (int j = 0; j < tiles.size(); j++) {
final Tile tile = tiles.get(j);
addToItemList(tile, R.layout.dashboard_tile, Objects.hash(tile.title), addToItemList(tile, R.layout.dashboard_tile, Objects.hash(tile.title),
true /* add */); true /* add */);
} }

View File

@@ -91,7 +91,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
Log.d(TAG, "NO dashboard tiles for " + TAG); Log.d(TAG, "NO dashboard tiles for " + TAG);
return null; return null;
} }
final List<Tile> tiles = category.tiles; final List<Tile> tiles = category.getTiles();
if (tiles == null || tiles.isEmpty()) { if (tiles == null || tiles.isEmpty()) {
Log.d(TAG, "tile list is empty, skipping category " + category.title); Log.d(TAG, "tile list is empty, skipping category " + category.title);
return null; return null;

View File

@@ -307,7 +307,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
Log.d(TAG, "NO dashboard tiles for " + TAG); Log.d(TAG, "NO dashboard tiles for " + TAG);
return; return;
} }
List<Tile> tiles = category.tiles; final List<Tile> tiles = category.getTiles();
if (tiles == null) { if (tiles == null) {
Log.d(TAG, "tile list is empty, skipping category " + category.title); Log.d(TAG, "tile list is empty, skipping category " + category.title);
return; return;

View File

@@ -154,7 +154,7 @@ public class SiteMapManager {
continue; continue;
} }
// Build parent-child mPairs for all children listed under this key. // Build parent-child mPairs for all children listed under this key.
for (Tile tile : category.tiles) { for (Tile tile : category.getTiles()) {
final String childTitle = tile.title.toString(); final String childTitle = tile.title.toString();
String childClass = null; String childClass = null;
if (tile.metaData != null) { if (tile.metaData != null) {

View File

@@ -216,7 +216,7 @@ public class SummaryLoader {
if (category == null) { if (category == null) {
return; return;
} }
for (Tile tile : category.tiles) { for (Tile tile : category.getTiles()) {
final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile); final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
if (mSummaryTextMap.containsKey(key)) { if (mSummaryTextMap.containsKey(key)) {
tile.summary = mSummaryTextMap.get(key); tile.summary = mSummaryTextMap.get(key);
@@ -250,12 +250,13 @@ public class SummaryLoader {
} }
private Tile getTileFromCategory(DashboardCategory category, ComponentName component) { private Tile getTileFromCategory(DashboardCategory category, ComponentName component) {
if (category == null || category.tiles == null) { if (category == null || category.getTilesCount() == 0) {
return null; return null;
} }
final int tileCount = category.tiles.size(); final List<Tile> tiles = category.getTiles();
final int tileCount = tiles.size();
for (int j = 0; j < tileCount; j++) { for (int j = 0; j < tileCount; j++) {
final Tile tile = category.tiles.get(j); final Tile tile = tiles.get(j);
if (component.equals(tile.intent.getComponent())) { if (component.equals(tile.intent.getComponent())) {
return tile; return tile;
} }
@@ -291,10 +292,10 @@ public class SummaryLoader {
case MSG_GET_CATEGORY_TILES_AND_SET_LISTENING: case MSG_GET_CATEGORY_TILES_AND_SET_LISTENING:
final DashboardCategory category = final DashboardCategory category =
mDashboardFeatureProvider.getTilesForCategory(mCategoryKey); mDashboardFeatureProvider.getTilesForCategory(mCategoryKey);
if (category == null || category.tiles == null) { if (category == null || category.getTilesCount() == 0) {
return; return;
} }
final List<Tile> tiles = category.tiles; final List<Tile> tiles = category.getTiles();
for (Tile tile : tiles) { for (Tile tile : tiles) {
makeProviderW(tile); makeProviderW(tile);
} }

View File

@@ -156,7 +156,7 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
continue; continue;
} }
// Build parent-child class pairs for all children listed under this key. // Build parent-child class pairs for all children listed under this key.
for (Tile tile : category.tiles) { for (Tile tile : category.getTiles()) {
String childClass = null; String childClass = null;
if (tile.metaData != null) { if (tile.metaData != null) {
childClass = tile.metaData.getString( childClass = tile.metaData.getString(

View File

@@ -222,14 +222,12 @@ public class DashboardAdapterTest {
doReturn(mockTypedArray).when(mContext).obtainStyledAttributes(any(int[].class)); doReturn(mockTypedArray).when(mContext).obtainStyledAttributes(any(int[].class));
doReturn(0x89000000).when(mockTypedArray).getColor(anyInt(), anyInt()); doReturn(0x89000000).when(mockTypedArray).getColor(anyInt(), anyInt());
final DashboardCategory category = mock(DashboardCategory.class); final DashboardCategory category = new DashboardCategory();
final List<Tile> tiles = new ArrayList<>();
final Icon mockIcon = mock(Icon.class); final Icon mockIcon = mock(Icon.class);
final Tile tile = new Tile(); final Tile tile = new Tile();
tile.isIconTintable = true; tile.isIconTintable = true;
tile.icon = mockIcon; tile.icon = mockIcon;
tiles.add(tile); category.addTile(tile);
category.tiles = tiles;
mDashboardAdapter.setCategory(category); mDashboardAdapter.setCategory(category);
@@ -250,10 +248,8 @@ public class DashboardAdapterTest {
public void testBindConditionAndSuggestion_shouldSetSuggestionAdapterAndNoCrash() { public void testBindConditionAndSuggestion_shouldSetSuggestionAdapterAndNoCrash() {
mDashboardAdapter = new DashboardAdapter(mContext, null, null, null, null, null); mDashboardAdapter = new DashboardAdapter(mContext, null, null, null, null, null);
final List<Tile> suggestions = makeSuggestions("pkg1"); final List<Tile> suggestions = makeSuggestions("pkg1");
final DashboardCategory category = mock(DashboardCategory.class); final DashboardCategory category = new DashboardCategory();
final List<Tile> tiles = new ArrayList<>(); category.addTile(mock(Tile.class));
tiles.add(mock(Tile.class));
category.tiles = tiles;
mDashboardAdapter.setCategoriesAndSuggestions(category, suggestions); mDashboardAdapter.setCategoriesAndSuggestions(category, suggestions);
@@ -277,10 +273,8 @@ public class DashboardAdapterTest {
public void testBindConditionAndSuggestion_v2_shouldSetSuggestionAdapterAndNoCrash() { public void testBindConditionAndSuggestion_v2_shouldSetSuggestionAdapterAndNoCrash() {
mDashboardAdapter = new DashboardAdapter(mContext, null, null, null, null, null); mDashboardAdapter = new DashboardAdapter(mContext, null, null, null, null, null);
final List<Suggestion> suggestions = makeSuggestionsV2("pkg1"); final List<Suggestion> suggestions = makeSuggestionsV2("pkg1");
final DashboardCategory category = mock(DashboardCategory.class); final DashboardCategory category = new DashboardCategory();
final List<Tile> tiles = new ArrayList<>(); category.addTile(mock(Tile.class));
tiles.add(mock(Tile.class));
category.tiles = tiles;
mDashboardAdapter.setSuggestionsV2(suggestions); mDashboardAdapter.setSuggestionsV2(suggestions);
@@ -310,10 +304,8 @@ public class DashboardAdapterTest {
null /* SuggestionDismissController.Callback */); null /* SuggestionDismissController.Callback */);
final List<Tile> suggestions = new ArrayList<>(); final List<Tile> suggestions = new ArrayList<>();
final DashboardCategory category = mock(DashboardCategory.class); final DashboardCategory category = new DashboardCategory();
final List<Tile> tiles = new ArrayList<>(); category.addTile(mock(Tile.class));
tiles.add(mock(Tile.class));
category.tiles = tiles;
mDashboardAdapter.setCategoriesAndSuggestions(category, suggestions); mDashboardAdapter.setCategoriesAndSuggestions(category, suggestions);
final RecyclerView data = mock(RecyclerView.class); final RecyclerView data = mock(RecyclerView.class);

View File

@@ -57,13 +57,12 @@ public class DashboardDataTest {
private DashboardData mDashboardDataWithOneConditions; private DashboardData mDashboardDataWithOneConditions;
private DashboardData mDashboardDataWithTwoConditions; private DashboardData mDashboardDataWithTwoConditions;
private DashboardData mDashboardDataWithNoItems; private DashboardData mDashboardDataWithNoItems;
private DashboardCategory mDashboardCategory;
@Mock @Mock
private Tile mTestCategoryTile; private Tile mTestCategoryTile;
@Mock @Mock
private Tile mTestSuggestion; private Tile mTestSuggestion;
@Mock @Mock
private DashboardCategory mDashboardCategory;
@Mock
private Condition mTestCondition; private Condition mTestCondition;
@Mock @Mock
private Condition mSecondCondition; // condition used to test insert in DiffUtil private Condition mSecondCondition; // condition used to test insert in DiffUtil
@@ -72,6 +71,8 @@ public class DashboardDataTest {
public void SetUp() { public void SetUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mDashboardCategory = new DashboardCategory();
// Build suggestions // Build suggestions
final List<Tile> suggestions = new ArrayList<>(); final List<Tile> suggestions = new ArrayList<>();
mTestSuggestion.title = TEST_SUGGESTION_TITLE; mTestSuggestion.title = TEST_SUGGESTION_TITLE;
@@ -91,8 +92,8 @@ public class DashboardDataTest {
// Build category // Build category
mTestCategoryTile.title = TEST_CATEGORY_TILE_TITLE; mTestCategoryTile.title = TEST_CATEGORY_TILE_TITLE;
mDashboardCategory.title = "test"; mDashboardCategory.title = "test";
mDashboardCategory.tiles = new ArrayList<>();
mDashboardCategory.tiles.add(mTestCategoryTile); mDashboardCategory.addTile(mTestCategoryTile);
// Build DashboardData // Build DashboardData
mDashboardDataWithOneConditions = new DashboardData.Builder() mDashboardDataWithOneConditions = new DashboardData.Builder()

View File

@@ -431,7 +431,7 @@ public class DashboardFeatureProviderImplTest {
mImpl = new DashboardFeatureProviderImpl(mActivity); mImpl = new DashboardFeatureProviderImpl(mActivity);
ReflectionHelpers.setField(mImpl, "mCategoryManager", mCategoryManager); ReflectionHelpers.setField(mImpl, "mCategoryManager", mCategoryManager);
final DashboardCategory category = new DashboardCategory(); final DashboardCategory category = new DashboardCategory();
category.tiles.add(new Tile()); category.addTile(new Tile());
when(mCategoryManager when(mCategoryManager
.getTilesByCategory(any(Context.class), eq(CategoryKey.CATEGORY_HOMEPAGE))) .getTilesByCategory(any(Context.class), eq(CategoryKey.CATEGORY_HOMEPAGE)))
.thenReturn(category); .thenReturn(category);

View File

@@ -64,9 +64,8 @@ public class DashboardFragmentTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext; private Context mContext;
@Mock @Mock
private DashboardCategory mDashboardCategory;
@Mock
private FakeFeatureFactory mFakeFeatureFactory; private FakeFeatureFactory mFakeFeatureFactory;
private DashboardCategory mDashboardCategory;
private TestFragment mTestFragment; private TestFragment mTestFragment;
@Before @Before
@@ -74,8 +73,8 @@ public class DashboardFragmentTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
FakeFeatureFactory.setupForTest(mContext); FakeFeatureFactory.setupForTest(mContext);
mFakeFeatureFactory = (FakeFeatureFactory) FeatureFactory.getFactory(mContext); mFakeFeatureFactory = (FakeFeatureFactory) FeatureFactory.getFactory(mContext);
mDashboardCategory.tiles = new ArrayList<>(); mDashboardCategory = new DashboardCategory();
mDashboardCategory.tiles.add(new Tile()); mDashboardCategory.addTile(new Tile());
mTestFragment = new TestFragment(ShadowApplication.getInstance().getApplicationContext()); mTestFragment = new TestFragment(ShadowApplication.getInstance().getApplicationContext());
when(mFakeFeatureFactory.dashboardFeatureProvider when(mFakeFeatureFactory.dashboardFeatureProvider
.getTilesForCategory(nullable(String.class))) .getTilesForCategory(nullable(String.class)))
@@ -117,7 +116,7 @@ public class DashboardFragmentTest {
@Test @Test
public void displayTilesAsPreference_withEmptyCategory_shouldNotAddTiles() { public void displayTilesAsPreference_withEmptyCategory_shouldNotAddTiles() {
mDashboardCategory.tiles = null; mDashboardCategory.removeTile(0);
mTestFragment.onCreatePreferences(new Bundle(), "rootKey"); mTestFragment.onCreatePreferences(new Bundle(), "rootKey");
verify(mTestFragment.mScreen, never()).addPreference(nullable(Preference.class)); verify(mTestFragment.mScreen, never()).addPreference(nullable(Preference.class));