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

Commit c074c1c8 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix crash when initializing Settings suggestions." into oc-dr1-dev

parents a2c3828e 8233ab5f
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) {