@@ -9,6 +9,19 @@ import { waitForAndroidBoot } from './devices.ts';
99import { adbArgs } from './adb.ts' ;
1010import { classifyAndroidAppTarget } from './open-target.ts' ;
1111import { prepareAndroidInstallArtifact } from './install-artifact.ts' ;
12+ import {
13+ parseAndroidForegroundApp ,
14+ parseAndroidLaunchablePackages ,
15+ parseAndroidUserInstalledPackages ,
16+ type AndroidForegroundApp ,
17+ } from './app-parsers.ts' ;
18+
19+ export {
20+ parseAndroidForegroundApp ,
21+ parseAndroidLaunchablePackages ,
22+ parseAndroidUserInstalledPackages ,
23+ type AndroidForegroundApp ,
24+ } from './app-parsers.ts' ;
1225
1326const ALIASES : Record < string , { type : 'intent' | 'package' ; value : string } > = {
1427 settings : { type : 'intent' , value : 'android.settings.SETTINGS' } ,
@@ -93,12 +106,8 @@ async function listAndroidLaunchablePackages(device: DeviceInfo): Promise<Set<st
93106 if ( result . exitCode !== 0 || result . stdout . trim ( ) . length === 0 ) {
94107 continue ;
95108 }
96- for ( const line of result . stdout . split ( '\n' ) ) {
97- const trimmed = line . trim ( ) ;
98- if ( ! trimmed ) continue ;
99- const firstToken = trimmed . split ( / \s + / ) [ 0 ] ;
100- const pkg = firstToken . includes ( '/' ) ? firstToken . split ( '/' ) [ 0 ] : firstToken ;
101- if ( pkg ) packages . add ( pkg ) ;
109+ for ( const pkg of parseAndroidLaunchablePackages ( result . stdout ) ) {
110+ packages . add ( pkg ) ;
102111 }
103112 }
104113 return packages ;
@@ -126,10 +135,7 @@ function resolveAndroidLaunchCategories(
126135
127136async function listAndroidUserInstalledPackages ( device : DeviceInfo ) : Promise < string [ ] > {
128137 const result = await runCmd ( 'adb' , adbArgs ( device , [ 'shell' , 'pm' , 'list' , 'packages' , '-3' ] ) ) ;
129- return result . stdout
130- . split ( '\n' )
131- . map ( ( line : string ) => line . replace ( 'package:' , '' ) . trim ( ) )
132- . filter ( Boolean ) ;
138+ return parseAndroidUserInstalledPackages ( result . stdout ) ;
133139}
134140
135141export function inferAndroidAppName ( packageName : string ) : string {
@@ -165,9 +171,7 @@ export function inferAndroidAppName(packageName: string): string {
165171 . join ( ' ' ) ;
166172}
167173
168- export async function getAndroidAppState (
169- device : DeviceInfo ,
170- ) : Promise < { package ?: string ; activity ?: string } > {
174+ export async function getAndroidAppState ( device : DeviceInfo ) : Promise < AndroidForegroundApp > {
171175 const windowFocus = await readAndroidFocus ( device , [
172176 [ 'shell' , 'dumpsys' , 'window' , 'windows' ] ,
173177 [ 'shell' , 'dumpsys' , 'window' ] ,
@@ -185,32 +189,16 @@ export async function getAndroidAppState(
185189async function readAndroidFocus (
186190 device : DeviceInfo ,
187191 commands : string [ ] [ ] ,
188- ) : Promise < { package ?: string ; activity ?: string } | null > {
192+ ) : Promise < AndroidForegroundApp | null > {
189193 for ( const args of commands ) {
190194 const result = await runCmd ( 'adb' , adbArgs ( device , args ) , { allowFailure : true } ) ;
191195 const text = result . stdout ?? '' ;
192- const parsed = parseAndroidFocus ( text ) ;
196+ const parsed = parseAndroidForegroundApp ( text ) ;
193197 if ( parsed ) return parsed ;
194198 }
195199 return null ;
196200}
197201
198- function parseAndroidFocus ( text : string ) : { package ?: string ; activity ?: string } | null {
199- const patterns = [
200- / m C u r r e n t F o c u s = W i n d o w \{ [ ^ } ] * \s ( [ \w . ] + ) \/ ( [ \w . $ ] + ) / ,
201- / m F o c u s e d A p p = A p p W i n d o w T o k e n \{ [ ^ } ] * \s ( [ \w . ] + ) \/ ( [ \w . $ ] + ) / ,
202- / m R e s u m e d A c t i v i t y : .* ?\s ( [ \w . ] + ) \/ ( [ \w . $ ] + ) / ,
203- / R e s u m e d A c t i v i t y : .* ?\s ( [ \w . ] + ) \/ ( [ \w . $ ] + ) / ,
204- ] ;
205- for ( const pattern of patterns ) {
206- const match = pattern . exec ( text ) ;
207- if ( match ) {
208- return { package : match [ 1 ] , activity : match [ 2 ] } ;
209- }
210- }
211- return null ;
212- }
213-
214202export async function openAndroidApp (
215203 device : DeviceInfo ,
216204 app : string ,
0 commit comments