@@ -20,7 +20,10 @@ import (
2020 "bufio"
2121 "bytes"
2222 "context"
23+ "encoding/json"
2324 "fmt"
25+ "io"
26+ "net/http"
2427 "net/url"
2528 "os"
2629 "os/exec"
@@ -34,6 +37,20 @@ import (
3437 "github.com/gobwas/ws/wsutil"
3538)
3639
40+ var remoteServerNetClient = & http.Client {
41+ Timeout : time .Second * 120 ,
42+ }
43+
44+ func androidRemoteServerRequest (device * models.Device , method , endpoint string , requestBody io.Reader ) (* http.Response , error ) {
45+ url := fmt .Sprintf ("http://localhost:%s/%s" , device .AndroidRemoteServerPort , endpoint )
46+ device .Logger .LogDebug ("androidRemoteServerRequest" , fmt .Sprintf ("Calling `%s` for device `%s`" , url , device .UDID ))
47+ req , err := http .NewRequest (method , url , requestBody )
48+ if err != nil {
49+ return nil , err
50+ }
51+ return remoteServerNetClient .Do (req )
52+ }
53+
3754// Check if the GADS-stream service is running on the device
3855func isGadsStreamServiceRunning (device * models.Device ) (bool , error ) {
3956 logger .ProviderLogger .LogInfo ("android_device_setup" , fmt .Sprintf ("Checking if GADS-stream is already running on device `%v`" , device .UDID ))
@@ -328,8 +345,8 @@ func updateAndroidScreenSizeADB(device *models.Device) error {
328345 return nil
329346}
330347
331- // Get all installed apps on an Android device
332- func GetInstalledAppsAndroid (device * models.Device ) []string {
348+ // Get all installed apps on an Android device - returns only the bundle identifiers (package names)
349+ func GetInstalledAppsBundleIdentifiersAndroid (device * models.Device ) []string {
333350 installedApps := make ([]string , 0 )
334351 cmd := exec .CommandContext (device .Context , "adb" , "-s" , device .UDID , "shell" , "cmd" , "package" , "list" , "packages" , "-3" )
335352
@@ -359,6 +376,33 @@ func GetInstalledAppsAndroid(device *models.Device) []string {
359376 return installedApps
360377}
361378
379+ // Get all installed apps on an Android device
380+ func GetInstalledAppsAndroidRemoteServer (device * models.Device ) []models.DeviceApp {
381+ var deviceApps = make ([]models.DeviceApp , 0 )
382+ var err error
383+
384+ runningAppsResp , err := androidRemoteServerRequest (device , http .MethodGet , "installed-apps" , nil )
385+ if err != nil {
386+ device .Logger .LogError ("get_installed_apps" , fmt .Sprintf ("GetInstalledAppsAndroidRemoteServer: Failed executing remote server request - %s" , err .Error ()))
387+ fmt .Println ("error in running apps resp - " + err .Error ())
388+ return deviceApps
389+ }
390+ defer runningAppsResp .Body .Close ()
391+
392+ payload , err := io .ReadAll (runningAppsResp .Body )
393+ if err != nil {
394+ device .Logger .LogError ("get_installed_apps" , fmt .Sprintf ("GetInstalledAppsAndroidRemoteServer: Failed executing reading remote server response body - %s" , err .Error ()))
395+ return deviceApps
396+ }
397+ err = json .Unmarshal (payload , & deviceApps )
398+ if err != nil {
399+ device .Logger .LogError ("get_installed_apps" , fmt .Sprintf ("GetInstalledAppsAndroidRemoteServer: Failed unmarshalling remote server response - %s" , err .Error ()))
400+ return deviceApps
401+ }
402+
403+ return deviceApps
404+ }
405+
362406// Uninstall app from Android device by package name
363407func uninstallAppAndroid (device * models.Device , packageName string ) error {
364408 cmd := exec .CommandContext (device .Context , "adb" , "-s" , device .UDID , "uninstall" , packageName )
@@ -660,3 +704,13 @@ func addAndroidSharedStorageFilePathNode(root *models.AndroidFileNode, fullPath
660704 current = child
661705 }
662706}
707+
708+ func KillAppAndroid (device * models.Device , bundleIdentifier string ) error {
709+ cmd := exec .CommandContext (device .Context , "adb" , "-s" , device .UDID , "shell" , "am" , "force-stop" , bundleIdentifier )
710+
711+ if err := cmd .Run (); err != nil {
712+ return fmt .Errorf ("KillAppAndroid: Failed killing app with bundle identifier(package name) `%s` via adb shell" , bundleIdentifier )
713+ }
714+
715+ return nil
716+ }
0 commit comments