Compare commits

...

19 Commits

Author SHA1 Message Date
Jan Niklas Grabowski
9d52591c5c Merge branch 'release/v2.28.0' 2026-03-31 16:11:21 +02:00
JanNiklas Grabowski
d84b593459 Merge branch 'releaseprep/v2.28.0' into 'release/v2.28.0'
chore: update changelog (MESSENGER-8137)

See merge request bwmessenger/bundesmessenger/bundesmessenger-ios!457
2026-03-31 13:40:19 +00:00
Jan Niklas Grabowski
c92ef3961e fix: remove share button (MESSENGER-8137) 2026-03-31 14:30:32 +02:00
Jan Niklas Grabowski
56e02e7136 chore: update changelog (MESSENGER-8137) 2026-03-27 11:52:06 +01:00
Frank Rotermund
844a41528a Merge branch 'feature/7555_small_fixes_for_migration_3' into 'develop'
fix: Fix Appstore Page on Login and Texts (MESSENGER-7555)

See merge request bwmessenger/bundesmessenger/bundesmessenger-ios!456
2026-03-20 12:25:48 +00:00
Frank Rotermund
535035a083 fix: mdm no second page (MESSENGER-7555) 2026-03-20 12:07:59 +01:00
Frank Rotermund
d2410313f6 fix: more wording mdm (MESSENGER-7555) 2026-03-20 07:08:47 +01:00
Frank Rotermund
0ae1896cf5 fix: wording mdm (MESSENGER-7555) 2026-03-19 15:27:58 +01:00
Frank Rotermund
fbb133f4ce fix: Fix Appstore Page on Login and Texts (MESSENGER-7555) 2026-03-19 14:52:20 +01:00
Arnfried Griesert
5196518d0a Merge branch 'feature/7555_migration_part_3' into 'develop'
Feature/7555 migration part 3

See merge request bwmessenger/bundesmessenger/bundesmessenger-ios!451
2026-03-17 13:55:15 +00:00
Arnfried Griesert
585f4a852d Feature/7555 migration part 3 2026-03-17 13:55:15 +00:00
Frank Rotermund
4515ab49e4 Merge branch 'feature/8170_login_via_full_matrix_id' into 'develop'
fix: login via matrix id should not change the homeserver (MESSENGER-8170)

See merge request bwmessenger/bundesmessenger/bundesmessenger-ios!455
2026-03-05 13:27:58 +00:00
Frank Rotermund
47530b2f19 fix: login via matrix id should not change the homeserver (MESSENGER-8170) 2026-03-05 07:35:35 +01:00
Frank Rotermund
0d4101398c Merge branch 'master' into develop 2026-02-10 14:46:05 +01:00
Frank Rotermund
89767f978b Merge branch 'hotfix/v2.27.3' 2026-02-10 14:46:04 +01:00
Frank Rotermund
46771b7b83 Merge branch 'hotfix/releaseprep_2.27.3' into 'hotfix/v2.27.3'
Hotfix/releaseprep 2.27.3

See merge request bwmessenger/bundesmessenger/bundesmessenger-ios!453
2026-02-10 12:58:51 +00:00
Frank Rotermund
1b87d30969 feat: build fix new editor version (MESSENGER-8082) 2026-02-09 15:08:20 +01:00
Frank Rotermund
1ad45d21df feat: hotfix wysiwyg editor crashes and freezes (MESSENGER-8082) 2026-02-09 14:10:49 +01:00
Arnfried Griesert
c6df114ccb Merge tag 'v2.27.0' into develop
no message
2025-12-10 06:26:46 +01:00
24 changed files with 452 additions and 153 deletions

View File

@@ -1,3 +1,22 @@
Changes in BWI project 2.28.0 (2026-03-27)
===================================================
Improvements 🙌:
- MESSENGER-7555 add migration level 3
- MESSENGER-7555 add migration with mdm
Bugfix 🙌:
- MESSENGER-8170 fix login via full matrix id
Changes in BWI project 2.27.3 (2026-02-09)
===================================================
Improvements 🙌:
- MESSENGER-8082 Use latest version of wysiwyg editor to fix crashes on fast tipping
Bugfix 🙌:
- MESSENGER-8116 Fix freeze caused by recursion in view height change caused by the wysiwyg editor
Changes in BWI project 2.27.0 (2025-12-09)
===================================================

View File

@@ -17,5 +17,5 @@
// Version
MARKETING_VERSION = 2.26.0
MARKETING_VERSION = 2.28.0
CURRENT_PROJECT_VERSION = 20220714163152

View File

