Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Crash when opening a folder in bin #1118

Merged
merged 4 commits into from
Feb 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions kDrive/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -384,14 +384,17 @@ final class AppDelegate: UIResponder, UIApplicationDelegate, AccountManagerDeleg

func setRootViewController(_ vc: UIViewController,
animated: Bool = true) {
guard animated, let window else {
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()
guard let window else {
return
}

window.rootViewController = vc
window.makeKeyAndVisible()

guard animated else {
return
}

UIView.transition(with: window, duration: 0.3,
options: .transitionCrossDissolve,
animations: nil,
Expand Down Expand Up @@ -424,9 +427,9 @@ final class AppDelegate: UIResponder, UIApplicationDelegate, AccountManagerDeleg
viewController: fileListViewController)
} else {
let filePresenter = FilePresenter(viewController: fileListViewController)
filePresenter.present(driveFileManager: driveFileManager,
file: file,
filePresenter.present(for: file,
files: [file],
driveFileManager: driveFileManager,
normalFolderHierarchy: false)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -582,9 +582,9 @@ class FileListViewController: UIViewController, UICollectionViewDataSource, Swip

func onFilePresented(_ file: File) {
#if !ISEXTENSION
filePresenter.present(driveFileManager: viewModel.driveFileManager,
file: file,
filePresenter.present(for: file,
files: viewModel.getAllFiles(),
driveFileManager: viewModel.driveFileManager,
normalFolderHierarchy: viewModel.configuration.normalFolderHierarchy,
fromActivities: viewModel.configuration.fromActivities)
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,14 @@ class InMemoryFileListViewModel: FileListViewModel {
private let realm: Realm

override init(configuration: Configuration, driveFileManager: DriveFileManager, currentDirectory: File) {
if let realm = currentDirectory.realm {
// TODO: Refactor to explicit realm state
/// We expect the object to be live in this view controller, if not detached.
var currentDirectory = currentDirectory
if currentDirectory.isFrozen, let liveDirectory = currentDirectory.thaw() {
currentDirectory = liveDirectory
}

if let realm = currentDirectory.realm, !currentDirectory.isFrozen {
self.realm = realm
} else {
let unCachedRealmConfiguration = Realm.Configuration(
Expand All @@ -40,6 +47,7 @@ class InMemoryFileListViewModel: FileListViewModel {
}

super.init(configuration: configuration, driveFileManager: driveFileManager, currentDirectory: currentDirectory)

try? realm.write {
realm.add(currentDirectory)
}
Expand Down
183 changes: 106 additions & 77 deletions kDrive/UI/Controller/Files/FilePresenter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -63,18 +63,16 @@ final class FilePresenter {

func presentParent(of file: File, driveFileManager: DriveFileManager, animated: Bool = true) {
if let parent = file.parent {
present(driveFileManager: driveFileManager, file: parent, files: [], normalFolderHierarchy: true, animated: animated)
present(for: parent, files: [], driveFileManager: driveFileManager, normalFolderHierarchy: true, animated: animated)
} else if file.parentId != 0 {
Task {
do {
let parent = try await driveFileManager.file(id: file.parentId)
present(
driveFileManager: driveFileManager,
file: parent,
files: [],
normalFolderHierarchy: true,
animated: animated
)
present(for: parent,
files: [],
driveFileManager: driveFileManager,
normalFolderHierarchy: true,
animated: animated)
} catch {
UIConstants.showSnackBarIfNeeded(error: error)
}
Expand All @@ -84,93 +82,124 @@ final class FilePresenter {
}
}

func present(driveFileManager: DriveFileManager,
file: File,
func present(for file: File,
files: [File],
driveFileManager: DriveFileManager,
normalFolderHierarchy: Bool,
fromActivities: Bool = false,
animated: Bool = true,
completion: ((Bool) -> Void)? = nil) {
if file.isDirectory {
// Show files list
let viewModel: FileListViewModel
if driveFileManager.drive.sharedWithMe {
viewModel = SharedWithMeViewModel(driveFileManager: driveFileManager, currentDirectory: file)
} else if file.isTrashed || file.deletedAt != nil {
viewModel = TrashListViewModel(driveFileManager: driveFileManager, currentDirectory: file)
} else {
viewModel = ConcreteFileListViewModel(driveFileManager: driveFileManager, currentDirectory: file)
}
let nextVC = FileListViewController.instantiate(viewModel: viewModel)
if file.isDisabled {
if driveFileManager.drive.isUserAdmin {
let accessFileDriveFloatingPanelController = AccessFileFloatingPanelViewController.instantiatePanel()
let floatingPanelViewController = accessFileDriveFloatingPanelController
.contentViewController as? AccessFileFloatingPanelViewController
floatingPanelViewController?.actionHandler = { [weak self] _ in
guard let self else { return }
floatingPanelViewController?.rightButton.setLoading(true)
Task { [proxyFile = file.proxify()] in
do {
let response = try await driveFileManager.apiFetcher.forceAccess(to: proxyFile)
if response {
accessFileDriveFloatingPanelController.dismiss(animated: true)
self.navigationController?.pushViewController(nextVC, animated: true)
} else {
UIConstants.showSnackBar(message: KDriveResourcesStrings.Localizable.errorRightModification)
}
} catch {
UIConstants.showSnackBarIfNeeded(error: error)
presentDirectory(for: file, driveFileManager: driveFileManager, animated: animated, completion: completion)
} else if file.isBookmark {
downloadAndPresentBookmark(for: file, completion: completion)
} else {
presentFile(
for: file,
files: files,
driveFileManager: driveFileManager,
normalFolderHierarchy: normalFolderHierarchy,
fromActivities: fromActivities,
animated: animated,
completion: completion
)
}
}

private func presentFile(for file: File,
files: [File],
driveFileManager: DriveFileManager,
normalFolderHierarchy: Bool,
fromActivities: Bool,
animated: Bool,
completion: ((Bool) -> Void)?) {
// Show file preview
let files = files.filter { !$0.isDirectory && !$0.isTrashed }
if let index = files.firstIndex(where: { $0.id == file.id }) {
let previewViewController = PreviewViewController.instantiate(
files: files,
index: Int(index),
driveFileManager: driveFileManager,
normalFolderHierarchy: normalFolderHierarchy,
fromActivities: fromActivities
)
navigationController?.pushViewController(previewViewController, animated: animated)
completion?(true)
}
if file.isTrashed {
UIConstants.showSnackBar(message: KDriveResourcesStrings.Localizable.errorPreviewTrash)
completion?(false)
}
}

private func presentDirectory(
for file: File,
driveFileManager: DriveFileManager,
animated: Bool,
completion: ((Bool) -> Void)?
) {
// Show files list
let viewModel: FileListViewModel
if driveFileManager.drive.sharedWithMe {
viewModel = SharedWithMeViewModel(driveFileManager: driveFileManager, currentDirectory: file)
} else if file.isTrashed || file.deletedAt != nil {
viewModel = TrashListViewModel(driveFileManager: driveFileManager, currentDirectory: file)
} else {
viewModel = ConcreteFileListViewModel(driveFileManager: driveFileManager, currentDirectory: file)
}
let nextVC = FileListViewController.instantiate(viewModel: viewModel)
if file.isDisabled {
if driveFileManager.drive.isUserAdmin {
let accessFileDriveFloatingPanelController = AccessFileFloatingPanelViewController.instantiatePanel()
let floatingPanelViewController = accessFileDriveFloatingPanelController
.contentViewController as? AccessFileFloatingPanelViewController
floatingPanelViewController?.actionHandler = { [weak self] _ in
guard let self else { return }
floatingPanelViewController?.rightButton.setLoading(true)
Task { [proxyFile = file.proxify()] in
do {
let response = try await driveFileManager.apiFetcher.forceAccess(to: proxyFile)
if response {
accessFileDriveFloatingPanelController.dismiss(animated: true)
self.navigationController?.pushViewController(nextVC, animated: true)
} else {
UIConstants.showSnackBar(message: KDriveResourcesStrings.Localizable.errorRightModification)
}
} catch {
UIConstants.showSnackBarIfNeeded(error: error)
}
}
viewController?.present(accessFileDriveFloatingPanelController, animated: true)
} else {
viewController?.present(NoAccessFloatingPanelViewController.instantiatePanel(), animated: true)
}
viewController?.present(accessFileDriveFloatingPanelController, animated: true)
} else {
navigationController?.pushViewController(nextVC, animated: animated)
viewController?.present(NoAccessFloatingPanelViewController.instantiatePanel(), animated: true)
}
completion?(true)
} else if file.isBookmark {
// Open bookmark URL
if file.isMostRecentDownloaded {
presentBookmark(for: file, completion: completion)
} else {
// Download file
DownloadQueue.instance.temporaryDownload(file: file, userId: accountManager.currentUserId) { error in
Task {
if let error {
UIConstants.showSnackBarIfNeeded(error: error)
completion?(false)
} else {
self.presentBookmark(for: file, completion: completion)
}
} else {
navigationController?.pushViewController(nextVC, animated: animated)
}
completion?(true)
}

private func downloadAndPresentBookmark(for file: File, completion: ((Bool) -> Void)?) {
// Open bookmark URL
if file.isMostRecentDownloaded {
presentBookmark(for: file, completion: completion)
} else {
// Download file
DownloadQueue.instance.temporaryDownload(file: file, userId: accountManager.currentUserId) { error in
Task {
if let error {
UIConstants.showSnackBarIfNeeded(error: error)
completion?(false)
} else {
self.presentBookmark(for: file, completion: completion)
}
}
}
} else {
// Show file preview
let files = files.filter { !$0.isDirectory && !$0.isTrashed }
if let index = files.firstIndex(where: { $0.id == file.id }) {
let previewViewController = PreviewViewController.instantiate(
files: files,
index: Int(index),
driveFileManager: driveFileManager,
normalFolderHierarchy: normalFolderHierarchy,
fromActivities: fromActivities
)
navigationController?.pushViewController(previewViewController, animated: animated)
completion?(true)
}
if file.isTrashed {
UIConstants.showSnackBar(message: KDriveResourcesStrings.Localizable.errorPreviewTrash)
completion?(false)
}
}
}

private func presentBookmark(for file: File, animated: Bool = true, completion: ((Bool) -> Void)? = nil) {
private func presentBookmark(for file: File, animated: Bool = true, completion: ((Bool) -> Void)?) {
if let url = file.getBookmarkURL() {
if url.scheme == "http" || url.scheme == "https" {
let safariViewController = SFSafariViewController(url: url)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -402,9 +402,9 @@ class PreviewViewController: UIViewController, PreviewContentCellDelegate {
if currentFile.isBookmark {
floatingPanelViewController.dismiss(animated: false)
FilePresenter(viewController: self).present(
driveFileManager: driveFileManager,
file: currentFile,
for: currentFile,
files: [],
driveFileManager: driveFileManager,
normalFolderHierarchy: true
) { success in
if !success {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,9 @@ class RecentActivityFilesViewController: FileListViewController {
#if !ISEXTENSION
if file.isDirectory {
let managedFile = driveFileManager.getManagedFile(from: file.detached())
filePresenter.present(driveFileManager: viewModel.driveFileManager,
file: managedFile,
filePresenter.present(for: managedFile,
files: viewModel.getAllFiles(),
driveFileManager: viewModel.driveFileManager,
normalFolderHierarchy: viewModel.configuration.normalFolderHierarchy,
fromActivities: viewModel.configuration.fromActivities)
} else {
Expand Down
8 changes: 4 additions & 4 deletions kDrive/UI/Controller/Home/HomeViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -712,9 +712,9 @@ extension HomeViewController {
switch viewModel.recentFiles {
case .file(let files):
filePresenter.present(
driveFileManager: driveFileManager,
file: files[indexPath.row],
for: files[indexPath.row],
files: files,
driveFileManager: driveFileManager,
normalFolderHierarchy: false
)
case .fileActivity:
Expand Down Expand Up @@ -788,9 +788,9 @@ extension HomeViewController: RecentActivityDelegate {
filePresenter.navigationController?.pushViewController(nextVC, animated: true)
} else {
filePresenter.present(
driveFileManager: driveFileManager,
file: driveFileManager.getManagedFile(from: file),
for: driveFileManager.getManagedFile(from: file),
files: activities.compactMap(\.file),
driveFileManager: driveFileManager,
normalFolderHierarchy: false
)
}
Expand Down
Loading