diff --git a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt index c34b2fe54..e241c8d17 100644 --- a/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/bookmarks/ui/adapter/BookmarksGroupAdapter.kt @@ -5,6 +5,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView 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.base.ui.list.SectionedSelectionController import org.koitharu.kotatsu.bookmarks.domain.Bookmark @@ -12,7 +13,6 @@ import org.koitharu.kotatsu.bookmarks.ui.model.BookmarksGroup import org.koitharu.kotatsu.list.ui.adapter.* import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.Manga -import kotlin.jvm.internal.Intrinsics class BookmarksGroupAdapter( coil: ImageLoader, @@ -34,11 +34,11 @@ class BookmarksGroupAdapter( selectionController = selectionController, bookmarkClickListener = bookmarkClickListener, groupClickListener = groupClickListener, - ) + ), ) .addDelegate(loadingStateAD()) .addDelegate(loadingFooterAD()) - .addDelegate(emptyStateListAD(listener)) + .addDelegate(emptyStateListAD(coil, listener)) .addDelegate(errorStateListAD(listener)) } @@ -64,4 +64,4 @@ class BookmarksGroupAdapter( } } } -} \ No newline at end of file +} 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 832972db0..d966135ca 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 @@ -6,8 +6,6 @@ import androidx.appcompat.view.ActionMode import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.graphics.Insets import androidx.core.view.isVisible -import androidx.core.view.updateLayoutParams -import androidx.core.view.updatePadding import androidx.fragment.app.activityViewModels import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.snackbar.Snackbar @@ -202,18 +200,4 @@ class ChaptersFragment : private fun onLoadingStateChanged(isLoading: Boolean) { binding.progressBar.isVisible = isLoading } - - private fun findBottomSheetBehavior(): BottomSheetBehavior<*>? { - val v = view ?: return null - for (p in v.parents) { - val layoutParams = (p as? View)?.layoutParams - if (layoutParams is CoordinatorLayout.LayoutParams) { - val behavior = layoutParams.behavior - if (behavior is BottomSheetBehavior<*>) { - return behavior - } - } - } - return null - } } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersMenuProvider.kt index 1733523b7..c6c3fc64b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersMenuProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersMenuProvider.kt @@ -23,8 +23,8 @@ class ChaptersMenuProvider( } 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 6c4f025a0..05be621b2 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 @@ -155,7 +155,7 @@ class DownloadManager @AssistedInject constructor( } 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/favourites/ui/categories/adapter/CategoriesAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt index 0e5394f8f..f7ba8a348 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt @@ -4,12 +4,12 @@ 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.favourites.ui.categories.FavouriteCategoriesListListener import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD import org.koitharu.kotatsu.list.ui.adapter.loadingStateAD import org.koitharu.kotatsu.list.ui.model.ListModel -import kotlin.jvm.internal.Intrinsics class CategoriesAdapter( coil: ImageLoader, @@ -20,7 +20,7 @@ class CategoriesAdapter( init { delegatesManager.addDelegate(categoryAD(coil, lifecycleOwner, onItemClickListener)) - .addDelegate(emptyStateListAD(listListener)) + .addDelegate(emptyStateListAD(coil, listListener)) .addDelegate(loadingStateAD()) } @@ -56,4 +56,4 @@ class CategoriesAdapter( } } } -} \ No newline at end of file +} 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/library/ui/adapter/LibraryAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/library/ui/adapter/LibraryAdapter.kt index bdc2bcc7c..2e2e64faa 100644 --- a/app/src/main/java/org/koitharu/kotatsu/library/ui/adapter/LibraryAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/library/ui/adapter/LibraryAdapter.kt @@ -40,7 +40,7 @@ class LibraryAdapter( ) .addDelegate(loadingStateAD()) .addDelegate(loadingFooterAD()) - .addDelegate(emptyStateListAD(listener)) + .addDelegate(emptyStateListAD(coil, listener)) .addDelegate(errorStateListAD(listener)) } 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/EmptyStateListAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/EmptyStateListAD.kt index 811b22fd5..a1c2fc4c2 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: ListStateHolderListener, ) = 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) } -} \ No newline at end of file + + onViewRecycled { + binding.icon.disposeImageRequest() + } +} 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 1dfe213b0..ca86b5050 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 open class MangaListAdapter( coil: ImageLoader, @@ -24,7 +24,7 @@ open 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(listener)) .addDelegate(ITEM_TYPE_HEADER_2, listHeader2AD(listener)) } 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 24e0a5e4e..e5ac99e33 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 a18743022..36aa1ada0 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 d643475d7..c96d58817 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 @@ -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() diff --git a/app/src/main/java/org/koitharu/kotatsu/local/domain/importer/DirMangaImporter.kt b/app/src/main/java/org/koitharu/kotatsu/local/domain/importer/DirMangaImporter.kt index 3d9085cbb..956d19676 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/domain/importer/DirMangaImporter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/domain/importer/DirMangaImporter.kt @@ -43,7 +43,7 @@ class DirMangaImporter( ) it.sortChaptersByName() it.mergeWithExisting() - it.finalize() + it.finish() it.file } return localMangaRepository.getFromFile(dest) 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 507dafe25..8a32d5c62 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 @@ -27,6 +27,7 @@ import com.google.android.material.appbar.AppBarLayout.LayoutParams.* import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseActivity @@ -289,16 +290,16 @@ class MainActivity : } private fun onFirstStart() { - lifecycleScope.launchWhenResumed { + lifecycleScope.launch(Dispatchers.Main) { // not a default `Main.immediate` dispatcher + when { + !settings.isSourcesSelected -> OnboardDialogFragment.showWelcome(supportFragmentManager) + settings.newSources.isNotEmpty() -> NewSourcesDialogFragment.show(supportFragmentManager) + } withContext(Dispatchers.Default) { TrackWorker.setup(applicationContext) SuggestionsWorker.setup(applicationContext) } requestNotificationsPermission() - when { - !settings.isSourcesSelected -> OnboardDialogFragment.showWelcome(supportFragmentManager) - settings.newSources.isNotEmpty() -> NewSourcesDialogFragment.show(supportFragmentManager) - } } } 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 1ea3d2988..d483ed4db 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,13 +5,13 @@ 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.ItemSizeResolver 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, @@ -34,11 +34,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/settings/onboard/OnboardDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt index 74620b78f..1feb53737 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 @@ -42,7 +42,7 @@ class OnboardDialogFragment : override fun onBuildDialog(builder: MaterialAlertDialogBuilder): MaterialAlertDialogBuilder { super.onBuildDialog(builder) .setPositiveButton(R.string.done, this) - .setCancelable(true) + .setCancelable(false) if (isWelcome) { builder.setTitle(R.string.welcome) } else { 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 ac066b946..4ed934498 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_DATE_HEADER, relatedDateItemAD()) } 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 de32ff903..5f7f51577 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 java.net.UnknownHostException import okio.FileNotFoundException @@ -23,24 +24,31 @@ fun Throwable.getDisplayMessage(resources: Resources): String = when (this) { is FileNotFoundException -> resources.getString(R.string.file_not_found) is EmptyHistoryException -> resources.getString(R.string.history_is_empty) is SyncApiException, - is ContentUnavailableException, -> message + is ContentUnavailableException, + -> message is ParseException -> shortMessage is UnknownHostException, - is SocketTimeoutException, -> resources.getString(R.string.network_error) + is SocketTimeoutException, + -> resources.getString(R.string.network_error) is WrongPasswordException -> resources.getString(R.string.wrong_password) is NotFoundException -> resources.getString(R.string.not_found_404) else -> localizedMessage } ?: 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() } + +private val reportableExceptions = arraySetOf>( + ParseException::class.java, + RuntimeException::class.java, + IllegalStateException::class.java, + IllegalArgumentException::class.java, + ConcurrentModificationException::class.java, + UnsupportedOperationException::class.java, +) 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" />