@@ -684,6 +684,15 @@ class BWIBuildSettings: NSObject {
@UserDefault(key: UserDefaultsKeys.didBuMXMigrationInfoLevelKey, defaultValue: 0, storage: RiotSettings.defaults)
var didShowBuMXMigrationInfoLevel
// Migration level already shown (BWI #8123)
var isManagedViaMDM: Bool {
guard let managedConfig = UserDefaults.standard.dictionary(forKey: "com.apple.configuration.managed"),
let value = managedConfig["install_bumx_via_mdm"] as? Bool else {
return false
}
return value
}
// shows the grey/green/red shield for the room avatar / user avatar
var showEncryptionStatusBadgeOnAvatar = false
@@ -724,4 +733,7 @@ class BWIBuildSettings: NSObject {
// MARK: Enable Room Retention
var enableRoomRetention = false
// MARK: homeserver selection via full qualified matrix id
var allowMatrixIDForHomeserverSelection = false
}

View File

@@ -51,7 +51,7 @@ def import_MatrixKit_pods
pod 'libPhoneNumber-iOS', '~> 0.9.13'
pod 'DTCoreText', '1.6.26'
#pod 'DTCoreText/Extension', '~> 1.6.25'
pod 'Down', '~> 0.11.0'
pod 'Down', :git => 'https://github.com/vvorlov/Down.git', :branch => 'master'
end
def import_SwiftUI_pods

View File

@@ -80,7 +80,7 @@ PODS:
- ZXingObjC/All (3.6.9)
DEPENDENCIES:
- Down (~> 0.11.0)
- Down (from `https://github.com/vvorlov/Down.git`, branch `master`)
- DSWaveformImage (~> 6.1.1)
- DTCoreText (= 1.6.26)
- DTTJailbreakDetection (~> 0.4.0)
@@ -107,7 +107,6 @@ DEPENDENCIES:
SPEC REPOS:
https://github.com/CocoaPods/Specs.git:
- AFNetworking
- Down
- DSWaveformImage
- DTCoreText
- DTFoundation
@@ -137,18 +136,24 @@ SPEC REPOS:
- ZXingObjC
EXTERNAL SOURCES:
Down:
:branch: master
:git: https://github.com/vvorlov/Down.git
MatrixSDK:
:git: https://dl-gitlab.example.com/bwmessenger/bundesmessenger/bundesmessenger-ios-sdk
:tag: v2.26.0
CHECKOUT OPTIONS:
Down:
:commit: dbb02cc9d16363874b7a0c6c48b9efe09bd5b006
:git: https://github.com/vvorlov/Down.git
MatrixSDK:
:git: https://dl-gitlab.example.com/bwmessenger/bundesmessenger/bundesmessenger-ios-sdk
:tag: v2.26.0
SPEC CHECKSUMS:
AFNetworking: 3bd23d814e976cd148d7d44c3ab78017b744cd58
Down: b6ba1bc985c9d2f4e15e3b293d2207766fa12612
Down: 10462c9cb3a6ef28e0996739329c4976b13870f7
DSWaveformImage: 3c718a0cf99291887ee70d1d0c18d80101d3d9ce
DTCoreText: ec749e013f2e1f76de5e7c7634642e600a7467ce
DTFoundation: 76b624967cf5bcaae6bb057d622c536c36ef36d0
@@ -162,7 +167,7 @@ SPEC CHECKSUMS:
libbase58: 8abc2a53ac38cd37720c0acbc53ef3660e9016c2
libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75
MatomoTracker: 1d98ddc58322fd9d65e1a6886b8e41363047bd13
MatrixSDK: 0c394a7a3928208797d403bcf5706b6628690a96
MatrixSDK: 45f9f97e7424e5d8731bf6b207c728a71caa8eb1
MatrixSDKCrypto: e44608012cae9befc52f13cd8e56c6f51ac83702
ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d
Realm: 9ca328bd7e700cc19703799785e37f77d1a130f2
@@ -178,6 +183,6 @@ SPEC CHECKSUMS:
zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c
ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5
PODFILE CHECKSUM: 34582260e0e8275df7a07d3947cdac7794125b8e
PODFILE CHECKSUM: 92b7ae8a330216932c5a690e48743b4d7b1bdea8
COCOAPODS: 1.15.2
COCOAPODS: 1.16.2

View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1200"
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForTesting = "NO"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
@@ -26,10 +26,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
disableMainThreadChecker = "YES"
codeCoverageEnabled = "YES"
onlyGenerateCoverageForSpecifiedTargets = "YES">
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -39,26 +36,7 @@
ReferencedContainer = "container:Riot.xcodeproj">
</BuildableReference>
</MacroExpansion>
<CodeCoverageTargets>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "57B13CC4586E9D43ED24DE1E"
BuildableName = "Element.app"
BlueprintName = "Riot"
ReferencedContainer = "container:Riot.xcodeproj">
</BuildableReference>
</CodeCoverageTargets>
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "287703423C2C302524E92C03"
BuildableName = "RiotTests.xctest"
BlueprintName = "RiotTests"
ReferencedContainer = "container:Riot.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction

View File

@@ -105,8 +105,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/element-hq/matrix-rich-text-editor-swift",
"state" : {
"revision" : "b6583a47b5d14d2dc8405a0303ebd4041b877707",
"version" : "2.37.12"
"revision" : "5f703d05bbf39f3026cc3c0697aab753a71fd83b",
"version" : "2.41.0"
}
},
{

View File

@@ -750,18 +750,22 @@
// MARK: migration to new client
// Banner
"bwi_mobile_dialog_m_banner_title" = "Wechsel zum BundesMessengerX";
"bwi_mobile_dialog_m1_banner_text" = "Das ist eine neue, technisch optimierte App vom BuM. Du kannst sie jetzt schon ausprobieren, bevor bald alle wechseln müssen.";
"bwi_mobile_dialog_m1_banner_text_prefix" = "Das ist eine neue, technisch optimierte App vom BuM. Du kannst sie jetzt schon ausprobieren, bevor bald alle wechseln müssen.";
"bwi_mobile_dialog_m1_banner_text_bold" = " Alle deine Kontakte und Nachrichten bleiben dabei erhalten.";
"bwi_mobile_dialog_m2_banner_text_prefix" = "Das ist eine neue, technisch optimierte App vom BuM. Du hast nur noch";
"bwi_mobile_dialog_m2_banner_text_bold" = " wenige Tage";
"bwi_mobile_dialog_m2_banner_text_suffix" = " Zeit zu wechseln. Alle deine Kontakte und Nachrichten bleiben dabei erhalten.";
"bwi_mobile_dialog_mdm_banner_text_prefix" = "Das ist eine neue, technisch optimierte App vom BuM, welche dir bald von deinem Admin zur Verfügung gestellt wird.";
"bwi_mobile_dialog_mdm_banner_text_bold" = " Alle deine Kontakte und Nachrichten bleiben dabei bestehen, halte dafür deine Login Daten bereit.";
"bwi_mobile_dialog_m_banner_button2" = "Erfahre mehr";
"bwi_mobile_dialog_m_banner_button1" = "Später erinnern";
// Sheet page 1
"bwi_mobile_dialog_m_more_title" = "BundesMessengerX";
"bwi_mobile_dialog_m1_more_text_1" = "Diese App wird bald abgeschaltet und durch eine neue technisch optimierte App ersetzt ";
"bwi_mobile_dialog_m1_more_text_1" = "Der BuM wird bald abgeschaltet und durch den BuMX ersetzt. Dies ist eine neue, technisch optimierte App ";
"bwi_mobile_dialog_m3_more_text_1" = "Der BuM wurde nun abgeschaltet und durch den BuMX ersetzt. Dies ist eine neue, technisch optimierte App ";
"bwi_mobile_dialog_m3_more_text_1_mdm" = "Der BuM wurde nun abgeschaltet und durch den BuMX ersetzt. Dies ist eine neue, technisch optimierte App, welche dir von deinem Admin zur Verfügung gestellt wird ";
"bwi_mobile_dialog_m1_more_text_2" = "(alle deine Kontakte und Nachrichten bleiben erhalten).";
"bwi_mobile_dialog_m1_more_text_3" = "\n\nDich erwartet u.a.:";
"bwi_mobile_dialog_m1_more_text_bullet_1" = "schnellere Performance";
@@ -777,7 +781,11 @@
"bwi_mobile_dialog_m_more_button" = "Neue App herunterladen";
"bwi_mobile_dialog_m_more_success" = "Benutzername kopiert";
"bwi_a11y_close_button" = "Ansicht schließen";
// Migration Success
"bwi_mobile_dialog_m3_success_change_title" = "Wechsel erfolgreich 🎉";
"bwi_mobile_dialog_m3_success_text" = "Diese App kannst du nun löschen.";
"bwi_all_common_close" = "Schließen";
"bwi_all_common_got_it" = "Verstanden";
// MARK: owner handling
"room_member_power_level_owner_in" = "Inhaber von %@";

View File

@@ -663,23 +663,28 @@
// MARK: migration to new client
// Banner
"bwi_mobile_dialog_m_banner_title" = "Change to BundesMessengerX";
"bwi_mobile_dialog_m1_banner_text" = "This is a new technically optimized app from BuM. You can try it out now before everyone has to switch soon.";
"bwi_mobile_dialog_m1_banner_text_prefix" = "This is a new, technically optimized app from BuM. You can try it out now before everyone has to switch soon. ";
"bwi_mobile_dialog_m1_banner_text_bold" = " All your contacts and messages will be retained.";
"bwi_mobile_dialog_m2_banner_text_prefix" = "This is a new technically optimized app from BuM. You only have";
"bwi_mobile_dialog_m2_banner_text_prefix" = "This is a new, technically optimized app from BuM. You only have";
"bwi_mobile_dialog_m2_banner_text_bold" = " a few days";
"bwi_mobile_dialog_m2_banner_text_suffix" = " to switch. All your contacts and messages will be retained.";
"bwi_mobile_dialog_mdm_banner_text_prefix" = "This is a new, technically optimized app from BuM, which will soon be made available to you by your administrator.";
"bwi_mobile_dialog_mdm_banner_text_bold" = " All your contacts and messages will remain intact, so please have your login details ready.";
"bwi_mobile_dialog_m_banner_button2" = "Learn more";
"bwi_mobile_dialog_m_banner_button1" = "Remember later";
// Sheet page 1
"bwi_mobile_dialog_m_more_title" = "BundesMessengerX";
"bwi_mobile_dialog_m1_more_text_1" = "This app will soon be shut down and replaced by a new technically optimized app ";
"bwi_mobile_dialog_m1_more_text_2" = "(all your contacts and messages will remain).";
"bwi_mobile_dialog_m1_more_text_3" = "\n\nAmong other things, you can expect:";
"bwi_mobile_dialog_m1_more_text_bullet_1" = "faster performance";
"bwi_mobile_dialog_m1_more_text_bullet_2" = "improved design";
"bwi_mobile_dialog_m1_more_text_bullet_3" = "new functions, such as pinning messages";
"bwi_mobile_dialog_m1_more_text_bullet_4" = "optimized accessibility";
"bwi_mobile_dialog_m1_more_text_1" = "BuM will soon be switched off and replaced by BumX. This is a new, technically optimized app ";
"bwi_mobile_dialog_m3_more_text_1" = "BuM has been switched off and replaced by BumX. This is a new, technically optimized app ";
"bwi_mobile_dialog_m3_more_text_1_mdm" = "BuM has been switched off and replaced by BumX. This is a new, technically optimized app, which will soon be made available by your administrator ";
"bwi_mobile_dialog_m1_more_text_2" = "(all your contacts and messages will be retained).";
"bwi_mobile_dialog_m1_more_text_3" = "\n\nYou can expect:";
"bwi_mobile_dialog_m1_more_text_bullet_1" = "Faster performance";
"bwi_mobile_dialog_m1_more_text_bullet_2" = "Improved design";
"bwi_mobile_dialog_m1_more_text_bullet_3" = "New functions, such as pinning messages";
"bwi_mobile_dialog_m1_more_text_bullet_4" = "Optimized accessibility";
// Sheet page 2
"bwi_mobile_dialog_m_more2_title" = "Change now:";
@@ -689,7 +694,11 @@
"bwi_mobile_dialog_m_more_button" = "Download new app";
"bwi_mobile_dialog_m_more_success" = "user name copied";
"bwi_a11y_close_button" = "Close window";
// Migration Success
"bwi_mobile_dialog_m3_success_change_title" = "Switch successful 🎉";
"bwi_mobile_dialog_m3_success_text" = "You can now delete this app.";
"bwi_all_common_close" = "Close";
"bwi_all_common_got_it" = "Got it";
// MARK: owner handling
"room_member_power_level_owner_in" = "Owner in %@";

View File

@@ -26,6 +26,33 @@
</style>
</head>
<body>
<div>
<p>
<b>Version 2.28.0</b>
</p>
<p>
<b>Verbesserungen</b>
<ul>
<li/>Die neuesten Sicherheitsupdates wurden eingespielt.
<li/>Kleinere Fehlerkorrekturen.
</ul>
</p>
</div>
<div>
<p>
<b>Version 2.27.3</b>
</p>
<p>
<b>Behobene Bugs</b>
<ul>
<li/>Wir haben Abstürze und Einfrieren bei der Texteingabe mit dem neuen Editor behoben.
</ul>
</p>
</div>
<div>
<p>
<b>Version 2.27.0</b>

View File

@@ -131,10 +131,6 @@ public class BWIL10n: NSObject {
public static var bumAutheticationTitle: String {
return BWIL10n.tr("Bwi", "bum_authetication_title")
}
/// Ansicht schließen
public static var bwiA11yCloseButton: String {
return BWIL10n.tr("Bwi", "bwi_a11y_close_button")
}
/// Barrierefreiheitserklärung
public static var bwiAccessibilityDeclarationButtonTitle: String {
return BWIL10n.tr("Bwi", "bwi_accessibility_declaration_button_title")
@@ -143,6 +139,14 @@ public class BWIL10n: NSObject {
public static var bwiActivateLabsAlertTitle: String {
return BWIL10n.tr("Bwi", "bwi_activate_labs_alert_title")
}
/// Schließen
public static var bwiAllCommonClose: String {
return BWIL10n.tr("Bwi", "bwi_all_common_close")
}
/// Verstanden
public static var bwiAllCommonGotIt: String {
return BWIL10n.tr("Bwi", "bwi_all_common_got_it")
}
/// Wir brauchen Deine Hilfe, um Fehler im %@ besser analysieren zu können. Dazu würden wir gerne anonymisierte Diagnosedaten erfassen. Es werden keine Daten an Dritte übermittelt. Details findest Du in der Datenschutzerklärung.\n\nFalls Du nicht mehr mithelfen möchtest, kannst Du dies in den Einstellungen jederzeit wieder deaktivieren.\n\nMöchtest du bei der Fehler-Analyse unterstützen?
public static func bwiAnalyticsAlertBody(_ p1: String) -> String {
return BWIL10n.tr("Bwi", "bwi_analytics_alert_body", p1)
@@ -307,7 +311,15 @@ public class BWIL10n: NSObject {
public static var bwiMdmLogoutMessage: String {
return BWIL10n.tr("Bwi", "bwi_mdm_logout_message")
}
/// Diese App wird bald abgeschaltet und durch eine neue technisch optimierte App ersetzt
/// Alle deine Kontakte und Nachrichten bleiben dabei erhalten.
public static var bwiMobileDialogM1BannerTextBold: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m1_banner_text_bold")
}
/// Das ist eine neue, technisch optimierte App vom BuM. Du kannst sie jetzt schon ausprobieren, bevor bald alle wechseln müssen.
public static var bwiMobileDialogM1BannerTextPrefix: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m1_banner_text_prefix")
}
/// Der BuM wird bald abgeschaltet und durch den BuMX ersetzt. Dies ist eine neue, technisch optimierte App
public static var bwiMobileDialogM1MoreText1: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m1_more_text_1")
}
@@ -335,6 +347,34 @@ public class BWIL10n: NSObject {
public static var bwiMobileDialogM1MoreTextBullet4: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m1_more_text_bullet_4")
}
/// wenige Tage
public static var bwiMobileDialogM2BannerTextBold: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m2_banner_text_bold")
}
/// Das ist eine neue, technisch optimierte App vom BuM. Du hast nur noch
public static var bwiMobileDialogM2BannerTextPrefix: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m2_banner_text_prefix")
}
/// Zeit zu wechseln. Alle deine Kontakte und Nachrichten bleiben dabei erhalten.
public static var bwiMobileDialogM2BannerTextSuffix: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m2_banner_text_suffix")
}
/// Der BuM wurde nun abgeschaltet und durch den BuMX ersetzt. Dies ist eine neue, technisch optimierte App
public static var bwiMobileDialogM3MoreText1: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m3_more_text_1")
}
/// Der BuM wurde nun abgeschaltet und durch den BuMX ersetzt. Dies ist eine neue, technisch optimierte App, welche dir von deinem Admin zur Verfügung gestellt wird
public static var bwiMobileDialogM3MoreText1Mdm: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m3_more_text_1_mdm")
}
/// Wechsel erfolgreich 🎉
public static var bwiMobileDialogM3SuccessChangeTitle: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m3_success_change_title")
}
/// Diese App kannst du nun löschen.
public static var bwiMobileDialogM3SuccessText: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m3_success_text")
}
/// Später erinnern
public static var bwiMobileDialogMBannerButton1: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m_banner_button1")
@@ -375,13 +415,13 @@ public class BWIL10n: NSObject {
public static var bwiMobileDialogMMoreTitle: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_m_more_title")
}
/// Das ist eine neue, technisch optimierte App vom BuM. Du kannst sie jetzt schon ausprobieren, bevor bald alle wechseln müssen.
public static var bwiMobileMdialogM1BannerText: String {
return BWIL10n.tr("Bwi", "bwi_mobileMdialog_m1_banner_text")
/// Alle deine Kontakte und Nachrichten bleiben dabei bestehen, halte dafür deine Login Daten bereit.
public static var bwiMobileDialogMdmBannerTextBold: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_mdm_banner_text_bold")
}
/// Alle deine Kontakte und Nachrichten bleiben dabei erhalten.
public static var bwiMobileMdialogM1BannerTextBold: String {
return BWIL10n.tr("Bwi", "bwi_mobileMdialog_m1_banner_text_bold")
/// Das ist eine neue, technisch optimierte App vom BuM, welche dir bald von deinem Admin zur Verfügung gestellt wird.
public static var bwiMobileDialogMdmBannerTextPrefix: String {
return BWIL10n.tr("Bwi", "bwi_mobile_dialog_mdm_banner_text_prefix")
}
/// Meine Notizen
public static var bwiNotesRoomTitle: String {

View File

@@ -9,18 +9,20 @@ import Foundation
import KeychainAccess
/// Extension on Keychain to get/set booleans
#if !S_BUM_APP
extension Keychain {
public func set(_ value: Bool, key: String, ignoringAttributeSynchronizable: Bool = true) throws {
try set(value.description, key: key, ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)
}
public func getBool(_ key: String, ignoringAttributeSynchronizable: Bool = true) throws -> Bool? {
guard let value = try getString(key, ignoringAttributeSynchronizable: ignoringAttributeSynchronizable) else {
return nil
}
guard value == true.description || value == false.description else { return nil }
return value == true.description
}
}
public func set(_ value: Bool, key: String, ignoringAttributeSynchronizable: Bool = true) throws {
try set(value.description, key: key, ignoringAttributeSynchronizable: ignoringAttributeSynchronizable)
}
public func getBool(_ key: String, ignoringAttributeSynchronizable: Bool = true) throws -> Bool? {
guard let value = try getString(key, ignoringAttributeSynchronizable: ignoringAttributeSynchronizable) else {
return nil
}
guard value == true.description || value == false.description else { return nil }
return value == true.description
}
}
#endif

View File

@@ -90,9 +90,17 @@ Matrix session observer used to detect new opened sessions.
{
self.registrationForRemoteNotificationsCompletion = completion;
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
// BWI #7555 migration part 3
if([[BWIBuildSettings shared] BuMXMigrationInfoLevel] < 2) {
dispatch_async(dispatch_get_main_queue(), ^{
// Even after we unregistered from Apples push service we must make sure that
// the app will not register again. After reaching migration level 3 this app should neither show
// remote notifications any more nor register for new notifications.
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
}
// BWI #7555 END
}
- (void)didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

View File

@@ -775,6 +775,13 @@ class AllChatsCoordinator: NSObject, SplitViewMasterCoordinatorProtocol {
// BWI #7564 add migration level
if let migrationLevel = wellknown?.migrationInfoLevel() {
BWIBuildSettings.shared.BuMXMigrationInfoLevel = migrationLevel
// BWI #7555 migration part 3
if migrationLevel == 3 {
// Inform Apple that this app on this device can be ignored
UIApplication.shared.unregisterForRemoteNotifications()
}
// BWI #7564 END
}
// BWI #7564 END
self.bwiCheckForMatomoPromt()

View File

@@ -249,7 +249,7 @@ class AllChatsViewController: HomeViewController {
roomFilterButton?.isSelected = !AllChatsLayoutSettingsManager.shared.allChatLayoutSettings.filters.isEmpty
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
@@ -285,6 +285,21 @@ class AllChatsViewController: HomeViewController {
NotificationCenter.default.addObserver(self, selector: #selector(self.spaceListDidChange), name: MXSpaceService.didBuildSpaceGraph, object: nil)
set(tableHeadeView: self.bannerView)
// BWI #7555 migration part 3
if BWIBuildSettings.shared.BuMXMigrationInfoLevel == 3 {
let migrationInfoView = MigrationInfoView(username: "") {
return self.mainSession.myUser.username()
}.environmentObject(BWIThemeService.shared).interactiveDismissDisabled(true)
let hostingViewController = UIHostingController(rootView: migrationInfoView)
if hostingViewController.popoverPresentationController != nil {
hostingViewController.modalPresentationStyle = .popover
}
hostingViewController.isModalInPresentation = true
self.navigationController?.present(hostingViewController, animated: false, completion: nil)
}
// BWI #7555 END
}
override func viewDidAppear(_ animated: Bool) {
@@ -317,6 +332,7 @@ class AllChatsViewController: HomeViewController {
}
AppDelegate.theDelegate().checkAppVersion()
}
func presentFederationIntroductionSheet() {

View File

@@ -9,7 +9,10 @@ Please see LICENSE in the repository root for full details.
#import "MXKPreviewViewController.h"
@import QuickLook;
@interface MXKPreviewViewController () <QLPreviewControllerDataSource>
@interface MXKPreviewViewController () <QLPreviewControllerDataSource> {
// BWI #8137 remove share button
NSTimer *removeShareButtonTimer;
}
/// A specialized view controller for previewing an item.
@property (nonatomic, weak) QLPreviewController *previewController;
@@ -63,22 +66,20 @@ Please see LICENSE in the repository root for full details.
if (!self.allowActions)
{
NSMutableArray *items = [NSMutableArray arrayWithArray: self.previewController.navigationItem.rightBarButtonItems];
if (items.count > 0)
{
[items removeObjectAtIndex:0];
}
self.previewController.navigationItem.rightBarButtonItems = items;
// bwi: no toolbar items to disallow share files
self.previewController.toolbarItems = nil;
// bwi: no title to disallow sharing/printing
self.previewController.navigationItem.title = @"";
// BWI #8137 remove share button
[removeShareButtonTimer invalidate];
removeShareButtonTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
[self removeShareButtons];
}];
}
}
- (IBAction)doneAction:(id)sender
{
// BWI #8137 remove share button
[removeShareButtonTimer invalidate];
removeShareButtonTimer = nil;
[self dismissViewControllerAnimated:YES completion:^{
if ([self.previewDelegate respondsToSelector:@selector(previewViewControllerDidEndPreview:)]) {
[self.previewDelegate previewViewControllerDidEndPreview:self];
@@ -86,6 +87,21 @@ Please see LICENSE in the repository root for full details.
}];
}
// BWI #8137 remove share button
- (void)removeShareButtons
{
NSMutableArray *items = [NSMutableArray arrayWithArray: self.previewController.navigationItem.rightBarButtonItems];
if (items.count > 0)
{
[items removeObjectAtIndex:0];
}
self.previewController.navigationItem.rightBarButtonItems = items;
// bwi: no toolbar items to disallow share files
self.previewController.toolbarItems = nil;
// bwi: no title to disallow sharing/printing
self.previewController.navigationItem.title = @"";
}
#pragma mark - QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(nonnull QLPreviewController *)controller

View File

@@ -380,8 +380,12 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp
}
private func updateToolbarHeight(wysiwygHeight: CGFloat) {
self.heightConstraint.constant = wysiwygHeight
toolbarViewDelegate?.roomInputToolbarView?(self, heightDidChanged: wysiwygHeight, completion: nil)
// bwi: #8116 fix freeze caused by rouding errors
if (wysiwygHeight - self.heightConstraint.constant).magnitude > 1 {
self.heightConstraint.constant = wysiwygHeight
toolbarViewDelegate?.roomInputToolbarView?(self, heightDidChanged: wysiwygHeight, completion: nil)
}
}
private func sendWysiwygMessage(content: WysiwygComposerContent) {

View File

@@ -206,23 +206,27 @@ final class AuthenticationLoginCoordinator: Coordinator, Presentable {
}
@MainActor private func parseUsername(_ username: String) {
guard MXTools.isMatrixUserIdentifier(username) else { return }
let domain = username.components(separatedBy: ":")[1]
let homeserverAddress = HomeserverAddress.sanitized(domain)
startLoading(isInteractionBlocking: false)
currentTask = Task { [weak self] in
do {
try await authenticationService.startFlow(.login, for: homeserverAddress)
guard !Task.isCancelled else { return }
updateViewModel()
self?.stopLoading()
} catch {
self?.stopLoading()
self?.handleError(error)
// bwi #8170 no homeserver over matrix ID ch
if BWIBuildSettings.shared.allowMatrixIDForHomeserverSelection {
guard MXTools.isMatrixUserIdentifier(username) else { return }
let domain = username.components(separatedBy: ":")[1]
let homeserverAddress = HomeserverAddress.sanitized(domain)
startLoading(isInteractionBlocking: false)
currentTask = Task { [weak self] in
do {
try await authenticationService.startFlow(.login, for: homeserverAddress)
guard !Task.isCancelled else { return }
updateViewModel()
self?.stopLoading()
} catch {
self?.stopLoading()
self?.handleError(error)
}
}
}
}

View File

@@ -21,6 +21,10 @@ struct AuthenticationLoginScreen: View {
/// This must be manually set back to `false` when the text field finishes editing.
@State private var isPasswordFocused = false
// BWI #7555 migration part 3
@State private var showMigrationView = BWIBuildSettings.shared.BuMXMigrationInfoLevel == 3
// BWI #7555 END
// MARK: Public
@ObservedObject var viewModel: AuthenticationLoginViewModel.Context
@@ -110,6 +114,13 @@ struct AuthenticationLoginScreen: View {
.background(theme.colors.background.ignoresSafeArea())
.alert(item: $viewModel.alertInfo) { $0.alert }
.accentColor(theme.colors.accent)
// BWI #7555 migration part 3
.sheet(isPresented: $showMigrationView) {
MigrationInfoView(username: "", getUserName: nil)
.environmentObject(BWIThemeService.shared)
.interactiveDismissDisabled(true)
}
// BWI #7555 END
}
/// The header containing a Welcome Back title.
@@ -163,6 +174,7 @@ struct AuthenticationLoginScreen: View {
Button(action: submit) {
Text(getCustomText(text: .submit))
}
.disabled(BWIBuildSettings.shared.BuMXMigrationInfoLevel > 2) // BWI #7555 migration part 3
.buttonStyle(PrimaryActionButtonStyle())
.disabled(!viewModel.viewState.canSubmit)
.accessibilityIdentifier("nextButton")

View File

@@ -127,6 +127,9 @@ class CompletionSuggestionService: CompletionSuggestionServiceProtocol {
}
case .custom:
break
// bwi: 8082 add additional case from editor, no element app uses this, so we just break
case .colon:
break
}
}

View File

@@ -91,11 +91,12 @@ protocol FeatureBannerDelegate {
}
func didPressShowDetails() {
let migrationInfoView = MigrationInfoView(username: username).environmentObject(BWIThemeService.shared).interactiveDismissDisabled(true)
let migrationInfoView = MigrationInfoView(username: username, getUserName: nil).environmentObject(BWIThemeService.shared).interactiveDismissDisabled(true)
let hostingViewController = UIHostingController(rootView: migrationInfoView)
if hostingViewController.popoverPresentationController != nil {
hostingViewController.modalPresentationStyle = .popover
}
hostingViewController.isModalInPresentation = true
hostingController.parent?.present(hostingViewController, animated: true, completion: nil)
}
@@ -155,8 +156,12 @@ struct FeatureBannerView: View {
var advertisementText: some View {
VStack {
VStack {
if BWIBuildSettings.shared.BuMXMigrationInfoLevel == 1 {
Text(BWIL10n.bwiMobileDialogM1BannerText) +
if BWIBuildSettings.shared.isManagedViaMDM {
Text(BWIL10n.bwiMobileDialogMdmBannerTextPrefix) +
Text(BWIL10n.bwiMobileDialogMdmBannerTextBold)
.bold()
} else if BWIBuildSettings.shared.BuMXMigrationInfoLevel == 1 {
Text(BWIL10n.bwiMobileDialogM1BannerTextPrefix) +
Text(BWIL10n.bwiMobileDialogM1BannerTextBold)
.bold()
} else {

View File

@@ -23,15 +23,24 @@ struct MigrationInfoView: View {
@State private var selectedTab = 1
@EnvironmentObject var themeService: BWIThemeService
@State var redrawKey = UUID()
@State var migrationFinished = SharedKeychain.load(account: "migration_finished") == "true"
let username: String
let getUserName: (() -> String?)?
var body: some View {
TabView(selection: $selectedTab) {
MigrationInfoViewOne()
.tag(1)
MigrationInfoViewTwo(username: username)
.tag(2)
if migrationFinished {
MigrationSuccessView()
.tag(1)
} else {
MigrationInfoViewOne()
.tag(1)
if !BWIBuildSettings.shared.isManagedViaMDM {
MigrationInfoViewTwo(username: username, getUserName: getUserName)
.tag(2)
}
}
}
.id(redrawKey)
.tabViewStyle(.page)
@@ -58,7 +67,8 @@ struct MigrationInfoView: View {
.foregroundColor(Color(themeService.theme.colors.tertiaryContent))
.padding(20)
}
.accessibilityLabel(BWIL10n.bwiA11yCloseButton)
.accessibilityLabel(BWIL10n.bwiAllCommonClose)
.isHidden(BWIBuildSettings.shared.BuMXMigrationInfoLevel > 2)
}
Spacer()
HStack() {
@@ -90,6 +100,18 @@ struct MigrationInfoView: View {
}
.opacity(selectedTab == 2 ? 0 : 1)
}
.isHidden(migrationFinished || BWIBuildSettings.shared.isManagedViaMDM)
if BWIBuildSettings.shared.isManagedViaMDM && BWIBuildSettings.shared.BuMXMigrationInfoLevel < 3 {
Button {
dismissView()
} label: {
Text(BWIL10n.bwiAllCommonGotIt)
.foregroundColor(Color(ThemeService.shared().theme.backgroundColor))
}
.buttonStyle(PrimaryActionButtonStyle())
.padding()
}
}
}
.onAppear {
@@ -149,10 +171,25 @@ struct MigrationInfoViewOne: View {
.lineLimit(nil)
.fixedSize(horizontal: false, vertical: true)
.padding(.bottom, 20)
Text(BWIL10n.bwiMobileDialogM1MoreText1) +
Text(BWIL10n.bwiMobileDialogM1MoreText2).bold() +
Text(BWIL10n.bwiMobileDialogM1MoreText3)
if BWIBuildSettings.shared.isManagedViaMDM {
if BWIBuildSettings.shared.BuMXMigrationInfoLevel == 3 {
Text(BWIL10n.bwiMobileDialogM3MoreText1Mdm) +
Text(BWIL10n.bwiMobileDialogM1MoreText2).bold() +
Text(BWIL10n.bwiMobileDialogM1MoreText3)
} else {
Text(BWIL10n.bwiMobileDialogM1MoreText3)
}
} else {
if BWIBuildSettings.shared.BuMXMigrationInfoLevel < 3 {
Text(BWIL10n.bwiMobileDialogM1MoreText1) +
Text(BWIL10n.bwiMobileDialogM1MoreText2).bold() +
Text(BWIL10n.bwiMobileDialogM1MoreText3)
} else {
Text(BWIL10n.bwiMobileDialogM3MoreText1) +
Text(BWIL10n.bwiMobileDialogM1MoreText2).bold() +
Text(BWIL10n.bwiMobileDialogM1MoreText3)
}
}
VStack(alignment: .leading) {
HStack(alignment: .top) {
Text("")
@@ -178,15 +215,29 @@ struct MigrationInfoViewOne: View {
.fixedSize(horizontal: false, vertical: true)
.padding(EdgeInsets(top: 10, leading: 30, bottom: 0, trailing: 30))
.accessibilityElement(children: .ignore)
.accessibilityLabel(
BWIL10n.bwiMobileDialogMMoreTitle + ". " +
.accessibilityLabel(accessibilityLabel)
}
var accessibilityLabel: String {
if BWIBuildSettings.shared.BuMXMigrationInfoLevel < 3 && !BWIBuildSettings.shared.isManagedViaMDM {
return BWIL10n.bwiMobileDialogMMoreTitle + ". " +
BWIL10n.bwiMobileDialogM1MoreText1 +
BWIL10n.bwiMobileDialogM1MoreText2 +
BWIL10n.bwiMobileDialogM1MoreText3 + ", " +
BWIL10n.bwiMobileDialogM1MoreTextBullet1 + ", " +
BWIL10n.bwiMobileDialogM1MoreTextBullet2 + ", " +
BWIL10n.bwiMobileDialogM1MoreTextBullet3 + ", " +
BWIL10n.bwiMobileDialogM1MoreTextBullet4)
BWIL10n.bwiMobileDialogM1MoreTextBullet4
} else {
return BWIL10n.bwiMobileDialogMMoreTitle + ". " +
BWIL10n.bwiMobileDialogM3MoreText1 +
BWIL10n.bwiMobileDialogM1MoreText2 +
BWIL10n.bwiMobileDialogM1MoreText3 + ", " +
BWIL10n.bwiMobileDialogM1MoreTextBullet1 + ", " +
BWIL10n.bwiMobileDialogM1MoreTextBullet2 + ", " +
BWIL10n.bwiMobileDialogM1MoreTextBullet3 + ", " +
BWIL10n.bwiMobileDialogM1MoreTextBullet4
}
}
}
@@ -194,6 +245,8 @@ struct MigrationInfoViewOne: View {
// MARK: Migraion Info View two
struct MigrationInfoViewTwo: View {
let username: String
let getUserName: (() -> String?)?
@State var lazyLoadedUserName: String? = nil
@State var showSuccessToast: Bool = false
@EnvironmentObject var themeService: BWIThemeService
@@ -228,7 +281,9 @@ struct MigrationInfoViewTwo: View {
}
.frame(minHeight: geo.size.height)
.frame(width: geo.size.width)
.onAppear {
lazyLoadedUserName = username.isEmpty ? getUserName?() : username
}
}
.frame(width: geo.size.width, height: geo.size.height)
}
@@ -243,38 +298,51 @@ struct MigrationInfoViewTwo: View {
.padding(.bottom, 20)
}
VStack(alignment: .leading) {
HStack() {
Text("1.")
Button(action: {
UIPasteboard.general.string = username
guard !showSuccessToast else { return }
withAnimation {
showSuccessToast = true
VStack(alignment: .leading) {
HStack() {
if lazyLoadedUserName != nil {
Text("1.")
Button(action: {
UIPasteboard.general.string = lazyLoadedUserName ?? ""
guard !showSuccessToast else { return }
withAnimation {
showSuccessToast = true
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
withAnimation {
showSuccessToast = false
}
}
}, label: {
Text(BWIL10n.bwiMobileDialogMMore2Text1)
.underline()
.foregroundColor(Color(themeService.theme.textPrimaryColor))
Image(systemName: "square.on.square")
.resizable()
.foregroundColor(Color(themeService.theme.textPrimaryColor))
.frame(width: 15, height: 15)
})
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
withAnimation {
showSuccessToast = false
}
}
HStack() {
// bwi #7555 I know, but its only legacy
if lazyLoadedUserName != nil {
Text("2.")
} else {
Text("1.")
}
}, label: {
Text(BWIL10n.bwiMobileDialogMMore2Text1)
.underline()
.foregroundColor(Color(themeService.theme.textPrimaryColor))
Image(systemName: "square.on.square")
.resizable()
.foregroundColor(Color(themeService.theme.textPrimaryColor))
.frame(width: 15, height: 15)
})
}
HStack() {
Text("2.")
Text(BWIL10n.bwiMobileDialogMMore2Text2)
}
.padding(.bottom, 1)
HStack() {
Text("3.")
Text(BWIL10n.bwiMobileDialogMMore2Text3)
Text(BWIL10n.bwiMobileDialogMMore2Text2)
}
.padding(.bottom, 1)
HStack() {
if lazyLoadedUserName != nil {
Text("3.")
} else {
Text("2.")
}
Text(BWIL10n.bwiMobileDialogMMore2Text3)
}
}
}
}
@@ -311,3 +379,48 @@ struct MigrationInfoViewTwo: View {
.transition(.opacity)
}
}
// MARK: Migraion Success View
struct MigrationSuccessView: View {
@EnvironmentObject var themeService: BWIThemeService
var body: some View {
GeometryReader { geo in
ScrollView(.vertical) {
VStack(alignment: .center, spacing: 20) {
VStack() {
Image("bumx_logo")
.resizable()
.frame(width: 200, height: 200)
.clipShape(.rect(cornerRadius: 36))
.overlay(
RoundedRectangle(cornerRadius: 36)
.stroke(.gray, lineWidth: 0.4)
)
.accessibilityHidden(true)
}
.frame(height: geo.size.height * 0.35, alignment: .center)
.padding(EdgeInsets(top: 56, leading: 30, bottom: 10, trailing: 30))
VStack {
Text(BWIL10n.bwiMobileDialogM3SuccessChangeTitle)
.font(.title)
.bold()
.padding(.bottom, 20)
Text(BWIL10n.bwiMobileDialogM3SuccessText)
.fixedSize(horizontal: false, vertical: true)
.padding(EdgeInsets(top: 10, leading: 30, bottom: 0, trailing: 30))
}
Spacer()
}
.frame(minHeight: geo.size.height)
.frame(width: geo.size.width)
}
.frame(width: geo.size.width, height: geo.size.height)
}
}
}

View File

@@ -43,4 +43,10 @@ import MatrixSDK
return returnValue
}
// BWI #7555 migration part 3
func loadFinishedFlag() -> String? {
return SharedKeychain.load(account: "migration_finished")
}
// BWI #7555 END
}

View File

@@ -67,7 +67,7 @@ packages:
maxVersion: 3.5.0
WysiwygComposer:
url: https://github.com/element-hq/matrix-rich-text-editor-swift
exactVersion: 2.37.12
exactVersion: 2.41.0
DeviceKit:
url: https://github.com/devicekit/DeviceKit
majorVersion: 4.7.0
@@ -77,3 +77,8 @@ packages:
SwiftJWT:
url: https://github.com/Kitura/Swift-JWT
version: 4.0.2
settings:
base:
SWIFT_ENABLE_EXPLICIT_MODULES: NO
_EXPERIMENTAL_SWIFT_EXPLICIT_MODULES: NO