Loading app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +25 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package foundation.e.apps import android.app.AlertDialog import android.content.Context import android.graphics.Bitmap import android.os.Build import android.util.Base64 Loading Loading @@ -177,6 +179,29 @@ class MainActivityViewModel @Inject constructor( return false } /** * Handle various cases of unsupported apps here. * Returns true if the [fusedApp] is not supported by App Lounge. * * Pass [alertDialogContext] as null to prevent an alert dialog from being shown to the user. * In that case, this method simply works as a validation. * * Issue: https://gitlab.e.foundation/e/os/backlog/-/issues/178 */ fun checkUnsupportedApplication(fusedApp: FusedApp, alertDialogContext: Context? = null): Boolean { if (!fusedApp.isFree && fusedApp.price.isBlank()) { alertDialogContext?.let { context -> AlertDialog.Builder(context).apply { setTitle(R.string.unsupported_app_title) setMessage(context.getString(R.string.unsupported_app_unreleased, fusedApp.name)) setPositiveButton(android.R.string.ok, null) }.show() } return true } return false } fun getApplication(app: FusedApp, imageView: ImageView?) { if (shouldShowPaidAppsSnackBar(app)) { return Loading app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +15 −2 Original line number Diff line number Diff line Loading @@ -406,8 +406,16 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { appSize: MaterialTextView ) { installButton.apply { text = if (fusedApp.isFree) getString(R.string.install) else fusedApp.price text = when { mainActivityViewModel.checkUnsupportedApplication(fusedApp) -> getString(R.string.not_available) fusedApp.isFree -> getString(R.string.install) else -> fusedApp.price } setOnClickListener { if (mainActivityViewModel.checkUnsupportedApplication(fusedApp, activity)) { return@setOnClickListener } applicationIcon?.let { if (fusedApp.isFree) { mainActivityViewModel.getApplication(fusedApp, it) Loading Loading @@ -439,11 +447,16 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { appSize: MaterialTextView ) { installButton.apply { text = getString(R.string.update) text = if (mainActivityViewModel.checkUnsupportedApplication(fusedApp)) getString(R.string.not_available) else getString(R.string.update) setTextColor(Color.WHITE) backgroundTintList = ContextCompat.getColorStateList(view.context, R.color.colorAccent) setOnClickListener { if (mainActivityViewModel.checkUnsupportedApplication(fusedApp, activity)) { return@setOnClickListener } applicationIcon?.let { mainActivityViewModel.getApplication(fusedApp, it) } Loading app/src/main/java/foundation/e/apps/applicationlist/ApplicationListFragment.kt +1 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,7 @@ class ApplicationListFragment : Fragment(R.layout.fragment_application_list), Fu this, privacyInfoViewModel, appInfoFetchViewModel, mainActivityViewModel, it, pkgManagerModule, pwaManagerModule, Loading app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt +26 −12 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import com.facebook.shimmer.ShimmerDrawable import com.google.android.material.button.MaterialButton import com.google.android.material.snackbar.Snackbar import foundation.e.apps.AppInfoFetchViewModel import foundation.e.apps.MainActivityViewModel import foundation.e.apps.PrivacyInfoViewModel import foundation.e.apps.R import foundation.e.apps.api.cleanapk.CleanAPKInterface Loading @@ -57,6 +58,7 @@ class ApplicationListRVAdapter( private val fusedAPIInterface: FusedAPIInterface, private val privacyInfoViewModel: PrivacyInfoViewModel, private val appInfoFetchViewModel: AppInfoFetchViewModel, private val mainActivityViewModel: MainActivityViewModel, private val currentDestinationId: Int, private val pkgManagerModule: PkgManagerModule, private val pwaManagerModule: PWAManagerModule, Loading Loading @@ -328,11 +330,17 @@ class ApplicationListRVAdapter( materialButton: MaterialButton, applicationListItemBinding: ApplicationListItemBinding ) { if (searchApp.isFree) { when { mainActivityViewModel.checkUnsupportedApplication(searchApp) -> { materialButton.isEnabled = false materialButton.text = materialButton.context.getString(R.string.not_available) } searchApp.isFree -> { materialButton.isEnabled = true materialButton.text = materialButton.context.getString(R.string.install) applicationListItemBinding.progressBarInstall.visibility = View.GONE } else { } else -> { materialButton.isEnabled = false materialButton.text = "" applicationListItemBinding.progressBarInstall.visibility = View.VISIBLE Loading @@ -344,6 +352,7 @@ class ApplicationListRVAdapter( } } } } private fun ApplicationListItemBinding.handleUpdatable( view: View, Loading @@ -351,11 +360,16 @@ class ApplicationListRVAdapter( ) { installButton.apply { isEnabled = true text = context.getString(R.string.update) text = if (mainActivityViewModel.checkUnsupportedApplication(searchApp)) context.getString(R.string.not_available) else context.getString(R.string.update) setTextColor(Color.WHITE) backgroundTintList = ContextCompat.getColorStateList(view.context, R.color.colorAccent) strokeColor = ContextCompat.getColorStateList(view.context, R.color.colorAccent) setOnClickListener { if (mainActivityViewModel.checkUnsupportedApplication(searchApp, context)) { return@setOnClickListener } installApplication(searchApp, appIcon) } } Loading app/src/main/java/foundation/e/apps/home/model/HomeChildRVAdapter.kt +20 −11 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.facebook.shimmer.ShimmerDrawable import com.google.android.material.button.MaterialButton import com.google.android.material.snackbar.Snackbar import foundation.e.apps.AppInfoFetchViewModel import foundation.e.apps.MainActivityViewModel import foundation.e.apps.R import foundation.e.apps.api.cleanapk.CleanAPKInterface import foundation.e.apps.api.fused.FusedAPIInterface Loading @@ -51,6 +52,7 @@ class HomeChildRVAdapter( private val pkgManagerModule: PkgManagerModule, private val pwaManagerModule: PWAManagerModule, private val appInfoFetchViewModel: AppInfoFetchViewModel, private val mainActivityViewModel: MainActivityViewModel, private val user: User, private val lifecycleOwner: LifecycleOwner, private val paidAppHandler: ((FusedApp) -> Unit)? = null Loading Loading @@ -269,11 +271,17 @@ class HomeChildRVAdapter( materialButton: MaterialButton, homeChildListItemBinding: HomeChildListItemBinding ) { if (homeApp.isFree) { when { mainActivityViewModel.checkUnsupportedApplication(homeApp) -> { materialButton.isEnabled = false materialButton.text = materialButton.context.getString(R.string.not_available) } homeApp.isFree -> { materialButton.isEnabled = true materialButton.text = materialButton.context.getString(R.string.install) homeChildListItemBinding.progressBarInstall.visibility = View.GONE } else { } else -> { materialButton.isEnabled = false materialButton.text = "" homeChildListItemBinding.progressBarInstall.visibility = View.VISIBLE Loading @@ -285,6 +293,7 @@ class HomeChildRVAdapter( } } } } fun setData(newList: List<FusedApp>) { this.submitList(newList.map { it.copy() }) Loading Loading
app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +25 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package foundation.e.apps import android.app.AlertDialog import android.content.Context import android.graphics.Bitmap import android.os.Build import android.util.Base64 Loading Loading @@ -177,6 +179,29 @@ class MainActivityViewModel @Inject constructor( return false } /** * Handle various cases of unsupported apps here. * Returns true if the [fusedApp] is not supported by App Lounge. * * Pass [alertDialogContext] as null to prevent an alert dialog from being shown to the user. * In that case, this method simply works as a validation. * * Issue: https://gitlab.e.foundation/e/os/backlog/-/issues/178 */ fun checkUnsupportedApplication(fusedApp: FusedApp, alertDialogContext: Context? = null): Boolean { if (!fusedApp.isFree && fusedApp.price.isBlank()) { alertDialogContext?.let { context -> AlertDialog.Builder(context).apply { setTitle(R.string.unsupported_app_title) setMessage(context.getString(R.string.unsupported_app_unreleased, fusedApp.name)) setPositiveButton(android.R.string.ok, null) }.show() } return true } return false } fun getApplication(app: FusedApp, imageView: ImageView?) { if (shouldShowPaidAppsSnackBar(app)) { return Loading
app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +15 −2 Original line number Diff line number Diff line Loading @@ -406,8 +406,16 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { appSize: MaterialTextView ) { installButton.apply { text = if (fusedApp.isFree) getString(R.string.install) else fusedApp.price text = when { mainActivityViewModel.checkUnsupportedApplication(fusedApp) -> getString(R.string.not_available) fusedApp.isFree -> getString(R.string.install) else -> fusedApp.price } setOnClickListener { if (mainActivityViewModel.checkUnsupportedApplication(fusedApp, activity)) { return@setOnClickListener } applicationIcon?.let { if (fusedApp.isFree) { mainActivityViewModel.getApplication(fusedApp, it) Loading Loading @@ -439,11 +447,16 @@ class ApplicationFragment : Fragment(R.layout.fragment_application) { appSize: MaterialTextView ) { installButton.apply { text = getString(R.string.update) text = if (mainActivityViewModel.checkUnsupportedApplication(fusedApp)) getString(R.string.not_available) else getString(R.string.update) setTextColor(Color.WHITE) backgroundTintList = ContextCompat.getColorStateList(view.context, R.color.colorAccent) setOnClickListener { if (mainActivityViewModel.checkUnsupportedApplication(fusedApp, activity)) { return@setOnClickListener } applicationIcon?.let { mainActivityViewModel.getApplication(fusedApp, it) } Loading
app/src/main/java/foundation/e/apps/applicationlist/ApplicationListFragment.kt +1 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,7 @@ class ApplicationListFragment : Fragment(R.layout.fragment_application_list), Fu this, privacyInfoViewModel, appInfoFetchViewModel, mainActivityViewModel, it, pkgManagerModule, pwaManagerModule, Loading
app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt +26 −12 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import com.facebook.shimmer.ShimmerDrawable import com.google.android.material.button.MaterialButton import com.google.android.material.snackbar.Snackbar import foundation.e.apps.AppInfoFetchViewModel import foundation.e.apps.MainActivityViewModel import foundation.e.apps.PrivacyInfoViewModel import foundation.e.apps.R import foundation.e.apps.api.cleanapk.CleanAPKInterface Loading @@ -57,6 +58,7 @@ class ApplicationListRVAdapter( private val fusedAPIInterface: FusedAPIInterface, private val privacyInfoViewModel: PrivacyInfoViewModel, private val appInfoFetchViewModel: AppInfoFetchViewModel, private val mainActivityViewModel: MainActivityViewModel, private val currentDestinationId: Int, private val pkgManagerModule: PkgManagerModule, private val pwaManagerModule: PWAManagerModule, Loading Loading @@ -328,11 +330,17 @@ class ApplicationListRVAdapter( materialButton: MaterialButton, applicationListItemBinding: ApplicationListItemBinding ) { if (searchApp.isFree) { when { mainActivityViewModel.checkUnsupportedApplication(searchApp) -> { materialButton.isEnabled = false materialButton.text = materialButton.context.getString(R.string.not_available) } searchApp.isFree -> { materialButton.isEnabled = true materialButton.text = materialButton.context.getString(R.string.install) applicationListItemBinding.progressBarInstall.visibility = View.GONE } else { } else -> { materialButton.isEnabled = false materialButton.text = "" applicationListItemBinding.progressBarInstall.visibility = View.VISIBLE Loading @@ -344,6 +352,7 @@ class ApplicationListRVAdapter( } } } } private fun ApplicationListItemBinding.handleUpdatable( view: View, Loading @@ -351,11 +360,16 @@ class ApplicationListRVAdapter( ) { installButton.apply { isEnabled = true text = context.getString(R.string.update) text = if (mainActivityViewModel.checkUnsupportedApplication(searchApp)) context.getString(R.string.not_available) else context.getString(R.string.update) setTextColor(Color.WHITE) backgroundTintList = ContextCompat.getColorStateList(view.context, R.color.colorAccent) strokeColor = ContextCompat.getColorStateList(view.context, R.color.colorAccent) setOnClickListener { if (mainActivityViewModel.checkUnsupportedApplication(searchApp, context)) { return@setOnClickListener } installApplication(searchApp, appIcon) } } Loading
app/src/main/java/foundation/e/apps/home/model/HomeChildRVAdapter.kt +20 −11 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.facebook.shimmer.ShimmerDrawable import com.google.android.material.button.MaterialButton import com.google.android.material.snackbar.Snackbar import foundation.e.apps.AppInfoFetchViewModel import foundation.e.apps.MainActivityViewModel import foundation.e.apps.R import foundation.e.apps.api.cleanapk.CleanAPKInterface import foundation.e.apps.api.fused.FusedAPIInterface Loading @@ -51,6 +52,7 @@ class HomeChildRVAdapter( private val pkgManagerModule: PkgManagerModule, private val pwaManagerModule: PWAManagerModule, private val appInfoFetchViewModel: AppInfoFetchViewModel, private val mainActivityViewModel: MainActivityViewModel, private val user: User, private val lifecycleOwner: LifecycleOwner, private val paidAppHandler: ((FusedApp) -> Unit)? = null Loading Loading @@ -269,11 +271,17 @@ class HomeChildRVAdapter( materialButton: MaterialButton, homeChildListItemBinding: HomeChildListItemBinding ) { if (homeApp.isFree) { when { mainActivityViewModel.checkUnsupportedApplication(homeApp) -> { materialButton.isEnabled = false materialButton.text = materialButton.context.getString(R.string.not_available) } homeApp.isFree -> { materialButton.isEnabled = true materialButton.text = materialButton.context.getString(R.string.install) homeChildListItemBinding.progressBarInstall.visibility = View.GONE } else { } else -> { materialButton.isEnabled = false materialButton.text = "" homeChildListItemBinding.progressBarInstall.visibility = View.VISIBLE Loading @@ -285,6 +293,7 @@ class HomeChildRVAdapter( } } } } fun setData(newList: List<FusedApp>) { this.submitList(newList.map { it.copy() }) Loading