diff --git a/app/src/main/java/io/homeassistant/companion/android/assist/AssistActivity.kt b/app/src/main/java/io/homeassistant/companion/android/assist/AssistActivity.kt index 8a652adf0..9ad895dee 100644 --- a/app/src/main/java/io/homeassistant/companion/android/assist/AssistActivity.kt +++ b/app/src/main/java/io/homeassistant/companion/android/assist/AssistActivity.kt @@ -146,4 +146,10 @@ class AssistActivity : BaseActivity() { super.onPause() viewModel.onPause() } + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + this.intent = intent + viewModel.onNewIntent(intent) + } } diff --git a/app/src/main/java/io/homeassistant/companion/android/assist/AssistViewModel.kt b/app/src/main/java/io/homeassistant/companion/android/assist/AssistViewModel.kt index 8cdcf0d8d..d42869a1e 100644 --- a/app/src/main/java/io/homeassistant/companion/android/assist/AssistViewModel.kt +++ b/app/src/main/java/io/homeassistant/companion/android/assist/AssistViewModel.kt @@ -1,6 +1,7 @@ package io.homeassistant.companion.android.assist import android.app.Application +import android.content.Intent import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf @@ -101,6 +102,18 @@ class AssistViewModel @Inject constructor( } } + fun onNewIntent(intent: Intent?) { + if ( + ( + (intent?.flags != null && intent.flags and Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT != 0) || + intent?.action in listOf(Intent.ACTION_ASSIST, "android.intent.action.VOICE_ASSIST") + ) && + (inputMode == AssistInputMode.VOICE_ACTIVE || inputMode == AssistInputMode.VOICE_INACTIVE) + ) { + onMicrophoneInput() + } + } + override fun getInput(): AssistInputMode? = inputMode override fun setInput(inputMode: AssistInputMode) { diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index eecc0ce13..e16e8b678 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -90,6 +90,7 @@ android:name=".conversation.ConversationActivity" android:icon="@mipmap/ic_assist_launcher" android:label="@string/ha_assist" + android:launchMode="singleTask" android:exported="true"> diff --git a/wear/src/main/java/io/homeassistant/companion/android/conversation/ConversationActivity.kt b/wear/src/main/java/io/homeassistant/companion/android/conversation/ConversationActivity.kt index d2971f1a3..3d884b302 100755 --- a/wear/src/main/java/io/homeassistant/companion/android/conversation/ConversationActivity.kt +++ b/wear/src/main/java/io/homeassistant/companion/android/conversation/ConversationActivity.kt @@ -78,6 +78,16 @@ class ConversationActivity : ComponentActivity() { } } + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + this.intent = intent + + val launchIntent = conversationViewModel.onNewIntent(intent) + if (launchIntent) { + launchVoiceInputIntent() + } + } + private fun launchVoiceInputIntent() { val searchIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply { putExtra( diff --git a/wear/src/main/java/io/homeassistant/companion/android/conversation/ConversationViewModel.kt b/wear/src/main/java/io/homeassistant/companion/android/conversation/ConversationViewModel.kt index bc7edb4dd..ee0b20685 100755 --- a/wear/src/main/java/io/homeassistant/companion/android/conversation/ConversationViewModel.kt +++ b/wear/src/main/java/io/homeassistant/companion/android/conversation/ConversationViewModel.kt @@ -1,6 +1,7 @@ package io.homeassistant.companion.android.conversation import android.app.Application +import android.content.Intent import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf @@ -99,6 +100,24 @@ class ConversationViewModel @Inject constructor( return false } + /** @return `true` if the voice input intent should be fired */ + fun onNewIntent(intent: Intent?): Boolean { + if ( + ( + (intent?.flags != null && intent.flags and Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT != 0) || + intent?.action in listOf(Intent.ACTION_ASSIST, "android.intent.action.VOICE_ASSIST") + ) && + inputMode != AssistInputMode.BLOCKED + ) { + if (inputMode == AssistInputMode.TEXT) { + return true + } else { + onMicrophoneInput() + } + } + return false + } + override fun getInput(): AssistInputMode = inputMode override fun setInput(inputMode: AssistInputMode) {