IntentRecognizeHelper.kt 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package com.nova.brain.glass.helper
  2. import android.content.Context
  3. import android.widget.Toast
  4. import com.nova.brain.glass.helper.IntentRecognizeHelper.dispose
  5. import com.nova.brain.glass.helper.IntentRecognizeHelper.recognize
  6. import com.nova.brain.glass.model.RecognizeAction
  7. import com.nova.brain.glass.model.data.RecognizeData
  8. import com.nova.brain.glass.repository.HeaderInterceptor
  9. import com.nova.brain.glass.repository.Service
  10. import com.rokid.utils.ContextUtil.getApplicationContext
  11. import com.xuqm.base.di.manager.HttpManager
  12. import io.reactivex.android.schedulers.AndroidSchedulers
  13. import io.reactivex.disposables.Disposable
  14. import io.reactivex.schedulers.Schedulers
  15. /**
  16. * 意图识别全局工具。
  17. *
  18. * - [recognize] 发起识别请求;自动轮换内置问题作为 text(非 Welcome 页调用)。
  19. * - [dispose] 在页面销毁时调用,取消进行中的请求。
  20. */
  21. object IntentRecognizeHelper {
  22. private val builtInQuestions = listOf(
  23. "C大脑V2.24版本进行到什么阶段了",
  24. "我的任务有哪些",
  25. "个人任务系统功能的需求来自哪个项目",
  26. "浙江华瑞项目有哪些进行中的采购流程"
  27. )
  28. private var questionIndex = 0
  29. private var disposable: Disposable? = null
  30. private val baseUrl: String = "https://22v1322u01.vicp.fun"
  31. /**
  32. * @param context 用于显示 Toast
  33. * @param text 指定问题文本;为 null 时自动轮换内置问题
  34. * @param scence 场景标识,默认 "home"
  35. * @param onSuccess 识别成功且 code=="0" 时回调,参数为 [RecognizeAction]
  36. */
  37. fun recognize(
  38. context: Context,
  39. text: String? = null,
  40. scence: String = "home",
  41. onSuccess: (action: RecognizeAction) -> Unit
  42. ) {
  43. disposable?.dispose()
  44. val question = text ?: nextQuestion()
  45. disposable = HttpManager.getApi(
  46. HttpManager.getAppComponent(
  47. baseUrl,
  48. HeaderInterceptor(getApplicationContext())
  49. ), Service::class.java)
  50. .recognize(RecognizeData(text = question, scence = scence))
  51. .subscribeOn(Schedulers.io())
  52. .observeOn(AndroidSchedulers.mainThread())
  53. .subscribe({ model ->
  54. if (model.code == "0") {
  55. onSuccess(model.data.action)
  56. } else {
  57. Toast.makeText(context, model.data.error, Toast.LENGTH_SHORT).show()
  58. }
  59. }, { e ->
  60. Toast.makeText(context, "请求失败: ${e.message}", Toast.LENGTH_SHORT).show()
  61. })
  62. }
  63. fun dispose() {
  64. disposable?.dispose()
  65. disposable = null
  66. }
  67. private fun nextQuestion(): String {
  68. val q = builtInQuestions[questionIndex % builtInQuestions.size]
  69. questionIndex++
  70. return q
  71. }
  72. }