Merge "Show icons for allowed sounds" into main

This commit is contained in:
Matías Hernández
2024-07-19 17:06:27 +00:00
committed by Android (Google) Code Review
16 changed files with 389 additions and 105 deletions

View File

@@ -53,6 +53,36 @@ public class CircularIconSetTest {
when(mDrawableLoader.apply(anyInt())).thenReturn(new ColorDrawable(Color.BLACK));
}
@Test
public void equals_sameItems_true() {
CircularIconSet<Integer> items1 = new CircularIconSet<>(ImmutableList.of(1, 2),
num -> new ColorDrawable(Color.BLUE));
CircularIconSet<Integer> items2 = new CircularIconSet<>(ImmutableList.of(1, 2),
num -> new ColorDrawable(Color.GREEN));
assertThat(items1.hasSameItemsAs(items2)).isTrue();
}
@Test
public void equals_differentTypes_false() {
CircularIconSet<Integer> items1 = new CircularIconSet<>(ImmutableList.of(1, 2),
num -> new ColorDrawable(Color.BLUE));
CircularIconSet<String> items2 = new CircularIconSet<>(ImmutableList.of("a", "b"),
str -> new ColorDrawable(Color.GREEN));
assertThat(items1.hasSameItemsAs(items2)).isFalse();
}
@Test
public void equals_differentItems_false() {
CircularIconSet<String> items1 = new CircularIconSet<>(ImmutableList.of("a", "b"),
str -> new ColorDrawable(Color.GREEN));
CircularIconSet<String> items2 = new CircularIconSet<>(ImmutableList.of("a", "b", "c"),
str -> new ColorDrawable(Color.GREEN));
assertThat(items1.hasSameItemsAs(items2)).isFalse();
}
@Test
public void getIcons_loadsAllIcons() {
CircularIconSet<Integer> set = new CircularIconSet<>(ImmutableList.of(1, 2, 3),

View File

@@ -19,16 +19,16 @@ package com.android.settings.notification.modes;
import static android.view.View.MeasureSpec.makeMeasureSpec;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import androidx.preference.PreferenceViewHolder;
@@ -41,11 +41,11 @@ import com.google.common.util.concurrent.MoreExecutors;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.List;
import java.util.stream.IntStream;
@RunWith(RobolectricTestRunner.class)
@@ -68,20 +68,30 @@ public class CircularIconsPreferenceTest {
// Tests should call bindAndMeasureViewHolder() so that icons can be added.
Resources res = mContext.getResources();
mOneIconWidth = res.getDimensionPixelSize(R.dimen.zen_mode_circular_icon_size)
mOneIconWidth = res.getDimensionPixelSize(R.dimen.zen_mode_circular_icon_diameter)
+ res.getDimensionPixelSize(R.dimen.zen_mode_circular_icon_margin_between);
}
private void bindAndMeasureViewHolder(int viewWidth) {
bindViewHolder();
measureViewHolder(viewWidth);
}
private void bindViewHolder() {
View preferenceView = LayoutInflater.from(mContext).inflate(mPreference.getLayoutResource(),
null);
mIconContainer = checkNotNull(preferenceView.findViewById(R.id.circles_container));
mIconContainer.measure(makeMeasureSpec(viewWidth, View.MeasureSpec.EXACTLY),
makeMeasureSpec(1000, View.MeasureSpec.EXACTLY));
PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(preferenceView);
mPreference.onBindViewHolder(holder);
}
private void measureViewHolder(int viewWidth) {
checkState(mIconContainer != null, "Call bindViewHolder() first!");
mIconContainer.measure(makeMeasureSpec(viewWidth, View.MeasureSpec.EXACTLY),
makeMeasureSpec(1000, View.MeasureSpec.EXACTLY));
mIconContainer.getViewTreeObserver().dispatchOnGlobalLayout();
}
@Test
public void displayIcons_loadsIcons() {
CircularIconSet<Integer> iconSet = new CircularIconSet<>(ImmutableList.of(1, 2),
@@ -90,13 +100,10 @@ public class CircularIconsPreferenceTest {
bindAndMeasureViewHolder(VIEW_WIDTH);
mPreference.displayIcons(iconSet);
assertThat(mPreference.getIconViews()).hasSize(2);
assertThat(mPreference.getIconViews().get(0).getDrawable())
.isInstanceOf(ColorDrawable.class);
assertThat(((ColorDrawable) mPreference.getIconViews().get(0).getDrawable()).getColor())
.isEqualTo(1);
assertThat(((ColorDrawable) mPreference.getIconViews().get(1).getDrawable()).getColor())
.isEqualTo(2);
assertThat(mPreference.getIcons()).hasSize(2);
assertThat(((ColorDrawable) mPreference.getIcons().get(0)).getColor()).isEqualTo(1);
assertThat(((ColorDrawable) mPreference.getIcons().get(1)).getColor()).isEqualTo(2);
assertThat(mPreference.getPlusText()).isNull();
assertThat(mIconContainer.getVisibility()).isEqualTo(View.VISIBLE);
}
@@ -111,74 +118,81 @@ public class CircularIconsPreferenceTest {
assertThat(mIconContainer.getVisibility()).isEqualTo(View.GONE);
}
@Test
public void displayIcons_exactlyMaxIcons_loadsAllIcons() throws Exception {
int width = 300;
int fittingIcons = width / mOneIconWidth;
int fittingCircles = width / mOneIconWidth;
CircularIconSet<Integer> iconSet = new CircularIconSet<>(
IntStream.range(0, fittingIcons).boxed().toList(),
IntStream.range(0, fittingCircles).boxed().toList(),
ColorDrawable::new);
bindAndMeasureViewHolder(width);
mPreference.displayIcons(iconSet);
List<Drawable> displayedDrawables = mPreference.getIconViews().stream()
.map(ImageView::getDrawable).toList();
assertThat(displayedDrawables).hasSize(fittingIcons);
assertThat(displayedDrawables).containsExactlyElementsIn(
assertThat(mPreference.getIcons()).hasSize(fittingCircles);
assertThat(mPreference.getIcons()).containsExactlyElementsIn(
Futures.allAsList(iconSet.getIcons()).get()).inOrder();
assertThat(mPreference.getPlusText()).isNull();
}
@Test
public void displayIcons_tooManyIcons_loadsFirstNAndPlusIcon() throws Exception {
int width = 300;
int fittingIcons = width / mOneIconWidth;
int fittingCircles = width / mOneIconWidth;
CircularIconSet<Integer> iconSet = new CircularIconSet<>(
IntStream.range(0, fittingIcons + 5).boxed().toList(),
IntStream.range(0, fittingCircles + 5).boxed().toList(),
ColorDrawable::new);
bindAndMeasureViewHolder(width);
mPreference.displayIcons(iconSet);
List<Drawable> displayedDrawables = mPreference.getIconViews().stream()
.map(ImageView::getDrawable).toList();
assertThat(displayedDrawables).hasSize(fittingIcons);
// N-1 are actual icons, Nth icon is (+xx).
assertThat(displayedDrawables.stream().limit(fittingIcons - 1).toList())
.containsExactlyElementsIn(
Futures.allAsList(iconSet.getIcons(fittingIcons - 1)).get())
// N-1 icons, plus (+6) text.
assertThat(mPreference.getIcons()).hasSize(fittingCircles - 1);
assertThat(mPreference.getIcons()).containsExactlyElementsIn(
Futures.allAsList(iconSet.getIcons(fittingCircles - 1)).get())
.inOrder();
// TODO: b/346551087 - Correctly verify the plus-6 icon, once we generate it properly.
assertThat(((ColorDrawable) displayedDrawables.get(
displayedDrawables.size() - 1)).getColor()).isEqualTo(Color.BLUE);
assertThat(mPreference.getPlusText()).isEqualTo("+6");
}
@Test
public void displayIcons_teenyTinySpace_showsPlusIcon_noCrash() {
int width = 1;
CircularIconSet<Integer> iconSet = new CircularIconSet<>(ImmutableList.of(1, 2),
ColorDrawable::new);
bindAndMeasureViewHolder(width);
bindAndMeasureViewHolder(1);
mPreference.displayIcons(iconSet);
assertThat(mPreference.getIconViews()).hasSize(1);
// TODO: b/346551087 - Correctly verify the plus-2 icon, once we generate it properly.
assertThat(((ColorDrawable) mPreference.getIconViews().get(0).getDrawable()).getColor())
.isEqualTo(Color.BLUE);
assertThat(mPreference.getIcons()).isEmpty();
assertThat(mPreference.getPlusText()).isEqualTo("+2");
}
@Test
public void displayIcons_beforeBind_loadsIconsOnBind() {
public void displayIcons_beforeBind_loadsIconsOnBindAndMeasure() {
CircularIconSet<Integer> iconSet = new CircularIconSet<>(ImmutableList.of(1, 2, 3),
ColorDrawable::new);
mPreference.displayIcons(iconSet);
assertThat(mPreference.getIconViews()).isEmpty();
assertThat(mPreference.getIcons()).isEmpty(); // Hold...
bindAndMeasureViewHolder(VIEW_WIDTH);
assertThat(mPreference.getIconViews()).hasSize(3);
bindViewHolder();
assertThat(mPreference.getIcons()).isEmpty(); // Hooooold...
measureViewHolder(VIEW_WIDTH);
assertThat(mPreference.getIcons()).hasSize(3);
}
@Test
public void displayIcons_beforeMeasure_loadsIconsOnMeasure() {
CircularIconSet<Integer> iconSet = new CircularIconSet<>(ImmutableList.of(1, 2, 3),
ColorDrawable::new);
bindViewHolder();
mPreference.displayIcons(iconSet);
assertThat(mPreference.getIcons()).isEmpty();
measureViewHolder(VIEW_WIDTH);
assertThat(mPreference.getIcons()).hasSize(3);
}
@Test
@@ -192,10 +206,24 @@ public class CircularIconsPreferenceTest {
bindAndMeasureViewHolder(VIEW_WIDTH);
mPreference.displayIcons(threeIcons);
assertThat(mPreference.getIconViews()).hasSize(3);
assertThat(mPreference.getIcons()).hasSize(3);
mPreference.displayIcons(twoIcons);
assertThat(mPreference.getIconViews()).hasSize(2);
assertThat(mPreference.getIcons()).hasSize(2);
mPreference.displayIcons(fourIcons);
assertThat(mPreference.getIconViews()).hasSize(4);
assertThat(mPreference.getIcons()).hasSize(4);
}
@Test
public void displayIcons_sameSet_doesNotReloadIcons() {
CircularIconSet<Integer> one = new CircularIconSet<>(ImmutableList.of(1, 2, 3),
ColorDrawable::new);
CircularIconSet<Integer> same = Mockito.spy(new CircularIconSet<>(ImmutableList.of(1, 2, 3),
ColorDrawable::new));
when(same.getIcons()).thenThrow(new RuntimeException("Shouldn't be called!"));
bindAndMeasureViewHolder(VIEW_WIDTH);
mPreference.displayIcons(one);
mPreference.displayIcons(same); // if no exception, wasn't called.
}
}

View File

@@ -259,7 +259,7 @@ public final class ZenModeAppsLinkPreferenceControllerTest {
appEntries.add(createAppEntry("test2", mContext.getUserId()));
mController.mAppSessionCallbacks.onRebuildComplete(appEntries);
assertThat(mPreference.getIconViews()).hasSize(2);
assertThat(mPreference.getIcons()).hasSize(2);
}
@Test

View File

@@ -17,7 +17,7 @@
package com.android.settings.notification.modes;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -25,8 +25,10 @@ import android.app.Flags;
import android.content.Context;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.service.notification.ZenPolicy;
import com.android.settingslib.notification.modes.TestModeBuilder;
import com.android.settingslib.notification.modes.ZenMode;
import org.junit.Before;
import org.junit.Rule;
@@ -60,13 +62,40 @@ public final class ZenModeOtherLinkPreferenceControllerTest {
}
@Test
@EnableFlags(Flags.FLAG_MODES_UI)
public void testHasSummary() {
public void updateState_loadsSummary() {
CircularIconsPreference pref = mock(CircularIconsPreference.class);
mController.updateZenMode(pref, TestModeBuilder.EXAMPLE);
verify(pref).setSummary(any());
verify(pref).displayIcons(eq(CircularIconSet.EMPTY));
}
@Test
public void updateState_loadsIcons() {
CircularIconsPreference pref = mock(CircularIconsPreference.class);
ZenMode mode = new TestModeBuilder()
.setZenPolicy(new ZenPolicy.Builder()
.disallowAllSounds()
.allowMedia(true)
.allowSystem(true)
.allowReminders(true)
.build())
.build();
mController.updateState(pref, mode);
verify(pref).displayIcons(argThat(iconSet -> iconSet.size() == 3));
}
@Test
public void updateState_loadsAllIcons() {
CircularIconsPreference pref = mock(CircularIconsPreference.class);
ZenMode mode = new TestModeBuilder()
.setZenPolicy(new ZenPolicy.Builder().allowAllSounds().build())
.build();
mController.updateState(pref, mode);
verify(pref).displayIcons(argThat(iconSet ->
iconSet.size() == ZenModeSummaryHelper.OTHER_SOUND_CATEGORIES.size()));
}
}