From 030e8f46d2a5a137af60c8341fafcc4dfd0319d1 Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 13:24:21 +0530 Subject: [PATCH 01/14] issue_5720: create new enum class - FilterLevel --- .../e/apps/utils/enums/FilterLevel.kt | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt diff --git a/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt b/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt new file mode 100644 index 000000000..69d0cc83f --- /dev/null +++ b/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2019-2022 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.apps.utils.enums + +/** + * Use this class for various levels of filtering. + * + * Example 1: Searching for "Wild rift" should display the app, but show "N/A" for most cases. + * This is because in some countries, the app is downloadable and in some countries it is not, + * hence completely filtering it out of the search results is not the best thing to do. + * Instead if we detect that the app is not downloadable for a region, we use [UI] level + * filter; if it is downloadable for a different region, we then use [NONE] filter. + * + * Example 2: Some apps like "com.skype.m2" can not only be not downloaded, even its details + * page cannot be opened. Such apps cannot be shown on lists. Hence we use the [DATA] filter. + * + * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5720 + */ +enum class FilterLevel { + UI, // Show the app in lists, but show "N/A" in the install button. + DATA, // Filter the app out from lists and search results, don't show the app at all. + NONE, // No restrictions + UNKNOWN, // Not initialised yet +} + +fun FilterLevel.isUnFiltered(): Boolean = this == FilterLevel.NONE +fun FilterLevel.isUninitialized(): Boolean = this == FilterLevel.UNKNOWN \ No newline at end of file -- GitLab From ee8ac12d74b4131ca3524ecfefa1c8bce5007abb Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 14:15:11 +0530 Subject: [PATCH 02/14] issue_5720: define filterLevel in FusedApp --- .../java/foundation/e/apps/api/fused/data/FusedApp.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/api/fused/data/FusedApp.kt b/app/src/main/java/foundation/e/apps/api/fused/data/FusedApp.kt index 2193bfc6d..a8cf9cac2 100644 --- a/app/src/main/java/foundation/e/apps/api/fused/data/FusedApp.kt +++ b/app/src/main/java/foundation/e/apps/api/fused/data/FusedApp.kt @@ -19,6 +19,7 @@ package foundation.e.apps.api.fused.data import com.aurora.gplayapi.Constants.Restriction +import foundation.e.apps.utils.enums.FilterLevel import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.Type @@ -80,4 +81,14 @@ data class FusedApp( * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5131 [2] */ var isPlaceHolder: Boolean = false, + + /* + * Store the filter/restriction level. + * If it is not NONE, then the app cannot be downloaded. + * If it is FilterLevel.UI, then we should show "N/A" on install button. + * If it is FilterLevel.DATA, then this app should not be displayed. + * + * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5720 + */ + var filterLevel: FilterLevel = FilterLevel.UNKNOWN ) -- GitLab From dca71db6a16ea939daf7ccf4f3585da671fc7c3f Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 13:30:16 +0530 Subject: [PATCH 03/14] issue_5720: Fused api - create method getAppFilterLevel --- .../e/apps/api/fused/FusedAPIImpl.kt | 60 +++++++++++++++++++ .../e/apps/api/fused/FusedAPIRepository.kt | 5 ++ 2 files changed, 65 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt index ad0772ee6..8a333642e 100644 --- a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt +++ b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt @@ -53,6 +53,8 @@ import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.ResultStatus import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.Type +import foundation.e.apps.utils.enums.FilterLevel +import foundation.e.apps.utils.enums.isUnFiltered import foundation.e.apps.utils.modules.CommonUtilsModule.timeoutDurationInMillis import foundation.e.apps.utils.modules.PWAManagerModule import foundation.e.apps.utils.modules.PreferenceManagerModule @@ -631,6 +633,64 @@ class FusedAPIImpl @Inject constructor( return ResultSupreme.create(status, filteredFusedApps) } + /** + * Get different filter levels. + * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5720 + */ + suspend fun getAppFilterLevel(fusedApp: FusedApp, authData: AuthData?): FilterLevel { + if (fusedApp.package_name.isBlank()) { + return FilterLevel.UNKNOWN + } + if (authData == null) { + return if (fusedApp.origin == Origin.GPLAY) FilterLevel.UNKNOWN + else FilterLevel.NONE + } + if (fusedApp.restriction != Constants.Restriction.NOT_RESTRICTED) { + /* + * Check if app details can be shown. If not then remove the app from lists. + */ + try { + gPlayAPIRepository.getAppDetails(fusedApp.package_name, authData!!) + } catch (e: Exception) { + return FilterLevel.DATA + } + + /* + * If the app can be shown, check if the app is downloadable. + * If not then change "Install" button to "N/A" + */ + try { + gPlayAPIRepository.getDownloadInfo( + fusedApp.package_name, + fusedApp.latest_version_code, + fusedApp.offer_type, + authData + ) + } catch (e: Exception) { + return FilterLevel.UI + } + } else { + if (!fusedApp.isFree && fusedApp.price.isBlank()) { + return FilterLevel.UI + } + } + return FilterLevel.NONE + } + + /* + * Similar to above method but uses Aurora OSS data class "App". + */ + suspend fun getAppFilterLevel(app: App, authData: AuthData): FilterLevel { + return getAppFilterLevel(app.transformToFusedApp(), authData) + } + + /* + * Handy method to run on an instance of FusedApp to update its filter level. + */ + private suspend fun FusedApp.updateFilterLevel(authData: AuthData?) { + this.filterLevel = getAppFilterLevel(this, authData) + } + suspend fun getApplicationDetails( id: String, packageName: String, diff --git a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt index 0cf5b73b7..4a638b89a 100644 --- a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt +++ b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt @@ -30,6 +30,7 @@ import foundation.e.apps.api.fused.data.FusedApp import foundation.e.apps.api.fused.data.FusedCategory import foundation.e.apps.api.fused.data.FusedHome import foundation.e.apps.manager.database.fusedDownload.FusedDownload +import foundation.e.apps.utils.enums.FilterLevel import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.ResultStatus import foundation.e.apps.utils.enums.Status @@ -73,6 +74,10 @@ class FusedAPIRepository @Inject constructor( return fusedAPIImpl.filterRestrictedGPlayApps(authData, appList) } + suspend fun getAppFilterLevel(fusedApp: FusedApp, authData: AuthData?): FilterLevel { + return fusedAPIImpl.getAppFilterLevel(fusedApp, authData) + } + suspend fun getApplicationDetails( id: String, packageName: String, -- GitLab From 405275d21e9c7a9ebd22692d72c5cc7bbddbdd93 Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 14:15:53 +0530 Subject: [PATCH 04/14] issue_5720: use getFilterLevel / updateFilterLevel in FusedAPIImpl.kt --- .../e/apps/api/fused/FusedAPIImpl.kt | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt index 8a333642e..d96b40c68 100644 --- a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt +++ b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt @@ -412,6 +412,7 @@ class FusedAPIImpl @Inject constructor( response?.apps?.forEach { it.updateStatus() it.updateType() + it.updateFilterLevel(null) list.add(it) } }) @@ -425,6 +426,7 @@ class FusedAPIImpl @Inject constructor( response?.apps?.forEach { it.updateStatus() it.updateType() + it.updateFilterLevel(null) list.add(it) } }) @@ -496,6 +498,7 @@ class FusedAPIImpl @Inject constructor( cleanAPKRepository.getAppOrPWADetailsByID(result.apps[0]._id).body()?.app ?: FusedApp() } + fusedApp.updateFilterLevel(null) }) return Pair(fusedApp, status) } @@ -547,7 +550,9 @@ class FusedAPIImpl @Inject constructor( by = "package_name" ).body()?.run { if (apps.isNotEmpty() && numberOfResults == 1) { - fusedAppList.add(apps[0]) + fusedAppList.add(apps[0].apply { + updateFilterLevel(null) + }) } } }) @@ -571,28 +576,24 @@ class FusedAPIImpl @Inject constructor( packageNameList: List, authData: AuthData, ): Pair, ResultStatus> { - var fusedAppList = listOf() + val fusedAppList = mutableListOf() /* * Old code moved from getApplicationDetails() */ val status = runCodeBlockWithTimeout({ - fusedAppList = gPlayAPIRepository.getAppDetails(packageNameList, authData).map { app -> + gPlayAPIRepository.getAppDetails(packageNameList, authData).forEach { app -> /* * Some apps are restricted to locations. Example "com.skype.m2". * For restricted apps, check if it is possible to get their specific app info. * * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5174 */ - if (app.restriction != Constants.Restriction.NOT_RESTRICTED) { - try { - gPlayAPIRepository.getAppDetails(app.packageName, authData) - ?.transformToFusedApp() ?: FusedApp() - } catch (e: Exception) { - FusedApp() - } - } else { - app.transformToFusedApp() + val filter = getAppFilterLevel(app, authData) + if (filter.isUnFiltered()) { + fusedAppList.add(app.transformToFusedApp().apply { + filterLevel = filter + }) } } }) @@ -618,14 +619,11 @@ class FusedAPIImpl @Inject constructor( val filteredFusedApps = mutableListOf() val status = runCodeBlockWithTimeout({ appList.forEach { - if (it.restriction != Constants.Restriction.NOT_RESTRICTED) { - try { - gPlayAPIRepository.getAppDetails(it.packageName, authData)?.let { app -> - filteredFusedApps.add(app.transformToFusedApp()) - } - } catch (e: Exception) {} - } else { - filteredFusedApps.add(it.transformToFusedApp()) + val filter = getAppFilterLevel(it, authData) + if (filter.isUnFiltered()) { + filteredFusedApps.add(it.transformToFusedApp().apply { + this.filterLevel = filter + }) } } }) @@ -710,6 +708,7 @@ class FusedAPIImpl @Inject constructor( response?.let { it.updateStatus() it.updateType() + it.updateFilterLevel(authData) } }) @@ -1050,7 +1049,7 @@ class FusedAPIImpl @Inject constructor( * Home screen-related internal functions */ - private fun generateCleanAPKHome(home: Home, prefType: String): List { + private suspend fun generateCleanAPKHome(home: Home, prefType: String): List { val list = mutableListOf() val headings = if (prefType == APP_TYPE_OPEN) { mapOf( @@ -1074,6 +1073,7 @@ class FusedAPIImpl @Inject constructor( home.top_updated_apps.forEach { it.updateStatus() it.updateType() + it.updateFilterLevel(null) } list.add(FusedHome(value, home.top_updated_apps)) } @@ -1083,6 +1083,7 @@ class FusedAPIImpl @Inject constructor( home.top_updated_games.forEach { it.updateStatus() it.updateType() + it.updateFilterLevel(null) } list.add(FusedHome(value, home.top_updated_games)) } @@ -1092,6 +1093,7 @@ class FusedAPIImpl @Inject constructor( home.popular_apps.forEach { it.updateStatus() it.updateType() + it.updateFilterLevel(null) } list.add(FusedHome(value, home.popular_apps)) } @@ -1101,6 +1103,7 @@ class FusedAPIImpl @Inject constructor( home.popular_games.forEach { it.updateStatus() it.updateType() + it.updateFilterLevel(null) } list.add(FusedHome(value, home.popular_games)) } @@ -1110,6 +1113,7 @@ class FusedAPIImpl @Inject constructor( home.popular_apps_in_last_24_hours.forEach { it.updateStatus() it.updateType() + it.updateFilterLevel(null) } list.add(FusedHome(value, home.popular_apps_in_last_24_hours)) } @@ -1119,6 +1123,7 @@ class FusedAPIImpl @Inject constructor( home.popular_games_in_last_24_hours.forEach { it.updateStatus() it.updateType() + it.updateFilterLevel(null) } list.add(FusedHome(value, home.popular_games_in_last_24_hours)) } @@ -1128,6 +1133,7 @@ class FusedAPIImpl @Inject constructor( home.discover.forEach { it.updateStatus() it.updateType() + it.updateFilterLevel(null) } list.add(FusedHome(value, home.discover)) } @@ -1151,7 +1157,9 @@ class FusedAPIImpl @Inject constructor( val chart = it.value.keys.iterator().next() val type = it.value.values.iterator().next() val result = gPlayAPIRepository.getTopApps(type, chart, authData).map { app -> - app.transformToFusedApp() + app.transformToFusedApp().apply { + updateFilterLevel(authData) + } } list.add(FusedHome(it.key, result)) } -- GitLab From 9c12dff87bfa34c11528eb08c7db7cf3155ffda4 Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 16:00:35 +0530 Subject: [PATCH 05/14] issue_5720: create verifyUiFilter function in MainActivityViewModel. Use this to fetch the filter level and then do some other work. --- .../e/apps/MainActivityViewModel.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt index 7f814995e..713ef92b6 100644 --- a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt @@ -49,6 +49,7 @@ import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.Type import foundation.e.apps.utils.enums.User +import foundation.e.apps.utils.enums.isUninitialized import foundation.e.apps.utils.modules.CommonUtilsModule.timeoutDurationInMillis import foundation.e.apps.utils.modules.DataStoreModule import kotlinx.coroutines.Dispatchers @@ -379,6 +380,26 @@ class MainActivityViewModel @Inject constructor( return false } + /** + * Fetch the filter level of an app and perform some action. + * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5720 + */ + fun verifyUiFilter(fusedApp: FusedApp, f: () -> Unit) { + viewModelScope.launch { + val authData = authData.value + if (!fusedApp.filterLevel.isUninitialized()) { + f() + } else { + fusedAPIRepository.getAppFilterLevel(fusedApp, authData).run { + if (!isUninitialized()) { + fusedApp.filterLevel = this + f() + } + } + } + } + } + fun getApplication(app: FusedApp, imageView: ImageView?) { if (shouldShowPaidAppsSnackBar(app)) { return -- GitLab From 4013769780a872180ae9c49a4edc9c282aec6a9a Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 16:01:44 +0530 Subject: [PATCH 06/14] issue_5720: update checkUnsupportedApplication() to use FusedApp.filterLevel --- app/src/main/java/foundation/e/apps/MainActivityViewModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt index 713ef92b6..f30ca3a9c 100644 --- a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt @@ -50,6 +50,7 @@ import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.Type import foundation.e.apps.utils.enums.User import foundation.e.apps.utils.enums.isUninitialized +import foundation.e.apps.utils.enums.isUnFiltered import foundation.e.apps.utils.modules.CommonUtilsModule.timeoutDurationInMillis import foundation.e.apps.utils.modules.DataStoreModule import kotlinx.coroutines.Dispatchers @@ -362,7 +363,7 @@ class MainActivityViewModel @Inject constructor( fusedApp: FusedApp, alertDialogContext: Context? = null ): Boolean { - if (!fusedApp.isFree && fusedApp.price.isBlank()) { + if (!fusedApp.filterLevel.isUnFiltered()) { alertDialogContext?.let { context -> AlertDialog.Builder(context).apply { setTitle(R.string.unsupported_app_title) -- GitLab From 9842d45ecd714146b9c7b38757c075070fdd4f94 Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 16:41:29 +0530 Subject: [PATCH 07/14] issue_5720: UpdatesManagerImpl - remove all apps which have any kind of filter level other than NONE --- .../foundation/e/apps/updates/manager/UpdatesManagerImpl.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt index 03e485126..8ed984890 100644 --- a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt @@ -25,6 +25,7 @@ import foundation.e.apps.manager.pkg.PkgManagerModule import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.ResultStatus import foundation.e.apps.utils.enums.Status +import foundation.e.apps.utils.enums.isUnFiltered import javax.inject.Inject class UpdatesManagerImpl @Inject constructor( @@ -51,7 +52,7 @@ class UpdatesManagerImpl @Inject constructor( ) cleanAPKResult.first.forEach { if (it.package_name in pkgList) pkgList.remove(it.package_name) - if (it.status == Status.UPDATABLE) updateList.add(it) + if (it.status == Status.UPDATABLE && it.filterLevel.isUnFiltered()) updateList.add(it) } cleanAPKResult.second.let { if (it != ResultStatus.OK) { @@ -66,7 +67,7 @@ class UpdatesManagerImpl @Inject constructor( Origin.GPLAY ) gPlayResult.first.forEach { - if (it.status == Status.UPDATABLE) updateList.add(it) + if (it.status == Status.UPDATABLE && it.filterLevel.isUnFiltered()) updateList.add(it) } gPlayResult.second.let { if (it != ResultStatus.OK) { -- GitLab From 8503a06a6458eef38d5be9c59f0de41d5e19ce38 Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 16:42:33 +0530 Subject: [PATCH 08/14] issue_5720: ApplicationListRVAdapter - wrap setupInstallButton() with verifyUiFilter() --- .../e/apps/applicationlist/model/ApplicationListRVAdapter.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt b/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt index c6ed486a5..5eccd7ad2 100644 --- a/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt +++ b/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt @@ -192,7 +192,9 @@ class ApplicationListRVAdapter( if (appInfoFetchViewModel.isAppInBlockedList(searchApp)) { setupShowMoreButton() } else { - setupInstallButton(searchApp, view, holder) + mainActivityViewModel.verifyUiFilter(searchApp) { + setupInstallButton(searchApp, view, holder) + } } showCalculatedPrivacyScoreData(searchApp, view) -- GitLab From 6440d659541a986a5f0adcec4373721f8e548813 Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 17:04:07 +0530 Subject: [PATCH 09/14] issue_5720: ApplicationFragment - wrap setting up install button inside verifyUiFilter() --- .../e/apps/application/ApplicationFragment.kt | 90 ++++++++++--------- 1 file changed, 48 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt b/app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt index 261c627c3..b24c7b25e 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt @@ -59,6 +59,7 @@ import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.ResultStatus import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.User +import foundation.e.apps.utils.enums.isUninitialized import foundation.e.apps.utils.modules.CommonUtilsModule.LIST_OF_NULL import foundation.e.apps.utils.modules.PWAManagerModule import foundation.e.apps.utils.parentFragment.TimeoutFragment @@ -360,48 +361,53 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) { val appSize = binding.downloadInclude.appSize val fusedApp = applicationViewModel.fusedApp.value?.first ?: FusedApp() - when (status) { - Status.INSTALLED -> handleInstalled( - installButton, - view, - fusedApp, - downloadPB, - appSize - ) - Status.UPDATABLE -> handleUpdatable( - installButton, - view, - fusedApp, - downloadPB, - appSize - ) - Status.UNAVAILABLE -> handleUnavaiable(installButton, fusedApp, downloadPB, appSize) - Status.QUEUED, Status.AWAITING -> handleQueued( - installButton, - fusedApp, - downloadPB, - appSize - ) - Status.DOWNLOADING -> handleDownloading( - installButton, - fusedApp, - downloadPB, - appSize - ) - Status.INSTALLING, Status.UNINSTALLING -> handleInstallingUninstalling( - installButton, - downloadPB, - appSize - ) - Status.BLOCKED -> handleBlocked(installButton, view) - Status.INSTALLATION_ISSUE -> handleInstallingIssue( - installButton, - fusedApp, - downloadPB, - appSize - ) - else -> { - Timber.d("Unknown status: $status") + mainActivityViewModel.verifyUiFilter(fusedApp) { + if (fusedApp.filterLevel.isUninitialized()) { + return@verifyUiFilter + } + when (status) { + Status.INSTALLED -> handleInstalled( + installButton, + view, + fusedApp, + downloadPB, + appSize + ) + Status.UPDATABLE -> handleUpdatable( + installButton, + view, + fusedApp, + downloadPB, + appSize + ) + Status.UNAVAILABLE -> handleUnavaiable(installButton, fusedApp, downloadPB, appSize) + Status.QUEUED, Status.AWAITING -> handleQueued( + installButton, + fusedApp, + downloadPB, + appSize + ) + Status.DOWNLOADING -> handleDownloading( + installButton, + fusedApp, + downloadPB, + appSize + ) + Status.INSTALLING, Status.UNINSTALLING -> handleInstallingUninstalling( + installButton, + downloadPB, + appSize + ) + Status.BLOCKED -> handleBlocked(installButton, view) + Status.INSTALLATION_ISSUE -> handleInstallingIssue( + installButton, + fusedApp, + downloadPB, + appSize + ) + else -> { + Timber.d("Unknown status: $status") + } } } } -- GitLab From 7462633475af9d71fc3742bc08c4542d9b563213 Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 17:30:25 +0530 Subject: [PATCH 10/14] issue_5720: show loading progressbar in place of install button on lists by default --- .../e/apps/applicationlist/model/ApplicationListRVAdapter.kt | 2 ++ app/src/main/res/layout/application_list_item.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt b/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt index 5eccd7ad2..60a3634e7 100644 --- a/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt +++ b/app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt @@ -240,6 +240,7 @@ class ApplicationListRVAdapter( private fun ApplicationListItemBinding.setupShowMoreButton() { installButton.visibility = View.INVISIBLE showMore.visibility = View.VISIBLE + progressBarInstall.visibility = View.GONE } private fun ApplicationListItemBinding.handleInstallationIssue( @@ -393,6 +394,7 @@ class ApplicationListRVAdapter( mainActivityViewModel.checkUnsupportedApplication(searchApp) -> { materialButton.isEnabled = true materialButton.text = materialButton.context.getString(R.string.not_available) + applicationListItemBinding.progressBarInstall.visibility = View.GONE } searchApp.isFree -> { materialButton.isEnabled = true diff --git a/app/src/main/res/layout/application_list_item.xml b/app/src/main/res/layout/application_list_item.xml index 31312cde5..9c0be1e12 100644 --- a/app/src/main/res/layout/application_list_item.xml +++ b/app/src/main/res/layout/application_list_item.xml @@ -124,6 +124,7 @@ android:textSize="16sp" android:textColor="@color/install_button_background" android:textStyle="bold" + android:visibility="gone" app:layout_constraintLeft_toLeftOf="@id/installButton" app:layout_constraintRight_toRightOf="@id/installButton" app:layout_constraintTop_toBottomOf="@+id/app_title" @@ -147,7 +148,6 @@ Date: Fri, 1 Jul 2022 18:36:58 +0530 Subject: [PATCH 11/14] issue_5720: if app size is 0, filterLevel = UI --- .../main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt index d96b40c68..fc32cadeb 100644 --- a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt +++ b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt @@ -648,7 +648,7 @@ class FusedAPIImpl @Inject constructor( * Check if app details can be shown. If not then remove the app from lists. */ try { - gPlayAPIRepository.getAppDetails(fusedApp.package_name, authData!!) + gPlayAPIRepository.getAppDetails(fusedApp.package_name, authData) } catch (e: Exception) { return FilterLevel.DATA } @@ -671,6 +671,9 @@ class FusedAPIImpl @Inject constructor( if (!fusedApp.isFree && fusedApp.price.isBlank()) { return FilterLevel.UI } + if (fusedApp.originalSize == 0L) { + return FilterLevel.UI + } } return FilterLevel.NONE } -- GitLab From 532b503b1b4db1197f8bb440598f8f175f816fb7 Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Fri, 1 Jul 2022 18:39:10 +0530 Subject: [PATCH 12/14] issue_5720: verifyUiFilter - rename f to method --- .../main/java/foundation/e/apps/MainActivityViewModel.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt index f30ca3a9c..137faffbf 100644 --- a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt @@ -385,16 +385,16 @@ class MainActivityViewModel @Inject constructor( * Fetch the filter level of an app and perform some action. * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5720 */ - fun verifyUiFilter(fusedApp: FusedApp, f: () -> Unit) { + fun verifyUiFilter(fusedApp: FusedApp, method: () -> Unit) { viewModelScope.launch { val authData = authData.value if (!fusedApp.filterLevel.isUninitialized()) { - f() + method() } else { fusedAPIRepository.getAppFilterLevel(fusedApp, authData).run { if (!isUninitialized()) { fusedApp.filterLevel = this - f() + method() } } } -- GitLab From 9f10afafdbafe65ce97370e8edae4f0a8c6855d9 Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Mon, 4 Jul 2022 16:16:03 +0530 Subject: [PATCH 13/14] issue_5720: FilterLevel.isUninitialized() -> FilterLevel.isInitialized() --- .../main/java/foundation/e/apps/MainActivityViewModel.kt | 6 +++--- .../foundation/e/apps/application/ApplicationFragment.kt | 4 ++-- .../main/java/foundation/e/apps/utils/enums/FilterLevel.kt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt index 137faffbf..0156a2d7a 100644 --- a/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/MainActivityViewModel.kt @@ -49,7 +49,7 @@ import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.Type import foundation.e.apps.utils.enums.User -import foundation.e.apps.utils.enums.isUninitialized +import foundation.e.apps.utils.enums.isInitialized import foundation.e.apps.utils.enums.isUnFiltered import foundation.e.apps.utils.modules.CommonUtilsModule.timeoutDurationInMillis import foundation.e.apps.utils.modules.DataStoreModule @@ -388,11 +388,11 @@ class MainActivityViewModel @Inject constructor( fun verifyUiFilter(fusedApp: FusedApp, method: () -> Unit) { viewModelScope.launch { val authData = authData.value - if (!fusedApp.filterLevel.isUninitialized()) { + if (fusedApp.filterLevel.isInitialized()) { method() } else { fusedAPIRepository.getAppFilterLevel(fusedApp, authData).run { - if (!isUninitialized()) { + if (isInitialized()) { fusedApp.filterLevel = this method() } diff --git a/app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt b/app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt index b24c7b25e..c71d5918d 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt @@ -59,7 +59,7 @@ import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.ResultStatus import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.User -import foundation.e.apps.utils.enums.isUninitialized +import foundation.e.apps.utils.enums.isInitialized import foundation.e.apps.utils.modules.CommonUtilsModule.LIST_OF_NULL import foundation.e.apps.utils.modules.PWAManagerModule import foundation.e.apps.utils.parentFragment.TimeoutFragment @@ -362,7 +362,7 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) { val fusedApp = applicationViewModel.fusedApp.value?.first ?: FusedApp() mainActivityViewModel.verifyUiFilter(fusedApp) { - if (fusedApp.filterLevel.isUninitialized()) { + if (!fusedApp.filterLevel.isInitialized()) { return@verifyUiFilter } when (status) { diff --git a/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt b/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt index 69d0cc83f..1ad1738db 100644 --- a/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt +++ b/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt @@ -39,4 +39,4 @@ enum class FilterLevel { } fun FilterLevel.isUnFiltered(): Boolean = this == FilterLevel.NONE -fun FilterLevel.isUninitialized(): Boolean = this == FilterLevel.UNKNOWN \ No newline at end of file +fun FilterLevel.isInitialized(): Boolean = this != FilterLevel.UNKNOWN \ No newline at end of file -- GitLab From 7d95554191d7512b28bec838fa3dfdeadd663eb5 Mon Sep 17 00:00:00 2001 From: SayantanRC Date: Mon, 4 Jul 2022 16:17:12 +0530 Subject: [PATCH 14/14] issue_5720: minor documentation update --- app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt b/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt index 1ad1738db..7eec33730 100644 --- a/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt +++ b/app/src/main/java/foundation/e/apps/utils/enums/FilterLevel.kt @@ -26,6 +26,8 @@ package foundation.e.apps.utils.enums * Instead if we detect that the app is not downloadable for a region, we use [UI] level * filter; if it is downloadable for a different region, we then use [NONE] filter. * + * Similar app: de.tlllr.tlllrfan + * * Example 2: Some apps like "com.skype.m2" can not only be not downloaded, even its details * page cannot be opened. Such apps cannot be shown on lists. Hence we use the [DATA] filter. * -- GitLab