|
@@ -5,18 +5,22 @@ import android.content.Context
|
|
|
import android.print.PrintAttributes
|
|
|
import android.print.PrintDocumentAdapter
|
|
|
import android.print.PrintManager
|
|
|
+import androidx.activity.ComponentActivity
|
|
|
+import androidx.lifecycle.DefaultLifecycleObserver
|
|
|
+import androidx.lifecycle.LifecycleOwner
|
|
|
import com.google.gson.JsonElement
|
|
|
import com.hzliuzhi.applet.core.shared.Payload
|
|
|
import com.hzliuzhi.applet.core.shared.SharedFlowHub
|
|
|
import com.hzliuzhi.applet.core.shared.SharedFlowHub.callbackAs
|
|
|
import com.hzliuzhi.applet.core.shared.SharedFlowHub.cast
|
|
|
+import com.hzliuzhi.applet.printer.impl.GPrinter
|
|
|
import com.hzliuzhi.applet.printer.impl.PrintPdfDocumentAdapter
|
|
|
import kotlinx.coroutines.CoroutineScope
|
|
|
import kotlinx.coroutines.flow.filter
|
|
|
import kotlinx.coroutines.flow.launchIn
|
|
|
import kotlinx.coroutines.flow.onEach
|
|
|
|
|
|
-class Printer(context: Context) {
|
|
|
+class Printer(context: Context) : DefaultLifecycleObserver {
|
|
|
private val applicationContext = context.applicationContext
|
|
|
|
|
|
private val manager by lazy {
|
|
@@ -32,11 +36,19 @@ class Printer(context: Context) {
|
|
|
private var instance: Printer? = null
|
|
|
fun getInstance(context: Context): Printer {
|
|
|
return instance ?: synchronized(this) {
|
|
|
- Printer(context).also { instance = it }
|
|
|
+ Printer(context).also {
|
|
|
+ instance = it
|
|
|
+ (context as? ComponentActivity)?.lifecycle?.addObserver(it)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ override fun onDestroy(owner: LifecycleOwner) {
|
|
|
+ super.onDestroy(owner)
|
|
|
+ GPrinter.onDestroy()
|
|
|
+ }
|
|
|
+
|
|
|
fun eventHandle(scope: CoroutineScope) {
|
|
|
SharedFlowHub.events
|
|
|
.filter { it.type.contains("print") }
|
|
@@ -46,18 +58,46 @@ class Printer(context: Context) {
|
|
|
event.cast<JsonElement, JsonElement>()?.also { event ->
|
|
|
callback = event.callback
|
|
|
event.payload
|
|
|
- ?.let { PrintParams.formJson(it) }
|
|
|
+ ?.let { PrintParams.fromJson(it) }
|
|
|
?.also { print(it) }
|
|
|
?: invoke(Payload.error<Unit>(message = "[print] 参数解析错误"))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ "${SharedFlowHub.WEBVIEW_BRIDGE_EVENT}:print:connect" -> run {
|
|
|
+ event.cast<JsonElement, JsonElement>()?.also { event ->
|
|
|
+ callback = event.callback
|
|
|
+ event.payload
|
|
|
+ ?.let { PrintDevice.fromJson(it) }
|
|
|
+ ?.also { device ->
|
|
|
+ GPrinter.connect(device) {
|
|
|
+ val payload = if (it.second) Payload.data(device, message = "连接成功") else Payload.error<Unit>(message = "连接失败")
|
|
|
+ invoke(payload)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ?: invoke(Payload.error<Unit>(message = "[print:connect] 参数解析错误"))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ "${SharedFlowHub.WEBVIEW_BRIDGE_EVENT}:print:disconnect" -> run {
|
|
|
+ event.cast<JsonElement, JsonElement>()?.also { event ->
|
|
|
+ callback = event.callback
|
|
|
+ event.payload
|
|
|
+ ?.let { PrintDevice.fromJson(it) }
|
|
|
+ ?.also { device ->
|
|
|
+ GPrinter.disconnect(device) {
|
|
|
+ val payload = if (!it.second) Payload.data(device, message = "断开成功") else Payload.error<Unit>(message = "断开失败")
|
|
|
+ invoke(payload)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ?: invoke(Payload.error<Unit>(message = "[print:disconnect] 参数解析错误"))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
"print" -> run {
|
|
|
event.cast<PrintDocumentAdapter, JsonElement>()?.also { event ->
|
|
|
callback = event.callback
|
|
|
- event.payload?.also {
|
|
|
- print(adapter = it)
|
|
|
- } ?: invoke(Payload.error<Unit>(message = "[print] 参数解析错误"))
|
|
|
+ event.payload?.also { print(adapter = it) } ?: invoke(Payload.error<Unit>(message = "[print] 参数解析错误"))
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -71,9 +111,13 @@ class Printer(context: Context) {
|
|
|
if (!params.url.isNullOrEmpty()) {
|
|
|
PrintPdfDocumentAdapter.download(
|
|
|
applicationContext, params.url,
|
|
|
- { file -> print(file.name, PrintPdfDocumentAdapter(file, { invoke(Payload.data(true));true }, { invoke(Payload.error<Unit>(message = it)); true })) },
|
|
|
+ { file -> print(file.name, PrintPdfDocumentAdapter(file, { invoke(Payload.data(true)); true }, { invoke(Payload.error<Unit>(message = it)); true })) },
|
|
|
{ message -> Payload.error<Unit>(message = message) }
|
|
|
)
|
|
|
+ } else if (!params.tspl.isNullOrEmpty()) {
|
|
|
+ runCatching { GPrinter.print(device = params.device, text = params.tspl) }
|
|
|
+ .onSuccess { invoke(Payload.data(true)) }
|
|
|
+ .onFailure { invoke(Payload.error<Unit>(message = it.message)) }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -85,7 +129,7 @@ class Printer(context: Context) {
|
|
|
}
|
|
|
|
|
|
private fun invoke(payload: Payload<*>) {
|
|
|
- payload.toJson()?.also { callback?.invoke(it) }
|
|
|
+ JsonUtil.gson.toJsonTree(payload, Payload::class.java).also { callback?.invoke(it) }
|
|
|
callback = null
|
|
|
}
|
|
|
}
|