@@ -4,13 +4,18 @@ import android.bluetooth.BluetoothAdapter
44import android.content.Context
55import android.util.Pair
66import androidx.annotation.NonNull
7+ import com.google.protobuf.kotlin.toByteString
78import io.flutter.embedding.engine.plugins.FlutterPlugin
89import io.flutter.plugin.common.EventChannel
910import io.flutter.plugin.common.MethodCall
1011import io.flutter.plugin.common.MethodChannel
1112import io.flutter.plugin.common.MethodChannel.MethodCallHandler
1213import io.flutter.plugin.common.MethodChannel.Result
14+ import io.runtime.mcumgr.McuMgrCallback
1315import io.runtime.mcumgr.dfu.FirmwareUpgradeManager
16+ import io.runtime.mcumgr.exception.McuMgrException
17+ import io.runtime.mcumgr.response.img.McuMgrImageStateResponse
18+ import no.nordicsemi.android.mcumgr_flutter.ext.toProto
1419
1520import no.nordicsemi.android.mcumgr_flutter.logging.LoggableMcuMgrBleTransport
1621import no.nordicsemi.android.mcumgr_flutter.utils.*
@@ -67,45 +72,59 @@ class McumgrFlutterPlugin : FlutterPlugin, MethodCallHandler {
6772 initializeUpdateManager(call)
6873 result.success(null )
6974 }
75+
7076 FlutterMethod .update -> {
7177 update(call)
7278 result.success(null )
7379 }
80+
7481 FlutterMethod .updateSingleImage -> {
7582 updateSingleImage(call)
7683 result.success(null )
7784 }
85+
7886 FlutterMethod .pause -> {
7987 retrieveManager(call).pause()
8088 result.success(null )
8189 }
90+
8291 FlutterMethod .resume -> {
8392 retrieveManager(call).resume()
8493 result.success(null )
8594 }
95+
8696 FlutterMethod .cancel -> {
8797 retrieveManager(call).cancel()
8898 result.success(null )
8999 }
100+
90101 FlutterMethod .isPaused -> {
91102 val isPaused = retrieveManager(call).isPaused
92103 result.success(isPaused)
93104 }
105+
94106 FlutterMethod .isInProgress -> {
95107 val isPaused = retrieveManager(call).isInProgress
96108 result.success(isPaused)
97109 }
110+
98111 FlutterMethod .readLogs -> {
99112 result.success(readLogs(call))
100113 }
114+
101115 FlutterMethod .clearLogs -> {
102116 retrieveManager(call).clearLogs()
103117 result.success(null )
104118 }
119+
105120 FlutterMethod .kill -> {
106121 kill(call)
107122 result.success(null )
108123 }
124+
125+ FlutterMethod .readImageList -> {
126+ imageList(call, result)
127+ }
109128 }
110129 } catch (e: FlutterError ) {
111130 result.error(e.code, e.message, null )
@@ -162,7 +181,8 @@ class McumgrFlutterPlugin : FlutterPlugin, MethodCallHandler {
162181 )
163182 }
164183
165- updateManager.start(arg.images.map { Pair .create(it.key, it.value_.toByteArray()) }, config)
184+ val images = arg.images.map { Pair .create(it.image, it.data_.toByteArray()) }
185+ updateManager.start(images, config)
166186 }
167187
168188 @Throws(FlutterError ::class )
@@ -235,4 +255,40 @@ class McumgrFlutterPlugin : FlutterPlugin, MethodCallHandler {
235255 }
236256 managers.remove(address)
237257 }
258+
259+ /* * Image Manager */
260+ private fun imageList (@NonNull call : MethodCall , result : Result ) {
261+ val address = (call.arguments as ? String ).guard {
262+ throw WrongArguments (" Device address expected" )
263+ }
264+ val updateManager = managers[address].guard {
265+ throw UpdateManagerDoesNotExist (" Update manager does not exist" )
266+ }
267+
268+ val callback = object : McuMgrCallback <McuMgrImageStateResponse > {
269+ override fun onResponse (response : McuMgrImageStateResponse ) {
270+ var protoResponse: ProtoListImagesResponse
271+ if (response.images != null ) {
272+ val images = response.images.map { it.toProto() }
273+ protoResponse = ProtoListImagesResponse (
274+ uuid = address,
275+ images = images,
276+ existing = true
277+ )
278+ } else {
279+ protoResponse = ProtoListImagesResponse (
280+ uuid = address,
281+ existing = false
282+ )
283+ }
284+ result.success(protoResponse.encode())
285+ }
286+
287+ override fun onError (exception : McuMgrException ) {
288+ result.error(" mcumgr_error" , exception.message, null )
289+ }
290+ }
291+
292+ updateManager.imageManager.list(callback)
293+ }
238294}
0 commit comments