diff --git a/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt b/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt index 6b23eaddd..cf9cfb814 100644 --- a/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt +++ b/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt @@ -11,9 +11,7 @@ import androidx.annotation.RequiresApi import kotlin.concurrent.thread class InputService : AccessibilityService() { -// companion object { -// var inputService:InputService? = null -// } + private val logTag = "input service" private var leftIsDown = false private var mPath = Path() @@ -22,14 +20,14 @@ class InputService : AccessibilityService() { private var mouseY = 0 @RequiresApi(Build.VERSION_CODES.N) - fun mouseInput(mask: Int, _x: Int, _y: Int) { + fun rustMouseInput(mask: Int, _x: Int, _y: Int) { Log.w(logTag, "got mouse input:x:$_x ,y:$_y ,mask:$mask ") // TODO 临时倍数 // TODO 按键抬起按下时候 x y 都是0 if ( !(mask == 9 || mask == 10) ) { - mouseX = _x * 2 - mouseY = _y * 2 + mouseX = _x * SCALE + mouseY = _y * SCALE } // left button down ,was up 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 372bd3cfe..f9597073f 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 @@ -2,36 +2,34 @@ package com.carriez.flutter_hbb import android.app.Activity import android.app.AlertDialog -import android.content.Context import android.content.Intent import android.media.projection.MediaProjectionManager import android.os.Build -import android.os.Bundle -import android.os.PersistableBundle import android.provider.Settings +import android.util.DisplayMetrics import android.util.Log import androidx.annotation.RequiresApi import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel -import java.nio.ByteBuffer -import kotlin.concurrent.thread +const val MAX_SIZE = 1400 class MainActivity : FlutterActivity() { private val channelTag = "mChannel" + private val logTag = "mMainActivity" private var mediaProjectionResultIntent: Intent? = null private val requestCode = 1 - private val buf = ByteBuffer.allocate(16) init { System.loadLibrary("rustdesk") } + external fun rustSetInfo(username: String, hostname: String, width: Int, height: Int) + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) // 必要 否则无法正确初始化flutter - + updateMachineInfo() MethodChannel( flutterEngine.dartExecutor.binaryMessenger, channelTag @@ -52,7 +50,7 @@ class MainActivity : FlutterActivity() { mStopService() result.success(true) } - "checkInput" ->{ + "checkInput" -> { checkInput() result.success(true) } @@ -128,4 +126,40 @@ class MainActivity : FlutterActivity() { mediaProjectionResultIntent = data } } + + private fun updateMachineInfo() { + // 屏幕尺寸 控制最长边不超过1400 超过则减半直到1400 并储存缩放比例 实际发送给手机端的尺寸为缩小后的尺寸 + // input控制时再通过缩放比例恢复原始尺寸进行path入参 + val dm = DisplayMetrics() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + display?.getRealMetrics(dm) + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + @Suppress("DEPRECATION") + windowManager.defaultDisplay.getRealMetrics(dm) + } else { + @Suppress("DEPRECATION") + windowManager.defaultDisplay.getMetrics(dm) + } + } + var w = dm.widthPixels + var h = dm.heightPixels + var scale = 1 + if (w != 0 && h != 0) { + if (w > MAX_SIZE || h > MAX_SIZE) { + scale = 2 + w /= scale + h /= scale + } + Log.d(logTag, "Real size - width:$w,height:$h") + + FIXED_WIDTH = 540 + FIXED_HEIGHT = 1140 + SCALE = scale + // TODO username hostname + rustSetInfo("csf", "Android", FIXED_WIDTH, FIXED_HEIGHT) + } else { + Log.e(logTag, "Got Screen Size Fail!") + } + } } 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 1c6fba716..e96b6a617 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 @@ -12,8 +12,10 @@ import android.media.projection.MediaProjection import android.media.projection.MediaProjectionManager import android.os.Build import android.os.IBinder +import android.util.DisplayMetrics import android.util.Log import android.view.Surface +import android.view.WindowManager import android.widget.Toast import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat @@ -26,9 +28,9 @@ const val START_SERVICE = "start_service" const val STOP_SERVICE = "stop_service" const val MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_VP9 -// 获取手机尺寸 建立连接时发送尺寸和基础信息 -const val FIXED_WIDTH = 500 // 编码器有上限 -const val FIXED_HEIGHT = 1000 +var FIXED_WIDTH = 0 // 编码器有上限 +var FIXED_HEIGHT = 0 +var SCALE = 1 // RealScreenWidth = screenWidth * scale const val M_KEY_BIT_RATE = 1024_000 const val M_KEY_FRAME_RATE = 30 diff --git a/android_doc.md b/android_doc.md index 96a18f438..ce44a14d6 100644 --- a/android_doc.md +++ b/android_doc.md @@ -139,6 +139,8 @@ pub unsafe extern "system" fn Java_com_carriez_flutter_1hbb_MainActivity_init( ``` - 注意,原项目包名flutter_hbb 带有下划线,通过安卓的编译提示获得的命名方式为如上。 +- 使用jni的时候会出现无输出崩溃的情况 + - 将安卓的对象实例(Context)在init的过程中传入rust端, context通过env.new_global_ref()变成全局引用 env.get_java_vm()获取到jvm @@ -157,4 +159,15 @@ jvm.get_env() Kotlin 中的 ByteArray 类 会在JVM中编译成为java的byte[] byte[]通过jni传递到rust端时 通过jni.rs的方法 -env.convert_byte_array()即可转化为Vec \ No newline at end of file +env.convert_byte_array()即可转化为Vec + +- 关于 sig + - (I)V : 输入为Int 输出为Void + - (I)Ljava/nio/ByteBuffer : 输入为Int 输出为ByteBuffer 对应jni JByteBuffer 且env 有对应解析方法 + - ()[B : 输入为空 输出为byte[](java) == ByteArray(kotlin) == jbytearray(jni env 中有对应解析方法到Vec\) + - 使用JValue枚举定义java变量 + +# BIG TODO +音频 +连续输入 +服务关闭操作 \ No newline at end of file diff --git a/lib/server_page.dart b/lib/server_page.dart index 7e76874b8..755fa7001 100644 --- a/lib/server_page.dart +++ b/lib/server_page.dart @@ -180,7 +180,7 @@ class PermissionRow extends StatelessWidget { TextSpan( text: isOk ? "已开启" : "未开启", style: TextStyle( - fontSize: 16.0, color: isOk ? Colors.green : Colors.red)), + fontSize: 16.0, color: isOk ? Colors.green : Colors.grey)), ])), TextButton( onPressed: onPressed, @@ -202,7 +202,7 @@ Widget cardTitle(String text) { fontFamily: 'WorkSans', fontWeight: FontWeight.bold, fontSize: 25, - color: Color(0xFF00B6F0), + color: MyTheme.accent80, ), )); }