feat(glass): 更新语音识别功能并优化欢迎界面
- 切换回线上服务器地址 "https://22v1322u01.vicp.fun" - 添加"下一个"语音命令支持到离线命令服务 - 新增欢迎页面语音命令组(决策中心、紧急任务、当前任务) - 在欢迎页面实现点动画效果显示识别状态 - 重构欢迎页面逻辑,移除演示按钮并简化UI布局 - 添加屏幕常亮标志以防止休眠影响语音识别 - 修复应用间跳转时的动画状态管理问题
这个提交包含在:
父节点
8582316cb8
当前提交
8c8e23c64c
@ -14,8 +14,8 @@ import com.xuqm.base.di.manager.HttpManager;
|
||||
*/
|
||||
public class MyApplication extends App {
|
||||
|
||||
public static String baseUrl = "http://192.168.6.20";
|
||||
// public static String baseUrl = "http://22fs132201.imwork.net";
|
||||
// public static String baseUrl = "http://192.168.6.20";
|
||||
public static String baseUrl = "http://22fs132201.imwork.net";
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
|
||||
@ -31,8 +31,8 @@ object IntentRecognizeHelper {
|
||||
private var questionIndex = 0
|
||||
private var disposable: Disposable? = null
|
||||
|
||||
// private val baseUrl: String = "https://22v1322u01.vicp.fun"
|
||||
private val baseUrl: String = "http://192.168.6.20:12119"
|
||||
private val baseUrl: String = "https://22v1322u01.vicp.fun"
|
||||
// private val baseUrl: String = "http://192.168.6.20:12119"
|
||||
|
||||
/**
|
||||
* @param context 用于显示 Toast
|
||||
|
||||
@ -16,6 +16,7 @@ object OfflineCmdServiceHelper {
|
||||
// 所有页面通用关键词(常量,只分配一次)
|
||||
private val COMMON_CMDS = listOf(
|
||||
OfflineCmdBean("继续", "ji xu"),
|
||||
OfflineCmdBean("下一个", "xia yi ge"),
|
||||
OfflineCmdBean("退出", "tui chu"),
|
||||
OfflineCmdBean("返回", "fan hui")
|
||||
)
|
||||
@ -76,6 +77,11 @@ object OfflineCmdServiceHelper {
|
||||
private val CMDS_INSPECTION_COMPLETE = listOf(
|
||||
OfflineCmdBean("完成任务", "wan cheng ren wu")
|
||||
)
|
||||
private val CMDS_WELCOME = listOf(
|
||||
OfflineCmdBean("决策中心", "jue ce zhong xin"),
|
||||
OfflineCmdBean("紧急任务", "jin ji ren wu"),
|
||||
OfflineCmdBean("当前任务", "dang qian ren wu")
|
||||
)
|
||||
|
||||
private var service: IOfflineCmdService? = null
|
||||
|
||||
@ -176,4 +182,8 @@ object OfflineCmdServiceHelper {
|
||||
|
||||
fun removeListenerInspectionComplete() = removeBeans(CMDS_INSPECTION_COMPLETE)
|
||||
|
||||
fun addListenerWelcome() = registerBeans(CMDS_WELCOME)
|
||||
|
||||
fun removeListenerWelcome() = removeBeans(CMDS_WELCOME)
|
||||
|
||||
}
|
||||
|
||||
@ -26,7 +26,7 @@ class ChatActivity : BaseListFormLayoutNormalActivity<ChatItem, ChatVM, Activity
|
||||
runOnUiThread {
|
||||
when (cmd) {
|
||||
"退出", "返回", "退回" -> finish()
|
||||
"继续" -> recognizeAndChat()
|
||||
"继续","下一个" -> recognizeAndChat()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,6 +2,8 @@ package com.nova.brain.glass.ui
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import com.nova.brain.glass.R
|
||||
import com.nova.brain.glass.databinding.ActivityWelcomeBinding
|
||||
@ -10,7 +12,6 @@ import com.nova.brain.glass.helper.OfflineCmdListener
|
||||
import com.nova.brain.glass.helper.OfflineCmdServiceHelper
|
||||
import com.nova.brain.glass.viewmodel.WelcomeVM
|
||||
import com.xuqm.base.ui.BaseActivity
|
||||
import kotlin.jvm.java
|
||||
|
||||
class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
|
||||
|
||||
@ -19,18 +20,44 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
|
||||
|
||||
private lateinit var vm: WelcomeVM
|
||||
|
||||
// 点动画
|
||||
private val tvOriginalText = "您可以说:Nova,我的任务有哪些?"
|
||||
private val dotsHandler = Handler(Looper.getMainLooper())
|
||||
private var dotCount = 0
|
||||
private val dotsRunnable = object : Runnable {
|
||||
override fun run() {
|
||||
dotCount = (dotCount % 3) + 1
|
||||
binding.tv.text = "正在识别中${"·".repeat(dotCount)}"
|
||||
dotsHandler.postDelayed(this, 500)
|
||||
}
|
||||
}
|
||||
|
||||
private fun startDotsAnim() {
|
||||
dotCount = 0
|
||||
dotsHandler.removeCallbacks(dotsRunnable)
|
||||
dotsHandler.post(dotsRunnable)
|
||||
}
|
||||
|
||||
private fun stopDotsAnim() {
|
||||
dotsHandler.removeCallbacks(dotsRunnable)
|
||||
binding.tv.text = tvOriginalText
|
||||
}
|
||||
|
||||
override fun initView(savedInstanceState: Bundle?) {
|
||||
super.initView(savedInstanceState)
|
||||
vm = ViewModelProvider(this).get(WelcomeVM::class.java)
|
||||
vm = ViewModelProvider(this)[WelcomeVM::class.java]
|
||||
window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
binding.tv.setOnClickListener {
|
||||
startActivity(Intent(this@WelcomeActivity, TaskListActivity::class.java))
|
||||
}
|
||||
binding.btnGet.setOnClickListener { vm.demoGet() }
|
||||
binding.btnPost.setOnClickListener { vm.demoPost() }
|
||||
binding.md.setOnClickListener {
|
||||
binding.md.text = "请求中"
|
||||
binding.md.isClickable = false
|
||||
}
|
||||
|
||||
override fun initData() {
|
||||
super.initData()
|
||||
}
|
||||
|
||||
private fun triggerRecognize() {
|
||||
startDotsAnim()
|
||||
IntentRecognizeHelper.recognize(
|
||||
context = this,
|
||||
text = "当前阶段,最紧急的任务是什么?",
|
||||
@ -43,19 +70,10 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
|
||||
}
|
||||
},
|
||||
onComplete = {
|
||||
binding.md.text = "决策中心"
|
||||
binding.md.isClickable = true
|
||||
stopDotsAnim()
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun initData() {
|
||||
super.initData()
|
||||
vm.result.observe(this) { text ->
|
||||
binding.tvResult.text = text
|
||||
}
|
||||
}
|
||||
|
||||
private val offlineCmdListener = object : OfflineCmdListener {
|
||||
override fun onOfflineCmd(cmd: String) {
|
||||
@ -64,6 +82,9 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
|
||||
"任务列表", "查看任务", "查看任务列表" -> {
|
||||
startActivity(Intent(this@WelcomeActivity, TaskListActivity::class.java))
|
||||
}
|
||||
"决策中心", "紧急任务", "当前任务" -> {
|
||||
triggerRecognize()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -72,13 +93,15 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
OfflineCmdServiceHelper.addOnLineListener(offlineCmdListener)
|
||||
binding.md.text = "决策中心"
|
||||
binding.md.isClickable = true
|
||||
OfflineCmdServiceHelper.addListenerWelcome()
|
||||
stopDotsAnim() // 从 ChatActivity 返回时恢复原文
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
OfflineCmdServiceHelper.removeOnLineListener(offlineCmdListener)
|
||||
OfflineCmdServiceHelper.removeListenerWelcome()
|
||||
dotsHandler.removeCallbacks(dotsRunnable)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
|
||||
@ -14,102 +14,10 @@
|
||||
android:text="您可以说:Nova,我的任务有哪些?"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:layout_marginBottom="100dp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/btnRow" />
|
||||
app:layout_constraintBottom_toBottomOf="parent" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/btnRow"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/scrollResult"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/btnGet"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="40dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:gravity="center"
|
||||
android:background="#33FFFFFF"
|
||||
android:textColor="#ff3FFF5F"
|
||||
android:textSize="14sp"
|
||||
android:text="GET演示" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/btnPost"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="40dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:gravity="center"
|
||||
android:background="#33FFFFFF"
|
||||
android:textColor="#ff3FFF5F"
|
||||
android:textSize="14sp"
|
||||
android:text="POST演示" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/btnSse"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="40dp"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:background="#33FFFFFF"
|
||||
android:textColor="#ff3FFF5F"
|
||||
android:textSize="14sp"
|
||||
android:text="SSE演示" />
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:id="@+id/btnRow2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:layout_marginTop="10dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/btnRow">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/md"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="40dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:gravity="center"
|
||||
android:background="#33FFFFFF"
|
||||
android:textColor="#ff3FFF5F"
|
||||
android:textSize="14sp"
|
||||
android:text="决策中心" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<ScrollView
|
||||
android:id="@+id/scrollResult"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="8dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/btnRow2"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvResult"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="12dp"
|
||||
android:textColor="#ff3FFF5F"
|
||||
android:textSize="11sp"
|
||||
android:fontFamily="monospace"
|
||||
android:text="" />
|
||||
</ScrollView>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
@ -43,6 +43,7 @@ public abstract class BaseActivity<V extends ViewDataBinding> extends AppCompatA
|
||||
super.onCreate(savedInstanceState);
|
||||
AppManager.getInstance().pushActivity(this);
|
||||
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
|
||||
getWindow().addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
mContext = this;
|
||||
editText.clear();
|
||||
views.clear();
|
||||
|
||||
正在加载...
在新工单中引用
屏蔽一个用户