Loading src/com/android/settings/dashboard/DashboardAdapter.java +1 −2 Original line number Diff line number Diff line Loading @@ -232,8 +232,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash .build(); notifyDashboardDataChanged(prevData); } else { suggestions.remove(suggestion); mSuggestionAdapter.notifyDataSetChanged(); mSuggestionAdapter.removeSuggestion(suggestion); } } Loading src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java +4 −0 Original line number Diff line number Diff line Loading @@ -134,4 +134,8 @@ public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder> return null; } public void removeSuggestion(Tile suggestion) { mSuggestions.remove(suggestion); notifyDataSetChanged(); } } tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java +24 −2 Original line number Diff line number Diff line Loading @@ -34,14 +34,12 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Icon; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; Loading Loading @@ -355,6 +353,30 @@ public class DashboardAdapterTest { verify(adapter, never()).notifyDashboardDataChanged(any()); } @Test public void testSuggestionDismissed_moreThanTwoSuggestions_defaultMode_shouldNotCrash() { final RecyclerView data = new RecyclerView(RuntimeEnvironment.application); final View itemView = mock(View.class); when(itemView.findViewById(R.id.data)).thenReturn(data); final DashboardAdapter.SuggestionAndConditionContainerHolder holder = new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView); final List<Tile> suggestions = makeSuggestions("pkg1", "pkg2", "pkg3", "pkg4"); final DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null /*savedInstance */, null /* conditions */, null /* suggestionParser */, null /* callback */)); adapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions); adapter.onBindConditionAndSuggestion( holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION); // default mode, only displaying 2 suggestions adapter.onSuggestionDismissed(suggestions.get(1)); // verify operations that access the lists will not cause ConcurrentModificationException assertThat(holder.data.getAdapter().getItemCount()).isEqualTo(1); adapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions); // should not crash } @Test public void testSuggestioDismissed_onlySuggestion_updateDashboardData() { DashboardAdapter adapter = Loading Loading
src/com/android/settings/dashboard/DashboardAdapter.java +1 −2 Original line number Diff line number Diff line Loading @@ -232,8 +232,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash .build(); notifyDashboardDataChanged(prevData); } else { suggestions.remove(suggestion); mSuggestionAdapter.notifyDataSetChanged(); mSuggestionAdapter.removeSuggestion(suggestion); } } Loading
src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java +4 −0 Original line number Diff line number Diff line Loading @@ -134,4 +134,8 @@ public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder> return null; } public void removeSuggestion(Tile suggestion) { mSuggestions.remove(suggestion); notifyDataSetChanged(); } }
tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java +24 −2 Original line number Diff line number Diff line Loading @@ -34,14 +34,12 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Icon; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; Loading Loading @@ -355,6 +353,30 @@ public class DashboardAdapterTest { verify(adapter, never()).notifyDashboardDataChanged(any()); } @Test public void testSuggestionDismissed_moreThanTwoSuggestions_defaultMode_shouldNotCrash() { final RecyclerView data = new RecyclerView(RuntimeEnvironment.application); final View itemView = mock(View.class); when(itemView.findViewById(R.id.data)).thenReturn(data); final DashboardAdapter.SuggestionAndConditionContainerHolder holder = new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView); final List<Tile> suggestions = makeSuggestions("pkg1", "pkg2", "pkg3", "pkg4"); final DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null /*savedInstance */, null /* conditions */, null /* suggestionParser */, null /* callback */)); adapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions); adapter.onBindConditionAndSuggestion( holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION); // default mode, only displaying 2 suggestions adapter.onSuggestionDismissed(suggestions.get(1)); // verify operations that access the lists will not cause ConcurrentModificationException assertThat(holder.data.getAdapter().getItemCount()).isEqualTo(1); adapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions); // should not crash } @Test public void testSuggestioDismissed_onlySuggestion_updateDashboardData() { DashboardAdapter adapter = Loading