Skip to content

Commit 9a7fb0b

Browse files
author
Nguyễn Tuấn Việt
committed
Fix: Error build on demo
1 parent 2c897cc commit 9a7fb0b

File tree

17 files changed

+1029
-1588
lines changed

17 files changed

+1029
-1588
lines changed

android/src/main/kotlin/dev/brewkits/native_workmanager/engine/FlutterEngineManager.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ object FlutterEngineManager {
263263
val idleTime = System.currentTimeMillis() - lastUsedTimestamp
264264
if (idleTime >= ENGINE_IDLE_TIMEOUT_MS) {
265265
Log.d(TAG, "Auto-disposing engine after ${idleTime}ms idle")
266-
dispose()
266+
disposalScope.launch { dispose() }
267267
}
268268
}
269269
}
@@ -274,8 +274,7 @@ object FlutterEngineManager {
274274
* This frees ~30-50MB of RAM but future tasks will be slower
275275
* (need to cold-start engine again).
276276
*/
277-
@Synchronized
278-
fun dispose() {
277+
suspend fun dispose() {
279278
Log.d(TAG, "Disposing Flutter engine")
280279

281280
methodChannel?.setMethodCallHandler(null)

example/android/app/build.gradle.kts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
plugins {
22
id("com.android.application")
33
id("kotlin-android")
4+
id("kotlin-kapt")
5+
id("org.jetbrains.kotlin.plugin.serialization") version "1.9.22"
46
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
57
id("dev.flutter.flutter-gradle-plugin")
68
}
@@ -42,3 +44,8 @@ android {
4244
flutter {
4345
source = "../.."
4446
}
47+
48+
dependencies {
49+
// Kotlinx Serialization
50+
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")
51+
}

example/android/app/src/main/kotlin/dev/brewkits/native_workmanager_example/MainActivity.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,29 @@ import io.flutter.embedding.engine.FlutterEngine
1313
import io.flutter.plugin.common.MethodChannel
1414
import java.io.RandomAccessFile
1515

16+
import dev.brewkits.native_workmanager.SimpleAndroidWorkerFactory
17+
import dev.brewkits.kmpworkmanager.background.domain.AndroidWorker
18+
import dev.brewkits.kmpworkmanager.background.domain.AndroidWorkerFactory
19+
import dev.brewkits.native_workmanager_example.workers.ImageCompressWorker // Import the custom worker
20+
1621
class MainActivity : FlutterActivity() {
1722
private val METRICS_CHANNEL = "dev.brewkits.native_workmanager.example/metrics"
1823

1924
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
2025
super.configureFlutterEngine(flutterEngine)
2126

27+
// Register custom workers BEFORE Flutter engine starts
28+
SimpleAndroidWorkerFactory.setUserFactory(object : AndroidWorkerFactory {
29+
override fun createWorker(workerClassName: String): AndroidWorker? {
30+
return when (workerClassName) {
31+
"ImageCompressWorker" -> ImageCompressWorker()
32+
// Add more custom workers here
33+
else -> null
34+
}
35+
}
36+
})
37+
38+
2239
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, METRICS_CHANNEL).setMethodCallHandler { call, result ->
2340
when (call.method) {
2441
"getMemoryMB" -> {
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package dev.brewkits.native_workmanager_example.workers
2+
3+
import android.graphics.Bitmap
4+
import android.graphics.BitmapFactory
5+
import dev.brewkits.kmpworkmanager.background.domain.AndroidWorker
6+
import dev.brewkits.kmpworkmanager.background.domain.WorkerResult // Added import for WorkerResult
7+
import kotlinx.serialization.json.Json
8+
import kotlinx.serialization.json.jsonObject
9+
import kotlinx.serialization.json.jsonPrimitive
10+
import java.io.File
11+
import java.io.FileOutputStream
12+
13+
class ImageCompressWorker : AndroidWorker {
14+
override suspend fun doWork(input: String?): WorkerResult { // Changed return type to WorkerResult
15+
try {
16+
// Parse JSON input
17+
val json = Json.parseToJsonElement(input ?: "{}")
18+
val config = json.jsonObject
19+
20+
val inputPath = config["inputPath"]?.jsonPrimitive?.content
21+
?: return WorkerResult.Failure("Input path or output path missing")
22+
val outputPath = config["outputPath"]?.jsonPrimitive?.content
23+
?: return WorkerResult.Failure("Input path or output path missing")
24+
val quality = config["quality"]?.jsonPrimitive?.content?.toIntOrNull()
25+
?: 85
26+
27+
// Load image
28+
val bitmap = BitmapFactory.decodeFile(inputPath)
29+
?: return WorkerResult.Failure("Failed to load image from input path")
30+
31+
// Compress and save
32+
val outputFile = File(outputPath)
33+
outputFile.parentFile?.mkdirs()
34+
35+
FileOutputStream(outputFile).use { out ->
36+
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, out)
37+
}
38+
39+
bitmap.recycle()
40+
return WorkerResult.Success()
41+
42+
} catch (e: Exception) {
43+
println("ImageCompressWorker error: ${e.message}")
44+
return WorkerResult.Failure("Image compression failed: ${e.message}")
45+
}
46+
}
47+
}

0 commit comments

Comments
 (0)