Browse Source

Misc tracker code cleanup

arkon 4 years ago
parent
commit
395a749bce

+ 50 - 66
app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt

@@ -4,6 +4,7 @@ import android.net.Uri
 import androidx.core.net.toUri
 import eu.kanade.tachiyomi.data.database.models.Track
 import eu.kanade.tachiyomi.data.track.model.TrackSearch
+import eu.kanade.tachiyomi.network.POST
 import eu.kanade.tachiyomi.network.asObservableSuccess
 import kotlinx.serialization.decodeFromString
 import kotlinx.serialization.json.Json
@@ -18,9 +19,8 @@ import kotlinx.serialization.json.jsonPrimitive
 import kotlinx.serialization.json.long
 import kotlinx.serialization.json.put
 import kotlinx.serialization.json.putJsonObject
-import okhttp3.MediaType.Companion.toMediaTypeOrNull
+import okhttp3.MediaType.Companion.toMediaType
 import okhttp3.OkHttpClient
-import okhttp3.Request
 import okhttp3.RequestBody.Companion.toRequestBody
 import rx.Observable
 import uy.kohesive.injekt.injectLazy
@@ -30,7 +30,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
 
     private val json: Json by injectLazy()
 
-    private val jsonMime = "application/json; charset=utf-8".toMediaTypeOrNull()
+    private val jsonMime = "application/json; charset=utf-8".toMediaType()
     private val authClient = client.newBuilder().addInterceptor(interceptor).build()
 
     fun addLibManga(track: Track): Observable<Track> {
@@ -51,22 +51,18 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
                 put("status", track.toAnilistStatus())
             }
         }
-        val body = payload.toString().toRequestBody(jsonMime)
-        val request = Request.Builder()
-            .url(apiUrl)
-            .post(body)
-            .build()
-        return authClient.newCall(request)
+        return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime)))
             .asObservableSuccess()
             .map { netResponse ->
-                val responseBody = netResponse.body?.string().orEmpty()
-                netResponse.close()
-                if (responseBody.isEmpty()) {
-                    throw Exception("Null Response")
+                netResponse.use {
+                    val responseBody = it.body?.string().orEmpty()
+                    if (responseBody.isEmpty()) {
+                        throw Exception("Null Response")
+                    }
+                    val response = json.decodeFromString<JsonObject>(responseBody)
+                    track.library_id = response["data"]!!.jsonObject["SaveMediaListEntry"]!!.jsonObject["id"]!!.jsonPrimitive.long
+                    track
                 }
-                val response = json.decodeFromString<JsonObject>(responseBody)
-                track.library_id = response["data"]!!.jsonObject["SaveMediaListEntry"]!!.jsonObject["id"]!!.jsonPrimitive.long
-                track
             }
     }
 
@@ -90,12 +86,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
                 put("score", track.score.toInt())
             }
         }
-        val body = payload.toString().toRequestBody(jsonMime)
-        val request = Request.Builder()
-            .url(apiUrl)
-            .post(body)
-            .build()
-        return authClient.newCall(request)
+        return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime)))
             .asObservableSuccess()
             .map {
                 track
@@ -134,24 +125,21 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
                 put("query", search)
             }
         }
-        val body = payload.toString().toRequestBody(jsonMime)
-        val request = Request.Builder()
-            .url(apiUrl)
-            .post(body)
-            .build()
-        return authClient.newCall(request)
+        return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime)))
             .asObservableSuccess()
             .map { netResponse ->
-                val responseBody = netResponse.body?.string().orEmpty()
-                if (responseBody.isEmpty()) {
-                    throw Exception("Null Response")
+                netResponse.use {
+                    val responseBody = it.body?.string().orEmpty()
+                    if (responseBody.isEmpty()) {
+                        throw Exception("Null Response")
+                    }
+                    val response = json.decodeFromString<JsonObject>(responseBody)
+                    val data = response["data"]!!.jsonObject
+                    val page = data["Page"]!!.jsonObject
+                    val media = page["media"]!!.jsonArray
+                    val entries = media.map { jsonToALManga(it.jsonObject) }
+                    entries.map { it.toTrack() }
                 }
-                val response = json.decodeFromString<JsonObject>(responseBody)
-                val data = response["data"]!!.jsonObject
-                val page = data["Page"]!!.jsonObject
-                val media = page["media"]!!.jsonArray
-                val entries = media.map { jsonToALManga(it.jsonObject) }
-                entries.map { it.toTrack() }
             }
     }
 
