perf: refresh only active root tab data on realtime events

This commit is contained in:
kris
2026-04-05 08:02:14 +08:00
parent 28f692706b
commit 0bae3a78ec
2 changed files with 253 additions and 9 deletions

View File

@@ -28,7 +28,9 @@ public class MainActivityRealtimeTest {
);
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals(1, activity.refreshCount);
assertEquals(1, activity.conversationRefreshCount);
assertEquals(0, activity.deviceRefreshCount);
assertEquals(0, activity.meRefreshCount);
}
@Test
@@ -45,7 +47,8 @@ public class MainActivityRealtimeTest {
);
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals(0, activity.refreshCount);
assertEquals(0, activity.conversationRefreshCount);
assertEquals(0, activity.deviceRefreshCount);
}
@Test
@@ -62,7 +65,7 @@ public class MainActivityRealtimeTest {
);
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals(0, activity.refreshCount);
assertEquals(0, activity.conversationRefreshCount);
}
@Test
@@ -82,7 +85,8 @@ public class MainActivityRealtimeTest {
);
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals(1, activity.refreshCount);
assertEquals(1, activity.conversationRefreshCount);
assertEquals(0, activity.deviceRefreshCount);
}
@Test
@@ -113,15 +117,78 @@ public class MainActivityRealtimeTest {
);
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals(2, activity.refreshCount);
assertEquals(2, activity.conversationRefreshCount);
assertEquals(0, activity.deviceRefreshCount);
}
@Test
public void devicesRealtimeEventRefreshesVisibleDevicesTabOnly() throws Exception {
TestMainActivity activity = Robolectric.buildActivity(TestMainActivity.class).setup().resume().get();
ReflectionHelpers.callInstanceMethod(activity, "showContent");
ReflectionHelpers.callInstanceMethod(
activity,
"setActiveTab",
ReflectionHelpers.ClassParameter.from(String.class, "devices"),
ReflectionHelpers.ClassParameter.from(boolean.class, false)
);
ReflectionHelpers.callInstanceMethod(
activity,
"handleRealtimeEvent",
ReflectionHelpers.ClassParameter.from(
BossRealtimeEvent.class,
new BossRealtimeEvent("devices.updated", new JSONObject().put("deviceId", "mac-studio"))
)
);
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals(0, activity.conversationRefreshCount);
assertEquals(1, activity.deviceRefreshCount);
assertEquals(0, activity.meRefreshCount);
}
@Test
public void otaRealtimeEventRefreshesVisibleMeTabOnly() throws Exception {
TestMainActivity activity = Robolectric.buildActivity(TestMainActivity.class).setup().resume().get();
ReflectionHelpers.callInstanceMethod(activity, "showContent");
ReflectionHelpers.callInstanceMethod(
activity,
"setActiveTab",
ReflectionHelpers.ClassParameter.from(String.class, "me"),
ReflectionHelpers.ClassParameter.from(boolean.class, false)
);
ReflectionHelpers.callInstanceMethod(
activity,
"handleRealtimeEvent",
ReflectionHelpers.ClassParameter.from(
BossRealtimeEvent.class,
new BossRealtimeEvent("ota.updated", new JSONObject())
)
);
Shadows.shadowOf(activity.getMainLooper()).idle();
assertEquals(0, activity.conversationRefreshCount);
assertEquals(0, activity.deviceRefreshCount);
assertEquals(1, activity.meRefreshCount);
}
public static class TestMainActivity extends MainActivity {
int refreshCount;
int conversationRefreshCount;
int deviceRefreshCount;
int meRefreshCount;
@Override
void refreshCurrentTab() {
refreshCount += 1;
void refreshConversationsData() {
conversationRefreshCount += 1;
}
@Override
void refreshDevicesData() {
deviceRefreshCount += 1;
}
@Override
void refreshMeData() {
meRefreshCount += 1;
}
}
}