mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01:00 
			
		
		
		
	Timeout the installation of extensions after 10s
This commit is contained in:
		| @@ -65,7 +65,7 @@ internal class ExtensionInstaller(private val context: Context) { | ||||
|                 .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) | ||||
|  | ||||
|         val id = downloadManager.enqueue(request) | ||||
|         activeDownloads.put(pkgName, id) | ||||
|         activeDownloads[pkgName] = id | ||||
|  | ||||
|         downloadsRelay.filter { it.first == id } | ||||
|                 .map { it.second } | ||||
| @@ -73,6 +73,8 @@ internal class ExtensionInstaller(private val context: Context) { | ||||
|                 .mergeWith(pollStatus(id)) | ||||
|                 // Force an error if the download takes more than 3 minutes | ||||
|                 .mergeWith(Observable.timer(3, TimeUnit.MINUTES).map { InstallStep.Error }) | ||||
|                 // Force an error if the install process takes more than 10 seconds | ||||
|                 .flatMap { timeoutWhenInstalling(it) } | ||||
|                 // Stop when the application is installed or errors | ||||
|                 .takeUntil { it.isCompleted() } | ||||
|                 // Always notify on main thread | ||||
| @@ -112,6 +114,22 @@ internal class ExtensionInstaller(private val context: Context) { | ||||
|                 } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns an observable that timeouts the installation after a specified time when the apk has | ||||
|      * been downloaded. | ||||
|      * | ||||
|      * @param currentStep The current step of the installation process. | ||||
|      */ | ||||
|     private fun timeoutWhenInstalling(currentStep: InstallStep): Observable<InstallStep> { | ||||
|         return if (currentStep == InstallStep.Installing) { | ||||
|             Observable.timer(10, TimeUnit.SECONDS) | ||||
|                     .map { InstallStep.Error } | ||||
|                     .startWith(currentStep) | ||||
|         } else { | ||||
|             Observable.just(currentStep) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Starts an intent to install the extension at the given uri. | ||||
|      * | ||||
| @@ -221,12 +239,12 @@ internal class ExtensionInstaller(private val context: Context) { | ||||
|             // it fails. | ||||
|             try { | ||||
|                 installApk(uri) | ||||
|             } catch (e: ActivityNotFoundException) { | ||||
|                 val query = DownloadManager.Query() | ||||
|                 query.setFilterById(id) | ||||
|                 downloadManager.query(query).use { | ||||
|                     if (it.moveToFirst()) { | ||||
|                         val uriCompat = File(it.getString(it.getColumnIndex( | ||||
|             } catch (_: ActivityNotFoundException) { | ||||
|                 val query = DownloadManager.Query().setFilterById(id) | ||||
|                 downloadManager.query(query).use { cursor -> | ||||
|                     if (cursor.moveToFirst()) { | ||||
|                         @Suppress("DEPRECATION") | ||||
|                         val uriCompat = File(cursor.getString(cursor.getColumnIndex( | ||||
|                                 DownloadManager.COLUMN_LOCAL_FILENAME))).getUriCompat(context) | ||||
|                         installApk(uriCompat) | ||||
|                     } | ||||
|   | ||||
| @@ -105,7 +105,7 @@ open class ExtensionPresenter( | ||||
|     } | ||||
|  | ||||
|     private fun Observable<InstallStep>.subscribeToInstallUpdate(extension: Extension) { | ||||
|         this.doOnNext { currentDownloads.put(extension.pkgName, it) } | ||||
|         this.doOnNext { currentDownloads[extension.pkgName] = it } | ||||
|                 .doOnUnsubscribe { currentDownloads.remove(extension.pkgName) } | ||||
|                 .map { state -> updateInstallStep(extension, state) } | ||||
|                 .subscribeWithView({ view, item -> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user