Skip to content

Commit 631485b

Browse files
committed
- introduce new API to load the libs on multiplatform targets
- FIX #999
1 parent 28de537 commit 631485b

7 files changed

Lines changed: 101 additions & 45 deletions

File tree

README.md

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -222,15 +222,22 @@ implementation "com.mikepenz:aboutlibraries-compose-m3:${latestAboutLibsRelease}
222222
### Usage
223223

224224
```kotlin
225-
// android
225+
// android (when using the default resource location
226226
LibrariesContainer(
227227
Modifier.fillMaxSize()
228228
)
229229

230-
// compose-desktop
231-
LibrariesContainer(useResource("aboutlibraries.json") {
232-
it.bufferedReader().readText()
233-
}, Modifier.fillMaxSize())
230+
// compose resource API
231+
val libraries by rememberLibraries {
232+
Res.readBytes("files/aboutlibraries.json").decodeToString()
233+
}
234+
235+
// compose manually
236+
val libraries by rememberLibraries {
237+
useResource("aboutlibraries.json") { res -> res.bufferedReader().readText() }
238+
}
239+
240+
LibrariesContainer(libraries, Modifier.fillMaxSize())
234241
```
235242

236243
<details><summary><b>Compose-jb</b></summary>

aboutlibraries-compose-m2/src/commonMain/kotlin/com/mikepenz/aboutlibraries/ui/compose/Libraries.kt

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ import androidx.compose.foundation.lazy.LazyListState
66
import androidx.compose.foundation.lazy.rememberLazyListState
77
import androidx.compose.material.Text
88
import androidx.compose.runtime.Composable
9+
import androidx.compose.runtime.State
10+
import androidx.compose.runtime.produceState
911
import androidx.compose.ui.Modifier
1012
import androidx.compose.ui.unit.Dp
1113
import androidx.compose.ui.unit.dp
1214
import com.mikepenz.aboutlibraries.Libs
1315
import com.mikepenz.aboutlibraries.entity.Library
16+
import kotlinx.coroutines.Dispatchers
17+
import kotlinx.coroutines.withContext
1418

1519
/**
1620
* Displays all provided libraries in a simple list.
@@ -32,8 +36,7 @@ fun LibrariesContainer(
3236
onLibraryClick: ((Library) -> Unit)? = null,
3337
) {
3438
val libs = Libs.Builder().withJson(aboutLibsJson).build()
35-
LibrariesContainer(
36-
libs,
39+
LibrariesContainer(libs,
3740
modifier = modifier,
3841
lazyListState = lazyListState,
3942
contentPadding = contentPadding,
@@ -48,8 +51,7 @@ fun LibrariesContainer(
4851
onLibraryClick = onLibraryClick,
4952
licenseDialogBody = { library ->
5053
Text(library.licenses.firstOrNull()?.licenseContent ?: "")
51-
}
52-
)
54+
})
5355
}
5456

5557
/**
@@ -73,8 +75,7 @@ fun LibrariesContainer(
7375
) {
7476
val libs = librariesBlock()
7577

76-
LibrariesContainer(
77-
libs,
78+
LibrariesContainer(libs,
7879
modifier,
7980
lazyListState,
8081
contentPadding,
@@ -89,7 +90,33 @@ fun LibrariesContainer(
8990
onLibraryClick,
9091
licenseDialogBody = { library ->
9192
Text(library.licenses.firstOrNull()?.licenseContent ?: "")
92-
}
93-
)
93+
})
94+
}
9495

95-
}
96+
/**
97+
* Creates a State<Libs?> that holds the [Libs] as loaded by the [libraries].
98+
*
99+
* @see Libs
100+
*/
101+
@Composable
102+
fun rememberLibraries(
103+
libraries: ByteArray,
104+
): State<Libs?> = rememberLibraries {
105+
libraries.decodeToString()
106+
}
107+
108+
/**
109+
* Creates a State<Libs?> that holds the [Libs] as loaded by the [block].
110+
*
111+
* @see Libs
112+
*/
113+
@Composable
114+
fun rememberLibraries(
115+
block: suspend () -> String,
116+
): State<Libs?> {
117+
return produceState<Libs?>(initialValue = null) {
118+
value = withContext(Dispatchers.Default) {
119+
Libs.Builder().withJson(block()).build()
120+
}
121+
}
122+
}

