diff --git a/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt b/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt index ea6df6cbf2b76c3cf855a1a6494cc74ad06c60ab..c4e7ea8b1c467eb746e751e56f385d3b4ca6fb84 100644 --- a/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt +++ b/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt @@ -23,16 +23,16 @@ import com.aurora.gplayapi.exceptions.InternalException import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R import foundation.e.apps.data.ResultSupreme -import foundation.e.apps.data.enums.ResultStatus -import foundation.e.apps.data.enums.Status -import foundation.e.apps.data.enums.Type import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.UpdatesDao import foundation.e.apps.data.application.data.Application +import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.enums.Source +import foundation.e.apps.data.enums.Status +import foundation.e.apps.data.enums.Type import foundation.e.apps.data.enums.User +import foundation.e.apps.data.install.AppManager import foundation.e.apps.data.install.models.AppInstall -import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.playstore.utils.GplayHttpRequestException import foundation.e.apps.data.preference.AppLoungeDataStore import foundation.e.apps.domain.ValidateAppAgeLimitUseCase @@ -67,6 +67,9 @@ class AppInstallProcessor @Inject constructor( @Inject lateinit var downloadManager: DownloadManagerUtils + @Inject + lateinit var appManager: AppManager + private var isItUpdateWork = false companion object { @@ -202,6 +205,10 @@ class AppInstallProcessor @Inject constructor( try { updateFusedDownloadWithAppDownloadLink(appInstall) } catch (e: InternalException.AppNotPurchased) { + if (appInstall.isFree) { + handleAppRestricted(appInstall) + return false + } appInstallComponents.appManagerWrapper.addFusedDownloadPurchaseNeeded(appInstall) EventBus.invokeEvent(AppEvent.AppPurchaseEvent(appInstall)) return false @@ -225,6 +232,12 @@ class AppInstallProcessor @Inject constructor( return true } + private suspend fun handleAppRestricted(appInstall: AppInstall) { + EventBus.invokeEvent(AppEvent.AppRestrictedOrUnavailable(appInstall)) + appManager.addDownload(appInstall) + appManager.updateUnavailable(appInstall) + } + private suspend fun handleUpdateDownloadError( appInstall: AppInstall, message: String, 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 d1453ea0500cfe2707db949a78bda86727896c56..c543c5865e5444498f65b88192fbacd38dcab564 100644 --- a/app/src/main/java/foundation/e/apps/ui/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/ui/MainActivity.kt @@ -56,6 +56,7 @@ import foundation.e.apps.data.login.exceptions.GPlayValidationException import foundation.e.apps.databinding.ActivityMainBinding import foundation.e.apps.install.updates.UpdatesNotifier import foundation.e.apps.ui.application.subFrags.ApplicationDialogFragment +import foundation.e.apps.ui.error.AppUnavailableDialogDirections import foundation.e.apps.ui.purchase.AppPurchaseFragmentDirections import foundation.e.apps.ui.settings.SettingsFragment import foundation.e.apps.ui.setup.signin.SignInViewModel @@ -227,6 +228,10 @@ class MainActivity : AppCompatActivity() { observeInvalidAuth() } + launch { + observeAppUnavailable() + } + launch { observeTooManyRequests() } @@ -508,6 +513,15 @@ class MainActivity : AppCompatActivity() { } } + private suspend fun observeAppUnavailable() { + EventBus.events.filterIsInstance() + .collectLatest { event -> + val appName = event.appInstall.name + val action = AppUnavailableDialogDirections.actionGlobalAppUnavailable(appName) + findNavController(R.id.fragment).navigate(action) + } + } + private fun validatedAuthObject(appEvent: AppEvent) { val data = appEvent.data as String if (data.isNotBlank()) { diff --git a/app/src/main/java/foundation/e/apps/ui/error/AppUnavailableDialog.kt b/app/src/main/java/foundation/e/apps/ui/error/AppUnavailableDialog.kt new file mode 100644 index 0000000000000000000000000000000000000000..ebe1ace6d73c259af44e1637bb63ad12eee453ae --- /dev/null +++ b/app/src/main/java/foundation/e/apps/ui/error/AppUnavailableDialog.kt @@ -0,0 +1,24 @@ +package foundation.e.apps.ui.error + +import android.app.Dialog +import android.os.Bundle +import androidx.fragment.app.DialogFragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import foundation.e.apps.R + +class AppUnavailableDialog : DialogFragment() { + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + return MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.app_unavailable_title) + .setMessage(R.string.app_unavailable_description) + .setCancelable(false) + .setPositiveButton( + android.R.string.ok, + { dialog, _ -> + dialog.dismiss() + } + ) + .create() + } +} 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 c7ca28c07217e8a21939b8647c01223f891b1788..d3097d45e25526935f9d3c00713197a9daf17085 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 @@ -34,6 +34,7 @@ sealed class AppEvent(val data: Any) { class ErrorMessageEvent(stringResourceId: Int) : AppEvent(stringResourceId) class ErrorMessageDialogEvent(stringResourceId: Int) : AppEvent(stringResourceId) class AppPurchaseEvent(appInstall: AppInstall) : AppEvent(appInstall) + class AppRestrictedOrUnavailable(val appInstall: AppInstall) : AppEvent(appInstall) class NoInternetEvent(isInternetAvailable: Boolean) : AppEvent(isInternetAvailable) class TooManyRequests : AppEvent(Unit) class AgeLimitRestrictionEvent( diff --git a/app/src/main/res/navigation/navigation_resource.xml b/app/src/main/res/navigation/navigation_resource.xml index 330939045d13972458066dea4f88074e383219af..7746663611fc07819e5f3b0725cead47dba774e4 100644 --- a/app/src/main/res/navigation/navigation_resource.xml +++ b/app/src/main/res/navigation/navigation_resource.xml @@ -252,4 +252,16 @@ android:id="@+id/action_global_appPurchaseFragment" app:destination="@id/appPurchaseFragment" /> + + + + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0b4a06dd6096ce064e15550329a2dda3ad157374..fa8ab59ab6ad52c407ef84755629cdb7e1cb230f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -196,4 +196,8 @@ Quelloffene Apps und PWA nicht verfügbar Beim Laden der allgemeinen Apps ist ein Fehler aufgetreten. Nur quelloffene Apps und PWA sind momentan verfügbar. Beim Laden von PWA und quelloffenen Apps ist ein Fehler aufgetreten. Nur allgemeine Apps sind momentan verfügbar. + + + App nicht verfügbar + Diese App kann nicht installiert werden. Dies liegt in der Regel an Inhaltsbeschränkungen basierend auf Ihrem Standort (Region) oder den Alterseinstellungen Ihres Kontos (einschließlich Altersüberprüfung und Alters-/Inhaltsfreigabe). diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 9e85cd5ca473f8eb31644a56be5dc21c39953dbc..97c5da93b8d7339128451cb871aa84b8bdb30f1a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -197,4 +197,8 @@ Hubo un error al cargar las aplicaciones PWA y de código abierto. Solo aplicaciones comunes están disponibles por ahora. App Lounge se cerrará durante la instalación de la actualización. Por favor, abstente de hacer nada en hasta que la actualización (descarga + instalación) haya terminado. Podrás usarla en un par de minutos como máximo. ¡Advertencia de actualización! + + + Aplicación no disponible + Esta aplicación no está disponible para su instalación. Esto se debe generalmente a restricciones de contenido basadas en tu ubicación (región) o en la configuración de edad de tu cuenta (incluida la verificación de edad y la clasificación por edad/contenido). diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 622fffdb4abbb4f1072e65e979758fe7782e545a..5f3f5dba12a76bcd72a9471c394da22a21ee2452 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -196,4 +196,8 @@ Une erreur est survenue lors du chargement des applications communes. Seules les applications Open Source et PWA sont disponibles pour l’instant. Une erreur est survenue lors du chargement des applications PWA et Open Source. Seules les applications communes sont disponibles pour l\'instant. App Lounge sera fermé pendant l\'installation de la mise à jour. Veuillez ne rien faire tant que la mise à jour (téléchargement + installation) n\'est pas terminée. Vous pourrez y accéder dans quelques minutes au maximum. + + + Application indisponible + Cette application n\'est pas disponible à l\'installation. Cela est généralement dû à des restrictions de contenu basées sur votre emplacement (région) ou les paramètres d\'âge de votre compte (y compris la vérification de l\'âge et la classification par âge/contenu). \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 04a0c11a73b78b9eca335580892a3f9c80996e29..5570e503eacc513880ac0323f651cf7526e15095 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -197,4 +197,8 @@ Si è verificato un errore durante il caricamento delle app PWA e Open Source. Solo le app comuni sono disponibili per ora. Sto raccogliendo la valutazione di tutte le app che hai installato. L\'applicazione potrebbe contenere nudità, bestemmie, insulti, violenza, estrema sessualità, politicamente scorretto o altri argomenti potenzialmente disturbanti. Questo è rilevante specialmente in ambienti tipo lavoro, scuola, ambienti religiosi e familiari. + + + App non disponibile + Questa app non è disponibile per l\'installazione. Ciò è generalmente dovuto a restrizioni di contenuto basate sulla tua posizione (regione) o sulle impostazioni di età del tuo account (incluse verifica dell\'età e classificazione per età/contenuto). diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 80132cd988d6cac807bfcb129d4b0b96aed9530f..b128a2badbe96d53a4656ee133b9c6baff34d1f1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -230,4 +230,7 @@ An error occurred while loading Common apps. Only Open Source apps and PWA are available for now. An error occurred while loading PWA and Open Source apps. Only Common apps are available for now. + + App Unavailable + This app is not available for installation. This is typically due to content restrictions based on your location (region) or your account\'s age settings (including age verification and age/content rating)