Skip to content

Commit

Permalink
Migrate :bridge:synchronization, :core:ktx and :core:theme to KMP (#929)
Browse files Browse the repository at this point in the history
**Background**

Right now we can't move forward with the new transport API without
migrating to KMP

**Changes**

- Migrate `:bridge:synchronization:ui` to KMP
- Migrate `:bridge:synchronization:api` to KMP
- Migrate `:core:ktx` to KMP
- Migrate `:core:theme` to KMP
- Remove parcelize from almost all modules and add
`:core:kmpparcelizable`

**Test plan**

Try build app
  • Loading branch information
LionZXY committed Aug 30, 2024
1 parent 5345398 commit a915b06
Show file tree
Hide file tree
Showing 140 changed files with 496 additions and 477 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Attention: don't forget to add the flag for F-Droid before release
- [Refactor] Replace Ktorfit with Ktor requests in remote-controls
- [Refactor] Migrate :core:preference to KMP
- [Refactor] Migrate :bridge:connection:* to KMP
- [Refactor] Migrate :bridge:synchronization, :core:ktx and :core:theme to KMP
- [Refactor] Remove ktorfit
- [FIX] Distinct fap items by id in paging sources
- [FIX] Battery level charge
Expand Down
Original file line number Diff line number Diff line change
@@ -1,49 +1,11 @@
import com.android.build.gradle.BaseExtension
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
id("org.jetbrains.kotlin.multiplatform")
id("flipper.multiplatform")
id("org.jetbrains.compose")
id("org.jetbrains.kotlin.plugin.compose")
id("com.android.library")
id("flipper.lint")
}

configure<BaseExtension> {
commonAndroid(project)
}

