diff --git a/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt b/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt index 2814752a8de50a9400bd0d105f16eb94ecd29256..5962030bd06741123abd52c1737c0be9fc6dfcb4 100644 --- a/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt @@ -20,20 +20,19 @@ package foundation.e.apps.data.blockedApps import com.google.gson.Gson import foundation.e.apps.data.DownloadManager import foundation.e.apps.data.fusedDownload.FileManager -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.suspendCancellableCoroutine import timber.log.Timber import java.io.File import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton +import kotlin.coroutines.resume @Singleton class BlockedAppRepository @Inject constructor( private val downloadManager: DownloadManager, private val gson: Gson, @Named("cacheDir") private val cacheDir: String, - @Named("ioCoroutineScope") private val coroutineScope: CoroutineScope ) { companion object { @@ -48,31 +47,35 @@ class BlockedAppRepository @Inject constructor( return blockedAppInfoList?.notWorkingApps ?: listOf() } - fun fetchUpdateOfAppWarningList() { - downloadManager.downloadFileInCache( - APP_WARNING_LIST_FILE_URL, - fileName = WARNING_LIST_FILE_NAME - ) { success, _ -> - if (success) { - parseBlockedAppDataFromFile() + fun isBlockedApp(packageName: String) = + blockedAppInfoList?.notWorkingApps?.contains(packageName) ?: false + + suspend fun fetchUpdateOfAppWarningList(): Boolean = + suspendCancellableCoroutine { continuation -> + downloadManager.downloadFileInCache( + APP_WARNING_LIST_FILE_URL, + fileName = WARNING_LIST_FILE_NAME + ) { success, _ -> + if (success) { + parseBlockedAppDataFromFile() + } + + continuation.resume(true) } } - } private fun parseBlockedAppDataFromFile() { - coroutineScope.launch { - blockedAppInfoList = try { - val outputPath = "$cacheDir/warning_list/" - FileManager.moveFile("$cacheDir/", WARNING_LIST_FILE_NAME, outputPath) - val downloadedFile = File(outputPath + WARNING_LIST_FILE_NAME) - Timber.i("Blocked list file exists: ${downloadedFile.exists()}") - val blockedAppInfoJson = String(downloadedFile.inputStream().readBytes()) - Timber.i("Blocked list file contents: $blockedAppInfoJson") - gson.fromJson(blockedAppInfoJson, AppWarningInfo::class.java) - } catch (exception: Exception) { - Timber.e(exception.localizedMessage ?: "", exception) - AppWarningInfo(listOf()) - } + blockedAppInfoList = try { + val outputPath = "$cacheDir/warning_list/" + FileManager.moveFile("$cacheDir/", WARNING_LIST_FILE_NAME, outputPath) + val downloadedFile = File(outputPath + WARNING_LIST_FILE_NAME) + Timber.d("Blocked list file exists: ${downloadedFile.exists()}") + val blockedAppInfoJson = String(downloadedFile.inputStream().readBytes()) + Timber.d("Blocked list file contents: $blockedAppInfoJson") + gson.fromJson(blockedAppInfoJson, AppWarningInfo::class.java) + } catch (exception: Exception) { + Timber.e(exception.localizedMessage ?: "", exception) + AppWarningInfo(listOf()) } } } diff --git a/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt b/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt index 764cab30a2d8cd637ce93375e3ea0b8239c4b40c..7f5567447d32882142f77ae6785d2bfdcd61de06 100644 --- a/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt @@ -22,6 +22,7 @@ import android.content.Context import android.content.pm.ApplicationInfo import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.qualifiers.ApplicationContext +import foundation.e.apps.data.blockedApps.BlockedAppRepository import foundation.e.apps.data.cleanapk.ApkSignatureManager import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.ResultStatus @@ -46,6 +47,7 @@ class UpdatesManagerImpl @Inject constructor( private val faultyAppRepository: FaultyAppRepository, private val preferenceManagerModule: PreferenceManagerModule, private val fdroidRepository: FdroidRepository, + private val blockedAppRepository: BlockedAppRepository, ) { companion object { @@ -79,6 +81,14 @@ class UpdatesManagerImpl @Inject constructor( } } + openSourceInstalledApps.removeIf { + blockedAppRepository.isBlockedApp(it) + } + + gPlayInstalledApps.removeIf { + blockedAppRepository.isBlockedApp(it) + } + // Get open source app updates if (openSourceInstalledApps.isNotEmpty()) { status = getUpdatesFromApi({ @@ -129,6 +139,10 @@ class UpdatesManagerImpl @Inject constructor( openSourceInstalledApps.addAll(updatableFDroidApps) } + openSourceInstalledApps.removeIf { + blockedAppRepository.isBlockedApp(it) + } + if (openSourceInstalledApps.isNotEmpty()) { status = getUpdatesFromApi({ fusedAPIRepository.getApplicationDetails( diff --git a/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorker.kt b/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorker.kt index 0f647e8ac165f7b02511bb4f3230b7e6f9580962..7470db10a8332dfb706d418f7d3405a37fb44e03 100644 --- a/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorker.kt +++ b/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorker.kt @@ -16,11 +16,10 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedInject import foundation.e.apps.R import foundation.e.apps.data.ResultSupreme +import foundation.e.apps.data.blockedApps.BlockedAppRepository import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.enums.User -import foundation.e.apps.data.fused.FusedAPIRepository import foundation.e.apps.data.fused.data.FusedApp -import foundation.e.apps.data.fusedDownload.FusedManagerRepository import foundation.e.apps.data.login.LoginSourceRepository import foundation.e.apps.data.preference.DataStoreManager import foundation.e.apps.data.updates.UpdatesManagerRepository @@ -37,11 +36,10 @@ class UpdatesWorker @AssistedInject constructor( @Assisted private val context: Context, @Assisted private val params: WorkerParameters, private val updatesManagerRepository: UpdatesManagerRepository, - private val fusedAPIRepository: FusedAPIRepository, - private val fusedManagerRepository: FusedManagerRepository, private val dataStoreManager: DataStoreManager, private val loginSourceRepository: LoginSourceRepository, - private val appInstallProcessor: AppInstallProcessor + private val appInstallProcessor: AppInstallProcessor, + private val blockedAppRepository: BlockedAppRepository, ) : CoroutineWorker(context, params) { companion object { @@ -50,7 +48,6 @@ class UpdatesWorker @AssistedInject constructor( private const val DELAY_FOR_RETRY = 3000L } - val TAG = UpdatesWorker::class.simpleName private var shouldShowNotification = true private var automaticInstallEnabled = true private var onlyOnUnmeteredNetwork = false @@ -64,6 +61,7 @@ class UpdatesWorker @AssistedInject constructor( return Result.success() } + refreshBlockedAppList() checkForUpdates() Result.success() } catch (e: Throwable) { @@ -76,6 +74,12 @@ class UpdatesWorker @AssistedInject constructor( } } + private suspend fun refreshBlockedAppList() { + if (isAutoUpdate) { + blockedAppRepository.fetchUpdateOfAppWarningList() + } + } + private suspend fun checkManualUpdateRunning(): Boolean { val workInfos = withContext(Dispatchers.IO) { diff --git a/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt index 8c81f00036939469319782eb7140f61474491bbf..48e89be36c425c07aab3bd3cefa49ec9ff4be811 100644 --- a/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt @@ -292,7 +292,9 @@ class MainActivityViewModel @Inject constructor( } fun updateAppWarningList() { - blockedAppRepository.fetchUpdateOfAppWarningList() + viewModelScope.launch { + blockedAppRepository.fetchUpdateOfAppWarningList() + } } fun getAppNameByPackageName(packageName: String): String { diff --git a/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt index 648567559601b3c8a2f094c7c07745ad98c2d9a5..4182995881e602980da1c33dd66dcfd2f8fb00ae 100644 --- a/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt +++ b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt @@ -21,6 +21,7 @@ import android.content.Context import android.content.pm.ApplicationInfo import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.aurora.gplayapi.data.models.AuthData +import foundation.e.apps.data.blockedApps.BlockedAppRepository import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.ResultStatus @@ -72,6 +73,9 @@ class UpdateManagerImptTest { private lateinit var faultyAppRepository: FaultyAppRepository + @Mock + private lateinit var blockedAppRepository: BlockedAppRepository + @Mock private lateinit var fdroidRepository: FdroidRepository @@ -90,7 +94,7 @@ class UpdateManagerImptTest { preferenceModule = FakePreferenceModule(context) pkgManagerModule = FakePkgManagerModule(context, getGplayApps()) updatesManagerImpl = - UpdatesManagerImpl(context, pkgManagerModule, fusedAPIRepository, faultyAppRepository, preferenceModule, fdroidRepository) + UpdatesManagerImpl(context, pkgManagerModule, fusedAPIRepository, faultyAppRepository, preferenceModule, fdroidRepository, blockedAppRepository) } @Test