diff --git a/app/src/main/java/foundation/e/apps/ui/MainActivity.kt b/app/src/main/java/foundation/e/apps/ui/MainActivity.kt index f66d6cfdcd0b1dd416d525629721862892d7844d..23057a1cf5222f734d2ba26fcd66f1fc0bb96b6c 100644 --- a/app/src/main/java/foundation/e/apps/ui/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/ui/MainActivity.kt @@ -258,6 +258,10 @@ class MainActivity : AppCompatActivity() { launch { observeSuccessfulLogin() } + + launch { + observeAppNotFoundAutoRedirect() + } } } } @@ -594,6 +598,23 @@ class MainActivity : AppCompatActivity() { } } + private suspend fun observeAppNotFoundAutoRedirect() { + EventBus.events.filterIsInstance() + .collectLatest { + try { + findNavController(R.id.fragment).navigateUp() + } catch (e: IllegalArgumentException) { + Timber.w(e, "Failed to navigate up from app not found") + + try { + findNavController(R.id.fragment).popBackStack() + } catch (e2: IllegalArgumentException) { + Timber.w(e2, "Failed to pop back stack from app not found") + } + } + } + } + fun showSnackbarMessage(message: String) { Snackbar.make(binding.root, message, Snackbar.LENGTH_LONG).show() } diff --git a/app/src/main/java/foundation/e/apps/ui/application/ApplicationViewModel.kt b/app/src/main/java/foundation/e/apps/ui/application/ApplicationViewModel.kt index 07090c95cd1dabfbda8cc9fb3e64bfe9cffd2562..2b0eef0ce2e8323e0a2b21b6c0bfef3c5da4abb6 100644 --- a/app/src/main/java/foundation/e/apps/ui/application/ApplicationViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/application/ApplicationViewModel.kt @@ -44,6 +44,7 @@ import foundation.e.apps.ui.parentFragment.LoadingViewModel import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update @@ -155,6 +156,7 @@ class ApplicationViewModel @Inject constructor( } } catch (e: InternalException.AppNotFound) { _errorMessageLiveData.postValue(R.string.app_not_found) + scheduleAutoRedirect() } catch (e: Exception) { _errorMessageLiveData.postValue(R.string.unknown_error) } @@ -194,6 +196,7 @@ class ApplicationViewModel @Inject constructor( val app = apps.firstOrNull() if (app == null || app.package_name.isBlank()) { _errorMessageLiveData.postValue(R.string.app_not_found) + scheduleAutoRedirect() return@launch } @@ -233,6 +236,17 @@ class ApplicationViewModel @Inject constructor( fun isKnownNsfwApp(app: Application): Boolean { return app.package_name in fDroidAntiFeatureRepository.fDroidNsfwApps } + + private fun scheduleAutoRedirect() { + viewModelScope.launch { + delay(REDIRECT_DELAY_MS) + EventBus.invokeEvent(AppEvent.AppNotFoundAutoRedirect()) + } + } + + companion object { + private const val REDIRECT_DELAY_MS = 2000L + } } sealed class ShareButtonVisibilityState { diff --git a/app/src/main/java/foundation/e/apps/utils/eventBus/AppEvent.kt b/app/src/main/java/foundation/e/apps/utils/eventBus/AppEvent.kt index 701312475ef8e974fd7d1c1398d1fc7ec9bcf92d..406053e61ee54f57ff9fcb07e76e6b7f318c559b 100644 --- a/app/src/main/java/foundation/e/apps/utils/eventBus/AppEvent.kt +++ b/app/src/main/java/foundation/e/apps/utils/eventBus/AppEvent.kt @@ -41,4 +41,5 @@ sealed class AppEvent(val data: Any) { val onClose: CompletableDeferred? = null ) : AppEvent(type) class SuccessfulLogin(user: User): AppEvent(user) + class AppNotFoundAutoRedirect : AppEvent(Unit) }