From 413e1b4082d5053c2f9ca5f0b584dc7adbb3991e Mon Sep 17 00:00:00 2001 From: "benoit.martins" Date: Thu, 6 Feb 2025 23:53:46 +0100 Subject: [PATCH] Store and use default account avatar to improve display speed --- Linphone/UI/Main/ContentView.swift | 28 +++++++++++-------- .../Main/Viewmodel/SharedMainViewModel.swift | 17 +++++++++++ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/Linphone/UI/Main/ContentView.swift b/Linphone/UI/Main/ContentView.swift index f586619a6..a0df243f0 100644 --- a/Linphone/UI/Main/ContentView.swift +++ b/Linphone/UI/Main/ContentView.swift @@ -81,7 +81,6 @@ struct ContentView: View { @State private var isShowLoginFragment: Bool = false private let avatarSize = 45.0 - @State private var imagePath: URL? var body: some View { let pub = NotificationCenter.default @@ -316,8 +315,8 @@ struct ContentView: View { VStack(spacing: 0) { if searchIsActive == false { HStack { - if (accountProfileViewModel.accountModelIndex ?? 0) < CoreContext.shared.accounts.count { - AsyncImage(url: imagePath) { image in + if sharedMainViewModel.defaultAvatar != nil { + AsyncImage(url: sharedMainViewModel.defaultAvatar) { image in switch image { case .empty: ProgressView() @@ -342,22 +341,29 @@ struct ContentView: View { .onTapGesture { openMenu() } - .onAppear { - if let accountModelIndex = accountProfileViewModel.accountModelIndex, - accountModelIndex < CoreContext.shared.accounts.count { - imagePath = CoreContext.shared.accounts[accountModelIndex].getImagePath() - } - } .onChange(of: CoreContext.shared.accounts[accountProfileViewModel.accountModelIndex ?? 0].usernaneAvatar) { _ in if let accountModelIndex = accountProfileViewModel.accountModelIndex, accountModelIndex < CoreContext.shared.accounts.count { - imagePath = CoreContext.shared.accounts[accountModelIndex].getImagePath() + sharedMainViewModel.changeDefaultAvatar(defaultAvatarURL: CoreContext.shared.accounts[accountModelIndex].getImagePath()) } } .onReceive(imageChanged) { _ in if let accountModelIndex = accountProfileViewModel.accountModelIndex, accountModelIndex < CoreContext.shared.accounts.count { - imagePath = CoreContext.shared.accounts[accountModelIndex].getImagePath() + sharedMainViewModel.changeDefaultAvatar(defaultAvatarURL: CoreContext.shared.accounts[accountModelIndex].getImagePath()) + } + } + } else { + Image(uiImage: contactsManager.textToImage( + firstName: CoreContext.shared.accounts[accountProfileViewModel.accountModelIndex ?? 0].avatarModel?.name ?? "", + lastName: "")) + .resizable() + .frame(width: avatarSize, height: avatarSize) + .clipShape(Circle()) + .onAppear { + if let accountModelIndex = accountProfileViewModel.accountModelIndex, + accountModelIndex < CoreContext.shared.accounts.count { + sharedMainViewModel.changeDefaultAvatar(defaultAvatarURL: CoreContext.shared.accounts[accountModelIndex].getImagePath()) } } } diff --git a/Linphone/UI/Main/Viewmodel/SharedMainViewModel.swift b/Linphone/UI/Main/Viewmodel/SharedMainViewModel.swift index abb48824b..468d6aac9 100644 --- a/Linphone/UI/Main/Viewmodel/SharedMainViewModel.swift +++ b/Linphone/UI/Main/Viewmodel/SharedMainViewModel.swift @@ -26,10 +26,12 @@ class SharedMainViewModel: ObservableObject { @Published var welcomeViewDisplayed = false @Published var generalTermsAccepted = false @Published var displayProfileMode = false + @Published var defaultAvatar: URL? let welcomeViewKey = "welcome_view" let generalTermsKey = "general_terms" let displayProfileModeKey = "display_profile_mode" + let defaultAvatarKey = "default_avatar" var maxWidth = 400.0 @@ -53,6 +55,14 @@ class SharedMainViewModel: ObservableObject { } else { displayProfileMode = preferences.bool(forKey: displayProfileModeKey) } + + if preferences.object(forKey: defaultAvatarKey) == nil { + preferences.set(defaultAvatar, forKey: defaultAvatarKey) + } else { + if let defaultAvatarTmp = preferences.url(forKey: defaultAvatarKey) { + defaultAvatar = defaultAvatarTmp + } + } } func changeWelcomeView() { @@ -82,4 +92,11 @@ class SharedMainViewModel: ObservableObject { displayProfileMode = false preferences.set(displayProfileMode, forKey: displayProfileModeKey) } + + func changeDefaultAvatar(defaultAvatarURL: URL) { + let preferences = UserDefaults.standard + + defaultAvatar = defaultAvatarURL + preferences.set(defaultAvatar, forKey: defaultAvatarKey) + } }