diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/utils/ExternalLinkOpenerTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/utils/ExternalLinkOpenerTest.kt index f14f23c2b..ccb11a824 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/utils/ExternalLinkOpenerTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/utils/ExternalLinkOpenerTest.kt @@ -51,7 +51,7 @@ internal class ExternalLinkOpenerTest { every { intent.data } returns Uri.parse(url.toString()) val lambdaSlot = slot<() -> Unit>() val externalLinkOpener = ExternalLinkOpener(activity, sharedPreferenceUtil, alertDialogShower) - externalLinkOpener.openExternalUrl(intent) + externalLinkOpener.openExternalUrl(intent, R.string.no_browser_application_installed) verify { alertDialogShower.show( KiwixDialog.ExternalLinkPopup, @@ -72,7 +72,7 @@ internal class ExternalLinkOpenerTest { every { intent.data } returns uri val lambdaSlot = slot<() -> Unit>() val externalLinkOpener = ExternalLinkOpener(activity, sharedPreferenceUtil, alertDialogShower) - externalLinkOpener.openExternalUrl(intent) + externalLinkOpener.openExternalUrl(intent, R.string.no_browser_application_installed) verify { alertDialogShower.show( KiwixDialog.ExternalLinkPopup, @@ -92,7 +92,7 @@ internal class ExternalLinkOpenerTest { every { intent.data } returns Uri.parse("https://github.com/") val lambdaSlot = slot<() -> Unit>() val externalLinkOpener = ExternalLinkOpener(activity, sharedPreferenceUtil, alertDialogShower) - externalLinkOpener.openExternalUrl(intent) + externalLinkOpener.openExternalUrl(intent, R.string.no_browser_application_installed) verify { alertDialogShower.show( KiwixDialog.ExternalLinkPopup, @@ -112,7 +112,7 @@ internal class ExternalLinkOpenerTest { every { intent.data } returns Uri.parse("https://github.com/") val lambdaSlot = slot<() -> Unit>() val externalLinkOpener = ExternalLinkOpener(activity, sharedPreferenceUtil, alertDialogShower) - externalLinkOpener.openExternalUrl(intent) + externalLinkOpener.openExternalUrl(intent, R.string.no_browser_application_installed) verify { alertDialogShower.show( KiwixDialog.ExternalLinkPopup, @@ -133,7 +133,7 @@ internal class ExternalLinkOpenerTest { every { intent.resolveActivity(activity.packageManager) } returns mockk() every { sharedPreferenceUtil.prefExternalLinkPopup } returns false val externalLinkOpener = ExternalLinkOpener(activity, sharedPreferenceUtil, alertDialogShower) - externalLinkOpener.openExternalUrl(intent) + externalLinkOpener.openExternalUrl(intent, R.string.no_browser_application_installed) verify { activity.startActivity(intent) } } @@ -143,9 +143,19 @@ internal class ExternalLinkOpenerTest { val externalLinkOpener = ExternalLinkOpener(activity, sharedPreferenceUtil, alertDialogShower) mockkStatic(Toast::class) justRun { - Toast.makeText(activity, R.string.no_reader_application_installed, Toast.LENGTH_LONG).show() + Toast.makeText(activity, R.string.no_browser_application_installed, Toast.LENGTH_LONG).show() } - externalLinkOpener.openExternalUrl(intent) - verify { activity.toast(R.string.no_reader_application_installed) } + externalLinkOpener.openExternalUrl(intent, R.string.no_browser_application_installed) + verify { activity.toast(R.string.no_browser_application_installed) } + justRun { + Toast.makeText(activity, R.string.no_pdf_application_installed, Toast.LENGTH_LONG).show() + } + externalLinkOpener.openExternalUrl(intent, R.string.no_pdf_application_installed) + verify { activity.toast(R.string.no_pdf_application_installed) } + justRun { + Toast.makeText(activity, R.string.no_epub_application_installed, Toast.LENGTH_LONG).show() + } + externalLinkOpener.openExternalUrl(intent, R.string.no_epub_application_installed) + verify { activity.toast(R.string.no_epub_application_installed) } } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.kt index 0919cb88e..fbe8644a3 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreMainActivity.kt @@ -221,7 +221,10 @@ abstract class CoreMainActivity : BaseActivity(), WebViewProvider { } private fun openSupportKiwixExternalLink() { - externalLinkOpener.openExternalUrl(KIWIX_SUPPORT_URL.toUri().browserIntent()) + externalLinkOpener.openExternalUrl( + KIWIX_SUPPORT_URL.toUri().browserIntent(), + R.string.no_browser_application_installed + ) } override fun onBackPressed() { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt index bb4d7774e..4ffca687c 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt @@ -1382,8 +1382,8 @@ abstract class CoreReaderFragment : sharedPreferenceUtil?.putPrefFullScreen(false) } - override fun openExternalUrl(intent: Intent) { - externalLinkOpener?.openExternalUrl(intent) + override fun openExternalUrl(intent: Intent, errorMessageId: Int) { + externalLinkOpener?.openExternalUrl(intent, errorMessageId) } protected fun openZimFile(file: File, isCustomApp: Boolean = false) { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.kt index a58235bb9..fcb845653 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.kt @@ -29,6 +29,7 @@ import android.webkit.WebView import android.webkit.WebViewClient import androidx.core.content.FileProvider import org.kiwix.kiwixmobile.core.CoreApp.Companion.instance +import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.reader.ZimFileReader import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil @@ -70,7 +71,7 @@ open class CoreWebViewClient( // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) - callback.openExternalUrl(intent) + callback.openExternalUrl(intent, R.string.no_browser_application_installed) return true } @@ -102,7 +103,11 @@ open class CoreWebViewClient( flags = Intent.FLAG_ACTIVITY_NO_HISTORY addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } - callback.openExternalUrl(intent) + val errorMessage = if (extension == "application/pdf") + R.string.no_pdf_application_installed + else + R.string.no_epub_application_installed + callback.openExternalUrl(intent, errorMessage) } } return true diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/WebViewCallback.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/WebViewCallback.kt index d15eca03a..2c10c9c88 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/WebViewCallback.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/WebViewCallback.kt @@ -24,7 +24,7 @@ interface WebViewCallback { fun webViewUrlLoading() fun webViewUrlFinishedLoading() fun webViewFailedLoading(failingUrl: String) - fun openExternalUrl(intent: Intent) + fun openExternalUrl(intent: Intent, errorMessageId: Int) fun webViewProgressChanged(progress: Int, webView: WebView) fun webViewTitleUpdated(title: String) fun webViewPageChanged(page: Int, maxPages: Int) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/ExternalLinkOpener.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/ExternalLinkOpener.kt index a0c2e42c2..486fa3dc9 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/ExternalLinkOpener.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/ExternalLinkOpener.kt @@ -21,7 +21,6 @@ package org.kiwix.kiwixmobile.core.utils import android.app.Activity import android.content.Intent import android.speech.tts.TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA -import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.extensions.toast import org.kiwix.kiwixmobile.core.utils.dialog.AlertDialogShower import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog @@ -33,7 +32,7 @@ class ExternalLinkOpener @Inject constructor( private val alertDialogShower: AlertDialogShower ) { - fun openExternalUrl(intent: Intent) { + fun openExternalUrl(intent: Intent, errorMessageId: Int) { if (intent.resolveActivity(activity.packageManager) != null) { // Show popup with warning that this url is external and could lead to additional costs // or may event not work when the user is offline. @@ -43,7 +42,7 @@ class ExternalLinkOpener @Inject constructor( openLink(intent) } } else { - activity.toast(R.string.no_reader_application_installed) + activity.toast(errorMessageId) } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/AlertDialogShower.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/AlertDialogShower.kt index 55fa7433e..0963fd912 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/AlertDialogShower.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/AlertDialogShower.kt @@ -73,11 +73,11 @@ class AlertDialogShower @Inject constructor(private val activity: Activity) : } uri?.let { /* - Check if it is valid url then show it to the user - otherwise don't show uri to the user as they are not directly openable in the external app. + Check if it is external browser url then show it to the user + otherwise don't show uri to the user as they are not directly openable in the external browser. We place this condition to improve the user experience see https://github.com/kiwix/kiwix-android/pull/3455 */ - if (!"$it".startsWith("content://")) { + if ("$it".startsWith("http://") || "$it".startsWith("https://")) { showUrlInDialog(this, it) } dialog.getView?.let { setView(it()) } diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index baf86fde3..63be22e39 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -63,6 +63,9 @@ The language of this page is not supported. The article may not be properly read. Could not find an installed application for this type of file Please install an email service provider or email us at %1s + Please install any web browser to open it e.g. chrome or firefox. + Please install any pdf reader application to open it. + Please install any epub reader application to open it. No Content Headers Found To access offline content we need access to your storage To download zim files we need write access to your storage