Redesign channel listing and channel page
Test: atest Bug: 127796543 Fixes: 129452112 Fixes: 129453207 Change-Id: I1d520c9e35860303235b7ffbb18a76cbc4f4b8bc
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
@@ -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
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user