diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f70692fb5..c2f926d41 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -161,6 +161,10 @@
+
{
diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/kitsu/ui/KitsuAuthActivity.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/kitsu/ui/KitsuAuthActivity.kt
new file mode 100644
index 000000000..55ae9d8ff
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/kitsu/ui/KitsuAuthActivity.kt
@@ -0,0 +1,32 @@
+package org.koitharu.kotatsu.scrobbling.kitsu.ui
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import androidx.core.graphics.Insets
+import org.koitharu.kotatsu.R
+import org.koitharu.kotatsu.base.ui.BaseActivity
+import org.koitharu.kotatsu.databinding.ActivityKitsuAuthBinding
+
+class KitsuAuthActivity : BaseActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(ActivityKitsuAuthBinding.inflate(layoutInflater))
+ }
+
+ override fun onWindowInsetsChanged(insets: Insets) {
+ val basePadding = resources.getDimensionPixelOffset(R.dimen.screen_padding)
+ binding.root.setPadding(
+ basePadding + insets.left,
+ basePadding + insets.top,
+ basePadding + insets.right,
+ basePadding + insets.bottom,
+ )
+ }
+
+ companion object {
+ fun newIntent(context: Context) = Intent(context, KitsuAuthActivity::class.java)
+ }
+
+}
diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt
index 9f63f32bb..6fb976e28 100644
--- a/app/src/main/java/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt
@@ -18,6 +18,7 @@ import org.koitharu.kotatsu.scrobbling.anilist.data.AniListRepository
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService
import org.koitharu.kotatsu.scrobbling.common.ui.config.ScrobblerConfigActivity
import org.koitharu.kotatsu.scrobbling.kitsu.data.KitsuRepository
+import org.koitharu.kotatsu.scrobbling.kitsu.ui.KitsuAuthActivity
import org.koitharu.kotatsu.scrobbling.mal.data.MALRepository
import org.koitharu.kotatsu.scrobbling.shikimori.data.ShikimoriRepository
import org.koitharu.kotatsu.sync.domain.SyncController
@@ -146,6 +147,9 @@ class ServicesSettingsFragment : BasePreferenceFragment(R.string.services) {
private fun launchScrobblerAuth(repository: org.koitharu.kotatsu.scrobbling.common.data.ScrobblerRepository) {
runCatching {
+ if (repository.oauthUrl.isBlank()) {
+ startActivity(KitsuAuthActivity.newIntent(requireContext()))
+ }
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(repository.oauthUrl)
startActivity(intent)
diff --git a/app/src/main/res/drawable/ic_kitsu.xml b/app/src/main/res/drawable/ic_kitsu.xml
new file mode 100644
index 000000000..b124346cb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_kitsu.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_kitsu_auth.xml b/app/src/main/res/layout/activity_kitsu_auth.xml
new file mode 100644
index 000000000..f6166696e
--- /dev/null
+++ b/app/src/main/res/layout/activity_kitsu_auth.xml
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 296213693..ab1e52643 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -436,4 +436,5 @@
You can sign in into an existing account or create a new one
Find similar
Kitsu
+ Enter your email and password to continue
diff --git a/app/src/main/res/xml/pref_services.xml b/app/src/main/res/xml/pref_services.xml
index 47e1d59e4..3a9936c6f 100644
--- a/app/src/main/res/xml/pref_services.xml
+++ b/app/src/main/res/xml/pref_services.xml
@@ -12,21 +12,26 @@
-
-
+
+
+
+