diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5ad7c521fe..e51f6d7c6b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,7 +44,7 @@ jobs: BUILD_VARIANT_NAME: "release" build_release: name: Build Release AAB and APK - runs-on: [self-hosted, AndroidShell] + runs-on: ubuntu-latest needs: [ create_release_baseline,build_number ] strategy: matrix: @@ -116,7 +116,7 @@ jobs: path: ${{ steps.artifacts_copy.outputs.path }} build_release_gms_wearos: name: Build AAB and APK WearOS - runs-on: [self-hosted, AndroidShell] + runs-on: ubuntu-latest needs: build_number steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 27aef71a0f..ca9170d185 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ Attention: don't forget to add the flag for F-Droid before release - [FIX] Fap manifest caching - [FIX] Remote controls design issues - [FIX] Fix flaky test +- [FIX] Infinite dispatch after screen close on remote-control screens - [FIX] Bad bottom sheet animation on infrared setup screen - [CI] Fix merge-queue files diff - [CI] Add https://github.com/LionZXY/detekt-decompose-rule @@ -39,6 +40,7 @@ Attention: don't forget to add the flag for F-Droid before release - [CI] Merge CI workflows in one - [CI] Update CI changed-files action - [CI] Update CI for github runners +- [CI] Remote self-hosted runners # 1.7.1 diff --git a/components/keyemulate/api/src/main/kotlin/com/flipperdevices/keyemulate/tasks/CloseEmulateAppTaskHolder.kt b/components/keyemulate/api/src/main/kotlin/com/flipperdevices/keyemulate/tasks/CloseEmulateAppTaskHolder.kt new file mode 100644 index 0000000000..2127d63bb7 --- /dev/null +++ b/components/keyemulate/api/src/main/kotlin/com/flipperdevices/keyemulate/tasks/CloseEmulateAppTaskHolder.kt @@ -0,0 +1,8 @@ +package com.flipperdevices.keyemulate.tasks + +import com.flipperdevices.bridge.service.api.provider.FlipperServiceProvider +import com.flipperdevices.keyemulate.api.EmulateHelper + +interface CloseEmulateAppTaskHolder { + fun closeEmulateApp(serviceProvider: FlipperServiceProvider, emulateHelper: EmulateHelper) +} diff --git a/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/tasks/CloseEmulateAppTaskHolder.kt b/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/tasks/CloseEmulateAppTaskHolderImpl.kt similarity index 56% rename from components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/tasks/CloseEmulateAppTaskHolder.kt rename to components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/tasks/CloseEmulateAppTaskHolderImpl.kt index ad89d6e11c..e421654caa 100644 --- a/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/tasks/CloseEmulateAppTaskHolder.kt +++ b/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/tasks/CloseEmulateAppTaskHolderImpl.kt @@ -1,13 +1,22 @@ package com.flipperdevices.keyemulate.tasks import com.flipperdevices.bridge.service.api.provider.FlipperServiceProvider +import com.flipperdevices.core.di.AppGraph import com.flipperdevices.keyemulate.api.EmulateHelper +import com.squareup.anvil.annotations.ContributesBinding +import javax.inject.Inject +import javax.inject.Singleton -object CloseEmulateAppTaskHolder { +@Singleton +@ContributesBinding(AppGraph::class, CloseEmulateAppTaskHolder::class) +class CloseEmulateAppTaskHolderImpl @Inject constructor() : CloseEmulateAppTaskHolder { private var closeEmulateAppTask: CloseEmulateAppTask? = null @Synchronized - fun closeEmulateApp(serviceProvider: FlipperServiceProvider, emulateHelper: EmulateHelper) { + override fun closeEmulateApp( + serviceProvider: FlipperServiceProvider, + emulateHelper: EmulateHelper + ) { if (closeEmulateAppTask != null) { return } diff --git a/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/EmulateViewModel.kt b/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/EmulateViewModel.kt index 3648878729..eb29b56ee4 100644 --- a/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/EmulateViewModel.kt +++ b/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/EmulateViewModel.kt @@ -41,6 +41,7 @@ abstract class EmulateViewModel( private val serviceProvider: FlipperServiceProvider, private val emulateHelper: EmulateHelper, private val synchronizationApi: SynchronizationApi, + private val closeEmulateAppTaskHolder: CloseEmulateAppTaskHolder, application: FlipperApp ) : DecomposeViewModel(), LogTagProvider, FlipperBleServiceConsumer { @@ -182,7 +183,7 @@ abstract class EmulateViewModel( override fun onDestroy() { if (emulateButtonStateFlow.value is EmulateButtonState.Active) { - CloseEmulateAppTaskHolder.closeEmulateApp(serviceProvider, emulateHelper) + closeEmulateAppTaskHolder.closeEmulateApp(serviceProvider, emulateHelper) } super.onDestroy() } diff --git a/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/InfraredViewModel.kt b/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/InfraredViewModel.kt index 88db5ae922..dbb3f59f9c 100644 --- a/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/InfraredViewModel.kt +++ b/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/InfraredViewModel.kt @@ -1,7 +1,6 @@ package com.flipperdevices.keyemulate.viewmodel import android.app.Application -import androidx.lifecycle.viewModelScope import com.flipperdevices.bridge.dao.api.model.FlipperKeyType import com.flipperdevices.bridge.service.api.FlipperServiceApi import com.flipperdevices.bridge.service.api.provider.FlipperServiceProvider @@ -15,6 +14,7 @@ import com.flipperdevices.keyemulate.exception.ForbiddenFrequencyException import com.flipperdevices.keyemulate.model.EmulateButtonState import com.flipperdevices.keyemulate.model.EmulateConfig import com.flipperdevices.keyemulate.model.EmulateProgress +import com.flipperdevices.keyemulate.tasks.CloseEmulateAppTaskHolder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first @@ -26,8 +26,15 @@ class InfraredViewModel @Inject constructor( private val serviceProvider: FlipperServiceProvider, private val emulateHelper: EmulateHelper, synchronizationApi: SynchronizationApi, + closeEmulateAppTaskHolder: CloseEmulateAppTaskHolder, application: Application -) : EmulateViewModel(serviceProvider, emulateHelper, synchronizationApi, application) { +) : EmulateViewModel( + serviceProvider, + emulateHelper, + synchronizationApi, + closeEmulateAppTaskHolder, + application +) { override val TAG = "InfraredViewModel" override suspend fun onStartEmulateInternal( @@ -71,6 +78,7 @@ class InfraredViewModel @Inject constructor( when (buttonState) { is EmulateButtonState.Disabled, is EmulateButtonState.Loading -> buttonState + is EmulateButtonState.Inactive -> activeState is EmulateButtonState.Active -> { emulateHelper.stopEmulateForce(serviceApi.requestApi) diff --git a/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/SimpleEmulateViewModel.kt b/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/SimpleEmulateViewModel.kt index bafa181af5..df1044a021 100644 --- a/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/SimpleEmulateViewModel.kt +++ b/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/SimpleEmulateViewModel.kt @@ -4,13 +4,21 @@ import android.app.Application import com.flipperdevices.bridge.service.api.provider.FlipperServiceProvider import com.flipperdevices.bridge.synchronization.api.SynchronizationApi import com.flipperdevices.keyemulate.api.EmulateHelper +import com.flipperdevices.keyemulate.tasks.CloseEmulateAppTaskHolder import javax.inject.Inject class SimpleEmulateViewModel @Inject constructor( serviceProvider: FlipperServiceProvider, emulateHelper: EmulateHelper, synchronizationApi: SynchronizationApi, + closeEmulateAppTaskHolder: CloseEmulateAppTaskHolder, application: Application, -) : EmulateViewModel(serviceProvider, emulateHelper, synchronizationApi, application) { +) : EmulateViewModel( + serviceProvider, + emulateHelper, + synchronizationApi, + closeEmulateAppTaskHolder, + application +) { override val TAG = "SimpleEmulateViewModel" } diff --git a/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/SubGhzViewModel.kt b/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/SubGhzViewModel.kt index 4da45a350f..6c5e55f769 100644 --- a/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/SubGhzViewModel.kt +++ b/components/keyemulate/impl/src/main/java/com/flipperdevices/keyemulate/viewmodel/SubGhzViewModel.kt @@ -1,7 +1,6 @@ package com.flipperdevices.keyemulate.viewmodel import android.app.Application -import androidx.lifecycle.viewModelScope import com.flipperdevices.bridge.dao.api.model.FlipperKeyType import com.flipperdevices.bridge.service.api.FlipperServiceApi import com.flipperdevices.bridge.service.api.provider.FlipperServiceProvider @@ -15,6 +14,7 @@ import com.flipperdevices.keyemulate.exception.ForbiddenFrequencyException import com.flipperdevices.keyemulate.model.EmulateButtonState import com.flipperdevices.keyemulate.model.EmulateConfig import com.flipperdevices.keyemulate.model.EmulateProgress +import com.flipperdevices.keyemulate.tasks.CloseEmulateAppTaskHolder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -24,8 +24,15 @@ class SubGhzViewModel @Inject constructor( private val serviceProvider: FlipperServiceProvider, private val emulateHelper: EmulateHelper, synchronizationApi: SynchronizationApi, + closeEmulateAppTaskHolder: CloseEmulateAppTaskHolder, application: Application, -) : EmulateViewModel(serviceProvider, emulateHelper, synchronizationApi, application) { +) : EmulateViewModel( + serviceProvider, + emulateHelper, + synchronizationApi, + closeEmulateAppTaskHolder, + application +) { override val TAG = "SubGhzViewModel" override suspend fun onStartEmulateInternal( diff --git a/components/remote-controls/setup/impl/src/main/kotlin/com/flipperdevices/remotecontrols/impl/setup/presentation/viewmodel/DispatchSignalViewModel.kt b/components/remote-controls/setup/impl/src/main/kotlin/com/flipperdevices/remotecontrols/impl/setup/presentation/viewmodel/DispatchSignalViewModel.kt index 0ef2aedf30..eca49d8bb4 100644 --- a/components/remote-controls/setup/impl/src/main/kotlin/com/flipperdevices/remotecontrols/impl/setup/presentation/viewmodel/DispatchSignalViewModel.kt +++ b/components/remote-controls/setup/impl/src/main/kotlin/com/flipperdevices/remotecontrols/impl/setup/presentation/viewmodel/DispatchSignalViewModel.kt @@ -15,6 +15,7 @@ import com.flipperdevices.infrared.editor.core.model.InfraredRemote import com.flipperdevices.keyemulate.api.EmulateHelper import com.flipperdevices.keyemulate.exception.AlreadyOpenedAppException import com.flipperdevices.keyemulate.model.EmulateConfig +import com.flipperdevices.keyemulate.tasks.CloseEmulateAppTaskHolder import com.flipperdevices.remotecontrols.api.DispatchSignalApi import com.flipperdevices.remotecontrols.impl.setup.encoding.ByteArrayEncoder import com.flipperdevices.remotecontrols.impl.setup.encoding.JvmEncoder @@ -32,7 +33,8 @@ import javax.inject.Inject @ContributesBinding(AppGraph::class, DispatchSignalApi::class) class DispatchSignalViewModel @Inject constructor( private val emulateHelper: EmulateHelper, - private val serviceProvider: FlipperServiceProvider + private val serviceProvider: FlipperServiceProvider, + private val closeEmulateAppTaskHolder: CloseEmulateAppTaskHolder, ) : DecomposeViewModel(), FlipperBleServiceConsumer, LogTagProvider, @@ -135,6 +137,13 @@ class DispatchSignalViewModel @Inject constructor( override fun onServiceApiReady(serviceApi: FlipperServiceApi) = Unit + override fun onDestroy() { + if (_state.value is DispatchSignalApi.State.Emulating) { + closeEmulateAppTaskHolder.closeEmulateApp(serviceProvider, emulateHelper) + } + super.onDestroy() + } + companion object { private const val DEFAULT_SIGNAL_DELAY = 500L }