Merge "Add a separate line at the bottom of list area in output switcher" into rvc-dev
diff --git a/res/layout/panel_layout.xml b/res/layout/panel_layout.xml
index 326fee8..895d09b 100644
--- a/res/layout/panel_layout.xml
+++ b/res/layout/panel_layout.xml
@@ -86,6 +86,11 @@
         <!-- Note: There is a landscape version of panel_slice_list which supports scrolling. -->
         <include layout="@layout/panel_slice_list"/>
 
+        <include
+            android:id="@+id/footer_divider"
+            layout="@layout/horizontal_divider"
+            android:visibility="gone"/>
+
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index 1224e1f..9cb626d 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -96,6 +96,7 @@
     private TextView mHeaderTitle;
     private TextView mHeaderSubtitle;
     private int mMaxHeight;
+    private View mFooterDivider;
 
     private final Map<Uri, LiveData<Slice>> mSliceLiveData = new LinkedHashMap<>();
 
@@ -187,6 +188,7 @@
         mTitleIcon = mLayoutView.findViewById(R.id.title_icon);
         mHeaderTitle = mLayoutView.findViewById(R.id.header_title);
         mHeaderSubtitle = mLayoutView.findViewById(R.id.header_subtitle);
+        mFooterDivider = mLayoutView.findViewById(R.id.footer_divider);
 
         // Make the panel layout gone here, to avoid janky animation when updating from old panel.
         // We will make it visible once the panel is ready to load.
@@ -241,6 +243,13 @@
                 mTitleIcon.setLayoutParams(new LinearLayout.LayoutParams(size, size));
             }
         }
+
+        if (mPanel.getViewType() == PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON) {
+            mFooterDivider.setVisibility(View.VISIBLE);
+        } else {
+            mFooterDivider.setVisibility(View.GONE);
+        }
+
         mSeeMoreButton.setOnClickListener(getSeeMoreListener());
         mDoneButton.setOnClickListener(getCloseListener());
 
diff --git a/src/com/android/settings/panel/PanelSlicesAdapter.java b/src/com/android/settings/panel/PanelSlicesAdapter.java
index 34de834..595dc2b 100644
--- a/src/com/android/settings/panel/PanelSlicesAdapter.java
+++ b/src/com/android/settings/panel/PanelSlicesAdapter.java
@@ -175,7 +175,7 @@
 
         @Override
         public boolean isDividerAllowedBelow() {
-            return true;
+            return mPanelFragment.getPanelViewType() != PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON;
         }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
index 25d02ed..405e4c3 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
@@ -17,6 +17,9 @@
 
 package com.android.settings.panel;
 
+import static com.android.settings.panel.PanelContent.VIEW_TYPE_SLIDER;
+import static com.android.settings.panel.PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -210,6 +213,54 @@
     }
 
     @Test
