From abbe8ecb75e2654687956ae2b93791cc80c541e1 Mon Sep 17 00:00:00 2001 From: Hasib Prince Date: Tue, 26 Jul 2022 21:48:29 +0600 Subject: [PATCH 1/2] Removed uncessary delays of install process --- .../e/apps/application/ApplicationFragment.kt | 2 +- .../model/ApplicationListRVAdapter.kt | 2 +- .../e/apps/home/model/HomeChildRVAdapter.kt | 3 ++- .../manager/database/DatabaseRepository.kt | 24 +++++++++++++++---- .../e/apps/manager/fused/FusedManagerImpl.kt | 8 +------ 5 files changed, 24 insertions(+), 15 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 d4c67552c..555a107c5 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt @@ -381,7 +381,7 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) { appSize ) Status.UNAVAILABLE -> handleUnavaiable(installButton, fusedApp, downloadPB, appSize) - Status.QUEUED, Status.AWAITING -> handleQueued( + Status.QUEUED, Status.AWAITING, Status.DOWNLOADED -> handleQueued( installButton, fusedApp, downloadPB, 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 da23c7326..737341f4e 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 @@ -219,7 +219,7 @@ class ApplicationListRVAdapter( Status.UNAVAILABLE -> { handleUnavailable(view, searchApp, holder) } - Status.QUEUED, Status.AWAITING, Status.DOWNLOADING -> { + Status.QUEUED, Status.AWAITING, Status.DOWNLOADING, Status.DOWNLOADED -> { handleDownloading(view, searchApp) } Status.INSTALLING, Status.UNINSTALLING -> { diff --git a/app/src/main/java/foundation/e/apps/home/model/HomeChildRVAdapter.kt b/app/src/main/java/foundation/e/apps/home/model/HomeChildRVAdapter.kt index d9b7aa5d7..7ee4075bd 100644 --- a/app/src/main/java/foundation/e/apps/home/model/HomeChildRVAdapter.kt +++ b/app/src/main/java/foundation/e/apps/home/model/HomeChildRVAdapter.kt @@ -44,6 +44,7 @@ import foundation.e.apps.home.HomeFragmentDirections import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.User +import timber.log.Timber class HomeChildRVAdapter( private var fusedAPIInterface: FusedAPIInterface?, @@ -110,7 +111,7 @@ class HomeChildRVAdapter( Status.UNAVAILABLE -> { handleUnavailable(homeApp, holder, view) } - Status.QUEUED, Status.AWAITING, Status.DOWNLOADING -> { + Status.QUEUED, Status.AWAITING, Status.DOWNLOADING, Status.DOWNLOADED -> { handleQueued(view, homeApp) } Status.INSTALLING, Status.UNINSTALLING -> { diff --git a/app/src/main/java/foundation/e/apps/manager/database/DatabaseRepository.kt b/app/src/main/java/foundation/e/apps/manager/database/DatabaseRepository.kt index 6344a6c75..5124623e6 100644 --- a/app/src/main/java/foundation/e/apps/manager/database/DatabaseRepository.kt +++ b/app/src/main/java/foundation/e/apps/manager/database/DatabaseRepository.kt @@ -6,6 +6,8 @@ import foundation.e.apps.OpenForTesting import foundation.e.apps.manager.database.fusedDownload.FusedDownload import foundation.e.apps.manager.database.fusedDownload.FusedDownloadDAO import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import javax.inject.Inject import javax.inject.Singleton @@ -15,12 +17,18 @@ class DatabaseRepository @Inject constructor( private val fusedDownloadDAO: FusedDownloadDAO ) { + private val mutex = Mutex() + suspend fun addDownload(fusedDownload: FusedDownload) { - return fusedDownloadDAO.addDownload(fusedDownload) + mutex.withLock { + return fusedDownloadDAO.addDownload(fusedDownload) + } } suspend fun getDownloadList(): List { - return fusedDownloadDAO.getDownloadList() + mutex.withLock { + return fusedDownloadDAO.getDownloadList() + } } fun getDownloadLiveList(): LiveData> { @@ -28,15 +36,21 @@ class DatabaseRepository @Inject constructor( } suspend fun updateDownload(fusedDownload: FusedDownload) { - fusedDownloadDAO.updateDownload(fusedDownload) + mutex.withLock { + fusedDownloadDAO.updateDownload(fusedDownload) + } } suspend fun deleteDownload(fusedDownload: FusedDownload) { - return fusedDownloadDAO.deleteDownload(fusedDownload) + mutex.withLock { + return fusedDownloadDAO.deleteDownload(fusedDownload) + } } suspend fun getDownloadById(id: String): FusedDownload? { - return fusedDownloadDAO.getDownloadById(id) + mutex.withLock { + return fusedDownloadDAO.getDownloadById(id) + } } fun getDownloadFlowById(id: String): Flow { diff --git a/app/src/main/java/foundation/e/apps/manager/fused/FusedManagerImpl.kt b/app/src/main/java/foundation/e/apps/manager/fused/FusedManagerImpl.kt index 64e62cc7d..462d91e5f 100644 --- a/app/src/main/java/foundation/e/apps/manager/fused/FusedManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/manager/fused/FusedManagerImpl.kt @@ -92,18 +92,15 @@ class FusedManagerImpl @Inject constructor( suspend fun updateDownloadStatus(fusedDownload: FusedDownload, status: Status) { if (status == Status.INSTALLED) { fusedDownload.status = status - databaseRepository.updateDownload(fusedDownload) +// databaseRepository.updateDownload(fusedDownload) DownloadManagerBR.downloadedList.clear() - delay(100) flushOldDownload(fusedDownload.packageName) databaseRepository.deleteDownload(fusedDownload) } else if (status == Status.INSTALLING) { fusedDownload.downloadIdMap.all { true } fusedDownload.status = status databaseRepository.updateDownload(fusedDownload) - delay(100) installApp(fusedDownload) - delay(100) } } @@ -141,7 +138,6 @@ class FusedManagerImpl @Inject constructor( Timber.d("Unsupported application type!") fusedDownload.status = Status.INSTALLATION_ISSUE databaseRepository.updateDownload(fusedDownload) - delay(100) } } } @@ -157,7 +153,6 @@ class FusedManagerImpl @Inject constructor( // Reset the status before deleting download updateDownloadStatus(fusedDownload, fusedDownload.orgStatus) - delay(100) databaseRepository.deleteDownload(fusedDownload) flushOldDownload(fusedDownload.packageName) @@ -199,7 +194,6 @@ class FusedManagerImpl @Inject constructor( fusedDownload.status = Status.DOWNLOADING databaseRepository.updateDownload(fusedDownload) DownloadProgressLD.setDownloadId(-1) - delay(100) fusedDownload.downloadURLList.forEach { count += 1 val packagePath: File = if (fusedDownload.files.isNotEmpty()) { -- GitLab From a085f7a2048f95b6c67e1e3d0bd7d9514f59d535 Mon Sep 17 00:00:00 2001 From: Hasib Prince Date: Wed, 27 Jul 2022 15:15:13 +0600 Subject: [PATCH 2/2] Handled app install error: INSTALL_PARSE_FAILED_NOT_APK --- .../e/apps/home/model/HomeChildRVAdapter.kt | 1 - .../manager/database/DatabaseRepository.kt | 24 ++++--------------- .../e/apps/manager/fused/FusedManagerImpl.kt | 2 -- .../e/apps/manager/pkg/InstallerService.kt | 11 ++++++++- .../e/apps/manager/pkg/PkgManagerModule.kt | 3 +++ 5 files changed, 18 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/home/model/HomeChildRVAdapter.kt b/app/src/main/java/foundation/e/apps/home/model/HomeChildRVAdapter.kt index 7ee4075bd..a7de334ff 100644 --- a/app/src/main/java/foundation/e/apps/home/model/HomeChildRVAdapter.kt +++ b/app/src/main/java/foundation/e/apps/home/model/HomeChildRVAdapter.kt @@ -44,7 +44,6 @@ import foundation.e.apps.home.HomeFragmentDirections import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.User -import timber.log.Timber class HomeChildRVAdapter( private var fusedAPIInterface: FusedAPIInterface?, diff --git a/app/src/main/java/foundation/e/apps/manager/database/DatabaseRepository.kt b/app/src/main/java/foundation/e/apps/manager/database/DatabaseRepository.kt index 5124623e6..6344a6c75 100644 --- a/app/src/main/java/foundation/e/apps/manager/database/DatabaseRepository.kt +++ b/app/src/main/java/foundation/e/apps/manager/database/DatabaseRepository.kt @@ -6,8 +6,6 @@ import foundation.e.apps.OpenForTesting import foundation.e.apps.manager.database.fusedDownload.FusedDownload import foundation.e.apps.manager.database.fusedDownload.FusedDownloadDAO import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock import javax.inject.Inject import javax.inject.Singleton @@ -17,18 +15,12 @@ class DatabaseRepository @Inject constructor( private val fusedDownloadDAO: FusedDownloadDAO ) { - private val mutex = Mutex() - suspend fun addDownload(fusedDownload: FusedDownload) { - mutex.withLock { - return fusedDownloadDAO.addDownload(fusedDownload) - } + return fusedDownloadDAO.addDownload(fusedDownload) } suspend fun getDownloadList(): List { - mutex.withLock { - return fusedDownloadDAO.getDownloadList() - } + return fusedDownloadDAO.getDownloadList() } fun getDownloadLiveList(): LiveData> { @@ -36,21 +28,15 @@ class DatabaseRepository @Inject constructor( } suspend fun updateDownload(fusedDownload: FusedDownload) { - mutex.withLock { - fusedDownloadDAO.updateDownload(fusedDownload) - } + fusedDownloadDAO.updateDownload(fusedDownload) } suspend fun deleteDownload(fusedDownload: FusedDownload) { - mutex.withLock { - return fusedDownloadDAO.deleteDownload(fusedDownload) - } + return fusedDownloadDAO.deleteDownload(fusedDownload) } suspend fun getDownloadById(id: String): FusedDownload? { - mutex.withLock { - return fusedDownloadDAO.getDownloadById(id) - } + return fusedDownloadDAO.getDownloadById(id) } fun getDownloadFlowById(id: String): Flow { diff --git a/app/src/main/java/foundation/e/apps/manager/fused/FusedManagerImpl.kt b/app/src/main/java/foundation/e/apps/manager/fused/FusedManagerImpl.kt index 462d91e5f..cc4780ba8 100644 --- a/app/src/main/java/foundation/e/apps/manager/fused/FusedManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/manager/fused/FusedManagerImpl.kt @@ -37,7 +37,6 @@ import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.Type import foundation.e.apps.utils.modules.PWAManagerModule import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.delay import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import timber.log.Timber @@ -92,7 +91,6 @@ class FusedManagerImpl @Inject constructor( suspend fun updateDownloadStatus(fusedDownload: FusedDownload, status: Status) { if (status == Status.INSTALLED) { fusedDownload.status = status -// databaseRepository.updateDownload(fusedDownload) DownloadManagerBR.downloadedList.clear() flushOldDownload(fusedDownload.packageName) databaseRepository.deleteDownload(fusedDownload) diff --git a/app/src/main/java/foundation/e/apps/manager/pkg/InstallerService.kt b/app/src/main/java/foundation/e/apps/manager/pkg/InstallerService.kt index 23a5e2f74..8871caf04 100644 --- a/app/src/main/java/foundation/e/apps/manager/pkg/InstallerService.kt +++ b/app/src/main/java/foundation/e/apps/manager/pkg/InstallerService.kt @@ -56,8 +56,17 @@ class InstallerService : Service() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -69) - val packageName = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME) + var packageName = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME) val extra = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + + /** + There is some error case where package name from PackageInstaller remains + empty (example: INSTALL_PARSE_FAILED_NOT_APK). + the packageName from PkgManagerModule will be used in this error case. + */ + val packageNamePackageManagerModule = intent.getStringExtra(PkgManagerModule.PACKAGE_NAME) + + packageName = packageName ?: packageNamePackageManagerModule postStatus(status, packageName, extra) stopSelf() return START_NOT_STICKY diff --git a/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt b/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt index c501109e0..a743d7496 100644 --- a/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt +++ b/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt @@ -48,6 +48,7 @@ class PkgManagerModule @Inject constructor( ) { companion object { const val ERROR_PACKAGE_INSTALL = "ERROR_PACKAGE_INSTALL" + const val PACKAGE_NAME = "packageName" private const val TAG = "PkgManagerModule" } private val packageManager = context.packageManager @@ -159,6 +160,8 @@ class PkgManagerModule @Inject constructor( } val callBackIntent = Intent(context, InstallerService::class.java) + callBackIntent.putExtra(PACKAGE_NAME, packageName) + val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE else PendingIntent.FLAG_UPDATE_CURRENT -- GitLab