Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95845720 authored by Fahim Salam Chowdhury's avatar Fahim Salam Chowdhury 👽
Browse files

Merge branch '7046-block_blacklisted_app_update' into 'main'

7046 block blacklisted app update

See merge request !358
parents b892f7c8 9b10b038
Loading
Loading
Loading
Loading
Loading
+27 −24
Original line number Diff line number Diff line
@@ -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,7 +47,11 @@ class BlockedAppRepository @Inject constructor(
        return blockedAppInfoList?.notWorkingApps ?: listOf()
    }

    fun fetchUpdateOfAppWarningList() {
    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
@@ -56,18 +59,19 @@ class BlockedAppRepository @Inject constructor(
                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()}")
            Timber.d("Blocked list file exists: ${downloadedFile.exists()}")
            val blockedAppInfoJson = String(downloadedFile.inputStream().readBytes())
                Timber.i("Blocked list file contents: $blockedAppInfoJson")
            Timber.d("Blocked list file contents: $blockedAppInfoJson")
            gson.fromJson(blockedAppInfoJson, AppWarningInfo::class.java)
        } catch (exception: Exception) {
            Timber.e(exception.localizedMessage ?: "", exception)
@@ -75,4 +79,3 @@ class BlockedAppRepository @Inject constructor(
        }
    }
}
}
+14 −0
Original line number Diff line number Diff line
@@ -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(
+10 −6
Original line number Diff line number Diff line
@@ -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) {
+3 −1
Original line number Diff line number Diff line
@@ -292,8 +292,10 @@ class MainActivityViewModel @Inject constructor(
    }

    fun updateAppWarningList() {
        viewModelScope.launch {
            blockedAppRepository.fetchUpdateOfAppWarningList()
        }
    }

    fun getAppNameByPackageName(packageName: String): String {
        return pkgManagerModule.getAppNameFromPackageName(packageName)
+5 −1
Original line number Diff line number Diff line
@@ -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