Add specific iOS code to shared module

This commit is contained in:
2020-11-29 11:39:27 +01:00
parent 6ab63a7ddb
commit 1259c38523
7 changed files with 105 additions and 22 deletions

View File

@@ -1,8 +1,8 @@
object Dependencies {
object Kotlin {
const val version = "1.4.10"
const val version = "1.4.20"
const val core = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${version}"
const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9"
const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9-native-mt"
const val coroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9"
}
@@ -33,7 +33,7 @@ object Dependencies {
}
object Ktor {
private const val version = "1.4.1"
private const val version = "1.4.2"
const val ktorCore = "io.ktor:ktor-client-core:$version"
const val ktorOkhttp = "io.ktor:ktor-client-okhttp:$version"
const val ktorIos = "io.ktor:ktor-client-ios:$version"

View File

@@ -2,12 +2,15 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
kotlin("native.cocoapods")
kotlin("plugin.serialization")
id("com.android.library")
id("kotlin-android-extensions")
id("com.squareup.sqldelight")
}
version = "1.0"
repositories {
gradlePluginPortal()
google()
@@ -24,27 +27,28 @@ kotlin {
val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
if (sdkName.startsWith("iphoneos")) {
iosArm64("ios") {
binaries {
framework {
baseName = "Shared"
}
}
}
iosArm64("ios")
} else {
iosX64("ios") {
binaries {
framework {
baseName = "Shared"
}
}
}
iosX64("ios")
}
cocoapods {
summary = "Shared module for Circolapp"
homepage = "Link to a Kotlin/Native module homepage"
frameworkName = "Shared"
pod ("HTMLKit", "~> 3.1.0")
}
sourceSets {
val commonMain by getting {
dependencies {
implementation(Dependencies.Kotlin.coroutinesCore)
implementation(Dependencies.Kotlin.coroutinesCore) {
version {
strictly("1.3.9-native-mt")
}
}
// Ktor
implementation(Dependencies.Ktor.ktorCore)

View File

@@ -8,6 +8,7 @@ import net.underdesk.circolapp.shared.utils.SqlUtils.joinToString
import net.underdesk.circolapp.shared.utils.SqlUtils.toBoolean
import net.underdesk.circolapp.shared.utils.SqlUtils.toList
import net.underdesk.circolapp.shared.utils.SqlUtils.toLong
import net.underdesk.circolapp.shared.utils.wrap
class CircularDao(
database: AppDatabase
@@ -66,22 +67,28 @@ class CircularDao(
fun getFlowCirculars(school: Int) =
appDatabaseQueries.getCirculars(school.toLong(), circularMapper).asFlow().mapToList()
fun getCFlowCirculars(school: Int) = getFlowCirculars(school).wrap()
fun searchCirculars(query: String, school: Int) =
appDatabaseQueries.searchCirculars(school.toLong(), query, circularMapper).asFlow()
.mapToList()
fun searchCircularsC(query: String, school: Int) = searchCirculars(query, school).wrap()
fun getFavourites(school: Int) =
appDatabaseQueries.getFavourites(school.toLong(), circularMapper).asFlow().mapToList()
fun getFavouritesC(school: Int) = getFavourites(school).wrap()
fun searchFavourites(query: String, school: Int) =
appDatabaseQueries.searchFavourites(school.toLong(), query, circularMapper).asFlow()
.mapToList()
fun searchFavouritesC(query: String, school: Int) = searchFavourites(query, school).wrap()
fun getReminders(school: Int) =
appDatabaseQueries.getReminders(school.toLong(), circularMapper).asFlow().mapToList()
fun getRemindersC(school: Int) = getReminders(school).wrap()
fun searchReminders(query: String, school: Int) =
appDatabaseQueries.searchReminders(school.toLong(), query, circularMapper).asFlow()
.mapToList()
fun searchRemindersC(query: String, school: Int) = searchReminders(query, school).wrap()
}

View File

@@ -0,0 +1,7 @@
package net.underdesk.circolapp.shared.data
import com.squareup.sqldelight.db.SqlDriver
object DatabaseFactory {
fun createDatabase(sqlDriver: SqlDriver) = AppDatabase(sqlDriver)
}

View File

@@ -0,0 +1,27 @@
package net.underdesk.circolapp.shared.utils
import io.ktor.utils.io.core.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
fun <T> Flow<T>.wrap(): CFlow<T> = CFlow(this)
class CFlow<T>(private val origin: Flow<T>) : Flow<T> by origin {
fun watch(block: (T) -> Unit): Closeable {
val job = Job()
onEach {
block(it)
}.launchIn(CoroutineScope(Dispatchers.Main + job))
return object : Closeable {
override fun close() {
job.cancel()
}
}
}
}

View File

@@ -1,9 +1,25 @@
package net.underdesk.circolapp.shared.server.curie
import cocoapods.HTMLKit.HTMLElement
import cocoapods.HTMLKit.HTMLParser
import net.underdesk.circolapp.shared.data.Circular
actual class SpecificCurieServer actual constructor(val curieServer: CurieServer) {
actual class SpecificCurieServer actual constructor(private val curieServer: CurieServer) {
actual fun parseHtml(string: String): List<Circular> {
TODO("Not yet implemented")
val document = HTMLParser(string).parseDocument()
val htmlList = document.querySelector("ul")?.querySelectorAll("a") as List<HTMLElement>?
val list = ArrayList<Circular>()
htmlList?.forEach { element ->
if (element.parentElement?.parentElement?.parentElement?.tagName == "li") {
list.last().attachmentsNames.add(element.textContent)
list.last().attachmentsUrls.add(element.attributes.objectForKey("href").toString())
} else {
list.add(curieServer.generateFromString(element.textContent, element.attributes.objectForKey("href").toString()))
}
}
return list
}
}

View File

@@ -1,9 +1,31 @@
package net.underdesk.circolapp.shared.server.porporato
import cocoapods.HTMLKit.HTMLElement
import cocoapods.HTMLKit.HTMLParser
import net.underdesk.circolapp.shared.data.Circular
actual class SpecificPorporatoServer actual constructor(porporatoServer: PorporatoServer) {
actual class SpecificPorporatoServer actual constructor(private val porporatoServer: PorporatoServer) {
actual fun parseHtml(string: String): List<Circular> {
TODO("Not yet implemented")
val document = HTMLParser(string).parseDocument()
val table = document.querySelectorAll("table") as List<HTMLElement>?
val td = table?.get(2)?.querySelectorAll("td") as List<HTMLElement>?
val htmlList = td?.get(2)?.querySelectorAll("a") as List<HTMLElement>?
val list = ArrayList<Circular>()
if (htmlList == null)
return list
for (i in htmlList.indices) {
list.add(
porporatoServer.generateFromString(
htmlList[i].textContent,
htmlList[i].attributes.objectForKey("href").toString(),
i.toLong()
)
)
}
return list
}
}