Skip to content

Commit

Permalink
add wanandroid sample
Browse files Browse the repository at this point in the history
  • Loading branch information
qdsfdhvh committed Feb 5, 2024
1 parent 081965d commit 6ce4f5c
Show file tree
Hide file tree
Showing 6 changed files with 166 additions and 6 deletions.
6 changes: 4 additions & 2 deletions app/common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,19 @@ kotlin {

implementation(libs.kotlinx.serialization.json)
implementation(libs.ktor.client.logging)
implementation(libs.ktor.client.content.negotiation)
implementation(libs.ktor.serialization.kotlinx.json)
implementation(libs.kermit)
}
}
androidMain {
dependencies {
implementation(libs.ktor.client.cio)
implementation(libs.ktor.client.okhttp)
}
}
desktopMain {
dependencies {
implementation(libs.ktor.client.cio)
implementation(libs.ktor.client.okhttp)
}
}
appleMain {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.seiko.imageloader.demo.util

import io.ktor.client.engine.HttpClientEngine
import io.ktor.client.engine.cio.CIO
import io.ktor.client.engine.okhttp.OkHttp

actual val httpEngine: HttpClientEngine
get() = CIO.create()
get() = OkHttp.create()
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import com.seiko.imageloader.demo.scene.NetworkImagesScene
import com.seiko.imageloader.demo.scene.OtherImagesScene
import com.seiko.imageloader.demo.scene.PokemonScene
import com.seiko.imageloader.demo.scene.SvgImagesScene
import com.seiko.imageloader.demo.scene.WanAndroidScene

@Composable
fun App(modifier: Modifier = Modifier) {
Expand All @@ -48,6 +49,7 @@ fun App(modifier: Modifier = Modifier) {
Route.LocalResource -> LocalResourceScene(::onBack)
Route.Other -> OtherImagesScene(::onBack)
Route.FilePicker -> FilePickerScene(::onBack)
Route.WanAndroid -> WanAndroidScene(::onBack)
}
}
}
Expand Down Expand Up @@ -94,4 +96,5 @@ private enum class Route {
LocalResource,
Other,
FilePicker,
WanAndroid,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
package com.seiko.imageloader.demo.scene

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.material.ScrollableTabRow
import androidx.compose.material.Tab
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.seiko.imageloader.demo.util.JSON
import com.seiko.imageloader.demo.util.httpEngine
import com.seiko.imageloader.ui.AutoSizeImage
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.plugins.defaultRequest
import io.ktor.client.request.get
import io.ktor.client.statement.HttpResponse
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Composable
fun WanAndroidScene(
onBack: () -> Unit,
) {
BackScene(
onBack = onBack,
title = { Text("WanAndroid") },
) { innerPadding ->
val client by remember {
lazy {
HttpClient(httpEngine) {
install(ContentNegotiation) {
json(JSON)
}
defaultRequest {
url("https://www.wanandroid.com/")
}
}
}
}
Column(Modifier.padding(innerPadding).fillMaxSize()) {
val tabs by produceState(emptyList()) {
value = runCatching {
client.get("project/tree/json")
.wanBody<List<WanProjectTabs>>()
.take(5)
}.getOrElse {
it.printStackTrace()
emptyList()
}
}
if (tabs.isEmpty()) return@Column

var selectedTabIndex by remember { mutableIntStateOf(0) }
ScrollableTabRow(
selectedTabIndex = selectedTabIndex,
modifier = Modifier.fillMaxWidth(),
tabs = {
tabs.forEachIndexed { index, tag ->
Tab(
selected = index == selectedTabIndex,
onClick = { selectedTabIndex = index },
modifier = Modifier.widthIn(min = 100.dp),
) {
Text(tag.name)
}
}
},
)

val projects by produceState(emptyList(), key1 = tabs, key2 = selectedTabIndex) {
value = runCatching {
client.get("project/list/1/json?cid=${tabs[selectedTabIndex].id}")
.wanBody<WanProjectPage>().projects
}.getOrElse {
it.printStackTrace()
emptyList()
}
}

println(projects.firstOrNull()?.envelopePic ?: "null")

LazyVerticalGrid(
GridCells.Fixed(3),
Modifier.weight(1f).fillMaxWidth(),
) {
items(
projects,
key = { it.id },
) { project ->
Column {
AutoSizeImage(
project.envelopePic,
contentDescription = project.title,
modifier = Modifier.size(200.dp),
)
Text(project.title)
}
}
}
}
}
}

private suspend inline fun <reified T> HttpResponse.wanBody(): T {
val response = body<WanResponse<T>>()
if (response.errorCode == 0) {
return response.data
} else {
error(response.errorMsg)
}
}

@Serializable
private data class WanResponse<T>(
val data: T,
val errorCode: Int,
val errorMsg: String,
)

@Serializable
private data class WanProjectTabs(
val id: Int,
val name: String,
)

@Serializable
private data class WanProjectPage(
val curPage: Int,
@SerialName("datas") val projects: List<WanProject>,
)

@Serializable
private data class WanProject(
val id: Int,
val title: String,
val envelopePic: String,
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.seiko.imageloader.demo.util

import io.ktor.client.engine.HttpClientEngine
import io.ktor.client.engine.cio.CIO
import io.ktor.client.engine.okhttp.OkHttp

actual val httpEngine: HttpClientEngine
get() = CIO.create()
get() = OkHttp.create()
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,10 @@ roborazzi-compose-desktop = { module = "io.github.takahirom.roborazzi:roborazzi-
okio = { module = "com.squareup.okio:okio", version.ref = "okio" }
okio-fakefilesystem = { module = "com.squareup.okio:okio-fakefilesystem", version.ref = "okio" }

ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }
ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" }
ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" }
Expand Down

0 comments on commit 6ce4f5c

Please sign in to comment.