From 1be29107c0ba92f4ef9edd1698874747e6ad3db5 Mon Sep 17 00:00:00 2001 From: Victor Wads Date: Wed, 19 Apr 2023 02:53:52 -0300 Subject: [PATCH] chore(App): log process listing feature - dump version 2.1 --- CHANGELOG.md | 13 +- Pkg/createPackage.sh | 2 +- Source/Views/Screens/Logs/LogsListView.swift | 141 ++++++++++++++++--- Source/Views/Screens/Logs/LogsScreen.swift | 24 +++- 4 files changed, 153 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22101e8..0dca2d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,18 +1,23 @@ # App and Logger Changelog - Future Releases - - More visual info about the logs, like battery status icon and % - - TableView for seeing processes more easylly - Choose with infos about the logs are showed on logs screen - Filter logs - - improve logs details layout - open original text log files - archive logs for better analyses and performance +* [2.1](https://github.com/victorwads/UptimeLogger/releases/download/2.0/UptimeLogger-2.0.dmg) + * App + * New Features + * Logs List with more relevant information like, batery, connected power (or not) SO Version + * Logs List with sorting, filtering by shutdown and charging status + * Log Procces Details, with sorting, filtering, serach + - [2.0.1 - Current](https://github.com/victorwads/UptimeLogger/releases/download/2.0.1/UptimeLogger-2.0.1.dmg) - Fix for x86_64 macs + - Fix installator update service system (keep current log) -* [2.0 - Current](https://github.com/victorwads/UptimeLogger/releases/download/2.0/UptimeLogger-2.0.dmg) +* [2.0](https://github.com/victorwads/UptimeLogger/releases/download/2.0/UptimeLogger-2.0.dmg) * App * Fixes * Fixed file access issue diff --git a/Pkg/createPackage.sh b/Pkg/createPackage.sh index 8787582..7126819 100755 --- a/Pkg/createPackage.sh +++ b/Pkg/createPackage.sh @@ -2,7 +2,7 @@ BUNDLE_NAME="br.com.victorwads.UptimeLogger" INSTALLER_NAME="Install UptimeLogger" UNINSTALLER_NAME="Uninstall" -VERSION="2.0.1" +VERSION="2.1" CACHE_FOLDER="cache" APP_FOLDER="$CACHE_FOLDER/Build/Products/Release/UptimeLogger.app" diff --git a/Source/Views/Screens/Logs/LogsListView.swift b/Source/Views/Screens/Logs/LogsListView.swift index 9f4e4d0..9cac386 100644 --- a/Source/Views/Screens/Logs/LogsListView.swift +++ b/Source/Views/Screens/Logs/LogsListView.swift @@ -7,29 +7,136 @@ import SwiftUI +struct TextIconView: View { + + let icon: String + let text: String + + var body: some View { + HStack { + Text(text) + Image(systemName: icon) + } + } + +} struct LogsListView: View { var onToggleAction: (LogItemInfo) -> Void = {_ in } @Binding var items: [LogItemInfo] + @Binding var showFilters: Bool + @State private var sortOrder: LogSortOrder = .dateDescending + @State private var filterPowerStatus: TreeCase = .all + @State private var filterShutdownAllowed: TreeCase = .all + + enum LogSortOrder { + case dateDescending + case dateAscending + case uptimeDescending + case uptimeAscending + } + + enum TreeCase { + case all + case yes + case no + + var state: Bool? { + switch self { + case .all: + return nil + case .yes: + return true + case .no: + return false + } + } + } + + var body: some View { - if items.isEmpty { - List([0], id: \.self) { item in - HStack(alignment: .center) { - Spacer() - Text(Strings.logsNotFound.value).foregroundColor(.gray) - Spacer() + VStack { + if(showFilters) { + VStack { + HStack { + Text("Sort by:") + Picker(selection: $sortOrder, label: Text("")) { + Text("Date (newest first)").tag(LogSortOrder.dateDescending) + Text("Date (oldest first)").tag(LogSortOrder.dateAscending) + Text("Uptime (longest first)").tag(LogSortOrder.uptimeDescending) + Text("Uptime (shortest first)").tag(LogSortOrder.uptimeAscending) + } + .pickerStyle(.segmented) + }.padding(.horizontal) + HStack { + Picker(selection: $filterPowerStatus, label: Text("Charging Status:")) { + Text("All").tag(TreeCase.all) + Image(systemName: "bolt.fill") + .tag(TreeCase.yes) + .help("Power connected") + Image(systemName: "bolt.slash.fill") + .tag(TreeCase.no) + .help("Power disconnected") + } + .pickerStyle(.segmented) + Spacer() + Picker(selection: $filterShutdownAllowed, label: Text("Shutdown:")) { + Text("All").tag(TreeCase.all) + Text("Normal").tag(TreeCase.yes) + Text("Unexpected").tag(TreeCase.no) + } + .pickerStyle(.segmented) + }.padding(.horizontal) + } + } + if items.isEmpty { + List([0], id: \.self) { item in + HStack(alignment: .center) { + Spacer() + Text(Strings.logsNotFound.value).foregroundColor(.gray) + Spacer() + } } + } else { + List( + items.filter(filterFunction).sorted(by: sortingFunction), + id: \.fileName + ) { logItem in + LogItemView( + log: .constant(logItem), + showDetails: true, + onToggleAction: onToggleAction + ) + Divider() + } + } + } + } + + private var sortingFunction: (LogItemInfo, LogItemInfo) -> Bool { + switch sortOrder { + case .dateAscending: + return { $0.systemBootTime ?? Date.distantPast < $1.systemBootTime ?? Date.distantPast } + case .dateDescending: + return { $0.systemBootTime ?? Date.distantPast > $1.systemBootTime ?? Date.distantPast } + case .uptimeAscending: + return { $0.systemUptime ?? 0 < $1.systemUptime ?? 0 } + case .uptimeDescending: + return { $0.systemUptime ?? 0 > $1.systemUptime ?? 0 } + } + } + + + private var filterFunction: (LogItemInfo) -> Bool { + return { logItem in + if filterPowerStatus != .all && logItem.charging != filterPowerStatus.state { + return false } - } else { - List(items, id: \.fileName) { logItem in - LogItemView( - log: .constant(logItem), - showDetails: true, - onToggleAction: onToggleAction - ) - Divider() + if filterShutdownAllowed != .all && logItem.shutdownAllowed != filterShutdownAllowed.state { + return false } + return true } } @@ -38,7 +145,9 @@ struct LogsListView: View { struct LogsView_Previews: PreviewProvider { static var previews: some View { LogsListView(items: .constant([ - LogItemInfo(fileName: "", content: "") - ])) + LogItemInfo(fileName: "", content: ""), + ]), + showFilters: .constant(true) + ) } } diff --git a/Source/Views/Screens/Logs/LogsScreen.swift b/Source/Views/Screens/Logs/LogsScreen.swift index 97a8775..7f5411a 100644 --- a/Source/Views/Screens/Logs/LogsScreen.swift +++ b/Source/Views/Screens/Logs/LogsScreen.swift @@ -16,17 +16,29 @@ struct LogsScreen: View { @AppStorage("logsFolder") var logsFolder: String = LogsProvider.defaultLogsFolder @State private var logs: [LogItemInfo] = [] + @State var showFilters: Bool = false let provider: LogsProvider var body: some View { + HStack { LegendView().padding() - LogsListView( - onToggleAction: toggleItemAction, - items: $logs - ).onAppear(perform: initLogs) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .navigationTitle(Strings.mainLogs.value) + Button(action: { + withAnimation(.easeInOut(duration: 0.3)) { + showFilters.toggle() + } + }) { + Image(systemName: showFilters ? "line.3.horizontal.decrease.circle.fill" : "line.3.horizontal.decrease.circle") + } + + } + LogsListView( + onToggleAction: toggleItemAction, + items: $logs, + showFilters: $showFilters + ).onAppear(perform: initLogs) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .navigationTitle(Strings.mainLogs.value) } private func toggleItemAction(item: LogItemInfo) {