diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3ec13d844..b3ca59ce1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -307,6 +307,9 @@ dependencies { // Koin implementation(sylibs.koin.core) implementation(sylibs.koin.android) + + // ZXing Android Embedded + implementation(sylibs.zxing.android.embedded) } androidComponents { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0b2190e2d..dd3ec1a45 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -413,6 +413,10 @@ android:scheme="tachiyomisy" /> + + { val scope = rememberCoroutineScope() + + val qrScanLauncher = rememberLauncherForActivityResult(ScanContract()) { + if (it.contents != null && it.contents.isNotEmpty()) { + syncPreferences.clientAPIKey().set(it.contents) + } + } + val context = LocalContext.current + val scanOptions = remember { + ScanOptions().apply { + setDesiredBarcodeFormats(ScanOptions.QR_CODE) + setOrientationLocked(false) + setPrompt(SYMR.strings.scan_qr_code.getString(context)) + addExtra(Intents.Scan.SCAN_TYPE, Intents.Scan.MIXED_SCAN) + } + } + return listOf( Preference.PreferenceItem.EditTextPreference( title = stringResource(SYMR.strings.pref_sync_host), @@ -667,11 +688,32 @@ object SettingsDataScreen : SearchableSettings { true }, ), - Preference.PreferenceItem.EditTextPreference( + Preference.PreferenceItem.CustomPreference( title = stringResource(SYMR.strings.pref_sync_api_key), - subtitle = stringResource(SYMR.strings.pref_sync_api_key_summ), - preference = syncPreferences.clientAPIKey(), - ), + ) { + val values by syncPreferences.clientAPIKey().collectAsState() + EditTextPreferenceWidget( + title = stringResource(SYMR.strings.pref_sync_api_key), + subtitle = stringResource(SYMR.strings.pref_sync_api_key_summ), + onConfirm = { + syncPreferences.clientAPIKey().set(it) + true + }, + icon = null, + value = values, + widget = { + IconButton( + onClick = { qrScanLauncher.launch(scanOptions) }, + modifier = Modifier.padding(start = TrailingWidgetBuffer), + ) { + Icon( + Icons.Filled.QrCodeScanner, + contentDescription = stringResource(SYMR.strings.scan_qr_code), + ) + } + }, + ) + }, ) } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/widget/EditTextPreferenceWidget.kt b/app/src/main/java/eu/kanade/presentation/more/settings/widget/EditTextPreferenceWidget.kt index 00d8f16d4..61c240f7f 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/widget/EditTextPreferenceWidget.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/widget/EditTextPreferenceWidget.kt @@ -31,6 +31,7 @@ fun EditTextPreferenceWidget( subtitle: String?, icon: ImageVector?, value: String, + widget: @Composable (() -> Unit)? = null, onConfirm: suspend (String) -> Boolean, ) { var isDialogShown by remember { mutableStateOf(false) } @@ -39,6 +40,7 @@ fun EditTextPreferenceWidget( title = title, subtitle = subtitle?.format(value), icon = icon, + widget = widget, onPreferenceClick = { isDialogShown = true }, ) diff --git a/gradle/sy.versions.toml b/gradle/sy.versions.toml index b9881c57e..e8af35b72 100644 --- a/gradle/sy.versions.toml +++ b/gradle/sy.versions.toml @@ -18,4 +18,6 @@ google-api-services-drive = "com.google.apis:google-api-services-drive:v3-rev197 google-api-client-oauth = "com.google.oauth-client:google-oauth-client:1.39.0" koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } -koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } \ No newline at end of file +koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } + +zxing-android-embedded = "com.journeyapps:zxing-android-embedded:4.3.0" diff --git a/i18n-sy/src/commonMain/moko-resources/base/strings.xml b/i18n-sy/src/commonMain/moko-resources/base/strings.xml index 88096bb30..0e7d0ca66 100644 --- a/i18n-sy/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-sy/src/commonMain/moko-resources/base/strings.xml @@ -229,6 +229,7 @@ Synchronization frequency Choose what to sync SyncYomi + Scan a QR code Last Synchronization: %1$s Google Drive Sign in