Merge "Fix Conversation page flickers" into tm-dev

This commit is contained in:
Chaohui Wang
2022-05-25 14:28:43 +00:00
committed by Android (Google) Code Review
9 changed files with 220 additions and 291 deletions

View File

@@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -35,47 +34,49 @@ import android.provider.Settings;
import android.service.notification.ConversationChannelWrapper;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.BulletSpan;
import android.text.style.QuoteSpan;
import android.text.style.SubscriptSpan;
import android.text.style.UnderlineSpan;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.applications.AppInfoBase;
import com.android.settings.notification.NotificationBackend;
import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowApplication;
import java.util.ArrayList;
@RunWith(RobolectricTestRunner.class)
public class ConversationListPreferenceControllerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
private final Context mContext = ApplicationProvider.getApplicationContext();
@Mock
private NotificationBackend mBackend;
@Spy
private PreferenceGroup mPreferenceGroup = new PreferenceCategory(mContext);
private TestPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ShadowApplication shadowApplication = ShadowApplication.getInstance();
mContext = RuntimeEnvironment.application;
mController = new TestPreferenceController(mContext, mBackend);
PreferenceManager preferenceManager = new PreferenceManager(mContext);
PreferenceScreen preferenceScreen = preferenceManager.createPreferenceScreen(mContext);
mPreferenceGroup.setKey(mController.getPreferenceKey());
preferenceScreen.addPreference(mPreferenceGroup);
mController.displayPreference(preferenceScreen);
}
@Test
@@ -84,39 +85,30 @@ public class ConversationListPreferenceControllerTest {
}
@Test
public void testPopulateList_hideIfNoConversations() {
PreferenceCategory outerContainer = mock(PreferenceCategory.class);
public void testUpdateList_hideIfNoConversations() {
boolean hasContent = mController.updateList(ImmutableList.of());
mController.populateList(new ArrayList<>(), outerContainer);
verify(outerContainer).setVisible(false);
verify(outerContainer, never()).addPreference(any());
assertThat(hasContent).isFalse();
verify(mPreferenceGroup).setVisible(false);
verify(mPreferenceGroup, never()).addPreference(any());
}
@Test
public void testPopulateList_validConversations() {
final PreferenceManager preferenceManager = new PreferenceManager(mContext);
PreferenceScreen ps = preferenceManager.createPreferenceScreen(mContext);
PreferenceCategory outerContainer = spy(new PreferenceCategory(mContext));
ps.addPreference(outerContainer);
public void testUpdateList_validConversations() {
ConversationChannelWrapper ccw = new ConversationChannelWrapper();
ccw.setNotificationChannel(mock(NotificationChannel.class));
ccw.setPkg("pkg");
ccw.setUid(1);
ccw.setShortcutInfo(mock(ShortcutInfo.class));
ArrayList<ConversationChannelWrapper> list = new ArrayList<>();
list.add(ccw);
boolean hasContent = mController.updateList(ImmutableList.of(ccw));
mController.populateList(list, outerContainer);
verify(outerContainer, times(1)).addPreference(any());
assertThat(hasContent).isTrue();
verify(mPreferenceGroup, times(1)).addPreference(any());
}
@Test
public void populateConversations() {
PreferenceCategory container = mock(PreferenceCategory.class);
ConversationChannelWrapper ccw = new ConversationChannelWrapper();
ccw.setNotificationChannel(mock(NotificationChannel.class));
ccw.setPkg("pkg");
@@ -131,13 +123,9 @@ public class ConversationListPreferenceControllerTest {
ccwDemoted.setUid(1);
ccwDemoted.setShortcutInfo(mock(ShortcutInfo.class));
ArrayList<ConversationChannelWrapper> list = new ArrayList<>();
list.add(ccw);
list.add(ccwDemoted);
mController.populateConversations(ImmutableList.of(ccw, ccwDemoted));
mController.populateConversations(list, container);
verify(container, times(1)).addPreference(any());
verify(mPreferenceGroup, times(1)).addPreference(any());
}
@Test
@@ -240,7 +228,8 @@ public class ConversationListPreferenceControllerTest {
assertThat(mController.mConversationComparator.compare(one, two)).isLessThan(0);
}
private final class TestPreferenceController extends ConversationListPreferenceController {
private static final class TestPreferenceController extends
ConversationListPreferenceController {
private TestPreferenceController(Context context, NotificationBackend backend) {
super(context, backend);

View File

@@ -37,9 +37,7 @@ import android.os.Bundle;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.SpannedString;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
@@ -47,42 +45,46 @@ import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.preference.PreferenceViewHolder;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
import com.android.settings.applications.AppInfoBase;
import com.android.settings.notification.NotificationBackend;
import com.android.settingslib.widget.LayoutPreference;
import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowApplication;
import java.util.ArrayList;
@RunWith(RobolectricTestRunner.class)
public class RecentConversationsPreferenceControllerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
private final Context mContext = ApplicationProvider.getApplicationContext();
@Mock
private NotificationBackend mBackend;
@Mock
private IPeopleManager mPs;
@Spy
private PreferenceGroup mPreferenceGroup = new PreferenceCategory(mContext);
private RecentConversationsPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ShadowApplication shadowApplication = ShadowApplication.getInstance();
mContext = RuntimeEnvironment.application;
mController = new RecentConversationsPreferenceController(mContext, mBackend, mPs);
PreferenceManager preferenceManager = new PreferenceManager(mContext);
PreferenceScreen preferenceScreen = preferenceManager.createPreferenceScreen(mContext);
mPreferenceGroup.setKey(mController.getPreferenceKey());
preferenceScreen.addPreference(mPreferenceGroup);
mController.displayPreference(preferenceScreen);
}
@Test
@@ -92,38 +94,29 @@ public class RecentConversationsPreferenceControllerTest {
@Test
public void testPopulateList_hideIfNoConversations() {
PreferenceCategory outerContainer = mock(PreferenceCategory.class);
boolean hasContent = mController.populateList(ImmutableList.of());
mController.populateList(new ArrayList<>(), outerContainer);
verify(outerContainer).setVisible(false);
verify(outerContainer, never()).addPreference(any());
assertThat(hasContent).isFalse();
verify(mPreferenceGroup).setVisible(false);
verify(mPreferenceGroup, never()).addPreference(any());
}
@Test
public void testPopulateList_validConversations() {
final PreferenceManager preferenceManager = new PreferenceManager(mContext);
PreferenceScreen ps = preferenceManager.createPreferenceScreen(mContext);
PreferenceCategory outerContainer = spy(new PreferenceCategory(mContext));
ps.addPreference(outerContainer);
ConversationChannel ccw = new ConversationChannel(mock(ShortcutInfo.class), 6,
new NotificationChannel("hi", "hi", 4),
new NotificationChannelGroup("hi", "hi"), 7,
false);
ArrayList<ConversationChannel> list = new ArrayList<>();
list.add(ccw);
boolean hasContent = mController.populateList(ImmutableList.of(ccw));
mController.populateList(list, outerContainer);
assertThat(hasContent).isTrue();
// one for the preference, one for the button ro clear all
verify(outerContainer, times(2)).addPreference(any());
verify(mPreferenceGroup, times(2)).addPreference(any());
}
@Test
public void populateConversations_blocked() {
PreferenceCategory container = mock(PreferenceCategory.class);
ConversationChannel ccw = new ConversationChannel(mock(ShortcutInfo.class), 6,
new NotificationChannel("hi", "hi", 4),
new NotificationChannelGroup("hi", "hi"), 7,
@@ -141,14 +134,10 @@ public class RecentConversationsPreferenceControllerTest {
blockedGroup, 7,
false);
ArrayList<ConversationChannel> list = new ArrayList<>();
list.add(ccw);
list.add(ccw2);
list.add(ccw3);
boolean hasContent = mController.populateConversations(ImmutableList.of(ccw, ccw2, ccw3));
mController.populateConversations(list, container);
verify(container, times(1)).addPreference(any());
assertThat(hasContent).isTrue();
verify(mPreferenceGroup, times(1)).addPreference(any());
}
@Test
@@ -223,8 +212,7 @@ public class RecentConversationsPreferenceControllerTest {
new NotificationChannelGroup("hi", "group"), 7,
true);
Preference pref = mController.createConversationPref(new PreferenceCategory(mContext),
ccw, 100);
Preference pref = mController.createConversationPref(ccw);
try {
pref.performClick();
} catch (RuntimeException e) {
@@ -244,9 +232,7 @@ public class RecentConversationsPreferenceControllerTest {
new NotificationChannelGroup("hi", "group"), 7,
false);
RecentConversationPreference pref =
(RecentConversationPreference) mController.createConversationPref(
new PreferenceCategory(mContext), ccw, 100);
RecentConversationPreference pref = mController.createConversationPref(ccw);
final View view = View.inflate(mContext, pref.getLayoutResource(), null);
PreferenceViewHolder holder = spy(PreferenceViewHolder.createInstanceForTests(view));
View delete = View.inflate(mContext, pref.getSecondTargetResId(), null);
@@ -274,34 +260,28 @@ public class RecentConversationsPreferenceControllerTest {
new NotificationChannelGroup("hi", "group"), 7,
true);
PreferenceCategory group = new PreferenceCategory(mContext);
PreferenceScreen screen = new PreferenceManager(mContext).createPreferenceScreen(mContext);
screen.addPreference(group);
RecentConversationPreference pref = mController.createConversationPref(
new PreferenceCategory(mContext), ccw, 100);
RecentConversationPreference pref = mController.createConversationPref(ccw);
final View view = View.inflate(mContext, pref.getLayoutResource(), null);
PreferenceViewHolder holder = spy(PreferenceViewHolder.createInstanceForTests(view));
View delete = View.inflate(mContext, pref.getSecondTargetResId(), null);
when(holder.findViewById(pref.getClearId())).thenReturn(delete);
group.addPreference(pref);
mPreferenceGroup.addPreference(pref);
RecentConversationPreference pref2 = mController.createConversationPref(
new PreferenceCategory(mContext), ccw2, 100);
RecentConversationPreference pref2 = mController.createConversationPref(ccw2);
final View view2 = View.inflate(mContext, pref2.getLayoutResource(), null);
PreferenceViewHolder holder2 = spy(PreferenceViewHolder.createInstanceForTests(view2));
View delete2 = View.inflate(mContext, pref2.getSecondTargetResId(), null);
when(holder2.findViewById(pref.getClearId())).thenReturn(delete2);
group.addPreference(pref2);
mPreferenceGroup.addPreference(pref2);
LayoutPreference clearAll = mController.getClearAll(group);
group.addPreference(clearAll);
LayoutPreference clearAll = mController.getClearAll(mPreferenceGroup);
mPreferenceGroup.addPreference(clearAll);
clearAll.findViewById(R.id.conversation_settings_clear_recents).performClick();
verify(mPs).removeAllRecentConversations();
assertThat((Preference) group.findPreference("hi:person")).isNull();
assertThat((Preference) group.findPreference("bye:person")).isNotNull();
assertThat((Preference) mPreferenceGroup.findPreference("hi:person")).isNull();
assertThat((Preference) mPreferenceGroup.findPreference("bye:person")).isNotNull();
}
@Test
@@ -314,30 +294,23 @@ public class RecentConversationsPreferenceControllerTest {
new NotificationChannelGroup("hi", "group"), 7,
true);
RecentConversationPreference pref =
(RecentConversationPreference) mController.createConversationPref(
new PreferenceCategory(mContext), ccw, 100);
RecentConversationPreference pref = mController.createConversationPref(ccw);
assertThat(pref.hasClearListener()).isFalse();
}
@Test
public void testPopulateList_onlyNonremoveableConversations() {
final PreferenceManager preferenceManager = new PreferenceManager(mContext);
PreferenceScreen ps = preferenceManager.createPreferenceScreen(mContext);
PreferenceCategory outerContainer = spy(new PreferenceCategory(mContext));
ps.addPreference(outerContainer);
ConversationChannel ccw = new ConversationChannel(mock(ShortcutInfo.class), 6,
new NotificationChannel("hi", "hi", 4),
new NotificationChannelGroup("hi", "hi"), 7,
true /* hasactivenotifs */);
ArrayList<ConversationChannel> list = new ArrayList<>();
list.add(ccw);
boolean hasContent = mController.populateList(ImmutableList.of(ccw));
mController.populateList(list, outerContainer);
assertThat(hasContent).isTrue();
// one for the preference, none for 'clear all'
verify(outerContainer, times(1)).addPreference(any());
verify(mPreferenceGroup, times(1)).addPreference(any());
}
@Test