diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b82788dae..c552efae5 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -16,7 +16,6 @@ android:label="RustDesk" android:requestLegacyExternalStorage="true"> - - \ No newline at end of file + diff --git a/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt b/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt index e7143c3dc..b8988c8dd 100644 --- a/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt +++ b/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt @@ -31,22 +31,23 @@ class MainActivity : FlutterActivity() { @RequiresApi(Build.VERSION_CODES.M) override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) - Log.d(logTag, "MainActivity configureFlutterEngine,bind to main service") - Intent(this, MainService::class.java).also { - bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) - } updateMachineInfo() flutterMethodChannel = MethodChannel( flutterEngine.dartExecutor.binaryMessenger, channelTag ).apply { + // make sure result is set, otherwise flutter will await forever setMethodCallHandler { call, result -> when (call.method) { "init_service" -> { - Log.d(logTag, "event from flutter,getPer") - if(mainService?.isReady == false){ - getMediaProjection() + Intent(activity, MainService::class.java).also { + bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) } + if(mainService?.isReady == true){ + result.success(false) + return@setMethodCallHandler + } + getMediaProjection() result.success(true) } "start_capture" -> { @@ -68,11 +69,15 @@ class MainActivity : FlutterActivity() { "check_permission" -> { if(call.arguments is String){ result.success(checkPermission(context, call.arguments as String)) + } else { + result.success(false) } } "request_permission" -> { if(call.arguments is String){ requestPermission(context, call.arguments as String) + } else { + result.success(false) } } "check_video_permission" -> { @@ -91,6 +96,7 @@ class MainActivity : FlutterActivity() { "on_state_changed", mapOf("name" to "media", "value" to mainService?.isReady.toString()) ) + result.success(true) } "init_input" -> { initInput() @@ -105,15 +111,20 @@ class MainActivity : FlutterActivity() { "on_state_changed", mapOf("name" to "input", "value" to InputService.isOpen.toString()) ) + result.success(true) } "cancel_notification" -> { try { val id = call.arguments as Int Log.d(logTag,"cancel_notification id:$id") mainService?.cancelNotification(id) - }finally { } + }finally { + result.success(true) + } + } + else -> { + result.error("-1","No such method",null) } - else -> {} } } } diff --git a/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt b/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt index b55c9bdf7..40862b3aa 100644 --- a/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt +++ b/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt @@ -24,6 +24,7 @@ import android.os.* import android.util.Log import android.view.Surface import android.view.Surface.FRAME_RATE_COMPATIBILITY_DEFAULT +import androidx.annotation.Keep import androidx.annotation.RequiresApi import androidx.core.app.ActivityCompat import androidx.core.app.NotificationCompat @@ -65,6 +66,7 @@ class MainService : Service() { } // rust call jvm + @Keep fun rustGetVideoRaw(): ByteArray { return if (videoData != null) { videoData!! @@ -73,6 +75,7 @@ class MainService : Service() { } } + @Keep fun rustGetAudioRaw(): FloatArray { return if (isNewData && audioData != null) { isNewData = false @@ -82,12 +85,14 @@ class MainService : Service() { } } + @Keep fun rustGetAudioRawLen(): Int { return if (isNewData && audioData != null && audioData!!.isNotEmpty()) { audioData!!.size } else 0 } + @Keep fun rustGetByName(name: String): String { return when (name) { "screen_size" -> "${INFO.screenWidth}:${INFO.screenHeight}" @@ -95,6 +100,7 @@ class MainService : Service() { } } + @Keep fun rustSetByName(name: String, arg1: String, arg2: String) { when (name) { "try_start_without_auth" -> { diff --git a/deploy.sh b/deploy.sh index 10ba55152..c18803419 100755 --- a/deploy.sh +++ b/deploy.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash cd build/web/ -python3 -c 'x=open("./main.dart.js").read();import re;y=re.search("https://.*canvaskit-wasm@([\d\.]+)/bin/",x);dirname="canvaskit@"+y.groups()[0];z=x.replace(y.group(),"/"+dirname+"/");f=open("./main.dart.js", "wt");f.write(z);import os;os.system("ln -s canvaskit " + dirname);' +python3 -c 'x=open("./main.dart.js", "rt").read();import re;y=re.search("https://.*canvaskit-wasm@([\d\.]+)/bin/",x);dirname="canvaskit@"+y.groups()[0];z=x.replace(y.group(),"/"+dirname+"/");f=open("./main.dart.js", "wt");f.write(z);import os;os.system("ln -s canvaskit " + dirname);' +python3 -c 'import hashlib;x=hashlib.sha1(open("./main.dart.js").read().encode()).hexdigest()[:10];y=open("index.html","rt").read().replace("main.dart.js", "main.dart.js?v="+x);open("index.html","wt").write(y)' tar czf x * scp x sg:/tmp/ ssh sg "sudo tar xzf /tmp/x -C /var/www/html/web.rustdesk.com/ && /bin/rm /tmp/x && sudo chown www-data:www-data /var/www/html/web.rustdesk.com/ -R"