diff --git a/hrp/pkg/uixt/android_adb_driver.go b/hrp/pkg/uixt/android_adb_driver.go index f3161a56..cec08193 100644 --- a/hrp/pkg/uixt/android_adb_driver.go +++ b/hrp/pkg/uixt/android_adb_driver.go @@ -2,6 +2,7 @@ package uixt import ( "bytes" + "encoding/base64" "fmt" "io/fs" "io/ioutil" @@ -353,7 +354,7 @@ func (ad *adbDriver) GetPasteboard(contentType PasteboardType) (raw *bytes.Buffe func (ad *adbDriver) SendKeys(text string, options ...ActionOption) (err error) { // adb shell input text - _, err = ad.adbClient.RunShellCommand("input", "text", text) + _, err = ad.adbClient.RunShellCommand("input", "text", encodeUnicodeText(text)) if err != nil { return errors.Wrap(err, "send keys failed") } @@ -620,6 +621,34 @@ func (ad *adbDriver) AssertForegroundApp(packageName string, activityType ...str "assert foreground activity failed") } +func encodeUnicode(c int32) string { + var buffer bytes.Buffer + // Convert each rune (character) into two bytes + buffer.WriteByte(byte(c >> 8)) + buffer.WriteByte(byte(c & 0xFF)) + // Convert buffer bytes to base64 encoding + encoded := base64.StdEncoding.EncodeToString(buffer.Bytes()) + // Replace "/" with "," and remove trailing "=" + encoded = strings.ReplaceAll(encoded, "/", ",") + return strings.TrimRight(encoded, "=") +} + +func encodeUnicodeText(text string) string { + text = strings.ReplaceAll(text, "&", "&-") + var sb strings.Builder + sb.WriteRune('"') + for _, c := range text { + if c <= 127 { + sb.WriteRune(c) + } else { + // Encode non-ASCII character and append it + sb.WriteString("&" + encodeUnicode(c) + "-") + } + } + sb.WriteRune('"') + return sb.String() +} + var androidActivities = map[string]map[string][]string{ // DY "com.ss.android.ugc.aweme": { diff --git a/hrp/pkg/uixt/android_test.go b/hrp/pkg/uixt/android_test.go index 9b2d13db..1da77b00 100644 --- a/hrp/pkg/uixt/android_test.go +++ b/hrp/pkg/uixt/android_test.go @@ -255,17 +255,17 @@ func TestDriver_SendKeys(t *testing.T) { } time.Sleep(time.Second * 2) - err = driver.SendKeys("def") - if err != nil { - t.Fatal(err) - } - time.Sleep(time.Second * 2) + //err = driver.SendKeys("def") + //if err != nil { + // t.Fatal(err) + //} + //time.Sleep(time.Second * 2) - err = driver.SendKeys("\\n") + //err = driver.SendKeys("\\n") // err = driver.SendKeys(`\n`, false) - if err != nil { - t.Fatal(err) - } + //if err != nil { + // t.Fatal(err) + //} } func TestDriver_PressBack(t *testing.T) { @@ -437,3 +437,23 @@ func TestConvertPoints(t *testing.T) { jsons, _ := json.Marshal(eps) println(fmt.Sprintf("%v", string(jsons))) } + +func TestDriver_ShellInputUnicode(t *testing.T) { + device, _ := NewAndroidDevice() + driver, err := device.NewAdbDriver() + if err != nil { + t.Fatal(err) + } + + err = driver.SendKeys("test中文输入&") + if err != nil { + t.Fatal(err) + } + + raw, err := driver.Screenshot() + if err != nil { + t.Fatal(err) + } + + t.Log(os.WriteFile("s1.png", raw.Bytes(), 0o600)) +}