|
|
@@ -1,14 +1,18 @@
|
|
|
package com.atmob.keyboard_android.keyboard
|
|
|
|
|
|
import android.annotation.SuppressLint
|
|
|
-import android.inputmethodservice.InputMethodService
|
|
|
import android.view.View
|
|
|
+import android.view.Window
|
|
|
import android.view.inputmethod.EditorInfo
|
|
|
import android.widget.Button
|
|
|
import android.widget.EditText
|
|
|
import android.widget.GridLayout
|
|
|
import android.widget.Toast
|
|
|
import com.atmob.keyboard_android.R
|
|
|
+import com.atmob.keyboard_android.keyboard.ext.InputMethodLifecycleService
|
|
|
+import com.atmob.keyboard_android.mvvm.ViewModelManager
|
|
|
+import com.atmob.keyboard_android.mvvm.viewmodel.KeyboardViewModel
|
|
|
+import com.atmob.keyboard_android.util.ClipboardHelper
|
|
|
import com.atmob.keyboard_android.util.InputMethodUtil
|
|
|
import com.atmob.keyboard_android.util.KeyboardHolder
|
|
|
import com.atmob.keyboard_android.util.LogUtil
|
|
|
@@ -19,7 +23,8 @@ import io.flutter.plugin.common.MethodChannel
|
|
|
/**
|
|
|
* 自定义键盘的输入法服务
|
|
|
*/
|
|
|
-class CustomKeyboardService : InputMethodService() {
|
|
|
+class CustomKeyboardService : InputMethodLifecycleService(), ICustomKeyboardService,
|
|
|
+ ClipboardHelper.OnUserClipboardDataUpdateListener {
|
|
|
/**
|
|
|
* 用于与 Flutter 端通信的 MethodChannel
|
|
|
*/
|
|
|
@@ -35,9 +40,22 @@ class CustomKeyboardService : InputMethodService() {
|
|
|
*/
|
|
|
private var mKeyMappings: List<Pair<String, String>> = listOf()
|
|
|
|
|
|
+ /**
|
|
|
+ * 键盘ViewModel
|
|
|
+ */
|
|
|
+ private val mKeyboardViewModel by lazy {
|
|
|
+ ViewModelManager.getKeyboardViewModel(this@CustomKeyboardService)
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onUserClipboardDataUpdate(newText: String) {
|
|
|
+ // 剪切板数据更新
|
|
|
+ mKeyboardViewModel.updateUserClipboardData(newText)
|
|
|
+ }
|
|
|
+
|
|
|
override fun onCreate() {
|
|
|
super.onCreate()
|
|
|
- LogUtil.d("输入法服务已启动!")
|
|
|
+ // 保存输入法Service的实例
|
|
|
+ KeyboardHolder.attachKeyboardService(this)
|
|
|
|
|
|
val flutterEngine = FlutterEngineCache.getInstance().get("my_engine_id")
|
|
|
if (flutterEngine != null) {
|
|
|
@@ -63,10 +81,12 @@ class CustomKeyboardService : InputMethodService() {
|
|
|
} else {
|
|
|
LogUtil.e("FlutterEngine 未找到,MethodChannel 无法初始化")
|
|
|
}
|
|
|
+
|
|
|
+ // 监听用户的剪切板
|
|
|
+ ClipboardHelper.registerClipboardListener(this)
|
|
|
}
|
|
|
|
|
|
override fun onCreateInputView(): View {
|
|
|
- LogUtil.d("onCreateInputView!")
|
|
|
val keyboardView = layoutInflater.inflate(R.layout.keyboard_layout, null)
|
|
|
vKeyboardView = keyboardView
|
|
|
|
|
|
@@ -76,21 +96,18 @@ class CustomKeyboardService : InputMethodService() {
|
|
|
return keyboardView
|
|
|
}
|
|
|
|
|
|
- override fun onDestroy() {
|
|
|
- super.onDestroy()
|
|
|
- KeyboardHolder.detachKeyboardWindow()
|
|
|
- }
|
|
|
-
|
|
|
override fun onStartInputView(info: EditorInfo?, restarting: Boolean) {
|
|
|
super.onStartInputView(info, restarting)
|
|
|
- LogUtil.d("onStartInputView: 重新加载键盘数据")
|
|
|
-
|
|
|
- KeyboardHolder.attachKeyboardWindow(window!!.window!!)
|
|
|
-
|
|
|
// 重新获取按键映射
|
|
|
fetchKeyMappings()
|
|
|
}
|
|
|
|
|
|
+ override fun onDestroy() {
|
|
|
+ super.onDestroy()
|
|
|
+ KeyboardHolder.detachKeyboardService()
|
|
|
+ ClipboardHelper.unRegisterClipboardListener(this)
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 通过 KeyboardAndroidPlugin 获取按键映射
|
|
|
*/
|
|
|
@@ -197,4 +214,12 @@ class CustomKeyboardService : InputMethodService() {
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
+
|
|
|
+ override fun getKeyboardWindow(): Window {
|
|
|
+ return window!!.window!!
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun getKeyboardViewModel(): KeyboardViewModel {
|
|
|
+ return mKeyboardViewModel
|
|
|
+ }
|
|
|
}
|