Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 795893eb authored by Daniel Sandler's avatar Daniel Sandler
Browse files

More flexible intent extra parsing.

Specifically, --ei (int extras) and --eia (int[] extras) now
use Integer.decode(), which means they accept negative
integers, base-16 integers formatted as #NNN and 0xNNN, and
base-8 integers formatted as 0NNN.

Additionally, --ez (boolean extras) can now be specified as
"true", "false", "t", "f", or an integer (any nonzero
treated as true). The previous behavior, based on
Boolean.valueOf(), would silently assign false if you
managed to get the spelling of "true" wrong.

Change-Id: I058254e907308006d403b5b7866c86bcaa03d8d3
parent 68572030
Loading
Loading
Loading
Loading
+19 −4
Original line number Original line Diff line number Diff line
@@ -417,7 +417,7 @@ public class Am extends BaseCommand {
            } else if (opt.equals("--ei")) {
            } else if (opt.equals("--ei")) {
                String key = nextArgRequired();
                String key = nextArgRequired();
                String value = nextArgRequired();
                String value = nextArgRequired();
                intent.putExtra(key, Integer.valueOf(value));
                intent.putExtra(key, Integer.decode(value));
            } else if (opt.equals("--eu")) {
            } else if (opt.equals("--eu")) {
                String key = nextArgRequired();
                String key = nextArgRequired();
                String value = nextArgRequired();
                String value = nextArgRequired();
@@ -434,7 +434,7 @@ public class Am extends BaseCommand {
                String[] strings = value.split(",");
                String[] strings = value.split(",");
                int[] list = new int[strings.length];
                int[] list = new int[strings.length];
                for (int i = 0; i < strings.length; i++) {
                for (int i = 0; i < strings.length; i++) {
                    list[i] = Integer.valueOf(strings[i]);
                    list[i] = Integer.decode(strings[i]);
                }
                }
                intent.putExtra(key, list);
                intent.putExtra(key, list);
            } else if (opt.equals("--el")) {
            } else if (opt.equals("--el")) {
@@ -477,8 +477,23 @@ public class Am extends BaseCommand {
                hasIntentInfo = true;
                hasIntentInfo = true;
            } else if (opt.equals("--ez")) {
            } else if (opt.equals("--ez")) {
                String key = nextArgRequired();
                String key = nextArgRequired();
                String value = nextArgRequired();
                String value = nextArgRequired().toLowerCase();
                intent.putExtra(key, Boolean.valueOf(value));
                // Boolean.valueOf() results in false for anything that is not "true", which is
                // error-prone in shell commands
                boolean arg;
                if ("true".equals(value) || "t".equals(value)) {
                    arg = true;
                } else if ("false".equals(value) || "f".equals(value)) {
                    arg = false;
                } else {
                    try {
                        arg = Integer.decode(value) != 0;
                    } catch (NumberFormatException ex) {
                        throw new IllegalArgumentException("Invalid boolean value: " + value);
                    }
                }

                intent.putExtra(key, arg);
            } else if (opt.equals("-n")) {
            } else if (opt.equals("-n")) {
                String str = nextArgRequired();
                String str = nextArgRequired();
                ComponentName cn = ComponentName.unflattenFromString(str);
                ComponentName cn = ComponentName.unflattenFromString(str);