feat: auto refresh conversation tab

This commit is contained in:
kris
2026-04-03 14:31:40 +08:00
parent da7d4e0a7d
commit c30b0a66ae
2 changed files with 105 additions and 0 deletions

View File

@@ -2,6 +2,8 @@ package com.hyzq.boss;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
@@ -28,8 +30,10 @@ public class MainActivity extends AppCompatActivity {
private static final String UI_PREFS = "boss_native_client";
private static final String KEY_LAST_ROOT_TAB = "last_root_tab";
private static final long ROOT_BACK_EXIT_WINDOW_MS = 1_500L;
private static final long CONVERSATION_AUTO_REFRESH_MS = 12_000L;
private final ExecutorService executor = Executors.newSingleThreadExecutor();
private final Handler uiHandler = new Handler(Looper.getMainLooper());
private BossApiClient apiClient;
@@ -65,6 +69,21 @@ public class MainActivity extends AppCompatActivity {
private @Nullable String boundDeviceName;
private String conversationSearchQuery = "";
private boolean pinnedConversationsCollapsed = false;
private boolean conversationAutoRefreshArmed = false;
private boolean conversationAutoRefreshEnabled = false;
private final Runnable conversationAutoRefreshRunnable = new Runnable() {
@Override
public void run() {
conversationAutoRefreshArmed = false;
if (!shouldAutoRefreshConversations()) {
return;
}
if (!screenRefresh.isRefreshing()) {
refreshCurrentTab();
}
armConversationAutoRefresh();
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -110,10 +129,25 @@ public class MainActivity extends AppCompatActivity {
@Override
protected void onDestroy() {
cancelConversationAutoRefresh();
executor.shutdownNow();
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
conversationAutoRefreshEnabled = true;
updateConversationAutoRefresh();
}
@Override
protected void onPause() {
conversationAutoRefreshEnabled = false;
cancelConversationAutoRefresh();
super.onPause();
}
private void bindViews() {
loginPanel = findViewById(R.id.login_panel);
contentPanel = findViewById(R.id.content_panel);
@@ -355,6 +389,7 @@ public class MainActivity extends AppCompatActivity {
loginPanel.setVisibility(View.GONE);
contentPanel.setVisibility(View.VISIBLE);
setActiveTab(activeTab, false);
updateConversationAutoRefresh();
}
private void setLoginLoading(boolean loading, String hint) {
@@ -373,6 +408,7 @@ public class MainActivity extends AppCompatActivity {
lastRootBackPressedAt = 0L;
updateTabStyles();
renderCurrentTab();
updateConversationAutoRefresh();
}
private void maybeApplyPreferredEntry() {
@@ -699,6 +735,37 @@ public class MainActivity extends AppCompatActivity {
private void startRefreshing(boolean refreshing) {
screenRefresh.setRefreshing(refreshing);
syncTopActionVisualState(refreshing);
if (!refreshing) {
updateConversationAutoRefresh();
}
}
private boolean shouldAutoRefreshConversations() {
return conversationAutoRefreshEnabled
&& contentPanel != null
&& contentPanel.getVisibility() == View.VISIBLE
&& "conversations".equals(activeTab);
}
private void updateConversationAutoRefresh() {
if (shouldAutoRefreshConversations()) {
armConversationAutoRefresh();
} else {
cancelConversationAutoRefresh();
}
}
private void armConversationAutoRefresh() {
if (conversationAutoRefreshArmed) {
return;
}
uiHandler.postDelayed(conversationAutoRefreshRunnable, CONVERSATION_AUTO_REFRESH_MS);
conversationAutoRefreshArmed = true;
}
private void cancelConversationAutoRefresh() {
uiHandler.removeCallbacks(conversationAutoRefreshRunnable);
conversationAutoRefreshArmed = false;
}
private void showMessage(String text) {

View File

@@ -0,0 +1,38 @@
package com.hyzq.boss;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
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.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
@Config(sdk = 34)
public class MainActivityConversationAutoRefreshTest {
@Test
public void conversationAutoRefresh_onlyArmsOnVisibleConversationTab() {
org.robolectric.android.controller.ActivityController<MainActivity> controller =
Robolectric.buildActivity(MainActivity.class).setup().resume();
MainActivity activity = controller.get();
ReflectionHelpers.callInstanceMethod(activity, "showContent");
assertTrue(ReflectionHelpers.getField(activity, "conversationAutoRefreshArmed"));
ReflectionHelpers.callInstanceMethod(activity, "setActiveTab",
ReflectionHelpers.ClassParameter.from(String.class, "devices"),
ReflectionHelpers.ClassParameter.from(boolean.class, false));
assertFalse(ReflectionHelpers.getField(activity, "conversationAutoRefreshArmed"));
ReflectionHelpers.callInstanceMethod(activity, "setActiveTab",
ReflectionHelpers.ClassParameter.from(String.class, "conversations"),
ReflectionHelpers.ClassParameter.from(boolean.class, false));
assertTrue(ReflectionHelpers.getField(activity, "conversationAutoRefreshArmed"));
controller.pause();
assertFalse(ReflectionHelpers.getField(activity, "conversationAutoRefreshArmed"));
}
}