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.databinding.FragmentMangaExtensionsBinding 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 com.google.firebase.crashlytics.FirebaseCrashlytics 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: FragmentMangaExtensionsBinding? = 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 = FragmentMangaExtensionsBinding.inflate(inflater, container, false) binding.allMangaExtensionsRecyclerView.isNestedScrollingEnabled = false binding.allMangaExtensionsRecyclerView.adapter = adapter binding.allMangaExtensionsRecyclerView.layoutManager = LinearLayoutManager(context) (binding.allMangaExtensionsRecyclerView.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 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("Installing extension") .setContentText("Step: $installStep") .setPriority(NotificationCompat.PRIORITY_LOW) notificationManager.notify(1, builder.build()) }, { error -> FirebaseCrashlytics.getInstance().recordException(error) val builder = NotificationCompat.Builder( context, Notifications.CHANNEL_DOWNLOADER_ERROR ) .setSmallIcon(R.drawable.ic_round_info_24) .setContentTitle("Installation failed: ${error.message}") .setContentText("Error: ${error.message}") .setPriority(NotificationCompat.PRIORITY_HIGH) notificationManager.notify(1, builder.build()) snackString("Installation failed: ${error.message}") }, { val builder = NotificationCompat.Builder( context, Notifications.CHANNEL_DOWNLOADER_PROGRESS ) .setSmallIcon(R.drawable.ic_round_download_24) .setContentTitle("Installation complete") .setContentText("The extension has been successfully installed.") .setPriority(NotificationCompat.PRIORITY_LOW) notificationManager.notify(1, builder.build()) viewModel.invalidatePager() snackString("Extension installed") } ) } } override fun onDestroyView() { super.onDestroyView();_binding = null } }