From 1d383e2b789ce491c86947148887c8f54958a15c Mon Sep 17 00:00:00 2001 From: Adetunji Dahunsi Date: Sun, 21 Apr 2024 18:30:35 -0400 Subject: [PATCH 01/11] Update microbenchmarks --- .../example/benchmarks/data/Benchmarked.kt | 5 +- .../com/example/benchmarks/data/Paging.kt | 49 ++++++++++--------- .../com/example/benchmarks/data/Tiling.kt | 37 ++++++++------ gradle/libs.versions.toml | 2 +- 4 files changed, 51 insertions(+), 42 deletions(-) diff --git a/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Benchmarked.kt b/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Benchmarked.kt index bca798a..908a295 100644 --- a/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Benchmarked.kt +++ b/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Benchmarked.kt @@ -1,13 +1,14 @@ package com.example.benchmarks.data -const val PAGE_TO_SCROLL_TO = 10 +const val PAGE_TO_SCROLL_TO = 20 const val ITEMS_PER_PAGE = 100 internal const val NUM_PAGES_IN_MEMORY = 3 internal const val MAX_LOAD_SIZE = NUM_PAGES_IN_MEMORY * ITEMS_PER_PAGE +@Suppress("EmptyRange") val emptyPages = 0 until 0 -val onScreenPages = ((PAGE_TO_SCROLL_TO + 1) - NUM_PAGES_IN_MEMORY)..PAGE_TO_SCROLL_TO +val onScreenPages = (PAGE_TO_SCROLL_TO - NUM_PAGES_IN_MEMORY)..PAGE_TO_SCROLL_TO val offScreenPages = (onScreenPages.first - NUM_PAGES_IN_MEMORY) until onScreenPages.first sealed interface Benchmarked { diff --git a/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Paging.kt b/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Paging.kt index 6e22fe5..e475bf6 100644 --- a/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Paging.kt +++ b/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Paging.kt @@ -1,5 +1,6 @@ package com.example.benchmarks.data +import android.annotation.SuppressLint import androidx.paging.CombinedLoadStates import androidx.paging.DifferCallback import androidx.paging.LoadState @@ -12,11 +13,8 @@ import androidx.paging.PagingSource import androidx.paging.PagingState import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.transformWhile import kotlinx.coroutines.launch -import kotlin.math.max private val pagingConfig = PagingConfig( pageSize = ITEMS_PER_PAGE, @@ -30,8 +28,9 @@ class PagingBenchmark( private val pagesToInvalidate: IntRange ) : Benchmarked { - private var lastInvalidatedPage: Int = Int.MIN_VALUE + private var lastInvalidatedPage: Int = pagesToInvalidate.first + 1 + @SuppressLint("RestrictedApi") override suspend fun benchmark() = coroutineScope { val differ = pagingDataDiffer() val collectJob = launch { @@ -50,7 +49,6 @@ class PagingBenchmark( // When items are delivered, read them .onPagesUpdatedFlow .transformWhile { - differ.loadStateFlow if (!differ.loadStateFlow.value.isIdle()) return@transformWhile true val latestItems = differ.snapshot().items @@ -64,29 +62,42 @@ class PagingBenchmark( return@transformWhile true } - emit(latestItems) + // Currently at the page scrolled to. If there's nothing to invalidate, complete + if (pagesToInvalidate.isEmpty()) return@transformWhile false + + // Find an item from the page that was invalidated + val invalidatedItem = latestItems.lastInvalidatedItem() + + val isFinished = invalidatedItem != null + && invalidatedItem.lastInvalidatedPage >= pagesToInvalidate.last - val isFinished = pagesToInvalidate.isEmpty() || - lastItem.lastInvalidatedPage >= pagesToInvalidate.last + emit(latestItems) !isFinished } .collect { - // Account for start - lastInvalidatedPage = max( - a = lastInvalidatedPage, - b = pagesToInvalidate.first - 1 - ) - if (lastInvalidatedPage < pagesToInvalidate.last) { - ++lastInvalidatedPage + // Invalidate + val invalidatedItem = it.lastInvalidatedItem() + val canIncrementAndInvalidate = invalidatedItem == null + || invalidatedItem.lastInvalidatedPage == lastInvalidatedPage + + if (canIncrementAndInvalidate && ++lastInvalidatedPage <= pagesToInvalidate.last) { differ.refresh() } } collectJob.cancel() } + + private fun List.lastInvalidatedItem(): Item? { + for (item in this) { + if (item.lastInvalidatedPage == lastInvalidatedPage) return item + } + return null + } } +@SuppressLint("RestrictedApi") private fun pagingDataDiffer() = object : PagingDataDiffer( differCallback = object : DifferCallback { override fun onChanged(position: Int, count: Int) = Unit @@ -151,11 +162,3 @@ private fun LoadStates.isIdle(): Boolean { prepend is LoadState.NotLoading } -abstract class M { - abstract val initial: T - - private var seed: T = initial - - val flow = flowOf(seed) - .onEach { seed = it } -} diff --git a/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Tiling.kt b/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Tiling.kt index 43e559a..388e244 100644 --- a/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Tiling.kt +++ b/benchmarks/benchmarkable/src/main/java/com/example/benchmarks/data/Tiling.kt @@ -2,7 +2,9 @@ package com.example.benchmarks.data import com.tunjid.tiler.PivotRequest import com.tunjid.tiler.Tile +import com.tunjid.tiler.TiledList import com.tunjid.tiler.listTiler +import com.tunjid.tiler.queries import com.tunjid.tiler.toPivotedTileInputs import com.tunjid.tiler.toTiledList import kotlinx.coroutines.flow.Flow @@ -28,7 +30,7 @@ class TilingBenchmark( private val pagesToInvalidate: IntRange ) : Benchmarked { - private var lastInvalidatedPage: Int = pagesToInvalidate.first - 1 + private var lastInvalidatedPage: Int = pagesToInvalidate.first + 1 override suspend fun benchmark() { val offsetFlow = MutableSharedFlow() @@ -52,45 +54,48 @@ class TilingBenchmark( return@transformWhile true } + // Currently at the page scrolled to. If there's nothing to invalidate, complete if (pagesToInvalidate.isEmpty()) return@transformWhile false // ** Invalidation code ** // - // Outside the range, nothing to invalidate so terminate + // Outside the visible range, nothing to invalidate so terminate if (pagesToInvalidate.first > lastPage) return@transformWhile false if (pagesToInvalidate.last < firstPage) return@transformWhile false - // Final page invalidated, terminate - val invalidatedPage = latestItems.itemAtPage(lastPage) + println(latestItems.queries()) + // Find an item from the page that was invalidated + val invalidatedItem = latestItems.lastInvalidatedItem() - val isFinished = invalidatedPage != null - && invalidatedPage.lastInvalidatedPage >= pagesToInvalidate.last + val isFinished = invalidatedItem != null + && invalidatedItem.lastInvalidatedPage >= pagesToInvalidate.last emit(latestItems) !isFinished } .collect { // Invalidate - if (++lastInvalidatedPage <= pagesToInvalidate.last) { + val invalidatedItem = it.lastInvalidatedItem() + val canIncrementAndInvalidate = invalidatedItem == null + || invalidatedItem.lastInvalidatedPage == lastInvalidatedPage + + if (canIncrementAndInvalidate && ++lastInvalidatedPage <= pagesToInvalidate.last) { invalidationSignal.emit(lastInvalidatedPage) } } } -} -private fun List.itemAtPage(page: Int): Item? { - val startPage = pageFor(first()) - val endPage = pageFor(last()) - if (page !in startPage..endPage) return null - val diff = page - startPage - val index = diff * ITEMS_PER_PAGE - return get(index) + private fun TiledList.lastInvalidatedItem(): Item? { + for (item in this) { + if (item.lastInvalidatedPage == lastInvalidatedPage) return item + } + return null + } } private fun Flow.listTiler() = listTiler( limiter = Tile.Limiter( maxQueries = NUM_PAGES_IN_MEMORY, - itemSizeHint = ITEMS_PER_PAGE, ), order = Tile.Order.PivotSorted( query = 0, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f70541a..234e025 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ androidGradlePlugin = "8.0.2" androidxActivity = "1.8.2" androidxAppCompat = "1.6.1" -androidxBenchmark = "1.2.3" +androidxBenchmark = "1.2.4" androidxCore = "1.12.0" androidxCompose = "1.6.1" androidxComposeCompiler = "1.5.8" From b23fe9559af225a80ae665402d6270e8d0a05150 Mon Sep 17 00:00:00 2001 From: Adetunji Date: Sat, 20 Jul 2024 10:29:11 -0400 Subject: [PATCH 02/11] Bup to Compose 2.0 --- build-logic/convention/build.gradle.kts | 1 + .../kotlin/android-app-library-convention.kt | 7 ----- build.gradle.kts | 1 + gradle/libs.versions.toml | 31 ++++++++++--------- library/compose/build.gradle.kts | 1 + sample/android/build.gradle.kts | 1 + sample/browser/build.gradle.kts | 1 + sample/common/build.gradle.kts | 1 + sample/desktop/build.gradle.kts | 1 + settings.gradle.kts | 4 +-- 10 files changed, 25 insertions(+), 24 deletions(-) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index fda5679..9b70587 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -29,5 +29,6 @@ dependencies { implementation(libs.jetbrains.compose.gradlePlugin) implementation(libs.kotlin.gradlePlugin) implementation(libs.android.gradlePlugin) + implementation(libs.compose.compiler.plugin) implementation(libs.dokka.gradlePlugin) } diff --git a/build-logic/convention/src/main/kotlin/android-app-library-convention.kt b/build-logic/convention/src/main/kotlin/android-app-library-convention.kt index f35fc5e..4314b28 100644 --- a/build-logic/convention/src/main/kotlin/android-app-library-convention.kt +++ b/build-logic/convention/src/main/kotlin/android-app-library-convention.kt @@ -51,13 +51,6 @@ fun org.gradle.api.Project.androidConfiguration( buildFeatures { compose = true } - composeOptions { - val composeCompilerVersion = versionCatalog - .findVersion("androidxComposeCompiler") - .get() - .requiredVersion - kotlinCompilerExtensionVersion = composeCompilerVersion - } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 diff --git a/build.gradle.kts b/build.gradle.kts index bf8feb3..1d76bed 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,6 +39,7 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.androidx.benchmark) apply false + alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.jetbrains.compose) apply false alias(libs.plugins.jetbrains.dokka) apply false alias(libs.plugins.kotlin.android) apply false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 234e025..b198b0c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,24 +1,23 @@ [versions] androidGradlePlugin = "8.0.2" -androidxActivity = "1.8.2" -androidxAppCompat = "1.6.1" +androidxActivity = "1.9.0" +androidxAppCompat = "1.7.0" androidxBenchmark = "1.2.4" -androidxCore = "1.12.0" -androidxCompose = "1.6.1" -androidxComposeCompiler = "1.5.8" +androidxCore = "1.13.1" +androidxCompose = "1.6.7" androidxPaging = "3.2.1" -androidxTestCore = "1.5.0" -androidxTestExt = "1.1.5" -androidxTestRunner = "1.5.2" -androidxTestRules = "1.5.0" +androidxTestCore = "1.6.1" +androidxTestExt = "1.2.1" +androidxTestRunner = "1.6.1" +androidxTestRules = "1.6.1" dokka = "1.8.10" -jetbrainsCompose = "1.6.0-rc01" +jetbrainsCompose = "1.6.11" junit4 = "4.13.2" -kotlin = "1.9.22" -kotlinxCoroutines = "1.7.3" -googleMaterial = "1.11.0" -tunjidMutator = "0.0.9" -tunjidTreeNav = "0.0.6" +kotlin = "2.0.0" +kotlinxCoroutines = "1.9.0-RC" +googleMaterial = "1.12.0" +tunjidMutator = "1.1.0" +tunjidTreeNav = "0.0.7" turbine = "0.12.1" [libraries] @@ -45,6 +44,7 @@ androidx-test-junit = { group = "androidx.test.ext", name = "junit", version.ref androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidxTestRules" } androidx-test-runner = { group = "androidx.test", name = "runner", version.ref = "androidxTestRunner" } cashapp-turbine = { group = "app.cash.turbine", name = "turbine", version.ref = "turbine" } +compose-compiler-plugin = { group = "org.jetbrains.kotlin", name = "compose-compiler-gradle-plugin", version.ref = "kotlin" } google-material = { group = "com.google.android.material", name = "material", version.ref = "googleMaterial" } jetbrains-compose-animation = { group = "org.jetbrains.compose.animation", name = "animation", version.ref = "jetbrainsCompose" } jetbrains-compose-foundation = { group = "org.jetbrains.compose.foundation", name = "foundation", version.ref = "jetbrainsCompose" } @@ -74,6 +74,7 @@ tunjid-treenav-common = { group = "com.tunjid.treenav", name = "treenav", versio android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" } androidx-benchmark = { id = "androidx.benchmark", version.ref = "androidxBenchmark" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } diff --git a/library/compose/build.gradle.kts b/library/compose/build.gradle.kts index 789d643..7551db4 100644 --- a/library/compose/build.gradle.kts +++ b/library/compose/build.gradle.kts @@ -22,6 +22,7 @@ plugins { signing id("org.jetbrains.dokka") id("org.jetbrains.compose") + alias(libs.plugins.compose.compiler) } kotlin { diff --git a/sample/android/build.gradle.kts b/sample/android/build.gradle.kts index bb342a6..d1a9207 100644 --- a/sample/android/build.gradle.kts +++ b/sample/android/build.gradle.kts @@ -17,6 +17,7 @@ plugins { id("android-application-convention") id("kotlin-android") + alias(libs.plugins.compose.compiler) } android { diff --git a/sample/browser/build.gradle.kts b/sample/browser/build.gradle.kts index e32a3be..14d45b3 100755 --- a/sample/browser/build.gradle.kts +++ b/sample/browser/build.gradle.kts @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension plugins { kotlin("multiplatform") id("org.jetbrains.compose") + alias(libs.plugins.compose.compiler) } kotlin { diff --git a/sample/common/build.gradle.kts b/sample/common/build.gradle.kts index a924544..b49b6bb 100755 --- a/sample/common/build.gradle.kts +++ b/sample/common/build.gradle.kts @@ -18,6 +18,7 @@ plugins { id("android-library-convention") id("kotlin-library-convention") id("org.jetbrains.compose") + alias(libs.plugins.compose.compiler) } kotlin { diff --git a/sample/desktop/build.gradle.kts b/sample/desktop/build.gradle.kts index ba7d6ec..f55ff32 100755 --- a/sample/desktop/build.gradle.kts +++ b/sample/desktop/build.gradle.kts @@ -20,6 +20,7 @@ plugins { kotlin("multiplatform") // kotlin("jvm") doesn't work well in IDEA/AndroidStudio (https://github.com/JetBrains/compose-jb/issues/22) id("org.jetbrains.compose") id("kotlin-jvm-convention") + alias(libs.plugins.compose.compiler) } kotlin { diff --git a/settings.gradle.kts b/settings.gradle.kts index 7849467..7636e0a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,6 +39,6 @@ include( ":sample:android", ":sample:desktop", ":sample:browser", - ":benchmarks:benchmarkable", - ":benchmarks:microbenchmark", +// ":benchmarks:benchmarkable", +// ":benchmarks:microbenchmark", ) From 297a8fd6e26f17c0327edd3930a369b11c0891b2 Mon Sep 17 00:00:00 2001 From: Adetunji Date: Sat, 20 Jul 2024 10:45:30 -0400 Subject: [PATCH 03/11] Fix broken benchmark toolchain --- benchmarks/benchmarkable/build.gradle.kts | 2 +- benchmarks/microbenchmark/build.gradle.kts | 2 +- settings.gradle.kts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmarks/benchmarkable/build.gradle.kts b/benchmarks/benchmarkable/build.gradle.kts index 42f03a0..0a32a05 100644 --- a/benchmarks/benchmarkable/build.gradle.kts +++ b/benchmarks/benchmarkable/build.gradle.kts @@ -5,7 +5,7 @@ plugins { kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { namespace = "com.example.benchmarks" diff --git a/benchmarks/microbenchmark/build.gradle.kts b/benchmarks/microbenchmark/build.gradle.kts index a99eadc..e228630 100644 --- a/benchmarks/microbenchmark/build.gradle.kts +++ b/benchmarks/microbenchmark/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { namespace = "com.example.microbenchmark" diff --git a/settings.gradle.kts b/settings.gradle.kts index 7636e0a..7849467 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,6 +39,6 @@ include( ":sample:android", ":sample:desktop", ":sample:browser", -// ":benchmarks:benchmarkable", -// ":benchmarks:microbenchmark", + ":benchmarks:benchmarkable", + ":benchmarks:microbenchmark", ) From 5e1caa0b18076e477bb312a3082ed26aa38c0806 Mon Sep 17 00:00:00 2001 From: Adetunji Date: Sat, 20 Jul 2024 10:57:36 -0400 Subject: [PATCH 04/11] Bump agp --- .../src/main/kotlin/android-app-library-convention.kt | 2 +- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/android-app-library-convention.kt b/build-logic/convention/src/main/kotlin/android-app-library-convention.kt index 4314b28..cdbe676 100644 --- a/build-logic/convention/src/main/kotlin/android-app-library-convention.kt +++ b/build-logic/convention/src/main/kotlin/android-app-library-convention.kt @@ -39,7 +39,7 @@ import org.gradle.api.artifacts.VersionCatalogsExtension * Sets common values for Android Applications and Libraries */ fun org.gradle.api.Project.androidConfiguration( - extension: CommonExtension<*, *, *, *> + extension: CommonExtension<*, *, *, *, *, *> ) = extension.apply { namespace = "com.tunjid.tiler.${project.name}" compileSdk = 34 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b198b0c..fc081a8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -androidGradlePlugin = "8.0.2" +androidGradlePlugin = "8.5.1" androidxActivity = "1.9.0" androidxAppCompat = "1.7.0" androidxBenchmark = "1.2.4" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1a48bad..d990e30 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -16,7 +16,7 @@ #Mon Jul 05 07:23:39 EDT 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From 6d0c28331a94b0f49d385c6c04f83a526eae2f1f Mon Sep 17 00:00:00 2001 From: Adetunji Date: Sat, 20 Jul 2024 11:10:21 -0400 Subject: [PATCH 05/11] Bump to compose 1.7.0 --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fc081a8..c223513 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,14 +4,14 @@ androidxActivity = "1.9.0" androidxAppCompat = "1.7.0" androidxBenchmark = "1.2.4" androidxCore = "1.13.1" -androidxCompose = "1.6.7" +androidxCompose = "1.7.0-beta05" androidxPaging = "3.2.1" androidxTestCore = "1.6.1" androidxTestExt = "1.2.1" androidxTestRunner = "1.6.1" androidxTestRules = "1.6.1" dokka = "1.8.10" -jetbrainsCompose = "1.6.11" +jetbrainsCompose = "1.7.0-dev1731" junit4 = "4.13.2" kotlin = "2.0.0" kotlinxCoroutines = "1.9.0-RC" From e97138b3a62d364686fe5f902ff1ed66417d1473 Mon Sep 17 00:00:00 2001 From: Adetunji Date: Mon, 22 Jul 2024 11:51:45 -0400 Subject: [PATCH 06/11] Add iOS demo --- gradle.properties | 2 ++ library/compose/build.gradle.kts | 11 +++++++++++ library/tiler/build.gradle.kts | 13 +++++++++++-- .../kotlin/com/tunjid/tiler/TileKtTest.kt | 16 ++++++++-------- .../tunjid/tiler/TilingIterationOrderTest.kt | 2 +- .../com/tunjid/utilities/PivotingKtTest.kt | 2 +- sample/common/build.gradle.kts | 19 +++++++++++++++++++ sample/common/src/iosMain/kotlin/main.ios.kt | 9 +++++++++ settings.gradle.kts | 2 +- 9 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 sample/common/src/iosMain/kotlin/main.ios.kt diff --git a/gradle.properties b/gradle.properties index 0527e6b..6085be2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,3 +35,5 @@ android.useAndroidX=true kotlin.code.style=official org.jetbrains.compose.experimental.jscanvas.enabled=true kotlin.mpp.androidSourceSetLayoutVersion=2 +xcodeproj=~/sample/ios + diff --git a/library/compose/build.gradle.kts b/library/compose/build.gradle.kts index 7551db4..e2a2cfa 100644 --- a/library/compose/build.gradle.kts +++ b/library/compose/build.gradle.kts @@ -26,6 +26,7 @@ plugins { } kotlin { + applyDefaultHierarchyTemplate() js(IR) { nodejs() browser() @@ -36,6 +37,16 @@ kotlin { useJUnit() } } + listOf( + iosX64(), + iosArm64(), + iosSimulatorArm64(), + ).forEach { iosTarget -> + iosTarget.binaries.framework { + baseName = "tiler-compose" + isStatic = true + } + } sourceSets { commonMain { diff --git a/library/tiler/build.gradle.kts b/library/tiler/build.gradle.kts index 920db78..edf8774 100644 --- a/library/tiler/build.gradle.kts +++ b/library/tiler/build.gradle.kts @@ -24,6 +24,7 @@ plugins { } kotlin { + applyDefaultHierarchyTemplate() js(IR) { nodejs() browser() @@ -34,8 +35,16 @@ kotlin { useJUnit() } } - applyDefaultHierarchyTemplate() - iosSimulatorArm64() + listOf( + iosX64(), + iosArm64(), + iosSimulatorArm64(), + ).forEach { iosTarget -> + iosTarget.binaries.framework { + baseName = "tiler" + isStatic = true + } + } linuxX64() macosX64() macosArm64() diff --git a/library/tiler/src/commonTest/kotlin/com/tunjid/tiler/TileKtTest.kt b/library/tiler/src/commonTest/kotlin/com/tunjid/tiler/TileKtTest.kt index b247b8a..d37f169 100644 --- a/library/tiler/src/commonTest/kotlin/com/tunjid/tiler/TileKtTest.kt +++ b/library/tiler/src/commonTest/kotlin/com/tunjid/tiler/TileKtTest.kt @@ -248,7 +248,7 @@ class TileKtTest { ) // Reverse sort by page - requests.emit(Tile.Order.Sorted(comparator = Comparator(Int::compareTo).reversed())) + requests.emit(Tile.Order.Sorted(comparator = Comparator(Int::compareTo).reversed())) assertEquals( expected = 8.tiledTestRange() + 3.tiledTestRange() + 1.tiledTestRange(), actual = awaitItem() @@ -279,7 +279,7 @@ class TileKtTest { ) // Sort ascending - requests.emit(Tile.Order.Sorted(comparator = Comparator(Int::compareTo))) + requests.emit(Tile.Order.Sorted(comparator = Comparator(Int::compareTo))) assertEquals( expected = 1.tiledTestRange() + 3.tiledTestRange() + 8.tiledTestRange(), actual = awaitItem() @@ -296,7 +296,7 @@ class TileKtTest { requests.emit( Tile.Order.PivotSorted( query = 4, - comparator = Comparator(Int::compareTo) + comparator = Comparator(Int::compareTo) ) ) assertEquals( @@ -305,7 +305,7 @@ class TileKtTest { ) // Sort ascending in absolute terms - requests.emit(Tile.Order.Sorted(comparator = Comparator(Int::compareTo))) + requests.emit(Tile.Order.Sorted(comparator = Comparator(Int::compareTo))) assertEquals( 1.tiledTestRange() + 3.tiledTestRange() + 4.tiledTestRange(), awaitItem() @@ -414,7 +414,7 @@ class TileKtTest { @Test fun pivoting_pipeline_should_only_emit_when_data_is_available_from_pivot_query() = runTest { - val comparator = Comparator(Int::compareTo) + val comparator = Comparator(Int::compareTo) val tiler = listTiler( order = Tile.Order.PivotSorted( query = 0, @@ -481,7 +481,7 @@ class TileKtTest { ) // Reverse sort by page - requests.emit(Tile.Order.Sorted(comparator = Comparator(Int::compareTo).reversed())) + requests.emit(Tile.Order.Sorted(comparator = Comparator(Int::compareTo).reversed())) assertEquals( expected = 3.tiledTestRange() + 2.tiledTestRange(), actual = awaitItem() @@ -491,7 +491,7 @@ class TileKtTest { requests.emit( Tile.Order.PivotSorted( query = 2, - comparator = Comparator(Int::compareTo) + comparator = Comparator(Int::compareTo) ) ) assertEquals( @@ -503,7 +503,7 @@ class TileKtTest { requests.emit( Tile.Order.PivotSorted( query = 2, - comparator = Comparator(Int::compareTo).reversed() + comparator = Comparator(Int::compareTo).reversed() ) ) assertEquals( diff --git a/library/tiler/src/commonTest/kotlin/com/tunjid/tiler/TilingIterationOrderTest.kt b/library/tiler/src/commonTest/kotlin/com/tunjid/tiler/TilingIterationOrderTest.kt index 4747e71..1059b64 100644 --- a/library/tiler/src/commonTest/kotlin/com/tunjid/tiler/TilingIterationOrderTest.kt +++ b/library/tiler/src/commonTest/kotlin/com/tunjid/tiler/TilingIterationOrderTest.kt @@ -213,7 +213,7 @@ class ListMapTilingSamenessTest { val range = (0..15) (1..10).forEach { itemsPerPage -> (3..10).forEach { numPages -> - val comparator = Comparator(Int::compareTo) + val comparator = Comparator(Int::compareTo) val pivotRequest: PivotRequest = PivotRequest( onCount = numPages, offCount = 0, diff --git a/library/tiler/src/commonTest/kotlin/com/tunjid/utilities/PivotingKtTest.kt b/library/tiler/src/commonTest/kotlin/com/tunjid/utilities/PivotingKtTest.kt index 0c9f8ef..1e7c313 100644 --- a/library/tiler/src/commonTest/kotlin/com/tunjid/utilities/PivotingKtTest.kt +++ b/library/tiler/src/commonTest/kotlin/com/tunjid/utilities/PivotingKtTest.kt @@ -37,7 +37,7 @@ import kotlin.test.assertEquals class PivotingKtTest { - private val comparator: Comparator = Comparator(Int::compareTo) + private val comparator: Comparator = Comparator(Int::compareTo) private val pivotRequest: PivotRequest = PivotRequest( onCount = 3, diff --git a/sample/common/build.gradle.kts b/sample/common/build.gradle.kts index b49b6bb..804f216 100755 --- a/sample/common/build.gradle.kts +++ b/sample/common/build.gradle.kts @@ -22,6 +22,16 @@ plugins { } kotlin { + listOf( + iosX64(), + iosArm64(), + iosSimulatorArm64(), + ).forEach { iosTarget -> + iosTarget.binaries.framework { + baseName = "common" + isStatic = true + } + } sourceSets { named("commonMain") { dependencies { @@ -46,6 +56,15 @@ kotlin { implementation(libs.androidx.compose.foundation.layout) } } + val iosX64Main by getting + val iosArm64Main by getting + val iosSimulatorArm64Main by getting + val iosMain by creating { + dependsOn(named("commonMain").get()) + iosX64Main.dependsOn(this) + iosArm64Main.dependsOn(this) + iosSimulatorArm64Main.dependsOn(this) + } val jsMain by getting { dependencies { } diff --git a/sample/common/src/iosMain/kotlin/main.ios.kt b/sample/common/src/iosMain/kotlin/main.ios.kt new file mode 100644 index 0000000..cc47d8f --- /dev/null +++ b/sample/common/src/iosMain/kotlin/main.ios.kt @@ -0,0 +1,9 @@ +import androidx.compose.ui.window.ComposeUIViewController +import com.tunjid.demo.common.ui.AppTheme +import com.tunjid.demo.common.ui.Root + +fun MainViewController() = ComposeUIViewController { + AppTheme { + Root() + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 7849467..788bc88 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -38,7 +38,7 @@ include( ":sample:common", ":sample:android", ":sample:desktop", - ":sample:browser", +// ":sample:browser", ":benchmarks:benchmarkable", ":benchmarks:microbenchmark", ) From 9d02f14dae4dd9792e08f4017d4fbd2a92fc3123 Mon Sep 17 00:00:00 2001 From: Adetunji Date: Tue, 30 Jul 2024 08:56:07 -0400 Subject: [PATCH 07/11] Add working iOS demo --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c223513..0143d71 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] androidGradlePlugin = "8.5.1" -androidxActivity = "1.9.0" +androidxActivity = "1.9.1" androidxAppCompat = "1.7.0" androidxBenchmark = "1.2.4" androidxCore = "1.13.1" @@ -11,7 +11,7 @@ androidxTestExt = "1.2.1" androidxTestRunner = "1.6.1" androidxTestRules = "1.6.1" dokka = "1.8.10" -jetbrainsCompose = "1.7.0-dev1731" +jetbrainsCompose = "1.7.0-alpha02" junit4 = "4.13.2" kotlin = "2.0.0" kotlinxCoroutines = "1.9.0-RC" From 3ca2303bceb55ca4fb1970db0109c387e9f9946b Mon Sep 17 00:00:00 2001 From: Adetunji Dahunsi Date: Sat, 10 Aug 2024 11:21:21 -0400 Subject: [PATCH 08/11] Add ios app files --- sample/ios/tiler.xcodeproj/project.pbxproj | 370 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 26839 bytes .../xcschemes/xcschememanagement.plist | 14 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + .../ios/tiler/Assets.xcassets/Contents.json | 6 + sample/ios/tiler/ContentView.swift | 33 ++ .../Preview Assets.xcassets/Contents.json | 6 + sample/ios/tiler/tilerApp.swift | 17 + 11 files changed, 485 insertions(+) create mode 100644 sample/ios/tiler.xcodeproj/project.pbxproj create mode 100644 sample/ios/tiler.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 sample/ios/tiler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 sample/ios/tiler.xcodeproj/project.xcworkspace/xcuserdata/adetunji_dahunsi.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 sample/ios/tiler.xcodeproj/xcuserdata/adetunji_dahunsi.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 sample/ios/tiler/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 sample/ios/tiler/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 sample/ios/tiler/Assets.xcassets/Contents.json create mode 100644 sample/ios/tiler/ContentView.swift create mode 100644 sample/ios/tiler/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 sample/ios/tiler/tilerApp.swift diff --git a/sample/ios/tiler.xcodeproj/project.pbxproj b/sample/ios/tiler.xcodeproj/project.pbxproj new file mode 100644 index 0000000..4233c18 --- /dev/null +++ b/sample/ios/tiler.xcodeproj/project.pbxproj @@ -0,0 +1,370 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + C3D0F75E2C66C3FD001B0457 /* tilerApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D0F75D2C66C3FD001B0457 /* tilerApp.swift */; }; + C3D0F7602C66C3FD001B0457 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D0F75F2C66C3FD001B0457 /* ContentView.swift */; }; + C3D0F7622C66C3FF001B0457 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D0F7612C66C3FF001B0457 /* Assets.xcassets */; }; + C3D0F7652C66C3FF001B0457 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D0F7642C66C3FF001B0457 /* Preview Assets.xcassets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + C3D0F75A2C66C3FD001B0457 /* tiler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tiler.app; sourceTree = BUILT_PRODUCTS_DIR; }; + C3D0F75D2C66C3FD001B0457 /* tilerApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = tilerApp.swift; sourceTree = ""; }; + C3D0F75F2C66C3FD001B0457 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + C3D0F7612C66C3FF001B0457 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + C3D0F7642C66C3FF001B0457 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C3D0F7572C66C3FD001B0457 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C3D0F7512C66C3FD001B0457 = { + isa = PBXGroup; + children = ( + C3D0F75C2C66C3FD001B0457 /* tiler */, + C3D0F75B2C66C3FD001B0457 /* Products */, + ); + sourceTree = ""; + }; + C3D0F75B2C66C3FD001B0457 /* Products */ = { + isa = PBXGroup; + children = ( + C3D0F75A2C66C3FD001B0457 /* tiler.app */, + ); + name = Products; + sourceTree = ""; + }; + C3D0F75C2C66C3FD001B0457 /* tiler */ = { + isa = PBXGroup; + children = ( + C3D0F75D2C66C3FD001B0457 /* tilerApp.swift */, + C3D0F75F2C66C3FD001B0457 /* ContentView.swift */, + C3D0F7612C66C3FF001B0457 /* Assets.xcassets */, + C3D0F7632C66C3FF001B0457 /* Preview Content */, + ); + path = tiler; + sourceTree = ""; + }; + C3D0F7632C66C3FF001B0457 /* Preview Content */ = { + isa = PBXGroup; + children = ( + C3D0F7642C66C3FF001B0457 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + C3D0F7592C66C3FD001B0457 /* tiler */ = { + isa = PBXNativeTarget; + buildConfigurationList = C3D0F7682C66C3FF001B0457 /* Build configuration list for PBXNativeTarget "tiler" */; + buildPhases = ( + C3D0F76B2C66C8C0001B0457 /* ShellScript */, + C3D0F7562C66C3FD001B0457 /* Sources */, + C3D0F7572C66C3FD001B0457 /* Frameworks */, + C3D0F7582C66C3FD001B0457 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = tiler; + productName = tiler; + productReference = C3D0F75A2C66C3FD001B0457 /* tiler.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C3D0F7522C66C3FD001B0457 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1540; + LastUpgradeCheck = 1540; + TargetAttributes = { + C3D0F7592C66C3FD001B0457 = { + CreatedOnToolsVersion = 15.4; + }; + }; + }; + buildConfigurationList = C3D0F7552C66C3FD001B0457 /* Build configuration list for PBXProject "tiler" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = C3D0F7512C66C3FD001B0457; + productRefGroup = C3D0F75B2C66C3FD001B0457 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C3D0F7592C66C3FD001B0457 /* tiler */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + C3D0F7582C66C3FD001B0457 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C3D0F7652C66C3FF001B0457 /* Preview Assets.xcassets in Resources */, + C3D0F7622C66C3FF001B0457 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + C3D0F76B2C66C8C0001B0457 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd \"$SRCROOT/../..\"\n./gradlew :sample:common:embedAndSignAppleFrameworkForXcode\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C3D0F7562C66C3FD001B0457 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C3D0F7602C66C3FD001B0457 /* ContentView.swift in Sources */, + C3D0F75E2C66C3FD001B0457 /* tilerApp.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + C3D0F7662C66C3FF001B0457 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + C3D0F7672C66C3FF001B0457 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C3D0F7692C66C3FF001B0457 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"tiler/Preview Content\""; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.tunjid.tiler; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C3D0F76A2C66C3FF001B0457 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"tiler/Preview Content\""; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.tunjid.tiler; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C3D0F7552C66C3FD001B0457 /* Build configuration list for PBXProject "tiler" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C3D0F7662C66C3FF001B0457 /* Debug */, + C3D0F7672C66C3FF001B0457 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C3D0F7682C66C3FF001B0457 /* Build configuration list for PBXNativeTarget "tiler" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C3D0F7692C66C3FF001B0457 /* Debug */, + C3D0F76A2C66C3FF001B0457 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C3D0F7522C66C3FD001B0457 /* Project object */; +} diff --git a/sample/ios/tiler.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/sample/ios/tiler.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/sample/ios/tiler.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/sample/ios/tiler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/sample/ios/tiler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/sample/ios/tiler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/sample/ios/tiler.xcodeproj/project.xcworkspace/xcuserdata/adetunji_dahunsi.xcuserdatad/UserInterfaceState.xcuserstate b/sample/ios/tiler.xcodeproj/project.xcworkspace/xcuserdata/adetunji_dahunsi.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..00da47c0478d87102f9e9fdaafbb3d072f4b46f4 GIT binary patch literal 26839 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 literal 0 HcmV?d00001 diff --git a/sample/ios/tiler.xcodeproj/xcuserdata/adetunji_dahunsi.xcuserdatad/xcschemes/xcschememanagement.plist b/sample/ios/tiler.xcodeproj/xcuserdata/adetunji_dahunsi.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..c8dfb5f --- /dev/null +++ b/sample/ios/tiler.xcodeproj/xcuserdata/adetunji_dahunsi.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + tiler.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/sample/ios/tiler/Assets.xcassets/AccentColor.colorset/Contents.json b/sample/ios/tiler/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/sample/ios/tiler/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/sample/ios/tiler/Assets.xcassets/AppIcon.appiconset/Contents.json b/sample/ios/tiler/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/sample/ios/tiler/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/sample/ios/tiler/Assets.xcassets/Contents.json b/sample/ios/tiler/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/sample/ios/tiler/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/sample/ios/tiler/ContentView.swift b/sample/ios/tiler/ContentView.swift new file mode 100644 index 0000000..376e5c7 --- /dev/null +++ b/sample/ios/tiler/ContentView.swift @@ -0,0 +1,33 @@ +// +// ContentView.swift +// tiler +// +// Created by adetunji_dahunsi on 8/9/24. +// +import common +import SwiftUI + +struct ContentView: View { + var body: some View { + VStack { + ComposeView() + // Compose has own keyboard handler + .ignoresSafeArea(edges: .bottom) + } + } +} + +struct ComposeView: UIViewControllerRepresentable { + func makeUIViewController(context: Context) -> UIViewController { + let controller = Main_iosKt.MainViewController() + controller.overrideUserInterfaceStyle = .light + return controller + } + + func updateUIViewController(_ uiViewController: UIViewController, context: Context) { + } +} + +#Preview { + ContentView() +} diff --git a/sample/ios/tiler/Preview Content/Preview Assets.xcassets/Contents.json b/sample/ios/tiler/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/sample/ios/tiler/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/sample/ios/tiler/tilerApp.swift b/sample/ios/tiler/tilerApp.swift new file mode 100644 index 0000000..7584b89 --- /dev/null +++ b/sample/ios/tiler/tilerApp.swift @@ -0,0 +1,17 @@ +// +// tilerApp.swift +// tiler +// +// Created by adetunji_dahunsi on 8/9/24. +// + +import SwiftUI + +@main +struct tilerApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} From 8c0cab933ca01505485d4b310e772c12af498adc Mon Sep 17 00:00:00 2001 From: Adetunji Dahunsi Date: Sun, 8 Sep 2024 19:28:03 -0500 Subject: [PATCH 09/11] Bump to compose multiplatform 1.7 beta01 --- docs/assets/logo.png | Bin 24306 -> 69586 bytes gradle/libs.versions.toml | 18 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 26839 -> 28307 bytes 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/assets/logo.png b/docs/assets/logo.png index b3a7725efd540719e164f6d0758c67b23eb7b228..76a2ce47d53bf4714edccf5eb18fc365e7de8cde 100644 GIT binary patch literal 69586 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 a8Q}Z#P|=;ydHEXnZ`L&1sb?p9M*JU5h8B4M literal 24306 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 HA^g7pKW=^j diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0143d71..5a339e4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,24 +1,24 @@ [versions] -androidGradlePlugin = "8.5.1" -androidxActivity = "1.9.1" +androidGradlePlugin = "8.5.2" +androidxActivity = "1.9.2" androidxAppCompat = "1.7.0" androidxBenchmark = "1.2.4" androidxCore = "1.13.1" -androidxCompose = "1.7.0-beta05" -androidxPaging = "3.2.1" +androidxCompose = "1.7.0" +androidxPaging = "3.3.2" androidxTestCore = "1.6.1" androidxTestExt = "1.2.1" -androidxTestRunner = "1.6.1" +androidxTestRunner = "1.6.2" androidxTestRules = "1.6.1" -dokka = "1.8.10" -jetbrainsCompose = "1.7.0-alpha02" +dokka = "1.8.20" +jetbrainsCompose = "1.7.0-beta01" junit4 = "4.13.2" -kotlin = "2.0.0" +kotlin = "2.0.20" kotlinxCoroutines = "1.9.0-RC" googleMaterial = "1.12.0" tunjidMutator = "1.1.0" tunjidTreeNav = "0.0.7" -turbine = "0.12.1" +turbine = "1.0.0" [libraries] android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" } diff --git a/sample/ios/tiler.xcodeproj/project.xcworkspace/xcuserdata/adetunji_dahunsi.xcuserdatad/UserInterfaceState.xcuserstate b/sample/ios/tiler.xcodeproj/project.xcworkspace/xcuserdata/adetunji_dahunsi.xcuserdatad/UserInterfaceState.xcuserstate index 00da47c0478d87102f9e9fdaafbb3d072f4b46f4..fc1cab4a415a76b775527c18997b589d5e4e846e 100644 GIT binary patch delta 13502 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 Date: Wed, 16 Oct 2024 09:14:10 -0400 Subject: [PATCH 10/11] Version bump libraries --- gradle/libs.versions.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5a339e4..918e895 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -androidGradlePlugin = "8.5.2" +androidGradlePlugin = "8.6.1" androidxActivity = "1.9.2" androidxAppCompat = "1.7.0" androidxBenchmark = "1.2.4" @@ -11,14 +11,14 @@ androidxTestExt = "1.2.1" androidxTestRunner = "1.6.2" androidxTestRules = "1.6.1" dokka = "1.8.20" -jetbrainsCompose = "1.7.0-beta01" +jetbrainsCompose = "1.7.0-rc01" junit4 = "4.13.2" -kotlin = "2.0.20" -kotlinxCoroutines = "1.9.0-RC" +kotlin = "2.0.21" +kotlinxCoroutines = "1.9.0" googleMaterial = "1.12.0" tunjidMutator = "1.1.0" -tunjidTreeNav = "0.0.7" -turbine = "1.0.0" +tunjidTreeNav = "0.0.8" +turbine = "1.1.0" [libraries] android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" } From f310d17d634919eedaabd3067e5af549e0301cb7 Mon Sep 17 00:00:00 2001 From: Adetunji Dahunsi Date: Wed, 16 Oct 2024 09:37:51 -0400 Subject: [PATCH 11/11] First stable release --- libraryVersion.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraryVersion.properties b/libraryVersion.properties index 2c67e15..4a3eb15 100644 --- a/libraryVersion.properties +++ b/libraryVersion.properties @@ -15,5 +15,5 @@ # groupId=com.tunjid.tiler -tiler_version=1.1.0-rc02 -compose_version=1.1.0-rc02 +tiler_version=1.1.0 +compose_version=1.1.0