From 8498fe10e319feb0e9dcc0233336563dbefe79b3 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Fri, 28 Apr 2023 16:59:02 +0800 Subject: [PATCH] feat: add GetForegroundApp for android --- hrp/pkg/uixt/android_adb_driver.go | 26 ++++++++++++++++++++------ hrp/pkg/uixt/android_test.go | 24 ++++++++++++------------ hrp/pkg/uixt/interface.go | 2 ++ hrp/pkg/uixt/ios_driver.go | 4 ++++ hrp/pkg/uixt/video_crawler.go | 3 +-- 5 files changed, 39 insertions(+), 20 deletions(-) diff --git a/hrp/pkg/uixt/android_adb_driver.go b/hrp/pkg/uixt/android_adb_driver.go index b509d3b3..d26abffe 100644 --- a/hrp/pkg/uixt/android_adb_driver.go +++ b/hrp/pkg/uixt/android_adb_driver.go @@ -367,24 +367,38 @@ func (ad *adbDriver) AssertAppForeground(packageName string) error { return errors.New("package name is not given") } + foreApp, err := ad.GetForegroundApp() + if err != nil { + return err + } + if foreApp != packageName { + return errors.New("app is not in foreground") + } + return nil +} + +func (ad *adbDriver) GetForegroundApp() (packageName string, err error) { // adb shell dumpsys activity activities | grep mResumedActivity output, err := ad.adbClient.RunShellCommand("dumpsys", "activity", "activities") if err != nil { log.Error().Err(err).Msg("failed to dumpsys activities") - return errors.Wrap(code.AndroidShellExecError, err.Error()) + return "", errors.Wrap(code.AndroidShellExecError, err.Error()) } lines := strings.Split(string(output), "\n") - for _, line := range lines { trimmedLine := strings.TrimSpace(line) if strings.HasPrefix(trimmedLine, "mResumedActivity:") { - if strings.Contains(trimmedLine, packageName) { - return nil + // mResumedActivity: ActivityRecord{9656d74 u0 com.android.settings/.Settings t407} + strs := strings.Split(trimmedLine, " ") + for _, str := range strs { + if strings.Contains(str, "/") { + // com.android.settings/.Settings + return strings.Split(str, "/")[0], nil + } } - break } } - return errors.New("app is not in foreground") + return "", errors.New("get foreground app failed") } diff --git a/hrp/pkg/uixt/android_test.go b/hrp/pkg/uixt/android_test.go index af916d3e..34ba6d10 100644 --- a/hrp/pkg/uixt/android_test.go +++ b/hrp/pkg/uixt/android_test.go @@ -350,29 +350,29 @@ func TestDriver_AppLaunch(t *testing.T) { } func TestDriver_IsAppInForeground(t *testing.T) { - device, _ := NewAndroidDevice() - driver, err := device.NewDriver(nil) - if err != nil { - t.Fatal(err) + setupAndroid(t) + + err := driverExt.Driver.AppLaunch("com.android.settings") + checkErr(t, err) + + foreApp, err := driverExt.Driver.GetForegroundApp() + checkErr(t, err) + if foreApp != "com.android.settings" { + t.FailNow() } - err = driver.Driver.AppLaunch("com.android.settings") - if err != nil { - t.Fatal(err) - } - - err = driver.Driver.AssertAppForeground(driver.Driver.GetLastLaunchedApp()) + err = driverExt.Driver.AssertAppForeground(driverExt.Driver.GetLastLaunchedApp()) if err != nil { t.Fatal(err) } time.Sleep(2 * time.Second) - _, err = driver.Driver.AppTerminate("com.android.settings") + _, err = driverExt.Driver.AppTerminate("com.android.settings") if err != nil { t.Fatal(err) } - err = driver.Driver.AssertAppForeground("com.android.settings") + err = driverExt.Driver.AssertAppForeground("com.android.settings") if err == nil { t.Fatal(err) } diff --git a/hrp/pkg/uixt/interface.go b/hrp/pkg/uixt/interface.go index 180f2066..e2e56b24 100644 --- a/hrp/pkg/uixt/interface.go +++ b/hrp/pkg/uixt/interface.go @@ -623,6 +623,8 @@ type WebDriver interface { GetLastLaunchedApp() string // AssertAppForeground returns nil if the given package is in foreground AssertAppForeground(packageName string) error + // GetForegroundApp returns current foreground app package name + GetForegroundApp() (string, error) // StartCamera Starts a new camera for recording StartCamera() error diff --git a/hrp/pkg/uixt/ios_driver.go b/hrp/pkg/uixt/ios_driver.go index 29902268..be8eecee 100644 --- a/hrp/pkg/uixt/ios_driver.go +++ b/hrp/pkg/uixt/ios_driver.go @@ -373,6 +373,10 @@ func (wd *wdaDriver) AssertAppForeground(packageName string) error { return nil } +func (wd *wdaDriver) GetForegroundApp() (string, error) { + return "", nil +} + func (wd *wdaDriver) Tap(x, y int, options ...DataOption) error { return wd.TapFloat(float64(x), float64(y), options...) } diff --git a/hrp/pkg/uixt/video_crawler.go b/hrp/pkg/uixt/video_crawler.go index 777c4d72..edcd3090 100644 --- a/hrp/pkg/uixt/video_crawler.go +++ b/hrp/pkg/uixt/video_crawler.go @@ -28,8 +28,7 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) { // loop until target count achieved for { // check if app in foreground - err := dExt.Driver.AssertAppForeground(configs.AppPackageName) - if err != nil { + if err := dExt.Driver.AssertAppForeground(configs.AppPackageName); err != nil { log.Error().Err(err).Str("packageName", configs.AppPackageName).Msg("app is not in foreground") err = errors.Wrap(code.MobileUIAppNotInForegroundError, err.Error()) return err