From 98f86a44efc767a54fbf67fa471c671c98830e5f Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 19 Jan 2020 17:03:11 -0500 Subject: [PATCH] Add tracker logout dialog (closes #2475) --- .../ui/setting/SettingsTrackingController.kt | 80 ++++++++++--------- .../widget/preference/TrackLoginDialog.kt | 4 +- .../widget/preference/TrackLogoutDialog.kt | 37 +++++++++ app/src/main/res/values/strings.xml | 3 + 4 files changed, 85 insertions(+), 39 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/widget/preference/TrackLogoutDialog.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt index c5003a053..314209878 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt @@ -8,16 +8,18 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.anilist.AnilistApi -import eu.kanade.tachiyomi.data.track.shikimori.ShikimoriApi import eu.kanade.tachiyomi.data.track.bangumi.BangumiApi +import eu.kanade.tachiyomi.data.track.shikimori.ShikimoriApi import eu.kanade.tachiyomi.util.getResourceColor import eu.kanade.tachiyomi.widget.preference.LoginPreference import eu.kanade.tachiyomi.widget.preference.TrackLoginDialog +import eu.kanade.tachiyomi.widget.preference.TrackLogoutDialog import uy.kohesive.injekt.injectLazy import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys class SettingsTrackingController : SettingsController(), - TrackLoginDialog.Listener { + TrackLoginDialog.Listener, + TrackLogoutDialog.Listener { private val trackManager: TrackManager by injectLazy() @@ -33,57 +35,57 @@ class SettingsTrackingController : SettingsController(), titleRes = R.string.services trackPreference(trackManager.myAnimeList) { - onClick { - val dialog = TrackLoginDialog(trackManager.myAnimeList) - dialog.targetController = this@SettingsTrackingController - dialog.showDialog(router) - } + val dialog = TrackLoginDialog(trackManager.myAnimeList) + dialog.targetController = this@SettingsTrackingController + dialog.showDialog(router) } trackPreference(trackManager.aniList) { - onClick { - val tabsIntent = CustomTabsIntent.Builder() - .setToolbarColor(context.getResourceColor(R.attr.colorPrimary)) - .build() - tabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) - tabsIntent.launchUrl(activity!!, AnilistApi.authUrl()) - } + val tabsIntent = CustomTabsIntent.Builder() + .setToolbarColor(context.getResourceColor(R.attr.colorPrimary)) + .build() + tabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + tabsIntent.launchUrl(activity!!, AnilistApi.authUrl()) } trackPreference(trackManager.kitsu) { - onClick { - val dialog = TrackLoginDialog(trackManager.kitsu) - dialog.targetController = this@SettingsTrackingController - dialog.showDialog(router) - } + val dialog = TrackLoginDialog(trackManager.kitsu) + dialog.targetController = this@SettingsTrackingController + dialog.showDialog(router) } trackPreference(trackManager.shikimori) { - onClick { - val tabsIntent = CustomTabsIntent.Builder() - .setToolbarColor(context.getResourceColor(R.attr.colorPrimary)) - .build() - tabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) - tabsIntent.launchUrl(activity!!, ShikimoriApi.authUrl()) - } + val tabsIntent = CustomTabsIntent.Builder() + .setToolbarColor(context.getResourceColor(R.attr.colorPrimary)) + .build() + tabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + tabsIntent.launchUrl(activity!!, ShikimoriApi.authUrl()) } trackPreference(trackManager.bangumi) { - onClick { - val tabsIntent = CustomTabsIntent.Builder() - .setToolbarColor(context.getResourceColor(R.attr.colorPrimary)) - .build() - tabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) - tabsIntent.launchUrl(activity!!, BangumiApi.authUrl()) - } + val tabsIntent = CustomTabsIntent.Builder() + .setToolbarColor(context.getResourceColor(R.attr.colorPrimary)) + .build() + tabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + tabsIntent.launchUrl(activity!!, BangumiApi.authUrl()) } } } - inline fun PreferenceScreen.trackPreference( + private inline fun PreferenceScreen.trackPreference( service: TrackService, - block: (@DSL LoginPreference).() -> Unit + crossinline login: () -> Unit ): LoginPreference { return initThenAdd(LoginPreference(context).apply { key = Keys.trackUsername(service.id) title = service.name - }, block) + }, { + onClick { + if (service.isLogged) { + val dialog = TrackLogoutDialog(service) + dialog.targetController = this@SettingsTrackingController + dialog.showDialog(router) + } else { + login() + } + } + }) } override fun onActivityResumed(activity: Activity) { @@ -100,7 +102,11 @@ class SettingsTrackingController : SettingsController(), pref?.notifyChanged() } - override fun trackDialogClosed(service: TrackService) { + override fun trackLoginDialogClosed(service: TrackService) { + updatePreference(service.id) + } + + override fun trackLogoutDialogClosed(service: TrackService) { updatePreference(service.id) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TrackLoginDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TrackLoginDialog.kt index 500a9225b..1665bf74b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TrackLoginDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TrackLoginDialog.kt @@ -51,11 +51,11 @@ class TrackLoginDialog(bundle: Bundle? = null) : LoginDialogPreference(bundle) { override fun onDialogClosed() { super.onDialogClosed() - (targetController as? Listener)?.trackDialogClosed(service) + (targetController as? Listener)?.trackLoginDialogClosed(service) } interface Listener { - fun trackDialogClosed(service: TrackService) + fun trackLoginDialogClosed(service: TrackService) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TrackLogoutDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TrackLogoutDialog.kt new file mode 100644 index 000000000..8f45fde24 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TrackLogoutDialog.kt @@ -0,0 +1,37 @@ +package eu.kanade.tachiyomi.widget.preference + +import android.app.Dialog +import android.os.Bundle +import com.afollestad.materialdialogs.MaterialDialog +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.track.TrackManager +import eu.kanade.tachiyomi.data.track.TrackService +import eu.kanade.tachiyomi.ui.base.controller.DialogController +import eu.kanade.tachiyomi.util.toast +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class TrackLogoutDialog(bundle: Bundle? = null) : DialogController(bundle) { + + private val service = Injekt.get().getService(args.getInt("key"))!! + + constructor(service: TrackService) : this(Bundle().apply { putInt("key", service.id) }) + + override fun onCreateDialog(savedViewState: Bundle?): Dialog { + return MaterialDialog.Builder(activity!!) + .title(activity!!.getString(R.string.logout_title, service.name)) + .positiveText(R.string.logout) + .onPositive { _, _ -> + service.logout() + (targetController as? Listener)?.trackLogoutDialogClosed(service) + activity?.toast(R.string.logout_success) + } + .negativeText(android.R.string.cancel) + .build() + } + + interface Listener { + fun trackLogoutDialogClosed(service: TrackService) + } + +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a628c2dbe..bdf989e33 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -315,6 +315,9 @@ Show password Login Successfully logged in + Logout from %1$s? + Logout + You are now logged out Could not log in Unknown error