From 141f3c8fe5b4794a002feae526d4712e02bba2b2 Mon Sep 17 00:00:00 2001 From: Levitating Pineapple Date: Wed, 16 Oct 2024 11:55:54 +0300 Subject: [PATCH] ios: fix screen protect for sheets --- apps/ios/Shared/ContentView.swift | 3 +-- apps/ios/Shared/Views/ChatList/ChatListView.swift | 6 +++++- apps/ios/Shared/Views/Helpers/AppSheet.swift | 4 +++- .../ios/Shared/Views/Helpers/LocalAuthenticationUtils.swift | 2 ++ apps/ios/Shared/Views/UserSettings/UserProfilesView.swift | 3 ++- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/apps/ios/Shared/ContentView.swift b/apps/ios/Shared/ContentView.swift index 6d600f33ff..f370534595 100644 --- a/apps/ios/Shared/ContentView.swift +++ b/apps/ios/Shared/ContentView.swift @@ -27,7 +27,6 @@ struct ContentView: View { @AppStorage(DEFAULT_SHOW_LA_NOTICE) private var prefShowLANotice = false @AppStorage(DEFAULT_LA_NOTICE_SHOWN) private var prefLANoticeShown = false @AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false - @AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false @AppStorage(DEFAULT_NOTIFICATION_ALERT_SHOWN) private var notificationAlertShown = false @State private var showWhatsNew = false @State private var showChooseLAMode = false @@ -250,7 +249,7 @@ struct ContentView: View { private func mainView() -> some View { ZStack(alignment: .top) { - ChatListView(activeUserPickerSheet: $chatListUserPickerSheet).privacySensitive(protectScreen) + ChatListView(activeUserPickerSheet: $chatListUserPickerSheet) .onAppear { requestNtfAuthorization() // Local Authentication notice is to be shown on next start after onboarding is complete diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index a1b40aadbe..66dbc7348e 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -95,6 +95,7 @@ struct ChatListView: View { @AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true @AppStorage(DEFAULT_ONE_HAND_UI_CARD_SHOWN) private var oneHandUICardShown = false @AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial + @AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false var body: some View { if #available(iOS 16.0, *) { @@ -119,9 +120,10 @@ struct ChatListView: View { .modifier( Sheet(isPresented: $userPickerShown) { UserPicker(userPickerShown: $userPickerShown, activeSheet: $activeUserPickerSheet) + .privacySensitive(protectScreen) } ) - .sheet(item: $activeUserPickerSheet) { + .appSheet(item: $activeUserPickerSheet) { UserPickerSheetView(sheet: $0) } .onChange(of: activeUserPickerSheet) { @@ -140,6 +142,7 @@ struct ChatListView: View { .background(theme.colors.background) .navigationBarTitleDisplayMode(.inline) .navigationBarHidden(searchMode || oneHandUI) + .privacySensitive(protectScreen) } .scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center) .onDisappear() { activeUserPickerSheet = nil } @@ -241,6 +244,7 @@ struct ChatListView: View { unreadBadge(size: 12) } } + .privacySensitive(protectScreen) .onTapGesture { userPickerShown = true } diff --git a/apps/ios/Shared/Views/Helpers/AppSheet.swift b/apps/ios/Shared/Views/Helpers/AppSheet.swift index 0ade1c0d8e..78dfd9d700 100644 --- a/apps/ios/Shared/Views/Helpers/AppSheet.swift +++ b/apps/ios/Shared/Views/Helpers/AppSheet.swift @@ -11,6 +11,8 @@ import SwiftUI class AppSheetState: ObservableObject { static let shared = AppSheetState() @Published var scenePhaseActive: Bool = false + // Scehe phase is also be inactive while faceID is requested + @Published var biometricAuth: Bool = false } private struct PrivacySensitive: ViewModifier { @@ -22,7 +24,7 @@ private struct PrivacySensitive: ViewModifier { if !protectScreen { content } else { - content.privacySensitive(!appSheetState.scenePhaseActive).redacted(reason: .privacy) + content.privacySensitive(!appSheetState.scenePhaseActive && !appSheetState.biometricAuth).redacted(reason: .privacy) } } } diff --git a/apps/ios/Shared/Views/Helpers/LocalAuthenticationUtils.swift b/apps/ios/Shared/Views/Helpers/LocalAuthenticationUtils.swift index 7a90a3f833..6fb39ce2cf 100644 --- a/apps/ios/Shared/Views/Helpers/LocalAuthenticationUtils.swift +++ b/apps/ios/Shared/Views/Helpers/LocalAuthenticationUtils.swift @@ -63,7 +63,9 @@ func systemAuthenticate(_ reason: String, _ completed: @escaping (LAResult) -> V var authAvailabilityError: NSError? if laContext.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authAvailabilityError) { logger.debug("DEBUGGING: systemAuthenticate: canEvaluatePolicy callback") + AppSheetState.shared.biometricAuth = true laContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { success, authError in + AppSheetState.shared.biometricAuth = false logger.debug("DEBUGGING: systemAuthenticate evaluatePolicy callback") DispatchQueue.main.async { if success { diff --git a/apps/ios/Shared/Views/UserSettings/UserProfilesView.swift b/apps/ios/Shared/Views/UserSettings/UserProfilesView.swift index 330ce56e0b..8ac1b704db 100644 --- a/apps/ios/Shared/Views/UserSettings/UserProfilesView.swift +++ b/apps/ios/Shared/Views/UserSettings/UserProfilesView.swift @@ -59,7 +59,8 @@ struct UserProfilesView: View { userProfilesView() } else { Button(action: runAuth) { Label("Unlock", systemImage: "lock") } - .onAppear(perform: runAuth) + // TODO: Prevent Feedback loop +// .onAppear(perform: runAuth) } }