From 8994b42760bb7cdb2466b315cbf6bc2f4dd00689 Mon Sep 17 00:00:00 2001 From: Bram van de Kerkhof Date: Mon, 11 Dec 2017 20:01:28 +0100 Subject: [PATCH] Remove local broadcast receiver to prevent race conditions (#1123) * Remove local broadcast receiver to prevent run exceptions. Added option to set tile for extension update. --- app/src/main/AndroidManifest.xml | 2 +- app/src/main/java/eu/kanade/tachiyomi/App.kt | 4 +- .../java/eu/kanade/tachiyomi/Migrations.kt | 4 +- .../data/notification/NotificationHandler.kt | 6 +- .../tachiyomi/data/updater/GithubRelease.kt | 4 +- .../data/updater/GithubUpdateChecker.kt | 2 +- .../data/updater/GithubUpdateResult.kt | 2 +- .../data/updater/UpdateDownloaderReceiver.kt | 147 ------------------ .../{UpdateCheckerJob.kt => UpdaterJob.kt} | 132 ++++++++-------- .../tachiyomi/data/updater/UpdaterNotifier.kt | 109 +++++++++++++ ...DownloaderService.kt => UpdaterService.kt} | 107 +++---------- .../ui/setting/SettingsAboutController.kt | 10 +- .../kanade/tachiyomi/util/FileExtensions.kt | 3 +- 13 files changed, 215 insertions(+), 317 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateDownloaderReceiver.kt rename app/src/main/java/eu/kanade/tachiyomi/data/updater/{UpdateCheckerJob.kt => UpdaterJob.kt} (89%) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterNotifier.kt rename app/src/main/java/eu/kanade/tachiyomi/data/updater/{UpdateDownloaderService.kt => UpdaterService.kt} (50%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 74fcb5334..b45c798e5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -86,7 +86,7 @@ android:exported="false" /> when (tag) { LibraryUpdateJob.TAG -> LibraryUpdateJob() - UpdateCheckerJob.TAG -> UpdateCheckerJob() + UpdaterJob.TAG -> UpdaterJob() BackupCreatorJob.TAG -> BackupCreatorJob() else -> null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt index a35521d98..3a4694718 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt @@ -3,7 +3,7 @@ package eu.kanade.tachiyomi import eu.kanade.tachiyomi.data.library.LibraryUpdateJob import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault -import eu.kanade.tachiyomi.data.updater.UpdateCheckerJob +import eu.kanade.tachiyomi.data.updater.UpdaterJob import java.io.File object Migrations { @@ -25,7 +25,7 @@ object Migrations { if (oldVersion < 14) { // Restore jobs after upgrading to evernote's job scheduler. if (BuildConfig.INCLUDE_UPDATER && preferences.automaticUpdates()) { - UpdateCheckerJob.setupTask() + UpdaterJob.setupTask() } LibraryUpdateJob.setupTask() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationHandler.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationHandler.kt index 445068762..4c61ca4ee 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationHandler.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationHandler.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.data.notification import android.app.PendingIntent import android.content.Context import android.content.Intent +import android.net.Uri import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.getUriCompat import java.io.File @@ -43,11 +44,10 @@ object NotificationHandler { * Returns [PendingIntent] that prompts user with apk install intent * * @param context context - * @param file file of apk that is installed + * @param uri uri of apk that is installed */ - fun installApkPendingActivity(context: Context, file: File): PendingIntent { + fun installApkPendingActivity(context: Context, uri: Uri): PendingIntent { val intent = Intent(Intent.ACTION_VIEW).apply { - val uri = file.getUriCompat(context) setDataAndType(uri, "application/vnd.android.package-archive") flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubRelease.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubRelease.kt index 400b46c89..8c20690e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubRelease.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubRelease.kt @@ -11,8 +11,8 @@ import com.google.gson.annotations.SerializedName * @param assets assets of latest release. */ class GithubRelease(@SerializedName("tag_name") val version: String, - @SerializedName("body") val changeLog: String, - @SerializedName("assets") val assets: List) { + @SerializedName("body") val changeLog: String, + @SerializedName("assets") private val assets: List) { /** * Get download link of latest release from the assets. diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubUpdateChecker.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubUpdateChecker.kt index 8d6210845..7d321dc71 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubUpdateChecker.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubUpdateChecker.kt @@ -3,7 +3,7 @@ package eu.kanade.tachiyomi.data.updater import eu.kanade.tachiyomi.BuildConfig import rx.Observable -class GithubUpdateChecker() { +class GithubUpdateChecker { private val service: GithubService = GithubService.create() diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubUpdateResult.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubUpdateResult.kt index a4a89a1c0..3f07d2da6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubUpdateResult.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/GithubUpdateResult.kt @@ -3,5 +3,5 @@ package eu.kanade.tachiyomi.data.updater sealed class GithubUpdateResult { class NewUpdate(val release: GithubRelease): GithubUpdateResult() - class NoNewUpdate(): GithubUpdateResult() + class NoNewUpdate : GithubUpdateResult() } \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateDownloaderReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateDownloaderReceiver.kt deleted file mode 100644 index 79190495b..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateDownloaderReceiver.kt +++ /dev/null @@ -1,147 +0,0 @@ -package eu.kanade.tachiyomi.data.updater - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.support.v4.app.NotificationCompat -import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.notification.NotificationHandler -import eu.kanade.tachiyomi.data.notification.NotificationReceiver -import eu.kanade.tachiyomi.data.notification.Notifications -import eu.kanade.tachiyomi.util.notificationManager -import java.io.File -import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID - -/** - * Local [BroadcastReceiver] that runs on UI thread - * Notification calls from [UpdateDownloaderService] should be made from here. - */ -internal class UpdateDownloaderReceiver(val context: Context) : BroadcastReceiver() { - - companion object { - private const val NAME = "UpdateDownloaderReceiver" - - // Called to show initial notification. - internal const val NOTIFICATION_UPDATER_INITIAL = "$ID.$NAME.UPDATER_INITIAL" - - // Called to show progress notification. - internal const val NOTIFICATION_UPDATER_PROGRESS = "$ID.$NAME.UPDATER_PROGRESS" - - // Called to show install notification. - internal const val NOTIFICATION_UPDATER_INSTALL = "$ID.$NAME.UPDATER_INSTALL" - - // Called to show error notification - internal const val NOTIFICATION_UPDATER_ERROR = "$ID.$NAME.UPDATER_ERROR" - - // Value containing action of BroadcastReceiver - internal const val EXTRA_ACTION = "$ID.$NAME.ACTION" - - // Value containing progress - internal const val EXTRA_PROGRESS = "$ID.$NAME.PROGRESS" - - // Value containing apk path - internal const val EXTRA_APK_PATH = "$ID.$NAME.APK_PATH" - - // Value containing apk url - internal const val EXTRA_APK_URL = "$ID.$NAME.APK_URL" - } - - /** - * Notification shown to user - */ - private val notification = NotificationCompat.Builder(context, Notifications.CHANNEL_COMMON) - - override fun onReceive(context: Context, intent: Intent) { - when (intent.getStringExtra(EXTRA_ACTION)) { - NOTIFICATION_UPDATER_INITIAL -> basicNotification() - NOTIFICATION_UPDATER_PROGRESS -> updateProgress(intent.getIntExtra(EXTRA_PROGRESS, 0)) - NOTIFICATION_UPDATER_INSTALL -> installNotification(intent.getStringExtra(EXTRA_APK_PATH)) - NOTIFICATION_UPDATER_ERROR -> errorNotification(intent.getStringExtra(EXTRA_APK_URL)) - } - } - - /** - * Called to show basic notification - */ - private fun basicNotification() { - // Create notification - with(notification) { - setContentTitle(context.getString(R.string.app_name)) - setContentText(context.getString(R.string.update_check_notification_download_in_progress)) - setSmallIcon(android.R.drawable.stat_sys_download) - setOngoing(true) - } - notification.show() - } - - /** - * Called to show progress notification - * - * @param progress progress of download - */ - private fun updateProgress(progress: Int) { - with(notification) { - setProgress(100, progress, false) - setOnlyAlertOnce(true) - } - notification.show() - } - - /** - * Called to show install notification - * - * @param path path of file - */ - private fun installNotification(path: String) { - // Prompt the user to install the new update. - with(notification) { - setContentText(context.getString(R.string.update_check_notification_download_complete)) - setSmallIcon(android.R.drawable.stat_sys_download_done) - setOnlyAlertOnce(false) - setProgress(0, 0, false) - // Install action - setContentIntent(NotificationHandler.installApkPendingActivity(context, File(path))) - addAction(R.drawable.ic_system_update_grey_24dp_img, - context.getString(R.string.action_install), - NotificationHandler.installApkPendingActivity(context, File(path))) - // Cancel action - addAction(R.drawable.ic_clear_grey_24dp_img, - context.getString(R.string.action_cancel), - NotificationReceiver.dismissNotificationPendingBroadcast(context, Notifications.ID_UPDATER)) - } - notification.show() - } - - /** - * Called to show error notification - * - * @param url url of apk - */ - private fun errorNotification(url: String) { - // Prompt the user to retry the download. - with(notification) { - setContentText(context.getString(R.string.update_check_notification_download_error)) - setSmallIcon(android.R.drawable.stat_sys_warning) - setOnlyAlertOnce(false) - setProgress(0, 0, false) - // Retry action - addAction(R.drawable.ic_refresh_grey_24dp_img, - context.getString(R.string.action_retry), - UpdateDownloaderService.downloadApkPendingService(context, url)) - // Cancel action - addAction(R.drawable.ic_clear_grey_24dp_img, - context.getString(R.string.action_cancel), - NotificationReceiver.dismissNotificationPendingBroadcast(context, Notifications.ID_UPDATER)) - } - notification.show() - } - - /** - * Shows a notification from this builder. - * - * @param id the id of the notification. - */ - private fun NotificationCompat.Builder.show(id: Int = Notifications.ID_UPDATER) { - context.notificationManager.notify(id, build()) - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateCheckerJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterJob.kt similarity index 89% rename from app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateCheckerJob.kt rename to app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterJob.kt index 696de5277..59832bd2d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateCheckerJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterJob.kt @@ -1,67 +1,67 @@ -package eu.kanade.tachiyomi.data.updater - -import android.app.PendingIntent -import android.content.Intent -import android.support.v4.app.NotificationCompat -import com.evernote.android.job.Job -import com.evernote.android.job.JobManager -import com.evernote.android.job.JobRequest -import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.notification.Notifications -import eu.kanade.tachiyomi.util.notificationManager - -class UpdateCheckerJob : Job() { - - override fun onRunJob(params: Params): Result { - return GithubUpdateChecker() - .checkForUpdate() - .map { result -> - if (result is GithubUpdateResult.NewUpdate) { - val url = result.release.downloadLink - - val intent = Intent(context, UpdateDownloaderService::class.java).apply { - putExtra(UpdateDownloaderService.EXTRA_DOWNLOAD_URL, url) - } - - NotificationCompat.Builder(context, Notifications.CHANNEL_COMMON).update { - setContentTitle(context.getString(R.string.app_name)) - setContentText(context.getString(R.string.update_check_notification_update_available)) - setSmallIcon(android.R.drawable.stat_sys_download_done) - // Download action - addAction(android.R.drawable.stat_sys_download_done, - context.getString(R.string.action_download), - PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)) - } - } - Job.Result.SUCCESS - } - .onErrorReturn { Job.Result.FAILURE } - // Sadly, the task needs to be synchronous. - .toBlocking() - .single() - } - - fun NotificationCompat.Builder.update(block: NotificationCompat.Builder.() -> Unit) { - block() - context.notificationManager.notify(Notifications.ID_UPDATER, build()) - } - - companion object { - const val TAG = "UpdateChecker" - - fun setupTask() { - JobRequest.Builder(TAG) - .setPeriodic(24 * 60 * 60 * 1000, 60 * 60 * 1000) - .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED) - .setRequirementsEnforced(true) - .setUpdateCurrent(true) - .build() - .schedule() - } - - fun cancelTask() { - JobManager.instance().cancelAllForTag(TAG) - } - } - +package eu.kanade.tachiyomi.data.updater + +import android.app.PendingIntent +import android.content.Intent +import android.support.v4.app.NotificationCompat +import com.evernote.android.job.Job +import com.evernote.android.job.JobManager +import com.evernote.android.job.JobRequest +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.notification.Notifications +import eu.kanade.tachiyomi.util.notificationManager + +class UpdaterJob : Job() { + + override fun onRunJob(params: Params): Result { + return GithubUpdateChecker() + .checkForUpdate() + .map { result -> + if (result is GithubUpdateResult.NewUpdate) { + val url = result.release.downloadLink + + val intent = Intent(context, UpdaterService::class.java).apply { + putExtra(UpdaterService.EXTRA_DOWNLOAD_URL, url) + } + + NotificationCompat.Builder(context, Notifications.CHANNEL_COMMON).update { + setContentTitle(context.getString(R.string.app_name)) + setContentText(context.getString(R.string.update_check_notification_update_available)) + setSmallIcon(android.R.drawable.stat_sys_download_done) + // Download action + addAction(android.R.drawable.stat_sys_download_done, + context.getString(R.string.action_download), + PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)) + } + } + Job.Result.SUCCESS + } + .onErrorReturn { Job.Result.FAILURE } + // Sadly, the task needs to be synchronous. + .toBlocking() + .single() + } + + fun NotificationCompat.Builder.update(block: NotificationCompat.Builder.() -> Unit) { + block() + context.notificationManager.notify(Notifications.ID_UPDATER, build()) + } + + companion object { + const val TAG = "UpdateChecker" + + fun setupTask() { + JobRequest.Builder(TAG) + .setPeriodic(24 * 60 * 60 * 1000, 60 * 60 * 1000) + .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED) + .setRequirementsEnforced(true) + .setUpdateCurrent(true) + .build() + .schedule() + } + + fun cancelTask() { + JobManager.instance().cancelAllForTag(TAG) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterNotifier.kt new file mode 100644 index 000000000..509c65bb4 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterNotifier.kt @@ -0,0 +1,109 @@ +package eu.kanade.tachiyomi.data.updater + +import android.content.Context +import android.net.Uri +import android.support.v4.app.NotificationCompat +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.notification.NotificationHandler +import eu.kanade.tachiyomi.data.notification.NotificationReceiver +import eu.kanade.tachiyomi.data.notification.Notifications +import eu.kanade.tachiyomi.util.notificationManager + +/** + * DownloadNotifier is used to show notifications when downloading and update. + * + * @param context context of application. + */ +internal class UpdaterNotifier(private val context: Context) { + + /** + * Builder to manage notifications. + */ + private val notification by lazy { + NotificationCompat.Builder(context, Notifications.CHANNEL_COMMON) + } + + /** + * Call to show notification. + * + * @param id id of the notification channel. + */ + private fun NotificationCompat.Builder.show(id: Int = Notifications.ID_UPDATER) { + context.notificationManager.notify(id, build()) + } + + /** + * Call when apk download starts. + * + * @param title tile of notification. + */ + fun onDownloadStarted(title: String) { + with(notification) { + setContentTitle(title) + setContentText(context.getString(R.string.update_check_notification_download_in_progress)) + setSmallIcon(android.R.drawable.stat_sys_download) + setOngoing(true) + } + notification.show() + } + + /** + * Call when apk download progress changes. + * + * @param progress progress of download (xx%/100). + */ + fun onProgressChange(progress: Int) { + with(notification) { + setProgress(100, progress, false) + setOnlyAlertOnce(true) + } + notification.show() + } + + /** + * Call when apk download is finished. + * + * @param uri path location of apk. + */ + fun onDownloadFinished(uri: Uri) { + with(notification) { + setContentText(context.getString(R.string.update_check_notification_download_complete)) + setSmallIcon(android.R.drawable.stat_sys_download_done) + setOnlyAlertOnce(false) + setProgress(0, 0, false) + // Install action + setContentIntent(NotificationHandler.installApkPendingActivity(context, uri)) + addAction(R.drawable.ic_system_update_grey_24dp_img, + context.getString(R.string.action_install), + NotificationHandler.installApkPendingActivity(context, uri)) + // Cancel action + addAction(R.drawable.ic_clear_grey_24dp_img, + context.getString(R.string.action_cancel), + NotificationReceiver.dismissNotificationPendingBroadcast(context, Notifications.ID_UPDATER)) + } + notification.show() + } + + /** + * Call when apk download throws a error + * + * @param url web location of apk to download. + */ + fun onDownloadError(url: String) { + with(notification) { + setContentText(context.getString(R.string.update_check_notification_download_error)) + setSmallIcon(android.R.drawable.stat_sys_warning) + setOnlyAlertOnce(false) + setProgress(0, 0, false) + // Retry action + addAction(R.drawable.ic_refresh_grey_24dp_img, + context.getString(R.string.action_retry), + UpdaterService.downloadApkPendingService(context, url)) + // Cancel action + addAction(R.drawable.ic_clear_grey_24dp_img, + context.getString(R.string.action_cancel), + NotificationReceiver.dismissNotificationPendingBroadcast(context, Notifications.ID_UPDATER)) + } + notification.show(Notifications.ID_UPDATER) + } +} \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateDownloaderService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterService.kt similarity index 50% rename from app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateDownloaderService.kt rename to app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterService.kt index dfb33db5b..4bcff3f1f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateDownloaderService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterService.kt @@ -2,52 +2,37 @@ package eu.kanade.tachiyomi.data.updater import android.app.IntentService import android.app.PendingIntent -import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.content.IntentFilter import eu.kanade.tachiyomi.BuildConfig +import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.ProgressListener import eu.kanade.tachiyomi.network.newCallWithProgress -import eu.kanade.tachiyomi.util.registerLocalReceiver +import eu.kanade.tachiyomi.util.getUriCompat import eu.kanade.tachiyomi.util.saveTo -import eu.kanade.tachiyomi.util.sendLocalBroadcastSync -import eu.kanade.tachiyomi.util.unregisterLocalReceiver import timber.log.Timber import uy.kohesive.injekt.injectLazy import java.io.File -class UpdateDownloaderService : IntentService(UpdateDownloaderService::class.java.name) { +class UpdaterService : IntentService(UpdaterService::class.java.name) { /** * Network helper */ private val network: NetworkHelper by injectLazy() /** - * Local [BroadcastReceiver] that runs on UI thread + * Notifier for the updater state and progress. */ - private val updaterNotificationReceiver = UpdateDownloaderReceiver(this) - - - override fun onCreate() { - super.onCreate() - // Register receiver - registerLocalReceiver(updaterNotificationReceiver, IntentFilter(INTENT_FILTER_NAME)) - } - - override fun onDestroy() { - // Unregister receiver - unregisterLocalReceiver(updaterNotificationReceiver) - super.onDestroy() - } + private val notifier by lazy { UpdaterNotifier(this) } override fun onHandleIntent(intent: Intent?) { if (intent == null) return + val title = intent.getStringExtra(EXTRA_DOWNLOAD_TITLE) ?: getString(R.string.app_name) val url = intent.getStringExtra(EXTRA_DOWNLOAD_URL) ?: return - downloadApk(url) + downloadApk(title, url) } /** @@ -55,9 +40,9 @@ class UpdateDownloaderService : IntentService(UpdateDownloaderService::class.jav * * @param url url location of file */ - fun downloadApk(url: String) { + private fun downloadApk(title: String, url: String) { // Show notification download starting. - sendInitialBroadcast() + notifier.onDownloadStarted(title) val progressListener = object : ProgressListener { @@ -73,7 +58,7 @@ class UpdateDownloaderService : IntentService(UpdateDownloaderService::class.jav if (progress > savedProgress && currentTime - 200 > lastTick) { savedProgress = progress lastTick = currentTime - sendProgressBroadcast(progress) + notifier.onProgressChange(progress) } } } @@ -91,80 +76,32 @@ class UpdateDownloaderService : IntentService(UpdateDownloaderService::class.jav response.close() throw Exception("Unsuccessful response") } - sendInstallBroadcast(apkFile.absolutePath) + notifier.onDownloadFinished(apkFile.getUriCompat(this)) } catch (error: Exception) { Timber.e(error) - sendErrorBroadcast(url) + notifier.onDownloadError(url) } } - /** - * Show notification download starting. - */ - private fun sendInitialBroadcast() { - val intent = Intent(INTENT_FILTER_NAME).apply { - putExtra(UpdateDownloaderReceiver.EXTRA_ACTION, UpdateDownloaderReceiver.NOTIFICATION_UPDATER_INITIAL) - } - sendLocalBroadcastSync(intent) - } - - /** - * Show notification progress changed - * - * @param progress progress of download - */ - private fun sendProgressBroadcast(progress: Int) { - val intent = Intent(INTENT_FILTER_NAME).apply { - putExtra(UpdateDownloaderReceiver.EXTRA_ACTION, UpdateDownloaderReceiver.NOTIFICATION_UPDATER_PROGRESS) - putExtra(UpdateDownloaderReceiver.EXTRA_PROGRESS, progress) - } - sendLocalBroadcastSync(intent) - } - - /** - * Show install notification. - * - * @param path location of file - */ - private fun sendInstallBroadcast(path: String){ - val intent = Intent(INTENT_FILTER_NAME).apply { - putExtra(UpdateDownloaderReceiver.EXTRA_ACTION, UpdateDownloaderReceiver.NOTIFICATION_UPDATER_INSTALL) - putExtra(UpdateDownloaderReceiver.EXTRA_APK_PATH, path) - } - sendLocalBroadcastSync(intent) - } - - /** - * Show error notification. - * - * @param url url of file - */ - private fun sendErrorBroadcast(url: String){ - val intent = Intent(INTENT_FILTER_NAME).apply { - putExtra(UpdateDownloaderReceiver.EXTRA_ACTION, UpdateDownloaderReceiver.NOTIFICATION_UPDATER_ERROR) - putExtra(UpdateDownloaderReceiver.EXTRA_APK_URL, url) - } - sendLocalBroadcastSync(intent) - } - companion object { - /** - * Name of Local BroadCastReceiver. - */ - private val INTENT_FILTER_NAME = UpdateDownloaderService::class.java.name - /** * Download url. */ - internal const val EXTRA_DOWNLOAD_URL = "${BuildConfig.APPLICATION_ID}.UpdateDownloaderService.DOWNLOAD_URL" + internal const val EXTRA_DOWNLOAD_URL = "${BuildConfig.APPLICATION_ID}.UpdaterService.DOWNLOAD_URL" + + /** + * Download title + */ + internal const val EXTRA_DOWNLOAD_TITLE = "${BuildConfig.APPLICATION_ID}.UpdaterService.DOWNLOAD_TITLE" /** * Downloads a new update and let the user install the new version from a notification. * @param context the application context. * @param url the url to the new update. */ - fun downloadUpdate(context: Context, url: String) { - val intent = Intent(context, UpdateDownloaderService::class.java).apply { + fun downloadUpdate(context: Context, url: String, title: String = context.getString(R.string.app_name)) { + val intent = Intent(context, UpdaterService::class.java).apply { + putExtra(EXTRA_DOWNLOAD_TITLE, title) putExtra(EXTRA_DOWNLOAD_URL, url) } context.startService(intent) @@ -177,7 +114,7 @@ class UpdateDownloaderService : IntentService(UpdateDownloaderService::class.jav * @return [PendingIntent] */ internal fun downloadApkPendingService(context: Context, url: String): PendingIntent { - val intent = Intent(context, UpdateDownloaderService::class.java).apply { + val intent = Intent(context, UpdaterService::class.java).apply { putExtra(EXTRA_DOWNLOAD_URL, url) } return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt index 1c79f9a58..b0c8ba74f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt @@ -11,8 +11,8 @@ import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.updater.GithubUpdateChecker import eu.kanade.tachiyomi.data.updater.GithubUpdateResult -import eu.kanade.tachiyomi.data.updater.UpdateCheckerJob -import eu.kanade.tachiyomi.data.updater.UpdateDownloaderService +import eu.kanade.tachiyomi.data.updater.UpdaterJob +import eu.kanade.tachiyomi.data.updater.UpdaterService import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.util.toast import rx.Subscription @@ -59,9 +59,9 @@ class SettingsAboutController : SettingsController() { onChange { newValue -> val checked = newValue as Boolean if (checked) { - UpdateCheckerJob.setupTask() + UpdaterJob.setupTask() } else { - UpdateCheckerJob.cancelTask() + UpdaterJob.cancelTask() } true } @@ -148,7 +148,7 @@ class SettingsAboutController : SettingsController() { if (appContext != null) { // Start download val url = args.getString(URL_KEY) - UpdateDownloaderService.downloadUpdate(appContext, url) + UpdaterService.downloadUpdate(appContext, url) } } .build() diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/FileExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/FileExtensions.kt index dd1f574c3..3ad0eeca0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/FileExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/FileExtensions.kt @@ -13,9 +13,8 @@ import java.io.File * @param context context of application */ fun File.getUriCompat(context: Context): Uri { - val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", this) else Uri.fromFile(this) - return uri }