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

am: da9d206916

Change-Id: Ia2d3416b079c617450562eb0daf3ab3625b83d0f
This commit is contained in:
Doris Ling
2017-06-28 01:50:20 +00:00
committed by android-build-merger
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;
@@ -364,7 +367,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);
@@ -382,7 +386,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;
} }
@@ -616,17 +620,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) {