+    public void sliderLargeIconPanelType_displayFooterDivider() {
+        mFakePanelContent.setViewType(VIEW_TYPE_SLIDER_LARGE_ICON);
+        final ActivityController<FakeSettingsPanelActivity> activityController =
+                Robolectric.buildActivity(FakeSettingsPanelActivity.class);
+        activityController.setup();
+        final PanelFragment panelFragment = (PanelFragment)
+                Objects.requireNonNull(activityController
+                        .get()
+                        .getSupportFragmentManager()
+                        .findFragmentById(R.id.main_content));
+        final View footerDivider = panelFragment.mLayoutView.findViewById(R.id.footer_divider);
+        // Check visibility
+        assertThat(footerDivider.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void sliderPanelType_notDisplayFooterDivider() {
+        mFakePanelContent.setViewType(VIEW_TYPE_SLIDER);
+        final ActivityController<FakeSettingsPanelActivity> activityController =
+                Robolectric.buildActivity(FakeSettingsPanelActivity.class);
+        activityController.setup();
+        final PanelFragment panelFragment = (PanelFragment)
+                Objects.requireNonNull(activityController
+                        .get()
+                        .getSupportFragmentManager()
+                        .findFragmentById(R.id.main_content));
+        final View footerDivider = panelFragment.mLayoutView.findViewById(R.id.footer_divider);
+        // Check visibility
+        assertThat(footerDivider.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void defaultPanelType_notDisplayFooterDivider() {
+        mFakePanelContent.setViewType(0 /* viewType */);
+        final ActivityController<FakeSettingsPanelActivity> activityController =
+                Robolectric.buildActivity(FakeSettingsPanelActivity.class);
+        activityController.setup();
+        final PanelFragment panelFragment = (PanelFragment)
+                Objects.requireNonNull(activityController
+                        .get()
+                        .getSupportFragmentManager()
+                        .findFragmentById(R.id.main_content));
+        final View footerDivider = panelFragment.mLayoutView.findViewById(R.id.footer_divider);
+        // Check visibility
+        assertThat(footerDivider.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
     public void onHeaderChanged_updateHeader_verifyTitle() {
         mFakePanelContent.setIcon(IconCompat.createWithResource(mContext, R.drawable.ic_android));
         mFakePanelContent.setTitle(TITLE);
diff --git a/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java b/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
index f0567c8..f8c2f84 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
@@ -22,6 +22,7 @@
 import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_GROUP_SLICE_URI;
 import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI;
 import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI;
+import static com.android.settings.slices.CustomSliceRegistry.VOLUME_MEDIA_URI;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -143,6 +144,53 @@
     }
 
     @Test
+    public void sliderLargeIconPanel_shouldNotAllowDividerBelow() {
+        addTestLiveData(MEDIA_OUTPUT_SLICE_URI);
+        mFakePanelContent.setViewType(PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON);
+
+        final PanelSlicesAdapter adapter =
+                new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */);
+        final int position = 0;
+        final ViewGroup view = new FrameLayout(mContext);
+        final SliceRowViewHolder viewHolder =
+                adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON);
+        adapter.onBindViewHolder(viewHolder, position);
+
+        assertThat(viewHolder.isDividerAllowedBelow()).isFalse();
+    }
+
+    @Test
+    public void sliderPanelType_shouldAllowDividerBelow() {
+        addTestLiveData(VOLUME_MEDIA_URI);
+        mFakePanelContent.setViewType(PanelContent.VIEW_TYPE_SLIDER);
+
+        final PanelSlicesAdapter adapter =
+                new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */);
+        final int position = 0;
+        final ViewGroup view = new FrameLayout(mContext);
+        final SliceRowViewHolder viewHolder =
+                adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER);
+        adapter.onBindViewHolder(viewHolder, position);
+
+        assertThat(viewHolder.isDividerAllowedBelow()).isTrue();
+    }
+
+    @Test
+    public void defaultPanelType_shouldAllowDividerBelow() {
+        addTestLiveData(VOLUME_MEDIA_URI);
+        mFakePanelContent.setViewType(0 /* viewType */);
+
+        final PanelSlicesAdapter adapter =
+                new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */);
+        final int position = 0;
+        final ViewGroup view = new FrameLayout(mContext);
+        final SliceRowViewHolder viewHolder = adapter.onCreateViewHolder(view, 0/* viewType */);
+        adapter.onBindViewHolder(viewHolder, position);
+
+        assertThat(viewHolder.isDividerAllowedBelow()).isTrue();
+    }
+
+    @Test
     public void outputSwitcherSlice_shouldAddFirstItemPadding() {
         addTestLiveData(MEDIA_OUTPUT_SLICE_URI);
 
@@ -151,7 +199,7 @@
         final int position = 0;
         final ViewGroup view = new FrameLayout(mContext);
         final SliceRowViewHolder viewHolder =
-                adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER);
+                adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON);
 
         adapter.onBindViewHolder(viewHolder, position);
 
@@ -169,7 +217,7 @@
         final int position = 0;
         final ViewGroup view = new FrameLayout(mContext);
         final SliceRowViewHolder viewHolder =
-                adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER);
+                adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER_LARGE_ICON);
 
         adapter.onBindViewHolder(viewHolder, position);