From 522de98a8481e2a5f029d244125a078bf5ca0d9c Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Sat, 9 Mar 2024 10:46:42 +0100 Subject: [PATCH 01/13] formatting --- lib/util/note_info.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/util/note_info.dart b/lib/util/note_info.dart index a9e18eb..0da4b7b 100644 --- a/lib/util/note_info.dart +++ b/lib/util/note_info.dart @@ -1,13 +1,19 @@ /// You can use this with functions that return Java NoteInfos or Lists of NoteInfos class NoteInfo { + final int id; + final List fields; + final List tags; + const NoteInfo(this.id, this.fields, this.tags); NoteInfo.from(Map map) : - id = map['id']! as int, fields = List.from(map['fields']!), tags = List.from(map['tags']!); + id = map['id']! as int, + fields = List.from(map['fields']!), + tags = List.from(map['tags']!); static List fromList(List> list) { return list.map((e) => NoteInfo.from(e)).toList(); From a415cbc7ce0590e199441bb8701cad50a9eef517 Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Sat, 9 Mar 2024 10:47:27 +0100 Subject: [PATCH 02/13] update ankidroid library --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index b9370cc..928b00e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -48,6 +48,6 @@ android { repositories { maven { url 'https://jitpack.io' } } dependencies { - implementation 'com.github.ankidroid:Anki-Android:api-v1.1.0' + implementation 'com.github.ankidroid:Anki-Android:v2.17.4' } From d91264e901ebd2aeed4653318e52404503820d2a Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Sat, 9 Mar 2024 10:47:38 +0100 Subject: [PATCH 03/13] updated kotlin version --- example/android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/android/build.gradle b/example/android/build.gradle index f7eb7f6..d1cb9b1 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.7.10' + ext.kotlin_version = '1.9.20' repositories { google() mavenCentral() From 9c1a97fc776d4f21e06cccc13f25d7ccb2d3ebeb Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Sat, 9 Mar 2024 10:47:43 +0100 Subject: [PATCH 04/13] auto gen --- example/pubspec.lock | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index 45b5799..c781428 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: collection - sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.1" + version: "1.18.0" crypto: dependency: transitive description: @@ -61,14 +61,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" lints: dependency: transitive description: @@ -81,18 +73,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" request_permission: dependency: transitive description: @@ -130,6 +122,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" sdks: - dart: ">=3.0.5 <4.0.0" - flutter: ">=3.3.0" + dart: ">=3.2.0-194.0.dev <4.0.0" + flutter: ">=3.16.9" From fd20cc3a9a9cd9cb04f244ff17852f9dbb4d0cca Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Sat, 9 Mar 2024 10:48:03 +0100 Subject: [PATCH 05/13] use new api of ankidroid for new kotlin version --- .../FlutterAnkidroidPlugin.kt | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/android/src/main/kotlin/com/aaalkoud/flutter_ankidroid/FlutterAnkidroidPlugin.kt b/android/src/main/kotlin/com/aaalkoud/flutter_ankidroid/FlutterAnkidroidPlugin.kt index 163385b..fe10ed8 100644 --- a/android/src/main/kotlin/com/aaalkoud/flutter_ankidroid/FlutterAnkidroidPlugin.kt +++ b/android/src/main/kotlin/com/aaalkoud/flutter_ankidroid/FlutterAnkidroidPlugin.kt @@ -15,6 +15,8 @@ import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.plugin.common.MethodChannel.Result + + /** FlutterAnkidroidPlugin */ class FlutterAnkidroidPlugin: FlutterPlugin, MethodCallHandler { @@ -80,11 +82,13 @@ class FlutterAnkidroidPlugin: FlutterPlugin, MethodCallHandler { "findDuplicateNotesWithKey" -> { val mid = call.argument("mid")!! val key = call.argument("key")!! - val dupes = api.findDuplicateNotes(mid, key).map {hashMapOf( - "id" to it.id, - "fields" to it.fields.toList(), - "tags" to it.tags.toList() - )} + val dupes = api.findDuplicateNotes(mid, key).map { + hashMapOf( + "id" to it!!.getId(), + "fields" to it!!.getFields().toList(), + "tags" to it!!.getTags().toList() + ) + } result.success(dupes) } @@ -95,15 +99,15 @@ class FlutterAnkidroidPlugin: FlutterPlugin, MethodCallHandler { val dupes = api.findDuplicateNotes(mid, keys) val list = mutableListOf>>() - for (i in 0 until dupes.size()) { - val innerList = dupes.valueAt(i) + for (i in 0 until dupes!!.size()) { + val innerList = dupes!!.valueAt(i) if (innerList != null) { list.add(innerList.map {hashMapOf( - "id" to it.id, - "fields" to it.fields.toList(), - "tags" to it.tags.toList() + "id" to it!!.getId(), + "fields" to it!!.getFields().toList(), + "tags" to it!!.getTags().toList() )}) } else { @@ -139,9 +143,9 @@ class FlutterAnkidroidPlugin: FlutterPlugin, MethodCallHandler { val note = api.getNote(noteId) result.success(hashMapOf( - "id" to note.id, - "fields" to note.fields.toList(), - "tags" to note.tags.toList() + "id" to note!!.getId(), + "fields" to note!!.getFields().toList(), + "tags" to note!!.getTags().toList() )) } @@ -182,7 +186,7 @@ class FlutterAnkidroidPlugin: FlutterPlugin, MethodCallHandler { "getFieldList" -> { val modelId = call.argument("modelId")!! - result.success(api.getFieldList(modelId).toList()) + result.success(api.getFieldList(modelId)!!.toList()) } "modelList" -> result.success(api.modelList) From a3970eae90a98133243e1d6906698f126d08d52b Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Sat, 9 Mar 2024 10:49:10 +0100 Subject: [PATCH 06/13] do not ask for permission --- lib/flutter_ankidroid.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/flutter_ankidroid.dart b/lib/flutter_ankidroid.dart index 81f0078..2abc014 100644 --- a/lib/flutter_ankidroid.dart +++ b/lib/flutter_ankidroid.dart @@ -18,10 +18,12 @@ class Ankidroid { /// If you hot restart your app, the isolate won't be killed, and vscode /// will show another isolate in your call stack. not that big of a deal. /// Btw, if anyone knows how to give the isolate a name please help + /// This is an open issue in the flutter_isolate package + /// https://github.com/rmawatson/flutter_isolate/issues/108 static Future createAnkiIsolate() async { WidgetsFlutterBinding.ensureInitialized(); - await askForPermission(); + //await askForPermission(); final rPort = ReceivePort(); final isolate = await FlutterIsolate.spawn(_isolateFunction, rPort.sendPort); From 74b73602828048d92171ada08fd068d2bea7f079 Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Sat, 9 Mar 2024 10:54:49 +0100 Subject: [PATCH 07/13] added docs to askForPermission --- lib/flutter_ankidroid.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/flutter_ankidroid.dart b/lib/flutter_ankidroid.dart index 2abc014..ca62d1b 100644 --- a/lib/flutter_ankidroid.dart +++ b/lib/flutter_ankidroid.dart @@ -22,8 +22,6 @@ class Ankidroid { /// https://github.com/rmawatson/flutter_isolate/issues/108 static Future createAnkiIsolate() async { WidgetsFlutterBinding.ensureInitialized(); - - //await askForPermission(); final rPort = ReceivePort(); final isolate = await FlutterIsolate.spawn(_isolateFunction, rPort.sendPort); @@ -32,6 +30,10 @@ class Ankidroid { return Ankidroid._(isolate, ankiPort); } + /// Ask for permission to communicate with ankidroid + /// This opens a dialog that the user needs to agree. + /// + /// Note: this needs to be called before trying to communicate with ankidroid. static Future askForPermission() async { final perms = RequestPermission.instace; if (!await perms.hasAndroidPermission('com.ichi2.anki.permission.READ_WRITE_DATABASE')) { From 93ce24705814c65206ab7b89f260f866f7ba730d Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Sat, 9 Mar 2024 10:58:15 +0100 Subject: [PATCH 08/13] updated docs --- lib/flutter_ankidroid.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/flutter_ankidroid.dart b/lib/flutter_ankidroid.dart index ca62d1b..bd2686b 100644 --- a/lib/flutter_ankidroid.dart +++ b/lib/flutter_ankidroid.dart @@ -17,7 +17,11 @@ class Ankidroid { /// If you hot restart your app, the isolate won't be killed, and vscode /// will show another isolate in your call stack. not that big of a deal. - /// Btw, if anyone knows how to give the isolate a name please help + /// + /// Note: `askForPermission` needs to be called before trying to use any + /// functions of this isolate. + /// + /// Dev note: Btw, if anyone knows how to give the isolate a name please help /// This is an open issue in the flutter_isolate package /// https://github.com/rmawatson/flutter_isolate/issues/108 static Future createAnkiIsolate() async { @@ -33,7 +37,8 @@ class Ankidroid { /// Ask for permission to communicate with ankidroid /// This opens a dialog that the user needs to agree. /// - /// Note: this needs to be called before trying to communicate with ankidroid. + /// Note: this needs to be called before trying to use any functions of an + /// ankidroid isolate. static Future askForPermission() async { final perms = RequestPermission.instace; if (!await perms.hasAndroidPermission('com.ichi2.anki.permission.READ_WRITE_DATABASE')) { From 1de4b8a884efafbaa99c52af498b7413a4b54c9e Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Fri, 26 Apr 2024 18:53:15 +0900 Subject: [PATCH 09/13] upgrade compile sdk --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 928b00e..fd1d8f9 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -25,7 +25,7 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { - compileSdkVersion 31 + compileSdkVersion 34 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 From fbce1fb177c589eab4b4eec87acef347c4c27580 Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Fri, 26 Apr 2024 18:54:20 +0900 Subject: [PATCH 10/13] askForPermission waits for the user choice and returns it as a bool --- lib/flutter_ankidroid.dart | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/flutter_ankidroid.dart b/lib/flutter_ankidroid.dart index bd2686b..cddab48 100644 --- a/lib/flutter_ankidroid.dart +++ b/lib/flutter_ankidroid.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:async/async.dart'; import 'package:flutter_isolate/flutter_isolate.dart'; -import 'package:request_permission/request_permission.dart'; import 'util/future_result.dart'; export 'util/note_info.dart' show NoteInfo; @@ -39,11 +38,13 @@ class Ankidroid { /// /// Note: this needs to be called before trying to use any functions of an /// ankidroid isolate. - static Future askForPermission() async { - final perms = RequestPermission.instace; - if (!await perms.hasAndroidPermission('com.ichi2.anki.permission.READ_WRITE_DATABASE')) { - await perms.requestAndroidPermission('com.ichi2.anki.permission.READ_WRITE_DATABASE'); - } + static Future askForPermission() async { + + const m = MethodChannel("flutter_ankidroid"); + bool ret = await m.invokeMethod("requestPremission"); + + return ret; + } void killIsolate() => _isolate.kill(); From 773504c457c04aa765833412df77ce55ecb317ff Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Fri, 26 Apr 2024 18:55:36 +0900 Subject: [PATCH 11/13] * removed the permission request dependency * added native permission request --- .../FlutterAnkidroidPlugin.kt | 103 +++++++++++++++++- example/pubspec.lock | 28 +---- pubspec.yaml | 1 - 3 files changed, 104 insertions(+), 28 deletions(-) diff --git a/android/src/main/kotlin/com/aaalkoud/flutter_ankidroid/FlutterAnkidroidPlugin.kt b/android/src/main/kotlin/com/aaalkoud/flutter_ankidroid/FlutterAnkidroidPlugin.kt index fe10ed8..6c17421 100644 --- a/android/src/main/kotlin/com/aaalkoud/flutter_ankidroid/FlutterAnkidroidPlugin.kt +++ b/android/src/main/kotlin/com/aaalkoud/flutter_ankidroid/FlutterAnkidroidPlugin.kt @@ -1,8 +1,11 @@ package com.aaalkoud.flutter_ankidroid +import android.app.Activity +import android.app.Application import android.content.Intent import android.content.Context import android.content.pm.PackageManager +import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import java.io.File @@ -13,28 +16,117 @@ import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import io.flutter.plugin.common.PluginRegistry import io.flutter.plugin.common.MethodChannel.Result +import io.flutter.embedding.engine.plugins.activity.ActivityAware +import io.flutter.plugin.common.PluginRegistry.Registrar +import io.flutter.plugin.common.PluginRegistry.RequestPermissionsResultListener +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding /** FlutterAnkidroidPlugin */ -class FlutterAnkidroidPlugin: FlutterPlugin, MethodCallHandler { - +public class FlutterAnkidroidPlugin : FlutterPlugin, MethodCallHandler, RequestPermissionsResultListener, ActivityAware { + + private var act: Activity? = null + private lateinit var channel : MethodChannel private lateinit var context: Context private lateinit var api : AddContentApi + private var ankiPermissionCode = 4321 + private var ankiPermissionName = "com.ichi2.anki.permission.READ_WRITE_DATABASE" + private var permissionRequestResult : Result? = null + + + override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { - channel = MethodChannel(flutterPluginBinding.binaryMessenger, "flutter_ankidroid") + context = flutterPluginBinding.applicationContext api = AddContentApi(context) + + channel = MethodChannel(flutterPluginBinding.flutterEngine.dartExecutor, "flutter_ankidroid") channel.setMethodCallHandler(this) + + } + override fun onAttachedToActivity(binding : ActivityPluginBinding) { + act = binding.activity + binding.addRequestPermissionsResultListener(this) + } + override fun onDetachedFromActivityForConfigChanges() { + act = null; + } + override fun onReattachedToActivityForConfigChanges(binding : ActivityPluginBinding) { + act = binding.activity + binding.addRequestPermissionsResultListener(this) + } + override fun onDetachedFromActivity() { + act = null; + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray): Boolean{ + + var permissionGranted : Boolean = false + + when(requestCode) { + ankiPermissionCode -> { + if ( null != grantResults ) { + permissionGranted = grantResults.isNotEmpty() && + grantResults.get(0) == PackageManager.PERMISSION_GRANTED + } + } + } + permissionRequestResult!!.success(permissionGranted) + return permissionGranted + } + + /* + * Checks if the user already gave permission to interact with anki + * Returns true if permission is granted, false otherwise + */ + fun checkPermission(): Boolean{ + + val permission = ContextCompat.checkSelfPermission(context, ankiPermissionName) + val granted = permission == PackageManager.PERMISSION_GRANTED + + return granted + + } + + /* + * Shows a native permission request to interact with ankidroid + */ + fun requestPermission(result: Result){ + + val granted = checkPermission() + + if(granted){ + result.success(granted) + return + } + else { + ActivityCompat.requestPermissions(act!!, arrayOf(ankiPermissionName), ankiPermissionCode) + } + } override fun onMethodCall(call: MethodCall, result: Result) { - val permission = ContextCompat.checkSelfPermission(context, "com.ichi2.anki.permission.READ_WRITE_DATABASE") - if (permission != PackageManager.PERMISSION_GRANTED) { + + var granted : Boolean = checkPermission() + + if(call.method == "checkPermission"){ + result.success(granted); + return + } + else if(call.method == "requestPremission"){ + permissionRequestResult = result + requestPermission(result) + return + } + + if (!granted) { result.error("Permission to use and modify AnkiDroid database not granted!", "Permission to use and modify AnkiDroid database not granted!", null) + return } when (call.method) { @@ -228,4 +320,5 @@ class FlutterAnkidroidPlugin: FlutterPlugin, MethodCallHandler { override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { channel.setMethodCallHandler(null) } + } diff --git a/example/pubspec.lock b/example/pubspec.lock index c781428..f629789 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -73,26 +73,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.10.0" - request_permission: - dependency: transitive - description: - name: request_permission - sha256: f058e75a3ff29a6f5d5ed1042673d7d4d7e5abcda12256675cf88d095dfa84f6 - url: "https://pub.dev" - source: hosted - version: "2.1.4" + version: "1.11.0" sky_engine: dependency: transitive description: flutter @@ -122,14 +114,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - web: - dependency: transitive - description: - name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 - url: "https://pub.dev" - source: hosted - version: "0.3.0" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" - flutter: ">=3.16.9" + dart: ">=3.2.0-0 <4.0.0" + flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index 792bea4..8708296 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,6 @@ dependencies: sdk: flutter flutter_isolate: ^2.0.4 async: ^2.11.0 - request_permission: ^2.1.4 dev_dependencies: flutter_lints: ^2.0.0 From 9ae1aa98999c03ff8b3556b3aeea3b2ff09b32a8 Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Mon, 30 Sep 2024 16:13:57 +0900 Subject: [PATCH 12/13] Do not use flutter isolate --- example/pubspec.lock | 42 +++++--------------------------------- lib/flutter_ankidroid.dart | 27 ++++++++++-------------- pubspec.yaml | 1 - 3 files changed, 16 insertions(+), 54 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index f629789..32a859a 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -25,14 +25,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" - crypto: - dependency: transitive - description: - name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.dev" - source: hosted - version: "3.0.3" flutter: dependency: "direct main" description: flutter @@ -45,14 +37,6 @@ packages: relative: true source: path version: "0.8.1" - flutter_isolate: - dependency: transitive - description: - name: flutter_isolate - sha256: "994ddec596da4ca12ca52154fd59404077584643eb7e3f1008a55fda9fe0b76b" - url: "https://pub.dev" - source: hosted - version: "2.0.4" flutter_lints: dependency: "direct dev" description: @@ -73,39 +57,23 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.15.0" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c - url: "https://pub.dev" - source: hosted - version: "1.3.2" - uuid: - dependency: transitive - description: - name: uuid - sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" - url: "https://pub.dev" - source: hosted - version: "3.0.7" vector_math: dependency: transitive description: @@ -115,5 +83,5 @@ packages: source: hosted version: "2.1.4" sdks: - dart: ">=3.2.0-0 <4.0.0" + dart: ">=3.3.0-0 <4.0.0" flutter: ">=3.3.0" diff --git a/lib/flutter_ankidroid.dart b/lib/flutter_ankidroid.dart index cddab48..133bdab 100644 --- a/lib/flutter_ankidroid.dart +++ b/lib/flutter_ankidroid.dart @@ -3,13 +3,12 @@ import 'dart:isolate'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:async/async.dart'; -import 'package:flutter_isolate/flutter_isolate.dart'; import 'util/future_result.dart'; export 'util/note_info.dart' show NoteInfo; class Ankidroid { - final FlutterIsolate _isolate; + final Isolate _isolate; final SendPort _ankiPort; const Ankidroid._(this._isolate, this._ankiPort); @@ -24,11 +23,13 @@ class Ankidroid { /// This is an open issue in the flutter_isolate package /// https://github.com/rmawatson/flutter_isolate/issues/108 static Future createAnkiIsolate() async { + WidgetsFlutterBinding.ensureInitialized(); - + final rPort = ReceivePort(); - final isolate = await FlutterIsolate.spawn(_isolateFunction, rPort.sendPort); + final isolate = await Isolate.spawn(_isolateFunction, rPort.sendPort); final ankiPort = await rPort.first; + ankiPort.send({"rootIsolateToken" : ServicesBinding.rootIsolateToken}); return Ankidroid._(isolate, ankiPort); } @@ -51,6 +52,7 @@ class Ankidroid { /// should return 'Test Successful!' Future> test() async { + final rPort = ReceivePort(); _ankiPort.send({'functionName': 'test', 'sendPort': rPort.sendPort}); @@ -363,23 +365,16 @@ class Ankidroid { const methodChannel = MethodChannel('flutter_ankidroid'); await for (Map msg in ankiPort) { - // this throws 'no activity' - // final perms = RequestPermission.instace; - // if (!await perms.hasAndroidPermission('com.ichi2.anki.permission.READ_WRITE_DATABASE')) { - // await perms.requestAndroidPermission('com.ichi2.anki.permission.READ_WRITE_DATABASE'); - // } + + if(msg.containsKey("rootIsolateToken")){ + BackgroundIsolateBinaryMessenger.ensureInitialized(msg["rootIsolateToken"]); + continue; + } msg['sendPort'].send( await futureToResultMap(() async => await methodChannel.invokeMethod(msg['functionName'], msg..remove('functionName')..remove('sendPort'))) ); - // if (await perms.hasAndroidPermission('com.ichi2.anki.permission.READ_WRITE_DATABASE')) { - // msg['sendPort'].send( - // await futureToResultMap(() async => await methodChannel.invokeMethod(msg['functionName'], msg..remove('functionName')..remove('sendPort'))) - // ); - // } else { - // msg['sendPort'].send({'e': 'Permission to use and modify AnkiDroid database not granted!'}); - // } } } } diff --git a/pubspec.yaml b/pubspec.yaml index 8708296..13f3dee 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,7 +10,6 @@ environment: dependencies: flutter: sdk: flutter - flutter_isolate: ^2.0.4 async: ^2.11.0 dev_dependencies: From 0cd07c35dda4c4fff4bcde5de3c82c19aaf2a6ce Mon Sep 17 00:00:00 2001 From: "CaptainDario @ MBP M1" Date: Mon, 30 Sep 2024 16:17:24 +0900 Subject: [PATCH 13/13] name the ankidroid isolate --- lib/flutter_ankidroid.dart | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/flutter_ankidroid.dart b/lib/flutter_ankidroid.dart index 133bdab..5cedea9 100644 --- a/lib/flutter_ankidroid.dart +++ b/lib/flutter_ankidroid.dart @@ -18,16 +18,15 @@ class Ankidroid { /// /// Note: `askForPermission` needs to be called before trying to use any /// functions of this isolate. - /// - /// Dev note: Btw, if anyone knows how to give the isolate a name please help - /// This is an open issue in the flutter_isolate package - /// https://github.com/rmawatson/flutter_isolate/issues/108 static Future createAnkiIsolate() async { WidgetsFlutterBinding.ensureInitialized(); final rPort = ReceivePort(); - final isolate = await Isolate.spawn(_isolateFunction, rPort.sendPort); + final isolate = await Isolate.spawn( + _isolateFunction, + rPort.sendPort, + debugName: "AnkiDroid"); final ankiPort = await rPort.first; ankiPort.send({"rootIsolateToken" : ServicesBinding.rootIsolateToken});