Skip to content
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: 1 addition & 1 deletion androidApp/adb+.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/bash
# Script adb+
# Usage
# You can run any command adb provide on all your current devices
# You can run any command adb provides on all your current devices
# ./adb+ <command> is the equivalent of ./adb -s <serial number> <command>
#
# Examples
Expand Down
1 change: 1 addition & 0 deletions androidApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ dependencies {
implementation(project(":core"))
implementation(project(":composeUI"))
implementation(libs.androidx.concurrent.futures)
implementation(libs.coil.fetcher.ktor)

ksp(libs.androidx.room.compiler)
implementation(libs.androidx.room.runtime)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,12 @@ val STARTUP_TABS = listOf(
Icons.Filled.Home,
Icons.Outlined.Home,
true,
{ innerPadding, navController, showCustomDialog, setShowCustomDialog, statefulScannerMap, statefulScannerMapSecure ->
{ innerPadding, navController, showCustomDialog, setShowCustomDialog ->
ScannerBrowser(
innerPadding,
navController,
showCustomDialog,
setShowCustomDialog,
statefulScannerMap,
statefulScannerMapSecure
)
}
),
Expand All @@ -32,7 +30,7 @@ val STARTUP_TABS = listOf(
Icons.Filled.Settings,
Icons.Outlined.Settings,
false,
{ innerPadding, _, _, _, _, _ ->
{ innerPadding, _, _, _, ->
AppSettingsScreen(innerPadding)
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ fun ScanBridgeApp() {
ScanBridgeTheme {
val navController = rememberNavController()
var startDestination: Any? by remember { mutableStateOf(null) }
val context = LocalContext.current
val coroutineScope = rememberCoroutineScope()

val currentBackStackEntry by navController.currentBackStackEntryAsState()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package io.github.chrisimx.scanbridge

import AndroidHttpClientFactory
import AndroidMdnsDiscoverService
import AndroidScanBridgeDbBuilderFactory
import android.app.Application
import android.content.Context
import androidx.datastore.core.DataStore
import io.github.chrisimx.scanbridge.data.ui.CustomScannerViewModel
import coil3.ImageLoader
import coil3.network.ktor3.KtorNetworkFetcherFactory
import io.github.chrisimx.scanbridge.adapters.KoinBasedScanningProtocolManager
import io.github.chrisimx.scanbridge.adapters.RoomBackedCustomScannerRepository
import io.github.chrisimx.scanbridge.data.ui.ScanSettingsComposableStateHolder
import io.github.chrisimx.scanbridge.data.ui.ScanningScreenViewModel
import io.github.chrisimx.scanbridge.datastore.appSettingsStore
Expand All @@ -14,22 +18,31 @@ import io.github.chrisimx.scanbridge.db.DefaultScanBridgeDbFactory
import io.github.chrisimx.scanbridge.db.ScanBridgeDb
import io.github.chrisimx.scanbridge.db.ScanBridgeDbBuilderFactory
import io.github.chrisimx.scanbridge.db.ScanBridgeDbFactory
import io.github.chrisimx.scanbridge.escl.EsclScanningProtocol
import io.github.chrisimx.scanbridge.infrastructure.KmLogScanBridgeLoggerFactory
import io.github.chrisimx.scanbridge.migrations.MigrationExecutor
import io.github.chrisimx.scanbridge.migrations.RoomBackedMigrationExecutor
import io.github.chrisimx.scanbridge.migrations.migrationsModule
import io.github.chrisimx.scanbridge.model.HttpClientConfig
import io.github.chrisimx.scanbridge.ports.CustomScannerRepository
import io.github.chrisimx.scanbridge.ports.HttpClientFactory
import io.github.chrisimx.scanbridge.ports.LocaleProvider
import io.github.chrisimx.scanbridge.ports.MdnsDiscoverService
import io.github.chrisimx.scanbridge.ports.ScanBridgeLoggerFactory
import io.github.chrisimx.scanbridge.ports.ScanningProtocol
import io.github.chrisimx.scanbridge.ports.ScanningProtocolManager
import io.github.chrisimx.scanbridge.proto.ScanBridgeSettings
import io.github.chrisimx.scanbridge.proto.ShownMessages
import io.github.chrisimx.scanbridge.repositories.DatastoreLastRouteRepository
import io.github.chrisimx.scanbridge.repositories.DatastoreShownMessagesRepository
import io.github.chrisimx.scanbridge.repositories.RoomLastRouteRepository
import io.github.chrisimx.scanbridge.scannerdiscovery.DiscoveryUsecase
import io.github.chrisimx.scanbridge.scannerdiscovery.ScannerDiscoveryScreenViewModel
import io.github.chrisimx.scanbridge.services.AndroidLocaleProvider
import io.github.chrisimx.scanbridge.services.DebugLogService
import io.github.chrisimx.scanbridge.services.FileDebugLogService
import io.github.chrisimx.scanbridge.services.ScanJobRepository
import io.ktor.client.HttpClient
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
Expand All @@ -49,6 +62,27 @@ fun createAppSettingsDataStore(context: Context) = context.appSettingsStore
fun createShownMessagesDataStore(context: Context) = context.shownMessagesStore

fun createScanBridgeDb(factory: ScanBridgeDbFactory): ScanBridgeDb = factory.createInstance()

fun createScannerIconImageLoader(factory: HttpClientFactory, context: Context): ImageLoader {
val ktorClient: HttpClient = factory.create(
HttpClientConfig(
disableCertValidation = true,
debugLogging = false,
requestTimeoutInSeconds = 2u,
connectTimeoutInSeconds = 2u,
socketTimeoutInSeconds = 2u,
)
)
return ImageLoader.Builder(context)
.components {
add(
KtorNetworkFetcherFactory(
httpClient = ktorClient
)
)
}
.build()
}
val appModule = module {
single<DataStore<ShownMessages>>(named<ShownMessages>()) {
create(::createShownMessagesDataStore)
Expand All @@ -71,14 +105,22 @@ val appModule = module {
single<ScanBridgeDb> {
create(::createScanBridgeDb)
}
single(named("scannerIconImageLoader")) {
create(::createScannerIconImageLoader)
}
factory<AndroidMdnsDiscoverService>() bind MdnsDiscoverService::class
single<DatastoreLastRouteRepository>()
single<RoomLastRouteRepository>() bind LastRouteRepository::class
single<DatastoreShownMessagesRepository> { (scope: CoroutineScope) ->
DatastoreShownMessagesRepository(get(named<ShownMessages>()), scope)
} bind ShownMessagesRepository::class
single<KoinBasedScanningProtocolManager>() bind ScanningProtocolManager::class
factory<ScanSettingsComposableStateHolder>()
viewModel<ScanningScreenViewModel>()
viewModel<CustomScannerViewModel>()
single<RoomBackedCustomScannerRepository>() bind CustomScannerRepository::class
single<DiscoveryUsecase>()
viewModel<ScannerDiscoveryScreenViewModel>()
single<EsclScanningProtocol>() bind ScanningProtocol::class
}

class ScanBridgeApplication : Application() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@

package io.github.chrisimx.scanbridge

import android.app.Application
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
Expand All @@ -31,17 +29,18 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.toRoute
import io.github.chrisimx.scanbridge.datastore.appSettingsStore
import io.github.chrisimx.scanbridge.ports.ScanningProtocolManager
import io.github.chrisimx.scanbridge.proto.scanningResponseTimeoutOrNull
import io.github.chrisimx.scanbridge.uicomponents.FullScreenError
import io.github.chrisimx.scanbridge.uicomponents.TemporaryFileHandler
import io.github.chrisimx.scanbridge.util.doTempFilesExist
import io.ktor.http.Url
import kotlin.uuid.Uuid
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import org.koin.compose.koinInject
import timber.log.Timber

@Serializable
Expand All @@ -53,7 +52,7 @@ object StartUpScreenRoute : BaseRoute

@Serializable
@SerialName("ScannerRoute")
data class ScannerRoute(val scannerName: String, val scannerURL: String, val sessionID: String) : BaseRoute
data class ScannerRoute(val scannerName: String, val scannerHandleString: String, val protocolId: String, val sessionID: String) : BaseRoute

@Serializable
@SerialName("CropImageRoute")
Expand All @@ -74,11 +73,12 @@ fun NavBackStackEntry.toTypedRoute(): BaseRoute? {
CropImageRoute(scanId, returnRouteString)
}

"ScannerRoute/{scannerName}/{scannerURL}/{sessionID}" -> {
"ScannerRoute/{scannerName}/{scannerHandleString}/{protocolId}/{sessionID}" -> {
val scannerName = arguments?.getString("scannerName") ?: return null
val scannerURL = arguments?.getString("scannerURL") ?: return null
val scannerHandling = arguments?.getString("scannerHandleString") ?: return null
val protocolId = arguments?.getString("protocolId") ?: return null
val sessionID = arguments?.getString("sessionID") ?: return null
ScannerRoute(scannerName, scannerURL, sessionID)
ScannerRoute(scannerName, scannerHandling, protocolId, sessionID)
}

"ErrorRoute/{error}" -> {
Expand All @@ -94,6 +94,7 @@ fun NavBackStackEntry.toTypedRoute(): BaseRoute? {
fun ScanBridgeNavHost(navController: NavHostController, startDestination: Any) {
val context = LocalContext.current
val appSettings = context.appSettingsStore.data
val protocolManager = koinInject<ScanningProtocolManager>()

NavHost(
modifier = Modifier.testTag("root_node"),
Expand Down Expand Up @@ -130,19 +131,26 @@ fun ScanBridgeNavHost(navController: NavHostController, startDestination: Any) {
val debug = appSettingsCurrent.writeDebug
val certValidationDisabled = appSettingsCurrent.disableCertChecks
val timeout = appSettingsCurrent.scanningResponseTimeoutOrNull?.value?.toUInt() ?: 25u
val scannerHandle = protocolManager.getScannerHandle(
scannerRoute.protocolId,
scannerRoute.scannerHandleString
)
Timber.tag("ScanBridgeNavHost")
.d(
"Navigating to scanner ${scannerRoute.scannerName} at ${scannerRoute.scannerURL}. Timeout is $timeout seconds, Debug is $debug. Disabling of cert checks is $certValidationDisabled. Session id is ${scannerRoute.sessionID}"
"Navigating to scanner ${scannerRoute.scannerName} at ${scannerRoute.scannerHandleString}. Timeout is $timeout seconds, Debug is $debug. Disabling of cert checks is $certValidationDisabled. Session id is ${scannerRoute.sessionID}"
)

check(scannerHandle != null) {
"Scanner handle not found for protocol ${scannerRoute.protocolId} and handle ${scannerRoute.scannerHandleString}"
}
ScanningScreen(
scannerRoute.scannerName,
Url(scannerRoute.scannerURL),
scannerHandle,
navController,
timeout,
debug,
certValidationDisabled,
Uuid.parse(scannerRoute.sessionID),
context.applicationContext as Application
)
}
}
Expand Down
Loading
Loading