aboutlibraries-compose-m3/src/commonMain/kotlin/com/mikepenz/aboutlibraries/ui/compose/m3/Libraries.kt

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ import androidx.compose.foundation.lazy.LazyListState
66
import androidx.compose.foundation.lazy.rememberLazyListState
77
import androidx.compose.material3.Text
88
import androidx.compose.runtime.Composable
9+
import androidx.compose.runtime.State
10+
import androidx.compose.runtime.produceState
911
import androidx.compose.ui.Modifier
1012
import androidx.compose.ui.unit.Dp
1113
import androidx.compose.ui.unit.dp
1214
import com.mikepenz.aboutlibraries.Libs
1315
import com.mikepenz.aboutlibraries.entity.Library
16+
import kotlinx.coroutines.Dispatchers
17+
import kotlinx.coroutines.withContext
1418

1519
/**
1620
* Displays all provided libraries in a simple list.
@@ -91,5 +95,34 @@ fun LibrariesContainer(
9195
Text(library.licenses.firstOrNull()?.licenseContent ?: "")
9296
}
9397
)
98+
}
99+
100+
/**
101+
* Creates a State<Libs?> that holds the [Libs] as loaded by the [libraries].
102+
*
103+
* @see Libs
104+
*/
105+
@Composable
106+
fun rememberLibraries(
107+
libraries: ByteArray,
108+
): State<Libs?> = rememberLibraries {
109+
libraries.decodeToString()
110+
}
94111

95-
}
112+
/**
113+
* Creates a State<Libs?> that holds the [Libs] as loaded by the [block].
114+
*
115+
* @see Libs
116+
*/
117+
@Composable
118+
fun rememberLibraries(
119+
block: suspend () -> String,
120+
): State<Libs?> {
121+
return produceState<Libs?>(initialValue = null) {
122+
value = withContext(Dispatchers.Default) {
123+
Libs.Builder()
124+
.withJson(block())
125+
.build()
126+
}
127+
}
128+
}

app-desktop/src/main/kotlin/m3/main.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ import androidx.compose.material3.ExperimentalMaterial3Api
66
import androidx.compose.material3.Scaffold
77
import androidx.compose.material3.Text
88
import androidx.compose.material3.TopAppBar
9+
import androidx.compose.runtime.getValue
910
import androidx.compose.ui.Modifier
1011
import androidx.compose.ui.res.useResource
1112
import androidx.compose.ui.window.Window
1213
import androidx.compose.ui.window.application
1314
import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer
15+
import com.mikepenz.aboutlibraries.ui.compose.m3.rememberLibraries
1416

1517
@OptIn(ExperimentalMaterial3Api::class)
1618
fun main() = application {
@@ -19,9 +21,10 @@ fun main() = application {
1921
Scaffold(
2022
topBar = { TopAppBar(title = { Text("AboutLibraries Compose M3 Desktop Sample") }) }
2123
) {
22-
LibrariesContainer(useResource("aboutlibraries.json") {
23-
it.bufferedReader().readText()
24-
}, Modifier.fillMaxSize().padding(it))
24+
val libraries by rememberLibraries {
25+
useResource("aboutlibraries.json") { res -> res.bufferedReader().readText() }
26+
}
27+
LibrariesContainer(libraries, Modifier.fillMaxSize().padding(it))
2528
}
2629
}
2730
}

app-desktop/src/main/kotlin/main.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import androidx.compose.foundation.layout.fillMaxSize
22
import androidx.compose.material.Scaffold
33
import androidx.compose.material.Text
44
import androidx.compose.material.TopAppBar
5+
import androidx.compose.runtime.getValue
56
import androidx.compose.ui.Modifier
67
import androidx.compose.ui.res.useResource
78
import androidx.compose.ui.window.Window
89
import androidx.compose.ui.window.application
910
import com.mikepenz.aboutlibraries.ui.compose.LibrariesContainer
11+
import com.mikepenz.aboutlibraries.ui.compose.rememberLibraries
1012
import m2.SampleTheme
1113

1214
fun main() = application {
@@ -15,9 +17,10 @@ fun main() = application {
1517
Scaffold(
1618
topBar = { TopAppBar(title = { Text("AboutLibraries Compose Desktop Sample") }) }
1719
) {
18-
LibrariesContainer(useResource("aboutlibraries.json") {
19-
it.bufferedReader().readText()
20-
}, Modifier.fillMaxSize())
20+
val libraries by rememberLibraries {
21+
useResource("aboutlibraries.json") { res -> res.bufferedReader().readText() }
22+
}
23+
LibrariesContainer(libraries, Modifier.fillMaxSize())
2124
}
2225
}
2326
}

