Android: auto-enable voice mode when launched via digital assistant
When MainActivity is launched via ACTION_ASSIST (long-press power button), automatically enable talk mode so the user can start speaking immediately.
This commit is contained in:
parent
b02d042239
commit
e5198b8f31
@ -1,9 +1,12 @@
|
|||||||
package com.clawdbot.android
|
package com.clawdbot.android
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
|
import android.content.Intent
|
||||||
import android.content.pm.ApplicationInfo
|
import android.content.pm.ApplicationInfo
|
||||||
|
import android.content.pm.PackageManager
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.util.Log
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import android.webkit.WebView
|
import android.webkit.WebView
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
@ -27,6 +30,11 @@ class MainActivity : ComponentActivity() {
|
|||||||
private lateinit var permissionRequester: PermissionRequester
|
private lateinit var permissionRequester: PermissionRequester
|
||||||
private lateinit var screenCaptureRequester: ScreenCaptureRequester
|
private lateinit var screenCaptureRequester: ScreenCaptureRequester
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "MainActivity"
|
||||||
|
private const val REQUEST_AUDIO_PERMISSION_FOR_ASSIST = 200
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
val isDebuggable = (applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0
|
val isDebuggable = (applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0
|
||||||
@ -35,6 +43,9 @@ class MainActivity : ComponentActivity() {
|
|||||||
requestDiscoveryPermissionsIfNeeded()
|
requestDiscoveryPermissionsIfNeeded()
|
||||||
requestNotificationPermissionIfNeeded()
|
requestNotificationPermissionIfNeeded()
|
||||||
NodeForegroundService.start(this)
|
NodeForegroundService.start(this)
|
||||||
|
|
||||||
|
// Auto-enable voice mode when launched via digital assistant (long-press power)
|
||||||
|
handleAssistIntent(intent)
|
||||||
permissionRequester = PermissionRequester(this)
|
permissionRequester = PermissionRequester(this)
|
||||||
screenCaptureRequester = ScreenCaptureRequester(this)
|
screenCaptureRequester = ScreenCaptureRequester(this)
|
||||||
viewModel.camera.attachLifecycleOwner(this)
|
viewModel.camera.attachLifecycleOwner(this)
|
||||||
@ -122,9 +133,58 @@ class MainActivity : ComponentActivity() {
|
|||||||
ContextCompat.checkSelfPermission(
|
ContextCompat.checkSelfPermission(
|
||||||
this,
|
this,
|
||||||
Manifest.permission.POST_NOTIFICATIONS,
|
Manifest.permission.POST_NOTIFICATIONS,
|
||||||
) == android.content.pm.PackageManager.PERMISSION_GRANTED
|
) == PackageManager.PERMISSION_GRANTED
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), 102)
|
requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), 102)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onNewIntent(intent: Intent) {
|
||||||
|
super.onNewIntent(intent)
|
||||||
|
handleAssistIntent(intent)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleAssistIntent(intent: Intent?) {
|
||||||
|
val action = intent?.action ?: return
|
||||||
|
val isAssistAction = action == Intent.ACTION_ASSIST ||
|
||||||
|
action == "android.intent.action.VOICE_ASSIST" ||
|
||||||
|
action == "android.intent.action.VOICE_COMMAND" ||
|
||||||
|
action == "android.intent.action.SEARCH_LONG_PRESS" ||
|
||||||
|
action == "com.clawdbot.android.ACTION_ASSISTANT"
|
||||||
|
|
||||||
|
if (isAssistAction) {
|
||||||
|
Log.d(TAG, "Launched via assistant action: $action - enabling voice mode")
|
||||||
|
enableVoiceModeIfPermitted()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun enableVoiceModeIfPermitted() {
|
||||||
|
val micOk = ContextCompat.checkSelfPermission(
|
||||||
|
this,
|
||||||
|
Manifest.permission.RECORD_AUDIO
|
||||||
|
) == PackageManager.PERMISSION_GRANTED
|
||||||
|
|
||||||
|
if (micOk) {
|
||||||
|
viewModel.setTalkEnabled(true)
|
||||||
|
} else {
|
||||||
|
// Request permission - will enable talk mode when granted
|
||||||
|
requestPermissions(arrayOf(Manifest.permission.RECORD_AUDIO), REQUEST_AUDIO_PERMISSION_FOR_ASSIST)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated("Deprecated in Java")
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
override fun onRequestPermissionsResult(
|
||||||
|
requestCode: Int,
|
||||||
|
permissions: Array<String>,
|
||||||
|
grantResults: IntArray
|
||||||
|
) {
|
||||||
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
||||||
|
if (requestCode == REQUEST_AUDIO_PERMISSION_FOR_ASSIST) {
|
||||||
|
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
Log.d(TAG, "Audio permission granted - enabling voice mode")
|
||||||
|
viewModel.setTalkEnabled(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user