kotlin {
androidTarget {
compilerOptions {
jvmTarget = JvmTarget.JVM_1_8
}
}
jvm("desktop")

sourceSets {
val commonMain by getting

/**
* We shouldn't create sources, which is named as original targets sourcesets.
*
* As an example - jvm() target will create sourceSet jvmMain - and we would have conflicts
* with our create jvmMain sourceSet
*
* This is the reason to name it `jvmSharedMain`
*/
val jvmSharedMain by creating {
dependsOn(commonMain)
}

val androidMain by getting {
dependsOn(jvmSharedMain)
}

val desktopMain by getting {
dependsOn(jvmSharedMain)
}

androidMain.dependencies {
implementation(libs.compose.tooling)
}
Expand All @@ -53,26 +15,11 @@ kotlin {
implementation(compose.material)
implementation(compose.ui)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
}
val desktopMain by getting
desktopMain.dependencies {
implementation(compose.desktop.currentOs)
}

// Testing
val commonTest by getting

val jvmSharedTest by creating {
dependsOn(commonTest)
}

@Suppress("UnusedPrivateProperty")
val androidUnitTest by getting {
dependsOn(jvmSharedTest)
}

@Suppress("UnusedPrivateProperty")
val desktopTest by getting {
dependsOn(jvmSharedTest)
}
}
}
2 changes: 1 addition & 1 deletion components/archive/api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
plugins {
id("flipper.android-compose")
id("kotlin-parcelize")

id("kotlinx-serialization")
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
package com.flipperdevices.archive.model

import android.os.Parcelable
import androidx.compose.runtime.Immutable
import com.flipperdevices.bridge.dao.api.model.FlipperKeyType
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Serializable

@Serializable
@Immutable
sealed class CategoryType : Parcelable {
@Parcelize
sealed class CategoryType {
@Serializable
data class ByFileType(
val fileType: FlipperKeyType
) : CategoryType()

@Parcelize
@Serializable
object Deleted : CategoryType()
data object Deleted : CategoryType()
}
2 changes: 1 addition & 1 deletion components/archive/impl/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
plugins {
id("flipper.android-compose")
id("kotlin-parcelize")

id("flipper.anvil")
id("kotlinx-serialization")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
package com.flipperdevices.archive.impl.model

import android.os.Parcelable
import androidx.annotation.DrawableRes
import com.flipperdevices.archive.model.CategoryType
import kotlinx.parcelize.Parcelize

@Parcelize
data class CategoryItem(
@DrawableRes val iconId: Int?,
val title: String,
val count: Int?,
val categoryType: CategoryType
) : Parcelable
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.flipperdevices.archive.model.CategoryType
import com.flipperdevices.bridge.dao.api.delegates.key.DeleteKeyApi
import com.flipperdevices.bridge.dao.api.delegates.key.SimpleKeyApi
import com.flipperdevices.bridge.dao.api.model.FlipperKeyType
import com.flipperdevices.bridge.dao.api.model.icon
import com.flipperdevices.core.ui.lifecycle.DecomposeViewModel
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.persistentListOf
Expand Down
1 change: 0 additions & 1 deletion components/bridge/api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
plugins {
id("flipper.android-lib")
id("kotlin-parcelize")
}

android.namespace = "com.flipperdevices.bridge.api"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,9 @@ package com.flipperdevices.bridge.api.scanner
import android.annotation.SuppressLint
import android.bluetooth.BluetoothDevice
import android.os.ParcelUuid
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import no.nordicsemi.android.support.v18.scanner.ScanResult
import java.util.UUID

@Parcelize
data class DiscoveredBluetoothDevice(
val device: BluetoothDevice,
private var lastScanResult: ScanResult? = null,
Expand All @@ -17,7 +14,7 @@ data class DiscoveredBluetoothDevice(
private var previousRssi: Int,
private var highestRssiInternal: Int = Byte.MIN_VALUE.toInt(),
private var servicesResult: List<ParcelUuid>? = null
) : Parcelable {
) {
// Wrapper for data variables
val address: String get() = device.address
val scanResult: ScanResult? get() = lastScanResult
Expand Down
15 changes: 11 additions & 4 deletions components/bridge/dao/api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
plugins {
id("flipper.android-compose")
id("flipper.multiplatform-compose")
id("flipper.multiplatform-dependencies")
id("kotlinx-serialization")
id("kotlin-parcelize")
}

android.namespace = "com.flipperdevices.bridge.dao.api"

dependencies {
compose.resources {
publicResClass = true
}

commonDependencies {
implementation(projects.components.core.kmpparcelize)
implementation(projects.components.core.ui.theme)
implementation(projects.components.core.ui.res)
implementation(projects.components.core.ktx)

implementation(libs.kotlin.coroutines)
implementation(libs.kotlin.serialization.json)
implementation(libs.kotlin.immutable.collections)
}

implementation(libs.compose.ui)
androidDependencies {
implementation(projects.components.core.ui.res)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.flipperdevices.bridge.dao.api.model

import com.flipperdevices.core.ui.res.R as DesignSystem

val FlipperKeyType.icon: Int
get() = when (this) {
FlipperKeyType.SUB_GHZ -> DesignSystem.drawable.ic_fileformat_sub
FlipperKeyType.RFID -> DesignSystem.drawable.ic_fileformat_rf
FlipperKeyType.NFC -> DesignSystem.drawable.ic_fileformat_nfc
FlipperKeyType.INFRARED -> DesignSystem.drawable.ic_fileformat_ir
FlipperKeyType.I_BUTTON -> DesignSystem.drawable.ic_fileformat_ibutton
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.flipperdevices.bridge.dao.api.model

import android.os.Parcelable
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import com.flipperdevices.core.kmpparcelize.KMPIgnoreOnParcel
import com.flipperdevices.core.kmpparcelize.KMPParcelable
import com.flipperdevices.core.kmpparcelize.KMPParcelize
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import java.io.File
Expand All @@ -16,18 +16,18 @@ private const val FLIPPER_STORAGE_NAME = "/any/"
* Never contains storage
*/
@Serializable
@Parcelize
@KMPParcelize
data class FlipperFilePath(
@SerialName("folder")
val folder: String,
@SerialName("name")
val nameWithExtension: String // With extension
) : Parcelable, Comparable<FlipperFilePath> {
@IgnoredOnParcel
) : KMPParcelable, Comparable<FlipperFilePath> {
@KMPIgnoreOnParcel
val extension: String
get() = nameWithExtension.substringAfterLast('.')

@IgnoredOnParcel
@KMPIgnoreOnParcel
val pathToKey: String by lazy {
var path = File(folder, nameWithExtension).path
if (path.firstOrNull() == File.separatorChar) {
Expand All @@ -36,17 +36,17 @@ data class FlipperFilePath(
return@lazy path
}

@IgnoredOnParcel
@KMPIgnoreOnParcel
val keyType: FlipperKeyType? by lazy {
FlipperKeyType.getByExtension(extension)
}

@IgnoredOnParcel
@KMPIgnoreOnParcel
val fileType: FlipperFileType by lazy {
FlipperFileType.getByExtension(extension)
}

@IgnoredOnParcel
@KMPIgnoreOnParcel
val nameWithoutExtension by lazy {
nameWithExtension.substringAfterLast('/').substringBeforeLast(".")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
package com.flipperdevices.bridge.dao.api.model

import android.os.Parcelable
import androidx.compose.runtime.Immutable
import kotlinx.parcelize.Parcelize
import com.flipperdevices.core.kmpparcelize.KMPParcelable
import com.flipperdevices.core.kmpparcelize.KMPParcelize
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

/**
* The most complete description of the key
*/
@Parcelize
@Serializable
@Immutable
data class FlipperKey(
val mainFile: FlipperFile,
val additionalFiles: List<FlipperFile> = emptyList(),
val additionalFiles: ImmutableList<FlipperFile> = persistentListOf(),
val notes: String? = null,
val synchronized: Boolean,
val deleted: Boolean
) : Parcelable {
) {
val flipperKeyType: FlipperKeyType?
get() = mainFile.path.keyType
val path: FlipperFilePath
Expand All @@ -28,18 +30,18 @@ data class FlipperKey(
fun getKeyPath() = FlipperKeyPath(mainFile.path, deleted)
}

@Parcelize
@Serializable
@Immutable
@KMPParcelize
data class FlipperKeyPath(
@SerialName("path")
val path: FlipperFilePath,
@SerialName("deleted")
val deleted: Boolean
) : Parcelable
) : KMPParcelable

@Parcelize
@Serializable
data class FlipperFile(
val path: FlipperFilePath,
val content: FlipperKeyContent
) : Parcelable
)
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package com.flipperdevices.bridge.dao.api.model

import android.os.Parcelable
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import java.io.ByteArrayInputStream
Expand All @@ -16,8 +13,8 @@ import java.io.InputStream
* Do not limit your support to only one type of content.
*/
@Serializable
sealed class FlipperKeyContent : Parcelable {
@Parcelize
sealed class FlipperKeyContent {
@Serializable
data class RawData(val bytes: ByteArray) : FlipperKeyContent() {
override fun openStream() = ByteArrayInputStream(bytes)
override fun length() = bytes.size.toLong()
Expand All @@ -38,11 +35,8 @@ sealed class FlipperKeyContent : Parcelable {
}
}

@Parcelize
@Serializable
data class InternalFile(val path: String) : FlipperKeyContent() {

@IgnoredOnParcel
@Transient
private val file = File(path)

Expand All @@ -62,12 +56,10 @@ sealed class FlipperKeyContent : Parcelable {
abstract fun length(): Long?
}

@Parcelize
@Serializable
data class FlipperFileFormat(
val orderedDict: List<Pair<String, String>>
) : FlipperKeyContent(), Parcelable {
@IgnoredOnParcel
) : FlipperKeyContent() {
private val fileContentLazy by lazy {
generateFileContent()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package com.flipperdevices.bridge.dao.api.model

import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Serializable

@Parcelize
@Serializable
data class FlipperKeyCrypto(
val fileId: String,
val pathToKey: String,
val cryptoKey: String
) : Parcelable
)
Loading

0 comments on commit a915b06

Please sign in to comment.