Redesign channel listing and channel page

Test: atest
Bug: 127796543
Fixes: 129452112
Fixes: 129453207
Change-Id: I1d520c9e35860303235b7ffbb18a76cbc4f4b8bc
This commit is contained in:
Julia Reynolds
2019-04-12 16:52:40 -04:00
parent 670bf45b50
commit 5c097c6d3c
21 changed files with 405 additions and 579 deletions

View File

@@ -1,169 +0,0 @@
/*
* 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.notification;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import com.android.settings.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
@RunWith(RobolectricTestRunner.class)
public class ChannelSummaryPreferenceTest {
private Context mContext;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
}
@Test
public void createNewPreference_shouldSetLayout() {
final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
assertThat(preference.getLayoutResource()).isEqualTo(
R.layout.preference_checkable_two_target);
assertThat(preference.getWidgetLayoutResource()).isEqualTo(
R.layout.zen_rule_widget);
}
@Test
public void setChecked_shouldUpdateButtonCheckedState() {
final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
inflater.inflate(R.layout.preference_checkable_two_target, null));
final LinearLayout widgetView = holder.itemView.findViewById(R.id.checkbox_container);
inflater.inflate(R.layout.preference_widget_checkbox, widgetView, true);
final CheckBox toggle = (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);
preference.onBindViewHolder(holder);
preference.setChecked(true);
assertThat(toggle.isChecked()).isTrue();
preference.setChecked(false);
assertThat(toggle.isChecked()).isFalse();
}
@Test
public void setCheckboxEnabled_shouldUpdateButtonEnabledState() {
final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
inflater.inflate(R.layout.preference_checkable_two_target, null));
final LinearLayout widgetView = holder.itemView.findViewById(R.id.checkbox_container);
inflater.inflate(R.layout.preference_widget_checkbox, widgetView, true);
final CheckBox toggle = (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);
preference.onBindViewHolder(holder);
preference.setCheckBoxEnabled(true);
assertThat(toggle.isEnabled()).isTrue();
preference.setCheckBoxEnabled(false);
assertThat(toggle.isEnabled()).isFalse();
}
@Test
public void setCheckBoxEnabled_shouldUpdateButtonEnabledState_beforeViewBound() {
final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
inflater.inflate(R.layout.preference_checkable_two_target, null));
final LinearLayout widgetView = holder.itemView.findViewById(R.id.checkbox_container);
inflater.inflate(R.layout.preference_widget_checkbox, widgetView, true);
final CheckBox toggle = (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);
preference.setCheckBoxEnabled(false);
preference.onBindViewHolder(holder);
assertThat(toggle.isEnabled()).isFalse();
}
@Test
public void clickWidgetView_shouldToggleButton() {
final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
inflater.inflate(R.layout.preference_checkable_two_target, null));
final LinearLayout widgetView = holder.itemView.findViewById(R.id.checkbox_container);
assertThat(widgetView).isNotNull();
inflater.inflate(R.layout.preference_widget_checkbox, widgetView, true);
final CheckBox toggle = (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);
preference.onBindViewHolder(holder);
widgetView.performClick();
assertThat(toggle.isChecked()).isTrue();
widgetView.performClick();
assertThat(toggle.isChecked()).isFalse();
}
@Test
public void clickWidgetView_shouldNotToggleButtonIfDisabled() {
final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
inflater.inflate(R.layout.preference_checkable_two_target, null));
final LinearLayout widgetView = holder.itemView.findViewById(R.id.checkbox_container);
assertThat(widgetView).isNotNull();
inflater.inflate(R.layout.preference_widget_checkbox, widgetView, true);
final CheckBox toggle = (CheckBox) holder.findViewById(com.android.internal.R.id.checkbox);
preference.onBindViewHolder(holder);
toggle.setEnabled(false);
widgetView.performClick();
assertThat(toggle.isChecked()).isFalse();
}
@Test
public void clickWidgetView_shouldNotifyPreferenceChanged() {
final ChannelSummaryPreference preference = new ChannelSummaryPreference(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
LayoutInflater.from(mContext).inflate(
R.layout.preference_checkable_two_target, null));
final View widgetView = holder.findViewById(R.id.checkbox_container);
final Preference.OnPreferenceChangeListener
listener = mock(Preference.OnPreferenceChangeListener.class);
preference.setOnPreferenceChangeListener(listener);
preference.onBindViewHolder(holder);
preference.setChecked(false);
widgetView.performClick();
verify(listener).onPreferenceChange(preference, true);
preference.setChecked(true);
widgetView.performClick();
verify(listener).onPreferenceChange(preference, false);
}
}

View File

@@ -117,12 +117,12 @@ public class ImportancePreferenceControllerTest {
}
@Test
public void testIsAvailable_evenIfChannelBlocked() {
public void testIsAvailable_ifChannelBlocked() {
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
NotificationChannel channel = mock(NotificationChannel.class);
when(channel.getImportance()).thenReturn(IMPORTANCE_NONE);
mController.onResume(appRow, channel, null, null);
assertTrue(mController.isAvailable());
assertFalse(mController.isAvailable());
}
@Test
@@ -183,8 +183,8 @@ public class ImportancePreferenceControllerTest {
mController.updateState(pref);
verify(pref, times(1)).setConfigurable(anyBoolean());
verify(pref, times(1)).setBlockable(anyBoolean());
verify(pref, times(1)).setImportance(IMPORTANCE_HIGH);
verify(pref, times(1)).setDisplayInStatusBar(false);
}
@Test

View File

@@ -27,18 +27,12 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.Button;
import android.widget.TextView;
import com.android.settings.R;
import com.android.settingslib.RestrictedLockUtils;
import org.junit.Before;
import org.junit.Test;
@@ -46,7 +40,6 @@ import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
@RunWith(RobolectricTestRunner.class)
@@ -59,11 +52,6 @@ public class ImportancePreferenceTest {
mContext = RuntimeEnvironment.application;
}
private GradientDrawable getBackground(ImageButton button) {
return (GradientDrawable) ((LayerDrawable) button.getDrawable())
.findDrawableByLayerId(R.id.back);
}
@Test
public void createNewPreference_shouldSetLayout() {
final ImportancePreference preference = new ImportancePreference(mContext);
@@ -72,36 +60,26 @@ public class ImportancePreferenceTest {
}
@Test
public void onBindViewHolder_hideBlockNonBlockable() {
final ImportancePreference preference = new ImportancePreference(mContext);
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
inflater.inflate(R.layout.notif_importance_preference, null));
preference.setBlockable(false);
preference.setConfigurable(true);
preference.setImportance(IMPORTANCE_DEFAULT);
preference.onBindViewHolder(holder);
assertThat(holder.itemView.findViewById(R.id.block).getVisibility()).isEqualTo(View.GONE);
}
@Test
public void onBindViewHolder_hideNonSelectedNonConfigurable() {
public void onBindViewHolder_nonConfigurable() {
final ImportancePreference preference = new ImportancePreference(mContext);
final LayoutInflater inflater = LayoutInflater.from(mContext);
PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
inflater.inflate(R.layout.notif_importance_preference, null));
Drawable unselected = mock(Drawable.class);
Drawable selected = mock(Drawable.class);
preference.selectedBackground = selected;
preference.unselectedBackground = unselected;
preference.setBlockable(true);
preference.setConfigurable(false);
preference.setImportance(IMPORTANCE_DEFAULT);
preference.onBindViewHolder(holder);
assertThat(holder.itemView.findViewById(R.id.block).getVisibility()).isEqualTo(View.GONE);
assertThat(holder.itemView.findViewById(R.id.silence).getVisibility()).isEqualTo(View.GONE);
assertThat(holder.itemView.findViewById(R.id.alert).getVisibility())
.isEqualTo(View.VISIBLE);
assertThat(holder.itemView.findViewById(R.id.silence).isEnabled()).isFalse();
assertThat(holder.itemView.findViewById(R.id.alert).isEnabled()).isFalse();
assertThat(holder.itemView.findViewById(R.id.alert).getBackground()).isEqualTo(selected);
assertThat(holder.itemView.findViewById(R.id.silence).getBackground())
.isEqualTo(unselected);
// other button
preference.setImportance(IMPORTANCE_LOW);
@@ -109,37 +87,31 @@ public class ImportancePreferenceTest {
inflater.inflate(R.layout.notif_importance_preference, null));
preference.onBindViewHolder(holder);
assertThat(holder.itemView.findViewById(R.id.block).getVisibility()).isEqualTo(View.GONE);
assertThat(holder.itemView.findViewById(R.id.silence).getVisibility())
.isEqualTo(View.VISIBLE);
assertThat(holder.itemView.findViewById(R.id.alert).getVisibility())
.isEqualTo(View.GONE);
assertThat(holder.itemView.findViewById(R.id.alert).getBackground()).isEqualTo(unselected);
assertThat(holder.itemView.findViewById(R.id.silence).getBackground()).isEqualTo(selected);
}
@Test
public void onBindViewHolder_selectButton() {
public void onBindViewHolder_selectButtonAndText() {
final ImportancePreference preference = new ImportancePreference(mContext);
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
inflater.inflate(R.layout.notif_importance_preference, null));
Drawable unselected = mock(Drawable.class);
Drawable selected = mock(Drawable.class);
preference.selectedBackground = selected;
preference.unselectedBackground = unselected;
preference.setBlockable(true);
preference.setConfigurable(true);
preference.setImportance(IMPORTANCE_DEFAULT);
ImageButton blockButton = (ImageButton) holder.findViewById(R.id.block_icon);
ImageButton silenceButton = (ImageButton) holder.findViewById(R.id.silence_icon);
ImageButton alertButton = (ImageButton) holder.findViewById(R.id.alert_icon);
preference.onBindViewHolder(holder);
// selected has full color background. others are transparent
assertThat(getBackground(alertButton).getColor().getColors()[0]).isNotEqualTo(
Color.TRANSPARENT);
assertThat(getBackground(silenceButton).getColor().getColors()[0]).isEqualTo(
Color.TRANSPARENT);
assertThat(getBackground(blockButton).getColor().getColors()[0]).isEqualTo(
Color.TRANSPARENT);
assertThat(holder.itemView.findViewById(R.id.alert).getBackground()).isEqualTo(selected);
assertThat(holder.itemView.findViewById(R.id.silence).getBackground())
.isEqualTo(unselected);
assertThat(((TextView) holder.itemView.findViewById(R.id.description)).getText()).isEqualTo(
mContext.getString(R.string.notification_channel_summary_default));
}
@Test
@@ -148,45 +120,84 @@ public class ImportancePreferenceTest {
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
inflater.inflate(R.layout.notif_importance_preference, null));
Drawable unselected = mock(Drawable.class);
Drawable selected = mock(Drawable.class);
preference.selectedBackground = selected;
preference.unselectedBackground = unselected;
preference.setBlockable(true);
preference.setConfigurable(true);
preference.setImportance(IMPORTANCE_DEFAULT);
preference.onBindViewHolder(holder);
ImageButton blockButton = (ImageButton) holder.findViewById(R.id.block_icon);
ImageButton silenceButton = (ImageButton) holder.findViewById(R.id.silence_icon);
ImageButton alertButton = (ImageButton) holder.findViewById(R.id.alert_icon);
Button silenceButton = holder.itemView.findViewById(R.id.silence);
silenceButton.callOnClick();
// selected has full color background. others are transparent
assertThat(getBackground(silenceButton).getColor().getColors()[0]).isNotEqualTo(
Color.TRANSPARENT);
assertThat(getBackground(alertButton).getColor().getColors()[0]).isEqualTo(
Color.TRANSPARENT);
assertThat(getBackground(blockButton).getColor().getColors()[0]).isEqualTo(
Color.TRANSPARENT);
assertThat(holder.itemView.findViewById(R.id.alert).getBackground()).isEqualTo(unselected);
assertThat(holder.itemView.findViewById(R.id.silence).getBackground()).isEqualTo(selected);
assertThat(((TextView) holder.itemView.findViewById(R.id.description)).getText()).isEqualTo(
mContext.getString(R.string.notification_channel_summary_low));
verify(preference, times(1)).callChangeListener(IMPORTANCE_LOW);
}
@Test
public void onBindViewHolder_allButtonsVisible() {
final ImportancePreference preference = new ImportancePreference(mContext);
final LayoutInflater inflater = LayoutInflater.from(mContext);
final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
inflater.inflate(R.layout.notif_importance_preference, null));
public void setImportanceSummary_status() {
TextView tv = new TextView(mContext);
preference.setBlockable(true);
preference.setConfigurable(true);
preference.onBindViewHolder(holder);
final ImportancePreference preference = spy(new ImportancePreference(mContext));
assertThat(holder.itemView.findViewById(R.id.block).getVisibility())
.isEqualTo(View.VISIBLE);
assertThat(holder.itemView.findViewById(R.id.silence).getVisibility())
.isEqualTo(View.VISIBLE);
assertThat(holder.itemView.findViewById(R.id.alert).getVisibility())
.isEqualTo(View.VISIBLE);
preference.setDisplayInStatusBar(true);
preference.setDisplayOnLockscreen(false);
preference.setImportanceSummary(tv, IMPORTANCE_LOW);
assertThat(tv.getText()).isEqualTo(
mContext.getString(R.string.notification_channel_summary_low_status));
}
@Test
public void setImportanceSummary_lock() {
TextView tv = new TextView(mContext);
final ImportancePreference preference = spy(new ImportancePreference(mContext));
preference.setDisplayInStatusBar(false);
preference.setDisplayOnLockscreen(true);
preference.setImportanceSummary(tv, IMPORTANCE_LOW);
assertThat(tv.getText()).isEqualTo(
mContext.getString(R.string.notification_channel_summary_low_lock));
}
@Test
public void setImportanceSummary_statusLock() {
TextView tv = new TextView(mContext);
final ImportancePreference preference = spy(new ImportancePreference(mContext));
preference.setDisplayInStatusBar(true);
preference.setDisplayOnLockscreen(true);
preference.setImportanceSummary(tv, IMPORTANCE_LOW);
assertThat(tv.getText()).isEqualTo(
mContext.getString(R.string.notification_channel_summary_low_status_lock));
}
@Test
public void setImportanceSummary_statusLock_default() {
TextView tv = new TextView(mContext);
final ImportancePreference preference = spy(new ImportancePreference(mContext));
preference.setDisplayInStatusBar(true);
preference.setDisplayOnLockscreen(true);
preference.setImportanceSummary(tv, IMPORTANCE_DEFAULT);
assertThat(tv.getText()).isEqualTo(
mContext.getString(R.string.notification_channel_summary_default));
}
}