From ba39690afda48d3d03153c3b41c12f5e464ba6db Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 24 Jan 2023 16:47:34 +0400 Subject: [PATCH 01/27] coroutine defintion --- .../utils/core/koin/scope/dsl/ScopedCoroutine.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt new file mode 100644 index 0000000..ece563a --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt @@ -0,0 +1,11 @@ +package com.merseyside.merseyLib.utils.core.koin.scope.dsl + +import kotlinx.coroutines.CoroutineScope +import org.koin.core.definition.KoinDefinition +import org.koin.dsl.ScopeDSL + +inline fun ScopeDSL.coroutineScope(crossinline block: () -> R): R { + val coroutine = block() + scoped { coroutine } + return coroutine +} \ No newline at end of file From 6750967f66544ac17af615b9c1443d96064713c5 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 24 Jan 2023 17:36:11 +0400 Subject: [PATCH 02/27] rewrite coroutine defintion --- .../utils/core/koin/scope/dsl/ScopedCoroutine.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt index ece563a..abd0887 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt @@ -4,8 +4,9 @@ import kotlinx.coroutines.CoroutineScope import org.koin.core.definition.KoinDefinition import org.koin.dsl.ScopeDSL -inline fun ScopeDSL.coroutineScope(crossinline block: () -> R): R { - val coroutine = block() - scoped { coroutine } - return coroutine +inline fun ScopeDSL.coroutineScope( + qualifier: Qualifier? = null, + noinline definition: Definition +): KoinDefinition { + return scoped(qualifier, definition).onClose { it?.cancel() } } \ No newline at end of file From 4a9433a9853e4fc0b2dbed35a015f129c5892be8 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 25 Jan 2023 15:45:20 +0400 Subject: [PATCH 03/27] fixed imports --- .../merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt index abd0887..1742a65 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedCoroutine.kt @@ -1,12 +1,16 @@ package com.merseyside.merseyLib.utils.core.koin.scope.dsl import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.cancel +import org.koin.core.definition.Definition import org.koin.core.definition.KoinDefinition +import org.koin.core.qualifier.Qualifier import org.koin.dsl.ScopeDSL +import org.koin.dsl.onClose inline fun ScopeDSL.coroutineScope( qualifier: Qualifier? = null, noinline definition: Definition ): KoinDefinition { - return scoped(qualifier, definition).onClose { it?.cancel() } + return scoped(qualifier, definition) onClose { coroutine -> coroutine?.cancel() } } \ No newline at end of file From 0a2b92c0d9a59b54719c2944210358e01fc9a6ab Mon Sep 17 00:00:00 2001 From: Ivan Sablin Date: Wed, 25 Jan 2023 19:25:34 +0600 Subject: [PATCH 04/27] Up catalog version --- buildSrc/settings.gradle.kts | 2 +- settings.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index a8ebd08..b976129 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -16,7 +16,7 @@ dependencyResolutionManagement { gradlePluginPortal() } - val catalogVersions = "1.6.4" + val catalogVersions = "1.6.6" val group = "io.github.merseyside" versionCatalogs { diff --git a/settings.gradle.kts b/settings.gradle.kts index cf890db..2d24feb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,7 +11,7 @@ dependencyResolutionManagement { google() } - val catalogVersions = "1.6.4" + val catalogVersions = "1.6.6" val group = "io.github.merseyside" versionCatalogs { val multiplatformLibs by creating { From d3ca7c43b130abf4b4424cce5a880686307caf3a Mon Sep 17 00:00:00 2001 From: Ivan Sablin Date: Tue, 21 Feb 2023 13:39:51 +0600 Subject: [PATCH 05/27] Building changes --- buildSrc/settings.gradle.kts | 2 +- settings.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index b976129..1829509 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -16,7 +16,7 @@ dependencyResolutionManagement { gradlePluginPortal() } - val catalogVersions = "1.6.6" + val catalogVersions = "1.6.7" val group = "io.github.merseyside" versionCatalogs { diff --git a/settings.gradle.kts b/settings.gradle.kts index 2d24feb..221497c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,7 +11,7 @@ dependencyResolutionManagement { google() } - val catalogVersions = "1.6.6" + val catalogVersions = "1.6.7" val group = "io.github.merseyside" versionCatalogs { val multiplatformLibs by creating { From c08f9b78cb8ac1075e5d7d771156ee4d82d4ff2d Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 21 Feb 2023 16:17:39 +0300 Subject: [PATCH 06/27] added reset pagination --- .../merseyside/merseyLib/utils/core/pagination/Pagination.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt index 1298caa..b14dcee 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt @@ -36,6 +36,11 @@ abstract class Pagination(private val initPage: Page): ILogger return getNextPage() != null || lastData == null } + fun resetPaging() { + lastData = null + currentPage = initPage + } + suspend fun loadNextPage() { if (!isNextPageValid()) { logMsg("No next page") From dce2805e01393faec3cf93985b421d1273958662 Mon Sep 17 00:00:00 2001 From: Andrey Portnyagin Date: Tue, 7 Mar 2023 18:04:15 +0300 Subject: [PATCH 07/27] added paging up --- .../utils/core/pagination/Pagination.kt | 70 ++++++++++++++++--- .../core/pagination/PositionPagination.kt | 2 +- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt index b14dcee..0a865d5 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt @@ -2,30 +2,46 @@ package com.merseyside.merseyLib.utils.core.pagination import com.merseyside.merseyLib.kotlin.entity.Result import com.merseyside.merseyLib.kotlin.logger.ILogger +import com.merseyside.merseyLib.kotlin.logger.log import com.merseyside.merseyLib.kotlin.utils.safeLet import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.map -abstract class Pagination(private val initPage: Page): ILogger +abstract class Pagination( + private val initNextPage: Page, + private val initPrevPage: Page +) : ILogger where PD : PagerData { private var lastData: PD? = null - var currentPage: Page = initPage + var currentNextPage: Page = initNextPage + var currentPrevPage: Page = initPrevPage - private val mutSharedFlow: MutableSharedFlow> = MutableSharedFlow(extraBufferCapacity = 10) + private val pages = mutableMapOf(initPrevPage to initNextPage) + + private val mutSharedFlow: MutableSharedFlow> = + MutableSharedFlow(extraBufferCapacity = 10) val resultFlow: Flow> = mutSharedFlow val dataFlow: Flow = resultFlow.filterIsInstance>().map { it.value } private fun getNextPage(): Page { return safeLet(lastData) { - it.nextPage - } ?: initPage + pages[it.prevPage] = it.nextPage + findLastNextPage(it.nextPage ?: initPrevPage) + } ?: initNextPage + } + + private fun getPrevPage(): Page { + return safeLet(lastData) { + pages[it.prevPage] = it.nextPage + findFirstPrevPage(it.prevPage ?: initPrevPage) + } ?: initPrevPage } - abstract suspend fun loadData(page: Page): PD + abstract suspend fun loadData(nextPage: Page, prevPage: Page): PD private suspend fun onDataLoaded(pagerData: PD) { lastData = pagerData @@ -36,9 +52,14 @@ abstract class Pagination(private val initPage: Page): ILogger return getNextPage() != null || lastData == null } + private fun isPrevPageValid(): Boolean { + return getPrevPage() != null + } + fun resetPaging() { lastData = null - currentPage = initPage + currentNextPage = initNextPage + currentPrevPage = initPrevPage } suspend fun loadNextPage() { @@ -47,10 +68,27 @@ abstract class Pagination(private val initPage: Page): ILogger return } - currentPage = getNextPage() + currentNextPage = getNextPage() + + try { + val newData = loadData(currentNextPage, initPrevPage) + emitResult(Result.Loading()) + onDataLoaded(newData) + } catch (e: Exception) { + emitResult(Result.Error(e)) + } + } + + suspend fun loadPrevPage() { + if (!isPrevPageValid()) { + logMsg("No prev page") + return + } + + currentPrevPage = getPrevPage() try { - val newData = loadData(currentPage) + val newData = loadData(initNextPage, currentPrevPage) emitResult(Result.Loading()) onDataLoaded(newData) } catch (e: Exception) { @@ -58,6 +96,20 @@ abstract class Pagination(private val initPage: Page): ILogger } } + private fun findFirstPrevPage(page: Page): Page { + val prevPage = pages.entries.find { entry -> entry.value == page }?.key + ?: return page + + return findFirstPrevPage(prevPage) + } + + private fun findLastNextPage(page: Page): Page { + val nextPage = pages[page] + ?: return page + + return findLastNextPage(nextPage) + } + private suspend fun emitResult(result: Result) { mutSharedFlow.emit(result) } diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PositionPagination.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PositionPagination.kt index b50f0f8..4420c07 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PositionPagination.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PositionPagination.kt @@ -1,4 +1,4 @@ package com.merseyside.merseyLib.utils.core.pagination abstract class PositionPagination(initPage: Int) : - Pagination, Data, Int>(initPage) \ No newline at end of file + Pagination, Data, Int>(initPage, initPage) \ No newline at end of file From b21835f27aa4d8779ba06dcdd3415c660c222bfe Mon Sep 17 00:00:00 2001 From: Andrey Portnyagin Date: Fri, 10 Mar 2023 18:53:49 +0300 Subject: [PATCH 08/27] rewrited pagionation logic --- .../utils/core/pagination/Pagination.kt | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt index 0a865d5..6c26697 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt @@ -16,9 +16,22 @@ abstract class Pagination( where PD : PagerData { private var lastData: PD? = null + set(value) { + field = value + safeLet(value) { data -> + if (data.prevPage != null && data.nextPage != null) { + if (!newPages.any { it.values.contains(data.prevPage) }) { + newPages.add(0, mapOf(data.prevPage to data.nextPage)) + } + } + newPages.add(mapOf(data.prevPage to data.nextPage)) + } + } var currentNextPage: Page = initNextPage var currentPrevPage: Page = initPrevPage + private val newPages = mutableListOf(mapOf(initPrevPage to initNextPage)) + private val pages = mutableMapOf(initPrevPage to initNextPage) private val mutSharedFlow: MutableSharedFlow> = @@ -29,15 +42,13 @@ abstract class Pagination( private fun getNextPage(): Page { return safeLet(lastData) { - pages[it.prevPage] = it.nextPage - findLastNextPage(it.nextPage ?: initPrevPage) + newPages.lastOrNull()?.values?.lastOrNull() } ?: initNextPage } private fun getPrevPage(): Page { return safeLet(lastData) { - pages[it.prevPage] = it.nextPage - findFirstPrevPage(it.prevPage ?: initPrevPage) + newPages.firstOrNull()?.keys?.firstOrNull() } ?: initPrevPage } @@ -53,13 +64,14 @@ abstract class Pagination( } private fun isPrevPageValid(): Boolean { - return getPrevPage() != null + return getPrevPage() != null || lastData == null } fun resetPaging() { lastData = null currentNextPage = initNextPage currentPrevPage = initPrevPage + newPages.clear() } suspend fun loadNextPage() { @@ -96,20 +108,6 @@ abstract class Pagination( } } - private fun findFirstPrevPage(page: Page): Page { - val prevPage = pages.entries.find { entry -> entry.value == page }?.key - ?: return page - - return findFirstPrevPage(prevPage) - } - - private fun findLastNextPage(page: Page): Page { - val nextPage = pages[page] - ?: return page - - return findLastNextPage(nextPage) - } - private suspend fun emitResult(result: Result) { mutSharedFlow.emit(result) } From fffd1a2545824e4c7b490b37d6f84a7f1cb441ea Mon Sep 17 00:00:00 2001 From: Andrey Portnyagin Date: Fri, 10 Mar 2023 18:54:40 +0300 Subject: [PATCH 09/27] remove redutant --- .../utils/core/pagination/Pagination.kt | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt index 6c26697..63c98c8 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt @@ -2,7 +2,6 @@ package com.merseyside.merseyLib.utils.core.pagination import com.merseyside.merseyLib.kotlin.entity.Result import com.merseyside.merseyLib.kotlin.logger.ILogger -import com.merseyside.merseyLib.kotlin.logger.log import com.merseyside.merseyLib.kotlin.utils.safeLet import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow @@ -20,19 +19,17 @@ abstract class Pagination( field = value safeLet(value) { data -> if (data.prevPage != null && data.nextPage != null) { - if (!newPages.any { it.values.contains(data.prevPage) }) { - newPages.add(0, mapOf(data.prevPage to data.nextPage)) + if (!pages.any { it.values.contains(data.prevPage) }) { + pages.add(0, mapOf(data.prevPage to data.nextPage)) } } - newPages.add(mapOf(data.prevPage to data.nextPage)) + pages.add(mapOf(data.prevPage to data.nextPage)) } } var currentNextPage: Page = initNextPage var currentPrevPage: Page = initPrevPage - private val newPages = mutableListOf(mapOf(initPrevPage to initNextPage)) - - private val pages = mutableMapOf(initPrevPage to initNextPage) + private val pages = mutableListOf(mapOf(initPrevPage to initNextPage)) private val mutSharedFlow: MutableSharedFlow> = MutableSharedFlow(extraBufferCapacity = 10) @@ -42,13 +39,13 @@ abstract class Pagination( private fun getNextPage(): Page { return safeLet(lastData) { - newPages.lastOrNull()?.values?.lastOrNull() + pages.lastOrNull()?.values?.lastOrNull() } ?: initNextPage } private fun getPrevPage(): Page { return safeLet(lastData) { - newPages.firstOrNull()?.keys?.firstOrNull() + pages.firstOrNull()?.keys?.firstOrNull() } ?: initPrevPage } @@ -71,7 +68,7 @@ abstract class Pagination( lastData = null currentNextPage = initNextPage currentPrevPage = initPrevPage - newPages.clear() + pages.clear() } suspend fun loadNextPage() { From 7dbd39bad7d9858f9ab89555681d4c846c8bc3d8 Mon Sep 17 00:00:00 2001 From: Andrey Portnyagin Date: Mon, 13 Mar 2023 15:31:08 +0300 Subject: [PATCH 10/27] rewrited pagination logic page --- .../merseyLib/utils/core/pagination/Pagination.kt | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt index 63c98c8..9287ec0 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt @@ -15,17 +15,7 @@ abstract class Pagination( where PD : PagerData { private var lastData: PD? = null - set(value) { - field = value - safeLet(value) { data -> - if (data.prevPage != null && data.nextPage != null) { - if (!pages.any { it.values.contains(data.prevPage) }) { - pages.add(0, mapOf(data.prevPage to data.nextPage)) - } - } - pages.add(mapOf(data.prevPage to data.nextPage)) - } - } + var currentNextPage: Page = initNextPage var currentPrevPage: Page = initPrevPage @@ -82,6 +72,7 @@ abstract class Pagination( try { val newData = loadData(currentNextPage, initPrevPage) emitResult(Result.Loading()) + pages.add(mapOf(newData.prevPage to newData.nextPage)) onDataLoaded(newData) } catch (e: Exception) { emitResult(Result.Error(e)) @@ -99,6 +90,7 @@ abstract class Pagination( try { val newData = loadData(initNextPage, currentPrevPage) emitResult(Result.Loading()) + pages.add(0, mapOf(newData.prevPage to newData.nextPage)) onDataLoaded(newData) } catch (e: Exception) { emitResult(Result.Error(e)) From f30fdee8e0b7a3dcc65f5eb01cafb117ed8a1803 Mon Sep 17 00:00:00 2001 From: Andrey Portnyagin Date: Tue, 14 Mar 2023 10:58:28 +0300 Subject: [PATCH 11/27] fix logical failures --- .../utils/core/pagination/Pagination.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt index 9287ec0..50c0b8c 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt @@ -19,7 +19,7 @@ abstract class Pagination( var currentNextPage: Page = initNextPage var currentPrevPage: Page = initPrevPage - private val pages = mutableListOf(mapOf(initPrevPage to initNextPage)) + private val pages = mutableListOf(Pair(initPrevPage, initNextPage)) private val mutSharedFlow: MutableSharedFlow> = MutableSharedFlow(extraBufferCapacity = 10) @@ -29,17 +29,17 @@ abstract class Pagination( private fun getNextPage(): Page { return safeLet(lastData) { - pages.lastOrNull()?.values?.lastOrNull() + pages.lastOrNull()?.second } ?: initNextPage } private fun getPrevPage(): Page { return safeLet(lastData) { - pages.firstOrNull()?.keys?.firstOrNull() + pages.firstOrNull()?.first } ?: initPrevPage } - abstract suspend fun loadData(nextPage: Page, prevPage: Page): PD + abstract suspend fun loadData(prevPage: Page, nextPage: Page): PD private suspend fun onDataLoaded(pagerData: PD) { lastData = pagerData @@ -51,7 +51,7 @@ abstract class Pagination( } private fun isPrevPageValid(): Boolean { - return getPrevPage() != null || lastData == null + return getPrevPage() != null } fun resetPaging() { @@ -70,9 +70,9 @@ abstract class Pagination( currentNextPage = getNextPage() try { - val newData = loadData(currentNextPage, initPrevPage) + val newData = loadData(initPrevPage, currentNextPage) emitResult(Result.Loading()) - pages.add(mapOf(newData.prevPage to newData.nextPage)) + pages.add(newData.prevPage to newData.nextPage) onDataLoaded(newData) } catch (e: Exception) { emitResult(Result.Error(e)) @@ -88,9 +88,9 @@ abstract class Pagination( currentPrevPage = getPrevPage() try { - val newData = loadData(initNextPage, currentPrevPage) + val newData = loadData(currentPrevPage, initNextPage) emitResult(Result.Loading()) - pages.add(0, mapOf(newData.prevPage to newData.nextPage)) + pages.add(0, newData.prevPage to newData.nextPage) onDataLoaded(newData) } catch (e: Exception) { emitResult(Result.Error(e)) From 51a617386abc9597df559d74ea77148555c777e3 Mon Sep 17 00:00:00 2001 From: Andrey Portnyagin Date: Tue, 14 Mar 2023 11:14:44 +0300 Subject: [PATCH 12/27] fix logical failures --- .../merseyLib/utils/core/pagination/Pagination.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt index 50c0b8c..4c681ec 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt @@ -9,15 +9,15 @@ import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.map abstract class Pagination( - private val initNextPage: Page, - private val initPrevPage: Page + private val initPrevPage: Page, + private val initNextPage: Page ) : ILogger where PD : PagerData { private var lastData: PD? = null - var currentNextPage: Page = initNextPage var currentPrevPage: Page = initPrevPage + var currentNextPage: Page = initNextPage private val pages = mutableListOf(Pair(initPrevPage, initNextPage)) From 88e00df5582fd5791bb7019a51845931b635451e Mon Sep 17 00:00:00 2001 From: Andrey Portnyagin Date: Thu, 16 Mar 2023 13:15:56 +0300 Subject: [PATCH 13/27] added pagination updown listener --- .../PaginationUpDownScrollListener.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpDownScrollListener.kt diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpDownScrollListener.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpDownScrollListener.kt new file mode 100644 index 0000000..1c57b53 --- /dev/null +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpDownScrollListener.kt @@ -0,0 +1,40 @@ +package com.merseyside.merseyLib.archy.android.presentation.recycler + +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.merseyside.merseyLib.kotlin.utils.safeLet + +abstract class PaginationUpDownScrollListener( + private val loadItemsCountDownOffset: Int = 5, + private val loadItemsCountUpOffset: Int = loadItemsCountDownOffset, +) : RecyclerView.OnChildAttachStateChangeListener { + + abstract val recyclerView: RecyclerView + abstract val onLoadNextPageDown: () -> Unit + abstract val onLoadNextPageUp: () -> Unit + + override fun onChildViewAttachedToWindow(view: View) { + if (needToLoadDownNextPage(view)) onLoadNextPageDown() + if (needToLoadUpNextPage(view)) onLoadNextPageUp() + } + + override fun onChildViewDetachedFromWindow(view: View) {} + + private fun needToLoadDownNextPage(view: View): Boolean { + with(recyclerView) { + val lastPosition = getChildAdapterPosition(view) + val itemCount = adapter?.itemCount + return safeLet(itemCount) { counts -> + (counts - lastPosition) <= loadItemsCountDownOffset + } ?: false + } + } + + private fun needToLoadUpNextPage(view: View): Boolean { + with(recyclerView) { + val lastPosition = getChildAdapterPosition(view) + return lastPosition == loadItemsCountUpOffset + } + } + +} \ No newline at end of file From b25743044230fb6de88913d3df70c98271181449 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 26 Mar 2023 14:33:30 +0400 Subject: [PATCH 14/27] added pagination scroll up --- .../PaginationUpDownScrollListener.kt | 4 +-- .../recycler/PaginationUpScrollListener.kt | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpScrollListener.kt diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpDownScrollListener.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpDownScrollListener.kt index 1c57b53..e61a1c4 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpDownScrollListener.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpDownScrollListener.kt @@ -5,8 +5,8 @@ import androidx.recyclerview.widget.RecyclerView import com.merseyside.merseyLib.kotlin.utils.safeLet abstract class PaginationUpDownScrollListener( - private val loadItemsCountDownOffset: Int = 5, - private val loadItemsCountUpOffset: Int = loadItemsCountDownOffset, + protected val loadItemsCountDownOffset: Int = 5, + protected val loadItemsCountUpOffset: Int = loadItemsCountDownOffset, ) : RecyclerView.OnChildAttachStateChangeListener { abstract val recyclerView: RecyclerView diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpScrollListener.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpScrollListener.kt new file mode 100644 index 0000000..3b71f15 --- /dev/null +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationUpScrollListener.kt @@ -0,0 +1,25 @@ +package com.merseyside.merseyLib.archy.android.presentation.recycler + +import android.view.View +import androidx.recyclerview.widget.RecyclerView + +abstract class PaginationUpScrollListener( + loadItemsCountUpOffset: Int = 5, +) : PaginationUpDownScrollListener(loadItemsCountDownOffset = 0, loadItemsCountUpOffset) { + + override val onLoadNextPageDown: () -> Unit = {} + + override fun onChildViewAttachedToWindow(view: View) { + if (needToLoadUpNextPage(view)) onLoadNextPageUp() + } + + override fun onChildViewDetachedFromWindow(view: View) {} + + private fun needToLoadUpNextPage(view: View): Boolean { + with(recyclerView) { + val lastPosition = getChildAdapterPosition(view) + return lastPosition == loadItemsCountUpOffset + } + } + +} \ No newline at end of file From 07b627719f1035a01706cfbb9df7be9a4c40f35f Mon Sep 17 00:00:00 2001 From: Ivan Sablin Date: Wed, 5 Apr 2023 15:39:02 +0600 Subject: [PATCH 15/27] Adding saved state logic --- archy-android/build.gradle.kts | 2 +- .../di/state/AndroidKoinStateHolder.kt | 38 ------ .../presentation/activity/VMActivity.kt | 25 +--- .../presentation/activity/VMEventsActivity.kt | 9 +- .../presentation/fragment/VMEventsFragment.kt | 8 +- .../presentation/fragment/VMFragment.kt | 23 +--- build.gradle.kts | 2 +- buildSrc/build.gradle.kts | 3 +- buildSrc/settings.gradle.kts | 4 +- .../android-maven-publish-config.gradle.kts | 22 --- .../javadoc-stub-convention.gradle.kts | 2 +- .../maven-publish-config.gradle.kts | 1 - gradle/wrapper/gradle-wrapper.properties | 2 +- sample/androidApp/build.gradle.kts | 4 +- .../merseyside/sample/view/TestFragment.kt | 18 --- .../view/fragment/di/koinStateModule.kt | 17 +++ .../view/fragment/view/KoinStateFragment.kt | 59 ++++++++ .../src/main/res/layout/activity_main.xml | 11 ++ .../main/res/layout/fragment_koin_state.xml | 34 +++++ .../src/main/res/layout/fragment_test.xml | 19 --- .../src/main/res/navigation/nav_main.xml | 13 ++ sample/mpp-library/build.gradle.kts | 1 + .../merseyside/sample/manager/SomeManager.kt | 14 ++ .../sample/viewModel/KoinStateViewModel.kt | 50 +++++++ .../sample/viewModel/TestViewModel.kt | 12 -- settings.gradle.kts | 3 +- utils-core/build.gradle.kts | 1 + .../viewmodel/ext/android/FragmentVM.kt | 86 ++++++++++++ .../viewmodel/ext/android/GetViewModel.kt | 0 .../core/koin/savedState/SavedStateKey.kt | 0 .../savedState/androidx/bundle/BundleExt.kt | 31 +++++ .../androidx/viewmodel/ext/FragmentVM.kt | 26 ++++ .../koin/savedState/provider/StateProvider.kt | 18 +++ .../provider/androidx/SavedStateRegistry.kt | 18 +++ .../savedState/scope/DeclareStateProvider.kt | 10 ++ .../utils/core/koin/state/BundleExt.kt | 23 ---- .../core/koin/state/KoinParametersState.kt | 11 -- .../utils/core/koin/state/SavedStateExt.kt | 23 ---- .../validator/SavedStateValueValidator.kt | 61 +++++++++ .../core/koin/ext/KoinSavedStateModuleExt.kt | 3 - .../core/koin/ext/KoinSavedStateScopeExt.kt | 25 ---- .../core/koin/module/dsl/ModuleViewModel.kt | 29 ---- .../utils/core/koin/module/dsl/New.kt | 31 ----- .../utils/core/koin/module/dsl/SingleOf.kt | 32 ----- .../koin/module/dsl/SingleStateViewModelOf.kt | 82 ------------ .../koin/module/dsl/viewmodel/ViewModel.kt | 17 +++ .../ViewModelOf.kt} | 18 +-- .../savedState/ext/ParametersDefinition.kt | 8 ++ .../utils/core/koin/savedState/key/Key.kt | 11 ++ .../koin/savedState/provider/StateProvider.kt | 8 ++ .../savedState/provider/dsl/SavedScopedOf.kt | 126 ++++++++++++++++++ .../koin/savedState/provider/scope/Scope.kt | 13 ++ .../koin/savedState/scope/ParametersHolder.kt | 8 ++ .../core/koin/scope/ScopeNewSavedState.kt | 115 ---------------- .../core/koin/scope/dsl/SavedScopedOf.kt | 79 ----------- .../core/koin/scope/dsl/ScopeViewModel.kt | 29 ---- .../utils/core/koin/scope/dsl/ScopedOf.kt | 34 ----- .../koin/scope/dsl/ScopedStateViewModelOf.kt | 80 ----------- .../koin/scope/dsl/viewmodel/ViewModel.kt | 14 ++ .../ViewModelOf.kt} | 17 ++- .../core/koin/state/KoinParametersState.kt | 9 -- .../core/koin/state/KoinSavedStateUtils.kt | 16 --- .../utils/core/koin/state/KoinStateHolder.kt | 41 ------ .../utils/core/savedState/SavedState.kt | 55 ++++++++ .../savedState/delegate/SavedStateDelegate.kt | 35 +++++ .../delegate/coroutine/stateFlow/StateFlow.kt | 43 ++++++ .../core/savedState/ext/SavedStateExt.kt | 32 +++++ .../validator/SavedStateValueValidator.kt | 3 + .../utils/core/state/InstanceStateManager.kt | 7 - .../merseyLib/utils/core/state/SavedState.kt | 91 ------------- .../merseyLib/utils/core/state/StateExt.kt | 7 - .../merseyLib/utils/core/state/StateSaver.kt | 6 - .../koin/savedState/provider/StateProvider.kt | 9 ++ .../core/koin/state/KoinParametersState.kt | 8 -- .../validator/SavedSatteValueValidator.kt | 5 + 75 files changed, 882 insertions(+), 968 deletions(-) delete mode 100644 archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/state/AndroidKoinStateHolder.kt delete mode 100644 buildSrc/src/main/kotlin/publication/android-maven-publish-config.gradle.kts delete mode 100644 sample/androidApp/src/main/kotlin/com/merseyside/sample/view/TestFragment.kt create mode 100644 sample/androidApp/src/main/kotlin/com/merseyside/sample/view/fragment/di/koinStateModule.kt create mode 100644 sample/androidApp/src/main/kotlin/com/merseyside/sample/view/fragment/view/KoinStateFragment.kt create mode 100644 sample/androidApp/src/main/res/layout/fragment_koin_state.xml delete mode 100644 sample/androidApp/src/main/res/layout/fragment_test.xml create mode 100644 sample/androidApp/src/main/res/navigation/nav_main.xml create mode 100644 sample/mpp-library/src/commonMain/kotlin/com/merseyside/sample/manager/SomeManager.kt create mode 100644 sample/mpp-library/src/commonMain/kotlin/com/merseyside/sample/viewModel/KoinStateViewModel.kt delete mode 100644 sample/mpp-library/src/commonMain/kotlin/com/merseyside/sample/viewModel/TestViewModel.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/androidx/viewmodel/ext/android/FragmentVM.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/androidx/viewmodel/ext/android/GetViewModel.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/SavedStateKey.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/androidx/bundle/BundleExt.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/androidx/viewmodel/ext/FragmentVM.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/provider/StateProvider.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/provider/androidx/SavedStateRegistry.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/scope/DeclareStateProvider.kt delete mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/BundleExt.kt delete mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt delete mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/SavedStateExt.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/savedState/validator/SavedStateValueValidator.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/ext/KoinSavedStateModuleExt.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/ext/KoinSavedStateScopeExt.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/ModuleViewModel.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/New.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleOf.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleStateViewModelOf.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/viewmodel/ViewModel.kt rename utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/{SingleViewModelOf.kt => viewmodel/ViewModelOf.kt} (90%) create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/ext/ParametersDefinition.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/key/Key.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/provider/StateProvider.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/provider/dsl/SavedScopedOf.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/provider/scope/Scope.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/scope/ParametersHolder.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ScopeNewSavedState.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/SavedScopedOf.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopeViewModel.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedOf.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedStateViewModelOf.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/viewmodel/ViewModel.kt rename utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/{ScopedViewModelOf.kt => viewmodel/ViewModelOf.kt} (90%) delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinSavedStateUtils.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinStateHolder.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/savedState/SavedState.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/savedState/delegate/SavedStateDelegate.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/savedState/delegate/coroutine/stateFlow/StateFlow.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/savedState/ext/SavedStateExt.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/savedState/validator/SavedStateValueValidator.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/state/InstanceStateManager.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/state/SavedState.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/state/StateExt.kt delete mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/state/StateSaver.kt create mode 100644 utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/koin/savedState/provider/StateProvider.kt delete mode 100644 utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt create mode 100644 utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/savedState/validator/SavedSatteValueValidator.kt diff --git a/archy-android/build.gradle.kts b/archy-android/build.gradle.kts index 708385f..efcc421 100644 --- a/archy-android/build.gradle.kts +++ b/archy-android/build.gradle.kts @@ -8,7 +8,7 @@ plugins { plugin(kotlin.kapt) plugin(android.navigation.args) } - `android-maven-publish-config` + `javadoc-stub-convention` } android { diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/state/AndroidKoinStateHolder.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/state/AndroidKoinStateHolder.kt deleted file mode 100644 index 5d72c9d..0000000 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/state/AndroidKoinStateHolder.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.merseyside.merseyLib.archy.android.di.state - -import android.os.Bundle -import com.merseyside.merseyLib.utils.core.koin.state.KoinStateHolder -import com.merseyside.merseyLib.utils.core.koin.state.toBundle -import com.merseyside.merseyLib.utils.core.koin.state.toSavedState -import com.merseyside.merseyLib.utils.core.state.SavedState -import org.koin.android.scope.AndroidScopeComponent -import org.koin.core.context.loadKoinModules -import org.koin.core.qualifier.Qualifier -import org.koin.dsl.module - -interface AndroidKoinScopeState : AndroidScopeComponent { - - fun initKoinState(outState: Bundle?, toScope: Qualifier) { - loadKoinModules(getKoinStateModule(outState, toScope)) - } - - fun saveKoinState(outState: Bundle) { - val koinState = getKoinStateHolder().performSaveState() - outState.putBundle(koinStateKey, koinState.toBundle()) - } - - private fun getKoinSavedState(outState: Bundle?): SavedState { - return outState?.getBundle(koinStateKey).toSavedState() - } - - private fun getKoinStateModule(outState: Bundle?, toScope: Qualifier) = module { - scope(toScope) { - scoped { KoinStateHolder(getKoin(), getKoinSavedState(outState)) } - } - } - - fun getKoinStateHolder(): KoinStateHolder = scope.get() - -} - -private const val koinStateKey = "koin_state" diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMActivity.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMActivity.kt index 76fce39..cb1a2e9 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMActivity.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMActivity.kt @@ -5,16 +5,11 @@ import android.os.Bundle import androidx.annotation.CallSuper import androidx.databinding.ViewDataBinding import com.merseyside.archy.presentation.activity.BaseBindingActivity -import com.merseyside.merseyLib.utils.core.koin.state.getStateKey import com.merseyside.merseyLib.archy.core.presentation.viewModel.BaseViewModel -import com.merseyside.merseyLib.utils.core.koin.state.saveState import com.merseyside.merseyLib.kotlin.logger.Logger -import com.merseyside.merseyLib.utils.core.state.StateSaver import com.merseyside.utils.reflection.ReflectionUtils -import org.koin.androidx.viewmodel.ext.android.viewModelForClass import org.koin.core.context.loadKoinModules import org.koin.core.module.Module -import org.koin.core.parameter.parametersOf import kotlin.reflect.KClass abstract class VMActivity @@ -36,17 +31,16 @@ abstract class VMActivity } } - protected open fun provideViewModel(bundle: Bundle?, vararg params: Any): Model { - return viewModelForClass( - clazz = getViewModelClass(), - parameters = { parametersOf(bundle, *params) } - ).value - } + protected abstract fun provideViewModel( + clazz: KClass, + bundle: Bundle?, + vararg params: Any + ): Model @CallSuper override fun performInjection(bundle: Bundle?, vararg params: Any) { loadKoinModules(getKoinModules(bundle, *params)) - viewModel = provideViewModel(bundle, *params) + viewModel = provideViewModel(getViewModelClass(), bundle, *params) } open fun getKoinModules(bundle: Bundle?, vararg params: Any): List { @@ -55,17 +49,12 @@ abstract class VMActivity } } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - (viewModel as? StateSaver)?.saveState(outState, getStateKey(getViewModelClass())) - } - override fun handleError(throwable: Throwable): Boolean { return viewModel.onError(throwable) } override fun updateLanguage(context: Context) { - //viewModel.updateLanguage(context) + //com.merseyside.merseyLib.utils.core.koin.androidx.viewmodel.ext.android.com.merseyside.merseyLib.utils.core.koin.scope.dsl.viewmodel.viewModel.updateLanguage(context) } protected abstract fun loadingObserver(isLoading: Boolean) diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMEventsActivity.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMEventsActivity.kt index 0bb1604..40efe89 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMEventsActivity.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMEventsActivity.kt @@ -9,6 +9,7 @@ import com.merseyside.merseyLib.archy.core.presentation.viewModel.entity.TextMes import dev.icerock.moko.mvvm.dispatcher.EventsDispatcher import dev.icerock.moko.mvvm.dispatcher.EventsDispatcherOwner import dev.icerock.moko.mvvm.dispatcher.eventsDispatcherOnMain +import kotlin.reflect.KClass abstract class VMEventsActivity : VMActivity(), EventsViewModel.BaseEventsListener @@ -25,12 +26,8 @@ abstract class VMEventsActivity ) } - override fun provideViewModel(bundle: Bundle?, vararg params: Any): Model { - return super.provideViewModel( - bundle, - *params, - eventsDispatcherOnMain>() - ) + override fun performInjection(bundle: Bundle?, vararg params: Any) { + super.performInjection(bundle, *params, eventsDispatcherOnMain>()) } override fun onAlert(alert: Alert) { diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMEventsFragment.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMEventsFragment.kt index 20630f8..1574496 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMEventsFragment.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMEventsFragment.kt @@ -25,12 +25,8 @@ abstract class VMEventsFragment : ) } - override fun provideViewModel(bundle: Bundle?, vararg params: Any): Model { - return super.provideViewModel( - bundle, - *params, - eventsDispatcherOnMain>() - ) + override fun performInjection(bundle: Bundle?, vararg params: Any) { + super.performInjection(bundle, *params, eventsDispatcherOnMain>()) } override fun onAlert(alert: Alert) { diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMFragment.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMFragment.kt index 6e13562..7e5b2ab 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMFragment.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMFragment.kt @@ -5,16 +5,11 @@ import android.os.Bundle import android.view.View import androidx.databinding.ViewDataBinding import com.merseyside.archy.presentation.fragment.BaseBindingFragment -import com.merseyside.merseyLib.utils.core.koin.state.getStateKey -import com.merseyside.merseyLib.utils.core.koin.state.saveState import com.merseyside.merseyLib.archy.core.presentation.viewModel.BaseViewModel import com.merseyside.merseyLib.kotlin.logger.Logger -import com.merseyside.merseyLib.utils.core.state.StateSaver import com.merseyside.utils.reflection.ReflectionUtils -import org.koin.androidx.viewmodel.ext.android.viewModelForClass import org.koin.core.context.loadKoinModules import org.koin.core.module.Module -import org.koin.core.parameter.parametersOf import kotlin.reflect.KClass abstract class VMFragment @@ -38,30 +33,24 @@ abstract class VMFragment override fun performInjection(bundle: Bundle?, vararg params: Any) { loadKoinModules(getKoinModules(bundle, *params)) - viewModel = provideViewModel(bundle, *params) + viewModel = provideViewModel(getViewModelClass(), bundle, *params) } open fun getKoinModules(bundle: Bundle?, vararg params: Any): List { return emptyList().also { Logger.logInfo("$this", "Empty fragment's koin modules") } } - protected open fun provideViewModel(bundle: Bundle?, vararg params: Any): Model { - return viewModelForClass( - clazz = getViewModelClass(), - parameters = { parametersOf(*params, bundle) } - ).value - } + protected abstract fun provideViewModel( + clazz: KClass, + bundle: Bundle?, + vararg params: Any + ): Model override fun onViewCreated(view: View, savedInstanceState: Bundle?) { initDataBinding(requireBinding()) super.onViewCreated(view, savedInstanceState) } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - (viewModel as? StateSaver)?.saveState(outState, getStateKey(getViewModelClass())) - } - override fun updateLanguage(context: Context) { super.updateLanguage(context) //viewModel.updateLanguage(context) diff --git a/build.gradle.kts b/build.gradle.kts index 071dc63..d5f6175 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { allprojects { group = "io.github.merseyside" - version = "1.5.3" + version = "1.5.4" } buildscript { // disable pod install tasks until find a solution diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 1635a18..2a5df1d 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -13,11 +13,10 @@ dependencies { with(catalogGradle) { implementation(moko.mobileMultiplatform) implementation(mersey.gradlePlugins) - implementation(android.gradle) + implementation(android.gradle.stable) implementation(kotlin.gradle) implementation(kotlin.serialization) implementation(moko.resourcesGenerator) - implementation(sqldelight) implementation(nexusPublish) implementation(android.navigation.safeArgs) } diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index 1829509..adb6fd3 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -1,5 +1,3 @@ -enableFeaturePreview("VERSION_CATALOGS") - pluginManagement { repositories { mavenCentral() @@ -16,7 +14,7 @@ dependencyResolutionManagement { gradlePluginPortal() } - val catalogVersions = "1.6.7" + val catalogVersions = "1.7.0" val group = "io.github.merseyside" versionCatalogs { diff --git a/buildSrc/src/main/kotlin/publication/android-maven-publish-config.gradle.kts b/buildSrc/src/main/kotlin/publication/android-maven-publish-config.gradle.kts deleted file mode 100644 index 3489928..0000000 --- a/buildSrc/src/main/kotlin/publication/android-maven-publish-config.gradle.kts +++ /dev/null @@ -1,22 +0,0 @@ -import com.android.build.gradle.BaseExtension - -plugins { - id("maven-publish-config") -} - -afterEvaluate { - val androidSourcesJar = tasks.create("androidSourcesJar", Jar::class) { - archiveClassifier.set("sources") - val androidExtension: BaseExtension = - this.project.extensions.getByType(BaseExtension::class) - from(androidExtension.sourceSets.getByName("main").java.srcDirs) - } - - publishing.publications { - create("release", MavenPublication::class.java) { - from(components.getByName("release")) - - artifact(androidSourcesJar) - } - } -} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/publication/javadoc-stub-convention.gradle.kts b/buildSrc/src/main/kotlin/publication/javadoc-stub-convention.gradle.kts index 2f06a6f..d867d7f 100644 --- a/buildSrc/src/main/kotlin/publication/javadoc-stub-convention.gradle.kts +++ b/buildSrc/src/main/kotlin/publication/javadoc-stub-convention.gradle.kts @@ -1,5 +1,5 @@ plugins { - `maven-publish` + id("org.gradle.maven-publish") } val javadocJar by tasks.registering(Jar::class) { diff --git a/buildSrc/src/main/kotlin/publication/maven-publish-config.gradle.kts b/buildSrc/src/main/kotlin/publication/maven-publish-config.gradle.kts index f3a29fb..963b3bc 100644 --- a/buildSrc/src/main/kotlin/publication/maven-publish-config.gradle.kts +++ b/buildSrc/src/main/kotlin/publication/maven-publish-config.gradle.kts @@ -1,7 +1,6 @@ import java.util.Base64 plugins { - id("javadoc-stub-convention") `maven-publish` signing } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 867eb9c..bdfbf4a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Thu Feb 04 15:25:14 NOVT 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/sample/androidApp/build.gradle.kts b/sample/androidApp/build.gradle.kts index 65d8973..ef659cc 100644 --- a/sample/androidApp/build.gradle.kts +++ b/sample/androidApp/build.gradle.kts @@ -47,6 +47,7 @@ android { kotlinExtension { debug = true setCompilerArgs( + "-Xcontext-receivers", "-Xinline-classes", "-opt-in=kotlin.RequiresOptIn", "-Xskip-prerelease-check" @@ -56,7 +57,8 @@ kotlinExtension { val android = listOf( androidLibs.appCompat, androidLibs.material, - androidLibs.koin + androidLibs.koin, + androidLibs.navigation ) val merseyLibs = listOf( diff --git a/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/TestFragment.kt b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/TestFragment.kt deleted file mode 100644 index 8383ef8..0000000 --- a/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/TestFragment.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.merseyside.sample.view - -import android.content.Context -import com.merseyside.merseyLib.archy.android.presentation.fragment.VMEventsFragment -import com.merseyside.sample.BR -import com.merseyside.sample.R -import com.merseyside.sample.databinding.FragmentTestBinding -import com.merseyside.sample.viewModel.TestViewModel - -class TestFragment : VMEventsFragment(), TestViewModel.TestEventsListener { - override fun getLayoutId() = R.layout.fragment_test - override fun getTitle(context: Context) = null - override fun getBindingVariable() = BR.viewModel - override fun doSomeJob() { - showMsg("Doing some job!") - } -} \ No newline at end of file diff --git a/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/fragment/di/koinStateModule.kt b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/fragment/di/koinStateModule.kt new file mode 100644 index 0000000..af0cfd9 --- /dev/null +++ b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/fragment/di/koinStateModule.kt @@ -0,0 +1,17 @@ +package com.merseyside.sample.view.fragment.di + +import com.merseyside.merseyLib.utils.core.koin.savedState.provider.dsl.stateScopedOf +import com.merseyside.merseyLib.utils.core.koin.scope.dsl.viewmodel.viewModelOf +import com.merseyside.sample.view.fragment.view.KoinStateFragment +import org.koin.dsl.module +import com.merseyside.sample.viewModel.KoinStateViewModel +import com.merseyside.sample.manager.SomeManager + +val koinStateModule = module { + + scope { + viewModelOf(::KoinStateViewModel) + stateScopedOf(::SomeManager) + } + +} \ No newline at end of file diff --git a/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/fragment/view/KoinStateFragment.kt b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/fragment/view/KoinStateFragment.kt new file mode 100644 index 0000000..2accbb1 --- /dev/null +++ b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/fragment/view/KoinStateFragment.kt @@ -0,0 +1,59 @@ +package com.merseyside.sample.view.fragment.view + +import android.content.Context +import android.os.Bundle +import androidx.lifecycle.SavedStateHandle +import com.merseyside.merseyLib.archy.android.presentation.fragment.VMEventsFragment +import com.merseyside.merseyLib.kotlin.logger.log +import com.merseyside.merseyLib.utils.core.koin.androidx.viewmodel.ext.android.getViewModel +import com.merseyside.merseyLib.utils.core.koin.savedState.scope.declareStateProvider +import com.merseyside.sample.BR +import com.merseyside.sample.R +import com.merseyside.sample.databinding.FragmentKoinStateBinding +import com.merseyside.sample.view.fragment.di.koinStateModule +import com.merseyside.sample.viewModel.KoinStateViewModel +import org.koin.android.scope.AndroidScopeComponent +import org.koin.androidx.scope.fragmentScope +import org.koin.core.module.Module +import org.koin.core.parameter.parametersOf +import org.koin.core.scope.Scope +import kotlin.reflect.KClass + +class KoinStateFragment : VMEventsFragment(), AndroidScopeComponent, + KoinStateViewModel.KoinStateEventsListener { + + override val scope: Scope by fragmentScope() + + override fun onAttach(context: Context) { + super.onAttach(context) + scope.declareStateProvider() + } + + override fun getLayoutId() = R.layout.fragment_koin_state + override fun getTitle(context: Context) = null + override fun getBindingVariable() = BR.viewModel + + override fun getKoinModules(bundle: Bundle?, vararg params: Any): List { + SavedStateHandle + return listOf(koinStateModule) + } + + override fun provideViewModel( + clazz: KClass, + bundle: Bundle?, + vararg params: Any + ): KoinStateViewModel { + return getViewModel( + clazz = clazz, + parameters = { parametersOf(*params) } + ) + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.log("kek") + } + + +} \ No newline at end of file diff --git a/sample/androidApp/src/main/res/layout/activity_main.xml b/sample/androidApp/src/main/res/layout/activity_main.xml index 38b8479..76cc47a 100644 --- a/sample/androidApp/src/main/res/layout/activity_main.xml +++ b/sample/androidApp/src/main/res/layout/activity_main.xml @@ -6,6 +6,17 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + +