diff --git a/Nextcloud.xcodeproj/project.pbxproj b/Nextcloud.xcodeproj/project.pbxproj index 8dd4c5545f..312eda58e5 100644 --- a/Nextcloud.xcodeproj/project.pbxproj +++ b/Nextcloud.xcodeproj/project.pbxproj @@ -85,6 +85,12 @@ AFCE353527E4ED5900FEA6C2 /* DateFormatter+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFCE353427E4ED5900FEA6C2 /* DateFormatter+Extension.swift */; }; AFCE353727E4ED7B00FEA6C2 /* NCShareCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFCE353627E4ED7B00FEA6C2 /* NCShareCells.swift */; }; AFCE353927E5DE0500FEA6C2 /* Shareable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFCE353827E5DE0400FEA6C2 /* Shareable.swift */; }; + AFCE353927E5DE0500FEA6C2 /* NCShare+Helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFCE353827E5DE0400FEA6C2 /* NCShare+Helper.swift */; }; + B568C2B12DA7AA5F0072FCB4 /* MoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B568C2B02DA7AA5F0072FCB4 /* MoreTests.swift */; }; + B568C2B32DA7AAAE0072FCB4 /* NCMoreUserCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = B568C2B22DA7AAAE0072FCB4 /* NCMoreUserCell.xib */; }; + B568C2B52DA7AADD0072FCB4 /* NCMoreUserCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B568C2B42DA7AADD0072FCB4 /* NCMoreUserCell.swift */; }; + C04E2F232A17BB4D001BAD85 /* FilesIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C04E2F222A17BB4D001BAD85 /* FilesIntegrationTests.swift */; }; + D575039F27146F93008DC9DC /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7A0D1342591FBC5008F8A13 /* String+Extension.swift */; }; D5B6AA7827200C7200D49C24 /* NCActivityTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B6AA7727200C7200D49C24 /* NCActivityTableViewCell.swift */; }; F310B1EF2BA862F1001C42F5 /* NCViewerMedia+VisionKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = F310B1EE2BA862F1001C42F5 /* NCViewerMedia+VisionKit.swift */; }; F321DA8A2B71205A00DDA0E6 /* NCTrashSelectTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F321DA892B71205A00DDA0E6 /* NCTrashSelectTabBar.swift */; }; @@ -1221,6 +1227,10 @@ AFCE353427E4ED5900FEA6C2 /* DateFormatter+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DateFormatter+Extension.swift"; sourceTree = ""; }; AFCE353627E4ED7B00FEA6C2 /* NCShareCells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCShareCells.swift; sourceTree = ""; }; AFCE353827E5DE0400FEA6C2 /* Shareable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shareable.swift; sourceTree = ""; }; + AFCE353827E5DE0400FEA6C2 /* NCShare+Helper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCShare+Helper.swift"; sourceTree = ""; }; + B568C2B02DA7AA5F0072FCB4 /* MoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreTests.swift; sourceTree = ""; }; + B568C2B22DA7AAAE0072FCB4 /* NCMoreUserCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NCMoreUserCell.xib; sourceTree = ""; }; + B568C2B42DA7AADD0072FCB4 /* NCMoreUserCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMoreUserCell.swift; sourceTree = ""; }; C0046CDA2A17B98400D87C9D /* NextcloudUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NextcloudUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; C04E2F202A17BB4D001BAD85 /* NextcloudIntegrationTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NextcloudIntegrationTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; D5B6AA7727200C7200D49C24 /* NCActivityTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCActivityTableViewCell.swift; sourceTree = ""; }; @@ -2024,6 +2034,8 @@ isa = PBXGroup; children = ( AA52EB452D42AC5A0089C348 /* Placeholder.swift */, + B568C2B02DA7AA5F0072FCB4 /* MoreTests.swift */, + AF8ED1FB2757821000B8DBC4 /* NextcloudUnitTests.swift */, ); path = NextcloudUnitTests; sourceTree = ""; @@ -2165,6 +2177,8 @@ F3BB46502A39EC2D00461F6E /* Cells */ = { isa = PBXGroup; children = ( + B568C2B42DA7AADD0072FCB4 /* NCMoreUserCell.swift */, + B568C2B22DA7AAAE0072FCB4 /* NCMoreUserCell.xib */, F3BB464C2A39ADCC00461F6E /* NCMoreAppSuggestionsCell.xib */, F3BB46512A39EC4900461F6E /* NCMoreAppSuggestionsCell.swift */, F3BB46532A3A1E9D00461F6E /* CCCellMore.swift */, @@ -3949,6 +3963,8 @@ F7381EE5218218C9000B1560 /* NCOffline.storyboard in Resources */, F768822D2C0DD1E7001CF441 /* Acknowledgements.rtf in Resources */, F76D3CF32428B94E005DFA87 /* NCViewerPDFSearchCell.xib in Resources */, + B568C2B32DA7AAAE0072FCB4 /* NCMoreUserCell.xib in Resources */, + F7CA212E25F1333300826ABB /* NCAccountRequest.storyboard in Resources */, F717402D24F699A5000C87D5 /* NCFavorite.storyboard in Resources */, F723B3DD22FC6D1D00301EFE /* NCShareCommentsCell.xib in Resources */, F78ACD4B21903F850088454D /* NCTrashListCell.xib in Resources */, @@ -4569,6 +4585,7 @@ F7816EF22C2C3E1F00A52517 /* NCPushNotification.swift in Sources */, F76882342C0DD1E7001CF441 /* NCDisplayView.swift in Sources */, F7C30DF6291BC0CA0017149B /* NCNetworkingE2EEUpload.swift in Sources */, + B568C2B52DA7AADD0072FCB4 /* NCMoreUserCell.swift in Sources */, F7501C332212E57500FB1415 /* NCMedia.swift in Sources */, F7411C552D7B26D700F57358 /* NCNetworking+ServerError.swift in Sources */, F72944F22A84246400246839 /* NCEndToEndMetadataV20.swift in Sources */, diff --git a/Tests/NextcloudUnitTests/MoreTests.swift b/Tests/NextcloudUnitTests/MoreTests.swift new file mode 100644 index 0000000000..0a96912994 --- /dev/null +++ b/Tests/NextcloudUnitTests/MoreTests.swift @@ -0,0 +1,37 @@ +// +// MoreTests.swift +// NextcloudTests +// +// Created by A200020526 on 09/06/23. +// Copyright © 2023 Marino Faggiana. All rights reserved. +// + +@testable import Nextcloud +import XCTest + +final class MoreTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/iOSClient/More/Cells/NCMoreUserCell.swift b/iOSClient/More/Cells/NCMoreUserCell.swift new file mode 100644 index 0000000000..1d6e30cece --- /dev/null +++ b/iOSClient/More/Cells/NCMoreUserCell.swift @@ -0,0 +1,44 @@ +// +// NCMoreUserCell.swift +// Nextcloud +// +// Created by Milen on 14.06.23. +// Copyright © 2023 Marino Faggiana. All rights reserved. +// +// Author Marino Faggiana +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +import Foundation +import MarqueeLabel + +class NCMoreUserCell: BaseNCMoreCell { + @IBOutlet weak var displayName: UILabel! + @IBOutlet weak var avatar: UIImageView! + @IBOutlet weak var icon: UIImageView! + @IBOutlet weak var status: MarqueeLabel! + + static let reuseIdentifier = "NCMoreUserCell" + + static func fromNib() -> UINib { + return UINib(nibName: "NCMoreUserCell", bundle: nil) + } + + override func awakeFromNib() { + super.awakeFromNib() + + icon.makeCircularBackground(withColor: .systemBackground) + } +} diff --git a/iOSClient/More/Cells/NCMoreUserCell.xib b/iOSClient/More/Cells/NCMoreUserCell.xib new file mode 100755 index 0000000000..477fe2539e --- /dev/null +++ b/iOSClient/More/Cells/NCMoreUserCell.xib @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOSClient/More/NCMore.swift b/iOSClient/More/NCMore.swift index 43301a4fd4..11b04a1ea4 100644 --- a/iOSClient/More/NCMore.swift +++ b/iOSClient/More/NCMore.swift @@ -34,6 +34,7 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var progressQuota: UIProgressView! @IBOutlet weak var viewQuota: UIView! + private var userMenu: [NKExternalSite] = [] private var functionMenu: [NKExternalSite] = [] private var externalSiteMenu: [NKExternalSite] = [] private var settingsMenu: [NKExternalSite] = [] @@ -110,6 +111,7 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { var quota: String = "" // Clear + userMenu.removeAll() functionMenu.removeAll() externalSiteMenu.removeAll() settingsMenu.removeAll() @@ -118,10 +120,25 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { labelQuotaExternalSite.text = "" progressQuota.progressTintColor = NCBrandColor.shared.getElement(account: session.account) + // ITEM : User + item = NKExternalSite() +// item.name = tableAccount.email + if !tableAccount.email.isEmpty { + item.name = tableAccount.email + } else if tableAccount.email.isEmpty {//}|| tableAccount.alias.isEmpty { + item.name = tableAccount.displayName + } else { + item.name = tableAccount.alias + } + item.icon = "user"//utility.loadUserImage(for: tableAccount.user, displayName: tableAccount.displayName, urlBase: tableAccount.urlBase) +// item.url = "segueRecent" +// item.order = 10 + userMenu.append(item) + // ITEM : Recent item = NKExternalSite() item.name = "_recent_" - item.icon = "clock.arrow.circlepath" + item.icon = "History" //"clock.arrow.circlepath" item.url = "segueRecent" item.order = 20 functionMenu.append(item) @@ -152,7 +169,7 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { if capabilities.fileSharingApiEnabled { item = NKExternalSite() item.name = "_list_shares_" - item.icon = "person.badge.plus" + item.icon = "share" //"person.badge.plus" item.url = "segueShares" item.order = 50 functionMenu.append(item) @@ -161,7 +178,7 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { // ITEM : Offline item = NKExternalSite() item.name = "_manage_file_offline_" - item.icon = "icloud.and.arrow.down" + item.icon = "cloudDownload" item.url = "segueOffline" item.order = 60 functionMenu.append(item) @@ -179,7 +196,7 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { // ITEM : Scan item = NKExternalSite() item.name = "_scanned_images_" - item.icon = "doc.text.viewfinder" + item.icon = "scan" //"doc.text.viewfinder" item.url = "openStoryboardNCScan" item.order = 70 functionMenu.append(item) @@ -187,7 +204,7 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { // ITEM : Trash item = NKExternalSite() item.name = "_trash_view_" - item.icon = "trash" + item.icon = "trashIcon" item.url = "segueTrash" item.order = 80 functionMenu.append(item) @@ -201,7 +218,7 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { // ITEM : Settings item = NKExternalSite() item.name = "_settings_" - item.icon = "gear" + item.icon = "settings" item.url = "openSettings" settingsMenu.append(item) @@ -242,7 +259,7 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { item.url = urlEncoded item.icon = "network" if externalSite.type == "settings" { - item.icon = "gear" + item.icon = "settings" } externalSiteMenu.append(item) } @@ -257,6 +274,10 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { if !NCBrandOptions.shared.disable_show_more_nextcloud_apps_in_settings { sections.append(Section(items: [NKExternalSite()], type: .moreApps)) } + + if !userMenu.isEmpty { + sections.append(Section(items: userMenu, type: .regular)) + } if !functionMenu.isEmpty { sections.append(Section(items: functionMenu, type: .regular)) @@ -324,13 +345,19 @@ class NCMore: UIViewController, UITableViewDelegate, UITableViewDataSource { let item = sections[indexPath.section].items[indexPath.row] - cell.imageIcon?.image = utility.loadImage(named: item.icon, colors: [NCBrandColor.shared.iconImageColor]) + cell.imageIcon?.image = utility.loadImage(named: item.icon, colors: [NCBrandColor.shared.iconImageColor], size: 24).withTintColor(NCBrandColor.shared.iconImageColor) cell.imageIcon?.contentMode = .scaleAspectFit cell.labelText?.text = NSLocalizedString(item.name, comment: "") cell.labelText.textColor = NCBrandColor.shared.textColor - cell.accessoryType = UITableViewCell.AccessoryType.disclosureIndicator - + if indexPath.section == 0 { + if indexPath.row == 0 { + cell.accessoryType = UITableViewCell.AccessoryType.none + } + } + else { + cell.accessoryType = UITableViewCell.AccessoryType.disclosureIndicator + } cell.separator.backgroundColor = .separator cell.separatorHeigth.constant = 0.4