Skip to main content
Glama

android_uiautomator_double_click

Perform a double click on Android UI elements by resource ID to simulate user interactions for testing or automation purposes.

Instructions

Perform a double click on a UI element by resource ID

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
resourceIdYesResource ID of the element to double click
deviceSerialNoSpecific device serial number to target (optional)

Implementation Reference

  • Main handler function for the android_uiautomator_double_click tool. Validates input arguments and delegates to ADBWrapper.doubleClickElementByResourceId for execution.
    export async function uiautomatorDoubleClickHandler( adb: ADBWrapper, args: any ): Promise<{ content: Array<{ type: string; text: string }> }> { const { resourceId, deviceSerial } = args as UIAutomatorDoubleClickArgs; if (!resourceId || typeof resourceId !== 'string') { throw new Error('Invalid resource ID: resourceId must be a non-empty string'); } try { await adb.doubleClickElementByResourceId(resourceId, deviceSerial); return { content: [ { type: 'text', text: `Successfully double-clicked element with resource-id: ${resourceId}`, }, ], }; } catch (error) { throw new Error(`UIAutomator double click failed: ${error instanceof Error ? error.message : String(error)}`); } }
  • Core helper method in ADBWrapper that implements the double-click logic: dumps UI hierarchy XML using uiautomator, parses bounds for the resource ID, computes center coordinates, and performs two rapid taps (100ms apart) at the center.
    async doubleClickElementByResourceId(resourceId: string, deviceSerial?: string): Promise<void> { const device = await this.getTargetDevice(deviceSerial); const hierarchyFile = '/sdcard/window_dump.xml'; await this.exec(['shell', 'uiautomator', 'dump', hierarchyFile], device); const { stdout } = await this.exec(['shell', 'cat', hierarchyFile], device); await this.exec(['shell', 'rm', hierarchyFile], device); const boundsRegex = new RegExp(`resource-id="${resourceId}"[^>]*bounds="\\[(\\d+),(\\d+)\\]\\[(\\d+),(\\d+)\\]"`); const match = stdout.match(boundsRegex); if (match) { const x1 = parseInt(match[1], 10); const y1 = parseInt(match[2], 10); const x2 = parseInt(match[3], 10); const y2 = parseInt(match[4], 10); const centerX = Math.floor((x1 + x2) / 2); const centerY = Math.floor((y1 + y2) / 2); // Double click: two quick taps await this.touch(centerX, centerY, 100, device); await new Promise(resolve => setTimeout(resolve, 100)); await this.touch(centerX, centerY, 100, device); } else { throw new Error(`Element with resource-id ${resourceId} not found in UI hierarchy`); } }
  • Tool schema definition including input schema for resourceId (required) and optional deviceSerial.
    { name: 'android_uiautomator_double_click', description: 'Perform a double click on a UI element by resource ID', inputSchema: { type: 'object', properties: { resourceId: { type: 'string', description: 'Resource ID of the element to double click', }, deviceSerial: { type: 'string', description: 'Specific device serial number to target (optional)', }, }, required: ['resourceId'], },
  • src/index.ts:488-489 (registration)
    Registration in the CallToolRequestSchema handler switch statement, dispatching to the uiautomatorDoubleClickHandler.
    case 'android_uiautomator_double_click': return await uiautomatorDoubleClickHandler(this.adb, args);
  • TypeScript interface defining the input arguments for the double-click handler.
    interface UIAutomatorDoubleClickArgs { resourceId: string; deviceSerial?: string; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jduartedj/android-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server