mirror of
https://github.com/taigrr/adb.git
synced 2026-04-02 02:58:42 -07:00
tap and swipe replay works
This commit is contained in:
12
capture.go
12
capture.go
@@ -2,6 +2,7 @@ package adb
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"log"
|
"log"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -151,10 +152,15 @@ func (d Device) CaptureSequence(ctx context.Context) (t TapSequence, err error)
|
|||||||
// this command will never finish without ctx expiring. As a result,
|
// this command will never finish without ctx expiring. As a result,
|
||||||
// it will always return error code 130 if successful
|
// it will always return error code 130 if successful
|
||||||
stdout, _, errCode, err := execute(ctx, []string{"shell", "getevent", "-tl"})
|
stdout, _, errCode, err := execute(ctx, []string{"shell", "getevent", "-tl"})
|
||||||
if errCode != 130 {
|
// TODO better error checking here
|
||||||
// TODO remove log output here
|
if errors.Is(err, ErrUnspecified) {
|
||||||
log.Printf("Expected error code 130, but got %d\n", errCode)
|
err = nil
|
||||||
}
|
}
|
||||||
|
if errCode != 130 && errCode != -1 {
|
||||||
|
// TODO remove log output here
|
||||||
|
log.Printf("Expected error code 130 or -1, but got %d\n", errCode)
|
||||||
|
}
|
||||||
|
|
||||||
if stdout == "" {
|
if stdout == "" {
|
||||||
return TapSequence{}, ErrStdoutEmpty
|
return TapSequence{}, ErrStdoutEmpty
|
||||||
}
|
}
|
||||||
|
|||||||
35
examples/injection/main.go
Normal file
35
examples/injection/main.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/taigrr/adb"
|
||||||
|
)
|
||||||
|
|
||||||
|
var command string
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// TODO allow for any input to be used as the command
|
||||||
|
command = "ls"
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ctx := context.TODO()
|
||||||
|
devs, err := adb.Devices(ctx)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error enumerating devices: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, dev := range devs {
|
||||||
|
if !dev.IsAuthorized {
|
||||||
|
fmt.Printf("Dev `%s` is not authorized, authorize it to continue.\n", dev.SerialNo)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err := dev.GoHome(ctx)
|
||||||
|
if err != nil {
|
||||||
|
// handle error here
|
||||||
|
fmt.Printf("Error: %v\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/taigrr/adb"
|
"github.com/taigrr/adb"
|
||||||
)
|
)
|
||||||
@@ -15,7 +16,8 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx := context.TODO()
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
|
||||||
|
defer cancel()
|
||||||
devs, err := adb.Devices(ctx)
|
devs, err := adb.Devices(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Error enumerating devices: %v\n", err)
|
fmt.Printf("Error enumerating devices: %v\n", err)
|
||||||
@@ -26,11 +28,18 @@ func main() {
|
|||||||
fmt.Printf("Dev `%s` is not authorized, authorize it to continue.\n", dev.SerialNo)
|
fmt.Printf("Dev `%s` is not authorized, authorize it to continue.\n", dev.SerialNo)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
w, h, err := dev.GetScreenResolution(ctx)
|
//w, h, err := dev.GetScreenResolution(ctx)
|
||||||
|
//if err != nil {
|
||||||
|
// // handle error here
|
||||||
|
// fmt.Printf("Error: %v\n", err)
|
||||||
|
//}
|
||||||
|
fmt.Printf("Begin tapping on device %s now...\n", dev.SerialNo)
|
||||||
|
t, err := dev.CaptureSequence(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// handle error here
|
fmt.Printf("Error capturing sequence: %v\n", err)
|
||||||
fmt.Printf("Error: %v\n", err)
|
return
|
||||||
}
|
}
|
||||||
fmt.Printf("%s screen resolution: %dx%d\n", dev.SerialNo, w, h)
|
fmt.Println("Sequence captured, replaying now...")
|
||||||
|
dev.ReplayTapSequence(context.TODO(), t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
32
shell.go
32
shell.go
@@ -51,7 +51,13 @@ func parseScreenResolution(in string) (int, int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d Device) Tap(ctx context.Context, X, Y int) error {
|
func (d Device) Tap(ctx context.Context, X, Y int) error {
|
||||||
return nil
|
cmd := []string{
|
||||||
|
"-s", string(d.SerialNo), "shell",
|
||||||
|
"input", "tap",
|
||||||
|
strconv.Itoa(X), strconv.Itoa(Y),
|
||||||
|
}
|
||||||
|
_, _, _, err := execute(ctx, cmd)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Simulates a long press
|
// Simulates a long press
|
||||||
@@ -59,30 +65,44 @@ func (d Device) Tap(ctx context.Context, X, Y int) error {
|
|||||||
// Under the hood, this calls swipe with the same start and end coordinates
|
// Under the hood, this calls swipe with the same start and end coordinates
|
||||||
// with a duration of 250ms
|
// with a duration of 250ms
|
||||||
func (d Device) LongPress(ctx context.Context, X, Y int) error {
|
func (d Device) LongPress(ctx context.Context, X, Y int) error {
|
||||||
return nil
|
return d.Swipe(ctx, X, Y, X, Y, time.Millisecond*250)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d Device) Swipe(ctx context.Context, X1, Y1, X2, Y2 int, duration time.Duration) error {
|
func (d Device) Swipe(ctx context.Context, X1, Y1, X2, Y2 int, duration time.Duration) error {
|
||||||
return nil
|
cmd := []string{
|
||||||
|
"-s", string(d.SerialNo), "shell",
|
||||||
|
"input", "swipe",
|
||||||
|
strconv.Itoa(X1), strconv.Itoa(Y1),
|
||||||
|
strconv.Itoa(X2), strconv.Itoa(Y2),
|
||||||
|
strconv.Itoa(int(duration.Milliseconds())),
|
||||||
|
}
|
||||||
|
_, _, _, err := execute(ctx, cmd)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equivalent to pressing the home button
|
// Equivalent to pressing the home button
|
||||||
//
|
//
|
||||||
// Calls `input keyevent KEYCODE_HOME` under the hood
|
// Calls `input keyevent KEYCODE_HOME` under the hood
|
||||||
func (d Device) GoHome(ctx context.Context) error {
|
func (d Device) GoHome(ctx context.Context) error {
|
||||||
return nil
|
cmd := []string{"-s", string(d.SerialNo), "shell", "input", "keyevent", "KEYCODE_HOME"}
|
||||||
|
_, _, _, err := execute(ctx, cmd)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
//Equivalent to pressing the back button
|
//Equivalent to pressing the back button
|
||||||
//
|
//
|
||||||
// Calls `input keyevent KEYCODE_BACK` under the hood
|
// Calls `input keyevent KEYCODE_BACK` under the hood
|
||||||
func (d Device) GoBack(ctx context.Context) error {
|
func (d Device) GoBack(ctx context.Context) error {
|
||||||
return nil
|
cmd := []string{"-s", string(d.SerialNo), "shell", "input", "keyevent", "KEYCODE_BACK"}
|
||||||
|
_, _, _, err := execute(ctx, cmd)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equivalent to pushing the app switcher. You probably want to call this twice.
|
// Equivalent to pushing the app switcher. You probably want to call this twice.
|
||||||
//
|
//
|
||||||
// Calls `input keyevent KEYCODE_APP_SWITCH` under the hood
|
// Calls `input keyevent KEYCODE_APP_SWITCH` under the hood
|
||||||
func (d Device) SwitchApp(ctx context.Context) error {
|
func (d Device) SwitchApp(ctx context.Context) error {
|
||||||
return nil
|
cmd := []string{"-s", string(d.SerialNo), "shell", "input", "keyevent", "KEYCODE_APP_SWITCH"}
|
||||||
|
_, _, _, err := execute(ctx, cmd)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user