diff --git a/res/layout/panel_layout.xml b/res/layout/panel_layout.xml
index 233a01b0641..3a8045fc2a5 100644
--- a/res/layout/panel_layout.xml
+++ b/res/layout/panel_layout.xml
@@ -31,8 +31,6 @@
android:textColor="?android:attr/colorPrimary"
android:textSize="20sp"/>
-
-
-
-
\ No newline at end of file
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index 20421d099dd..f1391dc6d63 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -37,6 +37,7 @@ import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.panel.PanelLoggingContract.PanelClosedKeys;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.google.android.setupdesign.DividerItemDecoration;
public class PanelFragment extends Fragment {
@@ -93,6 +94,10 @@ public class PanelFragment extends Fragment {
mPanelSlices.setLayoutManager(new LinearLayoutManager((activity)));
mPanelSlices.setAdapter(mAdapter);
+ DividerItemDecoration itemDecoration = new DividerItemDecoration(getActivity());
+ itemDecoration.setDividerCondition(DividerItemDecoration.DIVIDER_CONDITION_BOTH);
+ mPanelSlices.addItemDecoration(itemDecoration);
+
mTitleView.setText(mPanel.getTitle());
mSeeMoreButton.setOnClickListener(getSeeMoreListener());
diff --git a/src/com/android/settings/panel/PanelSlicesAdapter.java b/src/com/android/settings/panel/PanelSlicesAdapter.java
index 47ff6312e94..0eec534e6d8 100644
--- a/src/com/android/settings/panel/PanelSlicesAdapter.java
+++ b/src/com/android/settings/panel/PanelSlicesAdapter.java
@@ -16,6 +16,8 @@
package com.android.settings.panel;
+import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI;
+
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.net.Uri;
@@ -33,6 +35,7 @@ import androidx.slice.widget.SliceView;
import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
+import com.google.android.setupdesign.DividerItemDecoration;
import java.util.List;
@@ -80,10 +83,13 @@ public class PanelSlicesAdapter
/**
* ViewHolder for binding Slices to SliceViews.
*/
- public static class SliceRowViewHolder extends RecyclerView.ViewHolder {
+ public static class SliceRowViewHolder extends RecyclerView.ViewHolder
+ implements DividerItemDecoration.DividedViewHolder {
private final PanelContent mPanelContent;
+ private boolean mDividerAllowedAbove = true;
+
@VisibleForTesting
LiveData sliceLiveData;
@@ -103,6 +109,11 @@ public class PanelSlicesAdapter
sliceLiveData = SliceLiveData.fromUri(context, sliceUri);
sliceLiveData.observe(fragment.getViewLifecycleOwner(), sliceView);
+ // Do not show the divider above media devices switcher slice per request
+ if (sliceUri.equals(MEDIA_OUTPUT_INDICATOR_SLICE_URI)) {
+ mDividerAllowedAbove = false;
+ }
+
// Log Panel interaction
sliceView.setOnSliceActionListener(
((eventInfo, sliceItem) -> {
@@ -116,5 +127,15 @@ public class PanelSlicesAdapter
})
);
}
+
+ @Override
+ public boolean isDividerAllowedAbove() {
+ return mDividerAllowedAbove;
+ }
+
+ @Override
+ public boolean isDividerAllowedBelow() {
+ return true;
+ }
}
}
diff --git a/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java b/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
index 4dce15edad5..9795b55c5ee 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java
@@ -16,13 +16,18 @@
package com.android.settings.panel;
+import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
+import android.app.settings.SettingsEnums;
import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
import android.view.ViewGroup;
import android.widget.FrameLayout;
@@ -39,6 +44,9 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.android.controller.ActivityController;
+import java.util.Arrays;
+import java.util.List;
+
@RunWith(RobolectricTestRunner.class)
public class PanelSlicesAdapterTest {
@@ -48,8 +56,6 @@ public class PanelSlicesAdapterTest {
private FakeFeatureFactory mFakeFeatureFactory;
private PanelFeatureProvider mPanelFeatureProvider;
- private PanelSlicesAdapter mAdapter;
-
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
@@ -70,28 +76,83 @@ public class PanelSlicesAdapterTest {
.get()
.getSupportFragmentManager()
.findFragmentById(R.id.main_content));
-
- mAdapter = new PanelSlicesAdapter(mPanelFragment, mFakePanelContent);
}
@Test
public void onCreateViewHolder_returnsSliceRowViewHolder() {
+ final PanelSlicesAdapter adapter =
+ new PanelSlicesAdapter(mPanelFragment, mFakePanelContent);
final ViewGroup view = new FrameLayout(mContext);
final PanelSlicesAdapter.SliceRowViewHolder viewHolder =
- mAdapter.onCreateViewHolder(view, 0);
+ adapter.onCreateViewHolder(view, 0);
assertThat(viewHolder.sliceView).isNotNull();
}
@Test
public void onBindViewHolder_bindsSlice() {
+ final PanelSlicesAdapter adapter =
+ new PanelSlicesAdapter(mPanelFragment, mFakePanelContent);
final int position = 0;
final ViewGroup view = new FrameLayout(mContext);
final PanelSlicesAdapter.SliceRowViewHolder viewHolder =
- mAdapter.onCreateViewHolder(view, 0 /* view type*/);
+ adapter.onCreateViewHolder(view, 0 /* view type*/);
- mAdapter.onBindViewHolder(viewHolder, position);
+ adapter.onBindViewHolder(viewHolder, position);
assertThat(viewHolder.sliceLiveData).isNotNull();
}
+
+ @Test
+ public void nonMediaOutputIndicatorSlice_shouldAllowDividerAboveAndBelow() {
+ final PanelSlicesAdapter adapter =
+ new PanelSlicesAdapter(mPanelFragment, mFakePanelContent);
+ final int position = 0;
+ final ViewGroup view = new FrameLayout(mContext);
+ final PanelSlicesAdapter.SliceRowViewHolder viewHolder =
+ adapter.onCreateViewHolder(view, 0 /* view type*/);
+
+ adapter.onBindViewHolder(viewHolder, position);
+
+ assertThat(viewHolder.isDividerAllowedAbove()).isTrue();
+ assertThat(viewHolder.isDividerAllowedBelow()).isTrue();
+ }
+
+ @Test
+ public void mediaOutputIndicatorSlice_shouldNotAllowDividerAbove() {
+ PanelContent mediaOutputIndicatorSlicePanelContent = new PanelContent() {
+ @Override
+ public CharSequence getTitle() {
+ return "title";
+ }
+
+ @Override
+ public List getSlices() {
+ return Arrays.asList(
+ MEDIA_OUTPUT_INDICATOR_SLICE_URI
+ );
+ }
+
+ @Override
+ public Intent getSeeMoreIntent() {
+ return new Intent();
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.TESTING;
+ }
+ };
+
+ final PanelSlicesAdapter adapter =
+ new PanelSlicesAdapter(mPanelFragment, mediaOutputIndicatorSlicePanelContent);
+ final int position = 0;
+ final ViewGroup view = new FrameLayout(mContext);
+ final PanelSlicesAdapter.SliceRowViewHolder viewHolder =
+ adapter.onCreateViewHolder(view, 0 /* view type*/);
+
+ adapter.onBindViewHolder(viewHolder, position);
+
+ assertThat(viewHolder.isDividerAllowedAbove()).isFalse();
+ }
}
\ No newline at end of file