Skip to content
Closed
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
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ dependencies {
implementation(libs.androidx.material.icons.core)
implementation(libs.androidx.constraintlayout.compose)
implementation(libs.itext7.core)
implementation(libs.mlkit.text.recognition)
implementation(libs.ktor.okhttp)
implementation(libs.ktor.logging)
"playImplementation"(project(":lvl_library"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import androidx.compose.material3.Checkbox
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.InputChip
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.OutlinedIconButton
Expand All @@ -60,12 +61,14 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.constraintlayout.compose.ConstraintLayout
import androidx.constraintlayout.compose.Dimension
import androidx.core.net.toUri
import io.github.chrisimx.scanbridge.datastore.*
import io.github.chrisimx.scanbridge.proto.ScanBridgeSettings
import io.github.chrisimx.scanbridge.proto.defaultScanDpiOrNull
import io.github.chrisimx.scanbridge.proto.rememberScanSettingsOrNull
import io.github.chrisimx.scanbridge.services.DebugLogService
import io.github.chrisimx.scanbridge.uicomponents.TitledCard
Expand All @@ -74,6 +77,9 @@ import io.github.chrisimx.scanbridge.uicomponents.settings.CheckboxSetting
import io.github.chrisimx.scanbridge.uicomponents.settings.MoreInformationButton
import io.github.chrisimx.scanbridge.uicomponents.settings.UIntSetting
import io.github.chrisimx.scanbridge.uicomponents.settings.VersionComposable
import io.github.chrisimx.scanbridge.util.DEFAULT_SCAN_DPI_MAX
import io.github.chrisimx.scanbridge.util.defaultScanDpiPresets
import io.github.chrisimx.scanbridge.util.normalizeDefaultScanDpiPreference
import java.io.File
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
Expand All @@ -91,6 +97,76 @@ fun DisableCertChecksSetting(onInformationRequested: (Int) -> Unit, checked: Boo
}
}

@Composable
fun DefaultScanDpiSetting(
selectedValue: UInt,
onInformationRequested: (Int) -> Unit,
setValue: (UInt) -> Unit
) {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 10.dp)
) {
ConstraintLayout(
Modifier.fillMaxWidth()
) {
val (title, informationButton) = createRefs()

Text(
text = stringResource(R.string.default_scan_dpi),
modifier = Modifier.constrainAs(title) {
start.linkTo(parent.start)
top.linkTo(parent.top)
bottom.linkTo(parent.bottom)
end.linkTo(informationButton.start, 12.dp)
width = Dimension.fillToConstraints
},
style = MaterialTheme.typography.bodyMedium
)

Box(
modifier = Modifier.constrainAs(informationButton) {
top.linkTo(parent.top)
bottom.linkTo(parent.bottom)
end.linkTo(parent.end)
}
) {
MoreInformationButton {
onInformationRequested(R.string.default_scan_dpi_info)
}
}
}

FlowRow(
modifier = Modifier
.fillMaxWidth()
.padding(top = 8.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
defaultScanDpiPresets.forEach { preset ->
val label = if (preset == DEFAULT_SCAN_DPI_MAX) {
stringResource(R.string.max_short)
} else {
preset.toString()
}

InputChip(
selected = selectedValue == preset,
onClick = { setValue(preset) },
label = {
Text(
label,
textAlign = TextAlign.Center
)
}
)
}
}
}
}

fun exportDebugLog(context: Context, debugLogService: DebugLogService, saveDebugLogLauncher: ActivityResultLauncher<Intent>) {
debugLogService.flush()

Expand Down Expand Up @@ -267,6 +343,16 @@ fun AppSettingsScreen(innerPadding: PaddingValues) {
information = it
}

DefaultScanDpiSetting(
normalizeDefaultScanDpiPreference(appSettings.defaultScanDpiOrNull?.value?.toUInt()),
setInformationRequested,
{ selectedValue ->
coroutineScope.launch {
appSettingsStore.setDefaultScanDpi(selectedValue)
}
}
)

// Timeout setting
UIntSetting(
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,21 @@ fun ScanningScreen(
exportAlpha,
onDismiss = { scanningViewModel.setShowExportOptionsPopup(false) },
updateWidth = { exportOptionsWidth = it },
onExportOcrPdf = {
scanningViewModel.setShowExportOptionsPopup(false)
scanningViewModel.doPdfExportWithOcr(
context,
{ error ->
snackBarError(
error,
scope,
context,
snackbarHostState,
false
)
}
)
},
onExportPdf = {
scanningViewModel.setShowExportOptionsPopup(false)
scanningViewModel.doPdfExport(
Expand Down Expand Up @@ -535,7 +550,23 @@ fun ScanningScreen(
saveOptionsWidth,
saveOptionsAlpha,
onDismiss = { scanningViewModel.setShowSaveOptionsPopup(false) },
updateWidth = { exportOptionsWidth = it },
updateWidth = { saveOptionsWidth = it },
onExportOcrPdf = {
scanningViewModel.setShowSaveOptionsPopup(false)
scanningViewModel.doPdfExportWithOcr(
context,
{ error ->
snackBarError(
error,
scope,
context,
snackbarHostState,
false
)
},
saveFileLauncher
)
},
onExportPdf = {
scanningViewModel.setShowSaveOptionsPopup(false)
scanningViewModel.doPdfExport(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ import io.github.chrisimx.esclkt.threeHundredthsOfInch
import io.github.chrisimx.scanbridge.R
import io.github.chrisimx.scanbridge.services.LocaleProvider
import io.github.chrisimx.scanbridge.util.derived
import io.github.chrisimx.scanbridge.util.getMaxResolution
import io.github.chrisimx.scanbridge.util.pickClosestResolution
import io.github.chrisimx.scanbridge.util.toDoubleLocalized
import java.util.*
import kotlinx.coroutines.CoroutineScope
Expand Down Expand Up @@ -325,9 +325,10 @@ class ScanSettingsComposableStateHolder(
!supportedResolutions.contains(DiscreteResolution(xRes, yRes))

val replacementResolution = if (invalidResolutionSetting) {
val highestScanResolution = uiState.capabilities.getMaxResolution(inputSource)
val preferredDpi = maxOf(xRes, yRes)
val closestResolution = pickClosestResolution(supportedResolutions, preferredDpi)

Pair(highestScanResolution.xResolution, highestScanResolution.yResolution)
Pair(closestResolution?.xResolution, closestResolution?.yResolution)
} else {
Pair(xRes, yRes)
}
Expand Down
Loading