From 01fe5b45b4ecba2c6a1b578e00d7abf2bccb3da1 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Fri, 14 Jul 2017 12:54:36 -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 Merged-In: Icdb8ad485af436f5d84ce0a746081fc59bd613db Fix: 63674269 Test: make RunSettingsRoboTests --- .../settings/dashboard/DashboardAdapter.java | 8 ++-- .../settings/dashboard/DashboardAdapterTest.java | 44 ++++++++++++++++++++-- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java index 6ff33ca7ec..bbef8d7643 100644 --- a/src/com/android/settings/dashboard/DashboardAdapter.java +++ b/src/com/android/settings/dashboard/DashboardAdapter.java @@ -62,9 +62,10 @@ 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 5c23d604f4..8cf8736973 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java @@ -36,6 +36,7 @@ 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; @@ -48,6 +49,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; @@ -97,6 +99,7 @@ public class DashboardAdapterTest { private DashboardAdapter mDashboardAdapter; private DashboardAdapter.SuggestionAndConditionHeaderHolder mSuggestionHolder; private DashboardData.SuggestionConditionHeaderData mSuggestionHeaderData; + private List mConditionList; @Before public void setUp() { @@ -115,10 +118,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); } @@ -392,6 +396,38 @@ public class DashboardAdapterTest { // should not crash } + @Test + public void testBindConditionAndSuggestion_emptySuggestion_shouldSetConditionAdapter() { + 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 List categories = new ArrayList<>(); + final DashboardCategory category = mock(DashboardCategory.class); + categories.add(category); + final List tiles = new ArrayList<>(); + tiles.add(mock(Tile.class)); + category.tiles = tiles; + mDashboardAdapter.setCategoriesAndSuggestions(categories, 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) { -- 2.11.0