android / android/appfunctions

[Bug]: Sample Agent hangs before invoking ChatApp searchContacts on Android 17

Open
#39 1 comment 0 reactions 1 assignee Claimed by @manoj897 View on GitHub
bug question
Dominant language
Kotlin
Stars
191
Forks
36
Avg merge
13d 16h
Merged PRs (30d)
2

Description

### Is there an existing issue for this?

- [x] I have searched the existing issues

### Is there a StackOverflow question about this issue?

- [x] I have searched StackOverflow

### What happened?

### What happened?

Using the **Agent** and **ChatApp** samples built unchanged from `main` at commit `d9cdc55`, the Agent correctly selects ChatApp's `searchContacts` AppFunction for a natural-language request, but execution never reaches ChatApp. The Agent remains on the in-progress spinner and does not return a result.

Prompt:

> Find contacts named Bob in ChatApp.

**Expected:** ChatApp's `searchContacts` function executes and returns matching contacts.

**Actual:** The LLM selects the correct tool and parameters, metadata lookup succeeds, then `AppFunctionManager.executeAppFunction()` does not complete. ChatApp's generated AppFunction service is not entered.

### Reproduction

1. Checkout `android/appfunctions` at `d9cdc55` on `main`.
2. Build `ChatApp` with `./gradlew :app:assembleDebug`.
3. Build the Agent with `./gradlew :app:assembleStandardDebug`.
4. Uninstall both packages, then install both APKs:
`com.example.chatapp` and `com.example.appfunctions.agent`.
5. Launch the Agent with shell identity instrumentation:
`adb shell am instrument -w com.example.appfunctions.agent/.ShellIdentityInstrumentation`
6. Configure a valid Gemini API key.
7. Submit: **Find contacts named Bob in ChatApp.**
8. Observe that the Agent stays in progress indefinitely.

### Control test

The same installed ChatApp function succeeds immediately when invoked directly:

```shell
adb shell "cmd app_function execute-app-function \ --package com.example.chatapp \ --function 'com.example.chatapp.appfunctions.BaseChatAppFunctionService#searchContacts' \ --parameters '{"query": "Bob", "filterType": "INDIVIDUAL"}'"
```

This returned two Bob contacts in **0.927 seconds**, confirming that the function is installed, indexed, enabled, and executable.

### Localization

Temporary diagnostics were kept on a separate branch and were not part of the clean reproduction. They show:

- Gemini returned a tool call for ChatApp `searchContacts`.
- Function parameters were converted successfully.
- `searchAppFunctions` returned one matching function in 34 ms.
- The Agent entered `AppFunctionManager.executeAppFunction()`.
- No receiver-entry event was observed in ChatApp.
- The client call did not complete within a diagnostic 20-second timeout.

This localizes the failure after LLM tool selection and metadata discovery, but before ChatApp's AppFunction service receives the request.

### Environment

- Device: Pixel 10 Pro Fold
- Android: 17 / API 37
- Repository commit: `d9cdc55`

No `SecurityException` was observed. On API 37, the Agent constructs the request with `AppInteractionAttribution`.

Is there a known API 37 dispatch or attribution issue that can cause an AndroidX client invocation to wait before the target service is entered? Are additional permissions or platform configuration required beyond the supplied `ShellIdentityInstrumentation` flow?

### Relevant logcat output

```shell
Temporary diagnostic trace (isolated branch; clean main reproduces the same spinner):

I/AppFunctionTrace: LLM_TOOL_SELECTED package=com.example.chatapp function=com.example.chatapp.appfunctions.BaseChatAppFunctionService#searchContacts
I/AppFunctionTrace: PARAMETERS_CONVERTED keys=[filterType, query]
I/AppFunctionTrace: METADATA_LOOKUP_SUCCESS count=1 elapsedMs=34
I/AppFunctionTrace: CLIENT_DISPATCH_START package=com.example.chatapp function=com.example.chatapp.appfunctions.BaseChatAppFunctionService#searchContacts
E/AppFunctionTrace: CLIENT_DISPATCH_EXCEPTION elapsedMs=20000
java.lang.IllegalStateException: AppFunction execution timed out

No ChatApp receiver-entry trace was emitted for the Agent invocation.

Direct shell control on the same clean installation:

{
"androidAppfunctionsReturnValue": [
{
"endpointType": ["INDIVIDUAL"],
"endpointValue": ["2"],
"displayName": ["Bob Johnson"]
},
{
"endpointType": ["INDIVIDUAL"],
"endpointValue": ["7"],
"displayName": ["Bob Johnson"]
}
]
}
```

### Code of Conduct

- [x] I agree to follow this project's Code of Conduct

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.