From 205a2e10a585762eb57dedbb918d328e8f304d31 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 1 Feb 2023 08:04:38 +0200 Subject: [PATCH] Fix scrobbling ui issues --- .../base/ui/widgets/BottomSheetHeaderBar.kt | 14 ++++- .../scrobbling/data/ScrobblerStorage.kt | 13 +++-- .../selector/ScrobblingSelectorBottomSheet.kt | 22 ++++--- .../settings/HistorySettingsFragment.kt | 58 ++++++++++--------- app/src/main/res/layout/sheet_scrobbling.xml | 4 +- 5 files changed, 66 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/BottomSheetHeaderBar.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/BottomSheetHeaderBar.kt index cd60b79f8..6b85c6d51 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/BottomSheetHeaderBar.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/BottomSheetHeaderBar.kt @@ -4,10 +4,12 @@ import android.animation.LayoutTransition import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.view.Menu import android.view.View import android.view.ViewGroup import android.view.WindowInsets import androidx.annotation.AttrRes +import androidx.annotation.MenuRes import androidx.annotation.StringRes import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout @@ -15,16 +17,16 @@ import androidx.core.content.withStyledAttributes import androidx.core.view.* import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner -import com.google.android.material.R as materialR import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.bottomsheet.BottomSheetBehavior -import java.util.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.databinding.LayoutSheetHeaderBinding import org.koitharu.kotatsu.utils.ext.getAnimationDuration import org.koitharu.kotatsu.utils.ext.getThemeDrawable import org.koitharu.kotatsu.utils.ext.parents +import java.util.* +import com.google.android.material.R as materialR private const val THROTTLE_DELAY = 200L @@ -53,6 +55,9 @@ class BottomSheetHeaderBar @JvmOverloads constructor( val toolbar: MaterialToolbar get() = binding.toolbar + val menu: Menu + get() = binding.toolbar.menu + var title: CharSequence? get() = binding.toolbar.title set(value) { @@ -140,6 +145,10 @@ class BottomSheetHeaderBar @JvmOverloads constructor( binding.toolbar.invalidateMenu() } + fun inflateMenu(@MenuRes resId: Int) { + binding.toolbar.inflateMenu(resId) + } + fun setNavigationOnClickListener(onClickListener: OnClickListener) { binding.toolbar.setNavigationOnClickListener(onClickListener) } @@ -258,6 +267,7 @@ class BottomSheetHeaderBar @JvmOverloads constructor( } lp } + else -> Toolbar.LayoutParams(params) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/data/ScrobblerStorage.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/data/ScrobblerStorage.kt index 953f6eec9..c5f7973c5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/data/ScrobblerStorage.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/data/ScrobblerStorage.kt @@ -2,6 +2,7 @@ package org.koitharu.kotatsu.scrobbling.data import android.content.Context import androidx.core.content.edit +import org.jsoup.internal.StringUtil.StringJoiner import org.koitharu.kotatsu.scrobbling.domain.model.ScrobblerService import org.koitharu.kotatsu.scrobbling.domain.model.ScrobblerUser @@ -39,12 +40,12 @@ class ScrobblerStorage(context: Context, service: ScrobblerService) { remove(KEY_USER) return@edit } - val str = buildString { - appendLine(value.id) - appendLine(value.nickname) - appendLine(value.avatar) - appendLine(value.service.name) - } + val str = StringJoiner("\n") + .add(value.id) + .add(value.nickname) + .add(value.avatar) + .add(value.service.name) + .complete() putString(KEY_USER, str) } diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/ui/selector/ScrobblingSelectorBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/ui/selector/ScrobblingSelectorBottomSheet.kt index 151452acb..dcdfafcf8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/ui/selector/ScrobblingSelectorBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/ui/selector/ScrobblingSelectorBottomSheet.kt @@ -3,7 +3,11 @@ package org.koitharu.kotatsu.scrobbling.ui.selector import android.app.Dialog import android.content.DialogInterface import android.os.Bundle -import android.view.* +import android.view.KeyEvent +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.Toast @@ -12,7 +16,6 @@ import androidx.core.view.isVisible import androidx.fragment.app.FragmentManager import coil.ImageLoader import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.base.ui.BaseBottomSheet @@ -28,6 +31,7 @@ import org.koitharu.kotatsu.utils.ext.assistedViewModels import org.koitharu.kotatsu.utils.ext.getDisplayMessage import org.koitharu.kotatsu.utils.ext.requireParcelable import org.koitharu.kotatsu.utils.ext.withArgs +import javax.inject.Inject @AndroidEntryPoint class ScrobblingSelectorBottomSheet : @@ -120,7 +124,7 @@ class ScrobblingSelectorBottomSheet : return false } viewModel.search(query) - binding.headerBar.toolbar.menu.findItem(R.id.action_search)?.collapseActionView() + binding.headerBar.menu.findItem(R.id.action_search)?.collapseActionView() return true } @@ -128,7 +132,7 @@ class ScrobblingSelectorBottomSheet : override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean { if (keyCode == KeyEvent.KEYCODE_BACK) { - val menuItem = binding.headerBar.toolbar.menu.findItem(R.id.action_search) ?: return false + val menuItem = binding.headerBar.menu.findItem(R.id.action_search) ?: return false if (menuItem.isActionViewExpanded) { if (event?.action == KeyEvent.ACTION_UP) { menuItem.collapseActionView() @@ -153,8 +157,8 @@ class ScrobblingSelectorBottomSheet : } private fun initOptionsMenu() { - binding.headerBar.toolbar.inflateMenu(R.menu.opt_shiki_selector) - val searchMenuItem = binding.headerBar.toolbar.menu.findItem(R.id.action_search) + binding.headerBar.inflateMenu(R.menu.opt_shiki_selector) + val searchMenuItem = binding.headerBar.menu.findItem(R.id.action_search) searchMenuItem.setOnActionExpandListener(this) val searchView = searchMenuItem.actionView as SearchView searchView.setOnQueryTextListener(this) @@ -168,7 +172,11 @@ class ScrobblingSelectorBottomSheet : binding.spinnerScrobblers.isVisible = false return } - val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, entries) + val adapter = ArrayAdapter( + requireContext(), + android.R.layout.simple_spinner_item, + entries.map { getString(it.scrobblerService.titleResId) }, + ) adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) binding.spinnerScrobblers.adapter = adapter viewModel.selectedScrobblerIndex.observe(viewLifecycleOwner) { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt index 87c02453b..53371ec18 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt @@ -9,7 +9,9 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.network.cookies.MutableCookieJar @@ -18,11 +20,13 @@ import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.local.data.CacheDir import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.scrobbling.anilist.data.AniListRepository +import org.koitharu.kotatsu.scrobbling.data.ScrobblerRepository import org.koitharu.kotatsu.scrobbling.shikimori.data.ShikimoriRepository import org.koitharu.kotatsu.search.domain.MangaSearchRepository import org.koitharu.kotatsu.tracker.domain.TrackingRepository import org.koitharu.kotatsu.utils.FileSize import org.koitharu.kotatsu.utils.ext.getDisplayMessage +import org.koitharu.kotatsu.utils.ext.printStackTraceDebug import org.koitharu.kotatsu.utils.ext.viewLifecycleScope import javax.inject.Inject @@ -78,8 +82,8 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach override fun onResume() { super.onResume() - bindShikimoriSummary() - bindAniListSummary() + bindScrobblerSummary(AppSettings.KEY_SHIKIMORI, shikimoriRepository) + bindScrobblerSummary(AppSettings.KEY_ANILIST, aniListRepository) } override fun onPreferenceTreeClick(preference: Preference): Boolean { @@ -120,7 +124,7 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach AppSettings.KEY_SHIKIMORI -> { if (!shikimoriRepository.isAuthorized) { - launchShikimoriAuth() + launchScrobblerAuth(shikimoriRepository) true } else { super.onPreferenceTreeClick(preference) @@ -129,7 +133,7 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach AppSettings.KEY_ANILIST -> { if (!aniListRepository.isAuthorized) { - launchAniListAuth() + launchScrobblerAuth(aniListRepository) true } else { super.onPreferenceTreeClick(preference) @@ -199,36 +203,34 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach }.show() } - private fun bindShikimoriSummary() { - findPreference(AppSettings.KEY_SHIKIMORI)?.summary = if (shikimoriRepository.isAuthorized) { - getString(R.string.logged_in_as, shikimoriRepository.cachedUser?.nickname) + private fun bindScrobblerSummary(key: String, repository: ScrobblerRepository) { + val pref = findPreference(key) ?: return + if (!repository.isAuthorized) { + pref.setSummary(R.string.disabled) + return + } + val username = repository.cachedUser?.nickname + if (username != null) { + pref.summary = getString(R.string.logged_in_as, username) } else { - getString(R.string.disabled) + pref.setSummary(R.string.loading_) + viewLifecycleScope.launch { + pref.summary = withContext(Dispatchers.Default) { + runCatching { + repository.loadUser().nickname + }.getOrElse { + it.printStackTraceDebug() + it.getDisplayMessage(resources) + } + } + } } } - private fun bindAniListSummary() { - findPreference(AppSettings.KEY_ANILIST)?.summary = if (aniListRepository.isAuthorized) { - getString(R.string.logged_in_as, aniListRepository.cachedUser?.nickname) - } else { - getString(R.string.disabled) - } - } - - private fun launchShikimoriAuth() { + private fun launchScrobblerAuth(repository: ScrobblerRepository) { runCatching { val intent = Intent(Intent.ACTION_VIEW) - intent.data = Uri.parse(shikimoriRepository.oauthUrl) - startActivity(intent) - }.onFailure { - Snackbar.make(listView, it.getDisplayMessage(resources), Snackbar.LENGTH_LONG).show() - } - } - - private fun launchAniListAuth() { - runCatching { - val intent = Intent(Intent.ACTION_VIEW) - intent.data = Uri.parse(aniListRepository.oauthUrl) + intent.data = Uri.parse(repository.oauthUrl) startActivity(intent) }.onFailure { Snackbar.make(listView, it.getDisplayMessage(resources), Snackbar.LENGTH_LONG).show() diff --git a/app/src/main/res/layout/sheet_scrobbling.xml b/app/src/main/res/layout/sheet_scrobbling.xml index 05e24fc5a..ecb30f7c8 100644 --- a/app/src/main/res/layout/sheet_scrobbling.xml +++ b/app/src/main/res/layout/sheet_scrobbling.xml @@ -8,7 +8,8 @@ + android:layout_height="wrap_content" + android:paddingBottom="16dp">