Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8233ab5f authored by Doris Ling's avatar Doris Ling
Browse files

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
parent 38b7d50a
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -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_SUGGESTION_CONDITION_MODE = "suggestion_condition_mode";

    @VisibleForTesting
    static final int SUGGESTION_CONDITION_HEADER_POSITION = 0;

    private final IconCache mCache;
    private final Context mContext;
    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
                      suggestion/condition that is currently hidden. It has the expand button to
                      expand the section. */
                if (mDashboardData.getDisplayableSuggestionCount() > 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<DashboardAdapter.Dash
                    mDashboardData = new DashboardData.Builder(prevData).setSuggestionConditionMode(
                        DashboardData.HEADER_MODE_COLLAPSED).build();
                    notifyDashboardDataChanged(prevData);
                    mRecyclerView.scrollToPosition(1);
                    mRecyclerView.scrollToPosition(SUGGESTION_CONDITION_HEADER_POSITION);
                });
                break;
        }
@@ -620,17 +624,19 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
                .setSuggestionConditionMode(nextMode).build();
            notifyDashboardDataChanged(prevData);
            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) {
        RecyclerView.Adapter<DashboardItemHolder> 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<Tile>)
                mDashboardData.getItemEntityByPosition(position), mSuggestionsShownLogged);
            adapter = mSuggestionAdapter;
+31 −0
Original line number Diff line number Diff line
@@ -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<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) {
        final List<Tile> suggestions = new ArrayList<>();
        for (String pkgName : pkgNames) {