@@ -194,24 +182,21 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
                 put("manga_id", track.media_id)
             }
         }
-        val body = payload.toString().toRequestBody(jsonMime)
-        val request = Request.Builder()
-            .url(apiUrl)
-            .post(body)
-            .build()
-        return authClient.newCall(request)
+        return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime)))
             .asObservableSuccess()
             .map { netResponse ->
-                val responseBody = netResponse.body?.string().orEmpty()
-                if (responseBody.isEmpty()) {
-                    throw Exception("Null Response")
+                netResponse.use {
+                    val responseBody = it.body?.string().orEmpty()
+                    if (responseBody.isEmpty()) {
+                        throw Exception("Null Response")
+                    }
+                    val response = json.decodeFromString<JsonObject>(responseBody)
+                    val data = response["data"]!!.jsonObject
+                    val page = data["Page"]!!.jsonObject
+                    val media = page["mediaList"]!!.jsonArray
+                    val entries = media.map { jsonToALUserManga(it.jsonObject) }
+                    entries.firstOrNull()?.toTrack()
                 }
-                val response = json.decodeFromString<JsonObject>(responseBody)
-                val data = response["data"]!!.jsonObject
-                val page = data["Page"]!!.jsonObject
-                val media = page["mediaList"]!!.jsonArray
-                val entries = media.map { jsonToALUserManga(it.jsonObject) }
-                entries.firstOrNull()?.toTrack()
             }
     }
 
@@ -239,22 +224,22 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
         val payload = buildJsonObject {
             put("query", query)
         }
-        val body = payload.toString().toRequestBody(jsonMime)
-        val request = Request.Builder()
-            .url(apiUrl)
-            .post(body)
-            .build()
-        return authClient.newCall(request)
+        return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime)))
             .asObservableSuccess()
             .map { netResponse ->
-                val responseBody = netResponse.body?.string().orEmpty()
-                if (responseBody.isEmpty()) {
-                    throw Exception("Null Response")
+                netResponse.use {
+                    val responseBody = it.body?.string().orEmpty()
+                    if (responseBody.isEmpty()) {
+                        throw Exception("Null Response")
+                    }
+                    val response = json.decodeFromString<JsonObject>(responseBody)
+                    val data = response["data"]!!.jsonObject
+                    val viewer = data["Viewer"]!!.jsonObject
+                    Pair(
+                        viewer["id"]!!.jsonPrimitive.int,
+                        viewer["mediaListOptions"]!!.jsonObject["scoreFormat"]!!.jsonPrimitive.content
+                    )
                 }
-                val response = json.decodeFromString<JsonObject>(responseBody)
-                val data = response["data"]!!.jsonObject
-                val viewer = data["Viewer"]!!.jsonObject
-                Pair(viewer["id"]!!.jsonPrimitive.int, viewer["mediaListOptions"]!!.jsonObject["scoreFormat"]!!.jsonPrimitive.content)
             }
     }
 
