Feature: make Reader use center window

This commit is contained in:
James Magahern
2022-08-22 17:10:47 -07:00
parent ac345ef613
commit 184396b1d8
8 changed files with 116 additions and 19 deletions

View File

@@ -23,6 +23,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
if userActivity.activityType == SessionActivityType.SettingsWindow.rawValue {
return UISceneConfiguration(name: "Settings", sessionRole: connectingSceneSession.role)
}
if userActivity.activityType == SessionActivityType.ReaderWindow.rawValue {
return UISceneConfiguration(name: "Reader", sessionRole: connectingSceneSession.role)
}
}
return UISceneConfiguration(name: "Browser", sessionRole: connectingSceneSession.role)

View File

@@ -299,13 +299,26 @@ class BrowserViewController: UIViewController
DispatchQueue.main.async {
documentControls.dismiss(animated: true, completion: nil)
let readableViewController = ReaderViewController(readableHTMLString: string, baseURL: self.tab.bridge.webView.url)
readableViewController.title = self.tab.bridge.webView.title
readableViewController.darkModeEnabled = self.tab.bridge.darkModeEnabled
readableViewController.delegate = self
if self.traitCollection.userInterfaceIdiom == .phone {
let readableViewController = ReaderViewController(readableHTMLString: string, baseURL: self.tab.bridge.webView.url)
readableViewController.title = self.tab.bridge.webView.title
readableViewController.darkModeEnabled = self.tab.bridge.darkModeEnabled
readableViewController.delegate = self
let navigationController = UINavigationController(rootViewController: readableViewController)
self.present(navigationController, animated: true, completion: nil)
} else {
let userActivity = NSUserActivity(activityType: SessionActivityType.ReaderWindow.rawValue)
userActivity.title = self.tab.title
userActivity.userInfo = [
ReaderUserActivityKeys.baseURL.rawValue : self.tab.bridge.webView.url ?? NSNull(),
ReaderUserActivityKeys.htmlString.rawValue : string,
]
let requestOptions = UIWindowScene.ActivationRequestOptions()
requestOptions.preferredPresentationStyle = .prominent
UIApplication.shared.requestSceneSessionActivation(nil, userActivity: userActivity, options: requestOptions)
}
let navigationController = UINavigationController(rootViewController: readableViewController)
self.present(navigationController, animated: true, completion: nil)
}
}
}, for: .touchUpInside)

View File

@@ -55,7 +55,13 @@ class ReaderViewController: UIViewController
@objc
private func didTapDoneButton(_ sender: Any?) {
dismiss(animated: true, completion: nil)
if traitCollection.userInterfaceIdiom == .phone {
dismiss(animated: true, completion: nil)
} else {
if let sceneSession = view.window?.windowScene?.session {
UIApplication.shared.requestSceneSessionDestruction(sceneSession, options: nil, errorHandler: nil)
}
}
}
@objc

View File

@@ -1,5 +1,5 @@
//
// SceneDelegate.swift
// BrowserSceneDelegate.swift
// SBrowser
//
// Created by James Magahern on 7/21/20.
@@ -10,9 +10,10 @@ import UIKit
public enum SessionActivityType: String {
case BrowserWindow = "net.buzzert.attractor.browser"
case SettingsWindow = "net.buzzert.attractor.settings"
case ReaderWindow = "net.buzzert.attractor.reader"
}
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
class BrowserSceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var browserViewController: BrowserViewController?
@@ -32,10 +33,24 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
browserViewController.tab.beginLoadingURL(url)
}
#if targetEnvironment(macCatalyst)
windowScene.titlebar?.titleVisibility = .hidden
windowScene.titlebar?.separatorStyle = .none
#endif
#if targetEnvironment(macCatalyst)
windowScene.titlebar?.titleVisibility = .hidden
windowScene.titlebar?.separatorStyle = .none
if #available(macCatalyst 16.0, *) {
let screenSize = windowScene.screen.bounds.size
let preferredSize = CGSize(width: 1000, height: 1100)
let geometryPreferences = UIWindowScene.GeometryPreferences.Mac(systemFrame: CGRect(
origin: CGPoint(
x: (screenSize.width - preferredSize.width) / 2,
y: (screenSize.height - preferredSize.height) / 2
),
size: preferredSize
))
windowScene.requestGeometryUpdate(geometryPreferences)
}
#endif
window.makeKeyAndVisible()
self.window = window

View File

@@ -0,0 +1,41 @@
//
// ReaderSceneDelegate.swift
// App
//
// Created by James Magahern on 8/22/22.
//
import UIKit
internal enum ReaderUserActivityKeys: String {
case htmlString
case baseURL
}
class ReaderSceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var readerViewController: ReaderViewController?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
{
guard let windowScene = (scene as? UIWindowScene) else { return }
guard let activity = connectionOptions.userActivities.first else { return }
guard let userInfo = activity.userInfo, let htmlString: String = userInfo[ReaderUserActivityKeys.htmlString.rawValue] as? String else { return }
let baseURL = userInfo[ReaderUserActivityKeys.baseURL.rawValue] as? URL
let window = UIWindow(windowScene: windowScene)
let readerViewController = ReaderViewController(readableHTMLString: htmlString, baseURL: baseURL)
readerViewController.title = activity.title
self.readerViewController = readerViewController
window.rootViewController = UINavigationController(rootViewController: readerViewController)
windowScene.title = activity.title ?? "Reader"
windowScene.sizeRestrictions?.maximumSize = CGSize(width: 700.0, height: 1000.0)
window.makeKeyAndVisible()
self.window = window
}
}

View File

@@ -53,7 +53,7 @@
<key>UISceneConfigurationName</key>
<string>Browser</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<string>$(PRODUCT_MODULE_NAME).BrowserSceneDelegate</string>
</dict>
<dict>
<key>UISceneConfigurationName</key>
@@ -61,6 +61,12 @@
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SettingsSceneDelegate</string>
</dict>
<dict>
<key>UISceneConfigurationName</key>
<string>Reader</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).ReaderSceneDelegate</string>
</dict>
</array>
</dict>
</dict>