Skip to content

Commit 80d2bd4

Browse files
authored
Merge pull request #26 from fethij/feature_download_images
Feature download images
2 parents e8d42cb + f828da5 commit 80d2bd4

File tree

93 files changed

+2364
-219
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+2364
-219
lines changed

.idea/kotlinc.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build-logic/convention/src/main/kotlin/com/tewelde/rijksmuseum/KotlinMultiplatform.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import org.gradle.api.Project
44
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
55
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
66
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
7-
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl
87

8+
@OptIn(org.jetbrains.kotlin.gradle.ExperimentalWasmDsl::class)
99
internal fun Project.configureKotlinMultiplatform(
1010
extension: KotlinMultiplatformExtension
1111
) = extension.apply {
@@ -20,7 +20,6 @@ internal fun Project.configureKotlinMultiplatform(
2020

2121
jvm("desktop")
2222

23-
@OptIn(ExperimentalWasmDsl::class)
2423
wasmJs { browser() }
2524

2625
listOf(iosArm64(), iosSimulatorArm64())
@@ -33,6 +32,7 @@ internal fun Project.configureKotlinMultiplatform(
3332
implementation(libs.findLibrary("kotlinx.coroutines.core").get())
3433
api(libs.findLibrary("koin.core").get())
3534
implementation(libs.findLibrary("kermit").get())
35+
implementation(libs.findLibrary("arrow.core").get())
3636
}
3737

3838
androidMain {

composeApp/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ kotlin {
7575
implementation(libs.ktor.client.core)
7676
implementation(libs.coil.compose)
7777
implementation(libs.coil.network.ktor)
78+
79+
implementation(libs.filekit.core)
7880
}
7981

8082
desktopMain.dependencies {

composeApp/src/androidMain/AndroidManifest.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools">
34

45
<uses-permission android:name="android.permission.INTERNET" />
6+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
7+
android:maxSdkVersion="28"
8+
tools:ignore="ScopedStorage" />
59

610
<application
711
android:name=".RijksmuseumApplication"

composeApp/src/androidMain/kotlin/com/tewelde/rijksmuseum/MainActivity.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.tewelde.rijksmuseum
22

3+
import android.app.Activity
34
import android.graphics.Color
45
import android.os.Bundle
56
import androidx.activity.ComponentActivity
@@ -9,15 +10,33 @@ import androidx.activity.enableEdgeToEdge
910
import androidx.compose.runtime.Composable
1011
import androidx.compose.ui.tooling.preview.Preview
1112
import androidx.core.view.WindowCompat
13+
import com.tewelde.rijksmuseum.di.appModule
14+
import io.github.vinceglb.filekit.core.FileKit
15+
import org.koin.android.ext.koin.androidContext
16+
import org.koin.android.ext.koin.androidLogger
17+
import org.koin.core.context.startKoin
18+
import org.koin.dsl.module
1219

1320
class MainActivity : ComponentActivity() {
1421
override fun onCreate(savedInstanceState: Bundle?) {
1522
super.onCreate(savedInstanceState)
23+
startKoin {
24+
androidLogger()
25+
androidContext(applicationContext)
26+
modules(
27+
appModule,
28+
module {
29+
single<Activity> { this@MainActivity }
30+
}
31+
)
32+
}
33+
1634
enableEdgeToEdge(
1735
statusBarStyle = SystemBarStyle.light(Color.TRANSPARENT, Color.TRANSPARENT),
1836
navigationBarStyle = SystemBarStyle.light(Color.TRANSPARENT, Color.TRANSPARENT)
1937
)
2038
WindowCompat.setDecorFitsSystemWindows(window, false)
39+
FileKit.init(this)
2140
setContent {
2241
App()
2342
}
Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,5 @@
11
package com.tewelde.rijksmuseum
22

33
import android.app.Application
4-
import com.tewelde.rijksmuseum.di.appModule
5-
import org.koin.android.ext.koin.androidContext
6-
import org.koin.android.ext.koin.androidLogger
7-
import org.koin.core.context.startKoin
84

9-
class RijksmuseumApplication: Application() {
10-
11-
override fun onCreate() {
12-
super.onCreate()
13-
startKoin {
14-
androidLogger()
15-
androidContext(this@RijksmuseumApplication)
16-
modules(appModule)
17-
}
18-
}
19-
}
5+
class RijksmuseumApplication: Application()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3+
<!-- TODO-->
34
<color name="rijksmuseum_launcher_background">#FFFFFF</color>
45
</resources>

composeApp/src/commonMain/kotlin/com/tewelde/rijksmuseum/App.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.tewelde.rijksmuseum
22

3+
import androidx.compose.material3.SnackbarHostState
34
import androidx.compose.runtime.Composable
5+
import androidx.compose.runtime.remember
46
import coil3.ImageLoader
57
import coil3.PlatformContext
68
import coil3.annotation.ExperimentalCoilApi
@@ -12,7 +14,7 @@ import coil3.request.CachePolicy
1214
import coil3.request.crossfade
1315
import coil3.util.DebugLogger
1416
import com.tewelde.rijksmuseum.navigation.RijksmuseumNavGraph
15-
import com.tewelde.rijksmuseum.theme.RijksmuseumTheme
17+
import com.tewelde.rijksmuseum.core.designsystem.theme.RijksmuseumTheme
1618
import okio.FileSystem
1719
import org.jetbrains.compose.ui.tooling.preview.Preview
1820
import org.koin.compose.KoinContext
@@ -27,8 +29,7 @@ fun App(disableDiskCache: Boolean = false) {
2729
if (disableDiskCache) context.asyncImageLoader() else
2830
context.asyncImageLoader().enableDiskCache()
2931
}
30-
31-
RijksmuseumNavGraph()
32+
RijksmuseumNavGraph(snackbarHostState = remember { SnackbarHostState() })
3233
}
3334
}
3435
}

composeApp/src/commonMain/kotlin/com/tewelde/rijksmuseum/di/appModule.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import coil3.network.NetworkFetcher
66
import coil3.network.ktor.asNetworkClient
77
import com.tewelde.rijksmuseum.feature.arts.di.artsModule
88
import io.ktor.client.HttpClient
9+
import org.koin.dsl.module
910

1011
@OptIn(ExperimentalCoilApi::class)
11-
val appModule = org.koin.dsl.module {
12+
val appModule = module {
1213
includes(artsModule)
1314
single {
1415
NetworkFetcher.Factory(

composeApp/src/commonMain/kotlin/com/tewelde/rijksmuseum/navigation/RijksmuseumNavGraph.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.tewelde.rijksmuseum.navigation
22

3+
import androidx.compose.material3.SnackbarHostState
4+
import androidx.compose.material3.SnackbarResult
35
import androidx.compose.runtime.Composable
46
import androidx.compose.ui.Modifier
57
import androidx.lifecycle.ViewModel
@@ -23,11 +25,12 @@ import org.koin.compose.currentKoinScope
2325
@Composable
2426
fun RijksmuseumNavGraph(
2527
modifier: Modifier = Modifier,
28+
snackbarHostState: SnackbarHostState,
2629
startDestination: RijksmuseumDestination = RijksmuseumDestination.Gallery,
2730
navController: NavHostController = rememberNavController(),
2831
) {
2932
NavHost(
30-
modifier = Modifier.then(modifier),
33+
modifier = modifier,
3134
startDestination = startDestination.route,
3235
navController = navController,
3336
) {
@@ -42,14 +45,22 @@ fun RijksmuseumNavGraph(
4245
DetailScreenRoute(
4346
objectId = id,
4447
viewModel = viewModel,
45-
onBackClick = navController::popBackStack
48+
onBackClick = navController::navigateUp,
49+
snackbarHostState = snackbarHostState,
50+
onShowSnackbar = { message, action, duration ->
51+
snackbarHostState.showSnackbar(
52+
message = message,
53+
actionLabel = action,
54+
duration = duration,
55+
) == SnackbarResult.ActionPerformed
56+
}
4657
)
4758
}
4859
}
4960
}
5061

5162
@Composable
52-
inline fun <reified T: ViewModel> koinViewModel(): T {
63+
inline fun <reified T : ViewModel> koinViewModel(): T {
5364
val scope = currentKoinScope()
5465
return viewModel {
5566
scope.get<T>()

0 commit comments

Comments
 (0)