diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt index 72ba8682..9950ad87 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt @@ -4,6 +4,7 @@ import android.app.Activity.RESULT_OK import android.content.Intent import android.net.Uri import android.util.Log +import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.* @@ -230,12 +231,16 @@ private fun ModuleList( } }, onUpdate = { + val downloading = downloadingText.format(module.name) download( context, - Uri.parse(updateUrl), - module.name, + updateUrl, "${module.name}-${module.version}.zip", - downloadingText.format(module.name) + downloading, + onDownloaded = onInstallModule, + onDownloading = { + Toast.makeText(context, downloading, Toast.LENGTH_SHORT).show() + } ) }) diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/Downloader.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/Downloader.kt index 1f18dba2..e0dc7ab8 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/Downloader.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/Downloader.kt @@ -15,18 +15,46 @@ import androidx.compose.runtime.DisposableEffect * @author weishu * @date 2023/6/22. */ - -fun download(context: Context, uri: Uri, title: String, fileName: String, description: String) { +@SuppressLint("Range") +fun download( + context: Context, + url: String, + fileName: String, + description: String, + onDownloaded: (Uri) -> Unit = {}, + onDownloading: () -> Unit = {} +) { val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager - val request = DownloadManager.Request(uri) + + val query = DownloadManager.Query() + query.setFilterByStatus(DownloadManager.STATUS_RUNNING or DownloadManager.STATUS_PAUSED or DownloadManager.STATUS_PENDING) + downloadManager.query(query).use { cursor -> + while (cursor.moveToNext()) { + val uri = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_URI)) + val localUri = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)) + val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) + val columnTitle = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE)) + if (url == uri || fileName == columnTitle) { + if (status == DownloadManager.STATUS_RUNNING || status == DownloadManager.STATUS_PENDING) { + onDownloading() + return + } else if (status == DownloadManager.STATUS_SUCCESSFUL) { + onDownloaded(Uri.parse(localUri)) + return + } + } + } + } + + val request = DownloadManager.Request(Uri.parse(url)) .setDestinationInExternalPublicDir( Environment.DIRECTORY_DOWNLOADS, fileName ) .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) .setMimeType("application/zip") - .setTitle(title) + .setTitle(fileName) .setDescription(description) downloadManager.enqueue(request)