package com.nova.brain.glass.helper import android.content.Context import android.widget.Toast import com.nova.brain.glass.helper.IntentRecognizeHelper.dispose import com.nova.brain.glass.helper.IntentRecognizeHelper.recognize import com.nova.brain.glass.model.RecognizeAction import com.nova.brain.glass.model.data.RecognizeData import com.nova.brain.glass.repository.HeaderInterceptor import com.nova.brain.glass.repository.Service import com.rokid.utils.ContextUtil.getApplicationContext import com.xuqm.base.di.manager.HttpManager import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers /** * 意图识别全局工具。 * * - [recognize] 发起识别请求;自动轮换内置问题作为 text(非 Welcome 页调用)。 * - [dispose] 在页面销毁时调用,取消进行中的请求。 */ object IntentRecognizeHelper { private val builtInQuestions = listOf( "C大脑V2.24版本进行到什么阶段了", "我的任务有哪些", "个人任务系统功能的需求来自哪个项目", "浙江华瑞项目有哪些进行中的采购流程" ) private var questionIndex = 0 private var disposable: Disposable? = null private val baseUrl: String = "https://22v1322u01.vicp.fun" /** * @param context 用于显示 Toast * @param text 指定问题文本;为 null 时自动轮换内置问题 * @param scence 场景标识,默认 "home" * @param onSuccess 识别成功且 code=="0" 时回调,参数为 [RecognizeAction] */ fun recognize( context: Context, text: String? = null, scence: String = "home", onSuccess: (action: RecognizeAction) -> Unit ) { disposable?.dispose() val question = text ?: nextQuestion() disposable = HttpManager.getApi( HttpManager.getAppComponent( baseUrl, HeaderInterceptor(getApplicationContext()) ), Service::class.java) .recognize(RecognizeData(text = question, scence = scence)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ model -> if (model.code == "0") { onSuccess(model.data.action) } else { Toast.makeText(context, model.data.error, Toast.LENGTH_SHORT).show() } }, { e -> Toast.makeText(context, "请求失败: ${e.message}", Toast.LENGTH_SHORT).show() }) } fun dispose() { disposable?.dispose() disposable = null } private fun nextQuestion(): String { val q = builtInQuestions[questionIndex % builtInQuestions.size] questionIndex++ return q } }