Skip to content

Commit b60d335

Browse files
committed
fix(login): only expedite WorkManager requests on Android 12+
Expedited WorkRequests on API < 31 fall back to an implicit foreground service, which requires the Worker to override getForegroundInfo(). None of our Workers do, so any expedited request crashed with IllegalStateException on older Android versions. For CapabilitiesWorker during login, that crash meant its completion event was never posted, leaving the login spinner stuck forever. Add setExpeditedIfSupported(), which only calls setExpedited() on API 31+ (where expedited work runs via JobScheduler and doesn't need getForegroundInfo()), and use it at all 21 call sites introduced by 39331e7. Assisted-by: Claude Code:claude-sonnet-5 Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
1 parent ad15adf commit b60d335

14 files changed

Lines changed: 58 additions & 34 deletions

File tree

app/src/main/java/com/nextcloud/talk/account/AccountVerificationActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import android.util.Log
1818
import android.widget.Toast
1919
import androidx.work.Data
2020
import androidx.work.OneTimeWorkRequest
21-
import androidx.work.OutOfQuotaPolicy
21+
import com.nextcloud.talk.utils.setExpeditedIfSupported
2222
import androidx.work.WorkInfo
2323
import androidx.work.WorkManager
2424
import autodagger.AutoInjector
@@ -495,7 +495,7 @@ class AccountVerificationActivity : BaseActivity() {
495495
val capabilitiesWork =
496496
OneTimeWorkRequest.Builder(CapabilitiesWorker::class.java)
497497
.setInputData(userData)
498-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
498+
.setExpeditedIfSupported()
499499
.build()
500500
WorkManager.getInstance().enqueue(capabilitiesWork)
501501
}
@@ -591,7 +591,7 @@ class AccountVerificationActivity : BaseActivity() {
591591
private fun deleteUserAndStartServerSelection(userId: Long) {
592592
userManager.scheduleUserForDeletionWithId(userId).blockingGet()
593593
val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java)
594-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
594+
.setExpeditedIfSupported()
595595
.build()
596596
WorkManager.getInstance(applicationContext).enqueue(accountRemovalWork)
597597

app/src/main/java/com/nextcloud/talk/account/data/io/LocalLoginDataSource.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ package com.nextcloud.talk.account.data.io
1010
import android.content.Context
1111
import androidx.lifecycle.LiveData
1212
import androidx.work.OneTimeWorkRequest
13-
import androidx.work.OutOfQuotaPolicy
13+
import com.nextcloud.talk.utils.setExpeditedIfSupported
1414
import androidx.work.WorkInfo
1515
import androidx.work.WorkManager
1616
import com.nextcloud.talk.account.data.model.LoginCompletion
@@ -33,7 +33,7 @@ class LocalLoginDataSource(val userManager: UserManager, val appPreferences: App
3333

3434
fun startAccountRemovalWorker(): LiveData<WorkInfo?> {
3535
val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java)
36-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
36+
.setExpeditedIfSupported()
3737
.build()
3838
WorkManager.getInstance(context).enqueue(accountRemovalWork)
3939

app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ import androidx.media3.session.SessionToken
9292
import androidx.recyclerview.widget.LinearLayoutManager
9393
import androidx.work.Data
9494
import androidx.work.OneTimeWorkRequest
95-
import androidx.work.OutOfQuotaPolicy
95+
import com.nextcloud.talk.utils.setExpeditedIfSupported
9696
import androidx.work.WorkInfo
9797
import androidx.work.WorkManager
9898
import autodagger.AutoInjector
@@ -2380,7 +2380,7 @@ class ChatActivity :
23802380
val downloadWorker: OneTimeWorkRequest = OneTimeWorkRequest.Builder(DownloadFileToCacheWorker::class.java)
23812381
.setInputData(data)
23822382
.addTag(fileId)
2383-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
2383+
.setExpeditedIfSupported()
23842384
.build()
23852385

23862386
WorkManager.getInstance().enqueue(downloadWorker)
@@ -2538,7 +2538,7 @@ class ChatActivity :
25382538
.build()
25392539
val worker = OneTimeWorkRequest.Builder(ShareOperationWorker::class.java)
25402540
.setInputData(data)
2541-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
2541+
.setExpeditedIfSupported()
25422542
.build()
25432543
WorkManager.getInstance().enqueue(worker)
25442544
}
@@ -3344,7 +3344,7 @@ class ChatActivity :
33443344
val deleteConversationWorker =
33453345
OneTimeWorkRequest.Builder(DeleteConversationWorker::class.java)
33463346
.setInputData(data.build())
3347-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
3347+
.setExpeditedIfSupported()
33483348
.build()
33493349
WorkManager.getInstance().enqueue(deleteConversationWorker)
33503350

app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import androidx.lifecycle.lifecycleScope
2727
import androidx.work.Data
2828
import androidx.work.ExistingWorkPolicy
2929
import androidx.work.OneTimeWorkRequest
30-
import androidx.work.OutOfQuotaPolicy
30+
import com.nextcloud.talk.utils.setExpeditedIfSupported
3131
import androidx.work.WorkInfo
3232
import androidx.work.WorkManager
3333
import autodagger.AutoInjector
@@ -504,7 +504,7 @@ class ConversationInfoActivity : BaseActivity() {
504504
val addParticipantsWorker =
505505
OneTimeWorkRequest.Builder(AddParticipantsToConversationWorker::class.java)
506506
.setInputData(data)
507-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
507+
.setExpeditedIfSupported()
508508
.build()
509509
WorkManager.getInstance().enqueue(addParticipantsWorker)
510510
WorkManager.getInstance(context).getWorkInfoByIdLiveData(addParticipantsWorker.id)
@@ -519,7 +519,7 @@ class ConversationInfoActivity : BaseActivity() {
519519
workerData?.let { data ->
520520
val workRequest = OneTimeWorkRequest.Builder(LeaveConversationWorker::class.java)
521521
.setInputData(data)
522-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
522+
.setExpeditedIfSupported()
523523
.build()
524524
WorkManager.getInstance(context).enqueueUniqueWork(
525525
"leave_conversation_work",
@@ -594,7 +594,7 @@ class ConversationInfoActivity : BaseActivity() {
594594
WorkManager.getInstance(context).enqueue(
595595
OneTimeWorkRequest.Builder(DeleteConversationWorker::class.java)
596596
.setInputData(it)
597-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
597+
.setExpeditedIfSupported()
598598
.build()
599599
)
600600

app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import androidx.lifecycle.ViewModelProvider
3232
import androidx.lifecycle.lifecycleScope
3333
import androidx.work.Data
3434
import androidx.work.OneTimeWorkRequest
35-
import androidx.work.OutOfQuotaPolicy
35+
import com.nextcloud.talk.utils.setExpeditedIfSupported
3636
import androidx.work.WorkInfo
3737
import androidx.work.WorkManager
3838
import autodagger.AutoInjector
@@ -1231,7 +1231,7 @@ class ConversationsListActivity : BaseActivity() {
12311231
.build()
12321232
val worker = OneTimeWorkRequest.Builder(LeaveConversationWorker::class.java)
12331233
.setInputData(data)
1234-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
1234+
.setExpeditedIfSupported()
12351235
.build()
12361236
WorkManager.getInstance().enqueue(worker)
12371237
WorkManager.getInstance(this).getWorkInfoByIdLiveData(worker.id).observeForever { workInfo ->
@@ -1336,7 +1336,7 @@ class ConversationsListActivity : BaseActivity() {
13361336
private fun deleteUserAndRestartApp() {
13371337
userManager.scheduleUserForDeletionWithId(currentUser!!.id!!).blockingGet()
13381338
val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java)
1339-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
1339+
.setExpeditedIfSupported()
13401340
.build()
13411341
WorkManager.getInstance(applicationContext).enqueue(accountRemovalWork)
13421342

@@ -1476,7 +1476,7 @@ class ConversationsListActivity : BaseActivity() {
14761476
val deleteConversationWorker =
14771477
OneTimeWorkRequest.Builder(DeleteConversationWorker::class.java)
14781478
.setInputData(data.build())
1479-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
1479+
.setExpeditedIfSupported()
14801480
.build()
14811481
WorkManager.getInstance().enqueue(deleteConversationWorker)
14821482

app/src/main/java/com/nextcloud/talk/jobs/ChatMessageCatchUpWorker.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import androidx.work.CoroutineWorker
1515
import androidx.work.Data
1616
import androidx.work.NetworkType
1717
import androidx.work.OneTimeWorkRequest
18-
import androidx.work.OutOfQuotaPolicy
18+
import com.nextcloud.talk.utils.setExpeditedIfSupported
1919
import androidx.work.WorkManager
2020
import androidx.work.WorkRequest
2121
import androidx.work.WorkerParameters
@@ -148,7 +148,7 @@ class ChatMessageCatchUpWorker(context: Context, workerParams: WorkerParameters)
148148
.setInputData(data)
149149
.setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
150150
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, WorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)
151-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
151+
.setExpeditedIfSupported()
152152
.build()
153153

154154
WorkManager.getInstance(context).enqueue(catchUpWork)

app/src/main/java/com/nextcloud/talk/jobs/PushRegistrationWorker.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import android.content.Context
1111
import android.util.Log
1212
import androidx.work.Data
1313
import androidx.work.OneTimeWorkRequest
14-
import androidx.work.OutOfQuotaPolicy
14+
import com.nextcloud.talk.utils.setExpeditedIfSupported
1515
import androidx.work.WorkManager
1616
import androidx.work.Worker
1717
import androidx.work.WorkerParameters
@@ -287,7 +287,7 @@ class PushRegistrationWorker(context: Context, workerParams: WorkerParameters) :
287287
.build()
288288
val notificationWork =
289289
OneTimeWorkRequest.Builder(NotificationWorker::class.java).setInputData(messageData)
290-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
290+
.setExpeditedIfSupported()
291291
.build()
292292
WorkManager.getInstance(applicationContext).enqueue(notificationWork)
293293
}

app/src/main/java/com/nextcloud/talk/jobs/ShareOperationWorker.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import android.content.Context
1111
import android.util.Log
1212
import androidx.work.Data
1313
import androidx.work.OneTimeWorkRequest
14-
import androidx.work.OutOfQuotaPolicy
14+
import com.nextcloud.talk.utils.setExpeditedIfSupported
1515
import androidx.work.WorkManager
1616
import androidx.work.Worker
1717
import androidx.work.WorkerParameters
@@ -120,7 +120,7 @@ class ShareOperationWorker(context: Context, workerParams: WorkerParameters) : W
120120
.build()
121121
val shareWorker = OneTimeWorkRequest.Builder(ShareOperationWorker::class.java)
122122
.setInputData(data)
123-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
123+
.setExpeditedIfSupported()
124124
.build()
125125
WorkManager.getInstance().enqueue(shareWorker)
126126
}

app/src/main/java/com/nextcloud/talk/mediaviewer/viewmodels/MediaViewerViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import androidx.lifecycle.asFlow
1212
import androidx.lifecycle.viewModelScope
1313
import androidx.work.Data
1414
import androidx.work.OneTimeWorkRequest
15-
import androidx.work.OutOfQuotaPolicy
15+
import com.nextcloud.talk.utils.setExpeditedIfSupported
1616
import androidx.work.WorkInfo
1717
import androidx.work.WorkManager
1818
import com.nextcloud.talk.application.NextcloudTalkApplication
@@ -152,7 +152,7 @@ class MediaViewerViewModel @Inject constructor(private val sharedItemsRepository
152152
val request = OneTimeWorkRequest.Builder(DownloadFileToCacheWorker::class.java)
153153
.setInputData(data)
154154
.addTag(item.fileId)
155-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
155+
.setExpeditedIfSupported()
156156
.build()
157157
WorkManager.getInstance(context).enqueue(request)
158158

app/src/main/java/com/nextcloud/talk/services/UnifiedPushService.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ package com.nextcloud.talk.services
1010
import android.util.Log
1111
import androidx.work.Data
1212
import androidx.work.OneTimeWorkRequest
13-
import androidx.work.OutOfQuotaPolicy
13+
import com.nextcloud.talk.utils.setExpeditedIfSupported
1414
import androidx.work.WorkManager
1515
import com.nextcloud.talk.jobs.NotificationWorker
1616
import com.nextcloud.talk.jobs.PushRegistrationWorker
@@ -56,7 +56,7 @@ class UnifiedPushService : PushService() {
5656
.build()
5757
val notificationWork =
5858
OneTimeWorkRequest.Builder(NotificationWorker::class.java).setInputData(messageData)
59-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
59+
.setExpeditedIfSupported()
6060
.build()
6161
WorkManager.getInstance(this).enqueue(notificationWork)
6262
}

0 commit comments

Comments
 (0)