diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..09eaafe081 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "components/bridge/protobuf/flipperzero-protobuf"] + path = components/bridge/protobuf/flipperzero-protobuf + url = git@github.com:flipperdevices/flipperzero-protobuf.git diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 0cf18c4e64..a821861f20 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -13,4 +13,5 @@ dependencies { implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21") implementation("com.android.tools.build:gradle:7.0.2") implementation("com.squareup.anvil:gradle-plugin:2.3.4") + implementation("com.google.protobuf:protobuf-gradle-plugin:0.8.17") } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 59ba91d309..cf00820bec 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -36,6 +36,8 @@ object Versions { const val IMAGE_SLIDER = "1.4.0" const val GLIDE = "4.12.0" + + const val PROTOBUF = "3.18.1" } object GradlePlugins { @@ -91,6 +93,9 @@ object Libs { const val IMAGE_SLIDER = "com.github.smarteist:Android-Image-Slider:${Versions.IMAGE_SLIDER}" const val GLIDE = "com.github.bumptech.glide:glide:${Versions.GLIDE}" + + const val PROTOBUF_JAVA = "com.google.protobuf:protobuf-java:${Versions.PROTOBUF}" + const val PROTOBUF_PROTOC = "com.google.protobuf:protoc:${Versions.PROTOBUF}" } object TestingLib { diff --git a/components/bottombar/src/main/java/com/flipper/bottombar/api/BottomNavigationActivityApiImpl.kt b/components/bottombar/src/main/java/com/flipper/bottombar/api/BottomNavigationActivityApiImpl.kt index ada147a167..f3c7966eaa 100644 --- a/components/bottombar/src/main/java/com/flipper/bottombar/api/BottomNavigationActivityApiImpl.kt +++ b/components/bottombar/src/main/java/com/flipper/bottombar/api/BottomNavigationActivityApiImpl.kt @@ -17,8 +17,8 @@ class BottomNavigationActivityApiImpl @Inject constructor(private val context: C context.startActivity( Intent(context, BottomNavigationActivity::class.java).apply { flags = FLAG_ACTIVITY_CLEAR_TOP or - FLAG_ACTIVITY_CLEAR_TOP or - FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP or + FLAG_ACTIVITY_NEW_TASK } ) } diff --git a/components/bridge/api/.gitignore b/components/bridge/api/.gitignore new file mode 100644 index 0000000000..c795b054e5 --- /dev/null +++ b/components/bridge/api/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/components/bridge/api/build.gradle.kts b/components/bridge/api/build.gradle.kts new file mode 100644 index 0000000000..7f7779e20b --- /dev/null +++ b/components/bridge/api/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + id("com.android.library") + id("kotlin-android") + id("kotlin-parcelize") +} +apply() + +dependencies { + implementation(project(":components:core")) + + implementation(Libs.KOTLIN_COROUTINES) + implementation(Libs.NORDIC_BLE_COMMON) + implementation(Libs.NORDIC_BLE_SCAN) + implementation(Libs.NORDIC_BLE_KTX) + + implementation(Libs.APPCOMPAT) +} diff --git a/components/bridge/api/src/main/AndroidManifest.xml b/components/bridge/api/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..d7d0cfcd81 --- /dev/null +++ b/components/bridge/api/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + diff --git a/components/bridge/src/main/java/com/flipper/bridge/api/device/FlipperDeviceApi.kt b/components/bridge/api/src/main/java/com/flipper/bridge/api/device/FlipperDeviceApi.kt similarity index 81% rename from components/bridge/src/main/java/com/flipper/bridge/api/device/FlipperDeviceApi.kt rename to components/bridge/api/src/main/java/com/flipper/bridge/api/device/FlipperDeviceApi.kt index eec928595c..ddb90d44ec 100644 --- a/components/bridge/src/main/java/com/flipper/bridge/api/device/FlipperDeviceApi.kt +++ b/components/bridge/api/src/main/java/com/flipper/bridge/api/device/FlipperDeviceApi.kt @@ -1,6 +1,6 @@ package com.flipper.bridge.api.device -import com.flipper.bridge.impl.manager.FlipperBleManager +import com.flipper.bridge.api.manager.FlipperBleManager /** * Provide API to Flipper Device diff --git a/components/bridge/api/src/main/java/com/flipper/bridge/api/di/FlipperBleComponentInterface.kt b/components/bridge/api/src/main/java/com/flipper/bridge/api/di/FlipperBleComponentInterface.kt new file mode 100644 index 0000000000..06deebdcde --- /dev/null +++ b/components/bridge/api/src/main/java/com/flipper/bridge/api/di/FlipperBleComponentInterface.kt @@ -0,0 +1,9 @@ +package com.flipper.bridge.api.di + +import com.flipper.bridge.api.pair.FlipperPairApi +import com.flipper.bridge.api.scanner.FlipperScanner + +interface FlipperBleComponentInterface { + val flipperScanner: FlipperScanner + val flipperPairApi: FlipperPairApi +} diff --git a/components/bridge/api/src/main/java/com/flipper/bridge/api/manager/FlipperBleManager.kt b/components/bridge/api/src/main/java/com/flipper/bridge/api/manager/FlipperBleManager.kt new file mode 100644 index 0000000000..010f9bb05b --- /dev/null +++ b/components/bridge/api/src/main/java/com/flipper/bridge/api/manager/FlipperBleManager.kt @@ -0,0 +1,16 @@ +package com.flipper.bridge.api.manager + +import android.bluetooth.BluetoothDevice +import com.flipper.bridge.api.model.FlipperGATTInformation +import kotlinx.coroutines.flow.StateFlow +import no.nordicsemi.android.ble.ktx.state.ConnectionState + +interface FlipperBleManager { + val isDeviceConnected: Boolean + fun getInformationStateFlow(): StateFlow + fun getEchoStateFlow(): StateFlow + fun sendEcho(text: String) + fun getConnectionStateFlow(): StateFlow + fun connectToDevice(device: BluetoothDevice) + fun disconnectDevice() +} diff --git a/components/bridge/src/main/java/com/flipper/bridge/model/FlipperGATTInformation.kt b/components/bridge/api/src/main/java/com/flipper/bridge/api/model/FlipperGATTInformation.kt similarity index 89% rename from components/bridge/src/main/java/com/flipper/bridge/model/FlipperGATTInformation.kt rename to components/bridge/api/src/main/java/com/flipper/bridge/api/model/FlipperGATTInformation.kt index 0f73503dfd..e87ed75caa 100644 --- a/components/bridge/src/main/java/com/flipper/bridge/model/FlipperGATTInformation.kt +++ b/components/bridge/api/src/main/java/com/flipper/bridge/api/model/FlipperGATTInformation.kt @@ -1,4 +1,4 @@ -package com.flipper.bridge.model +package com.flipper.bridge.api.model /** * Data class which represent information via flipper diff --git a/components/bridge/src/main/java/com/flipper/bridge/api/pair/FlipperPairApi.kt b/components/bridge/api/src/main/java/com/flipper/bridge/api/pair/FlipperPairApi.kt similarity index 100% rename from components/bridge/src/main/java/com/flipper/bridge/api/pair/FlipperPairApi.kt rename to components/bridge/api/src/main/java/com/flipper/bridge/api/pair/FlipperPairApi.kt diff --git a/components/bridge/src/main/java/com/flipper/bridge/api/scanner/DiscoveredBluetoothDevice.kt b/components/bridge/api/src/main/java/com/flipper/bridge/api/scanner/DiscoveredBluetoothDevice.kt similarity index 100% rename from components/bridge/src/main/java/com/flipper/bridge/api/scanner/DiscoveredBluetoothDevice.kt rename to components/bridge/api/src/main/java/com/flipper/bridge/api/scanner/DiscoveredBluetoothDevice.kt diff --git a/components/bridge/src/main/java/com/flipper/bridge/api/scanner/FlipperScanner.kt b/components/bridge/api/src/main/java/com/flipper/bridge/api/scanner/FlipperScanner.kt similarity index 100% rename from components/bridge/src/main/java/com/flipper/bridge/api/scanner/FlipperScanner.kt rename to components/bridge/api/src/main/java/com/flipper/bridge/api/scanner/FlipperScanner.kt diff --git a/components/bridge/src/main/java/com/flipper/bridge/utils/Constants.kt b/components/bridge/api/src/main/java/com/flipper/bridge/api/utils/Constants.kt similarity index 97% rename from components/bridge/src/main/java/com/flipper/bridge/utils/Constants.kt rename to components/bridge/api/src/main/java/com/flipper/bridge/api/utils/Constants.kt index a6b8a3987f..48319097c9 100644 --- a/components/bridge/src/main/java/com/flipper/bridge/utils/Constants.kt +++ b/components/bridge/api/src/main/java/com/flipper/bridge/api/utils/Constants.kt @@ -1,4 +1,4 @@ -package com.flipper.bridge.utils +package com.flipper.bridge.api.utils import java.util.UUID import java.util.concurrent.TimeUnit diff --git a/components/bridge/src/main/java/com/flipper/bridge/utils/DeviceFeatureHelper.kt b/components/bridge/api/src/main/java/com/flipper/bridge/api/utils/DeviceFeatureHelper.kt similarity index 91% rename from components/bridge/src/main/java/com/flipper/bridge/utils/DeviceFeatureHelper.kt rename to components/bridge/api/src/main/java/com/flipper/bridge/api/utils/DeviceFeatureHelper.kt index e2e8449d3e..57c4d9435c 100644 --- a/components/bridge/src/main/java/com/flipper/bridge/utils/DeviceFeatureHelper.kt +++ b/components/bridge/api/src/main/java/com/flipper/bridge/api/utils/DeviceFeatureHelper.kt @@ -1,4 +1,4 @@ -package com.flipper.bridge.utils +package com.flipper.bridge.api.utils import android.content.Context import android.content.pm.PackageManager diff --git a/components/bridge/src/main/java/com/flipper/bridge/utils/PermissionHelper.kt b/components/bridge/api/src/main/java/com/flipper/bridge/api/utils/PermissionHelper.kt similarity index 97% rename from components/bridge/src/main/java/com/flipper/bridge/utils/PermissionHelper.kt rename to components/bridge/api/src/main/java/com/flipper/bridge/api/utils/PermissionHelper.kt index 2abc70bd41..294a97d1d6 100644 --- a/components/bridge/src/main/java/com/flipper/bridge/utils/PermissionHelper.kt +++ b/components/bridge/api/src/main/java/com/flipper/bridge/api/utils/PermissionHelper.kt @@ -1,4 +1,4 @@ -package com.flipper.bridge.utils +package com.flipper.bridge.api.utils import android.Manifest import android.bluetooth.BluetoothAdapter diff --git a/components/bridge/consumer-rules.pro b/components/bridge/consumer-rules.pro deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/components/bridge/.gitignore b/components/bridge/impl/.gitignore similarity index 100% rename from components/bridge/.gitignore rename to components/bridge/impl/.gitignore diff --git a/components/bridge/build.gradle.kts b/components/bridge/impl/build.gradle.kts similarity index 72% rename from components/bridge/build.gradle.kts rename to components/bridge/impl/build.gradle.kts index cb9ab74962..b01aedaa63 100644 --- a/components/bridge/build.gradle.kts +++ b/components/bridge/impl/build.gradle.kts @@ -2,22 +2,23 @@ plugins { id("com.android.library") id("kotlin-android") id("kotlin-kapt") - id("kotlin-parcelize") } apply() dependencies { implementation(project(":components:core")) + implementation(project(":components:bridge:api")) + implementation(project(":components:bridge:protobuf")) - api(Libs.KOTLIN_COROUTINES) + implementation(Libs.KOTLIN_COROUTINES) implementation(Libs.ANNOTATIONS) implementation(Libs.CORE_KTX) implementation(Libs.APPCOMPAT) implementation(Libs.NORDIC_BLE_SCAN) - api(Libs.NORDIC_BLE) - api(Libs.NORDIC_BLE_KTX) + implementation(Libs.NORDIC_BLE) + implementation(Libs.NORDIC_BLE_KTX) implementation(Libs.NORDIC_BLE_COMMON) implementation(Libs.DAGGER) diff --git a/components/bridge/src/main/AndroidManifest.xml b/components/bridge/impl/src/main/AndroidManifest.xml similarity index 100% rename from components/bridge/src/main/AndroidManifest.xml rename to components/bridge/impl/src/main/AndroidManifest.xml diff --git a/components/bridge/src/main/java/com/flipper/bridge/di/AndroidBleModule.kt b/components/bridge/impl/src/main/java/com/flipper/bridge/di/AndroidBleModule.kt similarity index 100% rename from components/bridge/src/main/java/com/flipper/bridge/di/AndroidBleModule.kt rename to components/bridge/impl/src/main/java/com/flipper/bridge/di/AndroidBleModule.kt diff --git a/components/bridge/src/main/java/com/flipper/bridge/di/FlipperBleComponent.kt b/components/bridge/impl/src/main/java/com/flipper/bridge/di/FlipperBleComponent.kt similarity index 53% rename from components/bridge/src/main/java/com/flipper/bridge/di/FlipperBleComponent.kt rename to components/bridge/impl/src/main/java/com/flipper/bridge/di/FlipperBleComponent.kt index 0406eccdc1..b5ec6aeafb 100644 --- a/components/bridge/src/main/java/com/flipper/bridge/di/FlipperBleComponent.kt +++ b/components/bridge/impl/src/main/java/com/flipper/bridge/di/FlipperBleComponent.kt @@ -1,15 +1,9 @@ package com.flipper.bridge.di -import com.flipper.bridge.api.pair.FlipperPairApi -import com.flipper.bridge.api.scanner.FlipperScanner +import com.flipper.bridge.api.di.FlipperBleComponentInterface import dagger.Component import javax.inject.Singleton -interface FlipperBleComponentInterface { - val flipperScanner: FlipperScanner - val flipperPairApi: FlipperPairApi -} - @Singleton @Component(modules = [NordicBleModule::class, FlipperBleModule::class, AndroidBleModule::class]) interface FlipperBleComponent : FlipperBleComponentInterface diff --git a/components/bridge/src/main/java/com/flipper/bridge/di/FlipperBleModule.kt b/components/bridge/impl/src/main/java/com/flipper/bridge/di/FlipperBleModule.kt similarity index 100% rename from components/bridge/src/main/java/com/flipper/bridge/di/FlipperBleModule.kt rename to components/bridge/impl/src/main/java/com/flipper/bridge/di/FlipperBleModule.kt diff --git a/components/bridge/src/main/java/com/flipper/bridge/di/NordicBleModule.kt b/components/bridge/impl/src/main/java/com/flipper/bridge/di/NordicBleModule.kt similarity index 100% rename from components/bridge/src/main/java/com/flipper/bridge/di/NordicBleModule.kt rename to components/bridge/impl/src/main/java/com/flipper/bridge/di/NordicBleModule.kt diff --git a/components/bridge/impl/src/main/java/com/flipper/bridge/impl/device/FlipperDeviceApiImpl.kt b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/device/FlipperDeviceApiImpl.kt new file mode 100644 index 0000000000..5fc85709ee --- /dev/null +++ b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/device/FlipperDeviceApiImpl.kt @@ -0,0 +1,13 @@ +package com.flipper.bridge.impl.device + +import com.flipper.bridge.api.device.FlipperDeviceApi +import com.flipper.bridge.impl.manager.FlipperBleManagerImpl + +class FlipperDeviceApiImpl( + private val bleManagerImpl: FlipperBleManagerImpl, + override val address: String +) : FlipperDeviceApi { + override fun getBleManager(): FlipperBleManagerImpl { + return bleManagerImpl + } +} diff --git a/components/bridge/src/main/java/com/flipper/bridge/impl/manager/ConnectionObserverLogger.kt b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/manager/ConnectionObserverLogger.kt similarity index 100% rename from components/bridge/src/main/java/com/flipper/bridge/impl/manager/ConnectionObserverLogger.kt rename to components/bridge/impl/src/main/java/com/flipper/bridge/impl/manager/ConnectionObserverLogger.kt diff --git a/components/bridge/src/main/java/com/flipper/bridge/impl/manager/FlipperBleManager.kt b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/manager/FlipperBleManagerImpl.kt similarity index 81% rename from components/bridge/src/main/java/com/flipper/bridge/impl/manager/FlipperBleManager.kt rename to components/bridge/impl/src/main/java/com/flipper/bridge/impl/manager/FlipperBleManagerImpl.kt index bfcde49c6f..2376c772cd 100644 --- a/components/bridge/src/main/java/com/flipper/bridge/impl/manager/FlipperBleManager.kt +++ b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/manager/FlipperBleManagerImpl.kt @@ -1,10 +1,12 @@ package com.flipper.bridge.impl.manager +import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothGatt import android.bluetooth.BluetoothGattCharacteristic import android.content.Context -import com.flipper.bridge.model.FlipperGATTInformation -import com.flipper.bridge.utils.Constants +import com.flipper.bridge.api.manager.FlipperBleManager +import com.flipper.bridge.api.model.FlipperGATTInformation +import com.flipper.bridge.api.utils.Constants import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.MutableStateFlow @@ -12,18 +14,31 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import no.nordicsemi.android.ble.BleManager +import no.nordicsemi.android.ble.ktx.state.ConnectionState +import no.nordicsemi.android.ble.ktx.stateAsFlow import timber.log.Timber import java.util.UUID -class FlipperBleManager(context: Context) : BleManager(context) { +class FlipperBleManagerImpl(context: Context) : BleManager(context), FlipperBleManager { private val informationState = MutableStateFlow(FlipperGATTInformation()) private val echoText = MutableStateFlow(ByteArray(0)) private val infoCharacteristics = mutableMapOf() private var serialTxCharacteristic: BluetoothGattCharacteristic? = null private var serialRxCharacteristic: BluetoothGattCharacteristic? = null + override val isDeviceConnected = super.isConnected() + + override fun getInformationStateFlow(): StateFlow = informationState + override fun getEchoStateFlow(): StateFlow = echoText + override fun getConnectionStateFlow(): StateFlow = stateAsFlow() + override fun disconnectDevice() = disconnect().enqueue() + override fun connectToDevice(device: BluetoothDevice) { + connect(device).retry( + Constants.BLE.RECONNECT_COUNT, + Constants.BLE.RECONNECT_TIME_MS.toInt() + ).useAutoConnect(true) + .enqueue() + } - fun getInformationState(): StateFlow = informationState - fun getEchoState(): StateFlow = echoText override fun log(priority: Int, message: String) { Timber.d(message) } @@ -35,7 +50,7 @@ class FlipperBleManager(context: Context) : BleManager(context) { override fun getGattCallback(): BleManagerGattCallback = FlipperBleManagerGattCallback() - fun sendEcho(text: String) { + override fun sendEcho(text: String) { writeCharacteristic(serialTxCharacteristic, text.toByteArray()).enqueue() } diff --git a/components/bridge/src/main/java/com/flipper/bridge/impl/pair/FlipperPairApiImpl.kt b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/pair/FlipperPairApiImpl.kt similarity index 84% rename from components/bridge/src/main/java/com/flipper/bridge/impl/pair/FlipperPairApiImpl.kt rename to components/bridge/impl/src/main/java/com/flipper/bridge/impl/pair/FlipperPairApiImpl.kt index 3c5ea54ccf..2197538caa 100644 --- a/components/bridge/src/main/java/com/flipper/bridge/impl/pair/FlipperPairApiImpl.kt +++ b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/pair/FlipperPairApiImpl.kt @@ -6,11 +6,11 @@ import android.content.Context import com.flipper.bridge.api.device.FlipperDeviceApi import com.flipper.bridge.api.pair.FlipperPairApi import com.flipper.bridge.api.scanner.FlipperScanner +import com.flipper.bridge.api.utils.Constants +import com.flipper.bridge.api.utils.DeviceFeatureHelper +import com.flipper.bridge.api.utils.PermissionHelper import com.flipper.bridge.impl.device.FlipperDeviceApiImpl -import com.flipper.bridge.impl.manager.FlipperBleManager -import com.flipper.bridge.utils.Constants -import com.flipper.bridge.utils.DeviceFeatureHelper -import com.flipper.bridge.utils.PermissionHelper +import com.flipper.bridge.impl.manager.FlipperBleManagerImpl import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first import kotlinx.coroutines.withTimeout @@ -32,7 +32,7 @@ class FlipperPairApiImpl @Inject constructor( return deviceApi } - val manager = FlipperBleManager(context) + val manager = FlipperBleManagerImpl(context) return FlipperDeviceApiImpl(manager, deviceId) } @@ -42,7 +42,7 @@ class FlipperPairApiImpl @Inject constructor( flipperDeviceApi: FlipperDeviceApi ) { // If we already connected to device, just ignore it - if (flipperDeviceApi.getBleManager().isConnected) { + if (flipperDeviceApi.getBleManager().isDeviceConnected) { return } // If Bluetooth disable, return exception @@ -61,13 +61,10 @@ class FlipperPairApiImpl @Inject constructor( } override fun scheduleConnect(flipperDeviceApi: FlipperDeviceApi, device: BluetoothDevice) { - if (flipperDeviceApi.getBleManager().isConnected) { + if (flipperDeviceApi.getBleManager().isDeviceConnected) { return } - flipperDeviceApi.getBleManager().connect(device) - .retry(Constants.BLE.RECONNECT_COUNT, Constants.BLE.RECONNECT_TIME_MS.toInt()) - .useAutoConnect(true) - .enqueue() + flipperDeviceApi.getBleManager().connectToDevice(device) } private fun connectWithBondedDevice(flipperDeviceApi: FlipperDeviceApi) { diff --git a/components/bridge/src/main/java/com/flipper/bridge/impl/receiver/README.md b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/receiver/README.md similarity index 100% rename from components/bridge/src/main/java/com/flipper/bridge/impl/receiver/README.md rename to components/bridge/impl/src/main/java/com/flipper/bridge/impl/receiver/README.md diff --git a/components/bridge/src/main/java/com/flipper/bridge/impl/scanner/FlipperScannerImpl.kt b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/scanner/FlipperScannerImpl.kt similarity index 97% rename from components/bridge/src/main/java/com/flipper/bridge/impl/scanner/FlipperScannerImpl.kt rename to components/bridge/impl/src/main/java/com/flipper/bridge/impl/scanner/FlipperScannerImpl.kt index d8f4aa75b2..40ade16584 100644 --- a/components/bridge/src/main/java/com/flipper/bridge/impl/scanner/FlipperScannerImpl.kt +++ b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/scanner/FlipperScannerImpl.kt @@ -2,7 +2,7 @@ package com.flipper.bridge.impl.scanner import com.flipper.bridge.api.scanner.DiscoveredBluetoothDevice import com.flipper.bridge.api.scanner.FlipperScanner -import com.flipper.bridge.utils.Constants +import com.flipper.bridge.api.utils.Constants import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filter diff --git a/components/bridge/src/main/java/com/flipper/bridge/impl/scanner/FlowScanCallback.kt b/components/bridge/impl/src/main/java/com/flipper/bridge/impl/scanner/FlowScanCallback.kt similarity index 100% rename from components/bridge/src/main/java/com/flipper/bridge/impl/scanner/FlowScanCallback.kt rename to components/bridge/impl/src/main/java/com/flipper/bridge/impl/scanner/FlowScanCallback.kt diff --git a/components/bridge/src/test/java/com/flipper/bridge/ExampleUnitTest.kt b/components/bridge/impl/src/test/java/com/flipper/bridge/ExampleUnitTest.kt similarity index 100% rename from components/bridge/src/test/java/com/flipper/bridge/ExampleUnitTest.kt rename to components/bridge/impl/src/test/java/com/flipper/bridge/ExampleUnitTest.kt diff --git a/components/bridge/proguard-rules.pro b/components/bridge/proguard-rules.pro deleted file mode 100644 index 481bb43481..0000000000 --- a/components/bridge/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/components/bridge/protobuf/build.gradle.kts b/components/bridge/protobuf/build.gradle.kts new file mode 100644 index 0000000000..78cb0153e9 --- /dev/null +++ b/components/bridge/protobuf/build.gradle.kts @@ -0,0 +1,41 @@ +import com.google.protobuf.gradle.generateProtoTasks +import com.google.protobuf.gradle.id +import com.google.protobuf.gradle.proto +import com.google.protobuf.gradle.protobuf +import com.google.protobuf.gradle.protoc + +plugins { + id("com.android.library") + id("kotlin-android") + id("com.google.protobuf") +} +apply() + +dependencies { + implementation(project(":components:core")) + api(Libs.PROTOBUF_JAVA) +} + +protobuf { + protoc { + artifact = Libs.PROTOBUF_PROTOC + } + + generateProtoTasks { + all().forEach { + it.builtins { + id("java") { + option("lite") + } + } + } + } +} + +android { + sourceSets { + (getByName("main") as com.android.build.gradle.api.AndroidSourceSet).proto { + srcDir("$projectDir/flipperzero-protobuf") + } + } +} diff --git a/components/bridge/protobuf/flipperzero-protobuf b/components/bridge/protobuf/flipperzero-protobuf new file mode 160000 index 0000000000..c05b20f84d --- /dev/null +++ b/components/bridge/protobuf/flipperzero-protobuf @@ -0,0 +1 @@ +Subproject commit c05b20f84d63cc5dd03c6602d2079d20ed0dbf98 diff --git a/components/bridge/protobuf/src/main/AndroidManifest.xml b/components/bridge/protobuf/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..361970b83b --- /dev/null +++ b/components/bridge/protobuf/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/components/bridge/provider/.gitignore b/components/bridge/provider/.gitignore new file mode 100644 index 0000000000..c795b054e5 --- /dev/null +++ b/components/bridge/provider/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/components/bridge/provider/build.gradle.kts b/components/bridge/provider/build.gradle.kts new file mode 100644 index 0000000000..523b48b2e7 --- /dev/null +++ b/components/bridge/provider/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + id("com.android.library") + id("kotlin-android") +} +apply() + +dependencies { + api(project(":components:bridge:api")) + implementation(project(":components:bridge:impl")) +} diff --git a/components/bridge/provider/src/main/AndroidManifest.xml b/components/bridge/provider/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..f8cf6c225f --- /dev/null +++ b/components/bridge/provider/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/components/bridge/provider/src/main/java/com/flipper/bridge/provider/FlipperApi.kt b/components/bridge/provider/src/main/java/com/flipper/bridge/provider/FlipperApi.kt new file mode 100644 index 0000000000..564575d5c1 --- /dev/null +++ b/components/bridge/provider/src/main/java/com/flipper/bridge/provider/FlipperApi.kt @@ -0,0 +1,8 @@ +package com.flipper.bridge.provider + +import com.flipper.bridge.api.di.FlipperBleComponentInterface + +/** + * Entry point for Flipper Api + */ +object FlipperApi : FlipperBleComponentInterface by FlipperBleComponentProvider.component diff --git a/components/bridge/src/main/java/com/flipper/bridge/di/FlipperBleComponentProvider.kt b/components/bridge/provider/src/main/java/com/flipper/bridge/provider/FlipperBleComponentProvider.kt similarity index 51% rename from components/bridge/src/main/java/com/flipper/bridge/di/FlipperBleComponentProvider.kt rename to components/bridge/provider/src/main/java/com/flipper/bridge/provider/FlipperBleComponentProvider.kt index eecffd1590..1bd36cb0b8 100644 --- a/components/bridge/src/main/java/com/flipper/bridge/di/FlipperBleComponentProvider.kt +++ b/components/bridge/provider/src/main/java/com/flipper/bridge/provider/FlipperBleComponentProvider.kt @@ -1,4 +1,7 @@ -package com.flipper.bridge.di +package com.flipper.bridge.provider + +import com.flipper.bridge.di.DaggerFlipperBleComponent +import com.flipper.bridge.di.FlipperBleComponent internal object FlipperBleComponentProvider { val component: FlipperBleComponent by lazy { diff --git a/components/bridge/src/main/java/com/flipper/bridge/api/FlipperApi.kt b/components/bridge/src/main/java/com/flipper/bridge/api/FlipperApi.kt deleted file mode 100644 index 9166fcf61d..0000000000 --- a/components/bridge/src/main/java/com/flipper/bridge/api/FlipperApi.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.flipper.bridge.api - -import com.flipper.bridge.di.FlipperBleComponentInterface -import com.flipper.bridge.di.FlipperBleComponentProvider - -/** - * Entry point for Flipper Api - */ -object FlipperApi : FlipperBleComponentInterface by FlipperBleComponentProvider.component diff --git a/components/bridge/src/main/java/com/flipper/bridge/impl/device/FlipperDeviceApiImpl.kt b/components/bridge/src/main/java/com/flipper/bridge/impl/device/FlipperDeviceApiImpl.kt deleted file mode 100644 index fa12fea2a5..0000000000 --- a/components/bridge/src/main/java/com/flipper/bridge/impl/device/FlipperDeviceApiImpl.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.flipper.bridge.impl.device - -import com.flipper.bridge.api.device.FlipperDeviceApi -import com.flipper.bridge.impl.manager.FlipperBleManager - -class FlipperDeviceApiImpl( - private val bleManager: FlipperBleManager, - override val address: String -) : FlipperDeviceApi { - override fun getBleManager(): FlipperBleManager { - return bleManager - } -} diff --git a/components/info/build.gradle.kts b/components/info/build.gradle.kts index 5d2702681b..7e0a3fb49c 100644 --- a/components/info/build.gradle.kts +++ b/components/info/build.gradle.kts @@ -24,7 +24,7 @@ dependencies { kapt(Libs.DAGGER_COMPILER) implementation(project(":components:core")) - implementation(project(":components:bridge")) + implementation(project(":components:bridge:provider")) implementation(project(":components:pair:api")) implementation(Libs.COMPOSE_UI) @@ -37,4 +37,9 @@ dependencies { implementation(Libs.LIFECYCLE_VIEWMODEL_KTX) implementation(Libs.FRAGMENT_KTX) + + implementation(Libs.NORDIC_BLE) + implementation(Libs.NORDIC_BLE_KTX) + implementation(Libs.NORDIC_BLE_COMMON) + implementation(Libs.NORDIC_BLE_SCAN) } diff --git a/components/info/src/main/java/com/flipper/info/main/compose/ComposeInfoScreen.kt b/components/info/src/main/java/com/flipper/info/main/compose/ComposeInfoScreen.kt index ebdcd04950..05572972b7 100644 --- a/components/info/src/main/java/com/flipper/info/main/compose/ComposeInfoScreen.kt +++ b/components/info/src/main/java/com/flipper/info/main/compose/ComposeInfoScreen.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.flipper.bridge.model.FlipperGATTInformation +import com.flipper.bridge.api.model.FlipperGATTInformation import com.flipper.info.R import no.nordicsemi.android.ble.ktx.state.ConnectionState diff --git a/components/info/src/main/java/com/flipper/info/main/service/FlipperViewModel.kt b/components/info/src/main/java/com/flipper/info/main/service/FlipperViewModel.kt index c0ae1b1e21..961f95eaed 100644 --- a/components/info/src/main/java/com/flipper/info/main/service/FlipperViewModel.kt +++ b/components/info/src/main/java/com/flipper/info/main/service/FlipperViewModel.kt @@ -3,10 +3,10 @@ package com.flipper.info.main.service import android.app.Application import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope -import com.flipper.bridge.api.FlipperApi import com.flipper.bridge.api.device.FlipperDeviceApi -import com.flipper.bridge.impl.manager.FlipperBleManager -import com.flipper.bridge.model.FlipperGATTInformation +import com.flipper.bridge.api.manager.FlipperBleManager +import com.flipper.bridge.api.model.FlipperGATTInformation +import com.flipper.bridge.provider.FlipperApi import com.flipper.core.utils.toast import com.flipper.info.R import kotlinx.coroutines.Dispatchers @@ -19,7 +19,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import no.nordicsemi.android.ble.exception.BluetoothDisabledException import no.nordicsemi.android.ble.ktx.state.ConnectionState -import no.nordicsemi.android.ble.ktx.stateAsFlow import timber.log.Timber class FlipperViewModel(application: Application) : AndroidViewModel(application) { @@ -69,7 +68,7 @@ class FlipperViewModel(application: Application) : AndroidViewModel(application) private suspend fun subscribeToEcho(bleManager: FlipperBleManager) = withContext(Dispatchers.IO) { - bleManager.getEchoState().collect { + bleManager.getEchoStateFlow().collect { if (it.isEmpty()) { return@collect } @@ -80,22 +79,22 @@ class FlipperViewModel(application: Application) : AndroidViewModel(application) private suspend fun subscribeToInformationState(bleManager: FlipperBleManager) = withContext(Dispatchers.IO) { - bleManager.getInformationState().collect { + bleManager.getInformationStateFlow().collect { deviceInformation.emit(it) } } private suspend fun subscribeToConnectionState(bleManager: FlipperBleManager) = withContext(Dispatchers.IO) { - bleManager.stateAsFlow().collect { + bleManager.getConnectionStateFlow().collect { connectionState.emit(it) } } override fun onCleared() { super.onCleared() - if (currentDevice?.getBleManager()?.isConnected == true) { - currentDevice?.getBleManager()?.disconnect() + if (currentDevice?.getBleManager()?.isDeviceConnected == true) { + currentDevice?.getBleManager()?.disconnectDevice() } } } diff --git a/components/pair/impl/build.gradle.kts b/components/pair/impl/build.gradle.kts index 0cf02c82de..863213e88f 100644 --- a/components/pair/impl/build.gradle.kts +++ b/components/pair/impl/build.gradle.kts @@ -16,7 +16,8 @@ android { dependencies { implementation(project(":components:core")) - implementation(project(":components:bridge")) + implementation(project(":components:bridge:api")) + implementation(project(":components:bridge:provider")) implementation(project(":components:pair:api")) implementation(Libs.KOTLIN_COROUTINES) @@ -37,7 +38,8 @@ dependencies { implementation(Libs.IMAGE_SLIDER) implementation(Libs.GLIDE) - testImplementation(TestingLib.JUNIT) - testImplementation(TestingLib.ROBOLECTRIC) - testImplementation(TestingLib.ASSERTJ) + implementation(Libs.NORDIC_BLE) + implementation(Libs.NORDIC_BLE_KTX) + implementation(Libs.NORDIC_BLE_COMMON) + implementation(Libs.NORDIC_BLE_SCAN) } diff --git a/components/pair/impl/src/main/java/com/flipper/pair/impl/findstandart/service/BLEDeviceViewModel.kt b/components/pair/impl/src/main/java/com/flipper/pair/impl/findstandart/service/BLEDeviceViewModel.kt index 355da41166..c5d4c5433d 100644 --- a/components/pair/impl/src/main/java/com/flipper/pair/impl/findstandart/service/BLEDeviceViewModel.kt +++ b/components/pair/impl/src/main/java/com/flipper/pair/impl/findstandart/service/BLEDeviceViewModel.kt @@ -2,8 +2,8 @@ package com.flipper.pair.impl.findstandart.service import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.flipper.bridge.api.FlipperApi import com.flipper.bridge.api.scanner.DiscoveredBluetoothDevice +import com.flipper.bridge.provider.FlipperApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow diff --git a/components/pair/impl/src/main/java/com/flipper/pair/impl/findstandart/service/PairDeviceViewModel.kt b/components/pair/impl/src/main/java/com/flipper/pair/impl/findstandart/service/PairDeviceViewModel.kt index c0939e8bf2..1d1ff70779 100644 --- a/components/pair/impl/src/main/java/com/flipper/pair/impl/findstandart/service/PairDeviceViewModel.kt +++ b/components/pair/impl/src/main/java/com/flipper/pair/impl/findstandart/service/PairDeviceViewModel.kt @@ -4,14 +4,13 @@ import android.app.Application import android.bluetooth.BluetoothDevice import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope -import com.flipper.bridge.api.FlipperApi +import com.flipper.bridge.provider.FlipperApi import com.flipper.pair.impl.model.findcompanion.PairingState import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import no.nordicsemi.android.ble.ktx.state.ConnectionState -import no.nordicsemi.android.ble.ktx.stateAsFlow class PairDeviceViewModel(application: Application) : AndroidViewModel(application) { private val context = application @@ -22,7 +21,7 @@ class PairDeviceViewModel(application: Application) : AndroidViewModel(applicati fun startConnectToDevice(device: BluetoothDevice, onReady: () -> Unit) { val flipperDeviceApi = FlipperApi.flipperPairApi.getFlipperApi(context, device.address) viewModelScope.launch { - flipperDeviceApi.getBleManager().stateAsFlow().collect { + flipperDeviceApi.getBleManager().getConnectionStateFlow().collect { _state.emit(PairingState.WithDevice(it)) if (it == ConnectionState.Ready) { onReady() diff --git a/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/common/BluetoothEnableHelper.kt b/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/common/BluetoothEnableHelper.kt index 4901b2320f..46be84ccf5 100644 --- a/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/common/BluetoothEnableHelper.kt +++ b/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/common/BluetoothEnableHelper.kt @@ -6,7 +6,7 @@ import android.content.Intent import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.Fragment -import com.flipper.bridge.utils.PermissionHelper +import com.flipper.bridge.api.utils.PermissionHelper import com.flipper.core.utils.toast import com.flipper.pair.impl.R diff --git a/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/findcompanion/CompanionFindFragment.kt b/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/findcompanion/CompanionFindFragment.kt index 925a1b8e4e..8b173ccb10 100644 --- a/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/findcompanion/CompanionFindFragment.kt +++ b/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/findcompanion/CompanionFindFragment.kt @@ -18,7 +18,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.core.content.edit import androidx.fragment.app.viewModels -import com.flipper.bridge.utils.Constants +import com.flipper.bridge.api.utils.Constants import com.flipper.core.di.ComponentHolder import com.flipper.core.utils.preference.FlipperSharedPreferences import com.flipper.core.utils.preference.FlipperSharedPreferencesKey diff --git a/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/permission/PermissionFragment.kt b/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/permission/PermissionFragment.kt index 5c1285722b..39bee93239 100644 --- a/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/permission/PermissionFragment.kt +++ b/components/pair/impl/src/main/java/com/flipper/pair/impl/fragments/permission/PermissionFragment.kt @@ -5,8 +5,8 @@ import android.os.Bundle import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.Composable import androidx.core.content.ContextCompat -import com.flipper.bridge.utils.DeviceFeatureHelper -import com.flipper.bridge.utils.PermissionHelper +import com.flipper.bridge.api.utils.DeviceFeatureHelper +import com.flipper.bridge.api.utils.PermissionHelper import com.flipper.core.di.ComponentHolder import com.flipper.core.utils.toast import com.flipper.core.view.ComposeFragment @@ -42,9 +42,9 @@ class PermissionFragment : ComposeFragment() { // If we have companion feature, we just want enable bluetooth on this screen if (PermissionHelper.isBluetoothEnabled() && ( - DeviceFeatureHelper.isCompanionFeatureAvailable(requireContext()) || - PermissionHelper.isPermissionGranted(requireContext()) - ) + DeviceFeatureHelper.isCompanionFeatureAvailable(requireContext()) || + PermissionHelper.isPermissionGranted(requireContext()) + ) ) { onAllPermissionGranted() return diff --git a/components/pair/impl/src/main/java/com/flipper/pair/impl/navigation/machine/PairScreenStateDispatcherImpl.kt b/components/pair/impl/src/main/java/com/flipper/pair/impl/navigation/machine/PairScreenStateDispatcherImpl.kt index 561f550d57..ebb5b580eb 100644 --- a/components/pair/impl/src/main/java/com/flipper/pair/impl/navigation/machine/PairScreenStateDispatcherImpl.kt +++ b/components/pair/impl/src/main/java/com/flipper/pair/impl/navigation/machine/PairScreenStateDispatcherImpl.kt @@ -2,7 +2,7 @@ package com.flipper.pair.impl.navigation.machine import android.content.Context import android.os.Build -import com.flipper.bridge.utils.DeviceFeatureHelper +import com.flipper.bridge.api.utils.DeviceFeatureHelper import com.flipper.core.api.BottomNavigationActivityApi import com.flipper.core.di.AppGraph import com.flipper.pair.impl.navigation.models.PairNavigationScreens diff --git a/components/pair/impl/src/main/java/com/flipper/pair/impl/navigation/storage/PairStateStorageImpl.kt b/components/pair/impl/src/main/java/com/flipper/pair/impl/navigation/storage/PairStateStorageImpl.kt index 32aab47250..cdc480881c 100644 --- a/components/pair/impl/src/main/java/com/flipper/pair/impl/navigation/storage/PairStateStorageImpl.kt +++ b/components/pair/impl/src/main/java/com/flipper/pair/impl/navigation/storage/PairStateStorageImpl.kt @@ -3,8 +3,8 @@ package com.flipper.pair.impl.navigation.storage import android.content.Context import android.content.SharedPreferences import androidx.core.content.edit -import com.flipper.bridge.utils.DeviceFeatureHelper -import com.flipper.bridge.utils.PermissionHelper +import com.flipper.bridge.api.utils.DeviceFeatureHelper +import com.flipper.bridge.api.utils.PermissionHelper import com.flipper.core.di.AppGraph import com.flipper.core.utils.preference.FlipperSharedPreferencesKey import com.flipper.pair.impl.navigation.models.PairScreenState diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4fd8bece47..7cca3ebb3a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ #Mon Aug 23 14:00:45 EET 2021 distributionBase=GRADLE_USER_HOME #Be careful! See more in /buildSrc/src/main/java/Dependencies.kt#NOTE_CONFIGURATION_PLUGIN -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/instances/app/build.gradle.kts b/instances/app/build.gradle.kts index 0f1e638bc6..bf41cd6254 100644 --- a/instances/app/build.gradle.kts +++ b/instances/app/build.gradle.kts @@ -9,7 +9,6 @@ apply() dependencies { implementation(project(":components:core")) - implementation(project(":components:bridge")) implementation(project(":components:pair:api")) implementation(project(":components:pair:impl")) implementation(project(":components:info")) diff --git a/settings.gradle.kts b/settings.gradle.kts index 7b5079c851..73ccbb40a0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,8 @@ rootProject.name = "Flipper App" -include(":components:bridge") +include(":components:bridge:api") +include(":components:bridge:impl") +include(":components:bridge:provider") +include(":components:bridge:protobuf") include(":components:core") include(":components:pair:api") include(":components:pair:impl")