From 4cb53a1f0bb22a5a5cd89cf24650f455de575cbb Mon Sep 17 00:00:00 2001 From: jiangchen <1703935164@qq.com> Date: Tue, 1 Sep 2026 19:02:26 +0800 Subject: [PATCH] feat: phone session list + event log connect real server via ServerClient --- .../com/dshwatch/app/EventLogActivity.java | 60 +++++++++++++- .../com/dshwatch/app/SessionListActivity.java | 79 ++++++++++++++++++- 2 files changed, 135 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/dshwatch/app/EventLogActivity.java b/app/src/main/java/com/dshwatch/app/EventLogActivity.java index 0a18307..cdaa838 100644 --- a/app/src/main/java/com/dshwatch/app/EventLogActivity.java +++ b/app/src/main/java/com/dshwatch/app/EventLogActivity.java @@ -6,15 +6,71 @@ import android.widget.ListView; import androidx.appcompat.app.AppCompatActivity; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * 事件流(接入真实 onEvent)。 + * 空壳阶段先演示:连接后把收到的 event 原样追加到列表。 + */ public class EventLogActivity extends AppCompatActivity { - private final String[] events = { "(空壳) 事件流待接入", "onStatus / onEvent -> watch" }; + private ArrayAdapter adapter; + private ServerClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event_log); + ListView list = findViewById(R.id.event_list); - list.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, events)); + List data = new ArrayList<>(); + adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data); + list.setAdapter(adapter); + + client = new ServerClient(new ServerClient.Listener() { + @Override + public void onConnectionChanged(boolean connected) { + runOnUiThread(() -> adapter.add(connected ? "[已连接]" : "[连接断开]")); + } + + @Override + public void onHello(JSONObject hello) { + // nothing + } + + @Override + public void onStatus(JSONObject status) { + runOnUiThread(() -> adapter.add("[status] " + status.toString())); + } + + @Override + public void onEvent(JSONObject event) { + runOnUiThread(() -> { + adapter.add(event.toString()); + adapter.notifyDataSetChanged(); + }); + } + + @Override + public void onResponse(String requestId, boolean ok, JSONObject result, JSONObject error) { + runOnUiThread(() -> adapter.add("[response] " + (ok ? "ok" : (error != null ? error.optString("message") : "err")))); + } + + @Override + public void onError(String message) { + runOnUiThread(() -> adapter.add("[error] " + message)); + } + }); + + client.connect("ws://10.0.2.2:8787/ws", "dshwatch", "change-me"); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (client != null) client.close(); } } diff --git a/app/src/main/java/com/dshwatch/app/SessionListActivity.java b/app/src/main/java/com/dshwatch/app/SessionListActivity.java index 8752cee..4f72d00 100644 --- a/app/src/main/java/com/dshwatch/app/SessionListActivity.java +++ b/app/src/main/java/com/dshwatch/app/SessionListActivity.java @@ -6,15 +6,90 @@ import android.widget.ListView; import androidx.appcompat.app.AppCompatActivity; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * 会话列表(接入真实 session.list)。 + * 空壳阶段先用一个独立 ServerClient 连接演示;后续统一走 DshApp 共享连接。 + */ public class SessionListActivity extends AppCompatActivity { - private final String[] sessions = { "会话 demo-1", "会话 demo-2", "会话 demo-3", "(空壳列表)" }; + private ArrayAdapter adapter; + private ServerClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_session_list); + ListView list = findViewById(R.id.session_list); - list.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, sessions)); + List data = new ArrayList<>(); + adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data); + list.setAdapter(adapter); + + client = new ServerClient(new ServerClient.Listener() { + @Override + public void onConnectionChanged(boolean connected) { + runOnUiThread(() -> adapter.add(connected ? "[已连接]" : "[连接断开]")); + } + + @Override + public void onHello(JSONObject hello) { + client.sendRequest("session.list", new JSONObject()); + } + + @Override + public void onStatus(JSONObject status) { + runOnUiThread(() -> adapter.add("[status] " + status.optString("model"))); + } + + @Override + public void onEvent(JSONObject event) { + // ignore here + } + + @Override + public void onResponse(String requestId, boolean ok, JSONObject result, JSONObject error) { + runOnUiThread(() -> { + if (ok && result != null) { + JSONArray items = result.optJSONArray("items"); + if (items != null) { + adapter.clear(); + for (int i = 0; i < items.length(); i++) { + JSONObject item = items.optJSONObject(i); + String id = item != null ? item.optString("sessionId") : "?"; + boolean running = item != null && item.optBoolean("running", false); + adapter.add((running ? "● " : "○ ") + id); + } + adapter.notifyDataSetChanged(); + } + } else { + adapter.add("[error] " + (error != null ? error.optString("message") : "unknown")); + adapter.notifyDataSetChanged(); + } + }); + } + + @Override + public void onError(String message) { + runOnUiThread(() -> { + adapter.add("[error] " + message); + adapter.notifyDataSetChanged(); + }); + } + }); + + // 空壳:默认连本机模拟器 server,后续从设置读取 + client.connect("ws://10.0.2.2:8787/ws", "dshwatch", "change-me"); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (client != null) client.close(); } }