Loading app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt +1 −6 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.WorkInfo import androidx.work.WorkManager import dagger.hilt.android.AndroidEntryPoint Loading Loading @@ -284,11 +283,7 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), FusedAPIInte private fun initUpdataAllButton() { binding.button.setOnClickListener { val interval = updatesViewModel.getUpdateInterval() UpdatesWorkManager.enqueueWork( requireContext(), interval, ExistingPeriodicWorkPolicy.REPLACE ) UpdatesWorkManager.startUpdateAllWork(requireContext()) observeUpdateWork() binding.button.isEnabled = false } Loading app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorkManager.kt +21 −0 Original line number Diff line number Diff line Loading @@ -20,15 +20,36 @@ package foundation.e.apps.updates.manager import android.content.Context import android.util.Log import androidx.work.Constraints import androidx.work.Data import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ExistingWorkPolicy import androidx.work.NetworkType import androidx.work.OneTimeWorkRequest import androidx.work.PeriodicWorkRequest import androidx.work.WorkManager import java.util.concurrent.TimeUnit object UpdatesWorkManager { private const val UPDATES_WORK_NAME = "updates_work" private const val UPDATES_WORK_USER_NAME = "updates_work_user" const val TAG = "UpdatesWorkTag" const val USER_TAG = "UpdatesWorkUserTag" fun startUpdateAllWork(context: Context) { WorkManager.getInstance(context).enqueueUniqueWork( UPDATES_WORK_USER_NAME, ExistingWorkPolicy.REPLACE, buildOneTimeWorkRequest() ) } private fun buildOneTimeWorkRequest(): OneTimeWorkRequest { return OneTimeWorkRequest.Builder(UpdatesWorker::class.java).apply { setConstraints(buildWorkerConstraints()) addTag(USER_TAG) }.setInputData(Data.Builder().putBoolean(UpdatesWorker.IS_AUTO_UPDATE, false).build()) .build() } private fun buildWorkerConstraints() = Constraints.Builder().apply { setRequiresBatteryNotLow(true) Loading app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorker.kt +20 −0 Original line number Diff line number Diff line Loading @@ -11,7 +11,10 @@ import android.util.Base64 import androidx.hilt.work.HiltWorker import androidx.preference.PreferenceManager import androidx.work.CoroutineWorker import androidx.work.WorkInfo import androidx.work.WorkManager import androidx.work.WorkerParameters import androidx.work.await import com.aurora.gplayapi.data.models.AuthData import com.google.gson.Gson import dagger.assisted.Assisted Loading Loading @@ -64,6 +67,10 @@ class UpdatesWorker @AssistedInject constructor( override suspend fun doWork(): Result { return try { isAutoUpdate = params.inputData.getBoolean(IS_AUTO_UPDATE, true) if (isAutoUpdate && checkManualUpdateRunning()) { return Result.success() } checkForUpdates() Result.success() } catch (e: Throwable) { Loading @@ -76,6 +83,19 @@ class UpdatesWorker @AssistedInject constructor( } } private suspend fun checkManualUpdateRunning(): Boolean { val workInfos = WorkManager.getInstance(context).getWorkInfosByTag(UpdatesWorkManager.USER_TAG).await() if (workInfos.isNotEmpty()) { val workInfo = workInfos[0] Timber.d("Manual update status: workInfo.state=${workInfo.state}, id=${workInfo.id}") if (workInfo.state == WorkInfo.State.BLOCKED || workInfo.state == WorkInfo.State.ENQUEUED || workInfo.state == WorkInfo.State.RUNNING) { return true } } return false } private fun getUser(): User { return dataStoreManager.getUserType() } Loading Loading
app/src/main/java/foundation/e/apps/updates/UpdatesFragment.kt +1 −6 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.WorkInfo import androidx.work.WorkManager import dagger.hilt.android.AndroidEntryPoint Loading Loading @@ -284,11 +283,7 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), FusedAPIInte private fun initUpdataAllButton() { binding.button.setOnClickListener { val interval = updatesViewModel.getUpdateInterval() UpdatesWorkManager.enqueueWork( requireContext(), interval, ExistingPeriodicWorkPolicy.REPLACE ) UpdatesWorkManager.startUpdateAllWork(requireContext()) observeUpdateWork() binding.button.isEnabled = false } Loading
app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorkManager.kt +21 −0 Original line number Diff line number Diff line Loading @@ -20,15 +20,36 @@ package foundation.e.apps.updates.manager import android.content.Context import android.util.Log import androidx.work.Constraints import androidx.work.Data import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ExistingWorkPolicy import androidx.work.NetworkType import androidx.work.OneTimeWorkRequest import androidx.work.PeriodicWorkRequest import androidx.work.WorkManager import java.util.concurrent.TimeUnit object UpdatesWorkManager { private const val UPDATES_WORK_NAME = "updates_work" private const val UPDATES_WORK_USER_NAME = "updates_work_user" const val TAG = "UpdatesWorkTag" const val USER_TAG = "UpdatesWorkUserTag" fun startUpdateAllWork(context: Context) { WorkManager.getInstance(context).enqueueUniqueWork( UPDATES_WORK_USER_NAME, ExistingWorkPolicy.REPLACE, buildOneTimeWorkRequest() ) } private fun buildOneTimeWorkRequest(): OneTimeWorkRequest { return OneTimeWorkRequest.Builder(UpdatesWorker::class.java).apply { setConstraints(buildWorkerConstraints()) addTag(USER_TAG) }.setInputData(Data.Builder().putBoolean(UpdatesWorker.IS_AUTO_UPDATE, false).build()) .build() } private fun buildWorkerConstraints() = Constraints.Builder().apply { setRequiresBatteryNotLow(true) Loading
app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorker.kt +20 −0 Original line number Diff line number Diff line Loading @@ -11,7 +11,10 @@ import android.util.Base64 import androidx.hilt.work.HiltWorker import androidx.preference.PreferenceManager import androidx.work.CoroutineWorker import androidx.work.WorkInfo import androidx.work.WorkManager import androidx.work.WorkerParameters import androidx.work.await import com.aurora.gplayapi.data.models.AuthData import com.google.gson.Gson import dagger.assisted.Assisted Loading Loading @@ -64,6 +67,10 @@ class UpdatesWorker @AssistedInject constructor( override suspend fun doWork(): Result { return try { isAutoUpdate = params.inputData.getBoolean(IS_AUTO_UPDATE, true) if (isAutoUpdate && checkManualUpdateRunning()) { return Result.success() } checkForUpdates() Result.success() } catch (e: Throwable) { Loading @@ -76,6 +83,19 @@ class UpdatesWorker @AssistedInject constructor( } } private suspend fun checkManualUpdateRunning(): Boolean { val workInfos = WorkManager.getInstance(context).getWorkInfosByTag(UpdatesWorkManager.USER_TAG).await() if (workInfos.isNotEmpty()) { val workInfo = workInfos[0] Timber.d("Manual update status: workInfo.state=${workInfo.state}, id=${workInfo.id}") if (workInfo.state == WorkInfo.State.BLOCKED || workInfo.state == WorkInfo.State.ENQUEUED || workInfo.state == WorkInfo.State.RUNNING) { return true } } return false } private fun getUser(): User { return dataStoreManager.getUserType() } Loading