diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/github/AppUpdateRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/github/AppUpdateRepository.kt index 674307bc1..048e71e2a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/github/AppUpdateRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/github/AppUpdateRepository.kt @@ -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) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/about/changelog/ChangelogFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/about/changelog/ChangelogFragment.kt new file mode 100644 index 000000000..859098b03 --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/about/changelog/ChangelogFragment.kt @@ -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() { + + 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) + } +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/about/changelog/ChangelogViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/about/changelog/ChangelogViewModel.kt new file mode 100644 index 000000000..4b8aea7ed --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/about/changelog/ChangelogViewModel.kt @@ -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(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() + } + } +} diff --git a/app/src/main/res/layout/fragment_changelog.xml b/app/src/main/res/layout/fragment_changelog.xml new file mode 100644 index 000000000..da1f24ae7 --- /dev/null +++ b/app/src/main/res/layout/fragment_changelog.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f6daf7b91..b16dbafca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -838,4 +838,6 @@ Incognito mode for NSFW manga Additional action is required Hide from main screen + Changelog + Changes history for recently released versions diff --git a/app/src/main/res/xml/pref_about.xml b/app/src/main/res/xml/pref_about.xml index 5ffc99411..24013f3a0 100644 --- a/app/src/main/res/xml/pref_about.xml +++ b/app/src/main/res/xml/pref_about.xml @@ -15,6 +15,13 @@ android:summary="@string/allow_unstable_updates_summary" android:title="@string/allow_unstable_updates" /> + +