diff --git a/app/src/androidTest/java/org/fairscan/app/domain/DocumentDetectionTest.kt b/app/src/androidTest/java/org/fairscan/app/domain/DocumentDetectionTest.kt index 9a8a71b..06f2bf4 100644 --- a/app/src/androidTest/java/org/fairscan/app/domain/DocumentDetectionTest.kt +++ b/app/src/androidTest/java/org/fairscan/app/domain/DocumentDetectionTest.kt @@ -25,6 +25,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.runBlocking import org.fairscan.app.ui.screens.camera.extractDocumentFromBitmap +import org.fairscan.app.ui.screens.settings.DefaultColorMode import org.fairscan.imageprocessing.ImageSize import org.fairscan.imageprocessing.detectDocumentQuad import org.fairscan.imageprocessing.scaledTo @@ -62,7 +63,9 @@ class DocumentDetectionTest { if (quad != null) { val resizedQuad = quad.scaledTo(mask.width, mask.height, bitmap.width, bitmap.height) - outputJpeg = extractDocumentFromBitmap(bitmap, resizedQuad, 0, mask, scope).pageJpeg + val auto = DefaultColorMode.AUTO + val page = extractDocumentFromBitmap(bitmap, resizedQuad,0, mask, scope, auto) + outputJpeg = page.pageJpeg val file = File(context.getExternalFilesDir(null), imageFileName) file.writeBytes(outputJpeg.bytes) Log.i("DocumentDetectionTest", "Image saved to ${file.absolutePath}") diff --git a/app/src/main/java/org/fairscan/app/MainActivity.kt b/app/src/main/java/org/fairscan/app/MainActivity.kt index 950d304..4c86cfa 100644 --- a/app/src/main/java/org/fairscan/app/MainActivity.kt +++ b/app/src/main/java/org/fairscan/app/MainActivity.kt @@ -269,6 +269,7 @@ class MainActivity : ComponentActivity() { } SettingsScreen( settingsUiState, + onDefaultColorModeChanged = { mode -> settingsViewModel.setDefaultColorMode(mode) }, onChooseDirectoryClick = { try { launcher.launch(null) diff --git a/app/src/main/java/org/fairscan/app/MainViewModel.kt b/app/src/main/java/org/fairscan/app/MainViewModel.kt index 65a4e2b..2740cd1 100644 --- a/app/src/main/java/org/fairscan/app/MainViewModel.kt +++ b/app/src/main/java/org/fairscan/app/MainViewModel.kt @@ -195,6 +195,7 @@ class MainViewModel(val imageRepository: ImageRepository, launchMode: LaunchMode capturedPage.pageJpeg, sourceJpeg, capturedPage.metadata, + capturedPage.colorMode, ) imageRepository.pages() } diff --git a/app/src/main/java/org/fairscan/app/data/ImageRepository.kt b/app/src/main/java/org/fairscan/app/data/ImageRepository.kt index 8cea2e4..3b45627 100644 --- a/app/src/main/java/org/fairscan/app/data/ImageRepository.kt +++ b/app/src/main/java/org/fairscan/app/data/ImageRepository.kt @@ -141,10 +141,10 @@ class ImageRepository( } } - suspend fun add(processed: Jpeg, source: Jpeg, metadata: PageMetadata) = + suspend fun add(processed: Jpeg, source: Jpeg, metadata: PageMetadata, colorMode: ColorMode) = mutex.withLock { val id = "${System.currentTimeMillis()}" - val key = PageViewKey(id, Rotation.R0, metadata.autoColorMode) + val key = PageViewKey(id, Rotation.R0, colorMode) processedImageFile(key).writeBytes(processed.bytes) sourceFile(id).writeBytes(source.bytes) pages.addOrReplace( @@ -154,7 +154,7 @@ class ImageRepository( baseRotationDegrees = metadata.baseRotation.degrees, manualRotationDegrees = Rotation.R0.degrees, isColored = metadata.autoColorMode == ColorMode.COLOR, - colorMode = metadata.autoColorMode, + colorMode = colorMode, ) ) saveMetadata() diff --git a/app/src/main/java/org/fairscan/app/domain/CapturedPage.kt b/app/src/main/java/org/fairscan/app/domain/CapturedPage.kt index c58f461..86ce46d 100644 --- a/app/src/main/java/org/fairscan/app/domain/CapturedPage.kt +++ b/app/src/main/java/org/fairscan/app/domain/CapturedPage.kt @@ -16,9 +16,11 @@ package org.fairscan.app.domain import kotlinx.coroutines.Deferred +import org.fairscan.imageprocessing.ColorMode data class CapturedPage( val pageJpeg: Jpeg, val sourceJpeg: Deferred, val metadata: PageMetadata, + val colorMode: ColorMode, ) diff --git a/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraScreen.kt b/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraScreen.kt index c447211..aae4670 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraScreen.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraScreen.kt @@ -540,7 +540,8 @@ fun CameraScreenPreviewWithProcessedImage() { CapturedPage( debugImage("gallica.bnf.fr-bpt6k5530456s-1.jpg"), CompletableDeferred(Jpeg(ByteArray(0))), - PageMetadata(quad, R0, ColorMode.COLOR)))) + PageMetadata(quad, R0, ColorMode.COLOR), + ColorMode.COLOR))) } @Preview(showBackground = true, widthDp = 640, heightDp = 320) diff --git a/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraViewModel.kt b/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraViewModel.kt index 3146c32..24844dd 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraViewModel.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/camera/CameraViewModel.kt @@ -27,6 +27,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.fairscan.app.AppContainer @@ -35,6 +36,7 @@ import org.fairscan.app.domain.ExportQuality import org.fairscan.app.domain.Jpeg import org.fairscan.app.domain.PageMetadata import org.fairscan.app.domain.Rotation +import org.fairscan.app.ui.screens.settings.DefaultColorMode import org.fairscan.imageprocessing.ImageSize import org.fairscan.imageprocessing.Mask import org.fairscan.imageprocessing.Quad @@ -53,6 +55,7 @@ sealed interface CameraEvent { class CameraViewModel(appContainer: AppContainer): ViewModel() { private val imageSegmentationService = appContainer.imageSegmentationService + private val settingsRepository = appContainer.settingsRepository private val logger = appContainer.logger private val _events = MutableSharedFlow() @@ -165,8 +168,9 @@ class CameraViewModel(appContainer: AppContainer): ViewModel() { val quad = detectDocumentQuad(mask, originalSize, isLiveAnalysis = false) if (quad != null) { val resizedQuad = quad.scaledTo(mask.width, mask.height, source.width, source.height) + val defaultColorMode = settingsRepository.defaultColorMode.first() result = extractDocumentFromBitmap( - source, resizedQuad, rotationDegrees, mask, viewModelScope) + source, resizedQuad, rotationDegrees, mask, viewModelScope, defaultColorMode) } } return@withContext result @@ -223,14 +227,20 @@ sealed class CaptureState { } fun extractDocumentFromBitmap( - source: Bitmap, quad: Quad, rotationDegrees: Int, mask: Mask, viewModelScope: CoroutineScope + source: Bitmap, + quad: Quad, + rotationDegrees: Int, + mask: Mask, + viewModelScope: CoroutineScope, + defaultColorMode: DefaultColorMode = DefaultColorMode.AUTO ): CapturedPage { val rgba = Mat() Utils.bitmapToMat(source, rgba) val bgr = Mat() Imgproc.cvtColor(rgba, bgr, Imgproc.COLOR_RGBA2BGR) // CV_8UC4 → CV_8UC3 rgba.release() - val colorMode = autoColorMode(bgr, mask, quad) + val autoColorMode = autoColorMode(bgr, mask, quad) + val colorMode = defaultColorMode.colorMode ?: autoColorMode val maxPixels = ExportQuality.BALANCED.maxPixels val page = extractDocument(bgr, quad, rotationDegrees, colorMode, maxPixels) val pageJpeg = Jpeg.fromMat(page, ExportQuality.BALANCED.jpegQuality) @@ -239,11 +249,11 @@ fun extractDocumentFromBitmap( val normalizedQuad = quad.scaledTo(source.width, source.height, 1, 1) val baseRotation = Rotation.fromDegrees(rotationDegrees) - val metadata = PageMetadata(normalizedQuad, baseRotation, colorMode) + val metadata = PageMetadata(normalizedQuad, baseRotation, autoColorMode) val sourceJpegDeferred = viewModelScope.async(Dispatchers.IO) { compressJpeg(source, 90) } - return CapturedPage(pageJpeg, sourceJpegDeferred, metadata) + return CapturedPage(pageJpeg, sourceJpegDeferred, metadata, colorMode) } fun rotateBitmap(source: Bitmap, angle: Float): Bitmap { diff --git a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsRepository.kt b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsRepository.kt index c6442f4..f9e0f19 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsRepository.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsRepository.kt @@ -22,16 +22,29 @@ import androidx.datastore.preferences.preferencesDataStore import androidx.documentfile.provider.DocumentFile import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import org.fairscan.app.R import org.fairscan.app.domain.ExportQuality +import org.fairscan.imageprocessing.ColorMode private val Context.dataStore by preferencesDataStore(name = "fairscan_settings") class SettingsRepository(private val context: Context) { + private val DEFAULT_COLOR_MODE = stringPreferencesKey("default_color_mode") private val EXPORT_DIR_URI = stringPreferencesKey("export_dir_uri") private val EXPORT_FORMAT = stringPreferencesKey("export_format") private val EXPORT_QUALITY = stringPreferencesKey("export_quality") + val defaultColorMode: Flow = + context.dataStore.data.map { prefs -> + when (prefs[DEFAULT_COLOR_MODE]) { + "AUTO" -> DefaultColorMode.AUTO + "COLOR" -> DefaultColorMode.COLOR + "GRAYSCALE" -> DefaultColorMode.GRAYSCALE + else -> DefaultColorMode.AUTO + } + } + val exportDirUri: Flow = context.dataStore.data.map { prefs -> prefs[EXPORT_DIR_URI] @@ -60,6 +73,12 @@ class SettingsRepository(private val context: Context) { } } + suspend fun setDefaultColorMode(mode: DefaultColorMode) { + context.dataStore.edit { prefs -> + prefs[DEFAULT_COLOR_MODE] = mode.name + } + } + suspend fun setExportDirUri(uri: String?) { context.dataStore.edit { prefs -> if (uri == null) { @@ -83,6 +102,12 @@ class SettingsRepository(private val context: Context) { } } +enum class DefaultColorMode(val colorMode: ColorMode?, val labelResource: Int) { + AUTO(null, R.string.color_mode_auto), + COLOR(ColorMode.COLOR, R.string.color_mode_color), + GRAYSCALE(ColorMode.GRAYSCALE, R.string.color_mode_grayscale), +} + enum class ExportFormat(val mimeType: String) { PDF("application/pdf"), JPEG("image/jpeg"), diff --git a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsScreen.kt index 2377790..3564dc4 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsScreen.kt @@ -54,6 +54,7 @@ import org.fairscan.app.ui.theme.FairScanTheme @Composable fun SettingsScreen( uiState: SettingsUiState, + onDefaultColorModeChanged: (DefaultColorMode) -> Unit, onChooseDirectoryClick: () -> Unit, onResetExportDirClick: () -> Unit, onExportFormatChanged: (ExportFormat) -> Unit, @@ -71,6 +72,7 @@ fun SettingsScreen( ) { paddingValues -> SettingsContent( uiState, + onDefaultColorModeChanged, onChooseDirectoryClick, onResetExportDirClick, onExportFormatChanged, @@ -82,6 +84,7 @@ fun SettingsScreen( @Composable private fun SettingsContent( uiState: SettingsUiState, + onDefaultColorModeChanged: (DefaultColorMode) -> Unit, onChooseDirectoryClick: () -> Unit, onResetExportDirClick: () -> Unit, onExportFormatChanged: (ExportFormat) -> Unit, @@ -108,6 +111,26 @@ private fun SettingsContent( .padding(20.dp) .verticalScroll(rememberScrollState()) ) { + Text(stringResource(R.string.settings_section_scan), style = MaterialTheme.typography.titleLarge) + Spacer(Modifier.height(32.dp)) + + Text(stringResource(R.string.color_mode_default), style = MaterialTheme.typography.titleMedium) + + DefaultColorMode.entries.forEach { mode -> + Row(verticalAlignment = Alignment.CenterVertically) { + RadioButton( + selected = uiState.defaultColorMode == mode, + onClick = { onDefaultColorModeChanged(mode) }, + ) + Text(stringResource(mode.labelResource)) + } + } + + Spacer(Modifier.height(32.dp)) + + Text(stringResource(R.string.settings_section_export), style = MaterialTheme.typography.titleLarge) + Spacer(Modifier.height(32.dp)) + DirectorySettingItem( label = stringResource(R.string.export_directory), folderLabel, @@ -128,7 +151,7 @@ private fun SettingsContent( Spacer(Modifier.height(32.dp)) - Text(stringResource(R.string.export_quality), style = MaterialTheme.typography.titleLarge) + Text(stringResource(R.string.export_quality), style = MaterialTheme.typography.titleMedium) ExportQuality.entries.reversed().forEach { quality -> Row(verticalAlignment = Alignment.CenterVertically) { @@ -142,7 +165,7 @@ private fun SettingsContent( Spacer(Modifier.height(32.dp)) - Text(stringResource(R.string.export_format), style = MaterialTheme.typography.titleLarge) + Text(stringResource(R.string.export_format), style = MaterialTheme.typography.titleMedium) Row(verticalAlignment = Alignment.CenterVertically) { RadioButton( @@ -173,7 +196,7 @@ fun DirectorySettingItem( Column { Text( text = label, - style = MaterialTheme.typography.titleLarge + style = MaterialTheme.typography.titleMedium ) Spacer(Modifier.height(8.dp)) @@ -209,13 +232,13 @@ fun DirectorySettingItem( @Preview @Composable fun SettingsScreenPreviewWithoutDir() { - SettingsScreenPreview(SettingsUiState(null)) + SettingsScreenPreview(SettingsUiState()) } @Preview @Composable fun SettingsScreenPreviewWithDir() { - SettingsScreenPreview(SettingsUiState("content://root/dir")) + SettingsScreenPreview(SettingsUiState(exportDirUri = "content://root/dir")) } @Composable @@ -223,6 +246,7 @@ fun SettingsScreenPreview(uiState: SettingsUiState) { FairScanTheme { SettingsScreen( uiState, + onDefaultColorModeChanged = {}, onChooseDirectoryClick = {}, onResetExportDirClick = {}, onExportFormatChanged = {}, diff --git a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsViewModel.kt b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsViewModel.kt index 9287841..ffca65d 100644 --- a/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsViewModel.kt +++ b/app/src/main/java/org/fairscan/app/ui/screens/settings/SettingsViewModel.kt @@ -27,6 +27,7 @@ import org.fairscan.app.AppContainer import org.fairscan.app.domain.ExportQuality data class SettingsUiState( + val defaultColorMode: DefaultColorMode = DefaultColorMode.AUTO, val exportDirUri: String? = null, val exportDirName: String? = null, val exportFormat: ExportFormat = ExportFormat.PDF, @@ -41,12 +42,14 @@ class SettingsViewModel(container: AppContainer) : ViewModel() { val dirName: StateFlow = _dirName val uiState = combine( + repo.defaultColorMode, repo.exportDirUri, dirName, repo.exportFormat, repo.exportQuality, - ) { uri, name, format, quality -> + ) { colorMode, uri, name, format, quality -> SettingsUiState( + defaultColorMode = colorMode, exportDirUri = uri, exportDirName = name, exportFormat = format, @@ -58,6 +61,12 @@ class SettingsViewModel(container: AppContainer) : ViewModel() { SettingsUiState() ) + fun setDefaultColorMode(pref: DefaultColorMode) { + viewModelScope.launch { + repo.setDefaultColorMode(pref) + } + } + fun setExportDirUri(uri: String?) { viewModelScope.launch { repo.setExportDirUri(uri) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 7fbc1a2..e41eb68 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -9,7 +9,9 @@ غيّر المجلد امحُ النص فلتر + تلقائي ألوان + الفلتر الافتراضي تدرج الرمادي تواصل نُسخت السجلات إلى الحافظة @@ -58,6 +60,8 @@ مسح جديد المسح قيد التقدم الإعدادات + المسح + التصدير شارك شارك المستند تعذر حفظ الملف: رُفض الإذن diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index ec6afc1..b3646ff 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -9,7 +9,9 @@ Změnit složku Smazat text Filtr + Automaticky Barva + Výchozí filtr Odstíny šedi Kontakt Protokoly zkopírovány do schránky @@ -58,6 +60,8 @@ Nové skenování Probíhá skenování Nastavení + Skenování + Export Sdílet Sdílet dokument Nelze uložit soubor: oprávnění bylo odmítnuto diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a04191e..1a38c5e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -9,7 +9,9 @@ Ordner ändern Text löschen Filter + Automatisch Farbe + Standardfilter Graustufen Kontakt Logs in die Zwischenablage kopiert @@ -58,6 +60,8 @@ Neuer Scan Scan läuft Einstellungen + Scan + Export Teilen Dokument teilen Datei kann nicht gespeichert werden: Berechtigung verweigert diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index fed32b6..bf0940d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -9,7 +9,9 @@ Cambiar carpeta Borrar texto Filtro + Automático Color + Filtro predeterminado Escala de grises Contacto Registros copiados al portapapeles @@ -58,6 +60,8 @@ Nuevo escaneo Escaneo en curso Ajustes + Escaneo + Exportación Compartir Compartir documento No se puede guardar el archivo: permiso denegado diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index bd6e4b7..5730659 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -9,7 +9,9 @@ Changer de dossier Effacer le text Filtre + Automatique Couleur + Filtre par défaut Niveaux de gris Contact Logs copiés dans le presse-papiers @@ -58,6 +60,8 @@ Nouveau scan Scan en cours Paramètres + Scan + Export Partager Partager le document Impossible d’enregistrer le fichier : permission refusée diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 0b59584..34ba6f5 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -9,7 +9,9 @@ Trocar cartafol Borrar texto Filtro + Automático Cor + Filtro predeterminado Escala de grises Contacto Rexistros copiados ao portapapeis @@ -58,6 +60,8 @@ Novo escaneo Escaneo en curso Configuración + Escaneo + Exportación Compartir Compartir documento Non se pode gardar o ficheiro: permiso denegado diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index afb6c3e..98ad5d5 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -9,7 +9,9 @@ Cambia cartella Svuota testo Filtro + Automatico Colore + Filtro predefinito Scala di grigi Contatti Log copiati negli appunti @@ -58,6 +60,8 @@ Nuova scansione Scansione in corso Impostazioni + Scansione + Esportazione Condividi Condividi documento Impossibile salvare il file: permesso negato diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 808743e..6b47479 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -9,7 +9,9 @@ Alterar diretório Limpar texto Filtro + Automático Cor + Filtro padrão Escala de cinza Contato Registros copiados para a área de transferência @@ -58,6 +60,8 @@ Nova digitalização Digitalização em andamento Configurações + Digitalização + Exportação Compartilhar Compartilhar documento Não foi possível salvar o arquivo: permissão negada diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8753352..5483b21 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -8,10 +8,12 @@ Отмена Изменить папку Стереть текст + Фильтр + Автоматически Цвет + Фильтр по умолчанию Оттенки серого Контакты - Фильтр Журналы скопированы в буфер обмена Копировать журналы Подготовка экспорта… @@ -58,6 +60,8 @@ Начать Сканирование выполняется Настройки + Сканирование + Экспорт Поделиться Поделиться документом Невозможно сохранить файл: доступ запрещён diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 4850f5a..1928d68 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -9,7 +9,9 @@ Dizini değiştir Metni temizle Filtre + Otomatik Renkli + Varsayılan filtre Gri tonlama İletişim Günlükler panoya kopyalandı @@ -58,6 +60,8 @@ Yeni Tarama Tarama devam ediyor Ayarlar + Tarama + Dışa aktarma Paylaş Belgeyi paylaş Dosya kaydedilemiyor: izin reddedildi diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 7c94c7e..547545c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -9,7 +9,9 @@ 變更目錄 清除文字 濾鏡 + 自動 彩色 + 預設濾鏡 灰階 聯絡我們 日誌已複製到剪貼簿 @@ -58,6 +60,8 @@ 開始掃描 掃描進行中 設定 + 掃描 + 匯出 分享 分享文件 無法儲存檔案:權限遭拒 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 1f9f5ab..d594c6b 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -9,7 +9,9 @@ 更改目录 清除文字 滤镜 + 自动 彩色 + 默认滤镜 灰度 联系人 日志已复制到剪贴板 @@ -58,6 +60,8 @@ 新建扫描 正在进行扫描 设置 + 扫描 + 导出 共享 分享文档 无法保存文件:权限被拒绝 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c36928..da0d39d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,7 +10,9 @@ Change folder Clear text Filter + Automatic Color + Default filter Grayscale Contact Logs copied to clipboard @@ -62,6 +64,8 @@ New Scan Scan in progress Settings + Scan + Export Share Share document Cannot save file: permission was denied diff --git a/app/src/test/java/org/fairscan/app/data/ImageRepositoryTest.kt b/app/src/test/java/org/fairscan/app/data/ImageRepositoryTest.kt index 4b010bc..699bb3b 100644 --- a/app/src/test/java/org/fairscan/app/data/ImageRepositoryTest.kt +++ b/app/src/test/java/org/fairscan/app/data/ImageRepositoryTest.kt @@ -75,7 +75,7 @@ class ImageRepositoryTest { val repo = repo() assertThat(repo.imageIds()).isEmpty() val jpeg = jpeg(101, 102, 103) - repo.add(jpeg, jpeg(51), metadata1) + repo.add(jpeg, jpeg(51), metadata1, COLOR) assertThat(repo.imageIds()).hasSize(1) val id = repo.imageIds()[0] val key = PageViewKey(id, R0, COLOR) @@ -96,7 +96,7 @@ class ImageRepositoryTest { fun delete_image() = runTest { val repo = repo() val jpeg = jpeg(101, 102, 103) - repo.add(jpeg, jpeg(51), metadata1) + repo.add(jpeg, jpeg(51), metadata1, COLOR) assertThat(jpegFiles(processedDir())).hasSize(1) assertThat(jpegFiles(sourceDir())).hasSize(1) assertThat(repo.imageIds()).hasSize(1) @@ -188,7 +188,7 @@ class ImageRepositoryTest { fun `clear should delete pages`() = runTest { val jpeg = jpeg(101, 102, 103) val repo1 = repo() - repo1.add(jpeg, jpeg(51), metadata1) + repo1.add(jpeg, jpeg(51), metadata1, COLOR) assertThat(repo1.imageIds()).isNotEmpty() repo1.clear() assertThat(repo1.imageIds()).isEmpty() @@ -201,7 +201,7 @@ class ImageRepositoryTest { @Test fun rotate() = runTest { val repo = repo() - repo.add(jpeg(101, 102, 103), jpeg(51), metadata1) + repo.add(jpeg(101, 102, 103), jpeg(51), metadata1, COLOR) assertThat(repo.pages().last().metadata).isEqualTo(metadata1) val id = repo.pages().last().id repo.rotate(id, true) @@ -230,9 +230,9 @@ class ImageRepositoryTest { @Test fun movePage() = runTest { val repo = repo() - repo.add(jpeg(101), jpeg(51), metadata1) + repo.add(jpeg(101), jpeg(51), metadata1, COLOR) Thread.sleep(1L) // to avoid file name clashes - repo.add(jpeg(110), jpeg(51), metadata1) + repo.add(jpeg(110), jpeg(51), metadata1, COLOR) val id0 = repo.imageIds().first() val id1 = repo.imageIds().last() repo.movePage(id1, 0) @@ -284,10 +284,10 @@ class ImageRepositoryTest { fun last_added_source_file() = runTest { val repo = repo() assertThat(repo.lastAddedSourceFile()).isNull() - repo.add(jpeg(101), jpeg(51), metadata1) + repo.add(jpeg(101), jpeg(51), metadata1, COLOR) assertThat(repo.lastAddedSourceFile()).hasBinaryContent(byteArrayOf(51)) Thread.sleep(1) - repo.add(jpeg(102), jpeg(52), metadata1) + repo.add(jpeg(102), jpeg(52), metadata1, COLOR) assertThat(repo.lastAddedSourceFile()).hasBinaryContent(byteArrayOf(52)) val id = repo.imageIds().last()