Show changelog in settings

This commit is contained in:
Koitharu
2025-05-15 19:29:40 +03:00
parent 8f8abcc3f6
commit c458f1eafb
6 changed files with 147 additions and 6 deletions

View File

@@ -93,12 +93,6 @@ class AppUpdateRepository @Inject constructor(
return BuildConfig.BUILD_TYPE != BUILD_TYPE_RELEASE || appValidator.isOriginalApp.getOrNull() == true
}
suspend fun getCurrentVersionChangelog(): String? {
val currentVersion = VersionId(BuildConfig.VERSION_NAME)
val available = getAvailableVersions()
return available.find { x -> x.versionId == currentVersion }?.description
}
private inline fun JSONArray.find(predicate: (JSONObject) -> Boolean): JSONObject? {
val size = length()
for (i in 0 until size) {

View File

@@ -0,0 +1,74 @@
package org.koitharu.kotatsu.settings.about.changelog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.viewModels
import dagger.hilt.android.AndroidEntryPoint
import io.noties.markwon.Markwon
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.exceptions.resolve.DialogErrorObserver
import org.koitharu.kotatsu.core.ui.BaseFragment
import org.koitharu.kotatsu.core.util.ext.consumeAll
import org.koitharu.kotatsu.core.util.ext.container
import org.koitharu.kotatsu.core.util.ext.end
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.observeEvent
import org.koitharu.kotatsu.core.util.ext.showOrHide
import org.koitharu.kotatsu.core.util.ext.start
import org.koitharu.kotatsu.databinding.FragmentChangelogBinding
@AndroidEntryPoint
class ChangelogFragment : BaseFragment<FragmentChangelogBinding>() {
private val viewModel: ChangelogViewModel by viewModels()
override fun onCreateViewBinding(
inflater: LayoutInflater,
container: ViewGroup?
) = FragmentChangelogBinding.inflate(inflater, container, false)
override fun onViewBindingCreated(binding: FragmentChangelogBinding, savedInstanceState: Bundle?) {
super.onViewBindingCreated(binding, savedInstanceState)
val markwon = Markwon.create(binding.root.context)
viewModel.isLoading.observe(viewLifecycleOwner) {
binding.progressBar.showOrHide(it)
}
viewModel.onError.observeEvent(viewLifecycleOwner, DialogErrorObserver(binding.root, this))
viewModel.changelog.filterNotNull()
.map { markwon.toMarkdown(it) }
.flowOn(Dispatchers.Default)
.observe(viewLifecycleOwner) {
markwon.setParsedMarkdown(binding.textViewContent, it)
}
}
override fun onResume() {
super.onResume()
activity?.setTitle(R.string.changelog)
}
override fun onApplyWindowInsets(
v: View,
insets: WindowInsetsCompat
): WindowInsetsCompat {
val typeMask = WindowInsetsCompat.Type.systemBars()
val barsInsets = insets.getInsets(typeMask)
val isTablet = !resources.getBoolean(R.bool.is_tablet)
val isMaster = container?.id == R.id.container_master
val basePadding = resources.getDimensionPixelOffset(R.dimen.screen_padding)
requireViewBinding().textViewContent.setPaddingRelative(
basePadding + if (isTablet && !isMaster) 0 else barsInsets.start(v),
basePadding,
basePadding + if (isTablet && isMaster) 0 else barsInsets.end(v),
basePadding + barsInsets.bottom,
)
return insets.consumeAll(typeMask)
}
}

View File

@@ -0,0 +1,31 @@
package org.koitharu.kotatsu.settings.about.changelog
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import org.jsoup.internal.StringUtil
import org.koitharu.kotatsu.core.github.AppUpdateRepository
import org.koitharu.kotatsu.core.ui.BaseViewModel
import javax.inject.Inject
@HiltViewModel
class ChangelogViewModel @Inject constructor(
private val appUpdateRepository: AppUpdateRepository,
) : BaseViewModel() {
val changelog = MutableStateFlow<String?>(null)
init {
launchLoadingJob(Dispatchers.Default) {
val versions = appUpdateRepository.getAvailableVersions()
val stringJoiner = StringUtil.StringJoiner("\n\n\n")
for (version in versions) {
stringJoiner.add("# ")
.append(version.name)
.append("\n\n")
.append(version.description)
}
changelog.value = stringJoiner.complete()
}
}
}

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.core.widget.NestedScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<org.koitharu.kotatsu.core.ui.widgets.SelectableTextView
android:id="@+id/textView_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/screen_padding"
android:textAppearance="?textAppearanceBodyMedium"
android:textIsSelectable="true"
tools:text="@tools:sample/lorem/random" />
</androidx.core.widget.NestedScrollView>
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="top"
android:indeterminate="true"
app:hideAnimationBehavior="escape" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -838,4 +838,6 @@
<string name="incognito_for_nsfw">Incognito mode for NSFW manga</string>
<string name="additional_action_required">Additional action is required</string>
<string name="hide_from_main_screen">Hide from main screen</string>
<string name="changelog">Changelog</string>
<string name="changelog_summary">Changes history for recently released versions</string>
</resources>

View File

@@ -15,6 +15,13 @@
android:summary="@string/allow_unstable_updates_summary"
android:title="@string/allow_unstable_updates" />
<Preference
android:fragment="org.koitharu.kotatsu.settings.about.changelog.ChangelogFragment"
android:key="changelog"
android:persistent="false"
android:summary="@string/changelog_summary"
android:title="@string/changelog" />
<Preference
android:key="about_help"
android:persistent="false"