Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate info to new ble api #1001

Open
wants to merge 18 commits into
base: makeevrserg/new-ble-api/dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions components/bridge/connection/config/api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ plugins {
android.namespace = "com.flipperdevices.bridge.connection.config.api"

commonDependencies {
implementation(projects.components.core.preference)

implementation(libs.kotlin.coroutines)
implementation(libs.kotlin.serialization.json)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.flipperdevices.bridge.connection.config.api

import com.flipperdevices.bridge.connection.config.api.model.FDeviceBaseModel
import com.flipperdevices.core.preference.pb.FlipperZeroBle.HardwareColor
import kotlinx.coroutines.flow.Flow

interface FDevicePersistedStorage {
Expand All @@ -9,4 +10,5 @@ interface FDevicePersistedStorage {
suspend fun addDevice(device: FDeviceBaseModel)
suspend fun removeDevice(id: String)
fun getAllDevices(): Flow<List<FDeviceBaseModel>>
suspend fun setCurrentDeviceColor(hardwareColor: HardwareColor)
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not setDeviceColor(id: String, hardwareColor: HardwareColor) because we can't get color when not connected to device

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.flipperdevices.bridge.connection.config.api.model

import com.flipperdevices.bridge.connection.config.api.FDeviceType
import com.flipperdevices.bridge.connection.config.api.serialization.HardwareColorSerializer
import com.flipperdevices.core.preference.pb.FlipperZeroBle
import kotlinx.serialization.Serializable
import java.util.UUID

Expand All @@ -9,7 +11,9 @@ data class FDeviceFlipperZeroBleModel(
val name: String,
val address: String,
override val uniqueId: String = UUID.randomUUID().toString(),
override val humanReadableName: String = "Flipper $name"
override val humanReadableName: String = "Flipper $name",
@Serializable(HardwareColorSerializer::class)
val hardwareColor: FlipperZeroBle.HardwareColor
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

May be better to add interface ColoredDevice { val hardwareColor....} but we HardwareColor currently linked specificly to FlipperZero

) : FDeviceBaseModel {
override val type = FDeviceType.FLIPPER_ZERO_BLE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.flipperdevices.bridge.connection.config.api.serialization

import com.flipperdevices.core.preference.pb.FlipperZeroBle.HardwareColor
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

internal object HardwareColorSerializer : KSerializer<HardwareColor> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(
serialName = "com.flipperdevices.SavedDevice.HardwareColor",
kind = PrimitiveKind.INT
)

override fun deserialize(decoder: Decoder): HardwareColor {
val intValue = decoder.decodeInt()
return HardwareColor.fromValue(intValue)
}

override fun serialize(encoder: Encoder, value: HardwareColor) {
encoder.encodeInt(value.value)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.flipperdevices.core.log.LogTagProvider
import com.flipperdevices.core.log.info
import com.flipperdevices.core.log.warn
import com.flipperdevices.core.preference.pb.FlipperZeroBle
import com.flipperdevices.core.preference.pb.FlipperZeroBle.HardwareColor
import com.flipperdevices.core.preference.pb.NewPairSettings
import com.flipperdevices.core.preference.pb.SavedDevice
import com.squareup.anvil.annotations.ContributesBinding
Expand Down Expand Up @@ -85,7 +86,8 @@ class FDevicePersistedStorageImpl @Inject constructor(
return FDeviceFlipperZeroBleModel(
name = device.name,
uniqueId = device.id,
address = flipperZeroBle.address
address = flipperZeroBle.address,
hardwareColor = flipperZeroBle.hardware_color
)
}
return null
Expand All @@ -104,4 +106,24 @@ class FDevicePersistedStorageImpl @Inject constructor(
else -> error("Can't find parser for $device")
}
}

override suspend fun setCurrentDeviceColor(hardwareColor: HardwareColor) {
newPairSettings.updateData { newPairSettings ->
newPairSettings.copy(
devices = newPairSettings.devices.toMutableList().apply {
replaceAll { device ->
if (device.id == newPairSettings.current_selected_device_id) {
device.copy(
flipper_zero_ble = device
.flipper_zero_ble
?.copy(hardware_color = hardwareColor)
)
} else {
device
}
}
}.toList()
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ commonDependencies {
implementation(projects.components.bridge.connection.feature.storage.api)
implementation(projects.components.bridge.connection.feature.storageinfo.api)
implementation(projects.components.bridge.connection.feature.getinfo.api)
implementation(projects.components.bridge.connection.feature.alarm.api)
implementation(projects.components.bridge.connection.feature.deviceColor.api)

implementation(libs.kotlin.coroutines)
implementation(libs.kotlin.immutable.collections)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.flipperdevices.bridge.connection.device.fzero.impl.utils

import com.flipperdevices.bridge.connection.feature.alarm.api.FAlarmFeatureApi
import com.flipperdevices.bridge.connection.feature.common.api.FDeviceFeature
import com.flipperdevices.bridge.connection.feature.common.api.FDeviceFeatureApi
import com.flipperdevices.bridge.connection.feature.devicecolor.api.FDeviceColorFeatureApi
import com.flipperdevices.bridge.connection.feature.getinfo.api.FGattInfoFeatureApi
import com.flipperdevices.bridge.connection.feature.getinfo.api.FGetInfoFeatureApi
import com.flipperdevices.bridge.connection.feature.protocolversion.api.FVersionFeatureApi
import com.flipperdevices.bridge.connection.feature.restartrpc.api.FRestartRpcFeatureApi
Expand Down Expand Up @@ -30,6 +33,9 @@ object FZeroFeatureClassToEnumMapper {
FDeviceFeature.STORAGE_INFO -> FStorageInfoFeatureApi::class
FDeviceFeature.GET_INFO -> FGetInfoFeatureApi::class
FDeviceFeature.STORAGE -> FStorageFeatureApi::class
FDeviceFeature.ALARM -> FAlarmFeatureApi::class
FDeviceFeature.DEVICE_COLOR -> FDeviceColorFeatureApi::class
FDeviceFeature.GATT_INFO -> FGattInfoFeatureApi::class
}
}

Expand Down
18 changes: 18 additions & 0 deletions components/bridge/connection/feature/alarm/api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
plugins {
id("flipper.multiplatform")
id("flipper.multiplatform-dependencies")
}

android.namespace = "com.flipperdevices.bridge.connection.feature.alarm.api"

commonDependencies {
implementation(projects.components.core.data)
implementation(projects.components.core.ktx)

implementation(projects.components.bridge.connection.feature.common.api)
implementation(projects.components.bridge.connection.transport.common.api)
implementation(projects.components.bridge.connection.feature.rpcinfo.api)

implementation(libs.kotlin.immutable.collections)
implementation(libs.kotlin.coroutines)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.flipperdevices.bridge.connection.feature.alarm.api

import com.flipperdevices.bridge.connection.feature.common.api.FDeviceFeatureApi

interface FAlarmFeatureApi : FDeviceFeatureApi {
suspend fun makeSound()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
plugins {
id("flipper.multiplatform")
id("flipper.multiplatform-dependencies")
id("flipper.anvil-multiplatform")
}

android.namespace = "com.flipperdevices.bridge.connection.feature.alarm.impl"

commonDependencies {
implementation(projects.components.bridge.connection.feature.alarm.api)

implementation(projects.components.core.di)
implementation(projects.components.core.log)
implementation(projects.components.core.ktx)

implementation(projects.components.bridge.connection.feature.common.api)
implementation(projects.components.bridge.connection.transport.common.api)
implementation(projects.components.bridge.connection.feature.rpc.api)
implementation(projects.components.bridge.connection.feature.rpc.model)
implementation(projects.components.bridge.connection.feature.rpcinfo.api)

implementation(projects.components.bridge.connection.pbutils)

implementation(libs.kotlin.coroutines)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.flipperdevices.bridge.connection.feature.alarm.impl.api

import com.flipperdevices.bridge.connection.feature.alarm.api.FAlarmFeatureApi
import com.flipperdevices.bridge.connection.feature.rpc.api.FRpcFeatureApi
import com.flipperdevices.bridge.connection.feature.rpc.model.wrapToRequest
import com.flipperdevices.core.log.LogTagProvider
import com.flipperdevices.protobuf.Main
import com.flipperdevices.protobuf.system.PlayAudiovisualAlertRequest
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject

class FAlarmFeatureApiImpl @AssistedInject constructor(
@Assisted private val rpcFeatureApi: FRpcFeatureApi,
) : FAlarmFeatureApi,
LogTagProvider {
override val TAG = "FAlarmFeatureApi"

override suspend fun makeSound() {
rpcFeatureApi.requestWithoutAnswer(
Main(
system_play_audiovisual_alert_request = PlayAudiovisualAlertRequest()
).wrapToRequest()
)
}

@AssistedFactory
fun interface InternalFactory {
operator fun invoke(
rpcFeatureApi: FRpcFeatureApi,
): FAlarmFeatureApiImpl
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.flipperdevices.bridge.connection.feature.alarm.impl.api

import com.flipperdevices.bridge.connection.feature.common.api.FDeviceFeature
import com.flipperdevices.bridge.connection.feature.common.api.FDeviceFeatureApi
import com.flipperdevices.bridge.connection.feature.common.api.FDeviceFeatureQualifier
import com.flipperdevices.bridge.connection.feature.common.api.FUnsafeDeviceFeatureApi
import com.flipperdevices.bridge.connection.feature.rpc.api.FRpcFeatureApi
import com.flipperdevices.bridge.connection.transport.common.api.FConnectedDeviceApi
import com.flipperdevices.core.di.AppGraph
import com.squareup.anvil.annotations.ContributesMultibinding
import kotlinx.coroutines.CoroutineScope
import javax.inject.Inject

@FDeviceFeatureQualifier(FDeviceFeature.ALARM)
@ContributesMultibinding(AppGraph::class, FDeviceFeatureApi.Factory::class)
class FAlarmFeatureFactoryImpl @Inject constructor(
private val factory: FAlarmFeatureApiImpl.InternalFactory
) : FDeviceFeatureApi.Factory {
override suspend fun invoke(
unsafeFeatureDeviceApi: FUnsafeDeviceFeatureApi,
scope: CoroutineScope,
connectedDevice: FConnectedDeviceApi
): FDeviceFeatureApi? {
val rpcApi = unsafeFeatureDeviceApi.getUnsafe(FRpcFeatureApi::class) ?: return null
return factory(
rpcFeatureApi = rpcApi,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ enum class FDeviceFeature {
RPC_INFO,
STORAGE,
STORAGE_INFO,
GET_INFO
GET_INFO,
ALARM,
DEVICE_COLOR,
GATT_INFO,
}

@Retention(AnnotationRetention.RUNTIME)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
plugins {
id("flipper.multiplatform")
id("flipper.multiplatform-dependencies")
}

android.namespace = "com.flipperdevices.bridge.connection.feature.devicecolor.api"

commonDependencies {
implementation(projects.components.core.data)
implementation(projects.components.core.ktx)
implementation(projects.components.core.preference)

implementation(projects.components.bridge.connection.feature.common.api)
implementation(projects.components.bridge.connection.transport.common.api)
implementation(projects.components.bridge.connection.feature.rpcinfo.api)

implementation(libs.kotlin.immutable.collections)
implementation(libs.kotlin.coroutines)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.flipperdevices.bridge.connection.feature.devicecolor.api

import com.flipperdevices.bridge.connection.feature.common.api.FDeviceFeatureApi
import com.flipperdevices.core.preference.pb.FlipperZeroBle.HardwareColor
import kotlinx.coroutines.flow.Flow

interface FDeviceColorFeatureApi : FDeviceFeatureApi {
/**
* Receive color from flipper and save it into settings
* @param default default value on response failure
*/
fun updateAndGetColorFlow(default: HardwareColor = HardwareColor.WHITE): Flow<HardwareColor>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
plugins {
id("flipper.multiplatform")
id("flipper.multiplatform-dependencies")
id("flipper.anvil-multiplatform")
}

android.namespace = "com.flipperdevices.bridge.connection.feature.devicecolor.impl"

commonDependencies {
implementation(projects.components.bridge.connection.feature.deviceColor.api)

implementation(projects.components.core.di)
implementation(projects.components.core.log)
implementation(projects.components.core.ktx)
implementation(projects.components.core.preference)
implementation(projects.components.core.data)

implementation(projects.components.bridge.connection.feature.common.api)
implementation(projects.components.bridge.connection.transport.common.api)
implementation(projects.components.bridge.connection.feature.getinfo.api)
implementation(projects.components.bridge.connection.config.api)

implementation(projects.components.bridge.connection.pbutils)

implementation(libs.kotlin.coroutines)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.flipperdevices.bridge.connection.feature.devicecolor.impl.api

import com.flipperdevices.bridge.connection.config.api.FDevicePersistedStorage
import com.flipperdevices.bridge.connection.config.api.model.FDeviceFlipperZeroBleModel
import com.flipperdevices.bridge.connection.feature.devicecolor.api.FDeviceColorFeatureApi
import com.flipperdevices.bridge.connection.feature.getinfo.api.FGetInfoFeatureApi
import com.flipperdevices.bridge.connection.feature.getinfo.model.FGetInfoApiProperty
import com.flipperdevices.core.log.LogTagProvider
import com.flipperdevices.core.log.error
import com.flipperdevices.core.preference.pb.FlipperZeroBle.HardwareColor
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flow

class FDeviceColorFeatureApiImpl @AssistedInject constructor(
@Assisted private val fGetInfoFeatureApi: FGetInfoFeatureApi,
private val fDevicePersistedStorage: FDevicePersistedStorage
) : FDeviceColorFeatureApi,
LogTagProvider {
override val TAG = "FDeviceColorFeatureApi"

override fun updateAndGetColorFlow(default: HardwareColor): Flow<HardwareColor> = flow {
val currentColoredDevice = fDevicePersistedStorage
.getCurrentDevice()
.first() as? FDeviceFlipperZeroBleModel
if (currentColoredDevice != null) {
emit(currentColoredDevice.hardwareColor)
}

val intHardwareColor = fGetInfoFeatureApi.get(FGetInfoApiProperty.DeviceInfo.HARDWARE_COLOR)
.onFailure { error(
it
) { "#updateAndGetColorFlow could not fetch ${FGetInfoApiProperty.DeviceInfo.HARDWARE_COLOR}" } }
.map { it.toIntOrNull() }
.getOrNull()

val hardwareColor = when (intHardwareColor) {
HardwareColor.WHITE.value -> HardwareColor.WHITE
HardwareColor.BLACK.value -> HardwareColor.BLACK
HardwareColor.TRANSPARENT.value -> HardwareColor.TRANSPARENT
else -> default
}
fDevicePersistedStorage.setCurrentDeviceColor(hardwareColor)
emit(hardwareColor)
}

@AssistedFactory
fun interface InternalFactory {
operator fun invoke(
fGetInfoFeatureApi: FGetInfoFeatureApi,
): FDeviceColorFeatureApiImpl
}
}
Loading