From 5bcda4a7d9442c2f407f96ea408fa5fda8cbab2c Mon Sep 17 00:00:00 2001 From: acclorite Date: Tue, 23 Jul 2024 15:38:12 +0300 Subject: [PATCH] Fix: intent.resolveActivity(...) returns null (instead used different function, which fixes "No browser found" for all sites if browser is actually present). --- app/src/main/AndroidManifest.xml | 1 + .../presentation/data/ArithmeticOperations.kt | 11 ------ .../book_story/presentation/data/Functions.kt | 34 +++++++++++++++++++ .../screens/about/data/AboutViewModel.kt | 9 +++-- .../license_info/data/LicenseInfoViewModel.kt | 9 +++-- .../screens/browse/data/BrowseViewModel.kt | 17 ++++++---- .../screens/help/data/HelpViewModel.kt | 16 ++++----- .../screens/reader/data/ReaderViewModel.kt | 22 ++++++++---- .../settings/data/SettingsViewModel.kt | 10 ++++-- .../screens/start/data/StartViewModel.kt | 25 +++++++++----- 10 files changed, 99 insertions(+), 55 deletions(-) delete mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/data/ArithmeticOperations.kt create mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/data/Functions.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 562a6ff7..a2e021fc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ + diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/data/ArithmeticOperations.kt b/app/src/main/java/ua/acclorite/book_story/presentation/data/ArithmeticOperations.kt deleted file mode 100644 index 71b426bd..00000000 --- a/app/src/main/java/ua/acclorite/book_story/presentation/data/ArithmeticOperations.kt +++ /dev/null @@ -1,11 +0,0 @@ -package ua.acclorite.book_story.presentation.data - -fun String.removeTrailingZero(): String { - if (!this.contains('.')) - return this - return this - .dropLastWhile { it == '0' } - .dropLastWhile { it == '.' } -} - -fun Double.removeDigits(digits: Int) = "%.${digits}f".format(this).replace(",", ".") \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/data/Functions.kt b/app/src/main/java/ua/acclorite/book_story/presentation/data/Functions.kt new file mode 100644 index 00000000..3f84ab28 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/data/Functions.kt @@ -0,0 +1,34 @@ +package ua.acclorite.book_story.presentation.data + +import android.content.Intent +import androidx.activity.ComponentActivity + +fun String.removeTrailingZero(): String { + if (!this.contains('.')) + return this + return this + .dropLastWhile { it == '0' } + .dropLastWhile { it == '.' } +} + +fun Double.removeDigits(digits: Int) = "%.${digits}f".format(this).replace(",", ".") + +fun Intent.launchActivity( + activity: ComponentActivity, + openInNewWindow: Boolean = true, + success: (() -> Unit)? = null, + error: () -> Unit +) { + if (openInNewWindow) { + this.flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + + try { + activity.baseContext.startActivity(this) + } catch (e: Exception) { + error() + return + } + + success?.invoke() +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt index 0a032ac1..f8aa69d2 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt @@ -2,6 +2,7 @@ package ua.acclorite.book_story.presentation.screens.about.data import android.content.Intent import android.net.Uri +import androidx.activity.ComponentActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -11,6 +12,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.use_case.CheckForUpdates +import ua.acclorite.book_story.presentation.data.launchActivity import javax.inject.Inject @HiltViewModel @@ -30,12 +32,9 @@ class AboutViewModel @Inject constructor( Uri.parse(event.page) ) - if (intent.resolveActivity(event.context.packageManager) != null) { - event.context.startActivity(intent) - return@launch + intent.launchActivity(event.context as ComponentActivity) { + event.noAppsFound() } - - event.noAppsFound() } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoViewModel.kt index 4d5f82fa..707e1b97 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/license_info/data/LicenseInfoViewModel.kt @@ -3,6 +3,7 @@ package ua.acclorite.book_story.presentation.screens.about.nested.license_info.d import android.content.Context import android.content.Intent import android.net.Uri +import androidx.activity.ComponentActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.mikepenz.aboutlibraries.Libs @@ -15,6 +16,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import ua.acclorite.book_story.domain.util.OnNavigate import ua.acclorite.book_story.presentation.data.Screen +import ua.acclorite.book_story.presentation.data.launchActivity import javax.inject.Inject @HiltViewModel @@ -32,12 +34,9 @@ class LicenseInfoViewModel @Inject constructor() : ViewModel() { Uri.parse(event.page) ) - if (intent.resolveActivity(event.context.packageManager) != null) { - event.context.startActivity(intent) - return@launch + intent.launchActivity(event.context as ComponentActivity) { + event.noAppsFound() } - - event.noAppsFound() } } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseViewModel.kt index 9b6adfe9..51dd1173 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/browse/data/BrowseViewModel.kt @@ -26,6 +26,7 @@ import ua.acclorite.book_story.domain.use_case.GetFilesFromDevice import ua.acclorite.book_story.domain.use_case.InsertBook import ua.acclorite.book_story.domain.util.Resource import ua.acclorite.book_story.presentation.data.Screen +import ua.acclorite.book_story.presentation.data.launchActivity import javax.inject.Inject @OptIn(ExperimentalPermissionsApi::class) @@ -84,9 +85,11 @@ class BrowseViewModel @Inject constructor( val uri = Uri.parse("package:${event.activity.packageName}") val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, uri) - if (intent.resolveActivity(event.activity.packageManager) != null) { - event.activity.startActivity(intent) - } else { + var failure = false + intent.launchActivity(event.activity) { + failure = true + } + if (failure) { return } } @@ -99,9 +102,11 @@ class BrowseViewModel @Inject constructor( uri ) - if (intent.resolveActivity(event.activity.packageManager) != null) { - event.activity.startActivity(intent) - } else { + var failure = false + intent.launchActivity(event.activity) { + failure = true + } + if (failure) { return } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpViewModel.kt index 46210b50..f2b95008 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/data/HelpViewModel.kt @@ -3,6 +3,7 @@ package ua.acclorite.book_story.presentation.screens.help.data import android.app.SearchManager import android.content.Intent import android.net.Uri +import androidx.activity.ComponentActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -11,6 +12,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import ua.acclorite.book_story.presentation.data.Screen +import ua.acclorite.book_story.presentation.data.launchActivity import javax.inject.Inject @HiltViewModel @@ -30,12 +32,9 @@ class HelpViewModel @Inject constructor( Uri.parse(event.page) ) - if (intent.resolveActivity(event.context.packageManager) != null) { - event.context.startActivity(intent) - return@launch + intent.launchActivity(event.context as ComponentActivity) { + event.noAppsFound() } - - event.noAppsFound() } } @@ -58,12 +57,9 @@ class HelpViewModel @Inject constructor( "${_state.value.textFieldValue.trim()} filetype:txt OR filetype:pdf" ) - if (intent.resolveActivity(event.context.packageManager) != null) { - event.context.startActivity(intent) - return@launch + intent.launchActivity(event.context as ComponentActivity) { + event.noAppsFound() } - - event.noAppsFound() } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt index 99645f84..72afd8f2 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt @@ -32,6 +32,7 @@ import ua.acclorite.book_story.domain.use_case.UpdateBooks import ua.acclorite.book_story.domain.util.OnNavigate import ua.acclorite.book_story.domain.util.UIText import ua.acclorite.book_story.presentation.data.Screen +import ua.acclorite.book_story.presentation.data.launchActivity import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent import ua.acclorite.book_story.presentation.screens.library.data.LibraryEvent import javax.inject.Inject @@ -336,13 +337,19 @@ class ReaderViewModel @Inject constructor( "translate: ${event.textToTranslate.trim()}" ) - if (translatorIntent.resolveActivity(event.context.packageManager) != null) { - event.context.startActivity(translatorIntent) + var translatorFailure = false + translatorIntent.launchActivity(event.context) { + translatorFailure = true + } + if (!translatorFailure) { return@launch } - if (browserIntent.resolveActivity(event.context.packageManager) != null) { - event.context.startActivity(browserIntent) + var browserFailure = false + browserIntent.launchActivity(event.context) { + browserFailure = true + } + if (!browserFailure) { return@launch } @@ -361,8 +368,11 @@ class ReaderViewModel @Inject constructor( ": ${event.textToDefine.trim()}" ) - if (browserIntent.resolveActivity(event.context.packageManager) != null) { - event.context.startActivity(browserIntent) + var failure = false + browserIntent.launchActivity(event.context) { + failure = true + } + if (!failure) { return@launch } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/data/SettingsViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/data/SettingsViewModel.kt index 58e802dd..d2367409 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/data/SettingsViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/data/SettingsViewModel.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.yield +import ua.acclorite.book_story.presentation.data.launchActivity import javax.inject.Inject @OptIn(ExperimentalPermissionsApi::class) @@ -48,9 +49,12 @@ class SettingsViewModel @Inject constructor( val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) intent.putExtra(Settings.EXTRA_APP_PACKAGE, event.activity.packageName) - if (intent.resolveActivity(event.activity.packageManager) != null) { - event.activity.startActivity(intent) - } else { + var failure = false + intent.launchActivity(event.activity) { + failure = true + } + + if (failure) { return } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartViewModel.kt index 4db29800..b0fa91fc 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/start/data/StartViewModel.kt @@ -22,6 +22,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.yield import ua.acclorite.book_story.domain.use_case.CheckForUpdates import ua.acclorite.book_story.presentation.data.Screen +import ua.acclorite.book_story.presentation.data.launchActivity import javax.inject.Inject @OptIn(ExperimentalPermissionsApi::class) @@ -137,9 +138,11 @@ class StartViewModel @Inject constructor( val uri = Uri.parse("package:${event.activity.packageName}") val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, uri) - if (intent.resolveActivity(event.activity.packageManager) != null) { - event.activity.startActivity(intent) - } else { + var failure = false + intent.launchActivity(event.activity) { + failure = true + } + if (failure) { return } } @@ -152,9 +155,11 @@ class StartViewModel @Inject constructor( uri ) - if (intent.resolveActivity(event.activity.packageManager) != null) { - event.activity.startActivity(intent) - } else { + var failure = false + intent.launchActivity(event.activity) { + failure = true + } + if (failure) { return } } @@ -203,9 +208,11 @@ class StartViewModel @Inject constructor( val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) intent.putExtra(Settings.EXTRA_APP_PACKAGE, event.activity.packageName) - if (intent.resolveActivity(event.activity.packageManager) != null) { - event.activity.startActivity(intent) - } else { + var failure = false + intent.launchActivity(event.activity) { + failure = true + } + if (failure) { return } }