Show sources names in onboarding
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user