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