feat: use pager-based root tab navigation

This commit is contained in:
kris
2026-04-04 01:09:50 +08:00
parent 05b9bee9e8
commit 31004c512a
8 changed files with 251 additions and 91 deletions

View File

@@ -13,6 +13,7 @@ import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.Shadows;
import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
@@ -53,9 +54,11 @@ public class MainActivityConversationSearchTest {
.put("latestReplyLabel", "09:40")));
ReflectionHelpers.callInstanceMethod(activity, "showContent");
Shadows.shadowOf(activity.getMainLooper()).idle();
ReflectionHelpers.callInstanceMethod(activity, "renderConversationsRoot");
Shadows.shadowOf(activity.getMainLooper()).idle();
LinearLayout content = activity.findViewById(R.id.screen_content);
LinearLayout content = ReflectionHelpers.getField(activity, "screenContent");
assertTrue(content.getChildAt(0) instanceof EditText);
EditText input = (EditText) content.getChildAt(0);
assertEquals("搜索项目或线程", String.valueOf(input.getHint()));

View File

@@ -15,6 +15,7 @@ import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.Shadows;
import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
@@ -25,23 +26,24 @@ public class MainActivityConversationSelectionTest {
MainActivity activity = Robolectric.buildActivity(MainActivity.class).setup().get();
ReflectionHelpers.setField(activity, "conversationsData", buildConversations());
ReflectionHelpers.callInstanceMethod(activity, "showContent");
Shadows.shadowOf(activity.getMainLooper()).idle();
ReflectionHelpers.callInstanceMethod(activity, "enterConversationSelectionMode");
assertTrue(ReflectionHelpers.getField(activity, "conversationSelectionMode"));
LinearLayout content = activity.findViewById(R.id.screen_content);
LinearLayout content = ReflectionHelpers.getField(activity, "screenContent");
assertTrue(viewTreeContainsText(content, "发起群聊"));
assertTrue(viewTreeContainsText(content, "至少选择 2 个线程"));
ReflectionHelpers.callInstanceMethod(activity, "toggleConversationSelection",
ReflectionHelpers.ClassParameter.from(String.class, "thread-1"));
content = activity.findViewById(R.id.screen_content);
content = ReflectionHelpers.getField(activity, "screenContent");
assertTrue(viewTreeContainsText(content, "已选 1 个线程"));
assertTrue(viewTreeContainsText(content, "至少选择 2 个线程"));
ReflectionHelpers.callInstanceMethod(activity, "toggleConversationSelection",
ReflectionHelpers.ClassParameter.from(String.class, "thread-2"));
content = activity.findViewById(R.id.screen_content);
content = ReflectionHelpers.getField(activity, "screenContent");
assertTrue(viewTreeContainsText(content, "已选 2 个线程"));
assertFalse(viewTreeContainsText(content, "至少选择 2 个线程"));
}
@@ -51,9 +53,10 @@ public class MainActivityConversationSelectionTest {
MainActivity activity = Robolectric.buildActivity(MainActivity.class).setup().get();
ReflectionHelpers.setField(activity, "conversationsData", buildConversations());
ReflectionHelpers.callInstanceMethod(activity, "showContent");
Shadows.shadowOf(activity.getMainLooper()).idle();
ReflectionHelpers.callInstanceMethod(activity, "enterConversationSelectionMode");
LinearLayout content = activity.findViewById(R.id.screen_content);
LinearLayout content = ReflectionHelpers.getField(activity, "screenContent");
View row = content.getChildAt(3);
assertTrue("多选模式应显示单选圆点", viewTreeContainsContentDescription(row, "未选中会话"));
}

View File

@@ -14,6 +14,7 @@ import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.Shadows;
import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
@@ -40,9 +41,11 @@ public class MainActivityPinnedConversationsTest {
.put("latestReplyLabel", "09:41")));
ReflectionHelpers.callInstanceMethod(activity, "showContent");
Shadows.shadowOf(activity.getMainLooper()).idle();
ReflectionHelpers.callInstanceMethod(activity, "renderConversationsRoot");
Shadows.shadowOf(activity.getMainLooper()).idle();
LinearLayout content = activity.findViewById(R.id.screen_content);
LinearLayout content = ReflectionHelpers.getField(activity, "screenContent");
assertTrue(viewTreeContainsText(content, "置顶会话"));
assertTrue(viewTreeContainsText(content, "收起"));
assertTrue(viewTreeContainsText(content, "主 Agent"));

View File

@@ -1,32 +1,51 @@
package com.hyzq.boss;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import androidx.viewpager2.widget.ViewPager2;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.Shadows;
import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
@Config(sdk = 34)
public class MainActivitySwipeNavigationTest {
@Test
public void horizontalSwipeMovesBetweenRootTabs() {
public void selectingTabsUpdatesPagerAndActiveTab() {
MainActivity activity = Robolectric.buildActivity(MainActivity.class).setup().get();
ReflectionHelpers.callInstanceMethod(activity, "showContent");
ViewPager2 pager = activity.findViewById(R.id.root_pager);
assertNotNull(pager);
ReflectionHelpers.callInstanceMethod(activity, "handleHorizontalPageSwipe",
ReflectionHelpers.ClassParameter.from(int.class, 1));
activity.findViewById(R.id.tab_devices).performClick();
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals(1, pager.getCurrentItem());
assertEquals("devices", ReflectionHelpers.getField(activity, "activeTab"));
ReflectionHelpers.callInstanceMethod(activity, "handleHorizontalPageSwipe",
ReflectionHelpers.ClassParameter.from(int.class, 1));
activity.findViewById(R.id.tab_me).performClick();
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals(2, pager.getCurrentItem());
assertEquals("me", ReflectionHelpers.getField(activity, "activeTab"));
}
ReflectionHelpers.callInstanceMethod(activity, "handleHorizontalPageSwipe",
ReflectionHelpers.ClassParameter.from(int.class, -1));
@Test
public void pagerSelectionUpdatesActiveTab() {
MainActivity activity = Robolectric.buildActivity(MainActivity.class).setup().get();
ReflectionHelpers.callInstanceMethod(activity, "showContent");
ViewPager2 pager = activity.findViewById(R.id.root_pager);
assertNotNull(pager);
pager.setCurrentItem(1, false);
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals("devices", ReflectionHelpers.getField(activity, "activeTab"));
pager.setCurrentItem(2, false);
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals("me", ReflectionHelpers.getField(activity, "activeTab"));
}
}