From 23ad0315a639e736ba94e1f2bea44d2eac7a97c1 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 22:43:33 +0100 Subject: [PATCH 01/12] restructure --- .github/workflows/format.yml | 2 +- .github/workflows/test.yml | 1 + example/android/app/build.gradle | 4 +-- example/ios/Flutter/AppFrameworkInfo.plist | 2 +- example/ios/Flutter/Flutter.podspec | 6 ++-- example/ios/Podfile | 2 +- example/ios/Podfile.lock | 20 ++++++------ example/ios/Runner.xcodeproj/project.pbxproj | 3 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- example/pubspec.yaml | 4 +-- example/pubspec_overrides.yaml | 4 +++ melos.yaml | 10 ++++++ pubspec.yaml | 32 ++----------------- .metadata => workmanager/.metadata | 0 CHANGELOG.md => workmanager/CHANGELOG.md | 0 .../analysis_options.yml | 0 {android => workmanager/android}/.gitignore | 0 {android => workmanager/android}/build.gradle | 0 .../android}/gradle.properties | 0 .../android}/settings.gradle | 0 .../android}/src/main/AndroidManifest.xml | 0 .../workmanager/BackgroundWorker.kt | 0 .../workmanager/DebugHelper.kt | 0 .../fluttercommunity/workmanager/Extractor.kt | 0 .../workmanager/SharedPreferenceHelper.kt | 0 .../workmanager/WorkmanagerCallHandler.kt | 0 .../workmanager/WorkmanagerPlugin.kt | 0 .../android}/src/test/java/ExtractorTests.kt | 0 {ios => workmanager/ios}/.gitignore | 0 {ios => workmanager/ios}/Assets/.gitkeep | 0 .../Classes/BackgroundTaskOperation.swift | 0 .../ios}/Classes/BackgroundWorker.swift | 0 .../CheckBackgroundRefreshPermission.swift | 0 .../Classes/DebugNotificationHelper.swift | 0 .../ios}/Classes/Extensions.swift | 0 .../ios}/Classes/NetworkType.swift | 0 .../ios}/Classes/SimpleLogger.swift | 0 .../ios}/Classes/SwiftWorkmanagerPlugin.swift | 0 .../ios}/Classes/ThumbnailGenerator.swift | 0 .../ios}/Classes/UserDefaultsHelper.swift | 0 .../ios}/Classes/WMPError.swift | 0 .../ios}/Classes/WorkmanagerPlugin.h | 0 .../ios}/Classes/WorkmanagerPlugin.m | 0 {ios => workmanager/ios}/workmanager.podspec | 0 {lib => workmanager/lib}/src/options.dart | 0 {lib => workmanager/lib}/src/workmanager.dart | 0 {lib => workmanager/lib}/workmanager.dart | 0 workmanager/pubspec.yaml | 32 +++++++++++++++++++ .../test}/json_mapper_helper_test.dart | 0 .../test}/workmanager_test.dart | 0 .../test}/workmanager_test.mocks.dart | 0 51 files changed, 72 insertions(+), 52 deletions(-) create mode 100644 example/pubspec_overrides.yaml create mode 100644 melos.yaml rename .metadata => workmanager/.metadata (100%) rename CHANGELOG.md => workmanager/CHANGELOG.md (100%) rename analysis_options.yml => workmanager/analysis_options.yml (100%) rename {android => workmanager/android}/.gitignore (100%) rename {android => workmanager/android}/build.gradle (100%) rename {android => workmanager/android}/gradle.properties (100%) rename {android => workmanager/android}/settings.gradle (100%) rename {android => workmanager/android}/src/main/AndroidManifest.xml (100%) rename {android => workmanager/android}/src/main/kotlin/dev/fluttercommunity/workmanager/BackgroundWorker.kt (100%) rename {android => workmanager/android}/src/main/kotlin/dev/fluttercommunity/workmanager/DebugHelper.kt (100%) rename {android => workmanager/android}/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt (100%) rename {android => workmanager/android}/src/main/kotlin/dev/fluttercommunity/workmanager/SharedPreferenceHelper.kt (100%) rename {android => workmanager/android}/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt (100%) rename {android => workmanager/android}/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerPlugin.kt (100%) rename {android => workmanager/android}/src/test/java/ExtractorTests.kt (100%) rename {ios => workmanager/ios}/.gitignore (100%) rename {ios => workmanager/ios}/Assets/.gitkeep (100%) rename {ios => workmanager/ios}/Classes/BackgroundTaskOperation.swift (100%) rename {ios => workmanager/ios}/Classes/BackgroundWorker.swift (100%) rename {ios => workmanager/ios}/Classes/CheckBackgroundRefreshPermission.swift (100%) rename {ios => workmanager/ios}/Classes/DebugNotificationHelper.swift (100%) rename {ios => workmanager/ios}/Classes/Extensions.swift (100%) rename {ios => workmanager/ios}/Classes/NetworkType.swift (100%) rename {ios => workmanager/ios}/Classes/SimpleLogger.swift (100%) rename {ios => workmanager/ios}/Classes/SwiftWorkmanagerPlugin.swift (100%) rename {ios => workmanager/ios}/Classes/ThumbnailGenerator.swift (100%) rename {ios => workmanager/ios}/Classes/UserDefaultsHelper.swift (100%) rename {ios => workmanager/ios}/Classes/WMPError.swift (100%) rename {ios => workmanager/ios}/Classes/WorkmanagerPlugin.h (100%) rename {ios => workmanager/ios}/Classes/WorkmanagerPlugin.m (100%) rename {ios => workmanager/ios}/workmanager.podspec (100%) rename {lib => workmanager/lib}/src/options.dart (100%) rename {lib => workmanager/lib}/src/workmanager.dart (100%) rename {lib => workmanager/lib}/workmanager.dart (100%) create mode 100644 workmanager/pubspec.yaml rename {test => workmanager/test}/json_mapper_helper_test.dart (100%) rename {test => workmanager/test}/workmanager_test.dart (100%) rename {test => workmanager/test}/workmanager_test.mocks.dart (100%) diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index d03b8e21..69c6d769 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -23,7 +23,7 @@ jobs: steps: - name: "checkout" - - uses: actions/checkout@v4 + uses: actions/checkout@v4 - name: "ktlint" uses: "vroy/gha-kotlin-linter@v1" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d3943c45..9063cdd6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,6 +16,7 @@ jobs: channel: 'stable' - name: Test run: | + cd workmanager flutter pub get flutter test diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index e878147f..769e3794 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -37,9 +37,9 @@ android { defaultConfig { applicationId "dev.fluttercommunity.workmanager.example" - compileSdk 33 + compileSdk 34 minSdkVersion 19 - targetSdkVersion 33 + targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist index 4f8d4d24..8c6e5614 100644 --- a/example/ios/Flutter/AppFrameworkInfo.plist +++ b/example/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/example/ios/Flutter/Flutter.podspec b/example/ios/Flutter/Flutter.podspec index 8ce43943..98e16339 100644 --- a/example/ios/Flutter/Flutter.podspec +++ b/example/ios/Flutter/Flutter.podspec @@ -1,6 +1,6 @@ # -# NOTE: This podspec is NOT to be published. It is only used as a local source! -# This is a generated file; do not edit or check into version control. +# This podspec is NOT to be published. It is only used as a local source! +# This is a generated file; do not edit or check into version control. # Pod::Spec.new do |s| @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.license = { :type => 'BSD' } s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } - s.ios.deployment_target = '11.0' + s.ios.deployment_target = '12.0' # Framework linking is handled by Flutter tooling, not CocoaPods. # Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs. s.vendored_frameworks = 'path/to/nothing' diff --git a/example/ios/Podfile b/example/ios/Podfile index ca35e86a..d58567a0 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '11.0' +platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index d973a3cd..8401fc3e 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -14,8 +14,8 @@ PODS: DEPENDENCIES: - Flutter (from `Flutter`) - integration_test (from `.symlinks/plugins/integration_test/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - workmanager (from `.symlinks/plugins/workmanager/ios`) EXTERNAL SOURCES: @@ -24,19 +24,19 @@ EXTERNAL SOURCES: integration_test: :path: ".symlinks/plugins/integration_test/ios" path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/ios" + :path: ".symlinks/plugins/path_provider_foundation/darwin" shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/ios" + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" workmanager: :path: ".symlinks/plugins/workmanager/ios" SPEC CHECKSUMS: - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - integration_test: a1e7d09bd98eca2fc37aefd79d4f41ad37bdbbe5 - path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9 - shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + integration_test: 13825b8a9334a850581300559b8839134b124670 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6 -PODFILE CHECKSUM: 1f97605dfe28dbf01a36d8763312d21d5d00222c +PODFILE CHECKSUM: b63d507eb7cc768afa26646638aaf07f371f6370 -COCOAPODS: 1.12.0 +COCOAPODS: 1.14.3 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index d0b9ce96..398caff3 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -226,7 +226,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1250; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -307,6 +307,7 @@ files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7261287f..6b988772 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ =3.1.2 <4.0.0' - flutter: ">=2.5.0" - -dependencies: - flutter: - sdk: flutter - + sdk: '>=2.17.0 <3.0.0' dev_dependencies: - build_runner: ^2.1.7 - test: ^1.16.3 - mockito: ^5.0.4 - get_it: ^7.2.0 - flutter_test: - sdk: flutter - flutter_lints: ^2.0.1 - -flutter: - plugin: - platforms: - android: - package: dev.fluttercommunity.workmanager - pluginClass: WorkmanagerPlugin - ios: - pluginClass: WorkmanagerPlugin + melos: ^3.1.0 diff --git a/.metadata b/workmanager/.metadata similarity index 100% rename from .metadata rename to workmanager/.metadata diff --git a/CHANGELOG.md b/workmanager/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to workmanager/CHANGELOG.md diff --git a/analysis_options.yml b/workmanager/analysis_options.yml similarity index 100% rename from analysis_options.yml rename to workmanager/analysis_options.yml diff --git a/android/.gitignore b/workmanager/android/.gitignore similarity index 100% rename from android/.gitignore rename to workmanager/android/.gitignore diff --git a/android/build.gradle b/workmanager/android/build.gradle similarity index 100% rename from android/build.gradle rename to workmanager/android/build.gradle diff --git a/android/gradle.properties b/workmanager/android/gradle.properties similarity index 100% rename from android/gradle.properties rename to workmanager/android/gradle.properties diff --git a/android/settings.gradle b/workmanager/android/settings.gradle similarity index 100% rename from android/settings.gradle rename to workmanager/android/settings.gradle diff --git a/android/src/main/AndroidManifest.xml b/workmanager/android/src/main/AndroidManifest.xml similarity index 100% rename from android/src/main/AndroidManifest.xml rename to workmanager/android/src/main/AndroidManifest.xml diff --git a/android/src/main/kotlin/dev/fluttercommunity/workmanager/BackgroundWorker.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/BackgroundWorker.kt similarity index 100% rename from android/src/main/kotlin/dev/fluttercommunity/workmanager/BackgroundWorker.kt rename to workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/BackgroundWorker.kt diff --git a/android/src/main/kotlin/dev/fluttercommunity/workmanager/DebugHelper.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/DebugHelper.kt similarity index 100% rename from android/src/main/kotlin/dev/fluttercommunity/workmanager/DebugHelper.kt rename to workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/DebugHelper.kt diff --git a/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt similarity index 100% rename from android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt rename to workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt diff --git a/android/src/main/kotlin/dev/fluttercommunity/workmanager/SharedPreferenceHelper.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/SharedPreferenceHelper.kt similarity index 100% rename from android/src/main/kotlin/dev/fluttercommunity/workmanager/SharedPreferenceHelper.kt rename to workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/SharedPreferenceHelper.kt diff --git a/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt similarity index 100% rename from android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt rename to workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt diff --git a/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerPlugin.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerPlugin.kt similarity index 100% rename from android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerPlugin.kt rename to workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerPlugin.kt diff --git a/android/src/test/java/ExtractorTests.kt b/workmanager/android/src/test/java/ExtractorTests.kt similarity index 100% rename from android/src/test/java/ExtractorTests.kt rename to workmanager/android/src/test/java/ExtractorTests.kt diff --git a/ios/.gitignore b/workmanager/ios/.gitignore similarity index 100% rename from ios/.gitignore rename to workmanager/ios/.gitignore diff --git a/ios/Assets/.gitkeep b/workmanager/ios/Assets/.gitkeep similarity index 100% rename from ios/Assets/.gitkeep rename to workmanager/ios/Assets/.gitkeep diff --git a/ios/Classes/BackgroundTaskOperation.swift b/workmanager/ios/Classes/BackgroundTaskOperation.swift similarity index 100% rename from ios/Classes/BackgroundTaskOperation.swift rename to workmanager/ios/Classes/BackgroundTaskOperation.swift diff --git a/ios/Classes/BackgroundWorker.swift b/workmanager/ios/Classes/BackgroundWorker.swift similarity index 100% rename from ios/Classes/BackgroundWorker.swift rename to workmanager/ios/Classes/BackgroundWorker.swift diff --git a/ios/Classes/CheckBackgroundRefreshPermission.swift b/workmanager/ios/Classes/CheckBackgroundRefreshPermission.swift similarity index 100% rename from ios/Classes/CheckBackgroundRefreshPermission.swift rename to workmanager/ios/Classes/CheckBackgroundRefreshPermission.swift diff --git a/ios/Classes/DebugNotificationHelper.swift b/workmanager/ios/Classes/DebugNotificationHelper.swift similarity index 100% rename from ios/Classes/DebugNotificationHelper.swift rename to workmanager/ios/Classes/DebugNotificationHelper.swift diff --git a/ios/Classes/Extensions.swift b/workmanager/ios/Classes/Extensions.swift similarity index 100% rename from ios/Classes/Extensions.swift rename to workmanager/ios/Classes/Extensions.swift diff --git a/ios/Classes/NetworkType.swift b/workmanager/ios/Classes/NetworkType.swift similarity index 100% rename from ios/Classes/NetworkType.swift rename to workmanager/ios/Classes/NetworkType.swift diff --git a/ios/Classes/SimpleLogger.swift b/workmanager/ios/Classes/SimpleLogger.swift similarity index 100% rename from ios/Classes/SimpleLogger.swift rename to workmanager/ios/Classes/SimpleLogger.swift diff --git a/ios/Classes/SwiftWorkmanagerPlugin.swift b/workmanager/ios/Classes/SwiftWorkmanagerPlugin.swift similarity index 100% rename from ios/Classes/SwiftWorkmanagerPlugin.swift rename to workmanager/ios/Classes/SwiftWorkmanagerPlugin.swift diff --git a/ios/Classes/ThumbnailGenerator.swift b/workmanager/ios/Classes/ThumbnailGenerator.swift similarity index 100% rename from ios/Classes/ThumbnailGenerator.swift rename to workmanager/ios/Classes/ThumbnailGenerator.swift diff --git a/ios/Classes/UserDefaultsHelper.swift b/workmanager/ios/Classes/UserDefaultsHelper.swift similarity index 100% rename from ios/Classes/UserDefaultsHelper.swift rename to workmanager/ios/Classes/UserDefaultsHelper.swift diff --git a/ios/Classes/WMPError.swift b/workmanager/ios/Classes/WMPError.swift similarity index 100% rename from ios/Classes/WMPError.swift rename to workmanager/ios/Classes/WMPError.swift diff --git a/ios/Classes/WorkmanagerPlugin.h b/workmanager/ios/Classes/WorkmanagerPlugin.h similarity index 100% rename from ios/Classes/WorkmanagerPlugin.h rename to workmanager/ios/Classes/WorkmanagerPlugin.h diff --git a/ios/Classes/WorkmanagerPlugin.m b/workmanager/ios/Classes/WorkmanagerPlugin.m similarity index 100% rename from ios/Classes/WorkmanagerPlugin.m rename to workmanager/ios/Classes/WorkmanagerPlugin.m diff --git a/ios/workmanager.podspec b/workmanager/ios/workmanager.podspec similarity index 100% rename from ios/workmanager.podspec rename to workmanager/ios/workmanager.podspec diff --git a/lib/src/options.dart b/workmanager/lib/src/options.dart similarity index 100% rename from lib/src/options.dart rename to workmanager/lib/src/options.dart diff --git a/lib/src/workmanager.dart b/workmanager/lib/src/workmanager.dart similarity index 100% rename from lib/src/workmanager.dart rename to workmanager/lib/src/workmanager.dart diff --git a/lib/workmanager.dart b/workmanager/lib/workmanager.dart similarity index 100% rename from lib/workmanager.dart rename to workmanager/lib/workmanager.dart diff --git a/workmanager/pubspec.yaml b/workmanager/pubspec.yaml new file mode 100644 index 00000000..8fbc2298 --- /dev/null +++ b/workmanager/pubspec.yaml @@ -0,0 +1,32 @@ +name: workmanager +description: Flutter Workmanager. This plugin allows you to schedule background work on Android and iOS. +version: 0.5.2 +homepage: https://github.com/fluttercommunity/flutter_workmanager +repository: https://github.com/fluttercommunity/flutter_workmanager +issue_tracker: https://github.com/fluttercommunity/flutter_workmanager/issues + +environment: + sdk: '>=3.1.2 <4.0.0' + flutter: ">=2.5.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + build_runner: ^2.1.7 + test: ^1.16.3 + mockito: ^5.0.4 + get_it: ^7.2.0 + flutter_test: + sdk: flutter + flutter_lints: ^2.0.1 + +flutter: + plugin: + platforms: + android: + package: dev.fluttercommunity.workmanager + pluginClass: WorkmanagerPlugin + ios: + pluginClass: WorkmanagerPlugin diff --git a/test/json_mapper_helper_test.dart b/workmanager/test/json_mapper_helper_test.dart similarity index 100% rename from test/json_mapper_helper_test.dart rename to workmanager/test/json_mapper_helper_test.dart diff --git a/test/workmanager_test.dart b/workmanager/test/workmanager_test.dart similarity index 100% rename from test/workmanager_test.dart rename to workmanager/test/workmanager_test.dart diff --git a/test/workmanager_test.mocks.dart b/workmanager/test/workmanager_test.mocks.dart similarity index 100% rename from test/workmanager_test.mocks.dart rename to workmanager/test/workmanager_test.mocks.dart From 7b42a9f7f464b3c924fcec314478655496f2ceb2 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 22:46:01 +0100 Subject: [PATCH 02/12] do not include override file in repo --- .gitignore | 3 +++ example/.gitignore | 2 +- example/pubspec_overrides.yaml | 4 ---- 3 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 example/pubspec_overrides.yaml diff --git a/.gitignore b/.gitignore index a412d0cc..6e9640b7 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ doc/api/*/ .fvm *.iml .dccache + + +pubspec_overrides.yaml diff --git a/example/.gitignore b/example/.gitignore index ac4a9064..413c4d2a 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -69,4 +69,4 @@ !**/ios/**/default.mode2v3 !**/ios/**/default.pbxuser !**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages \ No newline at end of file diff --git a/example/pubspec_overrides.yaml b/example/pubspec_overrides.yaml deleted file mode 100644 index 73cd1b1d..00000000 --- a/example/pubspec_overrides.yaml +++ /dev/null @@ -1,4 +0,0 @@ -# melos_managed_dependency_overrides: workmanager -dependency_overrides: - workmanager: - path: ../workmanager From 3b39f5f9d5383bd1c6d36211a5e2259f70973263 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 22:49:31 +0100 Subject: [PATCH 03/12] add ignores --- example/.gitignore | 51 ++++++++------------------------------ example/android/.gitignore | 13 ++++++++++ example/ios/.gitignore | 34 +++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 40 deletions(-) create mode 100644 example/android/.gitignore create mode 100644 example/ios/.gitignore diff --git a/example/.gitignore b/example/.gitignore index 413c4d2a..29a3a501 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -8,6 +8,7 @@ .buildlog/ .history .svn/ +migrate_working_dir/ # IntelliJ related *.iml @@ -22,51 +23,21 @@ # Flutter/Dart/Pub related **/doc/api/ +**/ios/Flutter/.last_build_id .dart_tool/ .flutter-plugins -.packages +.flutter-plugins-dependencies .pub-cache/ .pub/ /build/ -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java +# Symbolication related +app.*.symbols -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* +# Obfuscation related +app.*.map.json -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages \ No newline at end of file +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/example/android/.gitignore b/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/example/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/example/ios/.gitignore b/example/ios/.gitignore new file mode 100644 index 00000000..7a7f9873 --- /dev/null +++ b/example/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 From 5d39038503c5bb9f4dfa3a0b3bb1aa40a08a28b3 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 22:49:43 +0100 Subject: [PATCH 04/12] removed ignores files --- example/ios/Flutter/.last_build_id | 1 - example/ios/Flutter/Flutter.podspec | 18 ------------------ 2 files changed, 19 deletions(-) delete mode 100644 example/ios/Flutter/.last_build_id delete mode 100644 example/ios/Flutter/Flutter.podspec diff --git a/example/ios/Flutter/.last_build_id b/example/ios/Flutter/.last_build_id deleted file mode 100644 index 6d7ce45c..00000000 --- a/example/ios/Flutter/.last_build_id +++ /dev/null @@ -1 +0,0 @@ -e4704dc1c34044d70c8863f668207456 \ No newline at end of file diff --git a/example/ios/Flutter/Flutter.podspec b/example/ios/Flutter/Flutter.podspec deleted file mode 100644 index 98e16339..00000000 --- a/example/ios/Flutter/Flutter.podspec +++ /dev/null @@ -1,18 +0,0 @@ -# -# This podspec is NOT to be published. It is only used as a local source! -# This is a generated file; do not edit or check into version control. -# - -Pod::Spec.new do |s| - s.name = 'Flutter' - s.version = '1.0.0' - s.summary = 'A UI toolkit for beautiful and fast apps.' - s.homepage = 'https://flutter.dev' - s.license = { :type => 'BSD' } - s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } - s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } - s.ios.deployment_target = '12.0' - # Framework linking is handled by Flutter tooling, not CocoaPods. - # Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs. - s.vendored_frameworks = 'path/to/nothing' -end From 851edfccbcfc1eb31928212f68620fc5f3802078 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 22:52:49 +0100 Subject: [PATCH 05/12] clean up test --- workmanager/test/workmanager_test.dart | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/workmanager/test/workmanager_test.dart b/workmanager/test/workmanager_test.dart index 4fd7615c..44a98ca7 100644 --- a/workmanager/test/workmanager_test.dart +++ b/workmanager/test/workmanager_test.dart @@ -21,16 +21,14 @@ void mySetUpWrapper() { @GenerateMocks([Workmanager]) void main() { - group( - "singleton pattern", - () => { - test("It always return the same workmanager instance", () { - final workmanager = Workmanager(); - final workmanager2 = Workmanager(); - - expect(workmanager == workmanager2, true); - }) - }); + group("singleton pattern", () { + test("It always return the same workmanager instance", () { + final workmanager = Workmanager(); + final workmanager2 = Workmanager(); + + expect(workmanager == workmanager2, true); + }); + }); group("mocked workmanager", () { setUpAll(() { From b792830ca72ea29312c31b4f04eea1c661bcd36b Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 22:58:31 +0100 Subject: [PATCH 06/12] syntax error --- workmanager/lib/src/workmanager.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workmanager/lib/src/workmanager.dart b/workmanager/lib/src/workmanager.dart index 2faad2de..74951fdc 100644 --- a/workmanager/lib/src/workmanager.dart +++ b/workmanager/lib/src/workmanager.dart @@ -278,13 +278,14 @@ 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( + return await _foregroundChannel.invokeMethod( "isScheduledByUniqueName", {"uniqueName": uniqueName}, ); + } /// Schedule a background long running task, currently only available on iOS. /// @@ -424,7 +425,7 @@ class JsonMapperHelper { "taskName": taskName, "tag": tag, "frequency": frequency?.inSeconds, - "flexInterval":flexInterval?.inSeconds, + "flexInterval": flexInterval?.inSeconds, "existingWorkPolicy": _enumToString(existingWorkPolicy), "initialDelaySeconds": initialDelay?.inSeconds, "networkType": _enumToString(constraints?.networkType), From 957fba525be05c95255d374efe05278076201f3f Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 23:01:26 +0100 Subject: [PATCH 07/12] formtting --- .../workmanager/BackgroundWorker.kt | 32 +-- .../workmanager/DebugHelper.kt | 59 +++--- .../fluttercommunity/workmanager/Extractor.kt | 117 +++++------ .../workmanager/SharedPreferenceHelper.kt | 8 +- .../workmanager/WorkmanagerCallHandler.kt | 185 ++++++++++-------- .../workmanager/WorkmanagerPlugin.kt | 6 +- .../android/src/test/java/ExtractorTests.kt | 50 ++--- 7 files changed, 251 insertions(+), 206 deletions(-) diff --git a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/BackgroundWorker.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/BackgroundWorker.kt index c433a3ff..08367891 100644 --- a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/BackgroundWorker.kt +++ b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/BackgroundWorker.kt @@ -11,7 +11,6 @@ import com.google.common.util.concurrent.ListenableFuture import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.dart.DartExecutor import io.flutter.embedding.engine.loader.FlutterLoader -import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.view.FlutterCallbackInformation @@ -24,9 +23,8 @@ import java.util.Random */ class BackgroundWorker( applicationContext: Context, - private val workerParams: WorkerParameters + private val workerParams: WorkerParameters, ) : ListenableWorker(applicationContext, workerParams), MethodChannel.MethodCallHandler { - private lateinit var backgroundChannel: MethodChannel companion object { @@ -59,10 +57,11 @@ class BackgroundWorker( private var completer: CallbackToFutureAdapter.Completer? = null - private var resolvableFuture = CallbackToFutureAdapter.getFuture { completer -> - this.completer = completer - null - } + private var resolvableFuture = + CallbackToFutureAdapter.getFuture { completer -> + this.completer = completer + null + } override fun startWork(): ListenableFuture { startTime = System.currentTimeMillis() @@ -76,7 +75,7 @@ class BackgroundWorker( flutterLoader.ensureInitializationCompleteAsync( applicationContext, null, - Handler(Looper.getMainLooper()) + Handler(Looper.getMainLooper()), ) { val callbackHandle = SharedPreferenceHelper.getCallbackHandle(applicationContext) val callbackInfo = FlutterCallbackInformation.lookupCallbackInformation(callbackHandle) @@ -90,7 +89,7 @@ class BackgroundWorker( payload, callbackHandle, callbackInfo, - dartBundlePath + dartBundlePath, ) } @@ -102,8 +101,8 @@ class BackgroundWorker( DartExecutor.DartCallback( applicationContext.assets, dartBundlePath, - callbackInfo - ) + callbackInfo, + ), ) } } @@ -125,7 +124,7 @@ class BackgroundWorker( dartTask, payload, fetchDuration, - result ?: Result.failure() + result ?: Result.failure(), ) } @@ -142,7 +141,10 @@ class BackgroundWorker( } } - override fun onMethodCall(call: MethodCall, r: MethodChannel.Result) { + override fun onMethodCall( + call: MethodCall, + r: MethodChannel.Result, + ) { when (call.method) { BACKGROUND_CHANNEL_INITIALIZED -> backgroundChannel.invokeMethod( @@ -156,7 +158,7 @@ class BackgroundWorker( override fun error( errorCode: String, errorMessage: String?, - errorDetails: Any? + errorDetails: Any?, ) { Log.e(TAG, "errorCode: $errorCode, errorMessage: $errorMessage") stopEngine(Result.failure()) @@ -166,7 +168,7 @@ class BackgroundWorker( val wasSuccessFul = receivedResult?.let { it as Boolean? } == true stopEngine(if (wasSuccessFul) Result.success() else Result.retry()) } - } + }, ) } } diff --git a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/DebugHelper.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/DebugHelper.kt index 08a200b1..8b70c5aa 100644 --- a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/DebugHelper.kt +++ b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/DebugHelper.kt @@ -22,15 +22,14 @@ object ThumbnailGenerator { } object DebugHelper { - private const val debugChannelId = "WorkmanagerDebugChannelId" - private const val debugChannelName = "A helper channel to debug your background tasks." + private const val DEBUG_CHANNEL_ID = "WorkmanagerDebugChannelId" + private const val DEBUG_CHANNEL_NAME = "A helper channel to debug your background tasks." private val debugDateFormatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM) private val currentTime get() = debugDateFormatter.format(Date()) - private fun mapMillisToSeconds(milliseconds: Long) = - "${MILLISECONDS.toSeconds(milliseconds)} seconds." + private fun mapMillisToSeconds(milliseconds: Long) = "${MILLISECONDS.toSeconds(milliseconds)} seconds." fun postTaskCompleteNotification( ctx: Context, @@ -38,18 +37,18 @@ object DebugHelper { dartTask: String, payload: String? = null, fetchDuration: Long, - result: ListenableWorker.Result + result: ListenableWorker.Result, ) { postNotification( ctx, threadIdentifier, "${ThumbnailGenerator.workEmoji} $currentTime", """ - • Result: ${ThumbnailGenerator.mapResultToEmoji(result)} ${result.javaClass.simpleName} - • dartTask: $dartTask - • inputData: ${payload ?: "not found"} - • Elapsed time: ${mapMillisToSeconds(fetchDuration)} - """.trimIndent() + • Result: ${ThumbnailGenerator.mapResultToEmoji(result)} ${result.javaClass.simpleName} + • dartTask: $dartTask + • inputData: ${payload ?: "not found"} + • Elapsed time: ${mapMillisToSeconds(fetchDuration)} + """.trimIndent(), ) } @@ -60,40 +59,44 @@ object DebugHelper { payload: String? = null, callbackHandle: Long, callbackInfo: FlutterCallbackInformation?, - dartBundlePath: String? + dartBundlePath: String?, ) { postNotification( ctx, threadIdentifier, "${ThumbnailGenerator.workEmoji} $currentTime", """ - • dartTask: $dartTask - • inputData: ${payload ?: "not found"} - • callbackHandle: $callbackHandle - • callBackName: ${callbackInfo?.callbackName ?: "not found"} - • callbackClassName: ${callbackInfo?.callbackClassName ?: "not found"} - • callbackLibraryPath: ${callbackInfo?.callbackLibraryPath ?: "not found"} - • dartBundlePath: $dartBundlePath" - """.trimIndent() - + • dartTask: $dartTask + • inputData: ${payload ?: "not found"} + • callbackHandle: $callbackHandle + • callBackName: ${callbackInfo?.callbackName ?: "not found"} + • callbackClassName: ${callbackInfo?.callbackClassName ?: "not found"} + • callbackLibraryPath: ${callbackInfo?.callbackLibraryPath ?: "not found"} + • dartBundlePath: $dartBundlePath" + """.trimIndent(), ) } - private fun postNotification(ctx: Context, messageId: Int, title: String, contentText: String) { + private fun postNotification( + ctx: Context, + messageId: Int, + title: String, + contentText: String, + ) { (ctx.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).apply { createNotificationChannel() notify( messageId, - NotificationCompat.Builder(ctx, debugChannelId) + NotificationCompat.Builder(ctx, DEBUG_CHANNEL_ID) .setContentTitle(title) .setContentText(contentText) .setStyle( NotificationCompat.BigTextStyle() - .bigText(contentText) + .bigText(contentText), ) .setSmallIcon(android.R.drawable.stat_notify_sync) - .build() + .build(), ) } } @@ -102,10 +105,10 @@ object DebugHelper { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { createNotificationChannel( NotificationChannel( - debugChannelId, - debugChannelName, - NotificationManager.IMPORTANCE_DEFAULT - ) + DEBUG_CHANNEL_ID, + DEBUG_CHANNEL_NAME, + NotificationManager.IMPORTANCE_DEFAULT, + ), ) } } diff --git a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt index dceec313..4ac69596 100644 --- a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt +++ b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/Extractor.kt @@ -7,15 +7,14 @@ import androidx.work.Constraints import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ExistingWorkPolicy import androidx.work.NetworkType -import androidx.work.OneTimeWorkRequest import androidx.work.OutOfQuotaPolicy 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.IsScheduled.ByUniqueName.KEYS.IS_SCHEDULED_UNIQUE_NAME_KEY import dev.fluttercommunity.workmanager.WorkManagerCall.RegisterTask.KEYS.REGISTER_TASK_BACK_OFF_POLICY_DELAY_MILLIS_KEY import dev.fluttercommunity.workmanager.WorkManagerCall.RegisterTask.KEYS.REGISTER_TASK_BACK_OFF_POLICY_TYPE_KEY import dev.fluttercommunity.workmanager.WorkManagerCall.RegisterTask.KEYS.REGISTER_TASK_CONSTRAINTS_BATTERY_NOT_LOW_KEY @@ -42,25 +41,25 @@ val defaultOutOfQuotaPolicy: OutOfQuotaPolicy? = null val defaultOneOffExistingWorkPolicy = ExistingWorkPolicy.KEEP val defaultPeriodExistingWorkPolicy = ExistingPeriodicWorkPolicy.KEEP val defaultConstraints: Constraints = Constraints.NONE -const val defaultInitialDelaySeconds = 0L -const val defaultRequestedBackoffDelay = 0L -const val defaultPeriodicRefreshFrequencyInSeconds = +const val DEFAULT_INITIAL_DELAY_SECONDS = 0L +const val DEFAULT_REQUESTED_BACKOFF_DELAY = 0L +const val DEFAULT_PERIODIC_REFRESH_FREQUENCY_SECONDS = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS / 1000 -const val defaultFlexIntervalInSeconds = +const val DEFAULT_FLEX_INTERVAL_SECONDS = PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS / 1000 -const val logTag = "Extractor" +const val LOG_TAG = "Extractor" data class BackoffPolicyTaskConfig( val backoffPolicy: BackoffPolicy, private val requestedBackoffDelay: Long, private val minBackoffInMillis: Long, - val backoffDelay: Long = max(minBackoffInMillis, requestedBackoffDelay) + val backoffDelay: Long = max(minBackoffInMillis, requestedBackoffDelay), ) sealed class WorkManagerCall { data class Initialize( val callbackDispatcherHandleKey: Long, - val isInDebugMode: Boolean + val isInDebugMode: Boolean, ) : WorkManagerCall() { companion object KEYS { const val INITIALIZE_TASK_IS_IN_DEBUG_MODE_KEY = "isInDebugMode" @@ -108,7 +107,7 @@ sealed class WorkManagerCall { override val constraintsConfig: Constraints, val backoffPolicyConfig: BackoffPolicyTaskConfig?, val outOfQuotaPolicy: OutOfQuotaPolicy?, - override val payload: String? = null + override val payload: String? = null, ) : RegisterTask() data class PeriodicTask( @@ -123,7 +122,7 @@ sealed class WorkManagerCall { override val constraintsConfig: Constraints, val backoffPolicyConfig: BackoffPolicyTaskConfig?, val outOfQuotaPolicy: OutOfQuotaPolicy?, - override val payload: String? = null + override val payload: String? = null, ) : RegisterTask() { companion object KEYS { const val PERIODIC_TASK_FREQUENCY_SECONDS_KEY = "frequency" @@ -163,7 +162,7 @@ sealed class WorkManagerCall { private enum class TaskType(val minimumBackOffDelay: Long) { ONE_OFF(WorkRequest.MIN_BACKOFF_MILLIS), - PERIODIC(WorkRequest.MIN_BACKOFF_MILLIS) + PERIODIC(WorkRequest.MIN_BACKOFF_MILLIS), } object Extractor { @@ -179,7 +178,8 @@ object Extractor { CANCEL_TASK_BY_TAG("cancelTaskByTag"), CANCEL_ALL("cancelAllTasks"), - UNKNOWN(null); + UNKNOWN(null), + ; companion object { fun fromRawMethodName(methodName: String): PossibleWorkManagerCall = @@ -212,11 +212,12 @@ object Extractor { initialDelaySeconds = extractInitialDelayFromCall(call), constraintsConfig = extractConstraintConfigFromCall(call), outOfQuotaPolicy = extractOutOfQuotaPolicyFromCall(call), - backoffPolicyConfig = extractBackoffPolicyConfigFromCall( - call, - TaskType.ONE_OFF - ), - payload = extractPayload(call) + backoffPolicyConfig = + extractBackoffPolicyConfigFromCall( + call, + TaskType.ONE_OFF, + ), + payload = extractPayload(call), ) } PossibleWorkManagerCall.REGISTER_PERIODIC_TASK -> { @@ -226,33 +227,36 @@ object Extractor { taskName = call.argument(REGISTER_TASK_NAME_VALUE_KEY)!!, frequencyInSeconds = extractFrequencySecondsFromCall(call), tag = call.argument(REGISTER_TASK_TAG_KEY), - flexIntervalInSeconds =extractFlexIntervalSecondsFromCall(call) , + flexIntervalInSeconds = extractFlexIntervalSecondsFromCall(call), existingWorkPolicy = extractExistingPeriodicWorkPolicyFromCall(call), initialDelaySeconds = extractInitialDelayFromCall(call), constraintsConfig = extractConstraintConfigFromCall(call), - backoffPolicyConfig = extractBackoffPolicyConfigFromCall( - call, - TaskType.PERIODIC - ), + backoffPolicyConfig = + extractBackoffPolicyConfigFromCall( + call, + TaskType.PERIODIC, + ), outOfQuotaPolicy = extractOutOfQuotaPolicyFromCall(call), - payload = extractPayload(call) + payload = extractPayload(call), ) } PossibleWorkManagerCall.IS_SCHEDULED_BY_UNIQUE_NAME -> { WorkManagerCall.IsScheduled.ByUniqueName( - call.argument(IS_SCHEDULED_UNIQUE_NAME_KEY)!! + call.argument(IS_SCHEDULED_UNIQUE_NAME_KEY)!!, ) } - PossibleWorkManagerCall.CANCEL_TASK_BY_UNIQUE_NAME -> WorkManagerCall.CancelTask.ByUniqueName( - call.argument(UNREGISTER_TASK_UNIQUE_NAME_KEY)!! - ) - PossibleWorkManagerCall.CANCEL_TASK_BY_TAG -> WorkManagerCall.CancelTask.ByTag( - call.argument( - UNREGISTER_TASK_TAG_KEY - )!! - ) + PossibleWorkManagerCall.CANCEL_TASK_BY_UNIQUE_NAME -> + WorkManagerCall.CancelTask.ByUniqueName( + call.argument(UNREGISTER_TASK_UNIQUE_NAME_KEY)!!, + ) + PossibleWorkManagerCall.CANCEL_TASK_BY_TAG -> + WorkManagerCall.CancelTask.ByTag( + call.argument( + UNREGISTER_TASK_TAG_KEY, + )!!, + ) PossibleWorkManagerCall.CANCEL_ALL -> WorkManagerCall.CancelTask.All PossibleWorkManagerCall.UNKNOWN -> WorkManagerCall.Unknown @@ -261,7 +265,7 @@ object Extractor { private fun extractExistingWorkPolicyFromCall(call: MethodCall): ExistingWorkPolicy = try { ExistingWorkPolicy.valueOf( - call.argument(REGISTER_TASK_EXISTING_WORK_POLICY_KEY)!!.uppercase() + call.argument(REGISTER_TASK_EXISTING_WORK_POLICY_KEY)!!.uppercase(), ) } catch (ignored: Exception) { defaultOneOffExistingWorkPolicy @@ -271,8 +275,8 @@ object Extractor { try { ExistingPeriodicWorkPolicy.valueOf( call.argument( - REGISTER_TASK_EXISTING_WORK_POLICY_KEY - )!!.uppercase() + REGISTER_TASK_EXISTING_WORK_POLICY_KEY, + )!!.uppercase(), ) } catch (ignored: Exception) { defaultPeriodExistingWorkPolicy @@ -280,41 +284,42 @@ object Extractor { private fun extractFrequencySecondsFromCall(call: MethodCall) = call.argument(PERIODIC_TASK_FREQUENCY_SECONDS_KEY)?.toLong() - ?: defaultPeriodicRefreshFrequencyInSeconds + ?: DEFAULT_PERIODIC_REFRESH_FREQUENCY_SECONDS private fun extractFlexIntervalSecondsFromCall(call: MethodCall) = call.argument(PERIODIC_FLEX_INTERVAL_SECONDS_KEY)?.toLong() - ?: defaultFlexIntervalInSeconds + ?: DEFAULT_FLEX_INTERVAL_SECONDS private fun extractInitialDelayFromCall(call: MethodCall) = call.argument(REGISTER_TASK_INITIAL_DELAY_SECONDS_KEY)?.toLong() - ?: defaultInitialDelaySeconds + ?: DEFAULT_INITIAL_DELAY_SECONDS private fun extractBackoffPolicyConfigFromCall( call: MethodCall, - taskType: TaskType + taskType: TaskType, ): BackoffPolicyTaskConfig? { if (call.argument(REGISTER_TASK_BACK_OFF_POLICY_TYPE_KEY) == null) { return null } - val backoffPolicy = try { - BackoffPolicy.valueOf( - call.argument(REGISTER_TASK_BACK_OFF_POLICY_TYPE_KEY)!!.uppercase() - ) - } catch (ignored: Exception) { - defaultBackOffPolicy - } + val backoffPolicy = + try { + BackoffPolicy.valueOf( + call.argument(REGISTER_TASK_BACK_OFF_POLICY_TYPE_KEY)!!.uppercase(), + ) + } catch (ignored: Exception) { + defaultBackOffPolicy + } val requestedBackoffDelay = call.argument(REGISTER_TASK_BACK_OFF_POLICY_DELAY_MILLIS_KEY)?.toLong() - ?: defaultRequestedBackoffDelay + ?: DEFAULT_REQUESTED_BACKOFF_DELAY val minimumBackOffDelay = taskType.minimumBackOffDelay return BackoffPolicyTaskConfig( backoffPolicy, requestedBackoffDelay, - minimumBackOffDelay + minimumBackOffDelay, ) } @@ -322,7 +327,7 @@ object Extractor { fun extractOutOfQuotaPolicyFromCall(call: MethodCall): OutOfQuotaPolicy? { try { return OutOfQuotaPolicy.valueOf( - call.argument(REGISTER_TASK_OUT_OF_QUOTA_POLICY_KEY)!!.uppercase() + call.argument(REGISTER_TASK_OUT_OF_QUOTA_POLICY_KEY)!!.uppercase(), ) } catch (ignored: Exception) { return defaultOutOfQuotaPolicy @@ -334,7 +339,7 @@ object Extractor { fun extractNetworkTypeFromCall(call: MethodCall) = try { NetworkType.valueOf( - call.argument(REGISTER_TASK_CONSTRAINTS_NETWORK_TYPE_KEY)!!.uppercase() + call.argument(REGISTER_TASK_CONSTRAINTS_NETWORK_TYPE_KEY)!!.uppercase(), ) } catch (ignored: Exception) { defaultNetworkType @@ -344,10 +349,12 @@ object Extractor { val requiresBatteryNotLow = call.argument(REGISTER_TASK_CONSTRAINTS_BATTERY_NOT_LOW_KEY) ?: false - val requiresCharging = call.argument(REGISTER_TASK_CONSTRAINTS_CHARGING_KEY) - ?: false - val requiresDeviceIdle = call.argument(REGISTER_TASK_CONSTRAINTS_DEVICE_IDLE_KEY) - ?: false + val requiresCharging = + call.argument(REGISTER_TASK_CONSTRAINTS_CHARGING_KEY) + ?: false + val requiresDeviceIdle = + call.argument(REGISTER_TASK_CONSTRAINTS_DEVICE_IDLE_KEY) + ?: false val requiresStorageNotLow = call.argument(REGISTER_TASK_CONSTRAINTS_STORAGE_NOT_LOW_KEY) ?: false diff --git a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/SharedPreferenceHelper.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/SharedPreferenceHelper.kt index 0f13a08d..f0202e09 100644 --- a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/SharedPreferenceHelper.kt +++ b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/SharedPreferenceHelper.kt @@ -3,12 +3,15 @@ package dev.fluttercommunity.workmanager import android.content.Context object SharedPreferenceHelper { - private const val SHARED_PREFS_FILE_NAME = "flutter_workmanager_plugin" private const val CALLBACK_DISPATCHER_HANDLE_KEY = "be.tramckrijte.workmanager.CALLBACK_DISPATCHER_HANDLE_KEY" + private fun Context.prefs() = getSharedPreferences(SHARED_PREFS_FILE_NAME, Context.MODE_PRIVATE) - fun saveCallbackDispatcherHandleKey(ctx: Context, callbackHandle: Long) { + fun saveCallbackDispatcherHandleKey( + ctx: Context, + callbackHandle: Long, + ) { ctx.prefs() .edit() .putLong(CALLBACK_DISPATCHER_HANDLE_KEY, callbackHandle) @@ -16,7 +19,6 @@ object SharedPreferenceHelper { } fun getCallbackHandle(ctx: Context): Long { - return ctx.prefs().getLong(CALLBACK_DISPATCHER_HANDLE_KEY, -1L) } diff --git a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt index 0f964240..3b12de86 100644 --- a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt +++ b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerCallHandler.kt @@ -18,40 +18,53 @@ import io.flutter.plugin.common.MethodChannel import java.util.concurrent.TimeUnit private fun Context.workManager() = WorkManager.getInstance(this) + private fun MethodChannel.Result.success() = success(true) private interface CallHandler { - fun handle(context: Context, convertedCall: T, result: MethodChannel.Result) + fun handle( + context: Context, + convertedCall: T, + result: MethodChannel.Result, + ) } class WorkmanagerCallHandler(private val ctx: Context) : MethodChannel.MethodCallHandler { - override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + override fun onMethodCall( + call: MethodCall, + result: MethodChannel.Result, + ) { when (val extractedCall = Extractor.extractWorkManagerCallFromRawMethodName(call)) { - is WorkManagerCall.Initialize -> InitializeHandler.handle( - ctx, - extractedCall, - result - ) - is WorkManagerCall.RegisterTask -> RegisterTaskHandler.handle( - ctx, - extractedCall, - result - ) - is WorkManagerCall.IsScheduled -> IsScheduledHandler.handle( - ctx, - extractedCall, - result - ) - is WorkManagerCall.CancelTask -> UnregisterTaskHandler.handle( - ctx, - extractedCall, - result - ) - is WorkManagerCall.Failed -> FailedTaskHandler(extractedCall.code).handle( - ctx, - extractedCall, - result - ) + is WorkManagerCall.Initialize -> + InitializeHandler.handle( + ctx, + extractedCall, + result, + ) + is WorkManagerCall.RegisterTask -> + RegisterTaskHandler.handle( + ctx, + extractedCall, + result, + ) + is WorkManagerCall.IsScheduled -> + IsScheduledHandler.handle( + ctx, + extractedCall, + result, + ) + is WorkManagerCall.CancelTask -> + UnregisterTaskHandler.handle( + ctx, + extractedCall, + result, + ) + is WorkManagerCall.Failed -> + FailedTaskHandler(extractedCall.code).handle( + ctx, + extractedCall, + result, + ) is WorkManagerCall.Unknown -> UnknownTaskHandler.handle(ctx, extractedCall, result) } } @@ -61,11 +74,11 @@ private object InitializeHandler : CallHandler { override fun handle( context: Context, convertedCall: WorkManagerCall.Initialize, - result: MethodChannel.Result + result: MethodChannel.Result, ) { SharedPreferenceHelper.saveCallbackDispatcherHandleKey( context, - convertedCall.callbackDispatcherHandleKey + convertedCall.callbackDispatcherHandleKey, ) result.success() } @@ -75,7 +88,7 @@ private object RegisterTaskHandler : CallHandler { override fun handle( context: Context, convertedCall: WorkManagerCall.RegisterTask, - result: MethodChannel.Result + result: MethodChannel.Result, ) { if (!SharedPreferenceHelper.hasCallbackHandle(context)) { result.error( @@ -90,24 +103,25 @@ private object RegisterTaskHandler : CallHandler { "\n" + "\n" + "The `callbackDispatcher` is a top level function. See example in repository.", - null + null, ) return } when (convertedCall) { is WorkManagerCall.RegisterTask.OneOffTask -> enqueueOneOffTask(context, convertedCall) - is WorkManagerCall.RegisterTask.PeriodicTask -> enqueuePeriodicTask( - context, - convertedCall - ) + is WorkManagerCall.RegisterTask.PeriodicTask -> + enqueuePeriodicTask( + context, + convertedCall, + ) } result.success() } private fun enqueuePeriodicTask( context: Context, - convertedCall: WorkManagerCall.RegisterTask.PeriodicTask + convertedCall: WorkManagerCall.RegisterTask.PeriodicTask, ) { WM.enqueuePeriodicTask( context = context, @@ -122,13 +136,13 @@ private object RegisterTaskHandler : CallHandler { constraintsConfig = convertedCall.constraintsConfig, backoffPolicyConfig = convertedCall.backoffPolicyConfig, outOfQuotaPolicy = convertedCall.outOfQuotaPolicy, - payload = convertedCall.payload + payload = convertedCall.payload, ) } private fun enqueueOneOffTask( context: Context, - convertedCall: WorkManagerCall.RegisterTask.OneOffTask + convertedCall: WorkManagerCall.RegisterTask.OneOffTask, ) { WM.enqueueOneOffTask( context = context, @@ -141,7 +155,7 @@ private object RegisterTaskHandler : CallHandler { constraintsConfig = convertedCall.constraintsConfig, backoffPolicyConfig = convertedCall.backoffPolicyConfig, outOfQuotaPolicy = convertedCall.outOfQuotaPolicy, - payload = convertedCall.payload + payload = convertedCall.payload, ) } } @@ -150,13 +164,14 @@ private object IsScheduledHandler : CallHandler { override fun handle( context: Context, convertedCall: WorkManagerCall.IsScheduled, - result: MethodChannel.Result + 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 } + val scheduled = + workInfos.isNotEmpty() && + workInfos.all { it.state == WorkInfo.State.ENQUEUED || it.state == WorkInfo.State.RUNNING } return result.success(scheduled) } } @@ -167,13 +182,14 @@ private object UnregisterTaskHandler : CallHandler { override fun handle( context: Context, convertedCall: WorkManagerCall.CancelTask, - result: MethodChannel.Result + result: MethodChannel.Result, ) { when (convertedCall) { - is WorkManagerCall.CancelTask.ByUniqueName -> WM.cancelByUniqueName( - context, - convertedCall.uniqueName - ) + is WorkManagerCall.CancelTask.ByUniqueName -> + WM.cancelByUniqueName( + context, + convertedCall.uniqueName, + ) is WorkManagerCall.CancelTask.ByTag -> WM.cancelByTag(context, convertedCall.tag) WorkManagerCall.CancelTask.All -> WM.cancelAll(context) } @@ -185,7 +201,7 @@ class FailedTaskHandler(private val code: String) : CallHandler { override fun handle( context: Context, convertedCall: WorkManagerCall.Unknown, - result: MethodChannel.Result + result: MethodChannel.Result, ) { result.notImplemented() } @@ -210,29 +226,30 @@ object WM { tag: String? = null, isInDebugMode: Boolean = false, existingWorkPolicy: ExistingWorkPolicy = defaultOneOffExistingWorkPolicy, - initialDelaySeconds: Long = defaultInitialDelaySeconds, + initialDelaySeconds: Long = DEFAULT_INITIAL_DELAY_SECONDS, constraintsConfig: Constraints = defaultConstraints, outOfQuotaPolicy: OutOfQuotaPolicy? = defaultOutOfQuotaPolicy, - backoffPolicyConfig: BackoffPolicyTaskConfig? + backoffPolicyConfig: BackoffPolicyTaskConfig?, ) { - val oneOffTaskRequest = OneTimeWorkRequest.Builder(BackgroundWorker::class.java) - .setInputData(buildTaskInputData(dartTask, isInDebugMode, payload)) - .setInitialDelay(initialDelaySeconds, TimeUnit.SECONDS) - .setConstraints(constraintsConfig) - .apply { - if (backoffPolicyConfig != null) { - setBackoffCriteria( - backoffPolicyConfig.backoffPolicy, - backoffPolicyConfig.backoffDelay, - TimeUnit.MILLISECONDS - ) + val oneOffTaskRequest = + OneTimeWorkRequest.Builder(BackgroundWorker::class.java) + .setInputData(buildTaskInputData(dartTask, isInDebugMode, payload)) + .setInitialDelay(initialDelaySeconds, TimeUnit.SECONDS) + .setConstraints(constraintsConfig) + .apply { + if (backoffPolicyConfig != null) { + setBackoffCriteria( + backoffPolicyConfig.backoffPolicy, + backoffPolicyConfig.backoffDelay, + TimeUnit.MILLISECONDS, + ) + } } - } - .apply { - tag?.let(::addTag) - outOfQuotaPolicy?.let(::setExpedited) - } - .build() + .apply { + tag?.let(::addTag) + outOfQuotaPolicy?.let(::setExpedited) + } + .build() context.workManager() .enqueueUniqueWork(uniqueName, existingWorkPolicy, oneOffTaskRequest) } @@ -243,14 +260,14 @@ object WM { dartTask: String, payload: String? = null, tag: String? = null, - frequencyInSeconds: Long = defaultPeriodicRefreshFrequencyInSeconds, - flexIntervalInSeconds:Long = defaultFlexIntervalInSeconds, + frequencyInSeconds: Long = DEFAULT_PERIODIC_REFRESH_FREQUENCY_SECONDS, + flexIntervalInSeconds: Long = DEFAULT_FLEX_INTERVAL_SECONDS, isInDebugMode: Boolean = false, existingWorkPolicy: ExistingPeriodicWorkPolicy = defaultPeriodExistingWorkPolicy, - initialDelaySeconds: Long = defaultInitialDelaySeconds, + initialDelaySeconds: Long = DEFAULT_INITIAL_DELAY_SECONDS, constraintsConfig: Constraints = defaultConstraints, outOfQuotaPolicy: OutOfQuotaPolicy? = defaultOutOfQuotaPolicy, - backoffPolicyConfig: BackoffPolicyTaskConfig? + backoffPolicyConfig: BackoffPolicyTaskConfig?, ) { val periodicTaskRequest = PeriodicWorkRequest.Builder( @@ -258,7 +275,7 @@ object WM { frequencyInSeconds, TimeUnit.SECONDS, flexIntervalInSeconds, - TimeUnit.SECONDS + TimeUnit.SECONDS, ) .setInputData(buildTaskInputData(dartTask, isInDebugMode, payload)) .setInitialDelay(initialDelaySeconds, TimeUnit.SECONDS) @@ -268,7 +285,7 @@ object WM { setBackoffCriteria( backoffPolicyConfig.backoffPolicy, backoffPolicyConfig.backoffDelay, - TimeUnit.MILLISECONDS + TimeUnit.MILLISECONDS, ) } } @@ -284,7 +301,7 @@ object WM { private fun buildTaskInputData( dartTask: String, isInDebugMode: Boolean, - payload: String? + payload: String?, ): Data { return Data.Builder() .putString(DART_TASK_KEY, dartTask) @@ -297,12 +314,20 @@ object WM { .build() } - fun getWorkInfoByUniqueName(context: Context, uniqueWorkName: String) = - context.workManager().getWorkInfosForUniqueWork(uniqueWorkName) + fun getWorkInfoByUniqueName( + context: Context, + uniqueWorkName: String, + ) = context.workManager().getWorkInfosForUniqueWork(uniqueWorkName) + + fun cancelByUniqueName( + context: Context, + uniqueWorkName: String, + ) = context.workManager().cancelUniqueWork(uniqueWorkName) - fun cancelByUniqueName(context: Context, uniqueWorkName: String) = - context.workManager().cancelUniqueWork(uniqueWorkName) + fun cancelByTag( + context: Context, + tag: String, + ) = context.workManager().cancelAllWorkByTag(tag) - fun cancelByTag(context: Context, tag: String) = context.workManager().cancelAllWorkByTag(tag) fun cancelAll(context: Context) = context.workManager().cancelAllWork() } diff --git a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerPlugin.kt b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerPlugin.kt index 4ec1db6f..e81b07dc 100644 --- a/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerPlugin.kt +++ b/workmanager/android/src/main/kotlin/dev/fluttercommunity/workmanager/WorkmanagerPlugin.kt @@ -6,7 +6,6 @@ import io.flutter.plugin.common.BinaryMessenger import io.flutter.plugin.common.MethodChannel class WorkmanagerPlugin : FlutterPlugin { - private var methodChannel: MethodChannel? = null private var workmanagerCallHandler: WorkmanagerCallHandler? = null @@ -14,7 +13,10 @@ class WorkmanagerPlugin : FlutterPlugin { onAttachedToEngine(binding.applicationContext, binding.binaryMessenger) } - private fun onAttachedToEngine(context: Context, messenger: BinaryMessenger) { + private fun onAttachedToEngine( + context: Context, + messenger: BinaryMessenger, + ) { workmanagerCallHandler = WorkmanagerCallHandler(context) methodChannel = MethodChannel(messenger, "be.tramckrijte.workmanager/foreground_channel_work_manager") methodChannel?.setMethodCallHandler(workmanagerCallHandler) diff --git a/workmanager/android/src/test/java/ExtractorTests.kt b/workmanager/android/src/test/java/ExtractorTests.kt index 77dddeb9..48ef123e 100644 --- a/workmanager/android/src/test/java/ExtractorTests.kt +++ b/workmanager/android/src/test/java/ExtractorTests.kt @@ -8,40 +8,44 @@ import org.junit.Test class ExtractorTests { @Test fun shouldParseOutOfQuotaPolicyFromCall() { - val all = mapOf( - null to null, - "drop_work_request" to OutOfQuotaPolicy.DROP_WORK_REQUEST, - "run_as_non_expedited_work_request" to - OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST - ) + val all = + mapOf( + null to null, + "drop_work_request" to OutOfQuotaPolicy.DROP_WORK_REQUEST, + "run_as_non_expedited_work_request" to + OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST, + ) all.forEach { (dartString, wmConstant) -> - val call = MethodCall( - "", - mapOf("outOfQuotaPolicy" to dartString) - ) + val call = + MethodCall( + "", + mapOf("outOfQuotaPolicy" to dartString), + ) assertEquals(Extractor.extractOutOfQuotaPolicyFromCall(call), wmConstant) } } @Test fun shouldParseNetworkTypeFromCall() { - val all = mapOf( - "unmetered" to NetworkType.UNMETERED, - "metered" to NetworkType.METERED, - "not_required" to NetworkType.NOT_REQUIRED, - "not_roaming" to NetworkType.NOT_ROAMING, - "temporarily_unmetered" to NetworkType.TEMPORARILY_UNMETERED, - "connected" to NetworkType.CONNECTED - ) + val all = + mapOf( + "unmetered" to NetworkType.UNMETERED, + "metered" to NetworkType.METERED, + "not_required" to NetworkType.NOT_REQUIRED, + "not_roaming" to NetworkType.NOT_ROAMING, + "temporarily_unmetered" to NetworkType.TEMPORARILY_UNMETERED, + "connected" to NetworkType.CONNECTED, + ) all.forEach { (dartString, wmConstant) -> - val call = MethodCall( - "", - mapOf( - "networkType" to dartString + val call = + MethodCall( + "", + mapOf( + "networkType" to dartString, + ), ) - ) val constraints = Extractor.extractConstraintConfigFromCall(call) assertEquals(constraints.requiredNetworkType, wmConstant) From 334bd09abd0300e031b5d38843fabc085bff280b Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 23:02:44 +0100 Subject: [PATCH 08/12] swift formatting --- example/ios/Runner/AppDelegate.swift | 2 +- workmanager/ios/Classes/BackgroundTaskOperation.swift | 1 - workmanager/ios/Classes/BackgroundWorker.swift | 2 +- workmanager/ios/Classes/SwiftWorkmanagerPlugin.swift | 3 +-- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift index 08b909cb..d3b40c1f 100644 --- a/example/ios/Runner/AppDelegate.swift +++ b/example/ios/Runner/AppDelegate.swift @@ -23,7 +23,7 @@ import workmanager WorkmanagerPlugin.registerBGProcessingTask(withIdentifier: "be.tramckrijte.workmanagerExample.taskId") WorkmanagerPlugin.registerBGProcessingTask(withIdentifier: "be.tramckrijte.workmanagerExample.rescheduledTask") WorkmanagerPlugin.registerBGProcessingTask(withIdentifier: "be.tramckrijte.workmanagerExample.simpleDelayedTask") - WorkmanagerPlugin.registerBGProcessingTask(withIdentifier: "be.tramckrijte.workmanagerExample.iOSBackgroundProcessingTask") + WorkmanagerPlugin.registerBGProcessingTask(withIdentifier: "be.tramckrijte.workmanagerExample.iOSBackgroundProcessingTask") // When this task is scheduled from dart it will run with minimum 20 minute frequency. The // frequency is not guaranteed rather iOS will schedule it as per user's App usage pattern. diff --git a/workmanager/ios/Classes/BackgroundTaskOperation.swift b/workmanager/ios/Classes/BackgroundTaskOperation.swift index d832f139..42028092 100644 --- a/workmanager/ios/Classes/BackgroundTaskOperation.swift +++ b/workmanager/ios/Classes/BackgroundTaskOperation.swift @@ -24,7 +24,6 @@ class BackgroundTaskOperation: Operation { self.backgroundMode = backgroundMode } - override func main() { let semaphore = DispatchSemaphore(value: 0) let worker = BackgroundWorker(mode: self.backgroundMode, diff --git a/workmanager/ios/Classes/BackgroundWorker.swift b/workmanager/ios/Classes/BackgroundWorker.swift index a6aee7d8..843f4c4d 100644 --- a/workmanager/ios/Classes/BackgroundWorker.swift +++ b/workmanager/ios/Classes/BackgroundWorker.swift @@ -113,7 +113,7 @@ class BackgroundWorker { backgroundMethodChannel?.invokeMethod( BackgroundChannel.onResultSendCommand, - arguments:arguments, + arguments: arguments, result: { flutterResult in cleanupFlutterResources() let taskSessionCompleter = Date() diff --git a/workmanager/ios/Classes/SwiftWorkmanagerPlugin.swift b/workmanager/ios/Classes/SwiftWorkmanagerPlugin.swift index 03ed3e40..80b6de6c 100644 --- a/workmanager/ios/Classes/SwiftWorkmanagerPlugin.swift +++ b/workmanager/ios/Classes/SwiftWorkmanagerPlugin.swift @@ -148,7 +148,7 @@ public class SwiftWorkmanagerPlugin: FlutterPluginAppLifeCycleDelegate { /// Immediately starts a one off task @available(iOS 13.0, *) - public static func startOneOffTask(identifier: String, taskIdentifier: UIBackgroundTaskIdentifier, inputData:String, delaySeconds: Int64) { + public static func startOneOffTask(identifier: String, taskIdentifier: UIBackgroundTaskIdentifier, inputData: String, delaySeconds: Int64) { let operationQueue = OperationQueue() // Create an operation that performs the main part of the background task let operation = BackgroundTaskOperation( @@ -332,7 +332,6 @@ extension SwiftWorkmanagerPlugin: FlutterPlugin { let inputData = arguments[method.Arguments.inputData.rawValue] as? String - taskIdentifier = UIApplication.shared.beginBackgroundTask(withName: uniqueTaskIdentifier, expirationHandler: { // Mark the task as ended if time is expired, otherwise iOS might terminate and will throttle future executions UIApplication.shared.endBackgroundTask(taskIdentifier) From d1df368b9024dfcd4f7b1ad609ed9cd85982d42b Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 23:03:38 +0100 Subject: [PATCH 09/12] formatting --- example/lib/main.dart | 3 +- workmanager/test/json_mapper_helper_test.dart | 8 +---- workmanager/test/workmanager_test.mocks.dart | 29 ++++++++++++------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index d6267964..b9153421 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -277,7 +277,8 @@ class _MyAppState extends State { child: Text("isscheduled (Android)"), onPressed: Platform.isAndroid ? () async { - final workInfo = await Workmanager().isScheduledByUniqueName( + final workInfo = + await Workmanager().isScheduledByUniqueName( simplePeriodicTask, ); print('isscheduled = $workInfo'); diff --git a/workmanager/test/json_mapper_helper_test.dart b/workmanager/test/json_mapper_helper_test.dart index 924a70dd..44742e0a 100644 --- a/workmanager/test/json_mapper_helper_test.dart +++ b/workmanager/test/json_mapper_helper_test.dart @@ -48,7 +48,7 @@ void main() { 'uniqueName': 'uniqueName', 'taskName': 'taskName', 'tag': null, - 'flexInterval':null, + 'flexInterval': null, 'frequency': null, 'existingWorkPolicy': null, 'initialDelaySeconds': null, @@ -189,7 +189,6 @@ void main() { 'tag': null, 'frequency': null, 'flexInterval': null, - 'existingWorkPolicy': null, 'initialDelaySeconds': 1, 'networkType': 'connected', @@ -218,7 +217,6 @@ void main() { 'tag': null, 'frequency': null, 'flexInterval': null, - 'existingWorkPolicy': null, 'initialDelaySeconds': 1, 'networkType': 'metered', @@ -241,7 +239,6 @@ void main() { 'tag': null, 'frequency': null, 'flexInterval': null, - 'existingWorkPolicy': null, 'initialDelaySeconds': 1, 'networkType': 'metered', @@ -270,7 +267,6 @@ void main() { 'tag': null, 'frequency': null, 'flexInterval': null, - 'existingWorkPolicy': null, 'initialDelaySeconds': 1, 'networkType': 'not_roaming', @@ -299,7 +295,6 @@ void main() { 'tag': null, 'frequency': null, 'flexInterval': null, - 'existingWorkPolicy': null, 'initialDelaySeconds': 1, 'networkType': 'unmetered', @@ -354,7 +349,6 @@ void main() { 'tag': null, 'frequency': null, 'flexInterval': null, - 'existingWorkPolicy': existingWorkPolicy[1], 'initialDelaySeconds': 1, 'networkType': null, diff --git a/workmanager/test/workmanager_test.mocks.dart b/workmanager/test/workmanager_test.mocks.dart index f784fd73..b973630a 100644 --- a/workmanager/test/workmanager_test.mocks.dart +++ b/workmanager/test/workmanager_test.mocks.dart @@ -27,12 +27,17 @@ class MockWorkmanager extends _i1.Mock implements _i2.Workmanager { @override void executeTask(_i2.BackgroundTaskHandler? backgroundTask) => - super.noSuchMethod(Invocation.method(#executeTask, [backgroundTask]), returnValueForMissingStub: null); + super.noSuchMethod(Invocation.method(#executeTask, [backgroundTask]), + returnValueForMissingStub: null); @override - _i3.Future initialize(Function? callbackDispatcher, {bool? isInDebugMode = false}) => - (super.noSuchMethod(Invocation.method(#initialize, [callbackDispatcher], {#isInDebugMode: isInDebugMode}), - returnValue: Future.value(), returnValueForMissingStub: Future.value()) as _i3.Future); + _i3.Future initialize(Function? callbackDispatcher, + {bool? isInDebugMode = false}) => + (super.noSuchMethod( + Invocation.method(#initialize, [callbackDispatcher], + {#isInDebugMode: isInDebugMode}), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); @override _i3.Future registerOneOffTask(String? uniqueName, String? taskName, @@ -92,16 +97,20 @@ class MockWorkmanager extends _i1.Mock implements _i2.Workmanager { returnValueForMissingStub: Future.value()) as _i3.Future); @override - _i3.Future cancelByUniqueName(String? uniqueName) => (super.noSuchMethod(Invocation.method(#cancelByUniqueName, [uniqueName]), - returnValue: Future.value(), returnValueForMissingStub: Future.value()) as _i3.Future); + _i3.Future cancelByUniqueName(String? uniqueName) => + (super.noSuchMethod(Invocation.method(#cancelByUniqueName, [uniqueName]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); @override _i3.Future cancelByTag(String? tag) => - (super.noSuchMethod(Invocation.method(#cancelByTag, [tag]), returnValue: Future.value(), returnValueForMissingStub: Future.value()) - as _i3.Future); + (super.noSuchMethod(Invocation.method(#cancelByTag, [tag]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); @override _i3.Future cancelAll() => - (super.noSuchMethod(Invocation.method(#cancelAll, []), returnValue: Future.value(), returnValueForMissingStub: Future.value()) - as _i3.Future); + (super.noSuchMethod(Invocation.method(#cancelAll, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); } From 82e9601a2f15a97f5dd12bd4d3b6167b563fecba Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 23:08:00 +0100 Subject: [PATCH 10/12] formatting --- .github/workflows/format.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 69c6d769..df51c87c 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -16,7 +16,7 @@ jobs: channel: 'stable' - name: Format run: | - flutter format --set-exit-if-changed . + dart format --set-exit-if-changed . format_kotlin: runs-on: ubuntu-latest @@ -25,8 +25,10 @@ jobs: - name: "checkout" uses: actions/checkout@v4 - - name: "ktlint" - uses: "vroy/gha-kotlin-linter@v1" + - name: ktlint + uses: ScaCap/action-ktlint@master + with: + github_token: ${{ secrets.github_token }} format_swift: runs-on: ubuntu-latest From eae8cb8c8d3f0e9fbe07de3ac0ec1e986d0733f6 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 23:08:31 +0100 Subject: [PATCH 11/12] publish check --- .github/workflows/format.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index df51c87c..9f77fa51 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -47,6 +47,7 @@ jobs: - name: publish checks run: | + cd workmanager flutter pub get flutter pub publish -n flutter pub global activate tuneup From 157b84ecac5e5402c10105de9e5ff113c8a457b6 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 8 Apr 2024 23:10:26 +0100 Subject: [PATCH 12/12] move license --- LICENSE => workmanager/LICENSE | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE => workmanager/LICENSE (100%) diff --git a/LICENSE b/workmanager/LICENSE similarity index 100% rename from LICENSE rename to workmanager/LICENSE