From 7d6b5d24055cf4407cefecb0256bc3aa846c9fec Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Wed, 20 Nov 2024 11:36:19 +0800 Subject: [PATCH] feat: add GetCurrentWindow() for Android device --- hrp/internal/version/VERSION | 2 +- hrp/pkg/uixt/android_device.go | 18 ++++++++++++++++++ hrp/pkg/uixt/android_test.go | 8 ++++++++ hrp/pkg/uixt/harmony_device.go | 4 ++++ hrp/pkg/uixt/interface.go | 6 ++++++ hrp/pkg/uixt/ios_device.go | 4 ++++ 6 files changed, 41 insertions(+), 1 deletion(-) diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index f648e117..07bf9e73 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0+2411192114 +v5.0.0+2411201136 diff --git a/hrp/pkg/uixt/android_device.go b/hrp/pkg/uixt/android_device.go index b82e177e..a542d5de 100644 --- a/hrp/pkg/uixt/android_device.go +++ b/hrp/pkg/uixt/android_device.go @@ -465,6 +465,24 @@ func (dev *AndroidDevice) installCommon(apkPath string, args ...string) error { return err } +func (dev *AndroidDevice) GetCurrentWindow() (windowInfo WindowInfo, err error) { + output, err := dev.d.RunShellCommand("dumpsys", "window", "|", "grep", "mCurrentFocus") + if err != nil { + return WindowInfo{}, errors.Wrap(err, "get current window failed") + } + // mCurrentFocus=Window{a33bc55 u0 com.miui.home/com.miui.home.launcher.Launcher} + re := regexp.MustCompile(`mCurrentFocus=Window{.*? (\S+)/(\S+)}`) + matches := re.FindStringSubmatch(output) + if len(matches) != 3 { + return WindowInfo{}, errors.New("failed to extract current window") + } + windowInfo = WindowInfo{ + PackageName: matches[1], + Activity: matches[2], + } + return windowInfo, nil +} + func (dev *AndroidDevice) GetPackageInfo(packageName string) (AppInfo, error) { appInfo := AppInfo{ Name: packageName, diff --git a/hrp/pkg/uixt/android_test.go b/hrp/pkg/uixt/android_test.go index 930b1d66..d806a2df 100644 --- a/hrp/pkg/uixt/android_test.go +++ b/hrp/pkg/uixt/android_test.go @@ -42,6 +42,14 @@ func TestAndroidDevice_GetPackageInfo(t *testing.T) { t.Log(appInfo) } +func TestAndroidDevice_GetCurrentWindow(t *testing.T) { + device, err := NewAndroidDevice() + checkErr(t, err) + windowInfo, err := device.GetCurrentWindow() + checkErr(t, err) + t.Logf("packageName: %s\tactivityName: %s", windowInfo.PackageName, windowInfo.Activity) +} + func TestDriver_NewSession(t *testing.T) { driver, err := NewUIADriver(nil, uiaServerURL) if err != nil { diff --git a/hrp/pkg/uixt/harmony_device.go b/hrp/pkg/uixt/harmony_device.go index a8d3d44c..48e0a0d6 100644 --- a/hrp/pkg/uixt/harmony_device.go +++ b/hrp/pkg/uixt/harmony_device.go @@ -172,3 +172,7 @@ func (dev *HarmonyDevice) Uninstall(packageName string) error { func (dev *HarmonyDevice) GetPackageInfo(packageName string) (AppInfo, error) { return AppInfo{}, nil } + +func (dev *HarmonyDevice) GetCurrentWindow() (WindowInfo, error) { + return WindowInfo{}, nil +} diff --git a/hrp/pkg/uixt/interface.go b/hrp/pkg/uixt/interface.go index 857ed757..7100bbe4 100644 --- a/hrp/pkg/uixt/interface.go +++ b/hrp/pkg/uixt/interface.go @@ -254,6 +254,11 @@ type AppInfo struct { AppBaseInfo } +type WindowInfo struct { + PackageName string `json:"packageName,omitempty"` + Activity string `json:"activity,omitempty"` +} + type AppBaseInfo struct { Pid int `json:"pid,omitempty"` BundleId string `json:"bundleId,omitempty"` // ios package name @@ -495,6 +500,7 @@ type IDevice interface { Uninstall(packageName string) error GetPackageInfo(packageName string) (AppInfo, error) + GetCurrentWindow() (windowInfo WindowInfo, err error) } type ForegroundApp struct { diff --git a/hrp/pkg/uixt/ios_device.go b/hrp/pkg/uixt/ios_device.go index 1bcf69cb..80ada819 100644 --- a/hrp/pkg/uixt/ios_device.go +++ b/hrp/pkg/uixt/ios_device.go @@ -771,3 +771,7 @@ func (dev *IOSDevice) GetPackageInfo(packageName string) (AppInfo, error) { } return appInfo, errors.New("failed to get package version") } + +func (dev *IOSDevice) GetCurrentWindow() (WindowInfo, error) { + return WindowInfo{}, nil +}