From 8233ab5fe55b140a552b707dc4f446a7c4aa6407 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Tue, 27 Jun 2017 13:56:32 -0700 Subject: [PATCH] Fix crash when initializing Settings suggestions. The dashboard spacer has been removed, but the remaining indexing is not modified correspondingly, which results in mismatched dashboard types. Set the dashboard header position back to 0. Change-Id: I732c4ada556d5d4325e357b8325f66ded5cbe952 Fix: 63052534 Test: make RunSettingsRoboTests --- .../settings/dashboard/DashboardAdapter.java | 20 +++++++----- .../dashboard/DashboardAdapterTest.java | 31 +++++++++++++++++++ 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java index 38c6a28499c..abbd68355ea 100644 --- a/src/com/android/settings/dashboard/DashboardAdapter.java +++ b/src/com/android/settings/dashboard/DashboardAdapter.java @@ -67,6 +67,9 @@ public class DashboardAdapter extends RecyclerView.Adapter 0 && position == 1 + if (mDashboardData.getDisplayableSuggestionCount() > 0 + && position == SUGGESTION_CONDITION_HEADER_POSITION && mDashboardData.getSuggestionConditionMode() != DashboardData.HEADER_MODE_COLLAPSED) { onBindSuggestionHeader((SuggestionAndConditionHeaderHolder) holder); @@ -386,7 +390,7 @@ public class DashboardAdapter extends RecyclerView.Adapter adapter; - // If there is suggestions to show, it will be at position 2 (position 0 = header spacer, - // position 1 is suggestion header. - if (position == 2 && mDashboardData.getSuggestions() != null) { + // If there is suggestions to show, it will be at position 1 + // position 0 is suggestion header. + if (position == (SUGGESTION_CONDITION_HEADER_POSITION + 1) + && mDashboardData.getSuggestions() != null) { mSuggestionAdapter = new SuggestionAdapter(mContext, (List) mDashboardData.getItemEntityByPosition(position), mSuggestionsShownLogged); adapter = mSuggestionAdapter; diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java index af355203fcd..66706cc9da3 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java @@ -36,6 +36,8 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Icon; +import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; @@ -51,6 +53,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.suggestions.SuggestionAdapter; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; @@ -445,6 +448,34 @@ public class DashboardAdapterTest { verify(mockIcon).setTint(eq(0x89000000)); } + @Test + public void testBindConditionAndSuggestion_shouldSetSuggestionAdapterAndNoCrash() { + when(mFactory.dashboardFeatureProvider.combineSuggestionAndCondition()).thenReturn(true); + mDashboardAdapter = new DashboardAdapter(mContext, null, null); + final List suggestions = makeSuggestions("pkg1"); + final List categories = new ArrayList<>(); + final DashboardCategory category = mock(DashboardCategory.class); + 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 + 1); + + verify(data).setAdapter(any(SuggestionAdapter.class)); + // should not crash + } + private List makeSuggestions(String... pkgNames) { final List suggestions = new ArrayList<>(); for (String pkgName : pkgNames) {