Updating Extension installer from upstream

Also adding an onerror handle
This commit is contained in:
Jay 2020-05-15 02:02:08 -04:00
parent e0e072546f
commit 652e045acf

View File

@ -6,7 +6,7 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.Uri
import android.os.Build
import android.os.Environment
import com.jakewharton.rxrelay.PublishRelay
import eu.kanade.tachiyomi.extension.model.Extension
import eu.kanade.tachiyomi.extension.model.InstallStep
@ -63,9 +63,11 @@ internal class ExtensionInstaller(private val context: Context) {
// Register the receiver after removing (and unregistering) the previous download
downloadReceiver.register()
val request = DownloadManager.Request(Uri.parse(url))
val downloadUri = Uri.parse(url)
val request = DownloadManager.Request(downloadUri)
.setTitle(extension.name)
.setMimeType(APK_MIME)
.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, downloadUri.lastPathSegment)
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
val id = downloadManager.enqueue(request)
@ -82,9 +84,7 @@ internal class ExtensionInstaller(private val context: Context) {
// Always notify on main thread
.observeOn(AndroidSchedulers.mainThread())
// Always remove the download when unsubscribed
.doOnUnsubscribe {
deleteDownload(pkgName)
}
.doOnUnsubscribe { deleteDownload(pkgName) }
}
/**
@ -116,6 +116,9 @@ internal class ExtensionInstaller(private val context: Context) {
else -> Observable.empty()
}
}
.doOnError {
Timber.e(it)
}
}
/**
@ -161,7 +164,7 @@ internal class ExtensionInstaller(private val context: Context) {
*
* @param pkgName The package name of the download to delete.
*/
fun deleteDownload(pkgName: String) {
private fun deleteDownload(pkgName: String) {
val downloadId = activeDownloads.remove(pkgName)
if (downloadId != null) {
downloadManager.remove(downloadId)
@ -223,26 +226,22 @@ internal class ExtensionInstaller(private val context: Context) {
return
}
// Due to a bug in Android versions prior to N, the installer can't open files that do
// not contain the extension in the path, even if you specify the correct MIME.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
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(id, uriCompat)
val localUri = cursor.getString(
cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)
).removePrefix(FILE_SCHEME)
installApk(id, File(localUri).getUriCompat(context))
}
}
} else {
installApk(id, uri)
}
}
}
companion object {
const val APK_MIME = "application/vnd.android.package-archive"
const val EXTRA_DOWNLOAD_ID = "ExtensionInstaller.extra.DOWNLOAD_ID"
const val FILE_SCHEME = "file://"
}
}