diff --git a/adb/device.go b/adb/device.go index f367a40..03a7342 100644 --- a/adb/device.go +++ b/adb/device.go @@ -223,6 +223,20 @@ func (d *Device) Uninstall(pkg string) error { return errMsg } +func (d *Device) UninstallUser(pkg, user string) error { + cmd := d.AdbCmd("uninstall", "--user", user, pkg) + output, err := cmd.CombinedOutput() + line := getResultLine(output) + if err == nil && line == "Success" { + return nil + } + errMsg := parseError(getFailureCode(deleteFailureRegex, line)) + if err != nil { + return fmt.Errorf("%v: %v", err, errMsg) + } + return errMsg +} + type Package struct { ID string VersCode int diff --git a/uninstall.go b/uninstall.go index 5fc34b5..f81f3af 100644 --- a/uninstall.go +++ b/uninstall.go @@ -6,6 +6,7 @@ package main import ( "errors" "fmt" + "strconv" ) var cmdUninstall = &Command{ @@ -13,6 +14,10 @@ var cmdUninstall = &Command{ Short: "Uninstall an app", } +var ( + uninstallUser = cmdUninstall.Fset.String("user", "all", "Uninstall for specified user ") +) + func init() { cmdUninstall.Run = runUninstall } @@ -25,6 +30,13 @@ func runUninstall(args []string) error { if err != nil { return err } + if *uninstallUser == "current" { + uid, err := device.CurrentUserId() + if err != nil { + return err + } + *uninstallUser = strconv.Itoa(uid) + } inst, err := device.Installed() if err != nil { return err @@ -33,7 +45,11 @@ func runUninstall(args []string) error { var err error fmt.Printf("Uninstalling %s\n", id) if _, installed := inst[id]; installed { - err = device.Uninstall(id) + if *uninstallUser == "all" { + err = device.Uninstall(id) + } else { + err = device.UninstallUser(id, *uninstallUser) + } } else { err = errors.New("not installed") }