From dfcb0dc51ce841622b39b794a94ac4c3ddd756e2 Mon Sep 17 00:00:00 2001 From: Ettore Pasquini Date: Thu, 1 Feb 2024 15:49:29 -0800 Subject: [PATCH] IOS-631 Fix neverending spinner after book opening errors --- Simplified/Book/UI/NYPLBookButtonsView.h | 3 ++- Simplified/Book/UI/NYPLBookButtonsView.m | 2 +- Simplified/Book/UI/NYPLBookCellDelegate.m | 22 +++++++++++-------- .../Book/UI/NYPLBookDetailViewController.m | 10 +++++---- Simplified/Book/UI/NYPLEPUBOpener.swift | 6 ++--- .../NYPLRootTabBarController+R2.swift | 4 ++-- .../ReaderPresentation/ReaderModule.swift | 11 +++++----- 7 files changed, 33 insertions(+), 25 deletions(-) diff --git a/Simplified/Book/UI/NYPLBookButtonsView.h b/Simplified/Book/UI/NYPLBookButtonsView.h index a9997c243..9322b7491 100644 --- a/Simplified/Book/UI/NYPLBookButtonsView.h +++ b/Simplified/Book/UI/NYPLBookButtonsView.h @@ -8,7 +8,8 @@ - (void)didSelectReturnForBook:(NYPLBook *)book; - (void)didSelectDownloadForBook:(NYPLBook *)book; -- (void)didSelectReadForBook:(NYPLBook *)book successCompletion:(void(^)(void))completion; +- (void)didSelectReadForBook:(NYPLBook *)book + completion:(void(^)(BOOL success))completion; @end diff --git a/Simplified/Book/UI/NYPLBookButtonsView.m b/Simplified/Book/UI/NYPLBookButtonsView.m index 0cdbd5d2d..ca5993c70 100644 --- a/Simplified/Book/UI/NYPLBookButtonsView.m +++ b/Simplified/Book/UI/NYPLBookButtonsView.m @@ -434,7 +434,7 @@ - (void)didSelectRead self.activityIndicator.center = self.readButton.center; [self updateProcessingState:YES]; [self.delegate didSelectReadForBook:self.book - successCompletion:^{ + completion:^(__unused BOOL success) { [self updateProcessingState]; }]; } diff --git a/Simplified/Book/UI/NYPLBookCellDelegate.m b/Simplified/Book/UI/NYPLBookCellDelegate.m index 9e91003dd..54a7f1fbf 100644 --- a/Simplified/Book/UI/NYPLBookCellDelegate.m +++ b/Simplified/Book/UI/NYPLBookCellDelegate.m @@ -63,7 +63,8 @@ - (void)didSelectDownloadForBook:(NYPLBook *)book [[NYPLMyBooksDownloadCenter sharedDownloadCenter] startDownloadForBook:book]; } -- (void)didSelectReadForBook:(NYPLBook *)book successCompletion:(void(^)(void))successCompletion +- (void)didSelectReadForBook:(NYPLBook *)book + completion:(void(^)(BOOL success))completion { #if FEATURE_DRM_CONNECTOR // Try to prevent blank books bug @@ -81,37 +82,40 @@ - (void)didSelectReadForBook:(NYPLBook *)book successCompletion:(void(^)(void))s completion:^(BOOL isSignedIn) { if (isSignedIn) { dispatch_async(dispatch_get_main_queue(), ^{ - [self openBook:book successCompletion:successCompletion]; + [self openBook:book completion:completion]; // with ARC, retain the reauthenticator until we're done, then release it reauthenticator = nil; }); } }]; } else { - [self openBook:book successCompletion:successCompletion]; + [self openBook:book completion:completion]; } #else [self openBook:book successCompletion:successCompletion]; #endif//FEATURE_DRM_CONNECTOR } -- (void)openBook:(NYPLBook *)book successCompletion:(void(^)(void))successCompletion +- (void)openBook:(NYPLBook *)book completion:(void(^)(BOOL success))completion { [NYPLCirculationAnalytics postEvent:@"open_book" withBook:book]; switch (book.defaultBookContentType) { case NYPLBookContentTypeEPUB: - [[[NYPLEPUBOpener alloc] init] open:book successCompletion:successCompletion]; + [[[NYPLEPUBOpener alloc] init] open:book completion:completion]; break; case NYPLBookContentTypePDF: [self openPDF:book]; break; #if FEATURE_AUDIOBOOKS - case NYPLBookContentTypeAudiobook: - [self openAudiobook:book successCompletion:successCompletion]; + case NYPLBookContentTypeAudiobook: { + [self openAudiobook:book successCompletion:^{ + completion(YES); + }]; break; + } #endif - default: + case NYPLBookContentTypeUnsupported: [self presentUnsupportedItemError]; break; } @@ -181,7 +185,7 @@ - (void)didSelectCancelForBookDownloadingCell:(NYPLBookDownloadingCell *const)ce - (void)didSelectListenForBookDownloadingCell:(NYPLBookDownloadingCell *)cell { - [self didSelectReadForBook:cell.book successCompletion:nil]; + [self didSelectReadForBook:cell.book completion:nil]; } @end diff --git a/Simplified/Book/UI/NYPLBookDetailViewController.m b/Simplified/Book/UI/NYPLBookDetailViewController.m index a88752311..52a03fd39 100644 --- a/Simplified/Book/UI/NYPLBookDetailViewController.m +++ b/Simplified/Book/UI/NYPLBookDetailViewController.m @@ -139,15 +139,17 @@ - (void)didSelectDownloadForBook:(NYPLBook *)book } - (void)didSelectReadForBook:(NYPLBook *)book - successCompletion:(__unused void(^)(void))successCompletion + completion:(void(^)(BOOL success))completion { [[NYPLBookCellDelegate sharedDelegate] didSelectReadForBook:book - successCompletion:^{ + completion:^(BOOL success) { // dismiss ourselves if we were presented, since we want to show the ereader if (self.modalPresentationStyle == UIModalPresentationFormSheet) { - [self dismissViewControllerAnimated:true completion:successCompletion]; + [self dismissViewControllerAnimated:true completion:^{ + completion(success); + }]; } else { - successCompletion(); + completion(success); } }]; } diff --git a/Simplified/Book/UI/NYPLEPUBOpener.swift b/Simplified/Book/UI/NYPLEPUBOpener.swift index 08861406d..4976285bb 100644 --- a/Simplified/Book/UI/NYPLEPUBOpener.swift +++ b/Simplified/Book/UI/NYPLEPUBOpener.swift @@ -10,7 +10,7 @@ import Foundation class NYPLEPUBOpener: NSObject { @objc - func open(_ book: NYPLBook, successCompletion: @escaping () -> Void) { + func open(_ book: NYPLBook, completion: @escaping (_ success: Bool) -> Void) { let url = NYPLMyBooksDownloadCenter.shared()? .fileURL(forBookIndentifier: book.identifier) @@ -21,8 +21,8 @@ class NYPLEPUBOpener: NSObject { rootTabController?.presentBook(book, fromFileURL: url, syncPermission: syncPermission, - successCompletion: successCompletion) - + completion: completion) + rootTabController?.annotationsSynchronizer? .checkServerSyncStatus(settings: NYPLSettings.shared, syncPermissionGranted: syncPermission) { enableSync, error in diff --git a/Simplified/Reader2/ReaderPresentation/NYPLRootTabBarController+R2.swift b/Simplified/Reader2/ReaderPresentation/NYPLRootTabBarController+R2.swift index 08f65c2e6..037871a0d 100644 --- a/Simplified/Reader2/ReaderPresentation/NYPLRootTabBarController+R2.swift +++ b/Simplified/Reader2/ReaderPresentation/NYPLRootTabBarController+R2.swift @@ -12,7 +12,7 @@ import Foundation func presentBook(_ book: NYPLBook, fromFileURL fileURL: URL?, syncPermission: Bool, - successCompletion: (() -> Void)?) { + completion: ((_ success: Bool) -> Void)?) { guard let libraryService = r2Owner?.libraryService, let readerModule = r2Owner?.readerModule else { return } @@ -30,7 +30,7 @@ import Foundation syncPermission: syncPermission, deviceID: drmDeviceID, in: navVC, - successCompletion: successCompletion) + completion: completion) case .cancelled: // .cancelled is returned when publication has restricted access to its resources and can't be rendered NYPLErrorLogger.logError(nil, summary: "Error accessing book resources", metadata: [ diff --git a/Simplified/Reader2/ReaderPresentation/ReaderModule.swift b/Simplified/Reader2/ReaderPresentation/ReaderModule.swift index f34829f50..e41b4b031 100644 --- a/Simplified/Reader2/ReaderPresentation/ReaderModule.swift +++ b/Simplified/Reader2/ReaderPresentation/ReaderModule.swift @@ -41,7 +41,7 @@ protocol ReaderModuleAPI { syncPermission: Bool, deviceID: String?, in navigationController: UINavigationController, - successCompletion: (() -> Void)?) + completion: ((_ success: Bool) -> Void)?) } @@ -82,7 +82,7 @@ final class ReaderModule: ReaderModuleAPI { syncPermission: Bool, deviceID: String?, in navigationController: UINavigationController, - successCompletion: (() -> Void)?) { + completion: ((_ success: Bool) -> Void)?) { if delegate == nil { NYPLErrorLogger.logError(nil, summary: "ReaderModule delegate is not set") } @@ -102,7 +102,7 @@ final class ReaderModule: ReaderModuleAPI { formatModule: formatModule, positioningAt: initialLocator, in: navigationController, - successCompletion: successCompletion) + completion: completion) } } @@ -112,7 +112,7 @@ final class ReaderModule: ReaderModuleAPI { formatModule: ReaderFormatModule, positioningAt initialLocator: Locator?, in navigationController: UINavigationController, - successCompletion: (() -> Void)?) { + completion: ((_ success: Bool) -> Void)?) { do { let readerVC = try formatModule.makeReaderViewController( for: publication, @@ -126,9 +126,10 @@ final class ReaderModule: ReaderModuleAPI { readerVC.hidesBottomBarWhenPushed = true navigationController.pushViewController(readerVC, animated: true) - successCompletion?() + completion?(true) } catch { delegate?.presentError(error, from: navigationController) + completion?(false) } } }