From 6a534ab3ff186c328c8f066c2823f5e45ee9aaa2 Mon Sep 17 00:00:00 2001 From: rodvar Date: Mon, 18 Nov 2024 11:28:28 +1100 Subject: [PATCH] Featre/shared docs and cleanup (#57) * Shared repositories refactor + docs - completed explanation on readme architecture docs - bump versions to reflect latest dev (we need to have something automated for this) - TODOs refactors (inits) * - updated readme and architecture diagram * - cleanup todos + documentation * - pods versions upgrades * - added index and commets on presenters implementation --- bisqapps/README.md | 66 ++- .../bisq/mobile/android/node/MainActivity.kt | 1 - .../mobile/android/node/MainApplication.kt | 23 + .../android/node/di/AndroidNodeModule.kt | 27 +- .../node/presentation/MainNodePresenter.kt | 31 +- bisqapps/docs/bisqapps_design_arch.dia | 428 +++++++++++++++++- bisqapps/docs/bisqapps_design_arch.png | Bin 22001 -> 39297 bytes bisqapps/gradle.properties | 8 +- bisqapps/iosClient/Podfile.lock | 4 +- .../Pods/Local Podspecs/domain.podspec.json | 2 +- .../Local Podspecs/presentation.podspec.json | 2 +- bisqapps/iosClient/Pods/Manifest.lock | 4 +- .../iosClient/iosClient/ContentView.swift | 4 - bisqapps/iosClient/iosClient/iosClient.swift | 1 - bisqapps/shared/domain/build.gradle.kts | 2 +- bisqapps/shared/domain/domain.podspec | 2 +- .../data/repository/SingleObjectRepository.kt | 9 +- .../shared/presentation/presentation.podspec | 2 +- 18 files changed, 559 insertions(+), 57 deletions(-) diff --git a/bisqapps/README.md b/bisqapps/README.md index c5d01716..52dc3393 100644 --- a/bisqapps/README.md +++ b/bisqapps/README.md @@ -4,6 +4,35 @@ # Bisq Mobile +## Index + +1. [Bisq Mobile](#bisq-mobile) + - [Goal](#goal) + - [How to contribute](#how-to-contribute) + - [Project dev requirements](#project-dev-requirements) + - [Getting started](#getting-started) + - [Getting started for Android Node](#getting-started-for-android-node) + - [UI](#ui) + - [Designs](#designs) + - [Navigation Implementation](#navigation-implementation) + - [Configuring dev env: known issues](#configuring-dev-env-known-issues) + +2. [Initial Project Structure](#initial-project-structure) + +3. [App Architecture Design Choice](#app-architecture-design-choice) + - [Dumb Views](#dumb-views) + - [UI independently built](#ui-independently-built) + - [Encourage Rich Domain well-test models](#encourage-rich-domain-well-test-models) + - [Presenters guide the orchestra](#presenters-guide-the-orchestra) + - [Repositories key for reactive UI](#repositories-key-for-reactive-ui) + - [Services allow us to have different networking sources](#services-allow-us-to-have-different-networking-sources) + +4. [What about Lifecycle and main view components](#what-about-lifecycle-and-main-view-components) + +5. [When it’s acceptable to reuse a presenter for my view](#when-its-acceptable-to-reuse-a-presenter-for-my-view) + +6. [Why KMP](#why-kmp) + ## Goal This project aims to make Bisq Network accesible in Mobile Platforms following the philosofy of [Bisq2](https://github.com/bisq-network/bisq2/contribute) - to make it @@ -81,17 +110,40 @@ Though this can evolve, this is the initial structure of this KMP project: ## App Architecture Design Choice -**note** this is being Worked out at the moment - ![Apps Design Architecture](docs/bisqapps_design_arch.png) -This project uses the [MVP](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter) (Model-View-Presenter) Design Pattern with small variations (introducing Repositories) in the following way: +This project uses the [MVP](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter) (Model-View-Presenter) Design Pattern with small variations (__introducing Repositories & we allow reusal of presenters under specific conditions__) in the following way: + + - **Dumb Views**: Each View will define it's desired presenter behaviour. For example, for the `AppView` it would define the `AppPresenter` interface. This includes which data its interested in observing and the commands it needs to trigger from user interactions. + - **UI indepdently built**The view will react to changes in the presenter observed data, and call the methods it needs to inform the presenter about user actions. In this way __each view can be created idependently without strictly needing anything else__ + - **Encourage Rich Domain well-test models** Same goes for the Models, they can be built (and unit tested) without needing anything else, simple POKOs (Plain Old Kotlin Objects - meaning no external deps). Ideally business logic should go here and the result of executing a business model logic should be put back into the repository for all observers to know. + - **Presenters guide the orchestra** When you want to bring interaction to life, create a presenter (or reuse one if the view is small enough) and implement the interface you defined when doing the view (`AppPresenter` interface). That presenter will generally modify/observe the models through a repository. + - **Repositories key for reactive UI** Now for the presenter to connect to the domain models we use repositories which is basically a storage of data (that abstracts where that data is stored in). The repositories also expose the data in an observable way, so the presenter can satisfy the requested data from the view from the data of the domain model in the ways it see fit. Sometimes it would just be a pathrough. The resposities could also have caching strategy, and persistance. For most of the use cases so far we don't see a strong need for persistance in most of them (with the exception of settings-related repositories) - more on this soon + - **Services allow us to have different networking sources** we are developing 3 apps divided in 2 groups: `node` and `client`. Each group has a very distinct networking setup. We need each type of app build to have only the networking it needs. The proposed separation of concerns not only allows a clean architecture but also allows faster development focus on each complexity separately. + + +### What about Lifecycle and main view components + +As per original specs `single-activity` pattern (or `single-viewcontroller` in iOS) is sufficient for this project. Which means, unless we find a specific use case for it, we'll stick to a single Activity/ViewController for the whole lifecycle of the app. + +The app's architecture `BasePresenter` allows a tree like behaviour where a presenter can be a root with dependent child presenters. + +We leverage this by having: + + - A `MainPresenter` that acts as root in each and all of the apps + - The rest of the presenters require the main presenter as construction parameter to be notified about lifecycle events. + + +### When its acceptable to reuse a presenter for my view? + +It's ok to reuse an existing presenter for your view if: + + - Your view is a very small part of a bigger view that renders together (commonly called `Screen`) and you can't foresee reusal for it + - Your view is a very small part of a bigger view and even if its reused the presenter required implementation is minimal - - Each View will define (or reuse) what's the presenter logic it is looking for, including which data its interested in observing in an interface. The view will react to changes in the presenter observed data, and call the methods it needs to inform the presenter about user actions. In this way **each view can be created idependently without strictly needing anything else** - - Same goes for the Models, they can be built (and unit tested) without needing anything else, simple KOJOs. - - When you want to bring interaction to life, create a presenter (or reuse one) and implement the interface you defined when doing the view. That presenter will generally modify/fetch the models through a repository. - - Networking is a crucial part of this project and the networking used and shared by the `xClients` are not the ones used by the `androidNode` but the idea is to have a comprehensive **facade** so that from the point of view of repository/service it just works regardless on how and what objs are being used under the hood to fetch/save data. More on this soon... +To reuse an existing presenter you would have to make it extend your view defined presenter interface and do the right `Koin bind` on its Koin repository definition. +Then you can inject it in the `@Composable` function using `koinInject()`. ## Why KMP diff --git a/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/MainActivity.kt b/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/MainActivity.kt index 70828de0..95877343 100644 --- a/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/MainActivity.kt +++ b/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/MainActivity.kt @@ -5,7 +5,6 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview -import network.bisq.mobile.domain.data.repository.SingleObjectRepository import network.bisq.mobile.presentation.MainPresenter import network.bisq.mobile.presentation.ui.App import org.koin.android.ext.android.inject diff --git a/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/MainApplication.kt b/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/MainApplication.kt index a9a384fd..caa8ff2e 100644 --- a/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/MainApplication.kt +++ b/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/MainApplication.kt @@ -1,16 +1,39 @@ package network.bisq.mobile.android.node import android.app.Application +import android.os.Process +import bisq.common.facades.FacadeProvider +import bisq.common.facades.android.AndroidGuavaFacade +import bisq.common.facades.android.AndroidJdkFacade +import bisq.common.network.AndroidEmulatorLocalhostFacade import network.bisq.mobile.android.node.di.androidNodeModule import network.bisq.mobile.domain.di.domainModule import network.bisq.mobile.presentation.di.presentationModule +import org.bouncycastle.jce.provider.BouncyCastleProvider import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin +import java.security.Security class MainApplication : Application() { override fun onCreate() { super.onCreate() + setupKoinDI() + setupBisqCoreStatics() + } + + private fun setupBisqCoreStatics() { + FacadeProvider.setLocalhostFacade(AndroidEmulatorLocalhostFacade()) + FacadeProvider.setJdkFacade(AndroidJdkFacade(Process.myPid())) + FacadeProvider.setGuavaFacade(AndroidGuavaFacade()) + + // Androids default BC version does not support all algorithms we need, thus we remove + // it and add our BC provider + Security.removeProvider("BC") + Security.addProvider(BouncyCastleProvider()) + } + + private fun setupKoinDI() { startKoin { androidContext(this@MainApplication) // order is important, last one is picked for each interface/class key diff --git a/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/di/AndroidNodeModule.kt b/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/di/AndroidNodeModule.kt index dbb47815..ca1d6bb7 100644 --- a/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/di/AndroidNodeModule.kt +++ b/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/di/AndroidNodeModule.kt @@ -1,11 +1,14 @@ package network.bisq.mobile.android.node.di -import network.bisq.mobile.android.node.AndroidNodeGreeting +import bisq.security.SecurityService +import bisq.user.identity.UserIdentityService import network.bisq.mobile.android.node.domain.data.repository.NodeGreetingRepository import network.bisq.mobile.android.node.presentation.MainNodePresenter -import network.bisq.mobile.domain.data.repository.SingleObjectRepository +import network.bisq.mobile.android.node.service.AndroidApplicationService +import network.bisq.mobile.android.node.service.AndroidMemoryReportService import network.bisq.mobile.presentation.MainPresenter import network.bisq.mobile.presentation.ui.AppPresenter +import org.koin.android.ext.koin.androidContext import org.koin.dsl.bind import org.koin.dsl.module @@ -15,4 +18,24 @@ val androidNodeModule = module { // this line showcases both, the posibility to change behaviour of the app by changing one definiton // and binding the same obj to 2 different abstractions single { MainNodePresenter(get()) } bind AppPresenter::class + + // Services +// TODO might not work because of the jars dependencies, needs more work +// single { +// val context = androidContext() +// AndroidMemoryReportService(context) +// } +// single { +// val filesDirsPath = androidContext().filesDir.toPath() +// val androidMemoryService: AndroidMemoryReportService = get() +// AndroidApplicationService(androidMemoryService, filesDirsPath) +// } +// single { +// val applicationService: AndroidApplicationService = get() +// applicationService.userService.userIdentityService +// } +// single { +// val applicationService: AndroidApplicationService = get() +// applicationService.securityService +// } } \ No newline at end of file diff --git a/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/presentation/MainNodePresenter.kt b/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/presentation/MainNodePresenter.kt index b6d68c96..4472db60 100644 --- a/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/presentation/MainNodePresenter.kt +++ b/bisqapps/androidNode/src/androidMain/kotlin/network/bisq/mobile/android/node/presentation/MainNodePresenter.kt @@ -2,7 +2,6 @@ package network.bisq.mobile.android.node.presentation import android.app.Activity import android.os.Build -import android.os.Process import bisq.application.State import bisq.bonded_roles.market_price.MarketPrice import bisq.chat.ChatChannelDomain @@ -11,11 +10,7 @@ import bisq.chat.common.CommonPublicChatMessage import bisq.chat.two_party.TwoPartyPrivateChatChannel import bisq.chat.two_party.TwoPartyPrivateChatMessage import bisq.common.currency.MarketRepository -import bisq.common.facades.FacadeProvider -import bisq.common.facades.android.AndroidGuavaFacade -import bisq.common.facades.android.AndroidJdkFacade import bisq.common.locale.LanguageRepository -import bisq.common.network.AndroidEmulatorLocalhostFacade import bisq.common.network.TransportType import bisq.common.observable.Observable import bisq.common.observable.Pin @@ -40,8 +35,6 @@ import network.bisq.mobile.android.node.service.AndroidMemoryReportService import network.bisq.mobile.domain.data.model.Greeting import network.bisq.mobile.domain.data.repository.GreetingRepository import network.bisq.mobile.presentation.MainPresenter -import org.bouncycastle.jce.provider.BouncyCastleProvider -import java.security.Security import java.util.* import java.util.concurrent.CompletableFuture import java.util.concurrent.TimeUnit @@ -51,10 +44,12 @@ import kotlin.math.max import kotlin.random.Random @Suppress("UNCHECKED_CAST") -class MainNodePresenter(greetingRepository: NodeGreetingRepository): MainPresenter(greetingRepository as GreetingRepository) { +class MainNodePresenter(greetingRepository: NodeGreetingRepository) : + MainPresenter(greetingRepository as GreetingRepository) { companion object { private const val AVATAR_VERSION = 0 } + private val logMessage: Observable = Observable("") val state = Observable(State.INITIALIZE_APP) private val shutDownErrorMessage = Observable() @@ -71,21 +66,11 @@ class MainNodePresenter(greetingRepository: NodeGreetingRepository): MainPresent init { - // TODO move to application once DI setup gets merged - FacadeProvider.setLocalhostFacade(AndroidEmulatorLocalhostFacade()) - FacadeProvider.setJdkFacade(AndroidJdkFacade(Process.myPid())) - FacadeProvider.setGuavaFacade(AndroidGuavaFacade()) - - // Androids default BC version does not support all algorithms we need, thus we remove - // it and add our BC provider - Security.removeProvider("BC") - Security.addProvider(BouncyCastleProvider()) - log("Static Bisq core setup ready") - CoroutineScope(Dispatchers.IO).launch { greetingRepository.create(AndroidNodeGreeting()) } } + override fun onViewAttached() { super.onViewAttached() logMessage.addObserver { @@ -124,7 +109,6 @@ class MainNodePresenter(greetingRepository: NodeGreetingRepository): MainPresent printDefaultKeyId() printLanguageCode() - // At the moment is nor persisting the profile so it will create one on each run if (userIdentityService.userIdentities.isEmpty()) { //createUserIfNoneExist(); initializeUserService() @@ -133,17 +117,22 @@ class MainNodePresenter(greetingRepository: NodeGreetingRepository): MainPresent createUserProfile("Android user " + Random(4234234).nextInt(100)).join() log("Created profile for user") } + + // User profile data printUserProfiles() + // network metadata observeNetworkState() observeNumConnections() fetchMarketPrice(500L) + // trading observePrivateMessages() + + // Less priority for MVP publishRandomChatMessage(); observeChatMessages(5) maybeRemoveMyOldChatMessages() - // sendRandomMessagesEvery(60L * 100L) } } diff --git a/bisqapps/docs/bisqapps_design_arch.dia b/bisqapps/docs/bisqapps_design_arch.dia index 4ed6b364..f90623f0 100644 --- a/bisqapps/docs/bisqapps_design_arch.dia +++ b/bisqapps/docs/bisqapps_design_arch.dia @@ -88,6 +88,7 @@ + @@ -312,16 +313,16 @@ - + - + - + @@ -361,7 +362,7 @@ Client# - + @@ -597,5 +598,424 @@ data and communicate user actions# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Service# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #AndroidNode -> bisq core p2p jars provided +xClients -> shared networking package (HTTPS/WSS)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #observes & commands +# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #observes# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Services are responsible for +updating the repository that +the presentation layer observes +Presenters can modify repository +as well if needed# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bisqapps/docs/bisqapps_design_arch.png b/bisqapps/docs/bisqapps_design_arch.png index ae14f5ab0c389864a96fc20fab4479730a98f087..e85896aaefbacba7ced74654e66a11d5863d78f5 100644 GIT binary patch literal 39297 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 i0HUEI1pojb8vg@pHV9Dt^Y!Kc0000 literal 22001 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 QPyhe`07*qoM6N<$f?03!^Z)<= diff --git a/bisqapps/gradle.properties b/bisqapps/gradle.properties index cb5994a9..d3ef4f11 100644 --- a/bisqapps/gradle.properties +++ b/bisqapps/gradle.properties @@ -11,11 +11,11 @@ android.useAndroidX=true android.nonTransitiveRClass=true #Versioning -shared.version=0.0.2 +shared.version=0.0.9 node.name=Bisq -node.android.version=0.0.1 +node.android.version=0.0.5 client.name=BisqClient -client.android.version=0.0.1 -client.ios.version=0.0.1 \ No newline at end of file +client.android.version=0.0.3 +client.ios.version=0.0.3 \ No newline at end of file diff --git a/bisqapps/iosClient/Podfile.lock b/bisqapps/iosClient/Podfile.lock index 295e6bb7..672a7cee 100644 --- a/bisqapps/iosClient/Podfile.lock +++ b/bisqapps/iosClient/Podfile.lock @@ -1,6 +1,6 @@ PODS: - - domain (0.0.2) - - presentation (0.0.2) + - domain (0.0.9) + - presentation (0.0.9) DEPENDENCIES: - domain (from `../shared/domain`) diff --git a/bisqapps/iosClient/Pods/Local Podspecs/domain.podspec.json b/bisqapps/iosClient/Pods/Local Podspecs/domain.podspec.json index 76d83040..c3ee2e40 100644 --- a/bisqapps/iosClient/Pods/Local Podspecs/domain.podspec.json +++ b/bisqapps/iosClient/Pods/Local Podspecs/domain.podspec.json @@ -1,6 +1,6 @@ { "name": "domain", - "version": "0.0.2", + "version": "0.0.9", "homepage": "X", "source": { "http": "" diff --git a/bisqapps/iosClient/Pods/Local Podspecs/presentation.podspec.json b/bisqapps/iosClient/Pods/Local Podspecs/presentation.podspec.json index 6ad1f048..15bf4b74 100644 --- a/bisqapps/iosClient/Pods/Local Podspecs/presentation.podspec.json +++ b/bisqapps/iosClient/Pods/Local Podspecs/presentation.podspec.json @@ -1,6 +1,6 @@ { "name": "presentation", - "version": "0.0.2", + "version": "0.0.9", "homepage": "X", "source": { "http": "" diff --git a/bisqapps/iosClient/Pods/Manifest.lock b/bisqapps/iosClient/Pods/Manifest.lock index 295e6bb7..672a7cee 100644 --- a/bisqapps/iosClient/Pods/Manifest.lock +++ b/bisqapps/iosClient/Pods/Manifest.lock @@ -1,6 +1,6 @@ PODS: - - domain (0.0.2) - - presentation (0.0.2) + - domain (0.0.9) + - presentation (0.0.9) DEPENDENCIES: - domain (from `../shared/domain`) diff --git a/bisqapps/iosClient/iosClient/ContentView.swift b/bisqapps/iosClient/iosClient/ContentView.swift index b1d3d9ce..5461c8e0 100644 --- a/bisqapps/iosClient/iosClient/ContentView.swift +++ b/bisqapps/iosClient/iosClient/ContentView.swift @@ -6,10 +6,6 @@ import domain struct ComposeView: UIViewControllerRepresentable { - // TODO DI injection is not fully resolved for iOS. we need to fix this with Koin or worst case ask the - // view for the presenter its using - // it can also work because this is just the main presenter that binds to lifecycle, that we allow - // this hardcoded dependnecy here. private let presenter: MainPresenter = get() func makeUIViewController(context: Context) -> UIViewController { diff --git a/bisqapps/iosClient/iosClient/iosClient.swift b/bisqapps/iosClient/iosClient/iosClient.swift index 73717e03..f105b707 100644 --- a/bisqapps/iosClient/iosClient/iosClient.swift +++ b/bisqapps/iosClient/iosClient/iosClient.swift @@ -4,7 +4,6 @@ import presentation @main struct iosClient: App { init() { - // TODO might need to get away the helper approach in favour of adding koin pods in DependenciesProviderHelper().doInitKoin() } diff --git a/bisqapps/shared/domain/build.gradle.kts b/bisqapps/shared/domain/build.gradle.kts index 53d222bb..065b761a 100644 --- a/bisqapps/shared/domain/build.gradle.kts +++ b/bisqapps/shared/domain/build.gradle.kts @@ -35,7 +35,7 @@ kotlin { //put your multiplatform dependencies here implementation(libs.koin.core) implementation(libs.kotlinx.coroutines) - + implementation(libs.logging.kermit) } commonTest.dependencies { implementation(libs.kotlin.test) diff --git a/bisqapps/shared/domain/domain.podspec b/bisqapps/shared/domain/domain.podspec index d577324b..74bb372c 100644 --- a/bisqapps/shared/domain/domain.podspec +++ b/bisqapps/shared/domain/domain.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'domain' - spec.version = '0.0.2' + spec.version = '0.0.9' spec.homepage = 'X' spec.source = { :http=> ''} spec.authors = '' diff --git a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/SingleObjectRepository.kt b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/SingleObjectRepository.kt index 689393e7..d16c58ed 100644 --- a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/SingleObjectRepository.kt +++ b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/SingleObjectRepository.kt @@ -1,12 +1,11 @@ package network.bisq.mobile.domain.data.repository +import co.touchlab.kermit.Logger import kotlinx.coroutines.* import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import network.bisq.mobile.domain.data.model.BaseModel -import network.bisq.mobile.domain.data.model.Greeting import network.bisq.mobile.domain.data.persistance.PersistenceSource -import kotlin.jvm.JvmStatic /** * Repository implementation for a single object. Allows for persistance if the persistance source if provided, otherwise is mem-only. @@ -17,6 +16,8 @@ abstract class SingleObjectRepository( private val persistenceSource: PersistenceSource? = null ) : Repository { + private val logger = Logger.withTag(SingleObjectRepository::class.simpleName ?: "SingleObjectRepository") + private val _data = MutableStateFlow(null) override val data: StateFlow = _data @@ -53,12 +54,12 @@ abstract class SingleObjectRepository( override suspend fun clear() { try { + persistenceSource?.clear() scope.cancel() } catch (e: Exception) { - // TODO log error + logger.e("Failed to cancel repository coroutine scope", e) } finally { _data.value = null - persistenceSource?.clear() } } } \ No newline at end of file diff --git a/bisqapps/shared/presentation/presentation.podspec b/bisqapps/shared/presentation/presentation.podspec index 0c7dd2a1..8da21de4 100644 --- a/bisqapps/shared/presentation/presentation.podspec +++ b/bisqapps/shared/presentation/presentation.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'presentation' - spec.version = '0.0.2' + spec.version = '0.0.9' spec.homepage = 'X' spec.source = { :http=> ''} spec.authors = ''