Enable the Optimised Media Uploads feature. (#3467)

* Enable the Optimised Media Uploads feature.

(Well move the toggle from Developer Options to Advanced Settings)

* Add OptimizeMediaUploads analytics.

* Final strings.

* Upload reduced quality media by default 😢

Move the setting out of the feature flags section in the file.

* Fix unit tests now the default has changed.

* Pull in updated string, fix snapshots.
This commit is contained in:
Doug 2024-10-31 14:14:14 +00:00 committed by GitHub
parent 0da225205b
commit 1f90f1a9f1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 62 additions and 39 deletions

View File

@ -7874,7 +7874,7 @@
repositoryURL = "https://github.com/matrix-org/matrix-analytics-events";
requirement = {
kind = upToNextMinorVersion;
minimumVersion = 0.27.0;
minimumVersion = 0.28.0;
};
};
C13F55E4518415CB4C278E73 /* XCRemoteSwiftPackageReference "DTCoreText" */ = {

View File

@ -131,8 +131,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/matrix-org/matrix-analytics-events",
"state" : {
"revision" : "9bd3c57e84f87d56b69862369f3b9da714d1d151",
"version" : "0.27.0"
"revision" : "632f4266d5ebd5b87b9eb52522f5117723fcd338",
"version" : "0.28.0"
}
},
{

View File

@ -391,8 +391,8 @@
"screen_account_provider_signup_title" = "Youre about to create an account on %@";
"screen_advanced_settings_developer_mode" = "Developer mode";
"screen_advanced_settings_developer_mode_description" = "Enable to have access to features and functionality for developers.";
"screen_advanced_settings_media_compression_description" = "Optimize for upload";
"screen_advanced_settings_media_compression_title" = "Media";
"screen_advanced_settings_media_compression_description" = "Upload photos and videos faster and reduce data usage";
"screen_advanced_settings_media_compression_title" = "Optimise media quality";
"screen_advanced_settings_rich_text_editor_description" = "Disable the rich text editor to type Markdown manually.";
"screen_advanced_settings_send_read_receipts" = "Read receipts";
"screen_advanced_settings_send_read_receipts_description" = "If turned off, your read receipts won't be sent to anyone. You will still receive read receipts from other users.";

View File

@ -32,6 +32,7 @@ final class AppSettings {
case pusherProfileTag
case logLevel
case viewSourceEnabled
case optimizeMediaUploads
case appAppearance
case sharePresence
case hideUnreadMessagesBadge
@ -42,7 +43,6 @@ final class AppSettings {
// Feature flags
case slidingSyncDiscovery
case optimizeMediaUploads
case publicSearchEnabled
case fuzzyRoomListSearchEnabled
case enableOnlySignedDeviceIsolationMode
@ -237,6 +237,9 @@ final class AppSettings {
@UserPreference(key: UserDefaultsKeys.viewSourceEnabled, defaultValue: isDevelopmentBuild, storageType: .userDefaults(store))
var viewSourceEnabled
@UserPreference(key: UserDefaultsKeys.optimizeMediaUploads, defaultValue: true, storageType: .userDefaults(store))
var optimizeMediaUploads
// MARK: - Element Call
@ -275,9 +278,6 @@ final class AppSettings {
@UserPreference(key: UserDefaultsKeys.slidingSyncDiscovery, defaultValue: .native, storageType: .userDefaults(store))
var slidingSyncDiscovery: SlidingSyncDiscovery
@UserPreference(key: UserDefaultsKeys.optimizeMediaUploads, defaultValue: false, storageType: .userDefaults(store))
var optimizeMediaUploads
@UserPreference(key: UserDefaultsKeys.knockingEnabled, defaultValue: false, storageType: .userDefaults(store))
var knockingEnabled

View File

@ -27,6 +27,7 @@ struct SettingsFlowCoordinatorParameters {
let appSettings: AppSettings
let navigationSplitCoordinator: NavigationSplitCoordinator
let userIndicatorController: UserIndicatorControllerProtocol
let analytics: AnalyticsService
}
class SettingsFlowCoordinator: FlowCoordinatorProtocol {
@ -174,7 +175,7 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol {
private func presentAnalyticsScreen() {
let coordinator = AnalyticsSettingsScreenCoordinator(parameters: .init(appSettings: parameters.appSettings,
analytics: ServiceLocator.shared.analytics))
analytics: parameters.analytics))
navigationStackCoordinator?.push(coordinator)
}
@ -221,7 +222,8 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol {
}
private func presentAdvancedSettings() {
let coordinator = AdvancedSettingsScreenCoordinator()
let coordinator = AdvancedSettingsScreenCoordinator(parameters: .init(appSettings: parameters.appSettings,
analytics: parameters.analytics))
navigationStackCoordinator.push(coordinator)
}

View File

@ -99,7 +99,8 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol {
secureBackupController: userSession.clientProxy.secureBackupController,
appSettings: appSettings,
navigationSplitCoordinator: navigationSplitCoordinator,
userIndicatorController: ServiceLocator.shared.userIndicatorController))
userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: analytics))
onboardingFlowCoordinator = OnboardingFlowCoordinator(userSession: userSession,
appLockService: appLockService,

View File

@ -846,9 +846,9 @@ internal enum L10n {
internal static var screenAdvancedSettingsElementCallBaseUrlDescription: String { return L10n.tr("Localizable", "screen_advanced_settings_element_call_base_url_description") }
/// Invalid URL, please make sure you include the protocol (http/https) and the correct address.
internal static var screenAdvancedSettingsElementCallBaseUrlValidationError: String { return L10n.tr("Localizable", "screen_advanced_settings_element_call_base_url_validation_error") }
/// Optimize for upload
/// Upload photos and videos faster and reduce data usage
internal static var screenAdvancedSettingsMediaCompressionDescription: String { return L10n.tr("Localizable", "screen_advanced_settings_media_compression_description") }
/// Media
/// Optimise media quality
internal static var screenAdvancedSettingsMediaCompressionTitle: String { return L10n.tr("Localizable", "screen_advanced_settings_media_compression_title") }
/// Disable the rich text editor to type Markdown manually.
internal static var screenAdvancedSettingsRichTextEditorDescription: String { return L10n.tr("Localizable", "screen_advanced_settings_rich_text_editor_description") }

View File

@ -8,11 +8,16 @@
import Combine
import SwiftUI
struct AdvancedSettingsScreenCoordinatorParameters {
let appSettings: AppSettings
let analytics: AnalyticsService
}
final class AdvancedSettingsScreenCoordinator: CoordinatorProtocol {
private var viewModel: AdvancedSettingsScreenViewModelProtocol
init() {
viewModel = AdvancedSettingsScreenViewModel(advancedSettings: ServiceLocator.shared.settings)
init(parameters: AdvancedSettingsScreenCoordinatorParameters) {
viewModel = AdvancedSettingsScreenViewModel(advancedSettings: parameters.appSettings, analytics: parameters.analytics)
}
func toPresentable() -> AnyView {

View File

@ -26,12 +26,16 @@ struct AdvancedSettingsScreenViewStateBindings {
}
}
enum AdvancedSettingsScreenViewAction { }
enum AdvancedSettingsScreenViewAction {
case optimizeMediaUploadsChanged
}
protocol AdvancedSettingsProtocol: AnyObject {
var viewSourceEnabled: Bool { get set }
var appAppearance: AppAppearance { get set }
var sharePresence: Bool { get set }
var optimizeMediaUploads: Bool { get set }
}
extension AppSettings: AdvancedSettingsProtocol { }

View File

@ -11,12 +11,20 @@ import SwiftUI
typealias AdvancedSettingsScreenViewModelType = StateStoreViewModel<AdvancedSettingsScreenViewState, AdvancedSettingsScreenViewAction>
class AdvancedSettingsScreenViewModel: AdvancedSettingsScreenViewModelType, AdvancedSettingsScreenViewModelProtocol {
init(advancedSettings: AdvancedSettingsProtocol) {
let bindings = AdvancedSettingsScreenViewStateBindings(advancedSettings: advancedSettings)
let state = AdvancedSettingsScreenViewState(bindings: bindings)
private let analytics: AnalyticsService
init(advancedSettings: AdvancedSettingsProtocol, analytics: AnalyticsService) {
self.analytics = analytics
let state = AdvancedSettingsScreenViewState(bindings: .init(advancedSettings: advancedSettings))
super.init(initialViewState: state)
}
override func process(viewAction: AdvancedSettingsScreenViewAction) { }
override func process(viewAction: AdvancedSettingsScreenViewAction) {
switch viewAction {
case .optimizeMediaUploadsChanged:
// Note: Using a view action here as sinking the AppSettings publisher tracks the initial value.
analytics.trackInteraction(name: state.bindings.optimizeMediaUploads ? .MobileSettingsOptimizeMediaUploadsEnabled : .MobileSettingsOptimizeMediaUploadsDisabled)
}
}
}

View File

@ -18,12 +18,20 @@ struct AdvancedSettingsScreen: View {
kind: .picker(selection: $context.appAppearance,
items: AppAppearance.allCases.map { (title: $0.name, tag: $0) }))
ListRow(label: .plain(title: L10n.actionViewSource),
ListRow(label: .plain(title: L10n.actionViewSource,
description: L10n.screenAdvancedSettingsViewSourceDescription),
kind: .toggle($context.viewSourceEnabled))
ListRow(label: .plain(title: L10n.screenAdvancedSettingsSharePresence,
description: L10n.screenAdvancedSettingsSharePresenceDescription),
kind: .toggle($context.sharePresence))
ListRow(label: .plain(title: L10n.screenAdvancedSettingsMediaCompressionTitle,
description: L10n.screenAdvancedSettingsMediaCompressionDescription),
kind: .toggle($context.optimizeMediaUploads))
.onChange(of: context.optimizeMediaUploads) {
context.send(viewAction: .optimizeMediaUploadsChanged)
}
}
}
.compoundList()
@ -48,7 +56,8 @@ private extension AppAppearance {
// MARK: - Previews
struct AdvancedSettingsScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = AdvancedSettingsScreenViewModel(advancedSettings: ServiceLocator.shared.settings)
static let viewModel = AdvancedSettingsScreenViewModel(advancedSettings: ServiceLocator.shared.settings,
analytics: ServiceLocator.shared.analytics)
static var previews: some View {
NavigationStack {
AdvancedSettingsScreen(context: viewModel.context)

View File

@ -46,7 +46,6 @@ protocol DeveloperOptionsProtocol: AnyObject {
var hideUnreadMessagesBadge: Bool { get set }
var fuzzyRoomListSearchEnabled: Bool { get set }
var hideTimelineMedia: Bool { get set }
var optimizeMediaUploads: Bool { get set }
var enableOnlySignedDeviceIsolationMode: Bool { get set }
var elementCallBaseURLOverride: URL? { get set }
var knockingEnabled: Bool { get set }

View File

@ -62,12 +62,6 @@ struct DeveloperOptionsScreen: View {
}
}
Section("Media") {
Toggle(isOn: $context.optimizeMediaUploads) {
Text("Optimise for upload")
}
}
Section {
Toggle(isOn: $context.enableOnlySignedDeviceIsolationMode) {
Text("Exclude insecure devices when sending/receiving messages")

View File

@ -17,6 +17,7 @@ final class MediaUploadingPreprocessorTests: XCTestCase {
override func setUp() {
AppSettings.resetAllSettings()
appSettings = AppSettings()
appSettings.optimizeMediaUploads = false
ServiceLocator.shared.register(appSettings: appSettings)
mediaUploadingPreprocessor = MediaUploadingPreprocessor(appSettings: appSettings)
}

View File

@ -68,7 +68,7 @@ packages:
# path: ../compound-ios
AnalyticsEvents:
url: https://github.com/matrix-org/matrix-analytics-events
minorVersion: 0.27.0
minorVersion: 0.28.0
# path: ../matrix-analytics-events
Emojibase:
url: https://github.com/matrix-org/emojibase-bindings