@@ -36,6 +36,7 @@ import com.blurr.voice.utilities.addResponse
3636import com.blurr.voice.utilities.getReasoningModelApiResponse
3737import com.blurr.voice.data.MemoryManager
3838import com.blurr.voice.utilities.FreemiumManager
39+ import com.blurr.voice.utilities.PandaState
3940import com.blurr.voice.utilities.UserProfileManager
4041import com.blurr.voice.utilities.VisualFeedbackManager
4142import com.blurr.voice.v2.AgentService
@@ -134,8 +135,9 @@ class ConversationalAgentService : Service() {
134135 showInputBoxIfNeeded()
135136 visualFeedbackManager.showSmallDeltaGlow()
136137
137- // Start state monitoring
138+ // Start state monitoring and set initial state
138139 pandaStateManager.startMonitoring()
140+ pandaStateManager.setState(PandaState .IDLE )
139141
140142
141143 }
@@ -171,6 +173,7 @@ class ConversationalAgentService : Service() {
171173 firebaseAnalytics.logEvent(" text_mode_activated" , null )
172174
173175 isTextModeActive = true
176+ pandaStateManager.setState(PandaState .IDLE )
174177 speechCoordinator.stopListening()
175178 speechCoordinator.stopSpeaking()
176179 // Optionally hide the transcription view since user is typing
@@ -226,6 +229,7 @@ class ConversationalAgentService : Service() {
226229 // Skip greeting and start listening immediately
227230 serviceScope.launch {
228231 Log .d(" ConvAgent" , " Starting immediate listening (no greeting)" )
232+ pandaStateManager.setState(PandaState .LISTENING )
229233 startImmediateListening()
230234 }
231235 return START_STICKY
@@ -267,6 +271,7 @@ class ConversationalAgentService : Service() {
267271 onResult = { recognizedText ->
268272 if (isTextModeActive) return @startListening // Ignore results in text mode
269273 Log .d(" ConvAgent" , " Final user transcription: $recognizedText " )
274+ pandaStateManager.setState(PandaState .PROCESSING )
270275 visualFeedbackManager.updateTranscription(recognizedText)
271276 mainHandler.postDelayed({
272277 visualFeedbackManager.hideTranscription()
@@ -325,7 +330,12 @@ class ConversationalAgentService : Service() {
325330 Log .d(" ConvAgent" , " Listening state: $listening " )
326331 if (listening) {
327332 if (isTextModeActive) return @startListening // Ignore state changes in text mode
333+ pandaStateManager.setState(PandaState .LISTENING )
328334 visualFeedbackManager.showTranscription()
335+ } else {
336+ if (! isTextModeActive) {
337+ pandaStateManager.setState(PandaState .IDLE )
338+ }
329339 }
330340 }
331341 )
@@ -340,6 +350,7 @@ class ConversationalAgentService : Service() {
340350 }
341351 ttsManager.setCaptionsEnabled(draw)
342352
353+ pandaStateManager.setState(PandaState .SPEAKING )
343354 speechCoordinator.speakText(text)
344355 Log .d(" ConvAgent" , " Panda said: $text " )
345356 // --- CHANGE 4: Check if we are in text mode before starting to listen ---
@@ -355,6 +366,7 @@ class ConversationalAgentService : Service() {
355366 onResult = { recognizedText ->
356367 if (isTextModeActive) return @startListening // Ignore errors in text mode
357368 Log .d(" ConvAgent" , " Final user transcription: $recognizedText " )
369+ pandaStateManager.setState(PandaState .PROCESSING )
358370 visualFeedbackManager.updateTranscription(recognizedText)
359371 mainHandler.postDelayed({
360372 visualFeedbackManager.hideTranscription()
@@ -413,7 +425,12 @@ class ConversationalAgentService : Service() {
413425 Log .d(" ConvAgent" , " Listening state: $listening " )
414426 if (listening) {
415427 if (isTextModeActive) return @startListening // Ignore errors in text mode
428+ pandaStateManager.setState(PandaState .LISTENING )
416429 visualFeedbackManager.showTranscription()
430+ } else {
431+ if (! isTextModeActive) {
432+ pandaStateManager.setState(PandaState .IDLE )
433+ }
417434 }
418435 }
419436 )
@@ -520,6 +537,7 @@ class ConversationalAgentService : Service() {
520537 gracefulShutdown(" Goodbye!" , " command" )
521538 return @launch
522539 }
540+ pandaStateManager.setState(PandaState .PROCESSING )
523541 visualFeedbackManager.showThinkingIndicator()
524542 val defaultJsonResponse = """ {"Type": "Reply", "Reply": "I'm sorry, I had an issue.", "Instruction": "", "Should End": "Continue"}"""
525543 val rawModelResponse = getReasoningModelApiResponse(conversationHistory) ? : defaultJsonResponse
@@ -1338,7 +1356,8 @@ class ConversationalAgentService : Service() {
13381356 ttsManager.setCaptionsEnabled(false )
13391357 isRunning = false
13401358
1341- // Stop state monitoring
1359+ // Stop state monitoring and set final state
1360+ pandaStateManager.setState(PandaState .IDLE )
13421361 pandaStateManager.stopMonitoring()
13431362 visualFeedbackManager.hideSmallDeltaGlow()
13441363 visualFeedbackManager.hideSpeakingOverlay() // <-- ADD THIS LINE
0 commit comments