From 11f4619816790cd2399adcae1aa226ff4314d482 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Thu, 13 Jul 2017 16:16:12 -0700 Subject: [PATCH] Fix crash on expanding settings conditions. Check for non-empty suggestions instead of non-null suggestions when trying to determine whether to show conditions or suggestions list. Change-Id: Icdb8ad485af436f5d84ce0a746081fc59bd613db Fix: 63674269 Test: make RunSettingsRoboTests --- .../settings/dashboard/DashboardAdapter.java | 8 ++-- .../dashboard/DashboardAdapterTest.java | 42 +++++++++++++++++-- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java index 9e514860fee..f3374ffb178 100644 --- a/src/com/android/settings/dashboard/DashboardAdapter.java +++ b/src/com/android/settings/dashboard/DashboardAdapter.java @@ -62,8 +62,9 @@ public class DashboardAdapter extends RecyclerView.Adapter suggestions = mDashboardData.getSuggestions(); + if (position == SUGGESTION_CONDITION_HEADER_POSITION + && suggestions != null && suggestions.size() > 0) { mSuggestionAdapter = new SuggestionAdapter(mContext, (List) mDashboardData.getItemEntityByPosition(position), mSuggestionsShownLogged); mSuggestionDismissHandler = new SuggestionDismissController(mContext, diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java index 1fc453616a4..d78cff63ac9 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java @@ -21,6 +21,7 @@ import android.content.Intent; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.Icon; +import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.LayoutInflater; @@ -32,6 +33,7 @@ import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.TestConfig; import com.android.settings.dashboard.conditional.Condition; +import com.android.settings.dashboard.conditional.ConditionAdapter; import com.android.settings.dashboard.suggestions.SuggestionAdapter; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -93,6 +95,7 @@ public class DashboardAdapterTest { private DashboardAdapter mDashboardAdapter; private DashboardAdapter.SuggestionAndConditionHeaderHolder mSuggestionHolder; private DashboardData.SuggestionConditionHeaderData mSuggestionHeaderData; + private List mConditionList; @Before public void setUp() { @@ -111,10 +114,11 @@ public class DashboardAdapterTest { when(mResources.getQuantityString(any(int.class), any(int.class), any())) .thenReturn(""); - List conditions = new ArrayList<>(); - conditions.add(mCondition); - mDashboardAdapter = new DashboardAdapter(mContext, null, conditions, null, null); - mSuggestionHeaderData = new DashboardData.SuggestionConditionHeaderData(conditions, 1); + mConditionList = new ArrayList<>(); + mConditionList.add(mCondition); + when(mCondition.shouldShow()).thenReturn(true); + mDashboardAdapter = new DashboardAdapter(mContext, null, mConditionList, null, null); + mSuggestionHeaderData = new DashboardData.SuggestionConditionHeaderData(mConditionList, 1); when(mView.getTag()).thenReturn(mCondition); } @@ -408,6 +412,36 @@ public class DashboardAdapterTest { // should not crash } + @Test + public void testBindConditionAndSuggestion_emptySuggestion_shouldSetConditionAdpater() { + final Bundle savedInstance = new Bundle(); + savedInstance.putInt(DashboardAdapter.STATE_SUGGESTION_CONDITION_MODE, + DashboardData.HEADER_MODE_FULLY_EXPANDED); + mDashboardAdapter = new DashboardAdapter(mContext, savedInstance, mConditionList, + null /* SuggestionParser */, null /* SuggestionDismissController.Callback */); + + final List suggestions = new ArrayList<>(); + final DashboardCategory category = mock(DashboardCategory.class); + final List tiles = new ArrayList<>(); + tiles.add(mock(Tile.class)); + category.tiles = tiles; + mDashboardAdapter.setCategoriesAndSuggestions(category, suggestions); + + final RecyclerView data = mock(RecyclerView.class); + when(data.getResources()).thenReturn(mResources); + when(data.getContext()).thenReturn(mContext); + when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class)); + final View itemView = mock(View.class); + when(itemView.findViewById(R.id.data)).thenReturn(data); + final DashboardAdapter.SuggestionAndConditionContainerHolder holder = + new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView); + + mDashboardAdapter.onBindConditionAndSuggestion( + holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION); + + verify(data).setAdapter(any(ConditionAdapter.class)); + } + private List makeSuggestions(String... pkgNames) { final List suggestions = new ArrayList<>(); for (String pkgName : pkgNames) {