Merge branch 'dev' into 'master'
dev See merge request AuroraOSS/AuroraStore!451
This commit is contained in:
@@ -95,10 +95,8 @@ class AuroraApp : Application(), Configuration.Provider, SingletonImageLoader.Fa
|
||||
NotificationUtil.createNotificationChannel(this)
|
||||
|
||||
// Initialize Download and Update helpers to observe and trigger downloads
|
||||
scope.launch {
|
||||
downloadHelper.init()
|
||||
updateHelper.init()
|
||||
}
|
||||
downloadHelper.init()
|
||||
updateHelper.init()
|
||||
|
||||
//Register broadcast receiver for package install/uninstall
|
||||
ContextCompat.registerReceiver(
|
||||
|
||||
@@ -16,12 +16,13 @@ import com.aurora.store.data.room.update.Update
|
||||
import com.aurora.store.data.work.DownloadWorker
|
||||
import com.aurora.store.util.PathUtil
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.filter
|
||||
import kotlinx.coroutines.flow.firstOrNull
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.flow.stateIn
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
@@ -49,16 +50,16 @@ class DownloadHelper @Inject constructor(
|
||||
/**
|
||||
* Removes failed download from the queue and starts observing for newly enqueued apps.
|
||||
*/
|
||||
suspend fun init() {
|
||||
withContext(Dispatchers.IO) {
|
||||
fun init() {
|
||||
AuroraApp.scope.launch {
|
||||
cancelFailedDownloads(downloadDao.downloads().firstOrNull() ?: emptyList())
|
||||
}.invokeOnCompletion {
|
||||
observeDownloads()
|
||||
}
|
||||
|
||||
observeDownloads()
|
||||
}
|
||||
|
||||
private suspend fun observeDownloads() {
|
||||
downloadDao.downloads().collect { list ->
|
||||
private fun observeDownloads() {
|
||||
downloadDao.downloads().onEach { list ->
|
||||
try {
|
||||
if (list.none { it.downloadStatus == DownloadStatus.DOWNLOADING }) {
|
||||
list.find { it.downloadStatus == DownloadStatus.QUEUED }
|
||||
@@ -70,7 +71,7 @@ class DownloadHelper @Inject constructor(
|
||||
} catch (exception: Exception) {
|
||||
Log.e(TAG, "Failed to enqueue download worker", exception)
|
||||
}
|
||||
}
|
||||
}.launchIn(AuroraApp.scope)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -25,14 +25,13 @@ import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS_IDLE
|
||||
import com.aurora.store.util.Preferences.PREFERENCES_UPDATES_RESTRICTIONS_METERED
|
||||
import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_CHECK_INTERVAL
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.firstOrNull
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.flow.stateIn
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.concurrent.TimeUnit.HOURS
|
||||
import java.util.concurrent.TimeUnit.MINUTES
|
||||
import javax.inject.Inject
|
||||
@@ -69,12 +68,12 @@ class UpdateHelper @Inject constructor(
|
||||
/**
|
||||
* Deletes invalid updates from database and starts observing events
|
||||
*/
|
||||
suspend fun init() {
|
||||
withContext(Dispatchers.IO) {
|
||||
fun init() {
|
||||
AuroraApp.scope.launch {
|
||||
deleteInvalidUpdates()
|
||||
}.invokeOnCompletion {
|
||||
observeUpdates()
|
||||
}
|
||||
|
||||
observeUpdates()
|
||||
}
|
||||
|
||||
private fun observeUpdates() {
|
||||
|
||||
@@ -13,6 +13,7 @@ import android.graphics.Bitmap
|
||||
import android.graphics.BitmapFactory
|
||||
import android.util.Log
|
||||
import androidx.core.content.getSystemService
|
||||
import androidx.core.graphics.scale
|
||||
import androidx.hilt.work.HiltWorker
|
||||
import androidx.work.ForegroundInfo
|
||||
import androidx.work.WorkInfo.Companion.STOP_REASON_CANCELLED_BY_APP
|
||||
@@ -63,9 +64,9 @@ import com.aurora.gplayapi.data.models.File as GPlayFile
|
||||
*/
|
||||
@HiltWorker
|
||||
class DownloadWorker @AssistedInject constructor(
|
||||
authProvider: AuthProvider,
|
||||
private val downloadDao: DownloadDao,
|
||||
private val appInstaller: AppInstaller,
|
||||
private val authProvider: AuthProvider,
|
||||
private val httpClient: IHttpClient,
|
||||
private val purchaseHelper: PurchaseHelper,
|
||||
@Assisted private val appContext: Context,
|
||||
@@ -85,8 +86,6 @@ class DownloadWorker @AssistedInject constructor(
|
||||
private val NOTIFICATION_ID: Int = 200
|
||||
|
||||
object Exceptions {
|
||||
class InvalidAuthDataException : Exception("AuthData is invalid")
|
||||
class NoPackageNameException : Exception("No packagename provided")
|
||||
class NoNetworkException : Exception("No network available")
|
||||
class NothingToDownloadException : Exception("Failed to purchase app")
|
||||
class DownloadFailedException : Exception("Download failed")
|
||||
@@ -97,23 +96,15 @@ class DownloadWorker @AssistedInject constructor(
|
||||
override suspend fun doWork(): Result {
|
||||
super.doWork()
|
||||
|
||||
// Bail out immediately if authData is not valid
|
||||
if (!authProvider.isSavedAuthDataValid()) return onFailure(Exceptions.InvalidAuthDataException())
|
||||
|
||||
// Fetch required data for download
|
||||
try {
|
||||
val packageName = inputData.getString(DownloadHelper.PACKAGE_NAME)
|
||||
|
||||
// Bail out if no package name is provided
|
||||
if (packageName.isNullOrBlank()) return onFailure(Exceptions.NoPackageNameException())
|
||||
|
||||
download = downloadDao.getDownload(packageName)
|
||||
download = downloadDao.getDownload(inputData.getString(DownloadHelper.PACKAGE_NAME)!!)
|
||||
|
||||
val response = (httpClient as HttpClient).call(download.iconURL).body
|
||||
if (response != null) {
|
||||
val bitmap =
|
||||
BitmapFactory.decodeStream(withContext(Dispatchers.IO) { response.byteStream() })
|
||||
icon = Bitmap.createScaledBitmap(bitmap, 96, 96, true)
|
||||
icon = bitmap.scale(96, 96)
|
||||
}
|
||||
} catch (exception: Exception) {
|
||||
return onFailure(exception)
|
||||
|
||||
Reference in New Issue
Block a user