Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
<string name="screenshot_saved_at">Success, file saved at %1$s</string>
<string name="search">Search</string>
<string name="settings_adb_setup_title">Please setup ADB first, this field is mandatory</string>
<string name="settings_adb_valid">ADB configuraton is valid</string>
<string name="settings_adb_valid">ADB configuration is valid</string>
<string name="settings_font_size_multiplier">Font Size Multiplier : %1$sx</string>
<string name="settings_theme">Theme</string>
<string name="settings_theme_dark">Dark</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,15 @@ import io.github.openflocon.flocondesktop.app.AppScreen
import io.github.openflocon.flocondesktop.app.di.appModule
import io.github.openflocon.flocondesktop.common.di.commonModule
import io.github.openflocon.flocondesktop.core.di.coreModule
import io.github.openflocon.domain.settings.repository.SettingsRepository
import io.github.openflocon.domain.device.repository.DevicesRepository
import io.github.openflocon.flocondesktop.features.onboarding.OnboardingRoutes
import io.github.openflocon.flocondesktop.features.featuresModule
import io.github.openflocon.flocondesktop.features.network.NetworkRoutes
import io.github.openflocon.library.designsystem.FloconTheme
import io.github.openflocon.navigation.MainFloconNavigationState
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import org.koin.compose.KoinApplication
import org.koin.compose.koinInject
import org.koin.core.module.dsl.singleOf
Expand All @@ -51,7 +56,28 @@ fun App() {
// scope<MainRoutes.Sub> {
// scoped { MainFloconNavigationState(MainRoutes.Main) }
// }
single { MainFloconNavigationState(NetworkRoutes.Main) }
single {
val repository = get<SettingsRepository>()
val devicesRepository = get<DevicesRepository>()
val hasDevices = try {
runBlocking {
devicesRepository.devices.first().isNotEmpty()
}
} catch (e: Exception) {
false
}
if (hasDevices && !repository.isOnboardingCompleted()) {
runBlocking {
repository.setOnboardingCompleted(true)
}
}
val startRoute = if (repository.isOnboardingCompleted() || hasDevices) {
NetworkRoutes.Main
} else {
OnboardingRoutes.Main
}
MainFloconNavigationState(startRoute)
}
singleOf(::AdbRepositoryImpl) bind AdbRepository::class
},
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation3.scene.SinglePaneSceneStrategy
import io.github.openflocon.flocondesktop.app.ui.settings.settingsRoutes
import io.github.openflocon.flocondesktop.app.ui.settings.SettingsRoutes
import io.github.openflocon.flocondesktop.app.ui.view.leftpannel.LeftPanelView
import io.github.openflocon.flocondesktop.app.ui.view.topbar.MainScreenTopBar
import io.github.openflocon.flocondesktop.app.version.VersionCheckerView
Expand All @@ -23,6 +24,7 @@ import io.github.openflocon.flocondesktop.features.deeplinks.deeplinkRoutes
import io.github.openflocon.flocondesktop.features.files.filesRoutes
import io.github.openflocon.flocondesktop.features.images.imageRoutes
import io.github.openflocon.flocondesktop.features.network.networkRoutes
import io.github.openflocon.flocondesktop.features.onboarding.onboardingRoutes
import io.github.openflocon.flocondesktop.features.sharedpreferences.sharedPreferencesRoutes
import io.github.openflocon.flocondesktop.features.table.tableRoutes
import io.github.openflocon.library.designsystem.FloconTheme
Expand All @@ -38,10 +40,14 @@ import org.koin.compose.viewmodel.koinViewModel
fun AppScreen() {
val viewModel = koinViewModel<AppViewModel>()
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
val adbError by viewModel.adbErrorState.collectAsStateWithLifecycle()
val serverError by viewModel.serverError.collectAsStateWithLifecycle()

Box(modifier = Modifier.fillMaxSize()) {
Content(
uiState = uiState,
adbError = adbError,
serverError = serverError,
navigationState = viewModel.navigationState,
onAction = viewModel::onAction
)
Expand All @@ -53,6 +59,8 @@ fun AppScreen() {
@Composable
private fun Content(
uiState: AppUiState,
adbError: AdbErrorType,
serverError: String?,
navigationState: MainFloconNavigationState,
onAction: (AppAction) -> Unit
) {
Expand Down Expand Up @@ -90,7 +98,10 @@ private fun Content(
onAppSelected = { onAction(AppAction.SelectApp(it)) },
onRecordClicked = { onAction(AppAction.Record) },
onRestartClicked = { onAction(AppAction.Restart) },
onTakeScreenshotClicked = { onAction(AppAction.Screenshoot) }
onTakeScreenshotClicked = { onAction(AppAction.Screenshoot) },
adbError = adbError,
serverError = serverError,
onFixAdbClicked = { navigationState.navigate(SettingsRoutes.Main) }
)
}
)
Expand All @@ -111,5 +122,6 @@ private fun Content(
tableRoutes()
settingsRoutes()
crashReporterRoutes()
onboardingRoutes()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,16 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import org.jetbrains.compose.resources.getString

enum class AdbErrorType { NONE, SETUP_REQUIRED, PORT_FORWARD_ERROR, SERVER_ERROR }

internal class AppViewModel(
messagesServerDelegate: MessagesServerDelegate,
private val messagesServerDelegate: MessagesServerDelegate,
initAdbPathUseCase: InitAdbPathUseCase,
startAdbForwardUseCase: StartAdbForwardUseCase,
val navigationState: MainFloconNavigationState,
Expand All @@ -56,6 +60,25 @@ internal class AppViewModel(
private val settingsRepository: SettingsRepository,
) : ViewModel(messagesServerDelegate) {

val serverError = messagesServerDelegate.serverError

val adbErrorState = combine(
initialSetupStateHolder.needsAdbSetup,
settingsRepository.adbForwardStatus,
messagesServerDelegate.serverError
) { needsSetup, forwardStatus, serverErrorMsg ->
when {
serverErrorMsg != null -> AdbErrorType.SERVER_ERROR
needsSetup -> AdbErrorType.SETUP_REQUIRED
forwardStatus == AdbForwardStatus.NOK -> AdbErrorType.PORT_FORWARD_ERROR
else -> AdbErrorType.NONE
}
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = AdbErrorType.NONE
)

private val contentState = MutableStateFlow(
ContentUiState(
current = SubScreen.Network
Expand Down
Loading