OSDN Git Service

Fix crash on expanding settings conditions.
authorDoris Ling <dling@google.com>
Fri, 14 Jul 2017 19:54:36 +0000 (12:54 -0700)
committerDoris Ling <dling@google.com>
Fri, 14 Jul 2017 20:04:30 +0000 (13:04 -0700)
Check for non-empty suggestions instead of non-null suggestions when
trying to determine whether to show conditions or suggestions list.

Change-Id: Icdb8ad485af436f5d84ce0a746081fc59bd613db
Merged-In: Icdb8ad485af436f5d84ce0a746081fc59bd613db
Fix: 63674269
Test: make RunSettingsRoboTests

src/com/android/settings/dashboard/DashboardAdapter.java
tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java

index 6ff33ca..bbef8d7 100644 (file)
@@ -62,9 +62,10 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
     private static final String STATE_SUGGESTION_LIST = "suggestion_list";
     private static final String STATE_CATEGORY_LIST = "category_list";
     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 String STATE_SUGGESTION_CONDITION_MODE = "suggestion_condition_mode";
+    @VisibleForTesting
     static final int SUGGESTION_CONDITION_HEADER_POSITION = 0;
 
     private final IconCache mCache;
@@ -446,8 +447,9 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
             int position) {
         // If there is suggestions to show, it will be at position 0 as we don't show the suggestion
         // header anymore.
-        if (position == (SUGGESTION_CONDITION_HEADER_POSITION)
-                && mDashboardData.getSuggestions() != null) {
+        final List<Tile> suggestions = mDashboardData.getSuggestions();
+        if (position == SUGGESTION_CONDITION_HEADER_POSITION
+                && suggestions != null && suggestions.size() > 0) {
             mSuggestionAdapter = new SuggestionAdapter(mContext, (List<Tile>)
                 mDashboardData.getItemEntityByPosition(position), mSuggestionsShownLogged);
             mSuggestionDismissHandler = new SuggestionDismissController(mContext,
index 5c23d60..8cf8736 100644 (file)
@@ -36,6 +36,7 @@ import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Icon;
+import android.os.Bundle;
 import android.support.v7.widget.RecyclerView;
 import android.util.DisplayMetrics;
 import android.view.LayoutInflater;
@@ -48,6 +49,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.conditional.ConditionAdapter;
 import com.android.settings.dashboard.suggestions.SuggestionAdapter;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -97,6 +99,7 @@ public class DashboardAdapterTest {
     private DashboardAdapter mDashboardAdapter;
     private DashboardAdapter.SuggestionAndConditionHeaderHolder mSuggestionHolder;
     private DashboardData.SuggestionConditionHeaderData mSuggestionHeaderData;
+    private List<Condition> mConditionList;
 
     @Before
     public void setUp() {
@@ -115,10 +118,11 @@ public class DashboardAdapterTest {
         when(mResources.getQuantityString(any(int.class), any(int.class), any()))
                 .thenReturn("");
 
-        List<Condition> conditions = new ArrayList<>();
-        conditions.add(mCondition);
-        mDashboardAdapter = new DashboardAdapter(mContext, null, conditions, null, null);
-        mSuggestionHeaderData = new DashboardData.SuggestionConditionHeaderData(conditions, 1);
+        mConditionList = new ArrayList<>();
+        mConditionList.add(mCondition);
+        when(mCondition.shouldShow()).thenReturn(true);
+        mDashboardAdapter = new DashboardAdapter(mContext, null, mConditionList, null, null);
+        mSuggestionHeaderData = new DashboardData.SuggestionConditionHeaderData(mConditionList, 1);
         when(mView.getTag()).thenReturn(mCondition);
     }
 
@@ -392,6 +396,38 @@ public class DashboardAdapterTest {
         // should not crash
     }
 
+    @Test
+    public void testBindConditionAndSuggestion_emptySuggestion_shouldSetConditionAdapter() {
+        final Bundle savedInstance = new Bundle();
+        savedInstance.putInt(DashboardAdapter.STATE_SUGGESTION_CONDITION_MODE,
+                DashboardData.HEADER_MODE_FULLY_EXPANDED);
+        mDashboardAdapter = new DashboardAdapter(mContext, savedInstance, mConditionList,
+                null /* SuggestionParser */, null /* SuggestionDismissController.Callback */);
+
+        final List<Tile> suggestions = new ArrayList<>();
+        final List<DashboardCategory> categories = new ArrayList<>();
+        final DashboardCategory category = mock(DashboardCategory.class);
+        categories.add(category);
+        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);
+
+        verify(data).setAdapter(any(ConditionAdapter.class));
+    }
+
     private List<Tile> makeSuggestions(String... pkgNames) {
         final List<Tile> suggestions = new ArrayList<>();
         for (String pkgName : pkgNames) {