From d70f30b86e16828adb5d75120399511b7e84123a Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Wed, 9 Apr 2025 16:55:46 +0530 Subject: [PATCH] Fixed: Notification not showing when downloading ZIM files in custom apps. * The issue occurred because the notification permission was not granted. On Android 13 and above, notifications won't appear without explicit permission. * To fix this, we now properly request the notification permission on devices running Android 13 and above. --- .../custom/download/CustomDownloadFragment.kt | 57 +++++++++++++++---- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadFragment.kt b/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadFragment.kt index d87e86d96..6c34aefac 100644 --- a/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadFragment.kt +++ b/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadFragment.kt @@ -18,11 +18,13 @@ package org.kiwix.kiwixmobile.custom.download +import android.Manifest.permission.POST_NOTIFICATIONS import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.app.ActivityCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import io.reactivex.disposables.CompositeDisposable @@ -36,6 +38,12 @@ import org.kiwix.kiwixmobile.core.extensions.setDistinctDisplayedChild import org.kiwix.kiwixmobile.core.extensions.viewModel import org.kiwix.kiwixmobile.core.main.CoreMainActivity import org.kiwix.kiwixmobile.core.R +import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.hasNotificationPermission +import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.requestNotificationPermission +import org.kiwix.kiwixmobile.core.navigateToAppSettings +import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil +import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower +import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog import org.kiwix.kiwixmobile.custom.customActivityComponent import org.kiwix.kiwixmobile.custom.databinding.FragmentCustomDownloadBinding import org.kiwix.kiwixmobile.custom.download.Action.ClickedDownload @@ -51,6 +59,14 @@ class CustomDownloadFragment : BaseFragment(), FragmentActivityExtensions { viewModel(viewModelFactory) } + @JvmField + @Inject + var alertDialogShower: DialogShower? = null + + @JvmField + @Inject + var sharedPreferenceUtil: SharedPreferenceUtil? = null + @Inject lateinit var viewModelFactory: ViewModelProvider.Factory private var fragmentCustomDownloadBinding: FragmentCustomDownloadBinding? = null @@ -81,20 +97,37 @@ class CustomDownloadFragment : BaseFragment(), FragmentActivityExtensions { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - fragmentCustomDownloadBinding?.customDownloadRequired - ?.cdDownloadButton - ?.setOnClickListener { - downloadViewModel.actions.offer( - ClickedDownload - ) + fragmentCustomDownloadBinding?.apply { + customDownloadRequired.cdDownloadButton.setOnClickListener { + if (requireActivity().hasNotificationPermission(sharedPreferenceUtil)) { + downloadViewModel.actions.offer(ClickedDownload) + } else { + requestNotificationPermission() + } } - fragmentCustomDownloadBinding?.customDownloadError - ?.cdRetryButton - ?.setOnClickListener { - downloadViewModel.actions.offer( - ClickedRetry - ) + customDownloadError.cdRetryButton.setOnClickListener { + if (requireActivity().hasNotificationPermission(sharedPreferenceUtil)) { + downloadViewModel.actions.offer(ClickedRetry) + } else { + requestNotificationPermission() + } } + } + } + + private fun requestNotificationPermission() { + if (!ActivityCompat.shouldShowRequestPermissionRationale( + requireActivity(), + POST_NOTIFICATIONS + ) + ) { + requireActivity().requestNotificationPermission() + } else { + alertDialogShower?.show( + KiwixDialog.NotificationPermissionDialog, + requireActivity()::navigateToAppSettings + ) + } } override fun onDestroy() {