diff --git a/apps/android/app/src/main/java/cn/crossdesk/mobile/RemoteNetworkStatistics.java b/apps/android/app/src/main/java/cn/crossdesk/mobile/RemoteNetworkStatistics.java index a1fe6fb2..36f1b18c 100644 --- a/apps/android/app/src/main/java/cn/crossdesk/mobile/RemoteNetworkStatistics.java +++ b/apps/android/app/src/main/java/cn/crossdesk/mobile/RemoteNetworkStatistics.java @@ -26,10 +26,6 @@ final class RemoteNetworkStatistics { Snapshot(Report report,int fps,int width,int height,double latency,double rtt,String remoteEncoder,String localDecoder){this.report=report;this.fps=fps;this.width=width;this.height=height;this.latency=latency;this.rtt=rtt;this.remoteEncoder=remoteEncoder;this.localDecoder=localDecoder;} String mode(){return report==null?"—":report.mode==0?"P2P 直连":report.mode==1?"TURN 中继":"—";} String resolution(){return width>0&&height>0?width+" × "+height:"—";} - String summary(){ - String value=mode()+(width>0&&height>0?" · "+width+"×"+height:"")+" · "+bitrate(report==null||report.traffic[3]==null?-1:report.traffic[3].inbound); - if(report!=null&&report.traffic[0]!=null&&report.traffic[0].loss>0)value+=" · 丢包 "+loss(report.traffic[0].loss);return value; - } } private static final class Frame { final double time,latency;Frame(double time,double latency){this.time=time;this.latency=latency;} diff --git a/apps/android/app/src/main/java/cn/crossdesk/mobile/SessionControls.java b/apps/android/app/src/main/java/cn/crossdesk/mobile/SessionControls.java index 6375a2b3..1a5c667e 100644 --- a/apps/android/app/src/main/java/cn/crossdesk/mobile/SessionControls.java +++ b/apps/android/app/src/main/java/cn/crossdesk/mobile/SessionControls.java @@ -36,7 +36,7 @@ final class SessionControls extends FrameLayout { int height=Math.max(0,getRootView().getHeight()-visible.bottom); keyboardInsets(height,height>ui.dp(80),0); } - private TextView networkLabel,videoFeedback; + private TextView videoFeedback; private RemotePrivacyScreen privacy=new RemotePrivacyScreen(); private View privacyButton; private TextView privacyFeedback,privacyCaption; @@ -116,15 +116,15 @@ final class SessionControls extends FrameLayout { if(transferLabel!=null){transferLabel.setText(transferStatus);transferLabel.setVisibility(transferStatus.isEmpty()?GONE:VISIBLE);} if(saveFileButton!=null)saveFileButton.setVisibility(hasReceivedFile?VISIBLE:GONE); } - private void closeMenu(){if(menu!=null){removeView(menu);menu=null;menuScroll=null;}if(shield!=null){removeView(shield);shield=null;}networkLabel=videoFeedback=transferLabel=saveFileButton=null;privacyFeedback=privacyCaption=null;privacyButton=null;trafficCells=null;trafficRows=null;networkDetails=null;encryptionLock=encryptionOpen=null;settingRows.clear();orb.setContentDescription("展开远程控制菜单");positionMouse();} + private void closeMenu(){if(menu!=null){removeView(menu);menu=null;menuScroll=null;}if(shield!=null){removeView(shield);shield=null;}videoFeedback=transferLabel=saveFileButton=null;privacyFeedback=privacyCaption=null;privacyButton=null;trafficCells=null;trafficRows=null;networkDetails=null;encryptionLock=encryptionOpen=null;settingRows.clear();orb.setContentDescription("展开远程控制菜单");positionMouse();} private void openMenu(String page){ cancelMouseInput(); closeMenu();menuPage=page;shield=new View(getContext());shield.setOnClickListener(v->closeMenu());addView(shield,new LayoutParams(-1,-1)); menu=ui.column();menu.setPadding(ui.dp(12),ui.dp(12),ui.dp(12),ui.dp(12));ui.card(menu,18);menu.setElevation(ui.dp(12)); LinearLayout header=ui.row(); if(!page.equals("controls"))header.addView(ui.iconButton("back","返回控制栏",()->openMenu("controls")),ui.size(28,32)); - LinearLayout titles=ui.column();TextView title=ui.text(page.equals("controls")?"● 已连接":page.equals("video")?"画面设置":"网络状态",14,true);titles.addView(title); - if(page.equals("controls")){ui.gap(titles,3);networkLabel=ui.text(network.summary(),10,false);networkLabel.setFontFeatureSettings("tnum");networkLabel.setTextColor(SECONDARY);titles.addView(networkLabel);}header.addView(titles,new LinearLayout.LayoutParams(0,-2,1));header.addView(ui.iconButton("close","关闭控制栏",this::closeMenu),ui.size(30,32));menu.addView(header);ui.gap(menu,9); + TextView title=ui.text(page.equals("controls")?"● 已连接":page.equals("video")?"画面设置":"网络状态",14,true); + header.addView(title,new LinearLayout.LayoutParams(0,-2,1));header.addView(ui.iconButton("close","关闭控制栏",this::closeMenu),ui.size(30,32));menu.addView(header);ui.gap(menu,9); if(page.equals("video")){videoFeedback=ui.text("",12,false);videoFeedback.setTextColor(SECONDARY);videoFeedback.setPadding(0,0,0,ui.dp(9));menu.addView(videoFeedback);} ScrollView scroll=new ScrollView(getContext());menuScroll=scroll;menu.addView(scroll,new LinearLayout.LayoutParams(-1,0,1));LinearLayout body=ui.column();scroll.addView(body); if(page.equals("network")){ @@ -216,7 +216,6 @@ final class SessionControls extends FrameLayout { return row; } private void renderNetwork(){ - if(networkLabel!=null)networkLabel.setText(network.summary()); if(trafficCells==null)return; String[] names={"视频","音频","数据","合计"}; for(int i=0;i<4;i++){ diff --git a/apps/harmony/entry/src/main/ets/mobile/MobileRemoteView.ets b/apps/harmony/entry/src/main/ets/mobile/MobileRemoteView.ets index 954d7157..b85cae6e 100644 --- a/apps/harmony/entry/src/main/ets/mobile/MobileRemoteView.ets +++ b/apps/harmony/entry/src/main/ets/mobile/MobileRemoteView.ets @@ -211,14 +211,9 @@ export struct MobileRemoteView { Column({ space: 10 }) { Row({ space: 6 }) { if (this.menu !== 'controls') { MobileIconButton({ icon: 'back', label: '返回控制栏', iconExtent: 30, iconSize: 19, action: () => this.menu = 'controls' }) } - Column({ space: 3 }) { - Row({ space: 6 }) { - if (this.menu === 'controls') { Row() {}.width(6).height(6).borderRadius(3).backgroundColor(MobileTheme.green) } - Text(this.menu === 'controls' ? '已连接' : this.menu === 'video' ? '画面设置' : '网络状态').fontSize(14).fontWeight(600).fontColor(MobileTheme.ink) - }.width('100%') - if (this.menu === 'controls') { - Text(`${this.controller?.network.mode(this.state.networkTime) ?? '—'} · ${this.state.width}×${this.state.height}`).fontSize(10).fontColor(MobileTheme.secondary).width('100%') - } + Row({ space: 6 }) { + if (this.menu === 'controls') { Row() {}.width(6).height(6).borderRadius(3).backgroundColor(MobileTheme.green) } + Text(this.menu === 'controls' ? '已连接' : this.menu === 'video' ? '画面设置' : '网络状态').fontSize(14).fontWeight(600).fontColor(MobileTheme.ink) }.layoutWeight(1) MobileIconButton({ icon: 'close', label: '关闭控制栏', iconExtent: 30, iconSize: 20, action: () => this.menu = '' }) }.width('100%') diff --git a/apps/ios/CrossDeskMobile/RemoteSessionView.swift b/apps/ios/CrossDeskMobile/RemoteSessionView.swift index f54acb30..8250af3d 100644 --- a/apps/ios/CrossDeskMobile/RemoteSessionView.swift +++ b/apps/ios/CrossDeskMobile/RemoteSessionView.swift @@ -1163,15 +1163,9 @@ private struct FloatingSessionMenu: View { Circle() .fill(session.isConnected ? Color.green : Color.orange) .frame(width: 9, height: 9) - VStack(alignment: .leading, spacing: 1) { - Text(session.connectionStatus) - .font(.subheadline.weight(.semibold)) - .lineLimit(1) - Text(statusDetail) - .font(.caption2.monospacedDigit()) - .foregroundStyle(.secondary) - .lineLimit(1) - } + Text(session.connectionStatus) + .font(.subheadline.weight(.semibold)) + .lineLimit(1) } Spacer() Button(action: close) { @@ -1311,20 +1305,6 @@ private struct FloatingSessionMenu: View { .buttonStyle(.borderedProminent) .tint(.red) } - - private var statusDetail: String { - let snapshot = displayedNetworkSnapshot - var components = [snapshot.connectionMode] - let frameSize = displayedFrameSize - if frameSize.width > 0 && frameSize.height > 0 { - components.append("\(Int(frameSize.width))×\(Int(frameSize.height))") - } - components.append(RemoteNetworkSnapshot.bitrate(snapshot.report?.total.inboundBitrate)) - if let loss = snapshot.report?.video.lossRate, loss > 0 { - components.append("丢包 \(RemoteNetworkSnapshot.lossRate(loss))") - } - return components.joined(separator: " · ") - } } private struct ScrollingCodecName: View {