package ani.dantotsu.settings import android.app.NotificationManager import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.app.NotificationCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import ani.dantotsu.R import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.databinding.FragmentExtensionsBinding import ani.dantotsu.settings.paging.MangaExtensionAdapter import ani.dantotsu.settings.paging.MangaExtensionsViewModel import ani.dantotsu.settings.paging.MangaExtensionsViewModelFactory import ani.dantotsu.settings.paging.OnMangaInstallClickListener import ani.dantotsu.snackString import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import rx.android.schedulers.AndroidSchedulers import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaExtensionsFragment : Fragment(), SearchQueryHandler, OnMangaInstallClickListener { private var _binding: FragmentExtensionsBinding? = null private val binding get() = _binding!! private val viewModel: MangaExtensionsViewModel by viewModels { MangaExtensionsViewModelFactory(mangaExtensionManager) } private val adapter by lazy { MangaExtensionAdapter(this) } private val mangaExtensionManager: MangaExtensionManager = Injekt.get() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentExtensionsBinding.inflate(inflater, container, false) binding.allExtensionsRecyclerView.isNestedScrollingEnabled = false binding.allExtensionsRecyclerView.adapter = adapter binding.allExtensionsRecyclerView.layoutManager = LinearLayoutManager(context) (binding.allExtensionsRecyclerView.layoutManager as LinearLayoutManager).isItemPrefetchEnabled = true lifecycleScope.launch { viewModel.pagerFlow.collectLatest { pagingData -> adapter.submitData(pagingData) } } viewModel.invalidatePager() // Force a refresh of the pager return binding.root } override fun updateContentBasedOnQuery(query: String?) { viewModel.setSearchQuery(query ?: "") } override fun notifyDataChanged() { viewModel.invalidatePager() } override fun onInstallClick(pkg: MangaExtension.Available) { if (isAdded) { // Check if the fragment is currently added to its activity val context = requireContext() val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager // Start the installation process mangaExtensionManager.installExtension(pkg) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { installStep -> val builder = NotificationCompat.Builder( context, Notifications.CHANNEL_DOWNLOADER_PROGRESS ) .setSmallIcon(R.drawable.ic_round_sync_24) .setContentTitle(getString(R.string.installing_extension)) .setContentText(getString(R.string.install_step, installStep)) .setPriority(NotificationCompat.PRIORITY_LOW) notificationManager.notify(1, builder.build()) }, { error -> Injekt.get().logException(error) val builder = NotificationCompat.Builder( context, Notifications.CHANNEL_DOWNLOADER_ERROR ) .setSmallIcon(R.drawable.ic_round_info_24) .setContentTitle(getString(R.string.installation_failed, error.message)) .setContentText(getString(R.string.error_message, error.message)) .setPriority(NotificationCompat.PRIORITY_HIGH) notificationManager.notify(1, builder.build()) snackString(getString(R.string.installation_failed, error.message)) }, { val builder = NotificationCompat.Builder( context, Notifications.CHANNEL_DOWNLOADER_PROGRESS ) .setSmallIcon(R.drawable.ic_download_24) .setContentTitle(getString(R.string.installation_complete)) .setContentText(getString(R.string.extension_has_been_installed)) .setPriority(NotificationCompat.PRIORITY_LOW) notificationManager.notify(1, builder.build()) viewModel.invalidatePager() snackString(getString(R.string.extension_installed)) } ) } } override fun onDestroyView() { super.onDestroyView();_binding = null } }