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