From 6b07f6105c53a23fe70a22565aa3e682b2ef9688 Mon Sep 17 00:00:00 2001 From: Shreyash Kore Date: Sun, 11 Aug 2024 22:44:35 +0530 Subject: [PATCH 1/5] migrate to KMP --- .idea/kotlinc.xml | 2 +- app/.gitignore | 1 - app/build.gradle | 69 --- app/proguard-rules.pro | 21 - .../jsontreedemo/MainActivity.kt | 208 -------- app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 0 bytes app/src/main/res/values/colors.xml | 10 - app/src/main/res/values/strings.xml | 3 - app/src/main/res/values/themes.xml | 7 - build.gradle | 63 --- build.gradle.kts | 76 +++ gradle/libs.versions.toml | 46 +- jsontree/build.gradle | 41 -- jsontree/build.gradle.kts | 108 ++++ jsontree/proguard-rules.pro | 2 +- .../jsontree/JsonTreeTest.kt | 455 ----------------- .../drawable/jsontree_arrow_right.xml | 2 +- .../composeResources}/values/plurals.xml | 4 +- .../jsontree/AnnotatedText.kt | 6 +- .../jsontree/CollapsableType.kt | 0 .../sebastianneubauer/jsontree/JsonTree.kt | 6 +- .../jsontree/JsonTreeElement.kt | 0 .../jsontree/JsonTreeParser.kt | 15 +- .../jsontree/JsonTreeParserState.kt | 0 .../sebastianneubauer/jsontree/TreeColors.kt | 0 .../sebastianneubauer/jsontree/TreeState.kt | 0 .../jsontree/JsonTreeParserTest.kt | 300 +++++------ .../sebastianneubauer/jsontree/TestData.kt | 16 + .../jsontree/ui}/Assertions.kt | 13 +- .../jsontree/ui/JsonTreeTest.kt | 470 ++++++++++++++++++ .../sebastianneubauer/jsontree/TestData.kt | 31 -- sample/build.gradle.kts | 107 ++++ sample/compose-desktop.pro | 1 + .../src/androidMain}/AndroidManifest.xml | 11 +- .../jsontreesample/MainActivity.kt | 14 + .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 2 +- .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes sample/src/androidMain/res/values/strings.xml | 3 + .../composeResources/drawable/ic_cyclone.xml | 12 + .../drawable/ic_dark_mode.xml | 9 + .../drawable/ic_light_mode.xml | 9 + .../drawable/ic_rotate_right.xml | 10 + .../composeResources/values/strings.xml | 2 + sample/src/commonMain/kotlin/App.kt | 199 ++++++++ .../src/commonMain/kotlin}/JsonStrings.kt | 2 +- .../src/commonMain/kotlin}/ui/theme/Color.kt | 2 +- .../src/commonMain/kotlin}/ui/theme/Shape.kt | 2 +- .../src/commonMain/kotlin}/ui/theme/Theme.kt | 2 +- .../src/commonMain/kotlin}/ui/theme/Type.kt | 2 +- sample/src/iosMain/kotlin/main.kt | 5 + sample/src/jvmMain/kotlin/main.kt | 17 + settings.gradle => settings.gradle.kts | 4 +- 73 files changed, 1286 insertions(+), 1104 deletions(-) delete mode 100644 app/.gitignore delete mode 100644 app/build.gradle delete mode 100644 app/proguard-rules.pro delete mode 100644 app/src/main/java/com/sebastianneubauer/jsontreedemo/MainActivity.kt delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/values/colors.xml delete mode 100644 app/src/main/res/values/strings.xml delete mode 100644 app/src/main/res/values/themes.xml delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 jsontree/build.gradle create mode 100644 jsontree/build.gradle.kts delete mode 100644 jsontree/src/androidTest/java/com/sebastianneubauer/jsontree/JsonTreeTest.kt rename jsontree/src/{main/res => commonMain/composeResources}/drawable/jsontree_arrow_right.xml (71%) rename jsontree/src/{main/res => commonMain/composeResources}/values/plurals.xml (51%) rename jsontree/src/{main/java => commonMain/kotlin}/com/sebastianneubauer/jsontree/AnnotatedText.kt (93%) rename jsontree/src/{main/java => commonMain/kotlin}/com/sebastianneubauer/jsontree/CollapsableType.kt (100%) rename jsontree/src/{main/java => commonMain/kotlin}/com/sebastianneubauer/jsontree/JsonTree.kt (97%) rename jsontree/src/{main/java => commonMain/kotlin}/com/sebastianneubauer/jsontree/JsonTreeElement.kt (100%) rename jsontree/src/{main/java => commonMain/kotlin}/com/sebastianneubauer/jsontree/JsonTreeParser.kt (96%) rename jsontree/src/{main/java => commonMain/kotlin}/com/sebastianneubauer/jsontree/JsonTreeParserState.kt (100%) rename jsontree/src/{main/java => commonMain/kotlin}/com/sebastianneubauer/jsontree/TreeColors.kt (100%) rename jsontree/src/{main/java => commonMain/kotlin}/com/sebastianneubauer/jsontree/TreeState.kt (100%) rename jsontree/src/{test/java => commonTest/kotlin}/com/sebastianneubauer/jsontree/JsonTreeParserTest.kt (76%) rename jsontree/src/{androidTest/java => commonTest/kotlin}/com/sebastianneubauer/jsontree/TestData.kt (81%) rename jsontree/src/{androidTest/java/com/sebastianneubauer/jsontree => commonTest/kotlin/com/sebastianneubauer/jsontree/ui}/Assertions.kt (52%) create mode 100644 jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/ui/JsonTreeTest.kt delete mode 100644 jsontree/src/test/java/com/sebastianneubauer/jsontree/TestData.kt create mode 100644 sample/build.gradle.kts create mode 100644 sample/compose-desktop.pro rename {app/src/main => sample/src/androidMain}/AndroidManifest.xml (62%) create mode 100644 sample/src/androidMain/kotlin/com/sebastianneubauer/jsontreesample/MainActivity.kt rename {app/src/main => sample/src/androidMain}/res/drawable-v24/ic_launcher_foreground.xml (100%) rename {app/src/main => sample/src/androidMain}/res/drawable/ic_launcher_background.xml (99%) rename {app/src/main => sample/src/androidMain}/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {app/src/main => sample/src/androidMain}/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) create mode 100644 sample/src/androidMain/res/mipmap-hdpi/ic_launcher.png create mode 100644 sample/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 sample/src/androidMain/res/mipmap-mdpi/ic_launcher.png create mode 100644 sample/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 sample/src/androidMain/res/mipmap-xhdpi/ic_launcher.png create mode 100644 sample/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 sample/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 sample/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 sample/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 sample/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 sample/src/androidMain/res/values/strings.xml create mode 100644 sample/src/commonMain/composeResources/drawable/ic_cyclone.xml create mode 100644 sample/src/commonMain/composeResources/drawable/ic_dark_mode.xml create mode 100644 sample/src/commonMain/composeResources/drawable/ic_light_mode.xml create mode 100644 sample/src/commonMain/composeResources/drawable/ic_rotate_right.xml create mode 100644 sample/src/commonMain/composeResources/values/strings.xml create mode 100644 sample/src/commonMain/kotlin/App.kt rename {app/src/main/java/com/sebastianneubauer/jsontreedemo => sample/src/commonMain/kotlin}/JsonStrings.kt (99%) rename {app/src/main/java/com/sebastianneubauer/jsontreedemo => sample/src/commonMain/kotlin}/ui/theme/Color.kt (79%) rename {app/src/main/java/com/sebastianneubauer/jsontreedemo => sample/src/commonMain/kotlin}/ui/theme/Shape.kt (83%) rename {app/src/main/java/com/sebastianneubauer/jsontreedemo => sample/src/commonMain/kotlin}/ui/theme/Theme.kt (95%) rename {app/src/main/java/com/sebastianneubauer/jsontreedemo => sample/src/commonMain/kotlin}/ui/theme/Type.kt (93%) create mode 100644 sample/src/iosMain/kotlin/main.kt create mode 100644 sample/src/jvmMain/kotlin/main.kt rename settings.gradle => settings.gradle.kts (88%) diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index fe63bb6..6d0ee1c 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 8c1fb25..0000000 --- a/app/build.gradle +++ /dev/null @@ -1,69 +0,0 @@ -plugins { - alias libs.plugins.android.application - alias libs.plugins.kotlin.android - alias(libs.plugins.compose.compiler) -} - -android { - namespace="com.sebastianneubauer.jsontreedemo" - compileSdk libs.versions.android.target.get().toInteger() - - defaultConfig { - applicationId "com.sebastianneubauer.jsontreedemo" - minSdk libs.versions.android.min.get().toInteger() - targetSdk libs.versions.android.target.get().toInteger() - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { - useSupportLibrary true - } - } - - signingConfigs { - debug {} - } - - buildTypes { - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - //for testing only, don't do this in your app - signingConfig signingConfigs.debug - } - debug { - applicationIdSuffix ".debug" - signingConfig signingConfigs.debug - } - } - buildFeatures { - compose true - } - packagingOptions { - resources { - excludes += '/META-INF/{AL2.0,LGPL2.1}' - } - } -} - -composeCompiler { - enableStrongSkippingMode = true -} - -kotlin { - jvmToolchain { - languageVersion.set(JavaLanguageVersion.of(libs.versions.java.toolchain.get())) - } -} - -dependencies { - implementation platform(libs.androidx.compose.bom) - implementation libs.androidx.activity.compose - implementation libs.androidx.compose.ui - implementation libs.androidx.compose.material - implementation libs.androidx.compose.ui.tooling - implementation libs.androidx.compose.ui.tooling.preview - - implementation project(":jsontree") -} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/main/java/com/sebastianneubauer/jsontreedemo/MainActivity.kt b/app/src/main/java/com/sebastianneubauer/jsontreedemo/MainActivity.kt deleted file mode 100644 index 42a5e8f..0000000 --- a/app/src/main/java/com/sebastianneubauer/jsontreedemo/MainActivity.kt +++ /dev/null @@ -1,208 +0,0 @@ -package com.sebastianneubauer.jsontreedemo - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.background -import androidx.compose.foundation.horizontalScroll -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ExperimentalLayoutApi -import androidx.compose.foundation.layout.FlowRow -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.pager.HorizontalPager -import androidx.compose.foundation.pager.rememberPagerState -import androidx.compose.foundation.rememberScrollState -import androidx.compose.material3.Button -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import com.sebastianneubauer.jsontree.TreeColors -import com.sebastianneubauer.jsontree.JsonTree -import com.sebastianneubauer.jsontree.TreeState -import com.sebastianneubauer.jsontree.defaultDarkColors -import com.sebastianneubauer.jsontree.defaultLightColors -import com.sebastianneubauer.jsontreedemo.ui.theme.JsonTreeTheme -import java.lang.IllegalStateException - -internal class MainActivity : ComponentActivity() { - - @OptIn(ExperimentalFoundationApi::class, ExperimentalLayoutApi::class) - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - setContent { - JsonTreeTheme { - Column( - modifier = Modifier.fillMaxSize() - ) { - var errorMessage: String? by remember { mutableStateOf(null) } - var json: String by remember { mutableStateOf(simpleJson) } - var colors: TreeColors by remember { mutableStateOf(defaultLightColors) } - var initialState: TreeState by remember { mutableStateOf(TreeState.FIRST_ITEM_EXPANDED) } - var showIndices: Boolean by remember { mutableStateOf(true) } - var showItemCount: Boolean by remember { mutableStateOf(true) } - var expandSingleChildren: Boolean by remember { mutableStateOf(true) } - - Spacer(modifier = Modifier.height(16.dp)) - - Text( - modifier = Modifier.padding(horizontal = 16.dp), - text = "🌳 JsonTree", - style = MaterialTheme.typography.headlineMedium, - color = Color.Black - ) - - Spacer(modifier = Modifier.height(48.dp)) - - FlowRow { - Button( - modifier = Modifier.padding(horizontal = 8.dp), - onClick = { - errorMessage = null - json = when (json) { - emptyJson -> simpleJson - simpleJson -> complexJson - complexJson -> invalidJson - invalidJson -> emptyJson - else -> throw IllegalStateException("No JSON selected!") - } - } - ) { - Text( - text = when (json) { - simpleJson -> "Simple Json" - emptyJson -> "Empty Json" - complexJson -> "Complex Json" - invalidJson -> "Invalid Json" - else -> throw IllegalStateException("No JSON selected!") - } - ) - } - - Button( - modifier = Modifier.padding(horizontal = 8.dp), - onClick = { - val newState = when(initialState) { - TreeState.EXPANDED -> TreeState.COLLAPSED - TreeState.COLLAPSED -> TreeState.FIRST_ITEM_EXPANDED - TreeState.FIRST_ITEM_EXPANDED -> TreeState.EXPANDED - } - initialState = newState - } - ) { - Text(text = initialState.name) - } - - Button( - modifier = Modifier.padding(horizontal = 8.dp), - onClick = { showIndices = !showIndices } - ) { - Text(text = if(showIndices) "Hide indices" else "Show indices") - } - - Button( - modifier = Modifier.padding(horizontal = 8.dp), - onClick = { showItemCount = !showItemCount } - ) { - Text(text = if(showItemCount) "Hide item count" else "Show item count") - } - - Button( - modifier = Modifier.padding(horizontal = 8.dp), - onClick = { - colors = if(colors == defaultLightColors) defaultDarkColors else defaultLightColors - } - ) { - Text(text = if(colors == defaultLightColors) "Light" else "Dark") - } - - Button( - modifier = Modifier.padding(horizontal = 8.dp), - onClick = { expandSingleChildren = !expandSingleChildren } - ) { - Text(text = if(expandSingleChildren) "Expand children" else "Don't expand children") - } - } - - val pagerState = rememberPagerState( - initialPage = 0, - pageCount = { 3 } - ) - - //Pager to test leaving composition - HorizontalPager( - modifier = Modifier - .fillMaxWidth() - .weight(1F), - state = pagerState, - verticalAlignment = Alignment.Top - ) { pageIndex -> - when (pageIndex) { - 0 -> { - val error = errorMessage - if(error!= null) { - Text( - text = error, - color = Color.Black - ) - } else { - JsonTree( - modifier = Modifier - .fillMaxSize() - .horizontalScroll(rememberScrollState()) - .background( - if (colors == defaultLightColors) Color.White else Color.Black - ), - contentPadding = PaddingValues(16.dp), - json = json, - onLoading = { - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center - ) { - Text( - text = "Loading...", - color = if (colors == defaultLightColors) Color.Black else Color.White - ) - } - }, - initialState = initialState, - colors = colors, - showIndices = showIndices, - showItemCount = showItemCount, - expandSingleChildren = expandSingleChildren, - onError = { errorMessage = it.localizedMessage }, - ) - } - } - 1 -> { - Text(text = "Page 1") - } - 2 -> { - Text(text = "Page 2") - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78ecd372343283f4157dcfd918ec5165bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2898 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d64e58ba64d180ce43ee13bf9a17835fbca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a3070fe34c611c42c0d3ad3013a0dce358be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml deleted file mode 100644 index f8c6127..0000000 --- a/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml deleted file mode 100644 index c2aab59..0000000 --- a/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - JsonTree - \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml deleted file mode 100644 index 02a6fd1..0000000 --- a/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index b9aa328..0000000 --- a/build.gradle +++ /dev/null @@ -1,63 +0,0 @@ -buildscript { - repositories { - mavenCentral() - } -} - -plugins { - alias libs.plugins.android.application apply false - alias libs.plugins.android.library apply false - alias libs.plugins.kotlin.android apply false - alias(libs.plugins.compose.compiler) apply false - alias libs.plugins.publish apply false - alias libs.plugins.api.validator - alias libs.plugins.detekt -} - -apiValidation { - ignoredProjects += ["app"] -} - -def projectSource = file(projectDir) -def configFile = files("$rootDir/detekt/config.yml") -def baselineFile = file("$rootDir/detekt/baseline.xml") -def kotlinFiles = "**/*.kt" -def appModuleFiles = "**/app/**" -def resourceFiles = "**/resources/**" -def buildFiles = "**/build/**" - -tasks.register("detektAll", io.gitlab.arturbosch.detekt.Detekt) { - def autoFix = project.hasProperty('detektAutoFix') - - description = "Custom DETEKT task for all modules" - parallel = true - ignoreFailures = false - autoCorrect = autoFix - buildUponDefaultConfig = true - setSource(projectSource) - config.setFrom(configFile) - baseline.set(baselineFile) - include(kotlinFiles) - exclude(appModuleFiles, resourceFiles, buildFiles) - reports { - html.enabled = true - xml.enabled = false - txt.enabled = false - } -} - -tasks.register("detektGenerateBaseline", io.gitlab.arturbosch.detekt.DetektCreateBaselineTask) { - description = "Custom DETEKT task to build baseline for all modules" - parallel = true - ignoreFailures = false - buildUponDefaultConfig = true - setSource(projectSource) - baseline.set(baselineFile) - config.setFrom(configFile) - include(kotlinFiles) - exclude(appModuleFiles, resourceFiles, buildFiles) -} - -dependencies { - detektPlugins libs.detekt.formatting -} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..5c0c311 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,76 @@ +import io.gitlab.arturbosch.detekt.Detekt + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath(libs.atomicfu) + } +} + +plugins { + alias(libs.plugins.android.application).apply(false) + alias(libs.plugins.android.library).apply(false) + alias(libs.plugins.kotlinMultiplatform).apply(false) + alias(libs.plugins.compose).apply(false) + alias(libs.plugins.compose.compiler).apply(false) + alias(libs.plugins.publish).apply(false) + alias(libs.plugins.api.validator) + alias(libs.plugins.detekt) +} + +apiValidation { + ignoredProjects.add("sample") +} + +val projectSource = file(projectDir) +val configFiles = files("$rootDir/detekt/config.yml") +val baselineFile = File("$rootDir/detekt/baseline.xml") +val kotlinFiles = "**/*.kt" +val sampleModuleFiles = "**/sample/**" +val resourceFiles = "**/resources/**" +val buildFiles = "**/build/**" + +tasks.register("detektAll") { + val autoFix = project.hasProperty("detektAutoFix") + + description = "Custom DETEKT task for all modules" + parallel = true + ignoreFailures = false + autoCorrect = autoFix + buildUponDefaultConfig = true + setSource(projectSource) + config.setFrom(configFiles) + baseline = baselineFile + reports { + html.required = true + xml.required = false + txt.required = false + } +} + +tasks.register("detektGenerateBaseline") { + description = "Custom DETEKT task to build baseline for all modules" + parallel = true + ignoreFailures = false + buildUponDefaultConfig = true + setSource(projectSource) + baseline.set(baselineFile) + config.setFrom(configFiles) + include(kotlinFiles) + exclude(sampleModuleFiles, resourceFiles, buildFiles) +} + + +tasks.withType().configureEach { + include(kotlinFiles) + exclude(sampleModuleFiles, resourceFiles, buildFiles) +} + +dependencies { + detektPlugins(libs.detekt.formatting) +} + + +apply(plugin = "kotlinx-atomicfu") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a81301d..fb0dc6f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,49 +1,47 @@ [versions] -android-min = "21" -android-target = "34" +android-minSdk = "24" +android-compileSdk = "34" java-toolchain = "17" -gradle-plugin = "8.4.1" +compose = "1.6.11" +agp = "8.4.2" kotlin = "2.0.0" -publish = "0.28.0" -api-validator = "0.14.0" +publish = "0.29.0" +nexus-publish = "2.0.0" +api-validator = "0.16.3" +atomicfuGradlePlugin = "0.22.0" -androidx-activity-compose = "1.9.0" -androidx-compose-bom = "2024.05.00" +androidx-activity-compose = "1.9.1" -kotlinx-serialization-json = "1.7.0" -coroutines = "1.8.1" +kotlinx-serialization-json = "1.7.1" +kotlinx-coroutines = "1.9.0-RC" junit = "4.13.2" detekt = "1.23.6" [libraries] -androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "androidx-compose-bom" } -androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" } -androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } -androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } -androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } -androidx-compose-material = { group = "androidx.compose.material3", name = "material3" } -androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime" } +kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } +nexus-publish = { module = "io.github.gradle-nexus.publish-plugin:io.github.gradle-nexus.publish-plugin.gradle.plugin", version.ref = "nexus-publish" } androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" } - kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" } +kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } +kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" } +kotlinx-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" } +kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" } -testing-junit = { module = "junit:junit", version.ref = "junit" } -testing-compose-ui-junit = { group = "androidx.compose.ui", name = "ui-test-junit4" } -testing-compose-ui-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } -testing-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } detekt-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } publish = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "publish" } +atomicfu = { module = "org.jetbrains.kotlinx:atomicfu-gradle-plugin", version.ref = "atomicfuGradlePlugin" } [plugins] -android-application = { id = "com.android.application", version.ref = "gradle-plugin" } -android-library = { id = "com.android.library", version.ref = "gradle-plugin" } -kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +android-library = { id = "com.android.library", version.ref = "agp" } +android-application = { id = "com.android.application", version.ref = "agp" } +kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +compose = { id = "org.jetbrains.compose", version.ref = "compose" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } publish = { id = "com.vanniktech.maven.publish", version.ref = "publish" } api-validator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "api-validator" } diff --git a/jsontree/build.gradle b/jsontree/build.gradle deleted file mode 100644 index 574e71b..0000000 --- a/jsontree/build.gradle +++ /dev/null @@ -1,41 +0,0 @@ -plugins { - alias libs.plugins.android.library - alias libs.plugins.kotlin.android - alias(libs.plugins.compose.compiler) - alias libs.plugins.publish -} - -apply from: "$rootProject.projectDir/common-android.gradle" - -android { - kotlinOptions { - freeCompilerArgs += ["-Xexplicit-api=strict", "-Xjvm-default=all", "-opt-in=kotlin.RequiresOptIn"] - } - buildFeatures { - compose = true - } - defaultConfig { - testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' - } -} - -composeCompiler { - enableStrongSkippingMode = true -} - -dependencies { - implementation platform(libs.androidx.compose.bom) - implementation libs.androidx.compose.ui - implementation libs.androidx.compose.ui.tooling - implementation libs.androidx.compose.foundation - implementation libs.androidx.compose.material - implementation libs.androidx.compose.runtime - - implementation libs.kotlinx.serialization.json - - testImplementation libs.testing.junit - testImplementation libs.testing.coroutines - testImplementation platform(libs.androidx.compose.bom) - androidTestImplementation libs.testing.compose.ui.junit - debugImplementation libs.testing.compose.ui.manifest -} \ No newline at end of file diff --git a/jsontree/build.gradle.kts b/jsontree/build.gradle.kts new file mode 100644 index 0000000..e50ca46 --- /dev/null +++ b/jsontree/build.gradle.kts @@ -0,0 +1,108 @@ +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree + +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.android.library) + alias(libs.plugins.compose) + alias(libs.plugins.compose.compiler) + id("kotlinx-atomicfu") +// id("module.publication") + alias(libs.plugins.publish) +} + +//apply(from = "${rootProject.projectDir}/common-android.gradle") + +kotlin { + jvm() + androidTarget { + publishLibraryVariants("release") + @OptIn(ExperimentalKotlinGradlePluginApi::class) + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + @OptIn(ExperimentalKotlinGradlePluginApi::class) + compilerOptions { + jvmTarget.set(JvmTarget.JVM_1_8) + } + + @OptIn(ExperimentalKotlinGradlePluginApi::class) + instrumentedTestVariant { + sourceSetTree.set(KotlinSourceSetTree.test) + dependencies { + implementation(libs.kotlinx.coroutines.test) + } + } + } + iosX64() + iosArm64() + iosSimulatorArm64() + + @OptIn(ExperimentalKotlinGradlePluginApi::class) + compilerOptions { + freeCompilerArgs.addAll("-Xexplicit-api=strict", "-Xjvm-default=all", "-opt-in=kotlin.RequiresOptIn") + } + sourceSets { + val commonMain by getting { + dependencies { + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material3) + implementation(compose.components.resources) + implementation(compose.components.uiToolingPreview) + implementation(libs.kotlinx.coroutines.core) + + implementation (libs.kotlinx.serialization.json) + + } + } + + val commonTest by getting { + dependencies { + implementation(libs.kotlin.test) + implementation(libs.kotlinx.coroutines.test) + + @OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class) + implementation(compose.uiTest) + } + } + + val androidMain by getting { + dependencies { + implementation(libs.kotlinx.coroutines.android) + } + } + + val jvmMain by getting { + dependencies { + implementation(libs.kotlinx.coroutines.swing) + implementation(compose.desktop.currentOs) + } + } + + val jvmTest by getting { + dependencies { + implementation(compose.desktop.uiTestJUnit4) + implementation(compose.desktop.currentOs) + } + } + } +} + + +android { + namespace = "com.sebastianneubauer.jsontree" + compileSdk = libs.versions.android.compileSdk.get().toInt() + buildFeatures { + compose = true + } + defaultConfig { + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + minSdk = libs.versions.android.minSdk.get().toInt() + } +} + +composeCompiler { + enableStrongSkippingMode = true +} + +apply(plugin = "kotlinx-atomicfu") \ No newline at end of file diff --git a/jsontree/proguard-rules.pro b/jsontree/proguard-rules.pro index 481bb43..ff59496 100644 --- a/jsontree/proguard-rules.pro +++ b/jsontree/proguard-rules.pro @@ -1,6 +1,6 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. +# proguardFiles setting in build.gradle.kts. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html diff --git a/jsontree/src/androidTest/java/com/sebastianneubauer/jsontree/JsonTreeTest.kt b/jsontree/src/androidTest/java/com/sebastianneubauer/jsontree/JsonTreeTest.kt deleted file mode 100644 index 0992ed3..0000000 --- a/jsontree/src/androidTest/java/com/sebastianneubauer/jsontree/JsonTreeTest.kt +++ /dev/null @@ -1,455 +0,0 @@ -package com.sebastianneubauer.jsontree - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.material3.Button -import androidx.compose.material3.Text -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assertCountEquals -import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.hasTestTag -import androidx.compose.ui.test.hasText -import androidx.compose.ui.test.junit4.createComposeRule -import androidx.compose.ui.test.onAllNodesWithText -import androidx.compose.ui.test.onNodeWithTag -import androidx.compose.ui.test.onNodeWithText -import androidx.compose.ui.test.performClick -import org.junit.Rule -import org.junit.Test - -@OptIn(ExperimentalTestApi::class) -internal class JsonTreeTest { - - @JvmField - @Rule - val composeTestRule = createComposeRule() - - private fun setJson( - json: String, - initialState: TreeState = TreeState.FIRST_ITEM_EXPANDED, - ) { - composeTestRule.setContent { - JsonTree( - json = json, - initialState = initialState, - onLoading = {} - ) - } - } - - @Test - fun initial_state_is_first_item_expanded() { - setJson(nestedJson) - - composeTestRule.onNodeWithText("\"topLevelObject\": { 2 items },").assertIsDisplayed() - composeTestRule.onNodeWithText("\"topLevelArray\": [ 2 items ],").assertIsDisplayed() - composeTestRule.onNodeWithText("\"emptyObject\": { 0 items }").assertIsDisplayed() - - composeTestRule.onNodeWithText("\"string\": \"stringValue\",").assertDoesNotExist() - composeTestRule.onNodeWithText("\"hello\",").assertDoesNotExist() - } - - @Test - fun initial_state_is_collapsed() { - setJson(nestedJson, initialState = TreeState.COLLAPSED) - - composeTestRule.onNodeWithText("{ 3 items }").assertIsDisplayed() - composeTestRule.onNodeWithText("\"topLevelObject\"", substring = true).assertDoesNotExist() - } - - @Test - fun initial_state_is_expanded() { - setJson(nestedJson, initialState = TreeState.EXPANDED) - - // fix flakiness by waiting until first item appears - composeTestRule.waitUntilExactlyOneExists(hasText("\"topLevelObject\": {")) - - // every collapsable is expanded - composeTestRule.onNodeWithText("\"topLevelObject\": {").assertIsDisplayed() - composeTestRule.onNodeWithText("\"string\": \"stringValue\",").assertIsDisplayed() - - composeTestRule.onNodeWithText("\"nestedObject\": {").assertIsDisplayed() - composeTestRule.onNodeWithText("\"int\": 42,").assertIsDisplayed() - - composeTestRule.onNodeWithText("\"nestedArray\": [").assertIsDisplayed() - composeTestRule.onNodeWithText("\"nestedArrayValue\",").assertIsDisplayed() - composeTestRule.onNodeWithText("\"nestedArrayValue\"").assertIsDisplayed() - - composeTestRule.onNodeWithText("\"arrayOfObjects\": [").assertIsDisplayed() - composeTestRule.onNodeWithText("\"anotherString\": \"anotherStringValue\"").assertIsDisplayed() - composeTestRule.onNodeWithText("\"anotherInt\": 52").assertIsDisplayed() - - composeTestRule.onNodeWithText("\"topLevelArray\": [").assertIsDisplayed() - composeTestRule.onNodeWithText("\"hello\",").assertIsDisplayed() - composeTestRule.onNodeWithText("\"emptyObject\": {").assertIsDisplayed() - } - - @Test - fun click_on_collapsed_object_or_array_expands_it() { - setJson(nestedJson) - // fix flakiness by waiting until first item appears - composeTestRule.waitUntilExactlyOneExists(hasText("\"topLevelObject\": { 2 items },")) - - composeTestRule.onNodeWithText("\"topLevelObject\": { 2 items },").performClick() - composeTestRule.onNodeWithText("\"topLevelObject\": {").assertIsDisplayed() - composeTestRule.onNodeWithText("\"string\": \"stringValue\",").assertIsDisplayed() - composeTestRule.onNodeWithText("\"nestedObject\": { 3 items }").assertIsDisplayed() - - composeTestRule.onNodeWithText("\"topLevelArray\": [ 2 items ],").performClick() - composeTestRule.onNodeWithText("\"topLevelArray\": [").assertIsDisplayed() - composeTestRule.onNodeWithText("\"hello\",").assertIsDisplayed() - composeTestRule.onNodeWithText("\"world\"").assertIsDisplayed() - } - - @Test - fun click_on_expanded_object_or_array_collapses_it() { - setJson(nestedJson, initialState = TreeState.EXPANDED) - - composeTestRule.onNodeWithText("\"arrayOfObjects\": [").performClick() - composeTestRule.onNodeWithText("\"arrayOfObjects\": [ 2 items ]").assertIsDisplayed() - - composeTestRule.onNodeWithText("\"nestedObject\": {").performClick() - composeTestRule.onNodeWithText("\"nestedObject\": { 3 items }").assertIsDisplayed() - - composeTestRule.onNodeWithText("\"topLevelObject\": {").performClick() - composeTestRule.onNodeWithText("\"topLevelObject\": { 2 items },").assertIsDisplayed() - } - - @Test - fun array_of_arrays_is_rendered_correctly() { - setJson(arrayOfArraysJson) - // fix flakiness by waiting until first item appears - composeTestRule.waitUntilExactlyOneExists(hasText("\"array\": [ 2 items ]")) - - composeTestRule.onNodeWithText("\"array\": [ 2 items ]").assertIsDisplayed() - composeTestRule.onNodeWithText("\"array\": [ 2 items ]").performClick() - composeTestRule.onNodeWithText("\"array\": [").assertIsDisplayed() - composeTestRule.onNodeWithText("[ 1 item ],").assertIsDisplayed() - composeTestRule.onNodeWithText("[ 2 items ]").assertIsDisplayed() - - composeTestRule.onNodeWithText("[ 1 item ],").performClick() - composeTestRule.onNodeWithText("[ 2 items ]").performClick() - - composeTestRule.onNodeWithText("\"stringValue\"").assertIsDisplayed() - composeTestRule.onNodeWithText("],").assertIsDisplayed() - composeTestRule.onNodeWithText("42,").assertIsDisplayed() - composeTestRule.onNodeWithText("52").assertIsDisplayed() - } - - @Test - fun root_array_is_rendered_correctly() { - setJson(rootArrayJson) - - composeTestRule.assertRootArrayIsDisplayed() - } - - @Test - fun root_string_is_rendered_correctly() { - setJson(rootStringJson) - - composeTestRule.assertRootStringIsDisplayed() - } - - @Test - fun empty_object_is_rendered_correctly() { - setJson(EMPTY_OBJECT_JSON) - - composeTestRule.assertEmptyObjectIsDisplayed() - - composeTestRule.onNodeWithText("{").performClick() - composeTestRule.onNodeWithText("{ 0 items }").assertIsDisplayed() - } - - @Test - fun invalid_json_shows_an_error() { - composeTestRule.setContent { - Box { - var errorMessage: String? by remember { mutableStateOf(null) } - - JsonTree( - modifier = Modifier.testTag("jsonTree"), - json = INVALID_JSON, - onError = { throwable -> errorMessage = throwable.localizedMessage }, - onLoading = {} - ) - - errorMessage?.let { - Text( - modifier = Modifier.testTag("errorText"), - text = it - ) - } - } - } - - composeTestRule.onNodeWithTag("errorText").assertIsDisplayed() - } - - @Test - fun changing_json_is_handled_correctly() { - composeTestRule.setContent { - var jsonString: String by remember { mutableStateOf(rootStringJson) } - - Column { - JsonTree(json = jsonString, onLoading = {}) - - Button( - modifier = Modifier.testTag("button"), - onClick = { jsonString = rootArrayJson } - ) {} - } - } - - composeTestRule.assertRootStringIsDisplayed() - - composeTestRule.onNodeWithTag("button").performClick() - - composeTestRule.assertRootArrayIsDisplayed() - } - - @Test - fun changing_json_while_collapsed_is_handled_correctly() { - composeTestRule.setContent { - var jsonString: String by remember { mutableStateOf(nestedJson) } - - Column { - JsonTree( - json = jsonString, - initialState = TreeState.COLLAPSED, - onLoading = {} - ) - - Button( - modifier = Modifier.testTag("button"), - onClick = { jsonString = rootArrayJson } - ) {} - } - } - - composeTestRule.onNodeWithText("{ 3 items }").assertIsDisplayed() - - composeTestRule.onNodeWithTag("button").performClick() - - composeTestRule.onNodeWithText("[ 1 item ]").assertIsDisplayed() - } - - @Test - fun changing_json_from_invalid_to_valid_is_handled_correctly() { - composeTestRule.setContent { - var jsonString: String by remember { mutableStateOf(INVALID_JSON) } - - Column { - JsonTree( - modifier = Modifier.testTag("jsonTree"), - json = jsonString, - onLoading = {} - ) - - Button( - modifier = Modifier.testTag("button"), - onClick = { jsonString = rootStringJson } - ) {} - } - } - - composeTestRule.onNodeWithTag("button").performClick() - composeTestRule.assertRootStringIsDisplayed() - } - - @Test - fun changing_json_from_valid_to_invalid_is_handled_correctly() { - composeTestRule.setContent { - var jsonString: String by remember { mutableStateOf(rootStringJson) } - var errorMessage: String? by remember { mutableStateOf(null) } - - Column { - JsonTree( - modifier = Modifier.testTag("jsonTree"), - json = jsonString, - onError = { throwable -> errorMessage = throwable.localizedMessage }, - onLoading = {} - ) - - Button( - modifier = Modifier.testTag("button"), - onClick = { jsonString = INVALID_JSON } - ) {} - - errorMessage?.let { - Text( - modifier = Modifier.testTag("errorText"), - text = it - ) - } - } - } - - // fix flakiness by waiting until first item appears - composeTestRule.waitUntilExactlyOneExists(hasTestTag("jsonTree")) - - composeTestRule.onNodeWithTag("jsonTree").assertIsDisplayed() - composeTestRule.onNodeWithTag("errorText").assertDoesNotExist() - - composeTestRule.onNodeWithTag("button").performClick() - - composeTestRule.onNodeWithTag("errorText").assertIsDisplayed() - } - - @Test - fun changing_initial_state_is_handled_correctly() { - composeTestRule.setContent { - var initalState: TreeState by remember { mutableStateOf(TreeState.EXPANDED) } - - Column { - JsonTree( - json = arrayOfArraysJson, - initialState = initalState, - onLoading = {} - ) - - Button( - modifier = Modifier.testTag("button"), - onClick = { - initalState = when (initalState) { - TreeState.EXPANDED -> TreeState.COLLAPSED - TreeState.COLLAPSED -> TreeState.FIRST_ITEM_EXPANDED - TreeState.FIRST_ITEM_EXPANDED -> TreeState.EXPANDED - } - } - ) {} - } - } - - composeTestRule.onNodeWithText("\"array\": [").assertIsDisplayed() - composeTestRule.onNodeWithText("\"stringValue\"").assertIsDisplayed() - composeTestRule.onNodeWithText("42,").assertIsDisplayed() - composeTestRule.onNodeWithText("52").assertIsDisplayed() - - composeTestRule.onNodeWithTag("button").performClick() - - composeTestRule.onNodeWithText("{ 1 item }").assertIsDisplayed() - - composeTestRule.onNodeWithTag("button").performClick() - - composeTestRule.onNodeWithText("\"array\": [ 2 items ]").assertIsDisplayed() - } - - @Test - fun showing_and_hiding_indices_is_handled_correctly() { - composeTestRule.setContent { - var showIndices: Boolean by remember { mutableStateOf(true) } - - Column { - JsonTree( - json = arrayOfArraysJson, - onLoading = {}, - showIndices = showIndices, - initialState = TreeState.EXPANDED - ) - - Button( - modifier = Modifier.testTag("button"), - onClick = { showIndices = !showIndices } - ) {} - } - } - - composeTestRule.onNodeWithText("0: [").assertIsDisplayed() - composeTestRule.onNodeWithText("0: \"stringValue\"").assertIsDisplayed() - composeTestRule.onNodeWithText("1: [").assertIsDisplayed() - composeTestRule.onNodeWithText("0: 42,").assertIsDisplayed() - composeTestRule.onNodeWithText("1: 52").assertIsDisplayed() - - composeTestRule.onNodeWithTag("button").performClick() - - composeTestRule.onAllNodesWithText("[").assertCountEquals(2) - composeTestRule.onNodeWithText("\"stringValue\"").assertIsDisplayed() - composeTestRule.onNodeWithText("42,").assertIsDisplayed() - composeTestRule.onNodeWithText("52").assertIsDisplayed() - } - - @Test - fun showing_and_hiding_item_count_is_handled_correctly() { - composeTestRule.setContent { - var showItemCount: Boolean by remember { mutableStateOf(true) } - - Column { - JsonTree( - json = rootArrayJson, - onLoading = {}, - showItemCount = showItemCount, - initialState = TreeState.COLLAPSED - ) - - Button( - modifier = Modifier.testTag("button"), - onClick = { showItemCount = !showItemCount } - ) {} - } - } - - composeTestRule.onNodeWithText("[ 1 item ]").assertIsDisplayed() - - composeTestRule.onNodeWithTag("button").performClick() - - composeTestRule.onNodeWithText("[ ... ]").assertIsDisplayed() - - composeTestRule.onNodeWithTag("button").performClick() - - composeTestRule.onNodeWithText("[ 1 item ]").assertIsDisplayed() - } - - @Test - fun expanding_single_children_is_handled_correctly() { - composeTestRule.setContent { - JsonTree( - json = arrayOfArraysJson, - initialState = TreeState.COLLAPSED, - onLoading = {}, - expandSingleChildren = true - ) - } - - composeTestRule.onNodeWithText("{ 1 item }").performClick() - // shows nested array - composeTestRule.onNodeWithText("\"array\": [").assertIsDisplayed() - // shows collapsed contents of nested array - composeTestRule.onNodeWithText("[ 1 item ],").assertIsDisplayed() - composeTestRule.onNodeWithText("[ 2 items ]").assertIsDisplayed() - - // collapse root - composeTestRule.onNodeWithText("{").performClick() - composeTestRule.onNodeWithText("{ 1 item }").assertIsDisplayed() - } - - @Test - fun not_expanding_single_children_is_handled_correctly() { - composeTestRule.setContent { - JsonTree( - json = arrayOfArraysJson, - initialState = TreeState.COLLAPSED, - onLoading = {}, - expandSingleChildren = false - ) - } - - composeTestRule.onNodeWithText("{ 1 item }").performClick() - - composeTestRule.waitUntilExactlyOneExists(hasText("\"array\": [ 2 items ]")) - composeTestRule.onNodeWithText("\"array\": [ 2 items ]").assertIsDisplayed() - composeTestRule.onNodeWithText("\"array\": [ 2 items ]").performClick() - - composeTestRule.onNodeWithText("[ 1 item ],").assertIsDisplayed() - composeTestRule.onNodeWithText("[ 2 items ]").assertIsDisplayed() - - // collapse root - composeTestRule.onNodeWithText("{").performClick() - composeTestRule.onNodeWithText("{ 1 item }").assertIsDisplayed() - } -} diff --git a/jsontree/src/main/res/drawable/jsontree_arrow_right.xml b/jsontree/src/commonMain/composeResources/drawable/jsontree_arrow_right.xml similarity index 71% rename from jsontree/src/main/res/drawable/jsontree_arrow_right.xml rename to jsontree/src/commonMain/composeResources/drawable/jsontree_arrow_right.xml index e3b8f37..4272a0e 100644 --- a/jsontree/src/main/res/drawable/jsontree_arrow_right.xml +++ b/jsontree/src/commonMain/composeResources/drawable/jsontree_arrow_right.xml @@ -1,5 +1,5 @@ - + diff --git a/jsontree/src/main/res/values/plurals.xml b/jsontree/src/commonMain/composeResources/values/plurals.xml similarity index 51% rename from jsontree/src/main/res/values/plurals.xml rename to jsontree/src/commonMain/composeResources/values/plurals.xml index cf8b5d3..a4ca7f9 100644 --- a/jsontree/src/main/res/values/plurals.xml +++ b/jsontree/src/commonMain/composeResources/values/plurals.xml @@ -1,7 +1,7 @@ - \u0020%d item\u0020 - \u0020%d items\u0020 + \u0020%1$d item\u0020 + \u0020%1$d items\u0020 \ No newline at end of file diff --git a/jsontree/src/main/java/com/sebastianneubauer/jsontree/AnnotatedText.kt b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/AnnotatedText.kt similarity index 93% rename from jsontree/src/main/java/com/sebastianneubauer/jsontree/AnnotatedText.kt rename to jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/AnnotatedText.kt index 4811913..451c8cd 100644 --- a/jsontree/src/main/java/com/sebastianneubauer/jsontree/AnnotatedText.kt +++ b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/AnnotatedText.kt @@ -2,18 +2,20 @@ package com.sebastianneubauer.jsontree import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.withStyle import com.sebastianneubauer.jsontree.JsonTreeElement.ParentType +import jsontree.jsontree.generated.resources.Res +import jsontree.jsontree.generated.resources.jsontree_collapsable_items import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.booleanOrNull import kotlinx.serialization.json.doubleOrNull import kotlinx.serialization.json.floatOrNull import kotlinx.serialization.json.intOrNull import kotlinx.serialization.json.longOrNull +import org.jetbrains.compose.resources.pluralStringResource @Composable internal fun rememberCollapsableText( @@ -27,7 +29,7 @@ internal fun rememberCollapsableText( showItemCount: Boolean, parentType: ParentType, ): AnnotatedString { - val itemCount = pluralStringResource(R.plurals.jsontree_collapsable_items, childItemCount, childItemCount) + val itemCount = pluralStringResource(Res.plurals.jsontree_collapsable_items, childItemCount, childItemCount) return remember(key, state, colors, isLastItem, itemCount, type, showIndices, showItemCount) { val openBracket = if (type == CollapsableType.OBJECT) "{" else "[" diff --git a/jsontree/src/main/java/com/sebastianneubauer/jsontree/CollapsableType.kt b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/CollapsableType.kt similarity index 100% rename from jsontree/src/main/java/com/sebastianneubauer/jsontree/CollapsableType.kt rename to jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/CollapsableType.kt diff --git a/jsontree/src/main/java/com/sebastianneubauer/jsontree/JsonTree.kt b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTree.kt similarity index 97% rename from jsontree/src/main/java/com/sebastianneubauer/jsontree/JsonTree.kt rename to jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTree.kt index 7b7b4fd..2f1c4a3 100644 --- a/jsontree/src/main/java/com/sebastianneubauer/jsontree/JsonTree.kt +++ b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTree.kt @@ -21,14 +21,16 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.times +import jsontree.jsontree.generated.resources.Res +import jsontree.jsontree.generated.resources.jsontree_arrow_right import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.vectorResource /** * Renders JSON data as a formatted tree with collapsable objects and arrays. @@ -59,7 +61,7 @@ public fun JsonTree( initialState: TreeState = TreeState.FIRST_ITEM_EXPANDED, contentPadding: PaddingValues = PaddingValues(0.dp), colors: TreeColors = defaultLightColors, - icon: ImageVector = ImageVector.vectorResource(R.drawable.jsontree_arrow_right), + icon: ImageVector = vectorResource(Res.drawable.jsontree_arrow_right), iconSize: Dp = 20.dp, textStyle: TextStyle = LocalTextStyle.current, showIndices: Boolean = false, diff --git a/jsontree/src/main/java/com/sebastianneubauer/jsontree/JsonTreeElement.kt b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeElement.kt similarity index 100% rename from jsontree/src/main/java/com/sebastianneubauer/jsontree/JsonTreeElement.kt rename to jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeElement.kt diff --git a/jsontree/src/main/java/com/sebastianneubauer/jsontree/JsonTreeParser.kt b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeParser.kt similarity index 96% rename from jsontree/src/main/java/com/sebastianneubauer/jsontree/JsonTreeParser.kt rename to jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeParser.kt index afe8367..4eb1d27 100644 --- a/jsontree/src/main/java/com/sebastianneubauer/jsontree/JsonTreeParser.kt +++ b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeParser.kt @@ -11,6 +11,7 @@ import com.sebastianneubauer.jsontree.JsonTreeParserState.Loading import com.sebastianneubauer.jsontree.JsonTreeParserState.Parsing.Error import com.sebastianneubauer.jsontree.JsonTreeParserState.Parsing.Parsed import com.sebastianneubauer.jsontree.JsonTreeParserState.Ready +import kotlinx.atomicfu.atomic import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json @@ -20,7 +21,6 @@ import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject -import java.util.concurrent.atomic.AtomicLong internal class JsonTreeParser( private val json: String, @@ -30,7 +30,7 @@ internal class JsonTreeParser( private var parserState = mutableStateOf(Loading) val state: State = parserState - suspend fun init(initialState: TreeState) = withContext(defaultDispatcher) { + suspend inline fun init(initialState: TreeState) = withContext(defaultDispatcher) { val parsingState = runCatching { Parsed(Json.parseToJsonElement(json)) }.getOrElse { throwable -> @@ -42,7 +42,7 @@ internal class JsonTreeParser( Ready( list = parsingState.jsonElement .toJsonTree( - idGenerator = AtomicLong(), + idGenerator = AtomicLongWrapper(), state = initialState, level = 0, key = null, @@ -193,7 +193,7 @@ internal class JsonTreeParser( } private fun JsonElement.toJsonTree( - idGenerator: AtomicLong, + idGenerator: AtomicLongWrapper, state: TreeState, level: Int, key: String?, @@ -297,3 +297,10 @@ internal class JsonTreeParser( return list } } + +internal class AtomicLongWrapper { + private val atomicLong = atomic(0L) + fun incrementAndGet(): Long { + return atomicLong.incrementAndGet() + } +} diff --git a/jsontree/src/main/java/com/sebastianneubauer/jsontree/JsonTreeParserState.kt b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeParserState.kt similarity index 100% rename from jsontree/src/main/java/com/sebastianneubauer/jsontree/JsonTreeParserState.kt rename to jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeParserState.kt diff --git a/jsontree/src/main/java/com/sebastianneubauer/jsontree/TreeColors.kt b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/TreeColors.kt similarity index 100% rename from jsontree/src/main/java/com/sebastianneubauer/jsontree/TreeColors.kt rename to jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/TreeColors.kt diff --git a/jsontree/src/main/java/com/sebastianneubauer/jsontree/TreeState.kt b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/TreeState.kt similarity index 100% rename from jsontree/src/main/java/com/sebastianneubauer/jsontree/TreeState.kt rename to jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/TreeState.kt diff --git a/jsontree/src/test/java/com/sebastianneubauer/jsontree/JsonTreeParserTest.kt b/jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/JsonTreeParserTest.kt similarity index 76% rename from jsontree/src/test/java/com/sebastianneubauer/jsontree/JsonTreeParserTest.kt rename to jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/JsonTreeParserTest.kt index 3cf8a14..c18cdbc 100644 --- a/jsontree/src/test/java/com/sebastianneubauer/jsontree/JsonTreeParserTest.kt +++ b/jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/JsonTreeParserTest.kt @@ -3,14 +3,15 @@ package com.sebastianneubauer.jsontree import com.sebastianneubauer.jsontree.JsonTreeParserState.Parsing.Error import com.sebastianneubauer.jsontree.JsonTreeParserState.Ready import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestResult import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import kotlinx.serialization.json.JsonPrimitive -import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue -import org.junit.Test +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue -internal class JsonTreeParserTest { +public class JsonTreeParserTest { @OptIn(ExperimentalCoroutinesApi::class) private suspend fun underTest(json: String, initialState: TreeState): JsonTreeParser { @@ -22,14 +23,14 @@ internal class JsonTreeParserTest { } @Test - fun `invalid json - shows error state`() = runTest { + public fun `invalid json - shows error state`(): TestResult = runTest { val underTest = underTest(INVALID_JSON, TreeState.COLLAPSED) // produces Error state with any throwable assertTrue(underTest.state.value is Error) } @Test - fun `empty json - collapsed - shows collapsed empty json`() = runTest { + public fun `empty json - collapsed - shows collapsed empty json`(): TestResult = runTest { val underTest = underTest(EMPTY_OBJECT_JSON, TreeState.COLLAPSED) assertEquals( Ready( @@ -50,7 +51,7 @@ internal class JsonTreeParserTest { } @Test - fun `empty json - first item expanded - shows expanded empty json`() = runTest { + public fun `empty json - first item expanded - shows expanded empty json`(): TestResult = runTest { val underTest = underTest(EMPTY_OBJECT_JSON, TreeState.FIRST_ITEM_EXPANDED) assertEquals( Ready( @@ -77,7 +78,7 @@ internal class JsonTreeParserTest { } @Test - fun `empty json - expanded - shows expanded empty json`() = runTest { + public fun `empty json - expanded - shows expanded empty json`(): TestResult = runTest { val underTest = underTest(EMPTY_OBJECT_JSON, TreeState.EXPANDED) assertEquals( Ready( @@ -104,7 +105,7 @@ internal class JsonTreeParserTest { } @Test - fun `root string json - collapsed - shows root string`() = runTest { + public fun `root string json - collapsed - shows root string`(): TestResult = runTest { val underTest = underTest(rootStringJson, TreeState.COLLAPSED) assertEquals( Ready( @@ -124,7 +125,7 @@ internal class JsonTreeParserTest { } @Test - fun `root string json - expanded - shows root string`() = runTest { + public fun `root string json - expanded - shows root string`(): TestResult = runTest { val underTest = underTest(rootStringJson, TreeState.EXPANDED) assertEquals( Ready( @@ -144,7 +145,7 @@ internal class JsonTreeParserTest { } @Test - fun `root string json - first item expanded - shows root string`() = runTest { + public fun `root string json - first item expanded - shows root string`(): TestResult = runTest { val underTest = underTest(rootStringJson, TreeState.FIRST_ITEM_EXPANDED) assertEquals( Ready( @@ -164,7 +165,7 @@ internal class JsonTreeParserTest { } @Test - fun `root array json - collapsed - shows collapsed array`() = runTest { + public fun `root array json - collapsed - shows collapsed array`(): TestResult = runTest { val underTest = underTest(rootArrayJson, TreeState.COLLAPSED) assertEquals( Ready( @@ -194,7 +195,7 @@ internal class JsonTreeParserTest { } @Test - fun `root array json - first item expanded - shows expanded array`() = runTest { + public fun `root array json - first item expanded - shows expanded array`(): TestResult = runTest { val underTest = underTest(rootArrayJson, TreeState.FIRST_ITEM_EXPANDED) assertEquals( Ready( @@ -238,7 +239,7 @@ internal class JsonTreeParserTest { } @Test - fun `root array json - expanded - shows expanded array`() = runTest { + public fun `root array json - expanded - shows expanded array`(): TestResult = runTest { val underTest = underTest(rootArrayJson, TreeState.EXPANDED) assertEquals( Ready( @@ -282,7 +283,7 @@ internal class JsonTreeParserTest { } @Test - fun `nested json - collapsed - shows collapsed json`() = runTest { + public fun `nested json - collapsed - shows collapsed json`(): TestResult = runTest { val underTest = underTest(nestedJson, TreeState.COLLAPSED) assertEquals( Ready(list = listOf(jsonTreeElement())), @@ -291,12 +292,15 @@ internal class JsonTreeParserTest { } @Test - fun `nested json - first item expanded - shows first item expanded`() = runTest { + public fun `nested json - first item expanded - shows first item expanded`(): TestResult = runTest { val underTest = underTest(nestedJson, TreeState.FIRST_ITEM_EXPANDED) assertEquals( Ready( list = listOf( - jsonTreeElement(state = TreeState.FIRST_ITEM_EXPANDED, childrenState = TreeState.COLLAPSED), + jsonTreeElement( + state = TreeState.FIRST_ITEM_EXPANDED, + childrenState = TreeState.COLLAPSED + ), array(), JsonTreeElement.EndBracket( id = "8-b", @@ -311,7 +315,7 @@ internal class JsonTreeParserTest { } @Test - fun `nested json - expanded - shows expanded json`() = runTest { + public fun `nested json - expanded - shows expanded json`(): TestResult = runTest { val underTest = underTest(nestedJson, TreeState.EXPANDED) assertEquals( Ready( @@ -361,130 +365,146 @@ internal class JsonTreeParserTest { } @Test - fun `nested json - expandSingleChildren is false - expands and collapses correctly`() = runTest { - val underTest = underTest(nestedJson, TreeState.COLLAPSED) - assertEquals( - Ready(list = listOf(jsonTreeElement())), - underTest.state.value - ) - - // expand root - underTest.expandOrCollapseItem(jsonTreeElement(), expandSingleChildren = false) - - assertEquals( - Ready( - list = listOf( - jsonTreeElement(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), - array(), - JsonTreeElement.EndBracket( - id = "8-b", - level = 0, - isLastItem = true, - type = JsonTreeElement.EndBracket.Type.OBJECT - ), - ) - ), - underTest.state.value - ) - - // expand array - underTest.expandOrCollapseItem(item = array(), expandSingleChildren = false) - - assertEquals( - Ready( - list = listOf( - jsonTreeElement(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), - array(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), - nestedArray1(), - nestedArray2(), - JsonTreeElement.EndBracket( - id = "7-b", - level = 1, - isLastItem = true, - type = JsonTreeElement.EndBracket.Type.ARRAY - ), - JsonTreeElement.EndBracket( - id = "8-b", - level = 0, - isLastItem = true, - type = JsonTreeElement.EndBracket.Type.OBJECT - ), - ) - ), - underTest.state.value - ) - - // expand nestedArray2 - underTest.expandOrCollapseItem(item = nestedArray2(), expandSingleChildren = false) - - assertEquals( - Ready( - list = listOf( - jsonTreeElement(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), - array(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), - nestedArray1(), - nestedArray2(state = TreeState.EXPANDED), - numberPrimitive1, - numberPrimitive2, - JsonTreeElement.EndBracket( - id = "6-b", - level = 2, - isLastItem = true, - type = JsonTreeElement.EndBracket.Type.ARRAY - ), - JsonTreeElement.EndBracket( - id = "7-b", - level = 1, - isLastItem = true, - type = JsonTreeElement.EndBracket.Type.ARRAY - ), - JsonTreeElement.EndBracket( - id = "8-b", - level = 0, - isLastItem = true, - type = JsonTreeElement.EndBracket.Type.OBJECT - ), - ) - ), - underTest.state.value - ) - - // collapse array - underTest.expandOrCollapseItem( - item = array(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), - expandSingleChildren = false - ) - - assertEquals( - Ready( - list = listOf( - jsonTreeElement(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), - array(), - JsonTreeElement.EndBracket( - id = "8-b", - level = 0, - isLastItem = true, - type = JsonTreeElement.EndBracket.Type.OBJECT - ), - ) - ), - underTest.state.value - ) - - // collapse root - underTest.expandOrCollapseItem( - item = jsonTreeElement(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), - expandSingleChildren = false - ) - - assertEquals( - Ready(list = listOf(jsonTreeElement())), - underTest.state.value - ) - } + public fun `nested json - expandSingleChildren is false - expands and collapses correctly`(): TestResult = + runTest { + val underTest = underTest(nestedJson, TreeState.COLLAPSED) + assertEquals( + Ready(list = listOf(jsonTreeElement())), + underTest.state.value + ) + + // expand root + underTest.expandOrCollapseItem(jsonTreeElement(), expandSingleChildren = false) + + assertEquals( + Ready( + list = listOf( + jsonTreeElement( + state = TreeState.EXPANDED, + childrenState = TreeState.COLLAPSED + ), + array(), + JsonTreeElement.EndBracket( + id = "8-b", + level = 0, + isLastItem = true, + type = JsonTreeElement.EndBracket.Type.OBJECT + ), + ) + ), + underTest.state.value + ) + + // expand array + underTest.expandOrCollapseItem(item = array(), expandSingleChildren = false) + + assertEquals( + Ready( + list = listOf( + jsonTreeElement( + state = TreeState.EXPANDED, + childrenState = TreeState.COLLAPSED + ), + array(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), + nestedArray1(), + nestedArray2(), + JsonTreeElement.EndBracket( + id = "7-b", + level = 1, + isLastItem = true, + type = JsonTreeElement.EndBracket.Type.ARRAY + ), + JsonTreeElement.EndBracket( + id = "8-b", + level = 0, + isLastItem = true, + type = JsonTreeElement.EndBracket.Type.OBJECT + ), + ) + ), + underTest.state.value + ) + + // expand nestedArray2 + underTest.expandOrCollapseItem(item = nestedArray2(), expandSingleChildren = false) + + assertEquals( + Ready( + list = listOf( + jsonTreeElement( + state = TreeState.EXPANDED, + childrenState = TreeState.COLLAPSED + ), + array(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), + nestedArray1(), + nestedArray2(state = TreeState.EXPANDED), + numberPrimitive1, + numberPrimitive2, + JsonTreeElement.EndBracket( + id = "6-b", + level = 2, + isLastItem = true, + type = JsonTreeElement.EndBracket.Type.ARRAY + ), + JsonTreeElement.EndBracket( + id = "7-b", + level = 1, + isLastItem = true, + type = JsonTreeElement.EndBracket.Type.ARRAY + ), + JsonTreeElement.EndBracket( + id = "8-b", + level = 0, + isLastItem = true, + type = JsonTreeElement.EndBracket.Type.OBJECT + ), + ) + ), + underTest.state.value + ) + + // collapse array + underTest.expandOrCollapseItem( + item = array(state = TreeState.EXPANDED, childrenState = TreeState.COLLAPSED), + expandSingleChildren = false + ) + + assertEquals( + Ready( + list = listOf( + jsonTreeElement( + state = TreeState.EXPANDED, + childrenState = TreeState.COLLAPSED + ), + array(), + JsonTreeElement.EndBracket( + id = "8-b", + level = 0, + isLastItem = true, + type = JsonTreeElement.EndBracket.Type.OBJECT + ), + ) + ), + underTest.state.value + ) + + // collapse root + underTest.expandOrCollapseItem( + item = jsonTreeElement( + state = TreeState.EXPANDED, + childrenState = TreeState.COLLAPSED + ), + expandSingleChildren = false + ) + + assertEquals( + Ready(list = listOf(jsonTreeElement())), + underTest.state.value + ) + } @Test - fun `nested json - expandSingleChildren is true - expands and collapses correctly`() = runTest { + public fun `nested json - expandSingleChildren is true - expands and collapses correctly`(): TestResult = runTest { val underTest = underTest(nestedJson, TreeState.COLLAPSED) assertEquals( Ready(list = listOf(jsonTreeElement())), diff --git a/jsontree/src/androidTest/java/com/sebastianneubauer/jsontree/TestData.kt b/jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/TestData.kt similarity index 81% rename from jsontree/src/androidTest/java/com/sebastianneubauer/jsontree/TestData.kt rename to jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/TestData.kt index 46c34f4..dc37ae7 100644 --- a/jsontree/src/androidTest/java/com/sebastianneubauer/jsontree/TestData.kt +++ b/jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/TestData.kt @@ -1,6 +1,22 @@ package com.sebastianneubauer.jsontree internal val nestedJson = """ + { + "array": [ + [ + { + "string": "aString" + } + ], + [ + 42, + 52 + ] + ] + } +""".trimIndent() + +internal val nestedJson2 = """ { "topLevelObject": { "string": "stringValue", diff --git a/jsontree/src/androidTest/java/com/sebastianneubauer/jsontree/Assertions.kt b/jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/ui/Assertions.kt similarity index 52% rename from jsontree/src/androidTest/java/com/sebastianneubauer/jsontree/Assertions.kt rename to jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/ui/Assertions.kt index 9b09c27..3403f94 100644 --- a/jsontree/src/androidTest/java/com/sebastianneubauer/jsontree/Assertions.kt +++ b/jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/ui/Assertions.kt @@ -1,20 +1,23 @@ -package com.sebastianneubauer.jsontree +@file:OptIn(ExperimentalTestApi::class) +package com.sebastianneubauer.jsontree.ui + +import androidx.compose.ui.test.ComposeUiTest +import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.onNodeWithText -internal fun ComposeTestRule.assertRootArrayIsDisplayed() { +internal fun ComposeUiTest.assertRootArrayIsDisplayed() { onNodeWithText("[").assertIsDisplayed() onNodeWithText("\"stringValue\"").assertIsDisplayed() onNodeWithText("]").assertIsDisplayed() } -internal fun ComposeTestRule.assertRootStringIsDisplayed() { +internal fun ComposeUiTest.assertRootStringIsDisplayed() { onNodeWithText("\"stringValue\"").assertIsDisplayed() } -internal fun ComposeTestRule.assertEmptyObjectIsDisplayed() { +internal fun ComposeUiTest.assertEmptyObjectIsDisplayed() { onNodeWithText("{").assertIsDisplayed() onNodeWithText("}").assertIsDisplayed() } diff --git a/jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/ui/JsonTreeTest.kt b/jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/ui/JsonTreeTest.kt new file mode 100644 index 0000000..624960c --- /dev/null +++ b/jsontree/src/commonTest/kotlin/com/sebastianneubauer/jsontree/ui/JsonTreeTest.kt @@ -0,0 +1,470 @@ +@file:OptIn(ExperimentalTestApi::class) + +package com.sebastianneubauer.jsontree.ui + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.test.ComposeUiTest +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertCountEquals +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.hasTestTag +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.onAllNodesWithText +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.runComposeUiTest +import androidx.compose.ui.test.waitUntilExactlyOneExists +import com.sebastianneubauer.jsontree.EMPTY_OBJECT_JSON +import com.sebastianneubauer.jsontree.INVALID_JSON +import com.sebastianneubauer.jsontree.JsonTree +import com.sebastianneubauer.jsontree.TreeState +import com.sebastianneubauer.jsontree.arrayOfArraysJson +import com.sebastianneubauer.jsontree.nestedJson2 +import com.sebastianneubauer.jsontree.rootArrayJson +import com.sebastianneubauer.jsontree.rootStringJson +import kotlin.test.Test + +public class JsonTreeTest { + + private fun ComposeUiTest.setJson( + json: String, + initialState: TreeState = TreeState.FIRST_ITEM_EXPANDED, + ) { + setContent { + JsonTree( + json = json, + initialState = initialState, + onLoading = {}, + ) + } + } + + @Test + public fun initial_state_is_first_item_expanded(): Unit = runComposeUiTest { + setJson(nestedJson2) + + waitForIdle() + onNodeWithText("\"topLevelObject\": { 2 items },").assertIsDisplayed() + onNodeWithText("\"topLevelArray\": [ 2 items ],").assertIsDisplayed() + onNodeWithText("\"emptyObject\": { 0 items }").assertIsDisplayed() + + onNodeWithText("\"string\": \"stringValue\",").assertDoesNotExist() + onNodeWithText("\"hello\",").assertDoesNotExist() + } + + @Test + public fun initial_state_is_collapsed(): Unit = runComposeUiTest { + setJson(nestedJson2, initialState = TreeState.COLLAPSED) + + waitUntilExactlyOneExists(hasText("{ 3 items }")) + + onNodeWithText("{ 3 items }").assertIsDisplayed() + onNodeWithText("\"topLevelObject\"", substring = true).assertDoesNotExist() + } + + @Test + public fun initial_state_is_expanded(): Unit = runComposeUiTest { + setJson(nestedJson2, initialState = TreeState.EXPANDED) + + // fix flakiness by waiting until first item appears + waitUntilExactlyOneExists(hasText("\"topLevelObject\": {")) + + // every collapsable is expanded + onNodeWithText("\"topLevelObject\": {").assertIsDisplayed() + onNodeWithText("\"string\": \"stringValue\",").assertIsDisplayed() + + onNodeWithText("\"nestedObject\": {").assertIsDisplayed() + onNodeWithText("\"int\": 42,").assertIsDisplayed() + + onNodeWithText("\"nestedArray\": [").assertIsDisplayed() + onNodeWithText("\"nestedArrayValue\",").assertIsDisplayed() + onNodeWithText("\"nestedArrayValue\"").assertIsDisplayed() + + onNodeWithText("\"arrayOfObjects\": [").assertIsDisplayed() + onNodeWithText("\"anotherString\": \"anotherStringValue\"").assertIsDisplayed() + onNodeWithText("\"anotherInt\": 52").assertIsDisplayed() + + onNodeWithText("\"topLevelArray\": [").assertIsDisplayed() + onNodeWithText("\"hello\",").assertIsDisplayed() + onNodeWithText("\"emptyObject\": {").assertIsDisplayed() + } + + @Test + public fun click_on_collapsed_object_or_array_expands_it(): Unit = runComposeUiTest { + setJson(nestedJson2) + // fix flakiness by waiting until first item appears + waitUntilExactlyOneExists(hasText("\"topLevelObject\": { 2 items },")) + + onNodeWithText("\"topLevelObject\": { 2 items },").performClick() + onNodeWithText("\"topLevelObject\": {").assertIsDisplayed() + onNodeWithText("\"string\": \"stringValue\",").assertIsDisplayed() + onNodeWithText("\"nestedObject\": { 3 items }").assertIsDisplayed() + + onNodeWithText("\"topLevelArray\": [ 2 items ],").performClick() + onNodeWithText("\"topLevelArray\": [").assertIsDisplayed() + onNodeWithText("\"hello\",").assertIsDisplayed() + onNodeWithText("\"world\"").assertIsDisplayed() + } + + @Test + public fun click_on_expanded_object_or_array_collapses_it(): Unit = runComposeUiTest { + setJson(nestedJson2, initialState = TreeState.EXPANDED) + + waitForIdle() + + onNodeWithText("\"arrayOfObjects\": [").performClick() + waitForIdle() + onNodeWithText("\"arrayOfObjects\": [ 2 items ]").assertIsDisplayed() + + onNodeWithText("\"nestedObject\": {").performClick() + waitForIdle() + onNodeWithText("\"nestedObject\": { 3 items }").assertIsDisplayed() + + onNodeWithText("\"topLevelObject\": {").performClick() + waitForIdle() + onNodeWithText("\"topLevelObject\": { 2 items },").assertIsDisplayed() + } + + @Test + public fun array_of_arrays_is_rendered_correctly(): Unit = runComposeUiTest { + setJson(arrayOfArraysJson) + // fix flakiness by waiting until first item appears + waitUntilExactlyOneExists(hasText("\"array\": [ 2 items ]")) + + onNodeWithText("\"array\": [ 2 items ]").assertIsDisplayed() + onNodeWithText("\"array\": [ 2 items ]").performClick() + + waitUntilExactlyOneExists(hasText("\"array\": [")) + onNodeWithText("\"array\": [").assertIsDisplayed() + onNodeWithText("[ 1 item ],").assertIsDisplayed() + onNodeWithText("[ 2 items ]").assertIsDisplayed() + + onNodeWithText("[ 1 item ],").performClick() + onNodeWithText("[ 2 items ]").performClick() + + onNodeWithText("\"stringValue\"").assertIsDisplayed() + onNodeWithText("],").assertIsDisplayed() + onNodeWithText("42,").assertIsDisplayed() + onNodeWithText("52").assertIsDisplayed() + } + + @Test + public fun root_array_is_rendered_correctly(): Unit = runComposeUiTest { + setJson(rootArrayJson) + + assertRootArrayIsDisplayed() + } + + @Test + public fun root_string_is_rendered_correctly(): Unit = runComposeUiTest { + setJson(rootStringJson) + + assertRootStringIsDisplayed() + } + + @Test + public fun empty_object_is_rendered_correctly(): Unit = runComposeUiTest { + setJson(EMPTY_OBJECT_JSON) + waitForIdle() + assertEmptyObjectIsDisplayed() + + onNodeWithText("{").performClick() + onNodeWithText("{ 0 items }").assertIsDisplayed() + } + + @Test + public fun invalid_json_shows_an_error(): Unit = runComposeUiTest { + setContent { + Box { + var errorMessage: String? by remember { mutableStateOf(null) } + + JsonTree( + modifier = Modifier.testTag("jsonTree"), + json = INVALID_JSON, + onError = { throwable -> errorMessage = throwable.message }, + onLoading = {}, + ) + + errorMessage?.let { + Text( + modifier = Modifier.testTag("errorText"), + text = it + ) + } + } + } + + onNodeWithTag("errorText").assertIsDisplayed() + } + + @Test + public fun changing_json_is_handled_correctly(): Unit = runComposeUiTest { + setContent { + var jsonString: String by remember { mutableStateOf(rootStringJson) } + + Column { + JsonTree(json = jsonString, onLoading = {}) + + Button( + modifier = Modifier.testTag("button"), + onClick = { jsonString = rootArrayJson } + ) {} + } + } + + assertRootStringIsDisplayed() + + onNodeWithTag("button").performClick() + + assertRootArrayIsDisplayed() + } + + @Test + public fun changing_json_while_collapsed_is_handled_correctly(): Unit = runComposeUiTest { + setContent { + var jsonString: String by remember { mutableStateOf(nestedJson2) } + + Column { + JsonTree( + json = jsonString, + initialState = TreeState.COLLAPSED, + onLoading = {}, + ) + + Button( + modifier = Modifier.testTag("button"), + onClick = { jsonString = rootArrayJson } + ) {} + } + } + + onNodeWithText("{ 3 items }").assertIsDisplayed() + + onNodeWithTag("button").performClick() + + onNodeWithText("[ 1 item ]").assertIsDisplayed() + } + + @Test + public fun changing_json_from_invalid_to_valid_is_handled_correctly(): Unit = runComposeUiTest { + setContent { + var jsonString: String by remember { mutableStateOf(INVALID_JSON) } + + Column { + JsonTree( + modifier = Modifier.testTag("jsonTree"), + json = jsonString, + onLoading = {}, + ) + + Button( + modifier = Modifier.testTag("button"), + onClick = { jsonString = rootStringJson } + ) {} + } + } + + onNodeWithTag("button").performClick() + assertRootStringIsDisplayed() + } + + @Test + public fun changing_json_from_valid_to_invalid_is_handled_correctly(): Unit = runComposeUiTest { + setContent { + var jsonString: String by remember { mutableStateOf(rootStringJson) } + var errorMessage: String? by remember { mutableStateOf(null) } + + Column { + JsonTree( + modifier = Modifier.testTag("jsonTree"), + json = jsonString, + onError = { throwable -> errorMessage = throwable.message }, + onLoading = {} + ) + + Button( + modifier = Modifier.testTag("button"), + onClick = { jsonString = INVALID_JSON } + ) {} + + errorMessage?.let { + Text( + modifier = Modifier.testTag("errorText"), + text = it + ) + } + } + } + + // fix flakiness by waiting until first item appears + waitUntilExactlyOneExists(hasTestTag("jsonTree")) + + onNodeWithTag("jsonTree").assertIsDisplayed() + onNodeWithTag("errorText").assertDoesNotExist() + + onNodeWithTag("button").performClick() + + onNodeWithTag("errorText").assertIsDisplayed() + } + + @Test + public fun changing_initial_state_is_handled_correctly(): Unit = runComposeUiTest { + setContent { + var initalState: TreeState by remember { mutableStateOf(TreeState.EXPANDED) } + + Column { + JsonTree(json = arrayOfArraysJson, initialState = initalState, onLoading = {}) + + Button( + modifier = Modifier.testTag("button"), + onClick = { + initalState = when (initalState) { + TreeState.EXPANDED -> TreeState.COLLAPSED + TreeState.COLLAPSED -> TreeState.FIRST_ITEM_EXPANDED + TreeState.FIRST_ITEM_EXPANDED -> TreeState.EXPANDED + } + } + ) {} + } + } + + onNodeWithText("\"array\": [").assertIsDisplayed() + onNodeWithText("\"stringValue\"").assertIsDisplayed() + onNodeWithText("42,").assertIsDisplayed() + onNodeWithText("52").assertIsDisplayed() + + onNodeWithTag("button").performClick() + + onNodeWithText("{ 1 item }").assertIsDisplayed() + + onNodeWithTag("button").performClick() + + onNodeWithText("\"array\": [ 2 items ]").assertIsDisplayed() + } + + @Test + public fun showing_and_hiding_indices_is_handled_correctly(): Unit = runComposeUiTest { + setContent { + var showIndices: Boolean by remember { mutableStateOf(true) } + + Column { + JsonTree( + json = arrayOfArraysJson, + onLoading = {}, + showIndices = showIndices, + initialState = TreeState.EXPANDED + ) + + Button( + modifier = Modifier.testTag("button"), + onClick = { showIndices = !showIndices } + ) {} + } + } + + onNodeWithText("0: [").assertIsDisplayed() + onNodeWithText("0: \"stringValue\"").assertIsDisplayed() + onNodeWithText("1: [").assertIsDisplayed() + onNodeWithText("0: 42,").assertIsDisplayed() + onNodeWithText("1: 52").assertIsDisplayed() + + onNodeWithTag("button").performClick() + + onAllNodesWithText("[").assertCountEquals(2) + onNodeWithText("\"stringValue\"").assertIsDisplayed() + onNodeWithText("42,").assertIsDisplayed() + onNodeWithText("52").assertIsDisplayed() + } + + @Test + public fun showing_and_hiding_item_count_is_handled_correctly(): Unit = runComposeUiTest { + setContent { + var showItemCount: Boolean by remember { mutableStateOf(true) } + + Column { + JsonTree( + json = rootArrayJson, + onLoading = {}, + showItemCount = showItemCount, + initialState = TreeState.COLLAPSED + ) + + Button( + modifier = Modifier.testTag("button"), + onClick = { showItemCount = !showItemCount } + ) {} + } + } + + onNodeWithText("[ 1 item ]").assertIsDisplayed() + + onNodeWithTag("button").performClick() + + onNodeWithText("[ ... ]").assertIsDisplayed() + + onNodeWithTag("button").performClick() + + onNodeWithText("[ 1 item ]").assertIsDisplayed() + } + + @Test + public fun expanding_single_children_is_handled_correctly(): Unit = runComposeUiTest { + setContent { + JsonTree( + json = arrayOfArraysJson, + initialState = TreeState.COLLAPSED, + onLoading = {}, + expandSingleChildren = true + ) + } + waitUntilExactlyOneExists(hasText("{ 1 item }")) + onNodeWithText("{ 1 item }").performClick() + waitUntilExactlyOneExists(hasText("\"array\": [")) + // shows nested array + onNodeWithText("\"array\": [").assertIsDisplayed() + // shows collapsed contents of nested array + onNodeWithText("[ 1 item ],").assertIsDisplayed() + onNodeWithText("[ 2 items ]").assertIsDisplayed() + + // collapse root + onNodeWithText("{").performClick() + onNodeWithText("{ 1 item }").assertIsDisplayed() + } + + @Test + public fun not_expanding_single_children_is_handled_correctly(): Unit = runComposeUiTest { + setContent { + JsonTree( + json = arrayOfArraysJson, + initialState = TreeState.COLLAPSED, + onLoading = {}, + expandSingleChildren = false + ) + } + waitUntilExactlyOneExists(hasText("{ 1 item }")) + onNodeWithText("{ 1 item }").performClick() + + waitUntilExactlyOneExists(hasText("\"array\": [ 2 items ]")) + onNodeWithText("\"array\": [ 2 items ]").assertIsDisplayed() + onNodeWithText("\"array\": [ 2 items ]").performClick() + + waitForIdle() + onNodeWithText("[ 1 item ],").assertIsDisplayed() + onNodeWithText("[ 2 items ]").assertIsDisplayed() + + waitForIdle() + // collapse root + onNodeWithText("{").performClick() + onNodeWithText("{ 1 item }").assertIsDisplayed() + } +} diff --git a/jsontree/src/test/java/com/sebastianneubauer/jsontree/TestData.kt b/jsontree/src/test/java/com/sebastianneubauer/jsontree/TestData.kt deleted file mode 100644 index 58df75a..0000000 --- a/jsontree/src/test/java/com/sebastianneubauer/jsontree/TestData.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.sebastianneubauer.jsontree - -internal val nestedJson = """ - { - "array": [ - [ - { - "string": "aString" - } - ], - [ - 42, - 52 - ] - ] - } -""".trimIndent() - -internal val rootArrayJson = """ - [ - "stringValue" - ] -""".trimIndent() - -internal val rootStringJson = """ - "stringValue" -""".trimIndent() - -internal const val EMPTY_OBJECT_JSON = "{}" - -internal const val INVALID_JSON = "" diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts new file mode 100644 index 0000000..17f6c66 --- /dev/null +++ b/sample/build.gradle.kts @@ -0,0 +1,107 @@ +import org.jetbrains.compose.desktop.application.dsl.TargetFormat + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.compose) + alias(libs.plugins.compose.compiler) +} + +group = "com.sebastianneubauer.jsontreesample" +version = "1.0" + +kotlin { + androidTarget() + + jvm() + + listOf( + iosX64(), + iosArm64(), + iosSimulatorArm64() + ).forEach { + it.binaries.framework { + baseName = "jsonTreeSample" + isStatic = true + } + } + + sourceSets { + all { + languageSettings { + optIn("org.jetbrains.compose.resources.ExperimentalResourceApi") + } + } + commonMain.dependencies { + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material3) + implementation(compose.components.resources) + implementation(compose.components.uiToolingPreview) + implementation(libs.kotlinx.serialization.json) + implementation(project(":jsontree")) + } + + commonTest.dependencies { + implementation(kotlin("test")) + } + + androidMain.dependencies { + implementation(compose.uiTooling) + implementation(libs.androidx.activity.compose) + } + + jvmMain.dependencies { + implementation(compose.desktop.currentOs) + } + + + } + + //https://kotlinlang.org/docs/native-objc-interop.html#export-of-kdoc-comments-to-generated-objective-c-headers + targets.withType { + compilations["main"].compilerOptions.options.freeCompilerArgs.add("-Xexport-kdoc") + } + +} + + + +android { + namespace = "com.sebastianneubauer.jsontreesample" + compileSdk = 34 + + defaultConfig { + minSdk = 24 + } + sourceSets["main"].apply { + manifest.srcFile("src/androidMain/AndroidManifest.xml") + res.srcDirs("src/androidMain/res") + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.11" + } +} + +compose.desktop { + application { + mainClass = "MainKt" + buildTypes.release { + proguard { + configurationFiles.from("compose-desktop.pro") + } + } + nativeDistributions { + targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) + packageName = "com.sebastianneubauer.jsontreesample" + packageVersion = "1.0.0" + } + } +} diff --git a/sample/compose-desktop.pro b/sample/compose-desktop.pro new file mode 100644 index 0000000..c00d74f --- /dev/null +++ b/sample/compose-desktop.pro @@ -0,0 +1 @@ +-keep class org.sqlite.** { *; } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/sample/src/androidMain/AndroidManifest.xml similarity index 62% rename from app/src/main/AndroidManifest.xml rename to sample/src/androidMain/AndroidManifest.xml index 573c488..756d3b5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/sample/src/androidMain/AndroidManifest.xml @@ -1,7 +1,7 @@ - + + android:theme="@android:style/Theme.Material.Light.NoActionBar"> + android:launchMode="singleInstance" + android:windowSoftInputMode="adjustPan"> - diff --git a/sample/src/androidMain/kotlin/com/sebastianneubauer/jsontreesample/MainActivity.kt b/sample/src/androidMain/kotlin/com/sebastianneubauer/jsontreesample/MainActivity.kt new file mode 100644 index 0000000..f85c22a --- /dev/null +++ b/sample/src/androidMain/kotlin/com/sebastianneubauer/jsontreesample/MainActivity.kt @@ -0,0 +1,14 @@ +package com.sebastianneubauer.jsontreesample + +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge + +class MainActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: android.os.Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { App() } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sample/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to sample/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/sample/src/androidMain/res/drawable/ic_launcher_background.xml similarity index 99% rename from app/src/main/res/drawable/ic_launcher_background.xml rename to sample/src/androidMain/res/drawable/ic_launcher_background.xml index 07d5da9..e93e11a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/sample/src/androidMain/res/drawable/ic_launcher_background.xml @@ -167,4 +167,4 @@ android:pathData="M79,19L79,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> - + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to sample/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/sample/src/androidMain/res/mipmap-hdpi/ic_launcher.png b/sample/src/androidMain/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a571e60098c92c2baca8a5df62f2929cbff01b52 GIT binary patch literal 3593 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 P00000NkvXXu0mjfP=x?Y literal 0 HcmV?d00001 diff --git a/sample/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png b/sample/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..61da551c5594a1f9d26193983d2cd69189014603 GIT binary patch literal 5339 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 literal 0 HcmV?d00001 diff --git a/sample/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png b/sample/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b216f2d313cc673d8b8c4da591c174ebed52795c GIT binary patch literal 11873 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 literal 0 HcmV?d00001 diff --git a/sample/src/androidMain/res/values/strings.xml b/sample/src/androidMain/res/values/strings.xml new file mode 100644 index 0000000..93ac338 --- /dev/null +++ b/sample/src/androidMain/res/values/strings.xml @@ -0,0 +1,3 @@ + + JsonTree Sample + \ No newline at end of file diff --git a/sample/src/commonMain/composeResources/drawable/ic_cyclone.xml b/sample/src/commonMain/composeResources/drawable/ic_cyclone.xml new file mode 100644 index 0000000..f1c45b5 --- /dev/null +++ b/sample/src/commonMain/composeResources/drawable/ic_cyclone.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/sample/src/commonMain/composeResources/drawable/ic_dark_mode.xml b/sample/src/commonMain/composeResources/drawable/ic_dark_mode.xml new file mode 100644 index 0000000..0ce2444 --- /dev/null +++ b/sample/src/commonMain/composeResources/drawable/ic_dark_mode.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/sample/src/commonMain/composeResources/drawable/ic_light_mode.xml b/sample/src/commonMain/composeResources/drawable/ic_light_mode.xml new file mode 100644 index 0000000..b7331d3 --- /dev/null +++ b/sample/src/commonMain/composeResources/drawable/ic_light_mode.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/sample/src/commonMain/composeResources/drawable/ic_rotate_right.xml b/sample/src/commonMain/composeResources/drawable/ic_rotate_right.xml new file mode 100644 index 0000000..1810671 --- /dev/null +++ b/sample/src/commonMain/composeResources/drawable/ic_rotate_right.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/sample/src/commonMain/composeResources/values/strings.xml b/sample/src/commonMain/composeResources/values/strings.xml new file mode 100644 index 0000000..e5f8fdc --- /dev/null +++ b/sample/src/commonMain/composeResources/values/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/sample/src/commonMain/kotlin/App.kt b/sample/src/commonMain/kotlin/App.kt new file mode 100644 index 0000000..2ef6c25 --- /dev/null +++ b/sample/src/commonMain/kotlin/App.kt @@ -0,0 +1,199 @@ +package com.sebastianneubauer.jsontreesample + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.material3.Button +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import com.sebastianneubauer.jsontree.JsonTree +import com.sebastianneubauer.jsontree.TreeColors +import com.sebastianneubauer.jsontree.TreeState +import com.sebastianneubauer.jsontree.defaultDarkColors +import com.sebastianneubauer.jsontree.defaultLightColors +import com.sebastianneubauer.jsontreesample.ui.theme.JsonTreeTheme +import org.jetbrains.compose.ui.tooling.preview.Preview + + +@Composable +internal fun App() = JsonTreeTheme { + MainScreen() +} + +@OptIn( + ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class, ExperimentalLayoutApi::class +) +@Composable +fun MainScreen() { + + Scaffold( + modifier = Modifier.safeDrawingPadding(), + topBar = { + CenterAlignedTopAppBar( + title = { + Text( + modifier = Modifier.padding(horizontal = 16.dp), + text = "🌳 JsonTree", + style = MaterialTheme.typography.headlineMedium, + color = Color.Black + ) + }, + ) + }, + contentWindowInsets = WindowInsets(top = 60.dp), + ) { padding -> + Column( + modifier = Modifier.fillMaxSize().padding(padding) + ) { + var errorMessage: String? by remember { mutableStateOf(null) } + var json: String by remember { mutableStateOf(simpleJson) } + var colors: TreeColors by remember { mutableStateOf(defaultLightColors) } + var initialState: TreeState by remember { mutableStateOf(TreeState.FIRST_ITEM_EXPANDED) } + var showIndices: Boolean by remember { mutableStateOf(true) } + var showItemCount: Boolean by remember { mutableStateOf(true) } + var expandSingleChildren: Boolean by remember { mutableStateOf(true) } + + FlowRow { + Button(modifier = Modifier.padding(horizontal = 8.dp), onClick = { + errorMessage = null + json = when (json) { + emptyJson -> simpleJson + simpleJson -> complexJson + complexJson -> invalidJson + invalidJson -> emptyJson + else -> throw IllegalStateException("No JSON selected!") + } + }) { + Text( + text = when (json) { + simpleJson -> "Simple Json" + emptyJson -> "Empty Json" + complexJson -> "Complex Json" + invalidJson -> "Invalid Json" + else -> throw IllegalStateException("No JSON selected!") + } + ) + } + + Button(modifier = Modifier.padding(horizontal = 8.dp), onClick = { + val newState = when (initialState) { + TreeState.EXPANDED -> TreeState.COLLAPSED + TreeState.COLLAPSED -> TreeState.FIRST_ITEM_EXPANDED + TreeState.FIRST_ITEM_EXPANDED -> TreeState.EXPANDED + } + initialState = newState + }) { + Text(text = initialState.name) + } + + Button(modifier = Modifier.padding(horizontal = 8.dp), + onClick = { showIndices = !showIndices }) { + Text(text = if (showIndices) "Hide indices" else "Show indices") + } + + Button(modifier = Modifier.padding(horizontal = 8.dp), + onClick = { showItemCount = !showItemCount }) { + Text(text = if (showItemCount) "Hide item count" else "Show item count") + } + + Button(modifier = Modifier.padding(horizontal = 8.dp), onClick = { + colors = + if (colors == defaultLightColors) defaultDarkColors else defaultLightColors + }) { + Text(text = if (colors == defaultLightColors) "Light" else "Dark") + } + + Button(modifier = Modifier.padding(horizontal = 8.dp), + onClick = { expandSingleChildren = !expandSingleChildren }) { + Text(text = if (expandSingleChildren) "Expand children" else "Don't expand children") + } + } + + val pagerState = rememberPagerState(initialPage = 0, pageCount = { 3 }) + + //Pager to test leaving composition + HorizontalPager( + modifier = Modifier.fillMaxWidth().weight(1F), + state = pagerState, + verticalAlignment = Alignment.Top + ) { pageIndex -> + when (pageIndex) { + 0 -> { + val error = errorMessage + if (error != null) { + Text( + text = error, color = Color.Black + ) + } else { + JsonTree( + modifier = Modifier.fillMaxSize() + .horizontalScroll(rememberScrollState()).background( + if (colors == defaultLightColors) Color.White else Color.Black + ), + contentPadding = PaddingValues(16.dp), + json = json, + onLoading = { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Text( + text = "Loading...", + color = if (colors == defaultLightColors) Color.Black else Color.White + ) + } + }, + initialState = initialState, + colors = colors, + showIndices = showIndices, + showItemCount = showItemCount, + expandSingleChildren = expandSingleChildren, + onError = { errorMessage = it.message }, + ) + } + } + + 1 -> { + Text(text = "Page 1") + } + + 2 -> { + Text(text = "Page 2") + } + } + } + } + } +} + + +@Preview +@Composable +fun PreviewMainScreen() = JsonTreeTheme { + MainScreen() +} \ No newline at end of file diff --git a/app/src/main/java/com/sebastianneubauer/jsontreedemo/JsonStrings.kt b/sample/src/commonMain/kotlin/JsonStrings.kt similarity index 99% rename from app/src/main/java/com/sebastianneubauer/jsontreedemo/JsonStrings.kt rename to sample/src/commonMain/kotlin/JsonStrings.kt index d235a9a..5b74cdd 100644 --- a/app/src/main/java/com/sebastianneubauer/jsontreedemo/JsonStrings.kt +++ b/sample/src/commonMain/kotlin/JsonStrings.kt @@ -1,4 +1,4 @@ -package com.sebastianneubauer.jsontreedemo +package com.sebastianneubauer.jsontreesample internal val complexJson = """ { diff --git a/app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Color.kt b/sample/src/commonMain/kotlin/ui/theme/Color.kt similarity index 79% rename from app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Color.kt rename to sample/src/commonMain/kotlin/ui/theme/Color.kt index 672857d..4d63bba 100644 --- a/app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Color.kt +++ b/sample/src/commonMain/kotlin/ui/theme/Color.kt @@ -1,4 +1,4 @@ -package com.sebastianneubauer.jsontreedemo.ui.theme +package com.sebastianneubauer.jsontreesample.ui.theme import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Shape.kt b/sample/src/commonMain/kotlin/ui/theme/Shape.kt similarity index 83% rename from app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Shape.kt rename to sample/src/commonMain/kotlin/ui/theme/Shape.kt index 9bed189..12a9092 100644 --- a/app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Shape.kt +++ b/sample/src/commonMain/kotlin/ui/theme/Shape.kt @@ -1,4 +1,4 @@ -package com.sebastianneubauer.jsontreedemo.ui.theme +package com.sebastianneubauer.jsontreesample.ui.theme import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Shapes diff --git a/app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Theme.kt b/sample/src/commonMain/kotlin/ui/theme/Theme.kt similarity index 95% rename from app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Theme.kt rename to sample/src/commonMain/kotlin/ui/theme/Theme.kt index 5f399c0..3c35e58 100644 --- a/app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Theme.kt +++ b/sample/src/commonMain/kotlin/ui/theme/Theme.kt @@ -1,4 +1,4 @@ -package com.sebastianneubauer.jsontreedemo.ui.theme +package com.sebastianneubauer.jsontreesample.ui.theme import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme diff --git a/app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Type.kt b/sample/src/commonMain/kotlin/ui/theme/Type.kt similarity index 93% rename from app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Type.kt rename to sample/src/commonMain/kotlin/ui/theme/Type.kt index 5bf373a..032cf12 100644 --- a/app/src/main/java/com/sebastianneubauer/jsontreedemo/ui/theme/Type.kt +++ b/sample/src/commonMain/kotlin/ui/theme/Type.kt @@ -1,4 +1,4 @@ -package com.sebastianneubauer.jsontreedemo.ui.theme +package com.sebastianneubauer.jsontreesample.ui.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle diff --git a/sample/src/iosMain/kotlin/main.kt b/sample/src/iosMain/kotlin/main.kt new file mode 100644 index 0000000..e4d28f7 --- /dev/null +++ b/sample/src/iosMain/kotlin/main.kt @@ -0,0 +1,5 @@ +import androidx.compose.ui.window.ComposeUIViewController +import com.sebastianneubauer.jsontreesample.App +import platform.UIKit.UIViewController + +fun MainViewController(): UIViewController = ComposeUIViewController { App() } diff --git a/sample/src/jvmMain/kotlin/main.kt b/sample/src/jvmMain/kotlin/main.kt new file mode 100644 index 0000000..8ebcf1a --- /dev/null +++ b/sample/src/jvmMain/kotlin/main.kt @@ -0,0 +1,17 @@ +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.application +import androidx.compose.ui.window.rememberWindowState +import com.sebastianneubauer.jsontreesample.App +import java.awt.Dimension + +fun main() = application { + Window( + title = "JsonTree Sample", + state = rememberWindowState(width = 800.dp, height = 600.dp), + onCloseRequest = ::exitApplication, + ) { + window.minimumSize = Dimension(350, 600) + App() + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle.kts similarity index 88% rename from settings.gradle rename to settings.gradle.kts index 3818b8c..1e7ddb7 100644 --- a/settings.gradle +++ b/settings.gradle.kts @@ -13,5 +13,5 @@ dependencyResolutionManagement { } } rootProject.name = "JsonTree" -include ':app' -include ':jsontree' +include(":jsontree") +include(":sample") From 6275cf93fff91ef5b2993f154120770aa75f5657 Mon Sep 17 00:00:00 2001 From: Shreyash Kore Date: Mon, 12 Aug 2024 00:30:08 +0530 Subject: [PATCH 2/5] run apiCheck --- jsontree/api/android/jsontree.api | 44 +++++++++++++++++++++++++++++++ jsontree/api/jvm/jsontree.api | 44 +++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 jsontree/api/android/jsontree.api create mode 100644 jsontree/api/jvm/jsontree.api diff --git a/jsontree/api/android/jsontree.api b/jsontree/api/android/jsontree.api new file mode 100644 index 0000000..ab9660f --- /dev/null +++ b/jsontree/api/android/jsontree.api @@ -0,0 +1,44 @@ +public final class com/sebastianneubauer/jsontree/JsonTreeKt { + public static final fun JsonTree-xKBSf-U (Ljava/lang/String;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Lcom/sebastianneubauer/jsontree/TreeState;Landroidx/compose/foundation/layout/PaddingValues;Lcom/sebastianneubauer/jsontree/TreeColors;Landroidx/compose/ui/graphics/vector/ImageVector;FLandroidx/compose/ui/text/TextStyle;ZZZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V +} + +public final class com/sebastianneubauer/jsontree/TreeColors { + public static final field $stable I + public synthetic fun (JJJJJJJJLkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-0d7_KjU ()J + public final fun component2-0d7_KjU ()J + public final fun component3-0d7_KjU ()J + public final fun component4-0d7_KjU ()J + public final fun component5-0d7_KjU ()J + public final fun component6-0d7_KjU ()J + public final fun component7-0d7_KjU ()J + public final fun component8-0d7_KjU ()J + public final fun copy-FD3wquc (JJJJJJJJ)Lcom/sebastianneubauer/jsontree/TreeColors; + public static synthetic fun copy-FD3wquc$default (Lcom/sebastianneubauer/jsontree/TreeColors;JJJJJJJJILjava/lang/Object;)Lcom/sebastianneubauer/jsontree/TreeColors; + public fun equals (Ljava/lang/Object;)Z + public final fun getBooleanValueColor-0d7_KjU ()J + public final fun getIconColor-0d7_KjU ()J + public final fun getIndexColor-0d7_KjU ()J + public final fun getKeyColor-0d7_KjU ()J + public final fun getNullValueColor-0d7_KjU ()J + public final fun getNumberValueColor-0d7_KjU ()J + public final fun getStringValueColor-0d7_KjU ()J + public final fun getSymbolColor-0d7_KjU ()J + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/sebastianneubauer/jsontree/TreeColorsKt { + public static final fun getDefaultDarkColors ()Lcom/sebastianneubauer/jsontree/TreeColors; + public static final fun getDefaultLightColors ()Lcom/sebastianneubauer/jsontree/TreeColors; +} + +public final class com/sebastianneubauer/jsontree/TreeState : java/lang/Enum { + public static final field COLLAPSED Lcom/sebastianneubauer/jsontree/TreeState; + public static final field EXPANDED Lcom/sebastianneubauer/jsontree/TreeState; + public static final field FIRST_ITEM_EXPANDED Lcom/sebastianneubauer/jsontree/TreeState; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/sebastianneubauer/jsontree/TreeState; + public static fun values ()[Lcom/sebastianneubauer/jsontree/TreeState; +} + diff --git a/jsontree/api/jvm/jsontree.api b/jsontree/api/jvm/jsontree.api new file mode 100644 index 0000000..ab9660f --- /dev/null +++ b/jsontree/api/jvm/jsontree.api @@ -0,0 +1,44 @@ +public final class com/sebastianneubauer/jsontree/JsonTreeKt { + public static final fun JsonTree-xKBSf-U (Ljava/lang/String;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Lcom/sebastianneubauer/jsontree/TreeState;Landroidx/compose/foundation/layout/PaddingValues;Lcom/sebastianneubauer/jsontree/TreeColors;Landroidx/compose/ui/graphics/vector/ImageVector;FLandroidx/compose/ui/text/TextStyle;ZZZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V +} + +public final class com/sebastianneubauer/jsontree/TreeColors { + public static final field $stable I + public synthetic fun (JJJJJJJJLkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-0d7_KjU ()J + public final fun component2-0d7_KjU ()J + public final fun component3-0d7_KjU ()J + public final fun component4-0d7_KjU ()J + public final fun component5-0d7_KjU ()J + public final fun component6-0d7_KjU ()J + public final fun component7-0d7_KjU ()J + public final fun component8-0d7_KjU ()J + public final fun copy-FD3wquc (JJJJJJJJ)Lcom/sebastianneubauer/jsontree/TreeColors; + public static synthetic fun copy-FD3wquc$default (Lcom/sebastianneubauer/jsontree/TreeColors;JJJJJJJJILjava/lang/Object;)Lcom/sebastianneubauer/jsontree/TreeColors; + public fun equals (Ljava/lang/Object;)Z + public final fun getBooleanValueColor-0d7_KjU ()J + public final fun getIconColor-0d7_KjU ()J + public final fun getIndexColor-0d7_KjU ()J + public final fun getKeyColor-0d7_KjU ()J + public final fun getNullValueColor-0d7_KjU ()J + public final fun getNumberValueColor-0d7_KjU ()J + public final fun getStringValueColor-0d7_KjU ()J + public final fun getSymbolColor-0d7_KjU ()J + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/sebastianneubauer/jsontree/TreeColorsKt { + public static final fun getDefaultDarkColors ()Lcom/sebastianneubauer/jsontree/TreeColors; + public static final fun getDefaultLightColors ()Lcom/sebastianneubauer/jsontree/TreeColors; +} + +public final class com/sebastianneubauer/jsontree/TreeState : java/lang/Enum { + public static final field COLLAPSED Lcom/sebastianneubauer/jsontree/TreeState; + public static final field EXPANDED Lcom/sebastianneubauer/jsontree/TreeState; + public static final field FIRST_ITEM_EXPANDED Lcom/sebastianneubauer/jsontree/TreeState; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/sebastianneubauer/jsontree/TreeState; + public static fun values ()[Lcom/sebastianneubauer/jsontree/TreeState; +} + From 53bd11e43374e5cd35a2d667e2167c09b6d36987 Mon Sep 17 00:00:00 2001 From: Shreyash Kore Date: Mon, 12 Aug 2024 02:15:53 +0530 Subject: [PATCH 3/5] remove common-android.gradle; update README.md --- README.md | 21 ++++++++++----- common-android.gradle | 24 ------------------ jsontree/build.gradle.kts | 11 ++++++-- ...jsonTree.png => jsonTree-android-dark.png} | Bin screenshots/jsonTree-macos.png | Bin 0 -> 87731 bytes 5 files changed, 24 insertions(+), 32 deletions(-) delete mode 100644 common-android.gradle rename screenshots/{jsonTree.png => jsonTree-android-dark.png} (100%) create mode 100644 screenshots/jsonTree-macos.png diff --git a/README.md b/README.md index 72e814c..6d16b3f 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,20 @@ # 🌳 JsonTree -![](https://img.shields.io/maven-central/v/com.sebastianneubauer.jsontree/jsontree) ![](https://img.shields.io/badge/Kotlin-1.9.23-orange) ![](https://img.shields.io/badge/SDK-21+-brightgreen) ![](https://img.shields.io/badge/Android_Weekly-Issue_584-yellow) +![](https://img.shields.io/maven-central/v/com.sebastianneubauer.jsontree/jsontree) ![](https://img.shields.io/badge/Kotlin-2.0.0-orange) ![](https://img.shields.io/badge/SDK-21+-brightgreen) ![](https://img.shields.io/badge/Android_Weekly-Issue_584-yellow)

-JsonTree is an Android library to display JSON data in Compose with syntax highlighting and more. +JsonTree is a Compose Multiplatform library to display JSON data in Compose with syntax highlighting and more.

- +

+ + ## About -JsonTree is an Android library to display formatted JSON data in Compose. +JsonTree is an Compose Multiplatform library to display formatted JSON data in Compose. Users can expand/collapse objects and arrays, which can also display additional info like item counts and item indices for arrays. JsonTree offers several customizations for visual appearance like syntax highlighting, text style and icons. @@ -20,6 +22,13 @@ JsonTree offers several customizations for visual appearance like syntax highlig See `maven-central` tag at the top for the latest version. +```kotlin +dependencies { + // add this to commonMain in a multiplatform project + implementation("com.sebastianneubauer.jsontree:jsontree:latest-version") +} +``` + ```groovy dependencies { implementation 'com.sebastianneubauer.jsontree:jsontree:latest-version' @@ -65,7 +74,7 @@ JsonTree( // The size of the arrow icon iconSize = 20.dp, // The TextStyle to use for the json tree - textStyle = TextStyle(...), + textStyle = TextStyle(/*...*/), // If true, then array items will show their index. showIndices = false, // If true, then arrays and objects will show the amount of child items when collapsed. @@ -74,7 +83,7 @@ JsonTree( // until there are none or multiple on a level. expandSingleChildren = false, // A callback method which is called when the provided json data can't be parsed. - onError = { throwable -> /* Do something */ } + onError = { throwable: Throwable -> /* Do something */ } ) ``` diff --git a/common-android.gradle b/common-android.gradle deleted file mode 100644 index ff19a36..0000000 --- a/common-android.gradle +++ /dev/null @@ -1,24 +0,0 @@ -android { - namespace = 'com.sebastianneubauer.jsontree' - - compileSdk libs.versions.android.target.get().toInteger() - - defaultConfig { - minSdk libs.versions.android.min.get().toInteger() - targetSdk libs.versions.android.target.get().toInteger() - - aarMetadata { - minCompileSdk = libs.versions.android.min.get().toInteger() - } - } - - buildFeatures { - buildConfig = false - } -} - -kotlin{ - jvmToolchain { - languageVersion.set(JavaLanguageVersion.of(libs.versions.java.toolchain.get())) - } -} \ No newline at end of file diff --git a/jsontree/build.gradle.kts b/jsontree/build.gradle.kts index e50ca46..167929b 100644 --- a/jsontree/build.gradle.kts +++ b/jsontree/build.gradle.kts @@ -12,8 +12,6 @@ plugins { alias(libs.plugins.publish) } -//apply(from = "${rootProject.projectDir}/common-android.gradle") - kotlin { jvm() androidTarget { @@ -41,6 +39,11 @@ kotlin { compilerOptions { freeCompilerArgs.addAll("-Xexplicit-api=strict", "-Xjvm-default=all", "-opt-in=kotlin.RequiresOptIn") } + + jvmToolchain { + languageVersion.set(JavaLanguageVersion.of(libs.versions.java.toolchain.get())) + } + sourceSets { val commonMain by getting { dependencies { @@ -93,11 +96,15 @@ android { namespace = "com.sebastianneubauer.jsontree" compileSdk = libs.versions.android.compileSdk.get().toInt() buildFeatures { + buildConfig = false compose = true } defaultConfig { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" minSdk = libs.versions.android.minSdk.get().toInt() + aarMetadata { + minCompileSdk = libs.versions.android.minSdk.get().toInt() + } } } diff --git a/screenshots/jsonTree.png b/screenshots/jsonTree-android-dark.png similarity index 100% rename from screenshots/jsonTree.png rename to screenshots/jsonTree-android-dark.png diff --git a/screenshots/jsonTree-macos.png b/screenshots/jsonTree-macos.png new file mode 100644 index 0000000000000000000000000000000000000000..adfa4b5e6495fbcc88b1251663080f29d6fce3b5 GIT binary patch literal 87731 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

nET0 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%0DhPJCLA`LvyQ_L6T{A%Me_ce3D~3Hb$0%kPw; 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

&0`1NpN&QOm9}z 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 literal 0 HcmV?d00001 From 1cfc948ce4ef57c4fff35b11efaa7385dc84868b Mon Sep 17 00:00:00 2001 From: Shreyash Kore Date: Mon, 26 Aug 2024 04:27:12 +0530 Subject: [PATCH 4/5] cleanup --- README.md | 6 ------ gradle/libs.versions.toml | 5 ++--- jsontree/build.gradle.kts | 1 - .../com/sebastianneubauer/jsontree/JsonTreeParser.kt | 2 +- .../composeResources/drawable/ic_cyclone.xml | 12 ------------ .../composeResources/drawable/ic_dark_mode.xml | 9 --------- .../composeResources/drawable/ic_light_mode.xml | 9 --------- .../composeResources/drawable/ic_rotate_right.xml | 10 ---------- .../commonMain/composeResources/values/strings.xml | 2 -- 9 files changed, 3 insertions(+), 53 deletions(-) delete mode 100644 sample/src/commonMain/composeResources/drawable/ic_cyclone.xml delete mode 100644 sample/src/commonMain/composeResources/drawable/ic_dark_mode.xml delete mode 100644 sample/src/commonMain/composeResources/drawable/ic_light_mode.xml delete mode 100644 sample/src/commonMain/composeResources/drawable/ic_rotate_right.xml delete mode 100644 sample/src/commonMain/composeResources/values/strings.xml diff --git a/README.md b/README.md index 6d16b3f..067e602 100644 --- a/README.md +++ b/README.md @@ -29,12 +29,6 @@ dependencies { } ``` -```groovy -dependencies { - implementation 'com.sebastianneubauer.jsontree:jsontree:latest-version' -} -``` - ## How to use Add `JsonTree` to your Compose UI and customize it with the following options. Get started by only providing your JSON data and a Composable for the initial loading. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fb0dc6f..d2f55a8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -android-minSdk = "24" +android-minSdk = "21" android-compileSdk = "34" java-toolchain = "17" @@ -15,7 +15,7 @@ atomicfuGradlePlugin = "0.22.0" androidx-activity-compose = "1.9.1" kotlinx-serialization-json = "1.7.1" -kotlinx-coroutines = "1.9.0-RC" +kotlinx-coroutines = "1.8.1" junit = "4.13.2" detekt = "1.23.6" @@ -23,7 +23,6 @@ detekt = "1.23.6" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } -nexus-publish = { module = "io.github.gradle-nexus.publish-plugin:io.github.gradle-nexus.publish-plugin.gradle.plugin", version.ref = "nexus-publish" } androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" } kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } diff --git a/jsontree/build.gradle.kts b/jsontree/build.gradle.kts index 167929b..6e57616 100644 --- a/jsontree/build.gradle.kts +++ b/jsontree/build.gradle.kts @@ -8,7 +8,6 @@ plugins { alias(libs.plugins.compose) alias(libs.plugins.compose.compiler) id("kotlinx-atomicfu") -// id("module.publication") alias(libs.plugins.publish) } diff --git a/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeParser.kt b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeParser.kt index 4eb1d27..d82c722 100644 --- a/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeParser.kt +++ b/jsontree/src/commonMain/kotlin/com/sebastianneubauer/jsontree/JsonTreeParser.kt @@ -30,7 +30,7 @@ internal class JsonTreeParser( private var parserState = mutableStateOf(Loading) val state: State = parserState - suspend inline fun init(initialState: TreeState) = withContext(defaultDispatcher) { + suspend fun init(initialState: TreeState) = withContext(defaultDispatcher) { val parsingState = runCatching { Parsed(Json.parseToJsonElement(json)) }.getOrElse { throwable -> diff --git a/sample/src/commonMain/composeResources/drawable/ic_cyclone.xml b/sample/src/commonMain/composeResources/drawable/ic_cyclone.xml deleted file mode 100644 index f1c45b5..0000000 --- a/sample/src/commonMain/composeResources/drawable/ic_cyclone.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - \ No newline at end of file diff --git a/sample/src/commonMain/composeResources/drawable/ic_dark_mode.xml b/sample/src/commonMain/composeResources/drawable/ic_dark_mode.xml deleted file mode 100644 index 0ce2444..0000000 --- a/sample/src/commonMain/composeResources/drawable/ic_dark_mode.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/sample/src/commonMain/composeResources/drawable/ic_light_mode.xml b/sample/src/commonMain/composeResources/drawable/ic_light_mode.xml deleted file mode 100644 index b7331d3..0000000 --- a/sample/src/commonMain/composeResources/drawable/ic_light_mode.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/sample/src/commonMain/composeResources/drawable/ic_rotate_right.xml b/sample/src/commonMain/composeResources/drawable/ic_rotate_right.xml deleted file mode 100644 index 1810671..0000000 --- a/sample/src/commonMain/composeResources/drawable/ic_rotate_right.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/sample/src/commonMain/composeResources/values/strings.xml b/sample/src/commonMain/composeResources/values/strings.xml deleted file mode 100644 index e5f8fdc..0000000 --- a/sample/src/commonMain/composeResources/values/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file From 88d5a431a9449832d1f51f949b5961840f3ed243 Mon Sep 17 00:00:00 2001 From: Shreyash Kore Date: Wed, 28 Aug 2024 21:33:17 +0530 Subject: [PATCH 5/5] add iosApp module; add run configuration for iosApp --- .idea/runConfigurations/iosApp.xml | 7 + iosApp/Configuration/Config.xcconfig | 3 + iosApp/iosApp.xcodeproj/project.pbxproj | 393 ++++++++++++++++++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 14 + .../AppIcon.appiconset/app-icon-1024.png | Bin 0 -> 67285 bytes iosApp/iosApp/Assets.xcassets/Contents.json | 6 + iosApp/iosApp/ContentView.swift | 21 + iosApp/iosApp/Info.plist | 50 +++ .../Preview Assets.xcassets/Contents.json | 6 + iosApp/iosApp/iOSApp.swift | 10 + sample/build.gradle.kts | 2 +- 12 files changed, 522 insertions(+), 1 deletion(-) create mode 100644 .idea/runConfigurations/iosApp.xml create mode 100644 iosApp/Configuration/Config.xcconfig create mode 100644 iosApp/iosApp.xcodeproj/project.pbxproj create mode 100644 iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png create mode 100644 iosApp/iosApp/Assets.xcassets/Contents.json create mode 100644 iosApp/iosApp/ContentView.swift create mode 100644 iosApp/iosApp/Info.plist create mode 100644 iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 iosApp/iosApp/iOSApp.swift diff --git a/.idea/runConfigurations/iosApp.xml b/.idea/runConfigurations/iosApp.xml new file mode 100644 index 0000000..296ddc1 --- /dev/null +++ b/.idea/runConfigurations/iosApp.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/iosApp/Configuration/Config.xcconfig b/iosApp/Configuration/Config.xcconfig new file mode 100644 index 0000000..76674b4 --- /dev/null +++ b/iosApp/Configuration/Config.xcconfig @@ -0,0 +1,3 @@ +TEAM_ID= +BUNDLE_ID=com.sebastianneubauer.jsontreesample.KotlinProject +APP_NAME=KotlinProject \ No newline at end of file diff --git a/iosApp/iosApp.xcodeproj/project.pbxproj b/iosApp/iosApp.xcodeproj/project.pbxproj new file mode 100644 index 0000000..42f290d --- /dev/null +++ b/iosApp/iosApp.xcodeproj/project.pbxproj @@ -0,0 +1,393 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557BA273AAA24004C7B11 /* Assets.xcassets */; }; + 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */; }; + 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2152FB032600AC8F00CF470E /* iOSApp.swift */; }; + 7555FF83242A565900829871 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF82242A565900829871 /* ContentView.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 058557BA273AAA24004C7B11 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 2152FB032600AC8F00CF470E /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; }; + 7555FF7B242A565900829871 /* KotlinProject.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KotlinProject.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7555FF82242A565900829871 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + AB3632DC29227652001CCB65 /* Config.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B92378962B6B1156000C7307 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 058557D7273AAEEB004C7B11 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 42799AB246E5F90AF97AA0EF /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + 7555FF72242A565900829871 = { + isa = PBXGroup; + children = ( + AB1DB47929225F7C00F7AF9C /* Configuration */, + 7555FF7D242A565900829871 /* iosApp */, + 7555FF7C242A565900829871 /* Products */, + 42799AB246E5F90AF97AA0EF /* Frameworks */, + ); + sourceTree = ""; + }; + 7555FF7C242A565900829871 /* Products */ = { + isa = PBXGroup; + children = ( + 7555FF7B242A565900829871 /* KotlinProject.app */, + ); + name = Products; + sourceTree = ""; + }; + 7555FF7D242A565900829871 /* iosApp */ = { + isa = PBXGroup; + children = ( + 058557BA273AAA24004C7B11 /* Assets.xcassets */, + 7555FF82242A565900829871 /* ContentView.swift */, + 7555FF8C242A565B00829871 /* Info.plist */, + 2152FB032600AC8F00CF470E /* iOSApp.swift */, + 058557D7273AAEEB004C7B11 /* Preview Content */, + ); + path = iosApp; + sourceTree = ""; + }; + AB1DB47929225F7C00F7AF9C /* Configuration */ = { + isa = PBXGroup; + children = ( + AB3632DC29227652001CCB65 /* Config.xcconfig */, + ); + path = Configuration; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7555FF7A242A565900829871 /* iosApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */; + buildPhases = ( + F36B1CEB2AD83DDC00CB74D5 /* Compile Kotlin Framework */, + 7555FF77242A565900829871 /* Sources */, + B92378962B6B1156000C7307 /* Frameworks */, + 7555FF79242A565900829871 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iosApp; + packageProductDependencies = ( + ); + productName = iosApp; + productReference = 7555FF7B242A565900829871 /* KotlinProject.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7555FF73242A565900829871 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 1130; + LastUpgradeCheck = 1540; + ORGANIZATIONNAME = orgName; + TargetAttributes = { + 7555FF7A242A565900829871 = { + CreatedOnToolsVersion = 11.3.1; + }; + }; + }; + buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7555FF72242A565900829871; + packageReferences = ( + ); + productRefGroup = 7555FF7C242A565900829871 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7555FF7A242A565900829871 /* iosApp */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7555FF79242A565900829871 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */, + 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + F36B1CEB2AD83DDC00CB74D5 /* Compile Kotlin Framework */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Compile Kotlin Framework"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\ncd \"$SRCROOT/..\"\n./gradlew :sample:embedAndSignAppleFrameworkForXcode\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7555FF77242A565900829871 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */, + 7555FF83242A565900829871 /* ContentView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 7555FFA3242A565B00829871 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AB3632DC29227652001CCB65 /* Config.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + 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_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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 = 15.3; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 7555FFA4242A565B00829871 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AB3632DC29227652001CCB65 /* Config.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + 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 = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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 = 15.3; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7555FFA6242A565B00829871 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; + DEVELOPMENT_TEAM = "${TEAM_ID}"; + ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)\n$(SRCROOT)/../sample/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)", + ); + INFOPLIST_FILE = iosApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_ID}${TEAM_ID}"; + PRODUCT_NAME = "${APP_NAME}"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 7555FFA7242A565B00829871 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; + DEVELOPMENT_TEAM = "${TEAM_ID}"; + ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)\n$(SRCROOT)/../sample/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)", + ); + INFOPLIST_FILE = iosApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_ID}${TEAM_ID}"; + PRODUCT_NAME = "${APP_NAME}"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7555FFA3242A565B00829871 /* Debug */, + 7555FFA4242A565B00829871 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7555FFA6242A565B00829871 /* Debug */, + 7555FFA7242A565B00829871 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 7555FF73242A565900829871 /* Project object */; +} \ No newline at end of file diff --git a/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..ee7e3ca --- /dev/null +++ b/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} \ No newline at end of file diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..8edf56e --- /dev/null +++ b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "app-icon-1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..53fc536fb9ac5c1dbb27c7e1da13db3760070a11 GIT binary patch literal 67285 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 BXNCX( literal 0 HcmV?d00001 diff --git a/iosApp/iosApp/Assets.xcassets/Contents.json b/iosApp/iosApp/Assets.xcassets/Contents.json new file mode 100644 index 0000000..4aa7c53 --- /dev/null +++ b/iosApp/iosApp/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} \ No newline at end of file diff --git a/iosApp/iosApp/ContentView.swift b/iosApp/iosApp/ContentView.swift new file mode 100644 index 0000000..ab75edd --- /dev/null +++ b/iosApp/iosApp/ContentView.swift @@ -0,0 +1,21 @@ +import UIKit +import SwiftUI +import Sample + +struct ComposeView: UIViewControllerRepresentable { + func makeUIViewController(context: Context) -> UIViewController { + MainKt.MainViewController() + } + + func updateUIViewController(_ uiViewController: UIViewController, context: Context) {} +} + +struct ContentView: View { + var body: some View { + ComposeView() + .ignoresSafeArea(.keyboard) // Compose has own keyboard handler + } +} + + + diff --git a/iosApp/iosApp/Info.plist b/iosApp/iosApp/Info.plist new file mode 100644 index 0000000..412e378 --- /dev/null +++ b/iosApp/iosApp/Info.plist @@ -0,0 +1,50 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UILaunchScreen + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..4aa7c53 --- /dev/null +++ b/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} \ No newline at end of file diff --git a/iosApp/iosApp/iOSApp.swift b/iosApp/iosApp/iOSApp.swift new file mode 100644 index 0000000..d83dca6 --- /dev/null +++ b/iosApp/iosApp/iOSApp.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct iOSApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} \ No newline at end of file diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 17f6c66..a9b1c7d 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -21,7 +21,7 @@ kotlin { iosSimulatorArm64() ).forEach { it.binaries.framework { - baseName = "jsonTreeSample" + baseName = "Sample" isStatic = true } }