@@ -298,7 +283,6 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
 
     companion object {
         private const val clientId = "385"
-        private const val clientUrl = "tachiyomi://anilist-auth"
         private const val apiUrl = "https://graphql.anilist.co/"
         private const val baseUrl = "https://anilist.co/api/v2/"
         private const val baseMangaUrl = "https://anilist.co/manga/"

+ 20 - 38
app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt

@@ -5,6 +5,7 @@ import androidx.core.net.toUri
 import eu.kanade.tachiyomi.data.database.models.Track
 import eu.kanade.tachiyomi.data.track.TrackManager
 import eu.kanade.tachiyomi.data.track.model.TrackSearch
+import eu.kanade.tachiyomi.network.GET
 import eu.kanade.tachiyomi.network.POST
 import eu.kanade.tachiyomi.network.asObservableSuccess
 import kotlinx.serialization.decodeFromString
@@ -34,11 +35,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
             .add("rating", track.score.toInt().toString())
             .add("status", track.toBangumiStatus())
             .build()
-        val request = Request.Builder()
-            .url("$apiUrl/collection/${track.media_id}/update")
-            .post(body)
-            .build()
-        return authClient.newCall(request)
+        return authClient.newCall(POST("$apiUrl/collection/${track.media_id}/update", body = body))
             .asObservableSuccess()
             .map {
                 track
@@ -46,29 +43,20 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
     }
 
     fun updateLibManga(track: Track): Observable<Track> {
-        // chapter update
-        val body = FormBody.Builder()
-            .add("watched_eps", track.last_chapter_read.toString())
-            .build()
-        val request = Request.Builder()
-            .url("$apiUrl/subject/${track.media_id}/update/watched_eps")
-            .post(body)
-            .build()
-
         // read status update
         val sbody = FormBody.Builder()
             .add("status", track.toBangumiStatus())
             .build()
-        val srequest = Request.Builder()
-            .url("$apiUrl/collection/${track.media_id}/update")
-            .post(sbody)
-            .build()
-        return authClient.newCall(srequest)
+        return authClient.newCall(POST("$apiUrl/collection/${track.media_id}/update", body = sbody))
             .asObservableSuccess()
             .map {
                 track
             }.flatMap {
-                authClient.newCall(request)
+                // chapter update
+                val body = FormBody.Builder()
+                    .add("watched_eps", track.last_chapter_read.toString())
+                    .build()
+                authClient.newCall(POST("$apiUrl/subject/${track.media_id}/update/watched_eps", body = body))
                     .asObservableSuccess()
                     .map {
                         track
@@ -82,11 +70,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
             .buildUpon()
             .appendQueryParameter("max_results", "20")
             .build()
-        val request = Request.Builder()
-            .url(url.toString())
-            .get()
-            .build()
-        return authClient.newCall(request)
+        return authClient.newCall(GET(url.toString()))
             .asObservableSuccess()
             .map { netResponse ->
                 var responseBody = netResponse.body?.string().orEmpty()
@@ -126,13 +110,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
     }
 
     fun findLibManga(track: Track): Observable<Track?> {
-        val urlMangas = "$apiUrl/subject/${track.media_id}"
-        val requestMangas = Request.Builder()
-            .url(urlMangas)
-            .get()
-            .build()
-
-        return authClient.newCall(requestMangas)
+        return authClient.newCall(GET("$apiUrl/subject/${track.media_id}"))
             .asObservableSuccess()
             .map { netResponse ->
                 // get comic info
@@ -162,13 +140,17 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
     }
 
     fun accessToken(code: String): Observable<OAuth> {
-        return client.newCall(accessTokenRequest(code)).asObservableSuccess().map { netResponse ->
-            val responseBody = netResponse.body?.string().orEmpty()
-            if (responseBody.isEmpty()) {
-                throw Exception("Null Response")
+        return client.newCall(accessTokenRequest(code))
+            .asObservableSuccess()
+            .map { netResponse ->
+                netResponse.use {
+                    val responseBody = it.body?.string().orEmpty()
+                    if (responseBody.isEmpty()) {
+                        throw Exception("Null Response")
+                    }
+                    json.decodeFromString<OAuth>(responseBody)
+                }
             }
-            json.decodeFromString<OAuth>(responseBody)
-        }
     }
 
     private fun accessTokenRequest(code: String) = POST(

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt

@@ -12,7 +12,7 @@ import eu.kanade.tachiyomi.util.lang.toCalendar
 import eu.kanade.tachiyomi.util.selectInt
 import eu.kanade.tachiyomi.util.selectText
 import okhttp3.FormBody
-import okhttp3.MediaType.Companion.toMediaTypeOrNull
+import okhttp3.MediaType.Companion.toMediaType
 import okhttp3.OkHttpClient
 import okhttp3.RequestBody
 import okhttp3.RequestBody.Companion.toRequestBody
@@ -282,7 +282,7 @@ class MyAnimeListApi(private val client: OkHttpClient, interceptor: MyAnimeListI
                 .put("score", track.score)
                 .put("num_read_chapters", track.last_chapter_read)
 
-            return body.toString().toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())
+            return body.toString().toRequestBody("application/json; charset=utf-8".toMediaType())
         }
 
         private fun mangaEditPostBody(track: MyAnimeListEditData): RequestBody {

+ 21 - 36
app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt

@@ -19,9 +19,8 @@ import kotlinx.serialization.json.jsonPrimitive
 import kotlinx.serialization.json.put
 import kotlinx.serialization.json.putJsonObject
 import okhttp3.FormBody
-import okhttp3.MediaType.Companion.toMediaTypeOrNull
+import okhttp3.MediaType.Companion.toMediaType
 import okhttp3.OkHttpClient
-import okhttp3.Request
 import okhttp3.RequestBody.Companion.toRequestBody
 import rx.Observable
 import uy.kohesive.injekt.injectLazy
@@ -30,7 +29,7 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
 
     private val json: Json by injectLazy()
 
-    private val jsonime = "application/json; charset=utf-8".toMediaTypeOrNull()
+    private val jsonMime = "application/json; charset=utf-8".toMediaType()
     private val authClient = client.newBuilder().addInterceptor(interceptor).build()
 
     fun addLibManga(track: Track, user_id: String): Observable<Track> {
@@ -44,12 +43,7 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
                 put("status", track.toShikimoriStatus())
             }
         }
-        val body = payload.toString().toRequestBody(jsonime)
-        val request = Request.Builder()
-            .url("$apiUrl/v2/user_rates")
-            .post(body)
-            .build()
-        return authClient.newCall(request)
+        return authClient.newCall(POST("$apiUrl/v2/user_rates", body = payload.toString().toRequestBody(jsonMime)))
             .asObservableSuccess()
             .map {
                 track
@@ -64,11 +58,7 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
             .appendQueryParameter("search", search)
             .appendQueryParameter("limit", "20")
             .build()
-        val request = Request.Builder()
-            .url(url.toString())
-            .get()
-            .build()
-        return authClient.newCall(request)
+        return authClient.newCall(GET(url.toString()))
             .asObservableSuccess()
             .map { netResponse ->
                 val responseBody = netResponse.body?.string().orEmpty()
@@ -107,30 +97,21 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
     }
 
     fun findLibManga(track: Track, user_id: String): Observable<Track?> {
-        val url = "$apiUrl/v2/user_rates".toUri().buildUpon()
-            .appendQueryParameter("user_id", user_id)
-            .appendQueryParameter("target_id", track.media_id.toString())
-            .appendQueryParameter("target_type", "Manga")
-            .build()
-        val request = Request.Builder()
-            .url(url.toString())
-            .get()
-            .build()
-
         val urlMangas = "$apiUrl/mangas".toUri().buildUpon()
             .appendPath(track.media_id.toString())
             .build()
-        val requestMangas = Request.Builder()
-            .url(urlMangas.toString())
-            .get()
-            .build()
-        return authClient.newCall(requestMangas)
+        return authClient.newCall(GET(urlMangas.toString()))
             .asObservableSuccess()
             .map { netResponse ->
                 val responseBody = netResponse.body?.string().orEmpty()
                 json.decodeFromString<JsonObject>(responseBody)
             }.flatMap { mangas ->
-                authClient.newCall(request)
+                val url = "$apiUrl/v2/user_rates".toUri().buildUpon()
+                    .appendQueryParameter("user_id", user_id)
+                    .appendQueryParameter("target_id", track.media_id.toString())
+                    .appendQueryParameter("target_type", "Manga")
+                    .build()
+                authClient.newCall(GET(url.toString()))
                     .asObservableSuccess()
                     .map { netResponse ->
                         val responseBody = netResponse.body?.string().orEmpty()
@@ -155,13 +136,17 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
     }
 
     fun accessToken(code: String): Observable<OAuth> {
-        return client.newCall(accessTokenRequest(code)).asObservableSuccess().map { netResponse ->
-            val responseBody = netResponse.body?.string().orEmpty()
-            if (responseBody.isEmpty()) {
-                throw Exception("Null Response")
+        return client.newCall(accessTokenRequest(code))
+            .asObservableSuccess()
+            .map { netResponse ->
+                netResponse.use {
+                    val responseBody = it.body?.string().orEmpty()
+                    if (responseBody.isEmpty()) {
+                        throw Exception("Null Response")
+                    }
+                    json.decodeFromString<OAuth>(responseBody)
+                }
             }
-            json.decodeFromString<OAuth>(responseBody)
-        }
     }
 
     private fun accessTokenRequest(code: String) = POST(

+ 4 - 28
app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/AnilistLoginActivity.kt

@@ -1,30 +1,14 @@
 package eu.kanade.tachiyomi.ui.setting.track
 
-import android.content.Intent
-import android.os.Bundle
-import android.view.Gravity.CENTER
-import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
-import android.widget.FrameLayout
-import android.widget.ProgressBar
-import androidx.appcompat.app.AppCompatActivity
-import eu.kanade.tachiyomi.data.track.TrackManager
-import eu.kanade.tachiyomi.ui.main.MainActivity
+import android.net.Uri
 import rx.android.schedulers.AndroidSchedulers
 import rx.schedulers.Schedulers
-import uy.kohesive.injekt.injectLazy
 
-class AnilistLoginActivity : AppCompatActivity() {
-
-    private val trackManager: TrackManager by injectLazy()
-
-    override fun onCreate(savedState: Bundle?) {
-        super.onCreate(savedState)
-
-        val view = ProgressBar(this)
-        setContentView(view, FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, CENTER))
+class AnilistLoginActivity : BaseOAuthLoginActivity() {
 
+    override fun handleResult(data: Uri?) {
         val regex = "(?:access_token=)(.*?)(?:&)".toRegex()
-        val matchResult = regex.find(intent.data?.fragment.toString())
+        val matchResult = regex.find(data?.fragment.toString())
         if (matchResult?.groups?.get(1) != null) {
             trackManager.aniList.login(matchResult.groups[1]!!.value)
                 .subscribeOn(Schedulers.io())
@@ -42,12 +26,4 @@ class AnilistLoginActivity : AppCompatActivity() {
             returnToSettings()
         }
     }
-
-    private fun returnToSettings() {
-        finish()
-
-        val intent = Intent(this, MainActivity::class.java)
-        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
-        startActivity(intent)
-    }
 }

+ 4 - 28
app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/BangumiLoginActivity.kt

@@ -1,29 +1,13 @@
 package eu.kanade.tachiyomi.ui.setting.track
 
-import android.content.Intent
-import android.os.Bundle
-import android.view.Gravity.CENTER
-import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
-import android.widget.FrameLayout
-import android.widget.ProgressBar
-import androidx.appcompat.app.AppCompatActivity
-import eu.kanade.tachiyomi.data.track.TrackManager
-import eu.kanade.tachiyomi.ui.main.MainActivity
+import android.net.Uri
 import rx.android.schedulers.AndroidSchedulers
 import rx.schedulers.Schedulers
-import uy.kohesive.injekt.injectLazy
 
-class BangumiLoginActivity : AppCompatActivity() {
+class BangumiLoginActivity : BaseOAuthLoginActivity() {
 
-    private val trackManager: TrackManager by injectLazy()
-
-    override fun onCreate(savedState: Bundle?) {
-        super.onCreate(savedState)
-
-        val view = ProgressBar(this)
-        setContentView(view, FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, CENTER))
-
-        val code = intent.data?.getQueryParameter("code")
+    override fun handleResult(data: Uri?) {
+        val code = data?.getQueryParameter("code")
         if (code != null) {
             trackManager.bangumi.login(code)
                 .subscribeOn(Schedulers.io())
@@ -41,12 +25,4 @@ class BangumiLoginActivity : AppCompatActivity() {
             returnToSettings()
         }
     }
-
-    private fun returnToSettings() {
-        finish()
-
-        val intent = Intent(this, MainActivity::class.java)
-        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
-        startActivity(intent)
-    }
 }

+ 44 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/BaseOAuthLoginActivity.kt

@@ -0,0 +1,44 @@
+package eu.kanade.tachiyomi.ui.setting.track
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.view.Gravity
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import android.widget.ProgressBar
+import androidx.appcompat.app.AppCompatActivity
+import eu.kanade.tachiyomi.data.track.TrackManager
+import eu.kanade.tachiyomi.ui.main.MainActivity
+import uy.kohesive.injekt.injectLazy
+
+abstract class BaseOAuthLoginActivity : AppCompatActivity() {
+
+    internal val trackManager: TrackManager by injectLazy()
+
+    abstract fun handleResult(data: Uri?)
+
+    override fun onCreate(savedState: Bundle?) {
+        super.onCreate(savedState)
+
+        val view = ProgressBar(this)
+        setContentView(
+            view,
+            FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                Gravity.CENTER
+            )
+        )
+
+        handleResult(intent.data)
+    }
+
+    internal fun returnToSettings() {
+        finish()
+
+        val intent = Intent(this, MainActivity::class.java)
+        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
+        startActivity(intent)
+    }
+}

+ 4 - 28
app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/ShikimoriLoginActivity.kt

@@ -1,29 +1,13 @@
 package eu.kanade.tachiyomi.ui.setting.track
 
-import android.content.Intent
-import android.os.Bundle
-import android.view.Gravity.CENTER
-import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
-import android.widget.FrameLayout
-import android.widget.ProgressBar
-import androidx.appcompat.app.AppCompatActivity
-import eu.kanade.tachiyomi.data.track.TrackManager
-import eu.kanade.tachiyomi.ui.main.MainActivity
+import android.net.Uri
 import rx.android.schedulers.AndroidSchedulers
 import rx.schedulers.Schedulers
-import uy.kohesive.injekt.injectLazy
 
-class ShikimoriLoginActivity : AppCompatActivity() {
+class ShikimoriLoginActivity : BaseOAuthLoginActivity() {
 
-    private val trackManager: TrackManager by injectLazy()
-
-    override fun onCreate(savedState: Bundle?) {
-        super.onCreate(savedState)
-
-        val view = ProgressBar(this)
-        setContentView(view, FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, CENTER))
-
-        val code = intent.data?.getQueryParameter("code")
+    override fun handleResult(data: Uri?) {
+        val code = data?.getQueryParameter("code")
         if (code != null) {
             trackManager.shikimori.login(code)
                 .subscribeOn(Schedulers.io())
@@ -41,12 +25,4 @@ class ShikimoriLoginActivity : AppCompatActivity() {
             returnToSettings()
         }
     }
-
-    private fun returnToSettings() {
-        finish()
-
-        val intent = Intent(this, MainActivity::class.java)
-        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
-        startActivity(intent)
-    }
 }