app-wasm/src/wasmJsMain/kotlin/Main.kt

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,19 @@ import androidx.compose.foundation.layout.fillMaxSize
22
import androidx.compose.material.Scaffold
33
import androidx.compose.material.Text
44
import androidx.compose.material.TopAppBar
5+
import androidx.compose.runtime.getValue
56
import androidx.compose.runtime.mutableStateOf
6-
import androidx.compose.runtime.produceState
77
import androidx.compose.runtime.remember
88
import androidx.compose.ui.ExperimentalComposeUiApi
99
import androidx.compose.ui.Modifier
1010
import androidx.compose.ui.platform.LocalUriHandler
1111
import androidx.compose.ui.window.CanvasBasedWindow
12-
import com.mikepenz.aboutlibraries.Libs
1312
import com.mikepenz.aboutlibraries.entity.Library
1413
import com.mikepenz.aboutlibraries.ui.compose.LibrariesContainer
1514
import com.mikepenz.aboutlibraries.ui.compose.LicenseDialog
15+
import com.mikepenz.aboutlibraries.ui.compose.rememberLibraries
1616
import com.mikepenz.aboutlibraries.ui.compose.util.htmlReadyLicenseContent
1717
import com.mikepenz.app_wasm.generated.resources.Res
18-
import kotlinx.coroutines.Dispatchers
19-
import kotlinx.coroutines.withContext
2018
import org.jetbrains.compose.resources.ExperimentalResourceApi
2119

2220
@OptIn(ExperimentalComposeUiApi::class, ExperimentalResourceApi::class)
@@ -26,19 +24,14 @@ fun main() {
2624
Scaffold(
2725
topBar = { TopAppBar(title = { Text("AboutLibraries Compose Desktop Sample") }) }
2826
) {
29-
val libraries = produceState<Libs?>(null) {
30-
value = withContext(Dispatchers.Default) {
31-
Libs.Builder()
32-
.withJson(Res.readBytes("files/aboutlibraries.json").decodeToString())
33-
.build()
34-
}
27+
val libraries by rememberLibraries {
28+
Res.readBytes("files/aboutlibraries.json").decodeToString()
3529
}
36-
3730
val uriHandler = LocalUriHandler.current
3831
val openDialog = remember { mutableStateOf<Library?>(null) }
3932

4033
LibrariesContainer(
41-
libraries.value,
34+
libraries,
4235
Modifier.fillMaxSize(),
4336
onLibraryClick = { library ->
4437
val license = library.licenses.firstOrNull()

app/src/main/java/com/mikepenz/aboutlibraries/sample/ComposeActivity.kt

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.mikepenz.aboutlibraries.sample
33
import android.os.Bundle
44
import androidx.activity.ComponentActivity
55
import androidx.activity.compose.setContent
6+
import androidx.activity.enableEdgeToEdge
67
import androidx.compose.foundation.ExperimentalFoundationApi
78
import androidx.compose.foundation.background
89
import androidx.compose.foundation.isSystemInDarkTheme
@@ -28,33 +29,22 @@ import androidx.compose.material.icons.filled.List
2829
import androidx.compose.material.icons.filled.Person
2930
import androidx.compose.material.lightColors
3031
import androidx.compose.runtime.Composable
31-
import androidx.compose.runtime.SideEffect
3232
import androidx.compose.runtime.getValue
3333
import androidx.compose.runtime.mutableStateOf
3434
import androidx.compose.runtime.remember
3535
import androidx.compose.runtime.setValue
3636
import androidx.compose.ui.Alignment
3737
import androidx.compose.ui.Modifier
38-
import androidx.compose.ui.graphics.Color
3938
import androidx.compose.ui.unit.dp
40-
import androidx.core.view.WindowCompat
41-
import com.google.accompanist.systemuicontroller.rememberSystemUiController
4239
import com.mikepenz.aboutlibraries.ui.compose.LibrariesContainer
4340

4441
class ComposeActivity : ComponentActivity() {
4542

4643
override fun onCreate(savedInstanceState: Bundle?) {
4744
super.onCreate(savedInstanceState)
48-
49-
WindowCompat.setDecorFitsSystemWindows(window, false)
45+
enableEdgeToEdge()
5046

5147
setContent {
52-
// Update the system bars to be translucent
53-
val systemUiController = rememberSystemUiController()
54-
SideEffect {
55-
systemUiController.setSystemBarsColor(Color.Transparent, darkIcons = false)
56-
}
57-
5848
MainLayout()
5949
}
6050
}

0 commit comments

Comments
 (0)