feat: add "Using default browser open link" preference option. ticket: #20625EEA
This commit is contained in:
parent
77b84609ea
commit
5fa78394a3
|
@ -191,6 +191,7 @@
|
||||||
<attribute name="domain" attributeType="String"/>
|
<attribute name="domain" attributeType="String"/>
|
||||||
<attribute name="preferredStaticAvatar" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
<attribute name="preferredStaticAvatar" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
<attribute name="preferredTrueBlackDarkMode" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
<attribute name="preferredTrueBlackDarkMode" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="preferredUsingDefaultBrowser" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
<attribute name="updatedAt" attributeType="Date" usesScalarValueType="NO"/>
|
<attribute name="updatedAt" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
<attribute name="userID" attributeType="String"/>
|
<attribute name="userID" attributeType="String"/>
|
||||||
<relationship name="subscriptions" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="Subscription" inverseName="setting" inverseEntity="Subscription"/>
|
<relationship name="subscriptions" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="Subscription" inverseName="setting" inverseEntity="Subscription"/>
|
||||||
|
@ -282,7 +283,7 @@
|
||||||
<element name="PollOption" positionX="0" positionY="0" width="128" height="134"/>
|
<element name="PollOption" positionX="0" positionY="0" width="128" height="134"/>
|
||||||
<element name="PrivateNote" positionX="0" positionY="0" width="128" height="89"/>
|
<element name="PrivateNote" positionX="0" positionY="0" width="128" height="89"/>
|
||||||
<element name="SearchHistory" positionX="0" positionY="0" width="128" height="104"/>
|
<element name="SearchHistory" positionX="0" positionY="0" width="128" height="104"/>
|
||||||
<element name="Setting" positionX="72" positionY="162" width="128" height="149"/>
|
<element name="Setting" positionX="72" positionY="162" width="128" height="164"/>
|
||||||
<element name="Status" positionX="0" positionY="0" width="128" height="599"/>
|
<element name="Status" positionX="0" positionY="0" width="128" height="599"/>
|
||||||
<element name="Subscription" positionX="81" positionY="171" width="128" height="179"/>
|
<element name="Subscription" positionX="81" positionY="171" width="128" height="179"/>
|
||||||
<element name="SubscriptionAlerts" positionX="72" positionY="162" width="128" height="14"/>
|
<element name="SubscriptionAlerts" positionX="72" positionY="162" width="128" height="14"/>
|
||||||
|
|
|
@ -16,6 +16,7 @@ public final class Setting: NSManagedObject {
|
||||||
@NSManaged public var appearanceRaw: String
|
@NSManaged public var appearanceRaw: String
|
||||||
@NSManaged public var preferredTrueBlackDarkMode: Bool
|
@NSManaged public var preferredTrueBlackDarkMode: Bool
|
||||||
@NSManaged public var preferredStaticAvatar: Bool
|
@NSManaged public var preferredStaticAvatar: Bool
|
||||||
|
@NSManaged public var preferredUsingDefaultBrowser: Bool
|
||||||
|
|
||||||
@NSManaged public private(set) var createdAt: Date
|
@NSManaged public private(set) var createdAt: Date
|
||||||
@NSManaged public private(set) var updatedAt: Date
|
@NSManaged public private(set) var updatedAt: Date
|
||||||
|
@ -63,6 +64,12 @@ extension Setting {
|
||||||
didUpdate(at: Date())
|
didUpdate(at: Date())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func update(preferredUsingDefaultBrowser: Bool) {
|
||||||
|
guard preferredUsingDefaultBrowser != self.preferredUsingDefaultBrowser else { return }
|
||||||
|
self.preferredUsingDefaultBrowser = preferredUsingDefaultBrowser
|
||||||
|
didUpdate(at: Date())
|
||||||
|
}
|
||||||
|
|
||||||
public func didUpdate(at networkDate: Date) {
|
public func didUpdate(at networkDate: Date) {
|
||||||
self.updatedAt = networkDate
|
self.updatedAt = networkDate
|
||||||
}
|
}
|
||||||
|
|
|
@ -495,12 +495,8 @@
|
||||||
"dark": "Always Dark"
|
"dark": "Always Dark"
|
||||||
},
|
},
|
||||||
"appearance_settings": {
|
"appearance_settings": {
|
||||||
"dark_mode": {
|
"true_black_dark_mode": "True black Dark Mode",
|
||||||
"title": "True black Dark Mode"
|
"disable_avatar_animation": "Disable avatar animation"
|
||||||
},
|
|
||||||
"avatar_animation": {
|
|
||||||
"title": "Disable avatar animation"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"title": "Notifications",
|
"title": "Notifications",
|
||||||
|
@ -516,6 +512,10 @@
|
||||||
"title": "Notify me when"
|
"title": "Notify me when"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"preference": {
|
||||||
|
"title": "Preference",
|
||||||
|
"using_default_browser": "Using default browser open link"
|
||||||
|
},
|
||||||
"boringzone": {
|
"boringzone": {
|
||||||
"title": "The Boring zone",
|
"title": "The Boring zone",
|
||||||
"terms": "Terms of Service",
|
"terms": "Terms of Service",
|
||||||
|
|
|
@ -416,6 +416,7 @@
|
||||||
DBA0A11325FB3FC10079C110 /* ComposeToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */; };
|
DBA0A11325FB3FC10079C110 /* ComposeToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */; };
|
||||||
DBA1DB80268F84F80052DB59 /* NotificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA1DB7F268F84F80052DB59 /* NotificationType.swift */; };
|
DBA1DB80268F84F80052DB59 /* NotificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA1DB7F268F84F80052DB59 /* NotificationType.swift */; };
|
||||||
DBA465932696B495002B41DB /* APIService+WebFinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA465922696B495002B41DB /* APIService+WebFinger.swift */; };
|
DBA465932696B495002B41DB /* APIService+WebFinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA465922696B495002B41DB /* APIService+WebFinger.swift */; };
|
||||||
|
DBA465952696E387002B41DB /* AppPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA465942696E387002B41DB /* AppPreference.swift */; };
|
||||||
DBA5E7A3263AD0A3004598BB /* PhotoLibraryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A2263AD0A3004598BB /* PhotoLibraryService.swift */; };
|
DBA5E7A3263AD0A3004598BB /* PhotoLibraryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A2263AD0A3004598BB /* PhotoLibraryService.swift */; };
|
||||||
DBA5E7A5263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A4263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift */; };
|
DBA5E7A5263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A4263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift */; };
|
||||||
DBA5E7A9263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A8263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift */; };
|
DBA5E7A9263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A8263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift */; };
|
||||||
|
@ -1046,6 +1047,7 @@
|
||||||
DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeToolbarView.swift; sourceTree = "<group>"; };
|
DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeToolbarView.swift; sourceTree = "<group>"; };
|
||||||
DBA1DB7F268F84F80052DB59 /* NotificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationType.swift; sourceTree = "<group>"; };
|
DBA1DB7F268F84F80052DB59 /* NotificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationType.swift; sourceTree = "<group>"; };
|
||||||
DBA465922696B495002B41DB /* APIService+WebFinger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+WebFinger.swift"; sourceTree = "<group>"; };
|
DBA465922696B495002B41DB /* APIService+WebFinger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+WebFinger.swift"; sourceTree = "<group>"; };
|
||||||
|
DBA465942696E387002B41DB /* AppPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPreference.swift; sourceTree = "<group>"; };
|
||||||
DBA5E7A2263AD0A3004598BB /* PhotoLibraryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoLibraryService.swift; sourceTree = "<group>"; };
|
DBA5E7A2263AD0A3004598BB /* PhotoLibraryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoLibraryService.swift; sourceTree = "<group>"; };
|
||||||
DBA5E7A4263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuImagePreviewViewModel.swift; sourceTree = "<group>"; };
|
DBA5E7A4263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuImagePreviewViewModel.swift; sourceTree = "<group>"; };
|
||||||
DBA5E7A8263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuImagePreviewViewController.swift; sourceTree = "<group>"; };
|
DBA5E7A8263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuImagePreviewViewController.swift; sourceTree = "<group>"; };
|
||||||
|
@ -1987,6 +1989,7 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
DB5086BD25CC0D9900C2C187 /* SplashPreference.swift */,
|
DB5086BD25CC0D9900C2C187 /* SplashPreference.swift */,
|
||||||
|
DBA465942696E387002B41DB /* AppPreference.swift */,
|
||||||
DB6D1B3C2636857500ACB481 /* AppearancePreference.swift */,
|
DB6D1B3C2636857500ACB481 /* AppearancePreference.swift */,
|
||||||
DBE54AC52636C89F004E7C0B /* NotificationPreference.swift */,
|
DBE54AC52636C89F004E7C0B /* NotificationPreference.swift */,
|
||||||
DB1D842F26566512000346B3 /* KeyboardPreference.swift */,
|
DB1D842F26566512000346B3 /* KeyboardPreference.swift */,
|
||||||
|
@ -3228,6 +3231,7 @@
|
||||||
DBAC649B267DF8C8007FE9FD /* ActivityIndicatorNode.swift in Sources */,
|
DBAC649B267DF8C8007FE9FD /* ActivityIndicatorNode.swift in Sources */,
|
||||||
DB45FAD725CA6C76005A8AC7 /* UIBarButtonItem.swift in Sources */,
|
DB45FAD725CA6C76005A8AC7 /* UIBarButtonItem.swift in Sources */,
|
||||||
2DA504692601ADE7008F4E6C /* SawToothView.swift in Sources */,
|
2DA504692601ADE7008F4E6C /* SawToothView.swift in Sources */,
|
||||||
|
DBA465952696E387002B41DB /* AppPreference.swift in Sources */,
|
||||||
DB87D4572609DD5300D12C0D /* DeleteBackwardResponseTextField.swift in Sources */,
|
DB87D4572609DD5300D12C0D /* DeleteBackwardResponseTextField.swift in Sources */,
|
||||||
2D8434F525FF465D00EECE90 /* HomeTimelineNavigationBarTitleViewModel.swift in Sources */,
|
2D8434F525FF465D00EECE90 /* HomeTimelineNavigationBarTitleViewModel.swift in Sources */,
|
||||||
DB938F0F2624119800E5B6C1 /* ThreadViewModel+LoadThreadState.swift in Sources */,
|
DB938F0F2624119800E5B6C1 /* ThreadViewModel+LoadThreadState.swift in Sources */,
|
||||||
|
|
|
@ -192,8 +192,12 @@ extension SceneCoordinator {
|
||||||
sender?.navigationController?.pushViewController(viewController, animated: true)
|
sender?.navigationController?.pushViewController(viewController, animated: true)
|
||||||
|
|
||||||
case .safariPresent(let animated, let completion):
|
case .safariPresent(let animated, let completion):
|
||||||
|
if UserDefaults.shared.preferredUsingDefaultBrowser, case let .safari(url) = scene {
|
||||||
|
UIApplication.shared.open(url, options: [:], completionHandler: nil)
|
||||||
|
} else {
|
||||||
viewController.modalPresentationCapturesStatusBarAppearance = true
|
viewController.modalPresentationCapturesStatusBarAppearance = true
|
||||||
presentingViewController.present(viewController, animated: animated, completion: completion)
|
presentingViewController.present(viewController, animated: animated, completion: completion)
|
||||||
|
}
|
||||||
|
|
||||||
case .alertController(let animated, let completion):
|
case .alertController(let animated, let completion):
|
||||||
viewController.modalPresentationCapturesStatusBarAppearance = true
|
viewController.modalPresentationCapturesStatusBarAppearance = true
|
||||||
|
|
|
@ -13,6 +13,7 @@ enum SettingsItem: Hashable {
|
||||||
case appearanceDarkMode(settingObjectID: NSManagedObjectID)
|
case appearanceDarkMode(settingObjectID: NSManagedObjectID)
|
||||||
case appearanceDisableAvatarAnimation(settingObjectID: NSManagedObjectID)
|
case appearanceDisableAvatarAnimation(settingObjectID: NSManagedObjectID)
|
||||||
case notification(settingObjectID: NSManagedObjectID, switchMode: NotificationSwitchMode)
|
case notification(settingObjectID: NSManagedObjectID, switchMode: NotificationSwitchMode)
|
||||||
|
case preferenceUsingDefaultBrowser(settingObjectID: NSManagedObjectID)
|
||||||
case boringZone(item: Link)
|
case boringZone(item: Link)
|
||||||
case spicyZone(item: Link)
|
case spicyZone(item: Link)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ enum SettingsSection: Hashable {
|
||||||
case appearance
|
case appearance
|
||||||
case appearanceSettings
|
case appearanceSettings
|
||||||
case notifications
|
case notifications
|
||||||
|
case preference
|
||||||
case boringZone
|
case boringZone
|
||||||
case spicyZone
|
case spicyZone
|
||||||
|
|
||||||
|
@ -19,6 +20,7 @@ enum SettingsSection: Hashable {
|
||||||
case .appearance: return L10n.Scene.Settings.Section.Appearance.title
|
case .appearance: return L10n.Scene.Settings.Section.Appearance.title
|
||||||
case .appearanceSettings: return ""
|
case .appearanceSettings: return ""
|
||||||
case .notifications: return L10n.Scene.Settings.Section.Notifications.title
|
case .notifications: return L10n.Scene.Settings.Section.Notifications.title
|
||||||
|
case .preference: return L10n.Scene.Settings.Section.Preference.title
|
||||||
case .boringZone: return L10n.Scene.Settings.Section.Boringzone.title
|
case .boringZone: return L10n.Scene.Settings.Section.Boringzone.title
|
||||||
case .spicyZone: return L10n.Scene.Settings.Section.Spicyzone.title
|
case .spicyZone: return L10n.Scene.Settings.Section.Spicyzone.title
|
||||||
}
|
}
|
||||||
|
|
|
@ -934,14 +934,10 @@ internal enum L10n {
|
||||||
internal static let title = L10n.tr("Localizable", "Scene.Settings.Section.Appearance.Title")
|
internal static let title = L10n.tr("Localizable", "Scene.Settings.Section.Appearance.Title")
|
||||||
}
|
}
|
||||||
internal enum AppearanceSettings {
|
internal enum AppearanceSettings {
|
||||||
internal enum AvatarAnimation {
|
|
||||||
/// Disable avatar animation
|
/// Disable avatar animation
|
||||||
internal static let title = L10n.tr("Localizable", "Scene.Settings.Section.AppearanceSettings.AvatarAnimation.Title")
|
internal static let disableAvatarAnimation = L10n.tr("Localizable", "Scene.Settings.Section.AppearanceSettings.DisableAvatarAnimation")
|
||||||
}
|
|
||||||
internal enum DarkMode {
|
|
||||||
/// True black Dark Mode
|
/// True black Dark Mode
|
||||||
internal static let title = L10n.tr("Localizable", "Scene.Settings.Section.AppearanceSettings.DarkMode.Title")
|
internal static let trueBlackDarkMode = L10n.tr("Localizable", "Scene.Settings.Section.AppearanceSettings.TrueBlackDarkMode")
|
||||||
}
|
|
||||||
}
|
}
|
||||||
internal enum Boringzone {
|
internal enum Boringzone {
|
||||||
/// Privacy Policy
|
/// Privacy Policy
|
||||||
|
@ -975,6 +971,12 @@ internal enum L10n {
|
||||||
internal static let title = L10n.tr("Localizable", "Scene.Settings.Section.Notifications.Trigger.Title")
|
internal static let title = L10n.tr("Localizable", "Scene.Settings.Section.Notifications.Trigger.Title")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
internal enum Preference {
|
||||||
|
/// Preference
|
||||||
|
internal static let title = L10n.tr("Localizable", "Scene.Settings.Section.Preference.Title")
|
||||||
|
/// Using default browser open link
|
||||||
|
internal static let usingDefaultBrowser = L10n.tr("Localizable", "Scene.Settings.Section.Preference.UsingDefaultBrowser")
|
||||||
|
}
|
||||||
internal enum Spicyzone {
|
internal enum Spicyzone {
|
||||||
/// Clear Media Cache
|
/// Clear Media Cache
|
||||||
internal static let clear = L10n.tr("Localizable", "Scene.Settings.Section.Spicyzone.Clear")
|
internal static let clear = L10n.tr("Localizable", "Scene.Settings.Section.Spicyzone.Clear")
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
//
|
||||||
|
// AppPreference.swift
|
||||||
|
// Mastodon
|
||||||
|
//
|
||||||
|
// Created by MainasuK Cirno on 2021-7-8.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
extension UserDefaults {
|
||||||
|
|
||||||
|
@objc dynamic var preferredUsingDefaultBrowser: Bool {
|
||||||
|
get {
|
||||||
|
register(defaults: [#function: false])
|
||||||
|
return bool(forKey: #function)
|
||||||
|
}
|
||||||
|
set { self[#function] = newValue }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -317,8 +317,8 @@ any server.";
|
||||||
"Scene.Settings.Section.Appearance.Dark" = "Always Dark";
|
"Scene.Settings.Section.Appearance.Dark" = "Always Dark";
|
||||||
"Scene.Settings.Section.Appearance.Light" = "Always Light";
|
"Scene.Settings.Section.Appearance.Light" = "Always Light";
|
||||||
"Scene.Settings.Section.Appearance.Title" = "Appearance";
|
"Scene.Settings.Section.Appearance.Title" = "Appearance";
|
||||||
"Scene.Settings.Section.AppearanceSettings.AvatarAnimation.Title" = "Disable avatar animation";
|
"Scene.Settings.Section.AppearanceSettings.DisableAvatarAnimation" = "Disable avatar animation";
|
||||||
"Scene.Settings.Section.AppearanceSettings.DarkMode.Title" = "True black Dark Mode";
|
"Scene.Settings.Section.AppearanceSettings.TrueBlackDarkMode" = "True black Dark Mode";
|
||||||
"Scene.Settings.Section.Boringzone.Privacy" = "Privacy Policy";
|
"Scene.Settings.Section.Boringzone.Privacy" = "Privacy Policy";
|
||||||
"Scene.Settings.Section.Boringzone.Terms" = "Terms of Service";
|
"Scene.Settings.Section.Boringzone.Terms" = "Terms of Service";
|
||||||
"Scene.Settings.Section.Boringzone.Title" = "The Boring zone";
|
"Scene.Settings.Section.Boringzone.Title" = "The Boring zone";
|
||||||
|
@ -332,6 +332,8 @@ any server.";
|
||||||
"Scene.Settings.Section.Notifications.Trigger.Follower" = "a follower";
|
"Scene.Settings.Section.Notifications.Trigger.Follower" = "a follower";
|
||||||
"Scene.Settings.Section.Notifications.Trigger.Noone" = "no one";
|
"Scene.Settings.Section.Notifications.Trigger.Noone" = "no one";
|
||||||
"Scene.Settings.Section.Notifications.Trigger.Title" = "Notify me when";
|
"Scene.Settings.Section.Notifications.Trigger.Title" = "Notify me when";
|
||||||
|
"Scene.Settings.Section.Preference.Title" = "Preference";
|
||||||
|
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Using default browser open link";
|
||||||
"Scene.Settings.Section.Spicyzone.Clear" = "Clear Media Cache";
|
"Scene.Settings.Section.Spicyzone.Clear" = "Clear Media Cache";
|
||||||
"Scene.Settings.Section.Spicyzone.Signout" = "Sign Out";
|
"Scene.Settings.Section.Spicyzone.Signout" = "Sign Out";
|
||||||
"Scene.Settings.Section.Spicyzone.Title" = "The spicy zone";
|
"Scene.Settings.Section.Spicyzone.Title" = "The spicy zone";
|
||||||
|
|
|
@ -317,8 +317,8 @@ any server.";
|
||||||
"Scene.Settings.Section.Appearance.Dark" = "Always Dark";
|
"Scene.Settings.Section.Appearance.Dark" = "Always Dark";
|
||||||
"Scene.Settings.Section.Appearance.Light" = "Always Light";
|
"Scene.Settings.Section.Appearance.Light" = "Always Light";
|
||||||
"Scene.Settings.Section.Appearance.Title" = "Appearance";
|
"Scene.Settings.Section.Appearance.Title" = "Appearance";
|
||||||
"Scene.Settings.Section.AppearanceSettings.AvatarAnimation.Title" = "Disable avatar animation";
|
"Scene.Settings.Section.AppearanceSettings.DisableAvatarAnimation" = "Disable avatar animation";
|
||||||
"Scene.Settings.Section.AppearanceSettings.DarkMode.Title" = "True black Dark Mode";
|
"Scene.Settings.Section.AppearanceSettings.TrueBlackDarkMode" = "True black Dark Mode";
|
||||||
"Scene.Settings.Section.Boringzone.Privacy" = "Privacy Policy";
|
"Scene.Settings.Section.Boringzone.Privacy" = "Privacy Policy";
|
||||||
"Scene.Settings.Section.Boringzone.Terms" = "Terms of Service";
|
"Scene.Settings.Section.Boringzone.Terms" = "Terms of Service";
|
||||||
"Scene.Settings.Section.Boringzone.Title" = "The Boring zone";
|
"Scene.Settings.Section.Boringzone.Title" = "The Boring zone";
|
||||||
|
@ -332,6 +332,8 @@ any server.";
|
||||||
"Scene.Settings.Section.Notifications.Trigger.Follower" = "a follower";
|
"Scene.Settings.Section.Notifications.Trigger.Follower" = "a follower";
|
||||||
"Scene.Settings.Section.Notifications.Trigger.Noone" = "no one";
|
"Scene.Settings.Section.Notifications.Trigger.Noone" = "no one";
|
||||||
"Scene.Settings.Section.Notifications.Trigger.Title" = "Notify me when";
|
"Scene.Settings.Section.Notifications.Trigger.Title" = "Notify me when";
|
||||||
|
"Scene.Settings.Section.Preference.Title" = "Preference";
|
||||||
|
"Scene.Settings.Section.Preference.UsingDefaultBrowser" = "Using default browser open link";
|
||||||
"Scene.Settings.Section.Spicyzone.Clear" = "Clear Media Cache";
|
"Scene.Settings.Section.Spicyzone.Clear" = "Clear Media Cache";
|
||||||
"Scene.Settings.Section.Spicyzone.Signout" = "Sign Out";
|
"Scene.Settings.Section.Spicyzone.Signout" = "Sign Out";
|
||||||
"Scene.Settings.Section.Spicyzone.Title" = "The spicy zone";
|
"Scene.Settings.Section.Spicyzone.Title" = "The spicy zone";
|
||||||
|
|
|
@ -364,6 +364,9 @@ extension SettingsViewController: UITableViewDelegate {
|
||||||
case .notification:
|
case .notification:
|
||||||
// do nothing
|
// do nothing
|
||||||
break
|
break
|
||||||
|
case .preferenceUsingDefaultBrowser:
|
||||||
|
// do nothing
|
||||||
|
break
|
||||||
case .boringZone(let link), .spicyZone(let link):
|
case .boringZone(let link), .spicyZone(let link):
|
||||||
switch link {
|
switch link {
|
||||||
case .termsOfService, .privacyPolicy:
|
case .termsOfService, .privacyPolicy:
|
||||||
|
@ -501,7 +504,24 @@ extension SettingsViewController: SettingsToggleCellDelegate {
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
.store(in: &disposeBag)
|
.store(in: &disposeBag)
|
||||||
|
case .preferenceUsingDefaultBrowser(let settingObjectID):
|
||||||
|
let managedObjectContext = context.backgroundManagedObjectContext
|
||||||
|
managedObjectContext.performChanges {
|
||||||
|
let setting = managedObjectContext.object(with: settingObjectID) as! Setting
|
||||||
|
setting.update(preferredUsingDefaultBrowser: isOn)
|
||||||
|
}
|
||||||
|
.sink { result in
|
||||||
|
switch result {
|
||||||
|
case .success:
|
||||||
|
UserDefaults.shared.preferredUsingDefaultBrowser = isOn
|
||||||
|
case .failure(let error):
|
||||||
|
assertionFailure(error.localizedDescription)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.store(in: &disposeBag)
|
||||||
default:
|
default:
|
||||||
|
assertionFailure()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,12 +103,17 @@ extension SettingsViewModel {
|
||||||
snapshot.appendSections([.appearanceSettings])
|
snapshot.appendSections([.appearanceSettings])
|
||||||
snapshot.appendItems(appearanceSettingItems, toSection: .appearanceSettings)
|
snapshot.appendItems(appearanceSettingItems, toSection: .appearanceSettings)
|
||||||
|
|
||||||
|
// notification
|
||||||
let notificationItems = SettingsItem.NotificationSwitchMode.allCases.map { mode in
|
let notificationItems = SettingsItem.NotificationSwitchMode.allCases.map { mode in
|
||||||
SettingsItem.notification(settingObjectID: setting.objectID, switchMode: mode)
|
SettingsItem.notification(settingObjectID: setting.objectID, switchMode: mode)
|
||||||
}
|
}
|
||||||
snapshot.appendSections([.notifications])
|
snapshot.appendSections([.notifications])
|
||||||
snapshot.appendItems(notificationItems, toSection: .notifications)
|
snapshot.appendItems(notificationItems, toSection: .notifications)
|
||||||
|
|
||||||
|
// preference
|
||||||
|
snapshot.appendSections([.preference])
|
||||||
|
snapshot.appendItems([.preferenceUsingDefaultBrowser(settingObjectID: setting.objectID)], toSection: .preference)
|
||||||
|
|
||||||
// boring zone
|
// boring zone
|
||||||
let boringZoneSettingsItems: [SettingsItem] = {
|
let boringZoneSettingsItems: [SettingsItem] = {
|
||||||
let links: [SettingsItem.Link] = [
|
let links: [SettingsItem.Link] = [
|
||||||
|
@ -170,7 +175,8 @@ extension SettingsViewModel {
|
||||||
cell.delegate = settingsAppearanceTableViewCellDelegate
|
cell.delegate = settingsAppearanceTableViewCellDelegate
|
||||||
return cell
|
return cell
|
||||||
case .appearanceDarkMode(let objectID),
|
case .appearanceDarkMode(let objectID),
|
||||||
.appearanceDisableAvatarAnimation(let objectID):
|
.appearanceDisableAvatarAnimation(let objectID),
|
||||||
|
.preferenceUsingDefaultBrowser(let objectID):
|
||||||
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: SettingsToggleTableViewCell.self), for: indexPath) as! SettingsToggleTableViewCell
|
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: SettingsToggleTableViewCell.self), for: indexPath) as! SettingsToggleTableViewCell
|
||||||
cell.delegate = settingsToggleCellDelegate
|
cell.delegate = settingsToggleCellDelegate
|
||||||
self.context.managedObjectContext.performAndWait {
|
self.context.managedObjectContext.performAndWait {
|
||||||
|
@ -231,11 +237,14 @@ extension SettingsViewModel {
|
||||||
) {
|
) {
|
||||||
switch item {
|
switch item {
|
||||||
case .appearanceDarkMode:
|
case .appearanceDarkMode:
|
||||||
cell.textLabel?.text = L10n.Scene.Settings.Section.AppearanceSettings.DarkMode.title
|
cell.textLabel?.text = L10n.Scene.Settings.Section.AppearanceSettings.trueBlackDarkMode
|
||||||
cell.switchButton.isOn = setting.preferredTrueBlackDarkMode
|
cell.switchButton.isOn = setting.preferredTrueBlackDarkMode
|
||||||
case .appearanceDisableAvatarAnimation:
|
case .appearanceDisableAvatarAnimation:
|
||||||
cell.textLabel?.text = L10n.Scene.Settings.Section.AppearanceSettings.AvatarAnimation.title
|
cell.textLabel?.text = L10n.Scene.Settings.Section.AppearanceSettings.disableAvatarAnimation
|
||||||
cell.switchButton.isOn = setting.preferredStaticAvatar
|
cell.switchButton.isOn = setting.preferredStaticAvatar
|
||||||
|
case .preferenceUsingDefaultBrowser:
|
||||||
|
cell.textLabel?.text = L10n.Scene.Settings.Section.Preference.usingDefaultBrowser
|
||||||
|
cell.switchButton.isOn = setting.preferredUsingDefaultBrowser
|
||||||
default:
|
default:
|
||||||
assertionFailure()
|
assertionFailure()
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,26 +81,6 @@ final class AuthenticationService: NSObject {
|
||||||
.assign(to: \.value, on: activeMastodonAuthenticationBox)
|
.assign(to: \.value, on: activeMastodonAuthenticationBox)
|
||||||
.store(in: &disposeBag)
|
.store(in: &disposeBag)
|
||||||
|
|
||||||
activeMastodonAuthenticationBox
|
|
||||||
.receive(on: RunLoop.main)
|
|
||||||
.sink { [weak self] authenticationBox in
|
|
||||||
guard let _ = self else { return }
|
|
||||||
guard let authenticationBox = authenticationBox else { return }
|
|
||||||
let request = Setting.sortedFetchRequest
|
|
||||||
request.predicate = Setting.predicate(domain: authenticationBox.domain, userID: authenticationBox.userID)
|
|
||||||
guard let setting = managedObjectContext.safeFetch(request).first else { return }
|
|
||||||
|
|
||||||
let themeName: ThemeName = setting.preferredTrueBlackDarkMode ? .system : .mastodon
|
|
||||||
if UserDefaults.shared.currentThemeNameRawValue != themeName.rawValue {
|
|
||||||
ThemeService.shared.set(themeName: themeName)
|
|
||||||
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: update theme style", ((#file as NSString).lastPathComponent), #line, #function)
|
|
||||||
}
|
|
||||||
if UserDefaults.shared.preferredStaticAvatar != setting.preferredStaticAvatar {
|
|
||||||
UserDefaults.shared.preferredStaticAvatar = setting.preferredStaticAvatar
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.store(in: &disposeBag)
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
try mastodonAuthenticationFetchedResultsController.performFetch()
|
try mastodonAuthenticationFetchedResultsController.performFetch()
|
||||||
mastodonAuthentications.value = mastodonAuthenticationFetchedResultsController.fetchedObjects ?? []
|
mastodonAuthentications.value = mastodonAuthenticationFetchedResultsController.fetchedObjects ?? []
|
||||||
|
|
|
@ -92,6 +92,7 @@ final class SettingService {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SettingService.updatePreference(setting: setting)
|
||||||
self.currentSettingUpdateSubscription = ManagedObjectObserver.observe(object: setting)
|
self.currentSettingUpdateSubscription = ManagedObjectObserver.observe(object: setting)
|
||||||
.sink(receiveCompletion: { _ in
|
.sink(receiveCompletion: { _ in
|
||||||
// do nothing
|
// do nothing
|
||||||
|
@ -99,12 +100,7 @@ final class SettingService {
|
||||||
guard case .update(let object) = change.changeType,
|
guard case .update(let object) = change.changeType,
|
||||||
let setting = object as? Setting else { return }
|
let setting = object as? Setting else { return }
|
||||||
|
|
||||||
// observe apparance mode
|
SettingService.updatePreference(setting: setting)
|
||||||
switch setting.appearance {
|
|
||||||
case .automatic: UserDefaults.shared.customUserInterfaceStyle = .unspecified
|
|
||||||
case .light: UserDefaults.shared.customUserInterfaceStyle = .light
|
|
||||||
case .dark: UserDefaults.shared.customUserInterfaceStyle = .dark
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
.store(in: &disposeBag)
|
.store(in: &disposeBag)
|
||||||
|
@ -187,3 +183,37 @@ extension SettingService {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension SettingService {
|
||||||
|
|
||||||
|
static func updatePreference(setting: Setting) {
|
||||||
|
// set appearance
|
||||||
|
let userInterfaceStyle: UIUserInterfaceStyle = {
|
||||||
|
switch setting.appearance {
|
||||||
|
case .automatic: return .unspecified
|
||||||
|
case .light: return .light
|
||||||
|
case .dark: return .dark
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if UserDefaults.shared.customUserInterfaceStyle != userInterfaceStyle {
|
||||||
|
UserDefaults.shared.customUserInterfaceStyle = userInterfaceStyle
|
||||||
|
}
|
||||||
|
|
||||||
|
// set theme
|
||||||
|
let themeName: ThemeName = setting.preferredTrueBlackDarkMode ? .system : .mastodon
|
||||||
|
if UserDefaults.shared.currentThemeNameRawValue != themeName.rawValue {
|
||||||
|
ThemeService.shared.set(themeName: themeName)
|
||||||
|
os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: update theme style", ((#file as NSString).lastPathComponent), #line, #function)
|
||||||
|
}
|
||||||
|
|
||||||
|
// set avatar mode
|
||||||
|
if UserDefaults.shared.preferredStaticAvatar != setting.preferredStaticAvatar {
|
||||||
|
UserDefaults.shared.preferredStaticAvatar = setting.preferredStaticAvatar
|
||||||
|
}
|
||||||
|
|
||||||
|
// set browser
|
||||||
|
if UserDefaults.shared.preferredUsingDefaultBrowser != setting.preferredUsingDefaultBrowser {
|
||||||
|
UserDefaults.shared.preferredUsingDefaultBrowser = setting.preferredUsingDefaultBrowser
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue