Rename screens (#826)

* Rename: AnalyticsPrompt -> AnalyticsPromptScreen

* Rename: AnalyticsSettings -> AnalyticsSettingsScreen

* Rename: Settings -> SettingsScreen

* Rename: SessionVerification -> SessionVerificationScreen

* Rename: BugReport -> BugReportScreen

* Rename: FilePreview -> FilePreviewScreen

* Rename: AnalyticsPrompt -> AnalyticsPromptScreen

* Rename: Invites -> InvitesScreen

* Rename: InviteUsers -> InviteUsersScreen

* Rename: MediaPicker -> MediaPickerScreen

* Delete unused UIActivityViewControllerWrapper

* Rename: ReportContent -> ReportContentScreen

* Rename: RoomDetails -> RoomDetailsScreen

* Rename: RoomMemberDetails -> RoomMemberDetailsScreen

* Rename: RoomMemberList -> RoomMemberListScreen

* Rename: Cleanup

* Renaming missed items

* Low effort attempt at fixing the flakey unit tests
This commit is contained in:
Stefan Ceriu
2023-04-24 18:48:07 +03:00
committed by GitHub
parent 9911ad2b9b
commit 24572c6582
88 changed files with 492 additions and 520 deletions
@@ -0,0 +1,86 @@
//
// Copyright 2023 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import SwiftUI
enum CameraPickerAction {
case selectFile(URL)
case cancel
case error(CameraPickerError)
}
enum CameraPickerError: Error {
case invalidJpegData
case invalidOriginalImage
case failedWritingToTemporaryDirectory
}
struct CameraPicker: UIViewControllerRepresentable {
private let callback: (CameraPickerAction) -> Void
init(callback: @escaping (CameraPickerAction) -> Void) {
self.callback = callback
}
func makeUIViewController(context: Context) -> UIImagePickerController {
let imagePicker = UIImagePickerController()
imagePicker.sourceType = .camera
imagePicker.allowsEditing = true
imagePicker.delegate = context.coordinator
if let mediaTypes = UIImagePickerController.availableMediaTypes(for: .camera) {
imagePicker.mediaTypes = mediaTypes
}
return imagePicker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) { }
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
final class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
private var cameraPicker: CameraPicker
init(_ cameraPicker: CameraPicker) {
self.cameraPicker = cameraPicker
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
if let videoURL = info[.mediaURL] as? URL {
cameraPicker.callback(.selectFile(videoURL))
} else if let image = info[.originalImage] as? UIImage {
guard let jpegData = image.jpegData(compressionQuality: 1.0) else {
cameraPicker.callback(.error(.invalidJpegData))
return
}
let fileName = "\(Date.now.formatted(date: .abbreviated, time: .shortened)).jpg"
do {
let url = try FileManager.default.writeDataToTemporaryDirectory(data: jpegData, fileName: fileName)
cameraPicker.callback(.selectFile(url))
} catch {
cameraPicker.callback(.error(.failedWritingToTemporaryDirectory))
}
} else {
cameraPicker.callback(.error(.invalidOriginalImage))
}
}
}
}
@@ -0,0 +1,76 @@
//
// Copyright 2023 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import SwiftUI
enum DocumentPickerAction {
case selectFile(URL)
case cancel
case error(Error)
}
enum DocumentPickerError: Error {
case unknown
}
struct DocumentPicker: UIViewControllerRepresentable {
private let callback: (DocumentPickerAction) -> Void
init(callback: @escaping (DocumentPickerAction) -> Void) {
self.callback = callback
}
func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: [.data])
documentPicker.allowsMultipleSelection = false
documentPicker.delegate = context.coordinator
return documentPicker
}
func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: Context) { }
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
final class Coordinator: NSObject, UIDocumentPickerDelegate {
private var documentPicker: DocumentPicker
init(_ documentPicker: DocumentPicker) {
self.documentPicker = documentPicker
}
// MARK: UIDocumentPickerDelegate
func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
documentPicker.callback(.cancel)
}
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
guard let url = urls.first else {
documentPicker.callback(.error(DocumentPickerError.unknown))
return
}
do {
let newURL = try FileManager.default.copyFileToTemporaryDirectory(file: url)
documentPicker.callback(.selectFile(newURL))
} catch {
documentPicker.callback(.error(error))
}
}
}
}
@@ -0,0 +1,89 @@
//
// Copyright 2023 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import SwiftUI
enum MediaPickerScreenSource {
case camera
case photoLibrary
case documents
}
enum MediaPickerScreenCoordinatorAction {
case selectMediaAtURL(URL)
case cancel
case error(Error?)
}
class MediaPickerScreenCoordinator: CoordinatorProtocol {
private let source: MediaPickerScreenSource
private let callback: ((MediaPickerScreenCoordinatorAction) -> Void)?
init(source: MediaPickerScreenSource, callback: @escaping (MediaPickerScreenCoordinatorAction) -> Void) {
self.source = source
self.callback = callback
}
func toPresentable() -> AnyView {
AnyView(mediaPicker)
}
@ViewBuilder
private var mediaPicker: some View {
switch source {
case .camera:
cameraPicker
case .photoLibrary:
PhotoLibraryPicker { [weak self] action in
switch action {
case .cancel:
self?.callback?(.cancel)
case .error(let error):
self?.callback?(.error(error))
case .selectFile(let url):
self?.callback?(.selectMediaAtURL(url))
}
}
case .documents:
// The document picker automatically dismisses everything on selection
// Strongly retain self in the callback to forward actions correctly
DocumentPicker { action in
switch action {
case .cancel:
self.callback?(.cancel)
case .error(let error):
self.callback?(.error(error))
case .selectFile(let url):
self.callback?(.selectMediaAtURL(url))
}
}
}
}
private var cameraPicker: some View {
CameraPicker { [weak self] action in
switch action {
case .cancel:
self?.callback?(.cancel)
case .error(let error):
self?.callback?(.error(error))
case .selectFile(let url):
self?.callback?(.selectMediaAtURL(url))
}
}
.background(.black, ignoresSafeAreaEdges: .bottom)
}
}
@@ -0,0 +1,84 @@
//
// Copyright 2023 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import PhotosUI
import SwiftUI
enum PhotoLibraryPickerAction {
case selectFile(URL)
case cancel
case error(Error?)
}
struct PhotoLibraryPicker: UIViewControllerRepresentable {
private let callback: (PhotoLibraryPickerAction) -> Void
init(callback: @escaping (PhotoLibraryPickerAction) -> Void) {
self.callback = callback
}
func makeUIViewController(context: Context) -> PHPickerViewController {
var configuration = PHPickerConfiguration(photoLibrary: .shared())
configuration.selectionLimit = 1
let pickerViewController = PHPickerViewController(configuration: configuration)
pickerViewController.delegate = context.coordinator
return pickerViewController
}
func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) { }
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
final class Coordinator: NSObject, PHPickerViewControllerDelegate {
private var photoLibraryPicker: PhotoLibraryPicker
init(_ photoLibraryPicker: PhotoLibraryPicker) {
self.photoLibraryPicker = photoLibraryPicker
}
// MARK: PHPickerViewControllerDelegate
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
guard let provider = results.first?.itemProvider else {
photoLibraryPicker.callback(.cancel)
return
}
provider.loadFileRepresentation(forTypeIdentifier: "public.item") { [weak self] url, error in
guard let url else {
self?.photoLibraryPicker.callback(.error(error))
return
}
do {
let _ = url.startAccessingSecurityScopedResource()
let newURL = try FileManager.default.copyFileToTemporaryDirectory(file: url)
url.stopAccessingSecurityScopedResource()
Task { @MainActor in
self?.photoLibraryPicker.callback(.selectFile(newURL))
}
} catch {
self?.photoLibraryPicker.callback(.error(error))
}
}
}
}
}