From 04e787156b6c93ae74d2227f30dc172138745e74 Mon Sep 17 00:00:00 2001 From: Azuma Kasumi Date: Mon, 8 May 2023 15:50:19 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=80=E3=83=AB?= =?UTF-8?q?=E3=81=AE=E8=A1=A8=E7=A4=BA=E3=83=BB=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E7=94=BB=E9=9D=A2=E3=81=B8=E3=81=AE=E9=81=B7=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AgileWorks.xcodeproj/project.pbxproj | 4 + .../AgileWorks/App/RootViewController.swift | 1 + .../Login/Builder/LoginBuilder.swift | 4 + .../Login/View/LoginViewController.swift | 2 + .../View/MordalViewController.swift | 18 ++- .../ServerSwitchingTableViewController.swift | 80 +++++++++++ .../serverSwitchingViewController.storyboard | 132 ++++++++++++++++-- .../Strings/Chinese-Simplified.strings | 1 + .../Strings/Chinese-Traditional.strings | 1 + AgileWorks/AgileWorks/Strings/English.strings | 1 + .../AgileWorks/Strings/Japanese.strings | 1 + .../Strings/en.lproj/Localizable.strings | 1 + .../Strings/ja.lproj/Localizable.strings | 1 + .../Strings/zh-Hans.lproj/Localizable.strings | 1 + .../Strings/zh-Hant.lproj/Localizable.strings | 1 + .../WebView/View/MenuViewController.swift | 1 + .../WebView/View/WebViewController.swift | 1 + .../Common/DataStore/KeychainDataStore.swift | 16 +++ 18 files changed, 256 insertions(+), 11 deletions(-) create mode 100644 AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift diff --git a/AgileWorks/AgileWorks.xcodeproj/project.pbxproj b/AgileWorks/AgileWorks.xcodeproj/project.pbxproj index 5c044bc..64104ad 100644 --- a/AgileWorks/AgileWorks.xcodeproj/project.pbxproj +++ b/AgileWorks/AgileWorks.xcodeproj/project.pbxproj @@ -47,6 +47,7 @@ 75BC052F29ECE8AC00E21941 /* ServerSwitchingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BC052E29ECE8AC00E21941 /* ServerSwitchingViewController.swift */; }; 75BC053229ED087000E21941 /* ServerSwitchingViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75BC053129ED087000E21941 /* ServerSwitchingViewController.storyboard */; }; 75BC053429EDA23700E21941 /* MordalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BC053329EDA23700E21941 /* MordalViewController.swift */; }; + 75BC053629F8DFCC00E21941 /* ServerSwitchingTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BC053529F8DFCC00E21941 /* ServerSwitchingTableViewController.swift */; }; 75EDD2272806618A0068B4BC /* WidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EDD2262806618A0068B4BC /* WidgetView.swift */; }; 75EDD2282806618A0068B4BC /* WidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EDD2262806618A0068B4BC /* WidgetView.swift */; }; 75EDD2292806618A0068B4BC /* WidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EDD2262806618A0068B4BC /* WidgetView.swift */; }; @@ -252,6 +253,7 @@ 75BC052E29ECE8AC00E21941 /* ServerSwitchingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerSwitchingViewController.swift; sourceTree = ""; }; 75BC053129ED087000E21941 /* ServerSwitchingViewController.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = ServerSwitchingViewController.storyboard; sourceTree = ""; }; 75BC053329EDA23700E21941 /* MordalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MordalViewController.swift; sourceTree = ""; }; + 75BC053529F8DFCC00E21941 /* ServerSwitchingTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerSwitchingTableViewController.swift; sourceTree = ""; }; 75EDD2262806618A0068B4BC /* WidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetView.swift; sourceTree = ""; }; 75EF9CAC27E9E983003178A3 /* WidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 75EF9CAD27E9E983003178A3 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; @@ -512,6 +514,7 @@ 75BC052E29ECE8AC00E21941 /* ServerSwitchingViewController.swift */, 75BC053129ED087000E21941 /* ServerSwitchingViewController.storyboard */, 75BC053329EDA23700E21941 /* MordalViewController.swift */, + 75BC053529F8DFCC00E21941 /* ServerSwitchingTableViewController.swift */, ); path = View; sourceTree = ""; @@ -1441,6 +1444,7 @@ 76AE530725D3652400AFA45A /* LicenseViewBuilder.swift in Sources */, 3127EE1B241A2B4D00535CC7 /* TodayViewController.swift in Sources */, BDAABA1B24A361E90077EC69 /* PostDeviceEndpoint.swift in Sources */, + 75BC053629F8DFCC00E21941 /* ServerSwitchingTableViewController.swift in Sources */, 31AA002F24347BBD000177B4 /* ApprovalResponse.swift in Sources */, BD7A8008241A16B90040B418 /* LinkManager.swift in Sources */, C535772E2754D5C500EAA660 /* WebViewController.swift in Sources */, diff --git a/AgileWorks/AgileWorks/App/RootViewController.swift b/AgileWorks/AgileWorks/App/RootViewController.swift index 6e82fe6..3ca5135 100644 --- a/AgileWorks/AgileWorks/App/RootViewController.swift +++ b/AgileWorks/AgileWorks/App/RootViewController.swift @@ -67,6 +67,7 @@ extension RootViewController { KeychainDataStore().removeOAuthState() KeychainDataStore().removeAccessToken() KeychainDataStore().removeSessionID() + KeychainDataStore().removeServerName() KeychainDataStore().removeLanguage() KeychainDataStore().removeDeviceID() diff --git a/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift b/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift index 13926ad..1921dde 100644 --- a/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift +++ b/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift @@ -26,6 +26,10 @@ struct LoginBuilderImpl: LoginBuilder { ) return viewController } + + func loginStoryboard() -> LoginViewController { + return storyboard() + } } extension LoginBuilderImpl { diff --git a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift index d12e5f1..4e9c58b 100644 --- a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift +++ b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift @@ -74,6 +74,7 @@ class LoginViewController: UIViewController { KeychainDataStore().removeOAuthState() KeychainDataStore().removeAccessToken() KeychainDataStore().removeSessionID() + KeychainDataStore().removeServerName() KeychainDataStore().removeLanguage() KeychainDataStore().removeDeviceID() @@ -209,6 +210,7 @@ class LoginViewController: UIViewController { case .success(let response): setStringsName(language: response.user.displayLanguage) KeychainDataStore().writeSessionID(sessionID: response.sessionId) + KeychainDataStore().writeServerName(serverName: "サーバー識別名") //TODO response.server.name DispatchQueue.main.async { //メイン画面表示 AppDelegate.shared.rootViewController.switchToMainScreen() diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift index 8474044..6327480 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift +++ b/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift @@ -10,9 +10,18 @@ import UIKit import FloatingPanel class MordalViewController: UIViewController { + @IBOutlet private var accessPoint: UILabel! + @IBOutlet private var addServer: UIButton! + + let navVC = UINavigationController(rootViewController: LoginBuilderImpl().loginStoryboard()) + + @objc func cancelTapped(_ sender: UIBarButtonItem) { + navVC.dismiss(animated: true) + } + override func viewDidLoad() { super.viewDidLoad() - + accessPoint.text = getDisplayString(key: "ServerTitle", comment: "") // Do any additional setup after loading the view. } @@ -20,4 +29,11 @@ class MordalViewController: UIViewController { let controller = storyboard.instantiateViewController(withIdentifier: "MordalViewController") as! MordalViewController return controller } + @IBAction private func addServerTapped(_ sender: Any) { + //モーダルの表示 + navVC.modalPresentationStyle = .fullScreen + let leftButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelTapped(_:))) + navVC.navigationBar.topItem!.leftBarButtonItem = leftButton + self.present(navVC, animated: true) + } } diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift new file mode 100644 index 0000000..54764d3 --- /dev/null +++ b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift @@ -0,0 +1,80 @@ +// +// ServerSwitchingTableTableViewController.swift +// AgileWorks +// +// Created by Azuma Kasumi on 2023/04/26. +// Copyright © 2023 ATLED CORP. All rights reserved. +// + +import UIKit + +class ServerSwitchingTableTableViewController: UITableViewController { + @IBOutlet var table: UITableView! + + override func viewDidLoad() { + super.viewDidLoad() + table.tableFooterView = UIView() + } + + // MARK: - Table view data source + + override func numberOfSections(in tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + //セルの数 + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete implementation, return the number of rows + return 1 + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "ServerSwitchingTableViewCell", for: indexPath) + + let serverName = cell.viewWithTag(1) as! UILabel + serverName.text = KeychainDataStore().readServerName() + + let badgeIcon = cell.viewWithTag(2) as! UIImageView + badgeIcon.image = UIImage(systemName: "circle.fill", withConfiguration: UIImage.SymbolConfiguration(font: .systemFont(ofSize: 25))) + let approvalCount = cell.viewWithTag(3) as! UILabel + + //ログイン中のサーバー + if indexPath.row == 0 { + //チェックマーク + badgeIcon.image = UIImage(systemName: "checkmark.circle.fill", withConfiguration: UIImage.SymbolConfiguration(font: .systemFont(ofSize: 25))) + badgeIcon.tintColor = UIColor(named: getDisplayString(key: "MainColor", comment: "")) + //承認待ち件数は取得しないため非表示 + approvalCount.isHidden = true + } else {//その他サーバー + setApprovalsCount(label: approvalCount) + } + + return cell + } + + override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return 50 + } + + //承認待ち件数取得 + private func setApprovalsCount(label: UILabel){ + let approvalsEndpoint = GetApprovalsEndpoint() + + Session.send(approvalsEndpoint) { result in + var reqApprovalCount: Int = 0 + switch result { + case .success(let response): + let requestApproval = "REQUEST_APPROVAL" + for item in response.items where item.code == requestApproval { + reqApprovalCount = item.count + DispatchQueue.main.async { + label.text = String(reqApprovalCount) + } + } + case .failure(let error): + log.e(error) + label.text = "0" + } + } + } +} diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/serverSwitchingViewController.storyboard b/AgileWorks/AgileWorks/ServerSwitching/View/serverSwitchingViewController.storyboard index 7f04f14..6cdbd82 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/serverSwitchingViewController.storyboard +++ b/AgileWorks/AgileWorks/ServerSwitching/View/serverSwitchingViewController.storyboard @@ -4,6 +4,8 @@ + + @@ -22,7 +24,7 @@ - + @@ -32,25 +34,135 @@ - + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AgileWorks/AgileWorks/Strings/Chinese-Simplified.strings b/AgileWorks/AgileWorks/Strings/Chinese-Simplified.strings index 7d800c1..dca6489 100644 --- a/AgileWorks/AgileWorks/Strings/Chinese-Simplified.strings +++ b/AgileWorks/AgileWorks/Strings/Chinese-Simplified.strings @@ -58,6 +58,7 @@ //server "ServerTitle" = "接続先サーバー"; +"accessPoint" = "接続先"; // Notification "DocOverrideConfirm" = "由通知点选的文件已经显示了。\n你想放弃当前的编辑并显示一个新的文件吗?"; diff --git a/AgileWorks/AgileWorks/Strings/Chinese-Traditional.strings b/AgileWorks/AgileWorks/Strings/Chinese-Traditional.strings index 4168400..6cc1879 100644 --- a/AgileWorks/AgileWorks/Strings/Chinese-Traditional.strings +++ b/AgileWorks/AgileWorks/Strings/Chinese-Traditional.strings @@ -58,6 +58,7 @@ //server "ServerTitle" = "接続先サーバー"; +"accessPoint" = "接続先"; // Notification "DocOverrideConfirm" = "由通知點選的文件已經顯示了。 \n你想放棄當前的編輯並顯示一個新的文件嗎?"; diff --git a/AgileWorks/AgileWorks/Strings/English.strings b/AgileWorks/AgileWorks/Strings/English.strings index 527ffdb..66bb9ee 100644 --- a/AgileWorks/AgileWorks/Strings/English.strings +++ b/AgileWorks/AgileWorks/Strings/English.strings @@ -58,6 +58,7 @@ //server "ServerTitle" = "接続先サーバー"; +"accessPoint" = "接続先"; // Notification "DocOverrideConfirm" = "A document by a notification tap is already displayed.\nDo you want to discard the current edits and display a new document?"; diff --git a/AgileWorks/AgileWorks/Strings/Japanese.strings b/AgileWorks/AgileWorks/Strings/Japanese.strings index 471ddc0..ff87ef0 100644 --- a/AgileWorks/AgileWorks/Strings/Japanese.strings +++ b/AgileWorks/AgileWorks/Strings/Japanese.strings @@ -58,6 +58,7 @@ //server "ServerTitle" = "接続先サーバー"; +"accessPoint" = "接続先"; // Notification "DocOverrideConfirm" = "既に通知タップによる書類が表示されています。\n現在の編集内容を破棄し、新たな書類を表示しますか?"; diff --git a/AgileWorks/AgileWorks/Strings/en.lproj/Localizable.strings b/AgileWorks/AgileWorks/Strings/en.lproj/Localizable.strings index 7f2918a..55a7d34 100644 --- a/AgileWorks/AgileWorks/Strings/en.lproj/Localizable.strings +++ b/AgileWorks/AgileWorks/Strings/en.lproj/Localizable.strings @@ -58,6 +58,7 @@ //server "ServerTitle" = "接続先サーバー"; +"accessPoint" = "接続先"; // Notification "DocOverrideConfirm" = "A document by a notification tap is already displayed.\nDo you want to discard the current edits and display a new document?"; diff --git a/AgileWorks/AgileWorks/Strings/ja.lproj/Localizable.strings b/AgileWorks/AgileWorks/Strings/ja.lproj/Localizable.strings index 529cfff..4f6fbc8 100644 --- a/AgileWorks/AgileWorks/Strings/ja.lproj/Localizable.strings +++ b/AgileWorks/AgileWorks/Strings/ja.lproj/Localizable.strings @@ -58,6 +58,7 @@ //server "ServerTitle" = "接続先サーバー"; +"accessPoint" = "接続先"; // Notification "DocOverrideConfirm" = "既に通知タップによる書類が表示されています。\n現在の編集内容を破棄し、新たな書類を表示しますか?"; diff --git a/AgileWorks/AgileWorks/Strings/zh-Hans.lproj/Localizable.strings b/AgileWorks/AgileWorks/Strings/zh-Hans.lproj/Localizable.strings index 19b2444..9495f6d 100644 --- a/AgileWorks/AgileWorks/Strings/zh-Hans.lproj/Localizable.strings +++ b/AgileWorks/AgileWorks/Strings/zh-Hans.lproj/Localizable.strings @@ -58,6 +58,7 @@ //server "ServerTitle" = "接続先サーバー"; +"accessPoint" = "接続先"; // Notification "DocOverrideConfirm" = "由通知点选的文件已经显示了。\n你想放弃当前的编辑并显示一个新的文件吗?"; diff --git a/AgileWorks/AgileWorks/Strings/zh-Hant.lproj/Localizable.strings b/AgileWorks/AgileWorks/Strings/zh-Hant.lproj/Localizable.strings index a4898c3..e01613e 100644 --- a/AgileWorks/AgileWorks/Strings/zh-Hant.lproj/Localizable.strings +++ b/AgileWorks/AgileWorks/Strings/zh-Hant.lproj/Localizable.strings @@ -58,6 +58,7 @@ //server "ServerTitle" = "接続先サーバー"; +"accessPoint" = "接続先"; // Notification "DocOverrideConfirm" = "由通知點選的文件已經顯示了。 \n你想放棄當前的編輯並顯示一個新的文件嗎?"; diff --git a/AgileWorks/AgileWorks/WebView/View/MenuViewController.swift b/AgileWorks/AgileWorks/WebView/View/MenuViewController.swift index 07e6ba3..20add4e 100644 --- a/AgileWorks/AgileWorks/WebView/View/MenuViewController.swift +++ b/AgileWorks/AgileWorks/WebView/View/MenuViewController.swift @@ -73,6 +73,7 @@ class MenuViewController: UIViewController { self.nameLabel.text = userName self.serverLabel.text = serverName KeychainDataStore().writeSessionID(sessionID: sessionId) + KeychainDataStore().writeServerName(serverName: serverName) } case .failure: DispatchQueue.main.async { diff --git a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift index 4cdd571..fe9d431 100644 --- a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift +++ b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift @@ -218,6 +218,7 @@ class WebViewController: UIViewController { // セッション情報取得成功 case .success(let response): KeychainDataStore().writeSessionID(sessionID: response.sessionId) + KeychainDataStore().writeServerName(serverName: "サーバー識別名") //TODO response.server.name setStringsName(language: response.user.displayLanguage) if isInit { // 画面ロード diff --git a/AgileWorks/Common/DataStore/KeychainDataStore.swift b/AgileWorks/Common/DataStore/KeychainDataStore.swift index 681a27c..3529ac1 100644 --- a/AgileWorks/Common/DataStore/KeychainDataStore.swift +++ b/AgileWorks/Common/DataStore/KeychainDataStore.swift @@ -20,6 +20,7 @@ final class KeychainDataStore: DataStoreProtocol { private let kContextPath: String = "ContextPath" private let kDeviceID: String = "DeviceID" private let kSessionID: String = "SessionID" + private let kServerName: String = "ServerName" // アクセストークンの書き込み func writeAccessToken(accessToken: String) { @@ -143,6 +144,21 @@ final class KeychainDataStore: DataStoreProtocol { removeKeychainValue(key: kSessionID) } + // サーバー識別名の書き込み + func writeServerName(serverName: String) { + setKeychainValue(key: kServerName, value: serverName) + } + + // サーバー識別名の読み込み + func readServerName() -> String? { + return getKeychainValue(key: kServerName) + } + + // サーバー識別名の削除 + func removeServerName() { + removeKeychainValue(key: kServerName) + } + // KeyChain へ指定の値をセット private func setKeychainValue(key: String, value: String) { let keychain = Keychain(service: service, accessGroup: groupId) -- GitLab From 91d1a6025cadbd1eaf8d9fd6bb7fba80b40964d8 Mon Sep 17 00:00:00 2001 From: Azuma Kasumi Date: Fri, 19 May 2023 11:58:43 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=E3=82=B5=E3=83=BC=E3=83=90=E3=83=BC?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=8B=E3=82=89=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=EF=BC=88=E3=82=AD?= =?UTF-8?q?=E3=83=BC=E3=83=81=E3=82=A7=E3=83=B3=E5=88=87=E3=82=8A=E6=9B=BF?= =?UTF-8?q?=E3=81=88=E4=B8=8D=E5=8F=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AgileWorks/App/RootViewController.swift | 26 ++++++- .../Login/Builder/LoginBuilder.swift | 15 ++-- .../Login/View/LoginViewController.swift | 74 ++++++++++++------- .../View/MordalViewController.swift | 3 +- .../Common/DataStore/KeychainDataStore.swift | 8 +- .../DataStore/UserDefaultsDataStore.swift | 61 ++++++++++++++- 6 files changed, 146 insertions(+), 41 deletions(-) diff --git a/AgileWorks/AgileWorks/App/RootViewController.swift b/AgileWorks/AgileWorks/App/RootViewController.swift index 3ca5135..0ce909d 100644 --- a/AgileWorks/AgileWorks/App/RootViewController.swift +++ b/AgileWorks/AgileWorks/App/RootViewController.swift @@ -40,7 +40,7 @@ class RootViewController: UIViewController { extension RootViewController { func showLoginScreen() { - let new = LoginBuilderImpl().build() + let new = LoginBuilderImpl().build(addServerloginFlg: false) addChild(new) new.view.frame = view.bounds @@ -78,6 +78,28 @@ extension RootViewController { WidgetCenter.shared.reloadAllTimelines() } } + /* + UserDefaultsDataStore().removeServer() + let serverList = UserDefaultsDataStore().readServerList() + if serverList.isEmpty { + DispatchQueue.main.async { + self.switchToLogout() + //ウィジェットの更新 + if #available(iOS 14.0, *) { + WidgetCenter.shared.reloadAllTimelines() + } + } + } else { + KeychainDataStore().setGroupId(serverNumber: serverList.first!) + DispatchQueue.main.async { + self.switchToMainScreen() + //ウィジェットの更新 + if #available(iOS 14.0, *) { + WidgetCenter.shared.reloadAllTimelines() + } + } + } + */ } } @@ -104,7 +126,7 @@ extension RootViewController { } func switchToLogout() { - let new = LoginBuilderImpl().build() + let new = LoginBuilderImpl().build(addServerloginFlg: false) animateDismissTransition(to: new) } diff --git a/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift b/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift index 1921dde..42d56a5 100644 --- a/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift +++ b/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift @@ -9,14 +9,14 @@ import UIKit protocol LoginBuilder { - func build() -> UIViewController + func build(addServerloginFlg: Bool) -> UIViewController } struct LoginBuilderImpl: LoginBuilder { let identifier = "LoginViewController" - func build() -> UIViewController { - let viewController = storyboard() + func build(addServerloginFlg: Bool) -> UIViewController { + let viewController = storyboard(addServerloginFlg: addServerloginFlg) viewController.inject( presenter: LoginPresenterImpl( view: viewController, @@ -27,15 +27,14 @@ struct LoginBuilderImpl: LoginBuilder { return viewController } - func loginStoryboard() -> LoginViewController { - return storyboard() - } } extension LoginBuilderImpl { - private func storyboard() -> LoginViewController { + private func storyboard(addServerloginFlg: Bool) -> LoginViewController { let storyboard = mainStoryboard() - let viewController = storyboard.instantiateViewController(withIdentifier: identifier) as! LoginViewController + let viewController = storyboard.instantiateViewController(identifier: identifier){ coder in + LoginViewController(coder: coder, addServerloginFlg: addServerloginFlg) + } return viewController } diff --git a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift index 4e9c58b..37e45d7 100644 --- a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift +++ b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift @@ -35,11 +35,22 @@ class LoginViewController: UIViewController { @IBOutlet private var qrCodeReadView: UIView! @IBOutlet private var qrCodeStartupButton: UIButton! @IBOutlet private var scrollViewBottomConstraint: NSLayoutConstraint! + //サーバー追加画面フラグ + public var addServerloginFlg: Bool private let activityIndicator = UIActivityIndicatorView(style: .whiteLarge) private var presenter: LoginPresenter! + init?(coder: NSCoder, addServerloginFlg: Bool){ + self.addServerloginFlg = addServerloginFlg + super.init(coder: coder) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + private var serverHost: String? { guard let server = serverTextField.text else { return nil } return server @@ -58,29 +69,30 @@ class LoginViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - - //ログイン画面が表示されると通知を取得しない - - self.devcie { result in - switch result { - case .success: - break - case .failure(let error): - log.e(error) + //サーバー追加画面の場合は認証情報を削除しない + if !addServerloginFlg { + //ログイン画面が表示されると通知を取得しない + self.devcie { result in + switch result { + case .success: + break + case .failure(let error): + log.e(error) + } } - } - //認証情報削除 - KeychainDataStore().removeOAuthState() - KeychainDataStore().removeAccessToken() - KeychainDataStore().removeSessionID() - KeychainDataStore().removeServerName() - KeychainDataStore().removeLanguage() - KeychainDataStore().removeDeviceID() - - //ウィジェットの更新 - if #available(iOS 14.0, *) { - WidgetCenter.shared.reloadAllTimelines() + //認証情報削除 + KeychainDataStore().removeOAuthState() + KeychainDataStore().removeAccessToken() + KeychainDataStore().removeSessionID() + KeychainDataStore().removeServerName() + KeychainDataStore().removeLanguage() + KeychainDataStore().removeDeviceID() + + //ウィジェットの更新 + if #available(iOS 14.0, *) { + WidgetCenter.shared.reloadAllTimelines() + } } clientCertificateSettingView.isHidden = (CertificateDataStore().readClientCertificate() == nil) @@ -88,10 +100,12 @@ class LoginViewController: UIViewController { setupFixedWording() //保存されたサーバー名・コンテキストパスの取得 - let server = Configuration.shared.awServer - let context = Configuration.shared.awContextPath - serverTextField.text = server - contextTextField.text = context + if !addServerloginFlg { + let server = Configuration.shared.awServer + let context = Configuration.shared.awContextPath + serverTextField.text = server + contextTextField.text = context + } loginButton.isEnabled = isTextFieldValue() view.addSubview(activityIndicator) @@ -169,6 +183,15 @@ class LoginViewController: UIViewController { guard let context = context else { return } disableLogin() +/* + //サーバー切り替え + if let serverId = UserDefaultsDataStore().serchEmptyServerData() { + KeychainDataStore().setGroupId(serverNumber: serverId) + } else { + //TODO: サーバー追加できない場合 + } + */ + //サーバー名コンテキストパスの保存 KeychainDataStore().writeServerURL(serverURL: serverHost) KeychainDataStore().writeContextPath(contextPath: context) @@ -212,6 +235,7 @@ class LoginViewController: UIViewController { KeychainDataStore().writeSessionID(sessionID: response.sessionId) KeychainDataStore().writeServerName(serverName: "サーバー識別名") //TODO response.server.name DispatchQueue.main.async { + //UserDefaultsDataStore().addServerList() //メイン画面表示 AppDelegate.shared.rootViewController.switchToMainScreen() } diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift index 6327480..495d92e 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift +++ b/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift @@ -13,7 +13,7 @@ class MordalViewController: UIViewController { @IBOutlet private var accessPoint: UILabel! @IBOutlet private var addServer: UIButton! - let navVC = UINavigationController(rootViewController: LoginBuilderImpl().loginStoryboard()) + let navVC = UINavigationController(rootViewController: LoginBuilderImpl().build(addServerloginFlg: true)) @objc func cancelTapped(_ sender: UIBarButtonItem) { navVC.dismiss(animated: true) @@ -22,7 +22,6 @@ class MordalViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() accessPoint.text = getDisplayString(key: "ServerTitle", comment: "") - // Do any additional setup after loading the view. } static func fromStoryboard(_ storyboard: UIStoryboard = UIStoryboard(name: "ServerSwitchingViewController", bundle: nil)) -> MordalViewController { diff --git a/AgileWorks/Common/DataStore/KeychainDataStore.swift b/AgileWorks/Common/DataStore/KeychainDataStore.swift index 3529ac1..e6fdd1c 100644 --- a/AgileWorks/Common/DataStore/KeychainDataStore.swift +++ b/AgileWorks/Common/DataStore/KeychainDataStore.swift @@ -12,7 +12,9 @@ import UIKit final class KeychainDataStore: DataStoreProtocol { private let service = "AgileWorks" - private let groupId = Bundle.main.object(forInfoDictionaryKey: "AppIdentifierPrefix") as! String + Configuration.shared.awShareBundleIdentifier + private let baseGroupId = Bundle.main.object(forInfoDictionaryKey: "AppIdentifierPrefix") as! String + Configuration.shared.awShareBundleIdentifier + //private var groupId: String = "" + private var groupId: String = Bundle.main.object(forInfoDictionaryKey: "AppIdentifierPrefix") as! String + Configuration.shared.awShareBundleIdentifier private let kAccessToken: String = "AccessToken" private let kOAuthState: String = "OAuthState" private let kLanguage: String = "Localizable" @@ -22,6 +24,10 @@ final class KeychainDataStore: DataStoreProtocol { private let kSessionID: String = "SessionID" private let kServerName: String = "ServerName" + func setGroupId(serverNumber: Int) { + groupId = baseGroupId + String(serverNumber) + } + // アクセストークンの書き込み func writeAccessToken(accessToken: String) { setKeychainValue(key: kAccessToken, value: accessToken) diff --git a/AgileWorks/Common/DataStore/UserDefaultsDataStore.swift b/AgileWorks/Common/DataStore/UserDefaultsDataStore.swift index 1e39b58..4c53b66 100644 --- a/AgileWorks/Common/DataStore/UserDefaultsDataStore.swift +++ b/AgileWorks/Common/DataStore/UserDefaultsDataStore.swift @@ -17,6 +17,9 @@ final class UserDefaultsDataStore: DataStoreProtocol { private let kFirebaseRemovalKey: String = "FirebaseRemoval" private let kLastAcceptedLicenseVersionKey: String = "LastAppceptedLicenseVersion" private let kUpdateWidgetFlgKey : String = "UpdateWidgetFlg" + private let kServerListkey: String = "ServerList" + + private let severCount = 5 init() { sharedDefaults = UserDefaults() @@ -41,17 +44,69 @@ final class UserDefaultsDataStore: DataStoreProtocol { func readLastAcceptedLicenseVersion() -> Int? { return sharedDefaults.integer(forKey: kLastAcceptedLicenseVersionKey) } - + //ウィジェット更新フラグ func writeUpdateWidgetFlg(update: Bool) { sharedDefaults.set(update, forKey: kUpdateWidgetFlgKey) } - + func readUpdateWidgetFlg() -> Bool? { return sharedDefaults.bool(forKey: kUpdateWidgetFlgKey) } - + func removeUpdateWidgetFlg(update: Bool) { sharedDefaults.removeObject(forKey: kUpdateWidgetFlgKey) } + + //接続先サーバー管理 + func writeServerList(list: [Int]) { + sharedDefaults.set(list, forKey: kServerListkey) + } + + func readServerList() -> [Int] { + if let serverList = sharedDefaults.array(forKey: kServerListkey) as? [Int] { + return serverList + } + return [] + } + + func removeServer() { + var serverList = readServerList() + if !serverList.isEmpty { + //先頭(ログアウト処理を行ったサーバー)をリストから削除 + serverList.removeFirst() + writeServerList(list: serverList) + } + } + + //サーバー接続先を保存できる識別番号を探す + func serchEmptyServerData() -> Int? { + var serverList = readServerList() + for num in 0 ..< severCount { + if serverList.contains(num) { + return num + } + } + return nil + } + + //サーバー追加 + func addServerList() { + var serverList = readServerList() + if let serverNumber = serchEmptyServerData() { + serverList.insert(serverNumber, at: 0) + writeServerList(list: serverList) + } + } + + //サーバー並び替え + func changeServerList(firstServer: Int) { + var serverList = readServerList() + if serverList.contains(firstServer) { + //要素を削除してから先頭に追加する + serverList.removeAll(where: { $0 == firstServer }) + serverList.insert(firstServer, at: 0) + writeServerList(list: serverList) + } + } } -- GitLab From b98cbbeabdfd0bf2dd5572c16280af50db87e498 Mon Sep 17 00:00:00 2001 From: Azuma Kasumi Date: Wed, 24 May 2023 16:06:41 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=E3=82=AD=E3=83=BC=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=BC=E3=83=B3=E3=81=AE=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AgileWorks-Production.entitlements | 6 ++- .../AgileWorks/App/RootViewController.swift | 16 +++----- .../Login/View/LoginViewController.swift | 9 ++--- .../View/MordalViewController.swift | 3 ++ .../ServerSwitchingTableViewController.swift | 39 ++++++++++++++----- .../View/MenuTableViewController.swift | 2 +- .../WebView/View/WebViewController.swift | 2 +- .../Common/DataStore/KeychainDataStore.swift | 21 +++++----- .../DataStore/UserDefaultsDataStore.swift | 22 ++++++++++- 9 files changed, 78 insertions(+), 42 deletions(-) diff --git a/AgileWorks/AgileWorks/AgileWorks-Production.entitlements b/AgileWorks/AgileWorks/AgileWorks-Production.entitlements index 6f5ee78..4db9e2b 100644 --- a/AgileWorks/AgileWorks/AgileWorks-Production.entitlements +++ b/AgileWorks/AgileWorks/AgileWorks-Production.entitlements @@ -6,7 +6,11 @@ development keychain-access-groups - $(AppIdentifierPrefix)jp.atled.AgileWorks + $(AppIdentifierPrefix)jp.atled.agileworks0 + $(AppIdentifierPrefix)jp.atled.agileworks1 + $(AppIdentifierPrefix)jp.atled.agileworks2 + $(AppIdentifierPrefix)jp.atled.agileworks3 + $(AppIdentifierPrefix)jp.atled.agileworks4 diff --git a/AgileWorks/AgileWorks/App/RootViewController.swift b/AgileWorks/AgileWorks/App/RootViewController.swift index 0ce909d..a26249a 100644 --- a/AgileWorks/AgileWorks/App/RootViewController.swift +++ b/AgileWorks/AgileWorks/App/RootViewController.swift @@ -55,7 +55,7 @@ extension RootViewController { } // ログアウトアラート デフォルトボタンアクション生成 - func logoutDefaultAction(title: String) -> UIAlertAction { + func logoutDefaultAction(serverRemove: Bool, title: String) -> UIAlertAction { let defaultAction = UIAlertAction(title: title, style: .default) { _ in self.logout { result in switch result { @@ -71,15 +71,10 @@ extension RootViewController { KeychainDataStore().removeLanguage() KeychainDataStore().removeDeviceID() - DispatchQueue.main.async { - self.switchToLogout() - //ウィジェットの更新 - if #available(iOS 14.0, *) { - WidgetCenter.shared.reloadAllTimelines() - } + if serverRemove { + UserDefaultsDataStore().removeServer() } - /* - UserDefaultsDataStore().removeServer() + let serverList = UserDefaultsDataStore().readServerList() if serverList.isEmpty { DispatchQueue.main.async { @@ -90,7 +85,7 @@ extension RootViewController { } } } else { - KeychainDataStore().setGroupId(serverNumber: serverList.first!) + UserDefaultsDataStore().setGroupId(serverNumber: serverList.first!) DispatchQueue.main.async { self.switchToMainScreen() //ウィジェットの更新 @@ -99,7 +94,6 @@ extension RootViewController { } } } - */ } } diff --git a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift index 37e45d7..07e9acd 100644 --- a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift +++ b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift @@ -183,14 +183,13 @@ class LoginViewController: UIViewController { guard let context = context else { return } disableLogin() -/* + //サーバー切り替え if let serverId = UserDefaultsDataStore().serchEmptyServerData() { - KeychainDataStore().setGroupId(serverNumber: serverId) + UserDefaultsDataStore().setGroupId(serverNumber: serverId) } else { //TODO: サーバー追加できない場合 } - */ //サーバー名コンテキストパスの保存 KeychainDataStore().writeServerURL(serverURL: serverHost) @@ -235,7 +234,7 @@ class LoginViewController: UIViewController { KeychainDataStore().writeSessionID(sessionID: response.sessionId) KeychainDataStore().writeServerName(serverName: "サーバー識別名") //TODO response.server.name DispatchQueue.main.async { - //UserDefaultsDataStore().addServerList() + UserDefaultsDataStore().addServerList() //メイン画面表示 AppDelegate.shared.rootViewController.switchToMainScreen() } @@ -326,7 +325,7 @@ class LoginViewController: UIViewController { let message = getLocalizableStrings(key: "LoginErrorMessage", comment: "") let defaultAction: UIAlertAction if isLogout { - defaultAction = AppDelegate.shared.rootViewController.logoutDefaultAction(title: getLocalizableStrings(key: "OK", comment: "")) + defaultAction = AppDelegate.shared.rootViewController.logoutDefaultAction(serverRemove: false, title: getLocalizableStrings(key: "OK", comment: "")) } else { defaultAction = UIAlertAction(title: getLocalizableStrings(key: "OK", comment: ""), style: .default, handler: nil) } diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift index 495d92e..468fa9b 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift +++ b/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift @@ -19,6 +19,9 @@ class MordalViewController: UIViewController { navVC.dismiss(animated: true) } + func cancel() { + navVC.dismiss(animated: true) + } override func viewDidLoad() { super.viewDidLoad() accessPoint.text = getDisplayString(key: "ServerTitle", comment: "") diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift index 54764d3..f7a35d5 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift +++ b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift @@ -10,14 +10,32 @@ import UIKit class ServerSwitchingTableTableViewController: UITableViewController { @IBOutlet var table: UITableView! - + var serverList: [Int] = [] + override func viewDidLoad() { super.viewDidLoad() + serverList = UserDefaultsDataStore().readServerList() table.tableFooterView = UIView() } - + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + //承認待ち件数の表示 + Task{ + for row in 1.. Int { // #warning Incomplete implementation, return the number of sections return 1 @@ -25,14 +43,15 @@ class ServerSwitchingTableTableViewController: UITableViewController { //セルの数 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of rows - return 1 + return serverList.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ServerSwitchingTableViewCell", for: indexPath) let serverName = cell.viewWithTag(1) as! UILabel - serverName.text = KeychainDataStore().readServerName() + let serverNumber = serverList[indexPath.row] + serverName.text = KeychainDataStore().readServerName(serverNumber: serverNumber) let badgeIcon = cell.viewWithTag(2) as! UIImageView badgeIcon.image = UIImage(systemName: "circle.fill", withConfiguration: UIImage.SymbolConfiguration(font: .systemFont(ofSize: 25))) @@ -45,19 +64,19 @@ class ServerSwitchingTableTableViewController: UITableViewController { badgeIcon.tintColor = UIColor(named: getDisplayString(key: "MainColor", comment: "")) //承認待ち件数は取得しないため非表示 approvalCount.isHidden = true - } else {//その他サーバー - setApprovalsCount(label: approvalCount) } return cell } - + override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 50 } - + private func callApprovalCount(label: UILabel) async{ + await setApprovalsCount(label: label) + } //承認待ち件数取得 - private func setApprovalsCount(label: UILabel){ + private func setApprovalsCount(label: UILabel) async { let approvalsEndpoint = GetApprovalsEndpoint() Session.send(approvalsEndpoint) { result in diff --git a/AgileWorks/AgileWorks/WebView/View/MenuTableViewController.swift b/AgileWorks/AgileWorks/WebView/View/MenuTableViewController.swift index 368a19e..c487fbf 100644 --- a/AgileWorks/AgileWorks/WebView/View/MenuTableViewController.swift +++ b/AgileWorks/AgileWorks/WebView/View/MenuTableViewController.swift @@ -79,7 +79,7 @@ class MenuTableViewController: UITableViewController { private func logout() { // ログアウトタップ時処理 let message = getDisplayString(key: "LogoutConfirm", comment: "") - let defaultAction = AppDelegate.shared.rootViewController.logoutDefaultAction(title: getDisplayString(key: "YES", comment: "")) + let defaultAction = AppDelegate.shared.rootViewController.logoutDefaultAction(serverRemove: true, title: getDisplayString(key: "YES", comment: "")) let cancelAction = UIAlertAction(title: getDisplayString(key: "NO", comment: ""), style: .cancel) { _ in if let indexPath = self.tableView.indexPath(for: self.logoutCell) { self.tableView.deselectRow(at: indexPath, animated: true) diff --git a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift index fe9d431..eabd361 100644 --- a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift +++ b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift @@ -262,7 +262,7 @@ class WebViewController: UIViewController { DispatchQueue.main.async { let title = getDisplayString(key: "RefreshTokenUpdateErrorTitle", comment: "") let message = getDisplayString(key: "RefreshTokenUpdateError", comment: "") - let defaultAction = AppDelegate.shared.rootViewController.logoutDefaultAction(title: getDisplayString(key: "OK", comment: "")) + let defaultAction = AppDelegate.shared.rootViewController.logoutDefaultAction(serverRemove: true, title: getDisplayString(key: "OK", comment: "")) AppDelegate.shared.rootViewController.showAlertScreen(view: self, title: title, message: message, defaultAction: defaultAction, cancelAction: nil) } // その他エラーの場合 diff --git a/AgileWorks/Common/DataStore/KeychainDataStore.swift b/AgileWorks/Common/DataStore/KeychainDataStore.swift index e6fdd1c..0e2a3b1 100644 --- a/AgileWorks/Common/DataStore/KeychainDataStore.swift +++ b/AgileWorks/Common/DataStore/KeychainDataStore.swift @@ -12,9 +12,6 @@ import UIKit final class KeychainDataStore: DataStoreProtocol { private let service = "AgileWorks" - private let baseGroupId = Bundle.main.object(forInfoDictionaryKey: "AppIdentifierPrefix") as! String + Configuration.shared.awShareBundleIdentifier - //private var groupId: String = "" - private var groupId: String = Bundle.main.object(forInfoDictionaryKey: "AppIdentifierPrefix") as! String + Configuration.shared.awShareBundleIdentifier private let kAccessToken: String = "AccessToken" private let kOAuthState: String = "OAuthState" private let kLanguage: String = "Localizable" @@ -24,10 +21,6 @@ final class KeychainDataStore: DataStoreProtocol { private let kSessionID: String = "SessionID" private let kServerName: String = "ServerName" - func setGroupId(serverNumber: Int) { - groupId = baseGroupId + String(serverNumber) - } - // アクセストークンの書き込み func writeAccessToken(accessToken: String) { setKeychainValue(key: kAccessToken, value: accessToken) @@ -45,7 +38,7 @@ final class KeychainDataStore: DataStoreProtocol { // 認可ステータスの書き込み func writeOAuthState(authState: OIDAuthState) { - let keychain = Keychain(service: service, accessGroup: groupId) + let keychain = Keychain(service: service, accessGroup: UserDefaultsDataStore().readGroupId()!) guard let object = try? NSKeyedArchiver.archivedData(withRootObject: authState, requiringSecureCoding: true) else { return } @@ -54,7 +47,7 @@ final class KeychainDataStore: DataStoreProtocol { // 認可ステータスの読み込み func readOAuthState() -> OIDAuthState? { - let keychain = Keychain(service: service, accessGroup: groupId) + let keychain = Keychain(service: service, accessGroup: UserDefaultsDataStore().readGroupId()!) if let object = keychain[data: kOAuthState] { guard let authState = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(object) as? OIDAuthState else { return nil @@ -159,6 +152,10 @@ final class KeychainDataStore: DataStoreProtocol { func readServerName() -> String? { return getKeychainValue(key: kServerName) } + func readServerName(serverNumber: Int) -> String? { + let keychain = Keychain(service: service, accessGroup: UserDefaultsDataStore().readBaseGroupId() + String(serverNumber)) + return keychain[kServerName] + } // サーバー識別名の削除 func removeServerName() { @@ -167,17 +164,17 @@ final class KeychainDataStore: DataStoreProtocol { // KeyChain へ指定の値をセット private func setKeychainValue(key: String, value: String) { - let keychain = Keychain(service: service, accessGroup: groupId) + let keychain = Keychain(service: service, accessGroup: UserDefaultsDataStore().readGroupId()!) keychain[key] = value } // KeyChain から指定の値を取得 private func getKeychainValue(key: String) -> String? { - let keychain = Keychain(service: service, accessGroup: groupId) + let keychain = Keychain(service: service, accessGroup: UserDefaultsDataStore().readGroupId()!) return keychain[key] } // KeyChain から指定の値を削除 private func removeKeychainValue(key: String) { - let keychain = Keychain(service: service, accessGroup: groupId) + let keychain = Keychain(service: service, accessGroup: UserDefaultsDataStore().readGroupId()!) do { try keychain.remove(key) } catch { diff --git a/AgileWorks/Common/DataStore/UserDefaultsDataStore.swift b/AgileWorks/Common/DataStore/UserDefaultsDataStore.swift index 4c53b66..7c62120 100644 --- a/AgileWorks/Common/DataStore/UserDefaultsDataStore.swift +++ b/AgileWorks/Common/DataStore/UserDefaultsDataStore.swift @@ -18,6 +18,8 @@ final class UserDefaultsDataStore: DataStoreProtocol { private let kLastAcceptedLicenseVersionKey: String = "LastAppceptedLicenseVersion" private let kUpdateWidgetFlgKey : String = "UpdateWidgetFlg" private let kServerListkey: String = "ServerList" + private let kGroupIdkey: String = "GroupId" + private let baseGroupId = Bundle.main.object(forInfoDictionaryKey: "AppIdentifierPrefix") as! String + Configuration.shared.awShareBundleIdentifier private let severCount = 5 @@ -82,8 +84,11 @@ final class UserDefaultsDataStore: DataStoreProtocol { //サーバー接続先を保存できる識別番号を探す func serchEmptyServerData() -> Int? { var serverList = readServerList() + if serverList.isEmpty { + return serverList.count + } for num in 0 ..< severCount { - if serverList.contains(num) { + if !serverList.contains(num) { return num } } @@ -109,4 +114,19 @@ final class UserDefaultsDataStore: DataStoreProtocol { writeServerList(list: serverList) } } + + func setGroupId(serverNumber: Int) { + sharedDefaults.set(baseGroupId + String(serverNumber), forKey: kGroupIdkey) + } + func readGroupId() -> String? { + if let groupId = sharedDefaults.string(forKey: kGroupIdkey) as? String{ + return groupId + }else { + setGroupId(serverNumber: 0) + return sharedDefaults.string(forKey: kGroupIdkey) + } + } + func readBaseGroupId() -> String { + return baseGroupId + } } -- GitLab From 72bc947e097a1bf0cbd06096e82739a776d78edb Mon Sep 17 00:00:00 2001 From: Azuma Kasumi Date: Mon, 29 May 2023 16:42:47 +0900 Subject: [PATCH 4/6] =?UTF-8?q?=E3=82=B5=E3=83=BC=E3=83=90=E3=83=BC?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=83=BB=E3=83=AD=E3=82=B0=E3=82=A2=E3=82=A6?= =?UTF-8?q?=E3=83=88=20=E6=AD=A3=E5=B8=B8=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AgileWorks/AgileWorks/Login/View/LoginViewController.swift | 2 ++ .../ServerSwitching/View/MordalViewController.swift | 2 ++ .../View/ServerSwitchingTableViewController.swift | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift index 07e9acd..7b82f00 100644 --- a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift +++ b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift @@ -235,6 +235,8 @@ class LoginViewController: UIViewController { KeychainDataStore().writeServerName(serverName: "サーバー識別名") //TODO response.server.name DispatchQueue.main.async { UserDefaultsDataStore().addServerList() + let serverList = UserDefaultsDataStore().readServerList() + UserDefaultsDataStore().setGroupId(serverNumber: serverList.first!) //メイン画面表示 AppDelegate.shared.rootViewController.switchToMainScreen() } diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift index 468fa9b..bc7b78a 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift +++ b/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift @@ -16,6 +16,8 @@ class MordalViewController: UIViewController { let navVC = UINavigationController(rootViewController: LoginBuilderImpl().build(addServerloginFlg: true)) @objc func cancelTapped(_ sender: UIBarButtonItem) { + var serverList = UserDefaultsDataStore().readServerList() + UserDefaultsDataStore().setGroupId(serverNumber: serverList.first!) navVC.dismiss(animated: true) } diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift index f7a35d5..265e158 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift +++ b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift @@ -23,14 +23,14 @@ class ServerSwitchingTableTableViewController: UITableViewController { //承認待ち件数の表示 Task{ for row in 1.. Date: Tue, 30 May 2023 20:27:50 +0900 Subject: [PATCH 5/6] =?UTF-8?q?navigationViewController=E3=81=AE=E8=A6=8B?= =?UTF-8?q?=E7=9B=B4=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AgileWorks/App/RootViewController.swift | 4 +-- .../Login/Builder/LoginBuilder.swift | 18 +++++++------ .../Login/View/LoginViewController.swift | 25 +++++++++++-------- .../View/MordalViewController.swift | 15 +---------- .../ServerSwitchingTableViewController.swift | 9 ++++++- 5 files changed, 37 insertions(+), 34 deletions(-) diff --git a/AgileWorks/AgileWorks/App/RootViewController.swift b/AgileWorks/AgileWorks/App/RootViewController.swift index a26249a..ace6f96 100644 --- a/AgileWorks/AgileWorks/App/RootViewController.swift +++ b/AgileWorks/AgileWorks/App/RootViewController.swift @@ -40,7 +40,7 @@ class RootViewController: UIViewController { extension RootViewController { func showLoginScreen() { - let new = LoginBuilderImpl().build(addServerloginFlg: false) + let new = LoginBuilderImpl().build() addChild(new) new.view.frame = view.bounds @@ -120,7 +120,7 @@ extension RootViewController { } func switchToLogout() { - let new = LoginBuilderImpl().build(addServerloginFlg: false) + let new = LoginBuilderImpl().build() animateDismissTransition(to: new) } diff --git a/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift b/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift index 42d56a5..54a3c59 100644 --- a/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift +++ b/AgileWorks/AgileWorks/Login/Builder/LoginBuilder.swift @@ -9,14 +9,15 @@ import UIKit protocol LoginBuilder { - func build(addServerloginFlg: Bool) -> UIViewController + func build() -> UIViewController } struct LoginBuilderImpl: LoginBuilder { let identifier = "LoginViewController" + var navVC: UINavigationController? = nil - func build(addServerloginFlg: Bool) -> UIViewController { - let viewController = storyboard(addServerloginFlg: addServerloginFlg) + func build() -> UIViewController { + let viewController = storyboard() viewController.inject( presenter: LoginPresenterImpl( view: viewController, @@ -27,14 +28,17 @@ struct LoginBuilderImpl: LoginBuilder { return viewController } + func naviBuild() -> UINavigationController { + let navVC = UINavigationController(rootViewController: build()) + navVC.modalPresentationStyle = .fullScreen + return navVC + } } extension LoginBuilderImpl { - private func storyboard(addServerloginFlg: Bool) -> LoginViewController { + private func storyboard() -> LoginViewController { let storyboard = mainStoryboard() - let viewController = storyboard.instantiateViewController(identifier: identifier){ coder in - LoginViewController(coder: coder, addServerloginFlg: addServerloginFlg) - } + let viewController = storyboard.instantiateViewController(withIdentifier: identifier) as! LoginViewController return viewController } diff --git a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift index 7b82f00..3b23efb 100644 --- a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift +++ b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift @@ -36,21 +36,12 @@ class LoginViewController: UIViewController { @IBOutlet private var qrCodeStartupButton: UIButton! @IBOutlet private var scrollViewBottomConstraint: NSLayoutConstraint! //サーバー追加画面フラグ - public var addServerloginFlg: Bool + private var addServerloginFlg = false private let activityIndicator = UIActivityIndicatorView(style: .whiteLarge) private var presenter: LoginPresenter! - init?(coder: NSCoder, addServerloginFlg: Bool){ - self.addServerloginFlg = addServerloginFlg - super.init(coder: coder) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - private var serverHost: String? { guard let server = serverTextField.text else { return nil } return server @@ -69,6 +60,11 @@ class LoginViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + if let navVC = self.parent as? UINavigationController { + addServerloginFlg = true + let leftButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelTapped(_:))) + navVC.navigationBar.topItem!.leftBarButtonItem = leftButton + } //サーバー追加画面の場合は認証情報を削除しない if !addServerloginFlg { //ログイン画面が表示されると通知を取得しない @@ -129,6 +125,12 @@ class LoginViewController: UIViewController { func dismissKeyboard() { self.view.endEditing(true) } + + @objc private func cancelTapped(_ sender: UIBarButtonItem) { + var serverList = UserDefaultsDataStore().readServerList() + UserDefaultsDataStore().setGroupId(serverNumber: serverList.first!) + self.parent!.dismiss(animated: true) + } //ログイン画面の固定文言表示 private func setupFixedWording() { @@ -239,6 +241,9 @@ class LoginViewController: UIViewController { UserDefaultsDataStore().setGroupId(serverNumber: serverList.first!) //メイン画面表示 AppDelegate.shared.rootViewController.switchToMainScreen() + if let nc = self.parent as? UINavigationController { + nc.dismiss(animated: true) + } } // セッション情報取得失敗 case .failure(let error): diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift index bc7b78a..a67e42a 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift +++ b/AgileWorks/AgileWorks/ServerSwitching/View/MordalViewController.swift @@ -13,17 +13,6 @@ class MordalViewController: UIViewController { @IBOutlet private var accessPoint: UILabel! @IBOutlet private var addServer: UIButton! - let navVC = UINavigationController(rootViewController: LoginBuilderImpl().build(addServerloginFlg: true)) - - @objc func cancelTapped(_ sender: UIBarButtonItem) { - var serverList = UserDefaultsDataStore().readServerList() - UserDefaultsDataStore().setGroupId(serverNumber: serverList.first!) - navVC.dismiss(animated: true) - } - - func cancel() { - navVC.dismiss(animated: true) - } override func viewDidLoad() { super.viewDidLoad() accessPoint.text = getDisplayString(key: "ServerTitle", comment: "") @@ -35,9 +24,7 @@ class MordalViewController: UIViewController { } @IBAction private func addServerTapped(_ sender: Any) { //モーダルの表示 - navVC.modalPresentationStyle = .fullScreen - let leftButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelTapped(_:))) - navVC.navigationBar.topItem!.leftBarButtonItem = leftButton + let navVC = LoginBuilderImpl().naviBuild() self.present(navVC, animated: true) } } diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift index 265e158..b390be1 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift +++ b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift @@ -72,6 +72,11 @@ class ServerSwitchingTableTableViewController: UITableViewController { override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 50 } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + UserDefaultsDataStore().setGroupId(serverNumber: serverList[indexPath.row]) + AppDelegate.shared.rootViewController.switchToMainScreen() + } private func callApprovalCount(label: UILabel) async{ await setApprovalsCount(label: label) } @@ -92,7 +97,9 @@ class ServerSwitchingTableTableViewController: UITableViewController { } case .failure(let error): log.e(error) - label.text = "0" + DispatchQueue.main.async { + label.text = "0" + } } } } -- GitLab From 7c362b1d067fac3f6d1bf441d81f89934021f083 Mon Sep 17 00:00:00 2001 From: Azuma Kasumi Date: Fri, 2 Jun 2023 13:12:49 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=80=E3=83=AB?= =?UTF-8?q?=E3=82=92=E9=96=89=E3=81=98=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Login/View/LoginViewController.swift | 4 +-- .../ServerSwitchingTableViewController.swift | 29 ++++++++++++------- .../View/ServerSwitchingViewController.swift | 4 +-- .../WebView/View/MenuViewController.swift | 2 +- .../Common/DataStore/KeychainDataStore.swift | 3 +- 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift index 3b23efb..58e6da2 100644 --- a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift +++ b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift @@ -129,7 +129,7 @@ class LoginViewController: UIViewController { @objc private func cancelTapped(_ sender: UIBarButtonItem) { var serverList = UserDefaultsDataStore().readServerList() UserDefaultsDataStore().setGroupId(serverNumber: serverList.first!) - self.parent!.dismiss(animated: true) + self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil) } //ログイン画面の固定文言表示 @@ -242,7 +242,7 @@ class LoginViewController: UIViewController { //メイン画面表示 AppDelegate.shared.rootViewController.switchToMainScreen() if let nc = self.parent as? UINavigationController { - nc.dismiss(animated: true) + self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil) } } // セッション情報取得失敗 diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift index b390be1..f540c2b 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift +++ b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingTableViewController.swift @@ -10,11 +10,9 @@ import UIKit class ServerSwitchingTableTableViewController: UITableViewController { @IBOutlet var table: UITableView! - var serverList: [Int] = [] override func viewDidLoad() { super.viewDidLoad() - serverList = UserDefaultsDataStore().readServerList() table.tableFooterView = UIView() } @@ -22,14 +20,15 @@ class ServerSwitchingTableTableViewController: UITableViewController { super.viewWillAppear(animated) //承認待ち件数の表示 Task{ - for row in 1.. Int { - // #warning Incomplete implementation, return the number of sections return 1 } //セルの数 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - // #warning Incomplete implementation, return the number of rows - return serverList.count + let serverCount = UserDefaultsDataStore().readServerList().count + return serverCount } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ServerSwitchingTableViewCell", for: indexPath) + let serverList = UserDefaultsDataStore().readServerList() let serverName = cell.viewWithTag(1) as! UILabel let serverNumber = serverList[indexPath.row] serverName.text = KeychainDataStore().readServerName(serverNumber: serverNumber) @@ -72,18 +71,28 @@ class ServerSwitchingTableTableViewController: UITableViewController { override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 50 } - + + //セル選択時の処理 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - UserDefaultsDataStore().setGroupId(serverNumber: serverList[indexPath.row]) + if indexPath.row == 0 { + self.dismiss(animated: true, completion: nil) + return + } + let serverList = UserDefaultsDataStore().readServerList() + let server = serverList[indexPath.row] + UserDefaultsDataStore().setGroupId(serverNumber: server) + UserDefaultsDataStore().changeServerList(firstServer: server) AppDelegate.shared.rootViewController.switchToMainScreen() + self.parent!.dismiss(animated: true) } + private func callApprovalCount(label: UILabel) async{ await setApprovalsCount(label: label) } + //承認待ち件数取得 private func setApprovalsCount(label: UILabel) async { let approvalsEndpoint = GetApprovalsEndpoint() - Session.send(approvalsEndpoint) { result in var reqApprovalCount: Int = 0 switch result { diff --git a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingViewController.swift b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingViewController.swift index 3ebe6b9..652e871 100644 --- a/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingViewController.swift +++ b/AgileWorks/AgileWorks/ServerSwitching/View/ServerSwitchingViewController.swift @@ -29,9 +29,9 @@ class ServerSwitchingViewController: UIViewController, UIGestureRecognizerDelega fpc.surfaceView.cornerRadius = 24.0 //下スワイプで閉じる fpc.isRemovalInteractionEnabled = true - let mordalVC = MordalViewController.fromStoryboard() + let modalVC = MordalViewController.fromStoryboard() self.view.addSubview(fpc.view) - fpc.set(contentViewController: mordalVC) + fpc.set(contentViewController: modalVC) fpc.addPanel(toParent: self) } diff --git a/AgileWorks/AgileWorks/WebView/View/MenuViewController.swift b/AgileWorks/AgileWorks/WebView/View/MenuViewController.swift index 20add4e..0129ea3 100644 --- a/AgileWorks/AgileWorks/WebView/View/MenuViewController.swift +++ b/AgileWorks/AgileWorks/WebView/View/MenuViewController.swift @@ -67,7 +67,7 @@ class MenuViewController: UIViewController { switch result { case .success(let response): let userName = response.user.name - let serverName = "サーバー識別名" //TODO response.server.name + let serverName = KeychainDataStore().readServerURL()! //TODO response.server.name let sessionId = response.sessionId DispatchQueue.main.async { self.nameLabel.text = userName diff --git a/AgileWorks/Common/DataStore/KeychainDataStore.swift b/AgileWorks/Common/DataStore/KeychainDataStore.swift index 0e2a3b1..b3e7a6c 100644 --- a/AgileWorks/Common/DataStore/KeychainDataStore.swift +++ b/AgileWorks/Common/DataStore/KeychainDataStore.swift @@ -154,7 +154,8 @@ final class KeychainDataStore: DataStoreProtocol { } func readServerName(serverNumber: Int) -> String? { let keychain = Keychain(service: service, accessGroup: UserDefaultsDataStore().readBaseGroupId() + String(serverNumber)) - return keychain[kServerName] + //return keychain[kServerName] //TODO: サーバー識別名 + return keychain[kServerURL] } // サーバー識別名の削除 -- GitLab