diff --git a/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt b/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt index 196ea6a..dceec31 100644 --- a/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt +++ b/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt @@ -13,6 +13,7 @@ import androidx.work.PeriodicWorkRequest import androidx.work.WorkRequest import dev.fluttercommunity.workmanager.WorkManagerCall.CancelTask.ByTag.KEYS.UNREGISTER_TASK_TAG_KEY import dev.fluttercommunity.workmanager.WorkManagerCall.CancelTask.ByUniqueName.KEYS.UNREGISTER_TASK_UNIQUE_NAME_KEY +import dev.fluttercommunity.workmanager.WorkManagerCall.IsScheduled.ByUniqueName.KEYS.IS_SCHEDULED_UNIQUE_NAME_KEY import dev.fluttercommunity.workmanager.WorkManagerCall.Initialize.KEYS.INITIALIZE_TASK_CALL_HANDLE_KEY import dev.fluttercommunity.workmanager.WorkManagerCall.Initialize.KEYS.INITIALIZE_TASK_IS_IN_DEBUG_MODE_KEY import dev.fluttercommunity.workmanager.WorkManagerCall.RegisterTask.KEYS.REGISTER_TASK_BACK_OFF_POLICY_DELAY_MILLIS_KEY @@ -131,6 +132,14 @@ sealed class WorkManagerCall { } } + sealed class IsScheduled : WorkManagerCall() { + data class ByUniqueName(val uniqueName: String) : IsScheduled() { + companion object KEYS { + const val IS_SCHEDULED_UNIQUE_NAME_KEY = "uniqueName" + } + } + } + sealed class CancelTask : WorkManagerCall() { data class ByUniqueName(val uniqueName: String) : CancelTask() { companion object KEYS { @@ -164,6 +173,8 @@ object Extractor { REGISTER_ONE_OFF_TASK("registerOneOffTask"), REGISTER_PERIODIC_TASK("registerPeriodicTask"), + IS_SCHEDULED_BY_UNIQUE_NAME("isScheduledByUniqueName"), + CANCEL_TASK_BY_UNIQUE_NAME("cancelTaskByUniqueName"), CANCEL_TASK_BY_TAG("cancelTaskByTag"), CANCEL_ALL("cancelAllTasks"), @@ -228,6 +239,12 @@ object Extractor { ) } + PossibleWorkManagerCall.IS_SCHEDULED_BY_UNIQUE_NAME -> { + WorkManagerCall.IsScheduled.ByUniqueName( + call.argument(IS_SCHEDULED_UNIQUE_NAME_KEY)!! + ) + } + PossibleWorkManagerCall.CANCEL_TASK_BY_UNIQUE_NAME -> WorkManagerCall.CancelTask.ByUniqueName( call.argument(UNREGISTER_TASK_UNIQUE_NAME_KEY)!! ) diff --git a/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt b/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt index c9054e4..0f96424 100644 --- a/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt +++ b/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt @@ -8,6 +8,7 @@ import androidx.work.ExistingWorkPolicy import androidx.work.OneTimeWorkRequest import androidx.work.OutOfQuotaPolicy import androidx.work.PeriodicWorkRequest +import androidx.work.WorkInfo import androidx.work.WorkManager import dev.fluttercommunity.workmanager.BackgroundWorker.Companion.DART_TASK_KEY import dev.fluttercommunity.workmanager.BackgroundWorker.Companion.IS_IN_DEBUG_MODE_KEY @@ -36,6 +37,11 @@ class WorkmanagerCallHandler(private val ctx: Context) : MethodChannel.MethodCal extractedCall, result ) + is WorkManagerCall.IsScheduled -> IsScheduledHandler.handle( + ctx, + extractedCall, + result + ) is WorkManagerCall.CancelTask -> UnregisterTaskHandler.handle( ctx, extractedCall, @@ -140,6 +146,23 @@ private object RegisterTaskHandler : CallHandler { } } +private object IsScheduledHandler : CallHandler { + override fun handle( + context: Context, + convertedCall: WorkManagerCall.IsScheduled, + result: MethodChannel.Result + ) { + when (convertedCall) { + is WorkManagerCall.IsScheduled.ByUniqueName -> { + val workInfos = WM.getWorkInfoByUniqueName(context, convertedCall.uniqueName).get() + val scheduled = workInfos.isNotEmpty() + && workInfos.all { it.state == WorkInfo.State.ENQUEUED || it.state == WorkInfo.State.RUNNING } + return result.success(scheduled) + } + } + } +} + private object UnregisterTaskHandler : CallHandler { override fun handle( context: Context, @@ -274,6 +297,9 @@ object WM { .build() } + fun getWorkInfoByUniqueName(context: Context, uniqueWorkName: String) = + context.workManager().getWorkInfosForUniqueWork(uniqueWorkName) + fun cancelByUniqueName(context: Context, uniqueWorkName: String) = context.workManager().cancelUniqueWork(uniqueWorkName) diff --git a/example/lib/main.dart b/example/lib/main.dart index 2574ea1..d626796 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -141,7 +141,11 @@ class _MyAppState extends State { } }, ), - SizedBox(height: 16), + SizedBox(height: 8), + Text( + "Register task", + style: Theme.of(context).textTheme.headlineSmall, + ), //This task runs once. //Most likely this will trigger immediately @@ -194,6 +198,10 @@ class _MyAppState extends State { ); }), SizedBox(height: 8), + Text( + "Register periodic task (android only)", + style: Theme.of(context).textTheme.headlineSmall, + ), //This task runs periodically //It will wait at least 10 seconds before its first launch //Since we have not provided a frequency it will be the default 15 minutes @@ -265,6 +273,17 @@ class _MyAppState extends State { : null, ), SizedBox(height: 16), + ElevatedButton( + child: Text("isscheduled (Android)"), + onPressed: Platform.isAndroid + ? () async { + final workInfo = await Workmanager().isScheduledByUniqueName( + simplePeriodicTask, + ); + print('isscheduled = $workInfo'); + } + : null), + SizedBox(height: 8), Text( "Task cancellation", style: Theme.of(context).textTheme.headlineSmall, diff --git a/lib/src/workmanager.dart b/lib/src/workmanager.dart index 5cec5b5..2faad2d 100644 --- a/lib/src/workmanager.dart +++ b/lib/src/workmanager.dart @@ -275,6 +275,17 @@ class Workmanager { ), ); + /// Checks whether a period task is scheduled by its [uniqueName]. + /// + /// Scheduled means the work state is either ENQUEUED or RUNNING + /// + /// Only available on Android. + Future isScheduledByUniqueName(final String uniqueName) async { + return await _foregroundChannel.invokeMethod( + "isScheduledByUniqueName", + {"uniqueName": uniqueName}, + ); + /// Schedule a background long running task, currently only available on iOS. /// /// Processing tasks are for long processes like data processing and app maintenance.