Show sources names in onboarding

This commit is contained in:
Koitharu
2022-10-14 13:36:33 +03:00
parent 11104223eb
commit 64aaf37556
8 changed files with 79 additions and 37 deletions

View File

@@ -11,8 +11,8 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.AlertDialogFragment import org.koitharu.kotatsu.base.ui.AlertDialogFragment
import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.databinding.DialogOnboardBinding import org.koitharu.kotatsu.databinding.DialogOnboardBinding
import org.koitharu.kotatsu.settings.onboard.adapter.SourceLocaleListener
import org.koitharu.kotatsu.settings.onboard.adapter.SourceLocalesAdapter import org.koitharu.kotatsu.settings.onboard.adapter.SourceLocalesAdapter
import org.koitharu.kotatsu.settings.onboard.model.SourceLocale import org.koitharu.kotatsu.settings.onboard.model.SourceLocale
import org.koitharu.kotatsu.utils.ext.showAllowStateLoss import org.koitharu.kotatsu.utils.ext.showAllowStateLoss
@@ -21,8 +21,7 @@ import org.koitharu.kotatsu.utils.ext.withArgs
@AndroidEntryPoint @AndroidEntryPoint
class OnboardDialogFragment : class OnboardDialogFragment :
AlertDialogFragment<DialogOnboardBinding>(), AlertDialogFragment<DialogOnboardBinding>(),
OnListItemClickListener<SourceLocale>, DialogInterface.OnClickListener, SourceLocaleListener {
DialogInterface.OnClickListener {
private val viewModel by viewModels<OnboardViewModel>() private val viewModel by viewModels<OnboardViewModel>()
private var isWelcome: Boolean = false private var isWelcome: Boolean = false
@@ -63,8 +62,8 @@ class OnboardDialogFragment :
} }
} }
override fun onItemClick(item: SourceLocale, view: View) { override fun onItemCheckedChanged(item: SourceLocale, isChecked: Boolean) {
viewModel.setItemChecked(item.key, !item.isChecked) viewModel.setItemChecked(item.key, isChecked)
} }
override fun onClick(dialog: DialogInterface?, which: Int) { override fun onClick(dialog: DialogInterface?, which: Int) {

View File

@@ -1,11 +1,8 @@
package org.koitharu.kotatsu.settings.onboard package org.koitharu.kotatsu.settings.onboard
import androidx.collection.ArraySet
import androidx.core.os.LocaleListCompat import androidx.core.os.LocaleListCompat
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import java.util.*
import javax.inject.Inject
import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.base.ui.BaseViewModel
import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.model.MangaSource
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
@@ -15,6 +12,8 @@ import org.koitharu.kotatsu.parsers.util.toTitleCase
import org.koitharu.kotatsu.settings.onboard.model.SourceLocale import org.koitharu.kotatsu.settings.onboard.model.SourceLocale
import org.koitharu.kotatsu.utils.ext.map import org.koitharu.kotatsu.utils.ext.map
import org.koitharu.kotatsu.utils.ext.mapToSet import org.koitharu.kotatsu.utils.ext.mapToSet
import java.util.Locale
import javax.inject.Inject
@HiltViewModel @HiltViewModel
class OnboardViewModel @Inject constructor( class OnboardViewModel @Inject constructor(
@@ -23,9 +22,9 @@ class OnboardViewModel @Inject constructor(
private val allSources = settings.remoteMangaSources private val allSources = settings.remoteMangaSources
private val locales = allSources.mapTo(ArraySet()) { it.locale } private val locales = allSources.groupBy { it.locale }
private val selectedLocales = locales.toMutableSet() private val selectedLocales = locales.keys.toMutableSet()
val list = MutableLiveData<List<SourceLocale>?>() val list = MutableLiveData<List<SourceLocale>?>()
@@ -64,13 +63,14 @@ class OnboardViewModel @Inject constructor(
} }
private fun rebuildList() { private fun rebuildList() {
list.value = locales.map { key -> list.value = locales.map { (key, srcs) ->
val locale = if (key != null) { val locale = if (key != null) {
Locale(key) Locale(key)
} else null } else null
SourceLocale( SourceLocale(
key = key, key = key,
title = locale?.getDisplayLanguage(locale)?.toTitleCase(locale), title = locale?.getDisplayLanguage(locale)?.toTitleCase(locale),
summary = srcs.joinToString { it.title },
isChecked = key in selectedLocales, isChecked = key in selectedLocales,
) )
}.sortedWith(SourceLocaleComparator()) }.sortedWith(SourceLocaleComparator())
@@ -87,11 +87,12 @@ class OnboardViewModel @Inject constructor(
a?.key == null -> 1 a?.key == null -> 1
b?.key == null -> -1 b?.key == null -> -1
else -> { else -> {
val index = deviceLocales.indexOf(a.key) val indexA = deviceLocales.indexOf(a.key)
if (index == -1) { val indexB = deviceLocales.indexOf(b.key)
if (indexA == -1 && indexB == -1) {
compareValues(a.title, b.title) compareValues(a.title, b.title)
} else { } else {
-2 - index -2 - (indexA - indexB)
} }
} }
} }

View File

@@ -2,22 +2,23 @@ package org.koitharu.kotatsu.settings.onboard.adapter
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.databinding.ItemSourceLocaleBinding import org.koitharu.kotatsu.databinding.ItemSourceLocaleBinding
import org.koitharu.kotatsu.settings.onboard.model.SourceLocale import org.koitharu.kotatsu.settings.onboard.model.SourceLocale
import org.koitharu.kotatsu.utils.ext.textAndVisible
fun sourceLocaleAD( fun sourceLocaleAD(
clickListener: OnListItemClickListener<SourceLocale> listener: SourceLocaleListener,
) = adapterDelegateViewBinding<SourceLocale, SourceLocale, ItemSourceLocaleBinding>( ) = adapterDelegateViewBinding<SourceLocale, SourceLocale, ItemSourceLocaleBinding>(
{ inflater, parent -> ItemSourceLocaleBinding.inflate(inflater, parent, false) } { inflater, parent -> ItemSourceLocaleBinding.inflate(inflater, parent, false) },
) { ) {
binding.root.setOnClickListener { binding.switchToggle.setOnCheckedChangeListener { _, isChecked ->
clickListener.onItemClick(item, it) listener.onItemCheckedChanged(item, isChecked)
} }
bind { bind {
binding.root.text = item.title ?: getString(R.string.other) binding.textViewTitle.text = item.title ?: getString(R.string.different_languages)
binding.root.isChecked = item.isChecked binding.textViewDescription.textAndVisible = item.summary
binding.switchToggle.isChecked = item.isChecked
} }
} }

View File

@@ -0,0 +1,8 @@
package org.koitharu.kotatsu.settings.onboard.adapter
import org.koitharu.kotatsu.settings.onboard.model.SourceLocale
interface SourceLocaleListener {
fun onItemCheckedChanged(item: SourceLocale, isChecked: Boolean)
}

View File

@@ -2,15 +2,14 @@ package org.koitharu.kotatsu.settings.onboard.adapter
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.settings.onboard.model.SourceLocale import org.koitharu.kotatsu.settings.onboard.model.SourceLocale
class SourceLocalesAdapter( class SourceLocalesAdapter(
clickListener: OnListItemClickListener<SourceLocale>, listener: SourceLocaleListener,
) : AsyncListDifferDelegationAdapter<SourceLocale>(DiffCallback()) { ) : AsyncListDifferDelegationAdapter<SourceLocale>(DiffCallback()) {
init { init {
delegatesManager.addDelegate(sourceLocaleAD(clickListener)) delegatesManager.addDelegate(sourceLocaleAD(listener))
} }
private class DiffCallback : DiffUtil.ItemCallback<SourceLocale>() { private class DiffCallback : DiffUtil.ItemCallback<SourceLocale>() {
@@ -25,4 +24,4 @@ class SourceLocalesAdapter(
newItem: SourceLocale, newItem: SourceLocale,
): Boolean = oldItem == newItem ): Boolean = oldItem == newItem
} }
} }

View File

@@ -1,10 +1,11 @@
package org.koitharu.kotatsu.settings.onboard.model package org.koitharu.kotatsu.settings.onboard.model
import java.util.* import java.util.Locale
data class SourceLocale( data class SourceLocale(
val key: String?, val key: String?,
val title: String?, val title: String?,
val summary: String?,
val isChecked: Boolean, val isChecked: Boolean,
) : Comparable<SourceLocale> { ) : Comparable<SourceLocale> {

View File

@@ -1,15 +1,47 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<CheckedTextView <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?android:listPreferredItemHeightSmall" android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:drawableStart="?android:listChoiceIndicatorMultiple"
android:drawablePadding="10dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:paddingStart="?listPreferredItemPaddingStart" android:minHeight="?android:listPreferredItemHeightSmall"
android:paddingEnd="?listPreferredItemPaddingEnd" android:orientation="horizontal">
android:singleLine="true"
android:textAppearance="?attr/textAppearanceBodyLarge" <LinearLayout
tools:text="@tools:sample/lorem[2]" /> android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp"
android:layout_marginStart="?android:listPreferredItemPaddingStart"
android:layout_marginEnd="?android:listPreferredItemPaddingEnd"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/textView_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="?attr/textAppearanceBodyLarge"
tools:text="@tools:sample/lorem[15]" />
<TextView
android:id="@+id/textView_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="?attr/textAppearanceBodySmall"
tools:text="English" />
</LinearLayout>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switch_toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="?listPreferredItemPaddingEnd" />
</LinearLayout>

View File

@@ -392,4 +392,5 @@
<string name="reader_slider">Show page switching slider</string> <string name="reader_slider">Show page switching slider</string>
<string name="webtoon_zoom">Webtoon zoom</string> <string name="webtoon_zoom">Webtoon zoom</string>
<string name="webtoon_zoom_summary">Allow zoom in/zoom out gesture in webtoon mode (beta)</string> <string name="webtoon_zoom_summary">Allow zoom in/zoom out gesture in webtoon mode (beta)</string>
<string name="different_languages">Different languages</string>
</resources> </resources>