Loading src/com/android/settings/homepage/contextualcards/ContextualCardLookupTable.java +5 −1 Original line number Diff line number Diff line Loading @@ -84,7 +84,11 @@ public class ContextualCardLookupTable { LegacySuggestionContextualCardController.class, LegacySuggestionContextualCardRenderer.class)); add(new ControllerRendererMapping(CardType.SLICE, SliceContextualCardRenderer.VIEW_TYPE, SliceContextualCardRenderer.VIEW_TYPE_FULL_WIDTH, SliceContextualCardController.class, SliceContextualCardRenderer.class)); add(new ControllerRendererMapping(CardType.SLICE, SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH, SliceContextualCardController.class, SliceContextualCardRenderer.class)); add(new ControllerRendererMapping(CardType.CONDITIONAL_FOOTER, Loading src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java +48 −72 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.view.View; import android.widget.Button; import android.widget.ViewFlipper; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; Loading @@ -35,40 +34,40 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.OnLifecycleEvent; import androidx.recyclerview.widget.RecyclerView; import androidx.slice.Slice; import androidx.slice.SliceItem; import androidx.slice.widget.EventInfo; import androidx.slice.widget.SliceLiveData; import androidx.slice.widget.SliceView; import com.android.settings.R; import com.android.settings.homepage.contextualcards.CardContentProvider; import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; import com.android.settings.homepage.contextualcards.ContextualCardRenderer; import com.android.settings.homepage.contextualcards.ControllerRendererPool; import com.android.settings.overlay.FeatureFactory; import java.util.Map; import java.util.Set; /** * Card renderer for {@link ContextualCard} built as slices. * Card renderer for {@link ContextualCard} built as slice full card or slice half card. */ public class SliceContextualCardRenderer implements ContextualCardRenderer, SliceView.OnSliceActionListener, LifecycleObserver { public static final int VIEW_TYPE = R.layout.homepage_slice_tile; public class SliceContextualCardRenderer implements ContextualCardRenderer, LifecycleObserver { public static final int VIEW_TYPE_FULL_WIDTH = R.layout.homepage_slice_tile; public static final int VIEW_TYPE_HALF_WIDTH = R.layout.homepage_slice_half_tile; private static final String TAG = "SliceCardRenderer"; @VisibleForTesting final Map<Uri, LiveData<Slice>> mSliceLiveDataMap; @VisibleForTesting final Set<SliceViewHolder> mFlippedCardSet; final Set<RecyclerView.ViewHolder> mFlippedCardSet; private final Context mContext; private final LifecycleOwner mLifecycleOwner; private final ControllerRendererPool mControllerRendererPool; private final Set<ContextualCard> mCardSet; private final SliceFullCardRendererHelper mFullCardHelper; private final SliceHalfCardRendererHelper mHalfCardHelper; //TODO(b/121303357): Remove isHalfWidth field from SliceContextualCardRenderer class. private boolean mIsHalfWidth; public SliceContextualCardRenderer(Context context, LifecycleOwner lifecycleOwner, ControllerRendererPool controllerRendererPool) { Loading @@ -79,21 +78,26 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, mCardSet = new ArraySet<>(); mFlippedCardSet = new ArraySet<>(); mLifecycleOwner.getLifecycle().addObserver(this); mFullCardHelper = new SliceFullCardRendererHelper(context); mHalfCardHelper = new SliceHalfCardRendererHelper(context); } @Override public int getViewType(boolean isHalfWidth) { return VIEW_TYPE; mIsHalfWidth = isHalfWidth; return isHalfWidth? VIEW_TYPE_HALF_WIDTH : VIEW_TYPE_FULL_WIDTH; } @Override public RecyclerView.ViewHolder createViewHolder(View view) { return new SliceViewHolder(view); if (mIsHalfWidth) { return mHalfCardHelper.createViewHolder(view); } return mFullCardHelper.createViewHolder(view); } @Override public void bindView(RecyclerView.ViewHolder holder, ContextualCard card) { final SliceViewHolder cardHolder = (SliceViewHolder) holder; final Uri uri = card.getSliceUri(); //TODO(b/120629936): Take this out once blank card issue is fixed. Log.d(TAG, "bindView - uri = " + uri); Loading @@ -103,10 +107,6 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, return; } cardHolder.sliceView.setScrollable(false); cardHolder.sliceView.setTag(uri); //TODO(b/114009676): We will soon have a field to decide what slice mode we should set. cardHolder.sliceView.setMode(SliceView.MODE_LARGE); LiveData<Slice> sliceLiveData = mSliceLiveDataMap.get(uri); if (sliceLiveData == null) { Loading @@ -125,82 +125,58 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, //TODO(b/120629936): Take this out once blank card issue is fixed. Log.d(TAG, "Slice callback - uri = " + slice.getUri()); } cardHolder.sliceView.setSlice(slice); if (holder.getItemViewType() == VIEW_TYPE_HALF_WIDTH) { mHalfCardHelper.bindView(holder, card, slice); } else { mFullCardHelper.bindView(holder, card, slice, mCardSet); } }); // Set this listener so we can log the interaction users make on the slice cardHolder.sliceView.setOnSliceActionListener(this); // Customize slice view for Settings cardHolder.sliceView.showTitleItems(true); if (card.isLargeCard()) { cardHolder.sliceView.showHeaderDivider(true); cardHolder.sliceView.showActionDividers(true); if (holder.getItemViewType() == VIEW_TYPE_HALF_WIDTH) { initDismissalActions(holder, card, R.id.content); } else { initDismissalActions(holder, card, R.id.slice_view); } initDismissalActions(cardHolder, card); } private void initDismissalActions(SliceViewHolder cardHolder, ContextualCard card) { cardHolder.sliceView.setOnLongClickListener(v -> { cardHolder.viewFlipper.showNext(); mFlippedCardSet.add(cardHolder); private void initDismissalActions(RecyclerView.ViewHolder holder, ContextualCard card, int initialViewId) { // initialView is the first view in the ViewFlipper. final View initialView = holder.itemView.findViewById(initialViewId); initialView.setOnLongClickListener(v -> { flipCardToDismissalView(holder); mFlippedCardSet.add(holder); return true; }); final Button btnKeep = cardHolder.itemView.findViewById(R.id.keep); final Button btnKeep = holder.itemView.findViewById(R.id.keep); btnKeep.setOnClickListener(v -> { cardHolder.resetCard(); mFlippedCardSet.remove(cardHolder); mFlippedCardSet.remove(holder); resetCardView(holder); }); final Button btnRemove = cardHolder.itemView.findViewById(R.id.remove); final Button btnRemove = holder.itemView.findViewById(R.id.remove); btnRemove.setOnClickListener(v -> { mControllerRendererPool.getController(mContext, card.getCardType()).onDismissed(card); cardHolder.resetCard(); mFlippedCardSet.remove(cardHolder); mFlippedCardSet.remove(holder); resetCardView(holder); mSliceLiveDataMap.get(card.getSliceUri()).removeObservers(mLifecycleOwner); }); } @Override public void onSliceAction(@NonNull EventInfo eventInfo, @NonNull SliceItem sliceItem) { //TODO(b/79698338): Log user interaction // sliceItem.getSlice().getUri() is like // content://android.settings.slices/action/wifi/_gen/0/_gen/0 // contextualCard.getSliceUri() is prefix of sliceItem.getSlice().getUri() for (ContextualCard card : mCardSet) { if (sliceItem.getSlice().getUri().toString().startsWith( card.getSliceUri().toString())) { ContextualCardFeatureProvider contexualCardFeatureProvider = FeatureFactory.getFactory(mContext) .getContextualCardFeatureProvider(mContext); contexualCardFeatureProvider.logContextualCardClick(card, eventInfo.rowIndex, eventInfo.actionType); break; } } } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onStop() { mFlippedCardSet.stream().forEach(holder -> holder.resetCard()); mFlippedCardSet.stream().forEach(holder -> resetCardView(holder)); mFlippedCardSet.clear(); } public static class SliceViewHolder extends RecyclerView.ViewHolder { public final SliceView sliceView; public final ViewFlipper viewFlipper; public SliceViewHolder(View view) { super(view); sliceView = view.findViewById(R.id.slice_view); viewFlipper = view.findViewById(R.id.view_flipper); private void resetCardView(RecyclerView.ViewHolder holder) { final ViewFlipper viewFlipper = holder.itemView.findViewById(R.id.view_flipper); viewFlipper.setDisplayedChild(0 /* whichChild */); } public void resetCard() { viewFlipper.setDisplayedChild(0); } private void flipCardToDismissalView(RecyclerView.ViewHolder holder) { final ViewFlipper viewFlipper = holder.itemView.findViewById(R.id.view_flipper); viewFlipper.showNext(); } } src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java 0 → 100644 +99 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.homepage.contextualcards.slices; import android.content.Context; import android.view.View; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import androidx.slice.Slice; import androidx.slice.SliceItem; import androidx.slice.widget.EventInfo; import androidx.slice.widget.SliceView; import com.android.settings.R; import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; import com.android.settings.overlay.FeatureFactory; import java.util.Set; /** * Card renderer helper for {@link ContextualCard} built as slice full card. */ class SliceFullCardRendererHelper implements SliceView.OnSliceActionListener { private static final String TAG = "SliceFCRendererHelper"; private final Context mContext; private Set<ContextualCard> mCardSet; SliceFullCardRendererHelper(Context context) { mContext = context; } RecyclerView.ViewHolder createViewHolder(View view) { return new SliceViewHolder(view); } void bindView(RecyclerView.ViewHolder holder, ContextualCard card, Slice slice, Set<ContextualCard> cardSet) { final SliceViewHolder cardHolder = (SliceViewHolder) holder; cardHolder.sliceView.setScrollable(false); cardHolder.sliceView.setTag(card.getSliceUri()); //TODO(b/114009676): We will soon have a field to decide what slice mode we should set. cardHolder.sliceView.setMode(SliceView.MODE_LARGE); cardHolder.sliceView.setSlice(slice); mCardSet = cardSet; // Set this listener so we can log the interaction users make on the slice cardHolder.sliceView.setOnSliceActionListener(this); // Customize slice view for Settings cardHolder.sliceView.showTitleItems(true); if (card.isLargeCard()) { cardHolder.sliceView.showHeaderDivider(true); cardHolder.sliceView.showActionDividers(true); } } @Override public void onSliceAction(@NonNull EventInfo eventInfo, @NonNull SliceItem sliceItem) { // sliceItem.getSlice().getUri() is like // content://android.settings.slices/action/wifi/_gen/0/_gen/0 // contextualCard.getSliceUri() is prefix of sliceItem.getSlice().getUri() final ContextualCardFeatureProvider contextualCardFeatureProvider = FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider(mContext); for (ContextualCard card : mCardSet) { if (sliceItem.getSlice().getUri().toString().startsWith( card.getSliceUri().toString())) { contextualCardFeatureProvider.logContextualCardClick(card, eventInfo.rowIndex, eventInfo.actionType); break; } } } static class SliceViewHolder extends RecyclerView.ViewHolder { public final SliceView sliceView; public SliceViewHolder(View view) { super(view); sliceView = view.findViewById(R.id.slice_view); } } } src/com/android/settings/homepage/contextualcards/slices/SliceHalfCardRendererHelper.java 0 → 100644 +46 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.homepage.contextualcards.slices; import android.content.Context; import android.view.View; import androidx.recyclerview.widget.RecyclerView; import androidx.slice.Slice; import com.android.settings.homepage.contextualcards.ContextualCard; /** * Card renderer helper for {@link ContextualCard} built as slice half card. */ class SliceHalfCardRendererHelper { private static final String TAG = "SliceHCRendererHelper"; private final Context mContext; SliceHalfCardRendererHelper(Context context) { mContext = context; } RecyclerView.ViewHolder createViewHolder(View view) { return null; } void bindView(RecyclerView.ViewHolder holder, ContextualCard card, Slice slice) { } } tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRendererTest.java +1 −12 Original line number Diff line number Diff line Loading @@ -78,17 +78,6 @@ public class SliceContextualCardRendererTest { mControllerRendererPool); } @Test public void bindView_shouldSetScrollableToFalse() { RecyclerView.ViewHolder viewHolder = getSliceViewHolder(); mRenderer.bindView(viewHolder, buildContextualCard(TEST_SLICE_URI)); assertThat( ((SliceContextualCardRenderer.SliceViewHolder) viewHolder).sliceView.isScrollable ()).isFalse(); } @Test public void bindView_invalidScheme_sliceShouldBeNull() { final Uri sliceUri = Uri.parse("contet://com.android.settings.slices/action/flashlight"); Loading @@ -97,7 +86,7 @@ public class SliceContextualCardRendererTest { mRenderer.bindView(viewHolder, buildContextualCard(sliceUri)); assertThat( ((SliceContextualCardRenderer.SliceViewHolder) viewHolder).sliceView.getSlice()) ((SliceFullCardRendererHelper.SliceViewHolder) viewHolder).sliceView.getSlice()) .isNull(); } Loading Loading
src/com/android/settings/homepage/contextualcards/ContextualCardLookupTable.java +5 −1 Original line number Diff line number Diff line Loading @@ -84,7 +84,11 @@ public class ContextualCardLookupTable { LegacySuggestionContextualCardController.class, LegacySuggestionContextualCardRenderer.class)); add(new ControllerRendererMapping(CardType.SLICE, SliceContextualCardRenderer.VIEW_TYPE, SliceContextualCardRenderer.VIEW_TYPE_FULL_WIDTH, SliceContextualCardController.class, SliceContextualCardRenderer.class)); add(new ControllerRendererMapping(CardType.SLICE, SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH, SliceContextualCardController.class, SliceContextualCardRenderer.class)); add(new ControllerRendererMapping(CardType.CONDITIONAL_FOOTER, Loading
src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java +48 −72 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.view.View; import android.widget.Button; import android.widget.ViewFlipper; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; Loading @@ -35,40 +34,40 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.OnLifecycleEvent; import androidx.recyclerview.widget.RecyclerView; import androidx.slice.Slice; import androidx.slice.SliceItem; import androidx.slice.widget.EventInfo; import androidx.slice.widget.SliceLiveData; import androidx.slice.widget.SliceView; import com.android.settings.R; import com.android.settings.homepage.contextualcards.CardContentProvider; import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; import com.android.settings.homepage.contextualcards.ContextualCardRenderer; import com.android.settings.homepage.contextualcards.ControllerRendererPool; import com.android.settings.overlay.FeatureFactory; import java.util.Map; import java.util.Set; /** * Card renderer for {@link ContextualCard} built as slices. * Card renderer for {@link ContextualCard} built as slice full card or slice half card. */ public class SliceContextualCardRenderer implements ContextualCardRenderer, SliceView.OnSliceActionListener, LifecycleObserver { public static final int VIEW_TYPE = R.layout.homepage_slice_tile; public class SliceContextualCardRenderer implements ContextualCardRenderer, LifecycleObserver { public static final int VIEW_TYPE_FULL_WIDTH = R.layout.homepage_slice_tile; public static final int VIEW_TYPE_HALF_WIDTH = R.layout.homepage_slice_half_tile; private static final String TAG = "SliceCardRenderer"; @VisibleForTesting final Map<Uri, LiveData<Slice>> mSliceLiveDataMap; @VisibleForTesting final Set<SliceViewHolder> mFlippedCardSet; final Set<RecyclerView.ViewHolder> mFlippedCardSet; private final Context mContext; private final LifecycleOwner mLifecycleOwner; private final ControllerRendererPool mControllerRendererPool; private final Set<ContextualCard> mCardSet; private final SliceFullCardRendererHelper mFullCardHelper; private final SliceHalfCardRendererHelper mHalfCardHelper; //TODO(b/121303357): Remove isHalfWidth field from SliceContextualCardRenderer class. private boolean mIsHalfWidth; public SliceContextualCardRenderer(Context context, LifecycleOwner lifecycleOwner, ControllerRendererPool controllerRendererPool) { Loading @@ -79,21 +78,26 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, mCardSet = new ArraySet<>(); mFlippedCardSet = new ArraySet<>(); mLifecycleOwner.getLifecycle().addObserver(this); mFullCardHelper = new SliceFullCardRendererHelper(context); mHalfCardHelper = new SliceHalfCardRendererHelper(context); } @Override public int getViewType(boolean isHalfWidth) { return VIEW_TYPE; mIsHalfWidth = isHalfWidth; return isHalfWidth? VIEW_TYPE_HALF_WIDTH : VIEW_TYPE_FULL_WIDTH; } @Override public RecyclerView.ViewHolder createViewHolder(View view) { return new SliceViewHolder(view); if (mIsHalfWidth) { return mHalfCardHelper.createViewHolder(view); } return mFullCardHelper.createViewHolder(view); } @Override public void bindView(RecyclerView.ViewHolder holder, ContextualCard card) { final SliceViewHolder cardHolder = (SliceViewHolder) holder; final Uri uri = card.getSliceUri(); //TODO(b/120629936): Take this out once blank card issue is fixed. Log.d(TAG, "bindView - uri = " + uri); Loading @@ -103,10 +107,6 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, return; } cardHolder.sliceView.setScrollable(false); cardHolder.sliceView.setTag(uri); //TODO(b/114009676): We will soon have a field to decide what slice mode we should set. cardHolder.sliceView.setMode(SliceView.MODE_LARGE); LiveData<Slice> sliceLiveData = mSliceLiveDataMap.get(uri); if (sliceLiveData == null) { Loading @@ -125,82 +125,58 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, //TODO(b/120629936): Take this out once blank card issue is fixed. Log.d(TAG, "Slice callback - uri = " + slice.getUri()); } cardHolder.sliceView.setSlice(slice); if (holder.getItemViewType() == VIEW_TYPE_HALF_WIDTH) { mHalfCardHelper.bindView(holder, card, slice); } else { mFullCardHelper.bindView(holder, card, slice, mCardSet); } }); // Set this listener so we can log the interaction users make on the slice cardHolder.sliceView.setOnSliceActionListener(this); // Customize slice view for Settings cardHolder.sliceView.showTitleItems(true); if (card.isLargeCard()) { cardHolder.sliceView.showHeaderDivider(true); cardHolder.sliceView.showActionDividers(true); if (holder.getItemViewType() == VIEW_TYPE_HALF_WIDTH) { initDismissalActions(holder, card, R.id.content); } else { initDismissalActions(holder, card, R.id.slice_view); } initDismissalActions(cardHolder, card); } private void initDismissalActions(SliceViewHolder cardHolder, ContextualCard card) { cardHolder.sliceView.setOnLongClickListener(v -> { cardHolder.viewFlipper.showNext(); mFlippedCardSet.add(cardHolder); private void initDismissalActions(RecyclerView.ViewHolder holder, ContextualCard card, int initialViewId) { // initialView is the first view in the ViewFlipper. final View initialView = holder.itemView.findViewById(initialViewId); initialView.setOnLongClickListener(v -> { flipCardToDismissalView(holder); mFlippedCardSet.add(holder); return true; }); final Button btnKeep = cardHolder.itemView.findViewById(R.id.keep); final Button btnKeep = holder.itemView.findViewById(R.id.keep); btnKeep.setOnClickListener(v -> { cardHolder.resetCard(); mFlippedCardSet.remove(cardHolder); mFlippedCardSet.remove(holder); resetCardView(holder); }); final Button btnRemove = cardHolder.itemView.findViewById(R.id.remove); final Button btnRemove = holder.itemView.findViewById(R.id.remove); btnRemove.setOnClickListener(v -> { mControllerRendererPool.getController(mContext, card.getCardType()).onDismissed(card); cardHolder.resetCard(); mFlippedCardSet.remove(cardHolder); mFlippedCardSet.remove(holder); resetCardView(holder); mSliceLiveDataMap.get(card.getSliceUri()).removeObservers(mLifecycleOwner); }); } @Override public void onSliceAction(@NonNull EventInfo eventInfo, @NonNull SliceItem sliceItem) { //TODO(b/79698338): Log user interaction // sliceItem.getSlice().getUri() is like // content://android.settings.slices/action/wifi/_gen/0/_gen/0 // contextualCard.getSliceUri() is prefix of sliceItem.getSlice().getUri() for (ContextualCard card : mCardSet) { if (sliceItem.getSlice().getUri().toString().startsWith( card.getSliceUri().toString())) { ContextualCardFeatureProvider contexualCardFeatureProvider = FeatureFactory.getFactory(mContext) .getContextualCardFeatureProvider(mContext); contexualCardFeatureProvider.logContextualCardClick(card, eventInfo.rowIndex, eventInfo.actionType); break; } } } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onStop() { mFlippedCardSet.stream().forEach(holder -> holder.resetCard()); mFlippedCardSet.stream().forEach(holder -> resetCardView(holder)); mFlippedCardSet.clear(); } public static class SliceViewHolder extends RecyclerView.ViewHolder { public final SliceView sliceView; public final ViewFlipper viewFlipper; public SliceViewHolder(View view) { super(view); sliceView = view.findViewById(R.id.slice_view); viewFlipper = view.findViewById(R.id.view_flipper); private void resetCardView(RecyclerView.ViewHolder holder) { final ViewFlipper viewFlipper = holder.itemView.findViewById(R.id.view_flipper); viewFlipper.setDisplayedChild(0 /* whichChild */); } public void resetCard() { viewFlipper.setDisplayedChild(0); } private void flipCardToDismissalView(RecyclerView.ViewHolder holder) { final ViewFlipper viewFlipper = holder.itemView.findViewById(R.id.view_flipper); viewFlipper.showNext(); } }
src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java 0 → 100644 +99 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.homepage.contextualcards.slices; import android.content.Context; import android.view.View; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import androidx.slice.Slice; import androidx.slice.SliceItem; import androidx.slice.widget.EventInfo; import androidx.slice.widget.SliceView; import com.android.settings.R; import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; import com.android.settings.overlay.FeatureFactory; import java.util.Set; /** * Card renderer helper for {@link ContextualCard} built as slice full card. */ class SliceFullCardRendererHelper implements SliceView.OnSliceActionListener { private static final String TAG = "SliceFCRendererHelper"; private final Context mContext; private Set<ContextualCard> mCardSet; SliceFullCardRendererHelper(Context context) { mContext = context; } RecyclerView.ViewHolder createViewHolder(View view) { return new SliceViewHolder(view); } void bindView(RecyclerView.ViewHolder holder, ContextualCard card, Slice slice, Set<ContextualCard> cardSet) { final SliceViewHolder cardHolder = (SliceViewHolder) holder; cardHolder.sliceView.setScrollable(false); cardHolder.sliceView.setTag(card.getSliceUri()); //TODO(b/114009676): We will soon have a field to decide what slice mode we should set. cardHolder.sliceView.setMode(SliceView.MODE_LARGE); cardHolder.sliceView.setSlice(slice); mCardSet = cardSet; // Set this listener so we can log the interaction users make on the slice cardHolder.sliceView.setOnSliceActionListener(this); // Customize slice view for Settings cardHolder.sliceView.showTitleItems(true); if (card.isLargeCard()) { cardHolder.sliceView.showHeaderDivider(true); cardHolder.sliceView.showActionDividers(true); } } @Override public void onSliceAction(@NonNull EventInfo eventInfo, @NonNull SliceItem sliceItem) { // sliceItem.getSlice().getUri() is like // content://android.settings.slices/action/wifi/_gen/0/_gen/0 // contextualCard.getSliceUri() is prefix of sliceItem.getSlice().getUri() final ContextualCardFeatureProvider contextualCardFeatureProvider = FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider(mContext); for (ContextualCard card : mCardSet) { if (sliceItem.getSlice().getUri().toString().startsWith( card.getSliceUri().toString())) { contextualCardFeatureProvider.logContextualCardClick(card, eventInfo.rowIndex, eventInfo.actionType); break; } } } static class SliceViewHolder extends RecyclerView.ViewHolder { public final SliceView sliceView; public SliceViewHolder(View view) { super(view); sliceView = view.findViewById(R.id.slice_view); } } }
src/com/android/settings/homepage/contextualcards/slices/SliceHalfCardRendererHelper.java 0 → 100644 +46 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.homepage.contextualcards.slices; import android.content.Context; import android.view.View; import androidx.recyclerview.widget.RecyclerView; import androidx.slice.Slice; import com.android.settings.homepage.contextualcards.ContextualCard; /** * Card renderer helper for {@link ContextualCard} built as slice half card. */ class SliceHalfCardRendererHelper { private static final String TAG = "SliceHCRendererHelper"; private final Context mContext; SliceHalfCardRendererHelper(Context context) { mContext = context; } RecyclerView.ViewHolder createViewHolder(View view) { return null; } void bindView(RecyclerView.ViewHolder holder, ContextualCard card, Slice slice) { } }
tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRendererTest.java +1 −12 Original line number Diff line number Diff line Loading @@ -78,17 +78,6 @@ public class SliceContextualCardRendererTest { mControllerRendererPool); } @Test public void bindView_shouldSetScrollableToFalse() { RecyclerView.ViewHolder viewHolder = getSliceViewHolder(); mRenderer.bindView(viewHolder, buildContextualCard(TEST_SLICE_URI)); assertThat( ((SliceContextualCardRenderer.SliceViewHolder) viewHolder).sliceView.isScrollable ()).isFalse(); } @Test public void bindView_invalidScheme_sliceShouldBeNull() { final Uri sliceUri = Uri.parse("contet://com.android.settings.slices/action/flashlight"); Loading @@ -97,7 +86,7 @@ public class SliceContextualCardRendererTest { mRenderer.bindView(viewHolder, buildContextualCard(sliceUri)); assertThat( ((SliceContextualCardRenderer.SliceViewHolder) viewHolder).sliceView.getSlice()) ((SliceFullCardRendererHelper.SliceViewHolder) viewHolder).sliceView.getSlice()) .isNull(); } Loading