|
|
|
|
@ -17,6 +17,7 @@ import android.util.Log |
|
|
|
|
import androidx.core.app.ActivityCompat |
|
|
|
|
import androidx.core.content.PermissionChecker |
|
|
|
|
import androidx.core.content.PermissionChecker.checkSelfPermission |
|
|
|
|
import androidx.fragment.app.FragmentActivity |
|
|
|
|
import com.lizongying.mytv.api.ApiClient |
|
|
|
|
import com.lizongying.mytv.requests.ReleaseRequest |
|
|
|
|
import com.lizongying.mytv.requests.ReleaseResponse |
|
|
|
|
@ -28,7 +29,6 @@ import java.io.File |
|
|
|
|
|
|
|
|
|
class UpdateManager( |
|
|
|
|
private var context: Context, |
|
|
|
|
private var settingFragment: SettingFragment, |
|
|
|
|
private var versionCode: Long |
|
|
|
|
) : |
|
|
|
|
ConfirmationFragment.ConfirmationListener { |
|
|
|
|
@ -44,30 +44,32 @@ class UpdateManager( |
|
|
|
|
} |
|
|
|
|
CoroutineScope(Dispatchers.Main).launch { |
|
|
|
|
var text = "版本获取失败" |
|
|
|
|
var update = false |
|
|
|
|
try { |
|
|
|
|
release = releaseRequest.getRelease() |
|
|
|
|
Log.i(TAG, "versionCode $versionCode ${release?.version_code}") |
|
|
|
|
if (release?.version_code != null) { |
|
|
|
|
text = if (release?.version_code!! >= versionCode) { |
|
|
|
|
"最新版本:${release?.version_name}}" |
|
|
|
|
if (release?.version_code!! > versionCode) { |
|
|
|
|
text = "最新版本:${release?.version_name}" |
|
|
|
|
update = true |
|
|
|
|
} else { |
|
|
|
|
"已是最新版本,不需要更新" |
|
|
|
|
text = "已是最新版本,不需要更新" |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (e: Exception) { |
|
|
|
|
Log.e(TAG, "Error occurred: ${e.message}", e) |
|
|
|
|
} |
|
|
|
|
updateUI(text) |
|
|
|
|
updateUI(text, update) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private fun updateUI(text: String) { |
|
|
|
|
val dialog = ConfirmationFragment(this@UpdateManager, text) |
|
|
|
|
settingFragment.fragmentManager?.let { dialog.show(it, TAG) } |
|
|
|
|
private fun updateUI(text: String, update: Boolean) { |
|
|
|
|
val dialog = ConfirmationFragment(this@UpdateManager, text, update) |
|
|
|
|
dialog.show((context as FragmentActivity).supportFragmentManager, TAG) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private fun haveStoragePermission(): Boolean { |
|
|
|
|
if (Build.VERSION.SDK_INT >= 23) { |
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
|
|
|
|
if (checkSelfPermission(context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) |
|
|
|
|
=== PermissionChecker.PERMISSION_GRANTED |
|
|
|
|
) { |
|
|
|
|
@ -90,23 +92,31 @@ class UpdateManager( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun startDownload(release: ReleaseResponse) { |
|
|
|
|
val apkFileName = "my-tv-${release.version_name}.apk" |
|
|
|
|
val packageInstaller = context.packageManager |
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { |
|
|
|
|
if (!packageInstaller.canRequestPackageInstalls()) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val apkName = "my-tv" |
|
|
|
|
val apkFileName = "$apkName-${release.version_name}.apk" |
|
|
|
|
Log.i(TAG, "apkFileName $apkFileName") |
|
|
|
|
val downloadManager = |
|
|
|
|
context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager |
|
|
|
|
val request = |
|
|
|
|
Request(Uri.parse("${ApiClient.HOST}/release/download/${release.version_name}/my-tv-${release.version_name}.apk")) |
|
|
|
|
Request(Uri.parse("${ApiClient.DOWNLOAD_HOST}${release.version_name}/$apkName-${release.version_name}.apk")) |
|
|
|
|
Log.i( |
|
|
|
|
TAG, |
|
|
|
|
"url ${Uri.parse("${ApiClient.HOST}/release/download/${release.version_name}/my-tv-0-${release.version_name}.apk")}" |
|
|
|
|
"url ${Uri.parse("${ApiClient.DOWNLOAD_HOST}${release.version_name}/$apkName-${release.version_name}.apk")}" |
|
|
|
|
) |
|
|
|
|
context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)?.mkdirs() |
|
|
|
|
Log.i(TAG, "save dir ${Environment.DIRECTORY_DOWNLOADS}") |
|
|
|
|
request.setDestinationInExternalFilesDir( |
|
|
|
|
context, |
|
|
|
|
Environment.DIRECTORY_DOWNLOADS, |
|
|
|
|
apkFileName |
|
|
|
|
) |
|
|
|
|
request.setTitle("${settingFragment.resources.getString(R.string.app_name)} ${release.version_name}") |
|
|
|
|
request.setTitle("${context.resources.getString(R.string.app_name)} ${release.version_name}") |
|
|
|
|
request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) |
|
|
|
|
request.setAllowedOverRoaming(false) |
|
|
|
|
request.setMimeType("application/vnd.android.package-archive") |
|
|
|
|
@ -184,27 +194,73 @@ class UpdateManager( |
|
|
|
|
override fun onReceive(context: Context, intent: Intent) { |
|
|
|
|
val reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) |
|
|
|
|
Log.i(TAG, "reference $reference") |
|
|
|
|
val progress = intent.getIntExtra("progress", 0) |
|
|
|
|
Log.i(TAG, "progress $progress") |
|
|
|
|
|
|
|
|
|
// 检查是否是我们发起的下载 |
|
|
|
|
if (reference == downloadReference) { |
|
|
|
|
// 下载完成,触发安装 |
|
|
|
|
installNewVersion() |
|
|
|
|
val downloadManager = |
|
|
|
|
context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager |
|
|
|
|
val query = DownloadManager.Query().setFilterById(downloadReference) |
|
|
|
|
val cursor = downloadManager.query(query) |
|
|
|
|
if (cursor != null && cursor.moveToFirst()) { |
|
|
|
|
val statusIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS) |
|
|
|
|
if (statusIndex < 0) { |
|
|
|
|
Log.i(TAG, "Download failure") |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
val status = cursor.getInt(statusIndex) |
|
|
|
|
|
|
|
|
|
val progressIndex = |
|
|
|
|
cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR) |
|
|
|
|
if (progressIndex < 0) { |
|
|
|
|
Log.i(TAG, "Download failure") |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
val progress = cursor.getInt(progressIndex) |
|
|
|
|
|
|
|
|
|
val totalSizeIndex = |
|
|
|
|
cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES) |
|
|
|
|
val totalSize = cursor.getInt(totalSizeIndex) |
|
|
|
|
|
|
|
|
|
cursor.close() |
|
|
|
|
|
|
|
|
|
when (status) { |
|
|
|
|
DownloadManager.STATUS_SUCCESSFUL -> { |
|
|
|
|
installNewVersion() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DownloadManager.STATUS_FAILED -> { |
|
|
|
|
// Handle download failure |
|
|
|
|
Log.i(TAG, "Download failure") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else -> { |
|
|
|
|
// Update UI with download progress |
|
|
|
|
val percentage = progress * 100 / totalSize |
|
|
|
|
Log.i(TAG, "Download progress: $percentage%") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private fun installNewVersion() { |
|
|
|
|
val installIntent = Intent(Intent.ACTION_VIEW) |
|
|
|
|
val apkUri = Uri.fromFile( |
|
|
|
|
File( |
|
|
|
|
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), |
|
|
|
|
apkFileName |
|
|
|
|
) |
|
|
|
|
val apkFile = File( |
|
|
|
|
context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), |
|
|
|
|
apkFileName |
|
|
|
|
) |
|
|
|
|
installIntent.setDataAndType(apkUri, "application/vnd.android.package-archive") |
|
|
|
|
installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) |
|
|
|
|
context.startActivity(installIntent) |
|
|
|
|
Log.i(TAG, "apkFile $apkFile") |
|
|
|
|
|
|
|
|
|
if (apkFile.exists()) { |
|
|
|
|
val apkUri = Uri.parse("file://$apkFile") |
|
|
|
|
Log.i(TAG, "apkUri $apkUri") |
|
|
|
|
val installIntent = Intent(Intent.ACTION_VIEW).apply { |
|
|
|
|
setDataAndType(apkUri, "application/vnd.android.package-archive") |
|
|
|
|
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
context.startActivity(installIntent) |
|
|
|
|
} else { |
|
|
|
|
Log.e(TAG, "APK file does not exist!") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|