the great warrior
05/09/2023, 2:19 AMthe great warrior
05/09/2023, 2:20 AM@HiltWorker
class RescheduleAlarmWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted params: WorkerParameters,
private val alarmRepository: AlarmRepository,
private val scheduleAlarmManager: ScheduleAlarmManager,
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
alarmRepository.alarmsList.buffer().collect { alarmsList ->
for (alarm in alarmsList) {
if (alarm.isScheduled) {
scheduleAlarmManager.schedule(alarm)
}
}
}
Result.success()
} catch (throwable: Throwable) {
Log.e(TAG, "doWork: failure")
Result.failure()
}
}
}
private const val TAG = "RescheduleAlarmWorker"
RescheduleAlarmWorkerFactory
class RescheduleAlarmWorkerFactory @Inject constructor(
private val alarmRepository: AlarmRepository,
private val scheduleAlarmManager: ScheduleAlarmManager
) : WorkerFactory() {
override fun createWorker(
appContext: Context,
workerClassName: String,
workerParameters: WorkerParameters,
): ListenableWorker? {
return RescheduleAlarmWorker(appContext, workerParameters, alarmRepository, scheduleAlarmManager)
}
}
WorkManagerInitializer
@Module
@InstallIn(SingletonComponent::class)
object WorkManagerInitializer : Initializer<WorkManager> {
@Provides
@Singleton
override fun create(@ApplicationContext context: Context): WorkManager {
val configuration = Configuration.Builder().build()
WorkManager.initialize(context, configuration)
Log.d("Hilt Init", "WorkManager initialized by Hilt this time")
return WorkManager.getInstance(context)
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
ClockApplication
@HiltAndroidApp
class ClockApplication : Application(), Configuration.Provider {
@Inject lateinit var rescheduleAlarmWorkerFactory: RescheduleAlarmWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setMinimumLoggingLevel(Log.DEBUG)
.setWorkerFactory(rescheduleAlarmWorkerFactory)
.build()
}
Manifest
<application ... <provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
</application>
Build.gradle
implementation 'com.google.dagger:hilt-android:2.45'
kapt 'com.google.dagger:hilt-compiler:2.45'
implementation "androidx.hilt:hilt-navigation-compose:1.0.0"
implementation 'androidx.hilt:hilt-work:1.0.0'
kapt 'androidx.hilt:hilt-compiler:1.0.0'
AlarmBroadcastReceiver
@AndroidEntryPoint
class AlarmBroadcastReceiver : BroadcastReceiver() {
@Inject
lateinit var serviceManager: ServiceManager
@Inject
lateinit var scheduleAlarmManager: ScheduleAlarmManager
@Inject
lateinit var alarmRepository: AlarmRepository
@Inject
lateinit var workManager: WorkManager
override fun onReceive(p0: Context?, p1: Intent?) {
safeLet(p0, p1) { context, intent ->
when (intent.action) {
"android.intent.action.BOOT_COMPLETED" -> {
with(Dispatchers.Main) {
val rescheduleAlarmBuilder = OneTimeWorkRequestBuilder<RescheduleAlarmWorker>().build()
workManager.enqueue(rescheduleAlarmBuilder)
}
} ...