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
This commit is contained in:
Doris Ling
2017-06-27 13:56:32 -07:00
parent 38b7d50a49
commit 8233ab5fe5
2 changed files with 44 additions and 7 deletions

View File

@@ -67,6 +67,9 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
private static final String STATE_SUGGESTIONS_SHOWN_LOGGED = "suggestions_shown_logged"; private static final String STATE_SUGGESTIONS_SHOWN_LOGGED = "suggestions_shown_logged";
private static final String STATE_SUGGESTION_CONDITION_MODE = "suggestion_condition_mode"; private static final String STATE_SUGGESTION_CONDITION_MODE = "suggestion_condition_mode";
@VisibleForTesting
static final int SUGGESTION_CONDITION_HEADER_POSITION = 0;
private final IconCache mCache; private final IconCache mCache;
private final Context mContext; private final Context mContext;
private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider;
@@ -368,7 +371,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
2. SuggestionCondition header - the header that shows the summary info for the 2. SuggestionCondition header - the header that shows the summary info for the
suggestion/condition that is currently hidden. It has the expand button to suggestion/condition that is currently hidden. It has the expand button to
expand the section. */ expand the section. */
if (mDashboardData.getDisplayableSuggestionCount() > 0 && position == 1 if (mDashboardData.getDisplayableSuggestionCount() > 0
&& position == SUGGESTION_CONDITION_HEADER_POSITION
&& mDashboardData.getSuggestionConditionMode() && mDashboardData.getSuggestionConditionMode()
!= DashboardData.HEADER_MODE_COLLAPSED) { != DashboardData.HEADER_MODE_COLLAPSED) {
onBindSuggestionHeader((SuggestionAndConditionHeaderHolder) holder); onBindSuggestionHeader((SuggestionAndConditionHeaderHolder) holder);
@@ -386,7 +390,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
mDashboardData = new DashboardData.Builder(prevData).setSuggestionConditionMode( mDashboardData = new DashboardData.Builder(prevData).setSuggestionConditionMode(
DashboardData.HEADER_MODE_COLLAPSED).build(); DashboardData.HEADER_MODE_COLLAPSED).build();
notifyDashboardDataChanged(prevData); notifyDashboardDataChanged(prevData);
mRecyclerView.scrollToPosition(1); mRecyclerView.scrollToPosition(SUGGESTION_CONDITION_HEADER_POSITION);
}); });
break; break;
} }
@@ -620,17 +624,19 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
.setSuggestionConditionMode(nextMode).build(); .setSuggestionConditionMode(nextMode).build();
notifyDashboardDataChanged(prevData); notifyDashboardDataChanged(prevData);
if (wasCollapsed) { if (wasCollapsed) {
mRecyclerView.scrollToPosition(1); mRecyclerView.scrollToPosition(SUGGESTION_CONDITION_HEADER_POSITION);
} }
}); });
} }
private void onBindConditionAndSuggestion(final SuggestionAndConditionContainerHolder holder, @VisibleForTesting
void onBindConditionAndSuggestion(final SuggestionAndConditionContainerHolder holder,
int position) { int position) {
RecyclerView.Adapter<DashboardItemHolder> adapter; RecyclerView.Adapter<DashboardItemHolder> adapter;
// If there is suggestions to show, it will be at position 2 (position 0 = header spacer, // If there is suggestions to show, it will be at position 1
// position 1 is suggestion header. // position 0 is suggestion header.
if (position == 2 && mDashboardData.getSuggestions() != null) { if (position == (SUGGESTION_CONDITION_HEADER_POSITION + 1)
&& mDashboardData.getSuggestions() != null) {
mSuggestionAdapter = new SuggestionAdapter(mContext, (List<Tile>) mSuggestionAdapter = new SuggestionAdapter(mContext, (List<Tile>)
mDashboardData.getItemEntityByPosition(position), mSuggestionsShownLogged); mDashboardData.getItemEntityByPosition(position), mSuggestionsShownLogged);
adapter = mSuggestionAdapter; adapter = mSuggestionAdapter;

View File

@@ -36,6 +36,8 @@ import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@@ -51,6 +53,7 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.dashboard.conditional.Condition; 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.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
@@ -445,6 +448,34 @@ public class DashboardAdapterTest {
verify(mockIcon).setTint(eq(0x89000000)); verify(mockIcon).setTint(eq(0x89000000));
} }
@Test
public void testBindConditionAndSuggestion_shouldSetSuggestionAdapterAndNoCrash() {
when(mFactory.dashboardFeatureProvider.combineSuggestionAndCondition()).thenReturn(true);
mDashboardAdapter = new DashboardAdapter(mContext, null, null);
final List<Tile> suggestions = makeSuggestions("pkg1");
final List<DashboardCategory> categories = new ArrayList<>();
final DashboardCategory category = mock(DashboardCategory.class);
final List<Tile> 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<Tile> makeSuggestions(String... pkgNames) { private List<Tile> makeSuggestions(String... pkgNames) {
final List<Tile> suggestions = new ArrayList<>(); final List<Tile> suggestions = new ArrayList<>();
for (String pkgName : pkgNames) { for (String pkgName : pkgNames) {