From ab9bdf9f07f847c6c658ce9a578dc693d65aa3f0 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 11 Sep 2022 09:07:25 +0300 Subject: [PATCH 1/5] Fixes --- app/build.gradle | 4 ++-- .../kotatsu/details/ui/ChaptersFragment.kt | 12 ++++++------ .../kotatsu/download/domain/DownloadManager.kt | 2 +- .../history/ui/HistoryListMenuProvider.kt | 4 ++-- .../kotatsu/list/ui/adapter/BadgeADUtil.kt | 3 +++ .../list/ui/adapter/MangaListDetailedItemAD.kt | 2 +- .../kotatsu/list/ui/adapter/MangaListItemAD.kt | 2 +- .../kotatsu/local/domain/CbzMangaOutput.kt | 8 ++++---- .../koitharu/kotatsu/utils/ext/ThrowableExt.kt | 18 ++++++++++++------ 9 files changed, 32 insertions(+), 23 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6c1b01155..da9879f76 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId 'org.koitharu.kotatsu' minSdkVersion 21 targetSdkVersion 32 - versionCode 426 - versionName '3.4.14' + versionCode 427 + versionName '3.4.15' generatedDensities = [] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt index 9f1ad93e9..a184c8dad 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt @@ -12,6 +12,7 @@ import androidx.core.view.MenuProvider import androidx.core.view.isVisible import androidx.core.view.updatePadding import com.google.android.material.snackbar.Snackbar +import kotlin.math.roundToInt import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseFragment @@ -29,7 +30,6 @@ import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.utils.RecyclerViewScrollCallback import org.koitharu.kotatsu.utils.ext.addMenuProvider -import kotlin.math.roundToInt class ChaptersFragment : BaseFragment(), @@ -46,7 +46,7 @@ class ChaptersFragment : override fun onInflateView( inflater: LayoutInflater, - container: ViewGroup? + container: ViewGroup?, ) = FragmentChaptersBinding.inflate(inflater, container, false) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -98,7 +98,7 @@ class ChaptersFragment : manga = viewModel.manga.value ?: return, state = ReaderState(item.chapter.id, 0, 0), ), - options.toBundle() + options.toBundle(), ) } @@ -128,7 +128,7 @@ class ChaptersFragment : Snackbar.make( binding.recyclerViewChapters, R.string.chapters_will_removed_background, - Snackbar.LENGTH_LONG + Snackbar.LENGTH_LONG, ).show() } } @@ -271,8 +271,8 @@ class ChaptersFragment : } override fun onPrepareMenu(menu: Menu) { - menu.findItem(R.id.action_reversed).isChecked = viewModel.isChaptersReversed.value == true - menu.findItem(R.id.action_search).isVisible = viewModel.isChaptersEmpty.value == false + menu.findItem(R.id.action_reversed)?.isChecked = viewModel.isChaptersReversed.value == true + menu.findItem(R.id.action_search)?.isVisible = viewModel.isChaptersEmpty.value == false } override fun onMenuItemSelected(menuItem: MenuItem): Boolean = when (menuItem.itemId) { diff --git a/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt b/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt index 7f18106b8..8452512be 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt @@ -150,7 +150,7 @@ class DownloadManager( } outState.value = DownloadState.PostProcessing(startId, data, cover) output.mergeWithExisting() - output.finalize() + output.finish() val localManga = localMangaRepository.getFromFile(output.file) outState.value = DownloadState.Done(startId, data, cover, localManga) } catch (e: CancellationException) { diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt index fe0daa58c..00c5dee0b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt @@ -5,9 +5,9 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import androidx.core.view.MenuProvider +import com.google.android.material.R as materialR import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R -import com.google.android.material.R as materialR class HistoryListMenuProvider( private val context: Context, @@ -38,6 +38,6 @@ class HistoryListMenuProvider( } override fun onPrepareMenu(menu: Menu) { - menu.findItem(R.id.action_history_grouping).isChecked = viewModel.isGroupingEnabled.value == true + menu.findItem(R.id.action_history_grouping)?.isChecked = viewModel.isGroupingEnabled.value == true } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt index e25a70657..ede90b552 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt @@ -1,13 +1,16 @@ @file:SuppressLint("UnsafeOptInUsageError") + package org.koitharu.kotatsu.list.ui.adapter import android.annotation.SuppressLint import android.view.View +import androidx.annotation.CheckResult import androidx.core.view.doOnNextLayout import com.google.android.material.badge.BadgeDrawable import com.google.android.material.badge.BadgeUtils import org.koitharu.kotatsu.R +@CheckResult fun View.bindBadge(badge: BadgeDrawable?, counter: Int): BadgeDrawable? { return if (counter > 0) { val badgeDrawable = badge ?: initBadge(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt index 4c1443b72..bafcb4bc7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListDetailedItemAD.kt @@ -46,7 +46,7 @@ fun mangaListDetailedItemAD( } binding.textViewRating.textAndVisible = item.rating binding.textViewTags.text = item.tags - itemView.bindBadge(badge, item.counter) + badge = itemView.bindBadge(badge, item.counter) } onViewRecycled { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt index fb8f5e216..cd07a15ba 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListItemAD.kt @@ -40,7 +40,7 @@ fun mangaListItemAD( lifecycle(lifecycleOwner) enqueueWith(coil) } - itemView.bindBadge(badge, item.counter) + badge = itemView.bindBadge(badge, item.counter) } onViewRecycled { diff --git a/app/src/main/java/org/koitharu/kotatsu/local/domain/CbzMangaOutput.kt b/app/src/main/java/org/koitharu/kotatsu/local/domain/CbzMangaOutput.kt index 53e2d474a..0d21291ac 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/domain/CbzMangaOutput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/domain/CbzMangaOutput.kt @@ -1,6 +1,8 @@ package org.koitharu.kotatsu.local.domain import androidx.annotation.WorkerThread +import java.io.File +import java.util.zip.ZipFile import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible import okio.Closeable @@ -11,8 +13,6 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.util.toFileNameSafe import org.koitharu.kotatsu.utils.ext.deleteAwait import org.koitharu.kotatsu.utils.ext.readText -import java.io.File -import java.util.zip.ZipFile class CbzMangaOutput( val file: File, @@ -62,7 +62,7 @@ class CbzMangaOutput( index.addChapter(chapter) } - suspend fun finalize() { + suspend fun finish() { runInterruptible(Dispatchers.IO) { output.put(ENTRY_NAME_INDEX, index.toString()) output.finish() @@ -89,7 +89,7 @@ class CbzMangaOutput( otherIndex = MangaIndex( zip.getInputStream(entry).use { it.reader().readText() - } + }, ) } else { output.copyEntryFrom(zip, entry) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt index 4597d7d6c..d4f654525 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt @@ -2,6 +2,7 @@ package org.koitharu.kotatsu.utils.ext import android.content.ActivityNotFoundException import android.content.res.Resources +import androidx.collection.arraySetOf import java.net.SocketTimeoutException import okio.FileNotFoundException import org.acra.ktx.sendWithAcra @@ -30,14 +31,19 @@ fun Throwable.getDisplayMessage(resources: Resources): String = when (this) { } ?: resources.getString(R.string.error_occurred) fun Throwable.isReportable(): Boolean { - if (this !is Exception) { - return true - } - return this is ParseException || this is IllegalArgumentException || - this is IllegalStateException || this.javaClass == RuntimeException::class.java + return this is Error || this.javaClass in reportableExceptions } fun Throwable.report(message: String?) { val exception = CaughtException(this, message) exception.sendWithAcra() -} \ No newline at end of file +} + +private val reportableExceptions = arraySetOf>( + ParseException::class.java, + RuntimeException::class.java, + IllegalStateException::class.java, + IllegalArgumentException::class.java, + ConcurrentModificationException::class.java, + UnsupportedOperationException::class.java, +) \ No newline at end of file From 757e33dfb4c96754f6b60409e8da60a24ac601c6 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 12 Sep 2022 14:32:42 +0300 Subject: [PATCH 2/5] Fix unwanted errors reporting --- app/build.gradle | 2 +- .../main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index da9879f76..bb67f50e5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,7 +115,7 @@ dependencies { implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:4.3.2' implementation 'io.insert-koin:koin-android:3.2.0' - implementation 'io.coil-kt:coil-base:2.2.0' + implementation 'io.coil-kt:coil-base:2.2.1' implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0' implementation 'com.github.solkin:disk-lru-cache:1.4' diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index 2bf5c641a..ce21903ba 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -213,7 +213,7 @@ class ReaderActivity : val resolveTextId = ExceptionResolver.getResolveStringId(e) if (resolveTextId != 0) { dialog.setPositiveButton(resolveTextId, listener) - } else { + } else if (e.isReportable()) { dialog.setPositiveButton(R.string.report, listener) } dialog.show() From 4186c36f30f42e0b163ea1a4bec5d514f3bbf89b Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 12 Sep 2022 15:43:42 +0300 Subject: [PATCH 3/5] Prevent GoneOnInvisibleListener leak --- .../kotatsu/reader/ui/pager/BasePageHolder.kt | 10 +++++++++- .../reader/ui/pager/BaseReaderAdapter.kt | 19 ++++++++++++++----- .../reader/ui/pager/webtoon/WebtoonHolder.kt | 12 +++++++++++- .../kotatsu/utils/GoneOnInvisibleListener.kt | 7 ++++++- 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt index d3980c687..c1538dfb5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt @@ -13,7 +13,7 @@ abstract class BasePageHolder( protected val binding: B, loader: PageLoader, settings: AppSettings, - exceptionResolver: ExceptionResolver + exceptionResolver: ExceptionResolver, ) : RecyclerView.ViewHolder(binding.root), PageHolderDelegate.Callback { @Suppress("LeakingThis") @@ -37,6 +37,14 @@ abstract class BasePageHolder( protected abstract fun onBind(data: ReaderPage) + @CallSuper + open fun onAttachedToWindow() { + } + + @CallSuper + open fun onDetachedFromWindow() { + } + @CallSuper open fun onRecycled() { delegate.onRecycle() diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt index d097c1bc2..9a3e98c92 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt @@ -4,12 +4,12 @@ import android.view.ViewGroup import androidx.recyclerview.widget.AsyncListDiffer import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.utils.ext.resetTransformations -import kotlin.coroutines.resume -import kotlin.coroutines.suspendCoroutine @Suppress("LeakingThis") abstract class BaseReaderAdapter>( @@ -35,6 +35,16 @@ abstract class BaseReaderAdapter>( super.onViewRecycled(holder) } + override fun onViewAttachedToWindow(holder: H) { + super.onViewAttachedToWindow(holder) + holder.onAttachedToWindow() + } + + override fun onViewDetachedFromWindow(holder: H) { + super.onViewDetachedFromWindow(holder) + holder.onDetachedFromWindow() + } + open fun getItem(position: Int): ReaderPage = differ.currentList[position] open fun getItemOrNull(position: Int) = differ.currentList.getOrNull(position) @@ -45,7 +55,7 @@ abstract class BaseReaderAdapter>( final override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int + viewType: Int, ): H = onCreateViewHolder(parent, loader, settings, exceptionResolver) suspend fun setItems(items: List) = suspendCoroutine { cont -> @@ -58,7 +68,7 @@ abstract class BaseReaderAdapter>( parent: ViewGroup, loader: PageLoader, settings: AppSettings, - exceptionResolver: ExceptionResolver + exceptionResolver: ExceptionResolver, ): H private class DiffCallback : DiffUtil.ItemCallback() { @@ -70,6 +80,5 @@ abstract class BaseReaderAdapter>( override fun areContentsTheSame(oldItem: ReaderPage, newItem: ReaderPage): Boolean { return oldItem == newItem } - } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt index 4d9fc1ed8..c25b701a9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt @@ -25,11 +25,11 @@ class WebtoonHolder( View.OnClickListener { private var scrollToRestore = 0 + private val goneOnInvisibleListener = GoneOnInvisibleListener(bindingInfo.progressBar) init { binding.ssiv.setOnImageEventListener(delegate) bindingInfo.buttonRetry.setOnClickListener(this) - GoneOnInvisibleListener(bindingInfo.progressBar).attach() } override fun onBind(data: ReaderPage) { @@ -41,6 +41,16 @@ class WebtoonHolder( binding.ssiv.recycle() } + override fun onAttachedToWindow() { + super.onAttachedToWindow() + goneOnInvisibleListener.attach() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + goneOnInvisibleListener.detach() + } + override fun onLoadingStarted() { bindingInfo.layoutError.isVisible = false bindingInfo.progressBar.showCompat() diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/GoneOnInvisibleListener.kt b/app/src/main/java/org/koitharu/kotatsu/utils/GoneOnInvisibleListener.kt index da4fe3f3f..46de769c6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/GoneOnInvisibleListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/GoneOnInvisibleListener.kt @@ -19,5 +19,10 @@ class GoneOnInvisibleListener( fun attach() { view.viewTreeObserver.addOnGlobalLayoutListener(this) + onGlobalLayout() } -} \ No newline at end of file + + fun detach() { + view.viewTreeObserver.removeOnGlobalLayoutListener(this) + } +} From c27c785ac26533c7ff86b4ddbee35d44fb1f9244 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 14 Sep 2022 12:30:07 +0300 Subject: [PATCH 4/5] Use Coil for empty states images --- .../kotatsu/list/ui/adapter/EmptyStateListAD.kt | 14 +++++++++++--- .../kotatsu/list/ui/adapter/MangaListAdapter.kt | 4 ++-- .../search/ui/multi/adapter/MultiSearchAdapter.kt | 6 +++--- .../kotatsu/tracker/ui/adapter/FeedAdapter.kt | 4 ++-- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt index 8385090ab..0bf2f1309 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt @@ -1,23 +1,31 @@ package org.koitharu.kotatsu.list.ui.adapter +import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.databinding.ItemEmptyStateBinding import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.ListModel +import org.koitharu.kotatsu.utils.ext.disposeImageRequest +import org.koitharu.kotatsu.utils.ext.enqueueWith +import org.koitharu.kotatsu.utils.ext.newImageRequest import org.koitharu.kotatsu.utils.ext.setTextAndVisible fun emptyStateListAD( + coil: ImageLoader, listener: MangaListListener, ) = adapterDelegateViewBinding( - { inflater, parent -> ItemEmptyStateBinding.inflate(inflater, parent, false) } + { inflater, parent -> ItemEmptyStateBinding.inflate(inflater, parent, false) }, ) { - binding.buttonRetry.setOnClickListener { listener.onEmptyActionClick() } bind { - binding.icon.setImageResource(item.icon) + binding.icon.newImageRequest(item.icon)?.enqueueWith(coil) binding.textPrimary.setText(item.textPrimary) binding.textSecondary.setTextAndVisible(item.textSecondary) binding.buttonRetry.setTextAndVisible(item.actionStringRes) } + + onViewRecycled { + binding.icon.disposeImageRequest() + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt index 6b69445c5..9efaca7ec 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt @@ -4,9 +4,9 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter +import kotlin.jvm.internal.Intrinsics import org.koitharu.kotatsu.core.ui.DateTimeAgo import org.koitharu.kotatsu.list.ui.model.* -import kotlin.jvm.internal.Intrinsics class MangaListAdapter( coil: ImageLoader, @@ -24,7 +24,7 @@ class MangaListAdapter( .addDelegate(ITEM_TYPE_DATE, relatedDateItemAD()) .addDelegate(ITEM_TYPE_ERROR_STATE, errorStateListAD(listener)) .addDelegate(ITEM_TYPE_ERROR_FOOTER, errorFooterAD(listener)) - .addDelegate(ITEM_TYPE_EMPTY, emptyStateListAD(listener)) + .addDelegate(ITEM_TYPE_EMPTY, emptyStateListAD(coil, listener)) .addDelegate(ITEM_TYPE_HEADER, listHeaderAD()) .addDelegate(ITEM_TYPE_FILTER, currentFilterAD(listener)) .addDelegate(ITEM_TYPE_HEADER_FILTER, listHeaderWithFilterAD(listener)) diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt index 35afb49d4..2d46c03b2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/adapter/MultiSearchAdapter.kt @@ -5,12 +5,12 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter +import kotlin.jvm.internal.Intrinsics import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.list.ui.MangaSelectionDecoration import org.koitharu.kotatsu.list.ui.adapter.* import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.search.ui.multi.MultiSearchListModel -import kotlin.jvm.internal.Intrinsics class MultiSearchAdapter( lifecycleOwner: LifecycleOwner, @@ -33,11 +33,11 @@ class MultiSearchAdapter( selectionDecoration = selectionDecoration, listener = listener, itemClickListener = itemClickListener, - ) + ), ) .addDelegate(loadingStateAD()) .addDelegate(loadingFooterAD()) - .addDelegate(emptyStateListAD(listener)) + .addDelegate(emptyStateListAD(coil, listener)) .addDelegate(errorStateListAD(listener)) } diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedAdapter.kt index bebf7baae..cc6acfe93 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedAdapter.kt @@ -4,11 +4,11 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import coil.ImageLoader import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter +import kotlin.jvm.internal.Intrinsics import org.koitharu.kotatsu.core.ui.DateTimeAgo import org.koitharu.kotatsu.list.ui.adapter.* import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.tracker.ui.model.FeedItem -import kotlin.jvm.internal.Intrinsics class FeedAdapter( coil: ImageLoader, @@ -23,7 +23,7 @@ class FeedAdapter( .addDelegate(ITEM_TYPE_LOADING_STATE, loadingStateAD()) .addDelegate(ITEM_TYPE_ERROR_FOOTER, errorFooterAD(listener)) .addDelegate(ITEM_TYPE_ERROR_STATE, errorStateListAD(listener)) - .addDelegate(ITEM_TYPE_EMPTY, emptyStateListAD(listener)) + .addDelegate(ITEM_TYPE_EMPTY, emptyStateListAD(coil, listener)) .addDelegate(ITEM_TYPE_HEADER, listHeaderAD()) .addDelegate(ITEM_TYPE_DATE_HEADER, relatedDateItemAD()) } From 46f0d3ef743e9fbabaef6b12e6da1b79ad8af9da Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 14 Sep 2022 12:31:50 +0300 Subject: [PATCH 5/5] Fix onboarding dialog --- .../koitharu/kotatsu/main/ui/MainActivity.kt | 26 +++++++++++-------- .../settings/onboard/OnboardDialogFragment.kt | 2 +- app/src/main/res/layout/dialog_onboard.xml | 1 + 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index 2c16cdb97..c6af1c489 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -12,19 +12,24 @@ import androidx.appcompat.view.ActionMode import androidx.core.app.ActivityOptionsCompat import androidx.core.content.ContextCompat import androidx.core.graphics.Insets -import androidx.core.view.* +import androidx.core.view.ViewCompat +import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams +import androidx.core.view.updatePadding import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope import androidx.transition.TransitionManager +import com.google.android.material.R as materialR import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout.LayoutParams.* import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.navigation.NavigationView import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koin.android.ext.android.get import org.koin.androidx.viewmodel.ext.android.viewModel @@ -59,7 +64,6 @@ import org.koitharu.kotatsu.tracker.ui.FeedFragment import org.koitharu.kotatsu.tracker.work.TrackWorker import org.koitharu.kotatsu.utils.VoiceInputContract import org.koitharu.kotatsu.utils.ext.* -import com.google.android.material.R as materialR private const val TAG_PRIMARY = "primary" private const val TAG_SEARCH = "search" @@ -94,10 +98,10 @@ class MainActivity : it, binding.toolbar, R.string.open_menu, - R.string.close_menu + R.string.close_menu, ).apply { setHomeAsUpIndicator( - ContextCompat.getDrawable(this@MainActivity, materialR.drawable.abc_ic_ab_back_material) + ContextCompat.getDrawable(this@MainActivity, materialR.drawable.abc_ic_ab_back_material), ) setToolbarNavigationClickListener { binding.searchView.hideKeyboard() @@ -429,7 +433,12 @@ class MainActivity : } private fun onFirstStart() { - lifecycleScope.launchWhenResumed { + lifecycleScope.launch(Dispatchers.Main) { // not a default `Main.immediate` dispatcher + val settings = get() + when { + !settings.isSourcesSelected -> OnboardDialogFragment.showWelcome(supportFragmentManager) + settings.newSources.isNotEmpty() -> NewSourcesDialogFragment.show(supportFragmentManager) + } val isUpdateSupported = withContext(Dispatchers.Default) { TrackWorker.setup(applicationContext) SuggestionsWorker.setup(applicationContext) @@ -438,11 +447,6 @@ class MainActivity : if (isUpdateSupported) { AppUpdateChecker(this@MainActivity).checkIfNeeded() } - val settings = get() - when { - !settings.isSourcesSelected -> OnboardDialogFragment.showWelcome(supportFragmentManager) - settings.newSources.isNotEmpty() -> NewSourcesDialogFragment.show(supportFragmentManager) - } } } @@ -469,7 +473,7 @@ class MainActivity : val drawer = drawer ?: return val isLocked = actionModeDelegate.isActionModeStarted || isSearchOpened drawer.setDrawerLockMode( - if (isLocked) DrawerLayout.LOCK_MODE_LOCKED_CLOSED else DrawerLayout.LOCK_MODE_UNLOCKED + if (isLocked) DrawerLayout.LOCK_MODE_LOCKED_CLOSED else DrawerLayout.LOCK_MODE_UNLOCKED, ) drawerToggle?.isDrawerIndicatorEnabled = !isLocked } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt index 4f695b154..d9c27a762 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt @@ -41,7 +41,7 @@ class OnboardDialogFragment : override fun onBuildDialog(builder: MaterialAlertDialogBuilder) { builder .setPositiveButton(R.string.done, this) - .setCancelable(true) + .setCancelable(false) if (isWelcome) { builder.setTitle(R.string.welcome) } else { diff --git a/app/src/main/res/layout/dialog_onboard.xml b/app/src/main/res/layout/dialog_onboard.xml index e9757cc61..553e7e186 100644 --- a/app/src/main/res/layout/dialog_onboard.xml +++ b/app/src/main/res/layout/dialog_onboard.xml @@ -23,6 +23,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" + android:scrollIndicators="top|bottom" android:scrollbars="vertical" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/item_source_locale" />