diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt index 4b18d30be..9b10346fd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt @@ -191,6 +191,7 @@ class DownloadService : BaseService() { var isRunning: Boolean = false private set + @Deprecated("Use LocalMangaRepository.watchReadableDirs instead") const val ACTION_DOWNLOAD_COMPLETE = "${BuildConfig.APPLICATION_ID}.action.ACTION_DOWNLOAD_COMPLETE" private const val ACTION_DOWNLOAD_CANCEL = "${BuildConfig.APPLICATION_ID}.action.ACTION_DOWNLOAD_CANCEL" diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/TempFileFilter.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/TempFileFilter.kt index 8aef4fead..696a433b2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/TempFileFilter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/TempFileFilter.kt @@ -8,4 +8,4 @@ class TempFileFilter : FilenameFilter { override fun accept(dir: File, name: String): Boolean { return name.endsWith(".tmp", ignoreCase = true) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt index 22c88481c..1b79daf25 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt @@ -15,6 +15,8 @@ import javax.inject.Inject import javax.inject.Singleton import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.filterNot import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.local.data.CbzFilter import org.koitharu.kotatsu.local.data.LocalStorageManager @@ -219,6 +221,13 @@ class LocalMangaRepository @Inject constructor(private val storageManager: Local } } + suspend fun watchReadableDirs(): Flow { + val filter = TempFileFilter() + val dirs = storageManager.getReadableDirs() + return storageManager.observe(dirs) + .filterNot { filter.accept(it, it.name) } + } + private fun CoroutineScope.getFromFileAsync( file: File, context: CoroutineContext, diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt index 9038f2d9f..645a3624a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt @@ -1,9 +1,5 @@ package org.koitharu.kotatsu.local.ui -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter import android.os.Bundle import android.view.Menu import android.view.MenuItem @@ -16,7 +12,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.list.ListSelectionController -import org.koitharu.kotatsu.download.ui.service.DownloadService import org.koitharu.kotatsu.list.ui.MangaListFragment import org.koitharu.kotatsu.utils.ShareHelper import org.koitharu.kotatsu.utils.ext.addMenuProvider @@ -24,21 +19,6 @@ import org.koitharu.kotatsu.utils.ext.addMenuProvider class LocalListFragment : MangaListFragment() { override val viewModel by viewModels() - private val downloadReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) { - if (intent?.action == DownloadService.ACTION_DOWNLOAD_COMPLETE) { - viewModel.onRefresh() - } - } - } - - override fun onAttach(context: Context) { - super.onAttach(context) - context.registerReceiver( - downloadReceiver, - IntentFilter(DownloadService.ACTION_DOWNLOAD_COMPLETE), - ) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -46,11 +26,6 @@ class LocalListFragment : MangaListFragment() { viewModel.onMangaRemoved.observe(viewLifecycleOwner) { onItemRemoved() } } - override fun onDetach() { - requireContext().unregisterReceiver(downloadReceiver) - super.onDetach() - } - override fun onEmptyActionClick() { ImportDialogFragment.show(childFragmentManager) } diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt index ac7517de0..4d623fbfd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt @@ -6,6 +6,7 @@ import java.io.IOException import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -59,6 +60,7 @@ class LocalListViewModel @Inject constructor( init { onRefresh() cleanup() + watchDirectories() } override fun onRefresh() { @@ -108,4 +110,13 @@ class LocalListViewModel @Inject constructor( } } } + + private fun watchDirectories() { + viewModelScope.launch(Dispatchers.Default) { + repository.watchReadableDirs() + .collectLatest { + doRefresh() + } + } + } }