From 669737a6f9230736a476a28575c7be15d0dc0016 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Fri, 28 Jun 2024 16:43:24 +0400 Subject: [PATCH] show percent --- .../Shared/Views/ChatList/ChatListView.swift | 9 +- .../Views/ChatList/ServersSummaryView.swift | 94 +++++++++++-------- .../UserSettings/NetworkAndServers.swift | 5 +- .../Views/UserSettings/SettingsView.swift | 2 + 4 files changed, 67 insertions(+), 43 deletions(-) diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index db1d2989c0..de5bd15619 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -269,6 +269,8 @@ struct SubsStatusIndicator: View { @State private var timer: Timer? = nil @State private var timerCounter = 0 @State private var showServersSummary = false + + @AppStorage(DEFAULT_SHOW_CONNECTION_STATUS_PERCENT) private var showConnectionStatusPercent = false // Constants for the intervals let initialInterval: TimeInterval = 1.0 @@ -279,7 +281,12 @@ struct SubsStatusIndicator: View { Button { showServersSummary = true } label: { - SubscriptionStatusView(subs: subs, sess: sess) + HStack(spacing: 4) { + ConnectionStatusIndicatorView(subs: subs, sess: sess) + if showConnectionStatusPercent { + ConnectionStatusPercentView(subs: subs, sess: sess) + } + } } .onAppear { startInitialTimer() diff --git a/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift b/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift index 55998fe458..c313b567ff 100644 --- a/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift +++ b/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift @@ -18,6 +18,8 @@ struct ServersSummaryView: View { @State private var timer: Timer? = nil @State private var alert: SomeAlert? + @AppStorage(DEFAULT_SHOW_CONNECTION_STATUS_PERCENT) private var showConnectionStatusPercent = false + enum PresentedUserCategory { case currentUser case allUsers @@ -218,16 +220,15 @@ struct ServersSummaryView: View { .navigationBarTitleDisplayMode(.large) } label: { HStack { - if srvSumm.connected { - SubscriptionStatusView( - subs: srvSumm.subsOrNew, - sess: srvSumm.sessionsOrNew - ) - .frame(width: 16, alignment: .center) - .padding(.trailing, 4) - } Text(serverAddress(srvSumm.smpServer)) .lineLimit(1) + if srvSumm.connected { + Spacer() + if showConnectionStatusPercent { + ConnectionStatusPercentView(subs: srvSumm.subsOrNew, sess: srvSumm.sessionsOrNew) + } + ConnectionStatusIndicatorView(subs: srvSumm.subsOrNew, sess: srvSumm.sessionsOrNew) + } } } } @@ -314,13 +315,12 @@ struct ServersSummaryView: View { } } -struct SubscriptionStatusView: View { - @EnvironmentObject var m: ChatModel +struct ConnectionStatusIndicatorView: View { var subs: SMPServerSubs var sess: ServerSessions var body: some View { - let (color, variableValue, opacity) = iconColor + let (color, variableValue, opacity, _) = connectionStatusColorAndPercent(subs, sess) if #available(iOS 16.0, *) { Image(systemName: "dot.radiowaves.up.forward", variableValue: variableValue) .foregroundColor(color) @@ -329,39 +329,49 @@ struct SubscriptionStatusView: View { .foregroundColor(color.opacity(opacity)) } } +} - private var iconColor: (Color, Double, Double) { - m.networkInfo.online && (subs.total > 0 || sess.total > 0) - ? ( // Status to be displayed based on subs - subs.total > 0 - ? ( - subs.ssActive == 0 - ? ( - sess.ssConnected == 0 ? noConnColor : (.accentColor, activeSubsRounded, subs.shareOfActive) - ) - : ( // ssActive > 0 - sess.ssConnected == 0 - ? (.orange, activeSubsRounded, subs.shareOfActive) // This would mean implementation error - : (.accentColor, activeSubsRounded, subs.shareOfActive) - ) - ) - // subs.total == 0 and sess.total > 0; Status to be displayed based on sessions - : (.accentColor, connectedSessRounded, sess.shareOfConnected) - ) - : noConnColor +struct ConnectionStatusPercentView: View { + var subs: SMPServerSubs + var sess: ServerSessions + + var body: some View { + let (_, _, _, statusPercent) = connectionStatusColorAndPercent(subs, sess) + Text("\(Int(floor(statusPercent * 100)))%") + .foregroundColor(.secondary) + .font(.caption) } +} - private var noConnColor: (Color, Double, Double) { (Color(uiColor: .tertiaryLabel), 1, 1) } - - private var activeSubsRounded: Double { roundedToQuarter(subs.shareOfActive) } - - private var connectedSessRounded: Double { roundedToQuarter(sess.shareOfConnected) } - - private func roundedToQuarter(_ n: Double) -> Double { +func connectionStatusColorAndPercent(_ subs: SMPServerSubs, _ sess: ServerSessions) -> (Color, Double, Double, Double) { + func roundedToQuarter(_ n: Double) -> Double { n >= 1 ? 1 : n <= 0 ? 0 : (n * 4).rounded() / 4 } + + let noConnColorAndPercent: (Color, Double, Double, Double) = (Color(uiColor: .tertiaryLabel), 1, 1, 0) + let activeSubsRounded = roundedToQuarter(subs.shareOfActive) + let connectedSessRounded = roundedToQuarter(sess.shareOfConnected) + + return ChatModel.shared.networkInfo.online && (subs.total > 0 || sess.total > 0) + ? ( // Status to be displayed based on subs + subs.total > 0 + ? ( + subs.ssActive == 0 + ? ( + sess.ssConnected == 0 ? noConnColorAndPercent : (.accentColor, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) + ) + : ( // ssActive > 0 + sess.ssConnected == 0 + ? (.orange, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) // This would mean implementation error + : (.accentColor, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) + ) + ) + // subs.total == 0 and sess.total > 0; Status to be displayed based on sessions + : (.accentColor, connectedSessRounded, sess.shareOfConnected, sess.shareOfConnected) + ) + : noConnColorAndPercent } struct SMPServerSummaryView: View { @@ -370,6 +380,8 @@ struct SMPServerSummaryView: View { var statsStartedAt: Date @State private var alert: SomeAlert? + @AppStorage(DEFAULT_SHOW_CONNECTION_STATUS_PERCENT) private var showConnectionStatusPercent = false + var body: some View { List { Section { @@ -422,10 +434,10 @@ struct SMPServerSummaryView: View { HStack { Text("Connection status") Spacer() - SubscriptionStatusView( - subs: summary.subsOrNew, - sess: summary.sessionsOrNew - ) + if showConnectionStatusPercent { + ConnectionStatusPercentView(subs: summary.subsOrNew, sess: summary.sessionsOrNew) + } + ConnectionStatusIndicatorView(subs: summary.subsOrNew, sess: summary.sessionsOrNew) } } diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers.swift index 6d849479e5..fdc3a1fa05 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers.swift @@ -30,7 +30,8 @@ private enum NetworkAlert: Identifiable { struct NetworkAndServers: View { @EnvironmentObject var m: ChatModel @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false - @AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = true + @AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false + @AppStorage(DEFAULT_SHOW_CONNECTION_STATUS_PERCENT) private var showConnectionStatusPercent = false @State private var cfgLoaded = false @State private var currentNetCfg = NetCfg.defaults @State private var netCfg = NetCfg.defaults @@ -58,6 +59,8 @@ struct NetworkAndServers: View { Text("XFTP servers") } + Toggle("Show connection status %", isOn: $showConnectionStatusPercent) + Picker("Use .onion hosts", selection: $onionHosts) { ForEach(OnionHosts.values, id: \.self) { Text($0.text) } } diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift index 89582ab810..c71d94ef61 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift @@ -61,6 +61,7 @@ let DEFAULT_CONFIRM_REMOTE_SESSIONS = "confirmRemoteSessions" let DEFAULT_CONNECT_REMOTE_VIA_MULTICAST = "connectRemoteViaMulticast" let DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO = "connectRemoteViaMulticastAuto" let DEFAULT_SHOW_SENT_VIA_RPOXY = "showSentViaProxy" +let DEFAULT_SHOW_CONNECTION_STATUS_PERCENT = "showConnectionStatusPercent" let ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN = "androidCallOnLockScreen" @@ -101,6 +102,7 @@ let appDefaults: [String: Any] = [ DEFAULT_CONNECT_REMOTE_VIA_MULTICAST: true, DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO: true, DEFAULT_SHOW_SENT_VIA_RPOXY: false, + DEFAULT_SHOW_CONNECTION_STATUS_PERCENT: false, ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN: AppSettingsLockScreenCalls.show.rawValue ]