Skip to content

Commit

Permalink
Merge pull request #1940 from CruGlobal/GT-2219-Languages-Available-O…
Browse files Browse the repository at this point in the history
…ffline

GT-2219 languages available offline
  • Loading branch information
rachaelblue authored Feb 13, 2024
2 parents b4f1be8 + b9d4e77 commit 9e80df8
Show file tree
Hide file tree
Showing 13 changed files with 188 additions and 57 deletions.
12 changes: 12 additions & 0 deletions godtools.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1401,6 +1401,9 @@
D43FC1C02B64531F00F8310E /* ViewConfirmAppLanguageDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43FC1BF2B64531F00F8310E /* ViewConfirmAppLanguageDomainModel.swift */; };
D43FC1C22B65E08C00F8310E /* GetConfirmAppLanguageInterfaceStringsRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43FC1C12B65E08C00F8310E /* GetConfirmAppLanguageInterfaceStringsRepositoryInterface.swift */; };
D43FC1C42B65E0F300F8310E /* GetConfirmAppLanguageInterfaceStringsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43FC1C32B65E0F300F8310E /* GetConfirmAppLanguageInterfaceStringsRepository.swift */; };
D43FC1C62B6996D000F8310E /* DownloadedLanguageListItemDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43FC1C52B6996D000F8310E /* DownloadedLanguageListItemDomainModel.swift */; };
D43FC1C82B69976200F8310E /* GetDownloadedLanguagesListRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43FC1C72B69976200F8310E /* GetDownloadedLanguagesListRepositoryInterface.swift */; };
D43FC1CA2B6997B600F8310E /* GetDownloadedLanguagesListRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43FC1C92B6997B600F8310E /* GetDownloadedLanguagesListRepository.swift */; };
D455F3ED2977302D009D5F93 /* GetUserActivityUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D455F3EC2977302D009D5F93 /* GetUserActivityUseCase.swift */; };
D455F3F0297739F6009D5F93 /* AccountActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D455F3EF297739F6009D5F93 /* AccountActivityView.swift */; };
D455F3F229773C1B009D5F93 /* UserActivityDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D455F3F129773C1B009D5F93 /* UserActivityDomainModel.swift */; };
Expand Down Expand Up @@ -2893,6 +2896,9 @@
D43FC1BF2B64531F00F8310E /* ViewConfirmAppLanguageDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewConfirmAppLanguageDomainModel.swift; sourceTree = "<group>"; };
D43FC1C12B65E08C00F8310E /* GetConfirmAppLanguageInterfaceStringsRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetConfirmAppLanguageInterfaceStringsRepositoryInterface.swift; sourceTree = "<group>"; };
D43FC1C32B65E0F300F8310E /* GetConfirmAppLanguageInterfaceStringsRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetConfirmAppLanguageInterfaceStringsRepository.swift; sourceTree = "<group>"; };
D43FC1C52B6996D000F8310E /* DownloadedLanguageListItemDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadedLanguageListItemDomainModel.swift; sourceTree = "<group>"; };
D43FC1C72B69976200F8310E /* GetDownloadedLanguagesListRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetDownloadedLanguagesListRepositoryInterface.swift; sourceTree = "<group>"; };
D43FC1C92B6997B600F8310E /* GetDownloadedLanguagesListRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetDownloadedLanguagesListRepository.swift; sourceTree = "<group>"; };
D455F3EC2977302D009D5F93 /* GetUserActivityUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetUserActivityUseCase.swift; sourceTree = "<group>"; };
D455F3EF297739F6009D5F93 /* AccountActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountActivityView.swift; sourceTree = "<group>"; };
D455F3F129773C1B009D5F93 /* UserActivityDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserActivityDomainModel.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3432,6 +3438,7 @@
450DB55B2AC3545300B2FE3A /* GetDeviceAppLanguageRepositoryInterface.swift */,
45AC9DE12B28A9A400DEEBFE /* GetDownloadableLanguagesInterfaceStringsRepositoryInterface.swift */,
453A2EFA2B3636E300C8F865 /* GetDownloadableLanguagesListRepositoryInterface.swift */,
D43FC1C72B69976200F8310E /* GetDownloadedLanguagesListRepositoryInterface.swift */,
453D2F7F2AD88C1D001C44E3 /* GetLanguageSettingsInterfaceStringsRepositoryInterface.swift */,
450DB55D2AC3548B00B2FE3A /* GetUserPreferredAppLanguageRepositoryInterface.swift */,
453A2EF92B3636E300C8F865 /* RemoveDownloadedToolLanguageRepositoryInterface.swift */,
Expand All @@ -3449,6 +3456,7 @@
45BE4A832AF287E3004021DA /* ConfirmAppLanguageInterfaceStringsDomainModel.swift */,
45AC9DD92B28A98800DEEBFE /* DownloadableLanguageListItemDomainModel.swift */,
45AC9DDC2B28A98800DEEBFE /* DownloadableLanguagesInterfaceStringsDomainModel.swift */,
D43FC1C52B6996D000F8310E /* DownloadedLanguageListItemDomainModel.swift */,
45AC9DDA2B28A98800DEEBFE /* LanguageDownloadStatusDomainModel.swift */,
453D2F7D2AD88A89001C44E3 /* LanguageSettingsInterfaceStringsDomainModel.swift */,
D43FC1BF2B64531F00F8310E /* ViewConfirmAppLanguageDomainModel.swift */,
Expand Down Expand Up @@ -8007,6 +8015,7 @@
45B3F4352AC3A82E00D61BFD /* GetDeviceAppLanguageRepository.swift */,
45AC9DD72B28A97300DEEBFE /* GetDownloadableLanguagesInterfaceStringsRepository.swift */,
453A2EFF2B3636EC00C8F865 /* GetDownloadableLanguagesListRepository.swift */,
D43FC1C92B6997B600F8310E /* GetDownloadedLanguagesListRepository.swift */,
453D2F812AD88C2B001C44E3 /* GetLanguageSettingsInterfaceStringsRepository.swift */,
45B3F4372AC3A82E00D61BFD /* GetUserPreferredAppLanguageRepository.swift */,
453A2F012B3636EC00C8F865 /* RemoveDownloadedToolLanguageRepository.swift */,
Expand Down Expand Up @@ -11805,6 +11814,7 @@
45558341269F2C7B00C3FF14 /* ToolPageHeaderView.swift in Sources */,
450D7B0528E32965006C3FDF /* DownloadedTranslationDataModelType.swift in Sources */,
45AD1F7425938A9800A096A0 /* ViewedTrainingTipsCacheType.swift in Sources */,
D43FC1CA2B6997B600F8310E /* GetDownloadedLanguagesListRepository.swift in Sources */,
456D44382AF2A457008F61B9 /* AuthenticateUserInterface.swift in Sources */,
452D355D2A8FCC5D00BC4F97 /* ConfirmRemoveToolFromFavoritesAlertView.swift in Sources */,
45F379092B23642C00EEF039 /* ViewLearnToShareToolDomainModel.swift in Sources */,
Expand Down Expand Up @@ -11864,6 +11874,7 @@
45B3F4662AC3B1B800D61BFD /* GetAppInterfaceLayoutDirectionInterface.swift in Sources */,
4512D4B92B28F1B300DFAFB3 /* SetToolSettingsParallelLanguageUseCase.swift in Sources */,
45C2AF3B2A813371004958AB /* PageControlButton.swift in Sources */,
D43FC1C82B69976200F8310E /* GetDownloadedLanguagesListRepositoryInterface.swift in Sources */,
453C1BD62899A50C007332E2 /* RealmFavoritedResourcesCache.swift in Sources */,
45E61ECA2AE1B7CF00A98872 /* GetLaunchCountRepositoryInterface.swift in Sources */,
45DD84CE2A8BD65F0066A020 /* FavoritingToolBannerView.swift in Sources */,
Expand Down Expand Up @@ -12316,6 +12327,7 @@
45B3F4622AC3AE4E00D61BFD /* GetDeviceLanguageRepository.swift in Sources */,
4512D4BD2B28F1FD00DFAFB3 /* StoreToolSettingsParallelLanguageRepositoryInterface.swift in Sources */,
45EA98F62AFD676900E7EA9A /* CreatingToolScreenShareSessionTimedOutInterfaceStringsDomainModel.swift in Sources */,
D43FC1C62B6996D000F8310E /* DownloadedLanguageListItemDomainModel.swift in Sources */,
45E347782A49BFD00014CCD1 /* ActivityIndicator.swift in Sources */,
4555832D269F2C7B00C3FF14 /* ToolPageCardsView.swift in Sources */,
45D63E52288F67CE009B4610 /* AppDomainLayerDependencies.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
//
// GetDownloadedLanguagesListRepository.swift
// godtools
//
// Created by Rachael Skeath on 1/30/24.
// Copyright © 2024 Cru. All rights reserved.
//

import Foundation
import Combine

class GetDownloadedLanguagesListRepository: GetDownloadedLanguagesListRepositoryInterface {

private let languagesRepository: LanguagesRepository
private let downloadedLanguagesRepository: DownloadedLanguagesRepository
private let translatedLanguageNameRepository: TranslatedLanguageNameRepository

init(languagesRepository: LanguagesRepository, downloadedLanguagesRepository: DownloadedLanguagesRepository, translatedLanguageNameRepository: TranslatedLanguageNameRepository) {

self.languagesRepository = languagesRepository
self.downloadedLanguagesRepository = downloadedLanguagesRepository
self.translatedLanguageNameRepository = translatedLanguageNameRepository
}

func getDownloadedLanguagesPublisher(currentAppLanguage: AppLanguageDomainModel) -> AnyPublisher<[DownloadedLanguageListItemDomainModel], Never> {

return Publishers.CombineLatest(
languagesRepository.getLanguagesChanged(),
downloadedLanguagesRepository.getDownloadedLanguagesChangedPublisher()
)
.flatMap { _ in

return self.downloadedLanguagesRepository.getDownloadedLanguagesPublisher(completedDownloadsOnly: true)
}
.map { downloadedLanguageDataModels in

let downloadedLanguageIds = downloadedLanguageDataModels.map { $0.languageId }

return self.languagesRepository.getLanguages(ids: downloadedLanguageIds).map { language in

let languageNameInOwnLanguage = self.translatedLanguageNameRepository.getLanguageName(
language: language,
translatedInLanguage: language.code
)
let languageNameInAppLanguage = self.translatedLanguageNameRepository.getLanguageName(
language: language,
translatedInLanguage: currentAppLanguage
)

return DownloadedLanguageListItemDomainModel(
languageId: language.id,
languageCode: language.code,
languageNameInOwnLanguage: languageNameInOwnLanguage,
languageNameInAppLanguage: languageNameInAppLanguage
)
}
}
.eraseToAnyPublisher()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,17 @@ class RealmDownloadedLanguagesCache {
.eraseToAnyPublisher()
}

func getDownloadedLanguagesPublisher() -> AnyPublisher<[DownloadedLanguageDataModel], Never> {
func getDownloadedLanguagesPublisher(completedDownloadsOnly: Bool) -> AnyPublisher<[DownloadedLanguageDataModel], Never> {

let downloadedLanguages = realmDatabase.openRealm()
var realmDownloadedLanguages = realmDatabase.openRealm()
.objects(RealmDownloadedLanguage.self)

if completedDownloadsOnly {
realmDownloadedLanguages = realmDownloadedLanguages
.where { $0.downloadComplete }
}

let downloadedLanguages = realmDownloadedLanguages
.map { DownloadedLanguageDataModel(realmDownloadedLanguage: $0) }

return Just(Array(downloadedLanguages))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ class DownloadedLanguagesRepository {
return cache.getDownloadedLanguagesChangedPublisher()
}

func getDownloadedLanguagesPublisher() -> AnyPublisher<[DownloadedLanguageDataModel], Never> {
func getDownloadedLanguagesPublisher(completedDownloadsOnly: Bool) -> AnyPublisher<[DownloadedLanguageDataModel], Never> {

return cache.getDownloadedLanguagesPublisher()
return cache.getDownloadedLanguagesPublisher(completedDownloadsOnly: completedDownloadsOnly)
}

func getDownloadedLanguage(languageId: String) -> DownloadedLanguageDataModel? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,14 @@ class AppLanguageFeatureDataLayerDependencies {
)
}

func getDownloadedLanguagesListRepositoryInterface() -> GetDownloadedLanguagesListRepositoryInterface {
return GetDownloadedLanguagesListRepository(
languagesRepository: coreDataLayer.getLanguagesRepository(),
downloadedLanguagesRepository: getDownloadedLanguagesRepository(),
translatedLanguageNameRepository: coreDataLayer.getTranslatedLanguageNameRepository()
)
}

func getDownloadToolLanguageRepositoryInterface() -> DownloadToolLanguageRepositoryInterface {
return DownloadToolLanguageRepository(
downloadedLanguagesRepository: getDownloadedLanguagesRepository(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ class AppLanguageFeatureDomainLayerDependencies {

func getViewLanguageSettingsUseCase() -> ViewLanguageSettingsUseCase {
return ViewLanguageSettingsUseCase(
getInterfaceStringsRepository: dataLayer.getLanguageSettingsInterfaceStringsRepositoryInterface()
getInterfaceStringsRepository: dataLayer.getLanguageSettingsInterfaceStringsRepositoryInterface(),
getDownloadedLanguagesListRepositoryInterface: dataLayer.getDownloadedLanguagesListRepositoryInterface()
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// DownloadedLanguageListItemDomainModel.swift
// godtools
//
// Created by Rachael Skeath on 1/30/24.
// Copyright © 2024 Cru. All rights reserved.
//

import Foundation

struct DownloadedLanguageListItemDomainModel {

let languageId: String
let languageCode: BCP47LanguageIdentifier
let languageNameInOwnLanguage: String
let languageNameInAppLanguage: String
}

extension DownloadedLanguageListItemDomainModel: Identifiable {

var id: String {
return languageId
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ import Foundation
struct ViewLanguageSettingsDomainModel {

let interfaceStrings: LanguageSettingsInterfaceStringsDomainModel
let downloadedLanguages: [DownloadedLanguageListItemDomainModel]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//
// GetDownloadedLanguagesListRepositoryInterface.swift
// godtools
//
// Created by Rachael Skeath on 1/30/24.
// Copyright © 2024 Cru. All rights reserved.
//

import Foundation
import Combine

protocol GetDownloadedLanguagesListRepositoryInterface {

func getDownloadedLanguagesPublisher(currentAppLanguage: AppLanguageDomainModel) -> AnyPublisher<[DownloadedLanguageListItemDomainModel], Never>
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,24 @@ import Combine
class ViewLanguageSettingsUseCase {

private let getInterfaceStringsRepository: GetLanguageSettingsInterfaceStringsRepositoryInterface
private let getDownloadedLanguagesListRepositoryInterface: GetDownloadedLanguagesListRepositoryInterface

init(getInterfaceStringsRepository: GetLanguageSettingsInterfaceStringsRepositoryInterface) {
init(getInterfaceStringsRepository: GetLanguageSettingsInterfaceStringsRepositoryInterface, getDownloadedLanguagesListRepositoryInterface: GetDownloadedLanguagesListRepositoryInterface) {

self.getInterfaceStringsRepository = getInterfaceStringsRepository
self.getDownloadedLanguagesListRepositoryInterface = getDownloadedLanguagesListRepositoryInterface
}

func viewPublisher(appLanguage: AppLanguageDomainModel) -> AnyPublisher<ViewLanguageSettingsDomainModel, Never> {

return self.getInterfaceStringsRepository
.getStringsPublisher(translateInAppLanguage: appLanguage)
.map {

return ViewLanguageSettingsDomainModel(interfaceStrings: $0)
}
.eraseToAnyPublisher()
return Publishers.CombineLatest(
getInterfaceStringsRepository.getStringsPublisher(translateInAppLanguage: appLanguage),
getDownloadedLanguagesListRepositoryInterface.getDownloadedLanguagesPublisher(currentAppLanguage: appLanguage)
)
.map { interfaceStrings, downloadedLanguages in

return ViewLanguageSettingsDomainModel(interfaceStrings: interfaceStrings, downloadedLanguages: downloadedLanguages)
}
.eraseToAnyPublisher()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class LanguageSettingsViewModel: ObservableObject {
@Published var toolLanguagesAvailableOfflineTitle: String = ""
@Published var downloadToolsForOfflineMessage: String = ""
@Published var editDownloadedLanguagesButtonTitle: String = ""
@Published var downloadedLanguages: [DownloadedLanguageListItemDomainModel] = []

init(flowDelegate: FlowDelegate, getCurrentAppLanguageUseCase: GetCurrentAppLanguageUseCase, viewLanguageSettingsUseCase: ViewLanguageSettingsUseCase, trackScreenViewAnalyticsUseCase: TrackScreenViewAnalyticsUseCase) {

Expand Down Expand Up @@ -62,6 +63,7 @@ class LanguageSettingsViewModel: ObservableObject {
self?.downloadToolsForOfflineMessage = interfaceStrings.downloadToolsForOfflineMessage
self?.editDownloadedLanguagesButtonTitle = interfaceStrings.editDownloadedLanguagesButtonTitle

self?.downloadedLanguages = domainModel.downloadedLanguages
}
.store(in: &cancellables)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,29 +10,25 @@ import SwiftUI

struct ToolLanguageAvailableOfflineLanguageView: View {

private let downloadedLanguage: DownloadedLanguageListItemDomainModel

init(downloadedLanguage: DownloadedLanguageListItemDomainModel) {
self.downloadedLanguage = downloadedLanguage
}

var body: some View {

VStack(alignment: .leading, spacing: 0) {

HStack(alignment: .center, spacing: 0) {
HStack(alignment: .center, spacing: 11) {

HStack(alignment: .center, spacing: 11) {

Text("English")
.font(FontLibrary.sfProTextRegular.font(size: 17))
.foregroundColor(ColorPalette.gtGrey.color)
.multilineTextAlignment(.leading)

Text("English")
.font(FontLibrary.sfProTextRegular.font(size: 17))
.foregroundColor(Color.getColorWithRGB(red: 151, green: 151, blue: 151, opacity: 1))
.multilineTextAlignment(.leading)
}

Spacer()
Text(downloadedLanguage.languageNameInOwnLanguage)
.font(FontLibrary.sfProTextRegular.font(size: 17))
.foregroundColor(ColorPalette.gtGrey.color)
.multilineTextAlignment(.leading)

Text("108.3 MB")
.font(FontLibrary.sfProTextRegular.font(size: 14))
Text(downloadedLanguage.languageNameInAppLanguage)
.font(FontLibrary.sfProTextRegular.font(size: 17))
.foregroundColor(Color.getColorWithRGB(red: 151, green: 151, blue: 151, opacity: 1))
.multilineTextAlignment(.leading)
}
Expand Down
Loading

0 comments on commit 9e80df8

Please sign in to comment.